ソースを参照

Merge branch 'cpq-dev' of wangfan/adweb3-web into master

chenpeiqing 3 ヶ月 前
コミット
b58a287c6a

+ 13 - 4
src/views/adweb/site/AdwebSiteList.vue

@@ -66,7 +66,7 @@
     <BasicTable @register="registerTable" :rowSelection="rowSelection">
       <!--插槽:table标题-->
       <template #tableTitle>
-        <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
+        <!--        <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>-->
         <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
         <!--        <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>-->
         <!--        <a-dropdown v-if="selectedRowKeys.length > 0">-->
@@ -88,7 +88,11 @@
       </template>
       <!--操作栏-->
       <template #action="{ record }">
-        <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
+        <TableAction
+          style="padding: 5px 8px; display: flex; justify-content: space-around"
+          :actions="getTableAction(record)"
+          :dropDownActions="getDropDownAction(record)"
+        />
       </template>
       <template #bodyCell="{ column, record, index, text }">
         <div v-if="column.dataIndex == 'name'">
@@ -162,6 +166,7 @@
     <seo-process ref="seoProcessRef" :visible="seoProcessVisible" :title="processTitle" @close="closeProcess" @reload="reload" />
     <google-ads-modal ref="googleAdsModalRef" @success="reload" />
     <Sohoeb2bOrder ref="sohoeb2bOrderRef" @reload="reload" />
+    <SiteRelease ref="siteReleaseRef" @reload="reload" />
   </div>
 </template>
 
@@ -185,6 +190,7 @@
   import { TENANT_ID } from '@/enums/cacheEnum';
   import { getTenantById } from '@/views/system/tenant/tenant.api';
   import Sohoeb2bOrder from '@/views/adweb/site/components/Sohoeb2bOrder.vue';
+  import SiteRelease from '@/views/adweb/site/components/SiteRelease.vue';
 
   const formRef = ref();
   const queryParam = reactive<any>({});
@@ -195,6 +201,7 @@
   const seoProcessVisible = ref(false);
   const seoProcessRef = ref();
   const sohoeb2bOrderRef = ref();
+  const siteReleaseRef = ref();
   const gtmRef = ref();
   const siteSetEnquiryRef = ref();
   const googleAdsModalRef = ref();
@@ -234,7 +241,7 @@
       useSearchForm: true,
       showTableSetting: true,
       actionColumn: {
-        width: 120,
+        width: 180,
         fixed: 'right',
       },
       beforeFetch: (params) => {
@@ -443,7 +450,9 @@
     sohoeb2bOrderRef.value.init(record);
   }
 
-  function wpSiteRelease() {}
+  function wpSiteRelease(record) {
+    siteReleaseRef.value.init(record);
+  }
 
   /**
    * 查询

+ 79 - 86
src/views/adweb/site/components/GoogleAdsModal.vue

@@ -1,103 +1,96 @@
 <template>
-  <BasicDrawer
-    v-bind="$attrs"
-    @register="registerDrawer"
-    title="绑定Google Ads帐号"
-    @ok="handleSubmit"
-    width="850"
-    showFooter
-  >
+  <BasicDrawer v-bind="$attrs" @register="registerDrawer" title="绑定Google Ads帐号" @ok="handleSubmit" width="850" showFooter>
     <BasicForm @register="registerForm" />
   </BasicDrawer>
 </template>
 
 <script lang="ts" setup>
-import { ref } from 'vue';
-import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
-import { BasicForm, useForm } from '/@/components/Form';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { getGoogleAdsAccount, bindGoogleAdsAccount } from '../AdwebSite.api';
+  import { ref } from 'vue';
+  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
+  import { BasicForm, useForm } from '/@/components/Form';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { getGoogleAdsAccount, bindGoogleAdsAccount } from '../AdwebSite.api';
 
-const emit = defineEmits(['success', 'register']);
-const { createMessage } = useMessage();
+  const emit = defineEmits(['success', 'register']);
+  const { createMessage } = useMessage();
 
-const formSchema = [
-  {
-    field: 'googleAdsAccount',
-    label: 'Google Ads帐号',
-    component: 'Input',
-    required: true,
-  },
-  {
-    field: 'apiRefreshToken',
-    label: 'API Refresh Token',
-    component: 'Input',
-  },
-  {
-    field: 'siteCode',
-    label: '站点代码',
-    component: 'Input',
-    required: true,
-    show: false,
-  },
-];
+  const formSchema = [
+    {
+      field: 'googleAdsAccount',
+      label: 'Google Ads帐号',
+      component: 'Input',
+      required: true,
+    },
+    {
+      field: 'apiRefreshToken',
+      label: 'API Refresh Token',
+      component: 'Input',
+    },
+    {
+      field: 'siteCode',
+      label: '站点代码',
+      component: 'Input',
+      required: true,
+      show: false,
+    },
+  ];
 
-const [registerForm, { resetFields, validate, setFieldsValue }] = useForm({
-  labelWidth: 120,
-  schemas: formSchema,
-  showActionButtonGroup: false,
-});
+  const [registerForm, { resetFields, validate, setFieldsValue }] = useForm({
+    labelWidth: 120,
+    schemas: formSchema,
+    showActionButtonGroup: false,
+  });
 
-const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner();
+  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner();
 
-async function handleSubmit() {
-  try {
-    const values = await validate();
-    const params: Record<string, any> = {
-      customerId: values.googleAdsAccount,
-      siteCode: values.siteCode,
-    };
-    if (values.apiRefreshToken) {
-      params.refreshToken = values.apiRefreshToken;
+  async function handleSubmit() {
+    try {
+      const values = await validate();
+      const params: Record<string, any> = {
+        customerId: values.googleAdsAccount,
+        siteCode: values.siteCode,
+      };
+      if (values.apiRefreshToken) {
+        params.refreshToken = values.apiRefreshToken;
+      }
+      await bindGoogleAdsAccount(params);
+      createMessage.success('Google Ads账号绑定成功');
+      emit('success');
+      closeDrawer();
+    } catch (error) {
+      createMessage.error('绑定Google Ads账号失败');
+      console.error(error);
     }
-    await bindGoogleAdsAccount(params);
-    createMessage.success('Google Ads账号绑定成功');
-    emit('success');
-    closeDrawer();
-  } catch (error) {
-    createMessage.error('绑定Google Ads账号失败');
-    console.error(error);
   }
-}
 
-// Add this method to handle initialization
-const init = async (data: { record: Recordable }) => {
-  resetFields();
-  setDrawerProps({ visible: true, confirmLoading: true });
-  
-  try {
-    // 将 siteCode 作为路径参数传递
-    const params = {
-      siteCode: data.record.code
-    };
-    const res = await getGoogleAdsAccount(params);
-    if (res) {
-      setFieldsValue({
-        googleAdsAccount: res.customerId,
-        apiRefreshToken: res.refreshToken,
+  // Add this method to handle initialization
+  const init = async (data: { record: Recordable }) => {
+    resetFields();
+    setDrawerProps({ visible: true, confirmLoading: true });
+
+    try {
+      // 将 siteCode 作为路径参数传递
+      const params = {
         siteCode: data.record.code,
-      });
+      };
+      const res = await getGoogleAdsAccount(params);
+      if (res) {
+        setFieldsValue({
+          googleAdsAccount: res.customerId,
+          apiRefreshToken: res.refreshToken,
+          siteCode: data.record.code,
+        });
+      }
+    } catch (error) {
+      createMessage.error('获取Google Ads账号信息失败');
+      console.error(error);
+    } finally {
+      setDrawerProps({ confirmLoading: false });
     }
-  } catch (error) {
-    createMessage.error('获取Google Ads账号信息失败');
-    console.error(error);
-  } finally {
-    setDrawerProps({ confirmLoading: false });
-  }
-};
+  };
 
-// Expose the init method
-defineExpose({
-  init
-});
-</script> 
+  // Expose the init method
+  defineExpose({
+    init,
+  });
+</script>

+ 247 - 0
src/views/adweb/site/components/SiteRelease.vue

@@ -0,0 +1,247 @@
+<template>
+  <a-drawer title="站点发布" width="720" v-model:open="modalVisible" :body-style="{ paddingBottom: '80px' }" @close="handleCancel">
+    <!--      wp站点发布-->
+    <a-spin :spinning="spinning" :tip="tipTitle">
+      <a-form
+        ref="ruleForm"
+        :model="wpPublishForm"
+        :rules="wpPublishFormRules"
+        :label-col="labelCol"
+        :wrapper-col="wrapperCol"
+        style="text-align: center !important"
+      >
+        <a-form-item ref="server" label="生产服务器" name="serverIp">
+          <a-select
+            placeholder="请选择生产服务器"
+            style="text-align: left"
+            showSearch
+            allowClear
+            :filter-option="filterOption"
+            v-model:value="wpPublishForm.ip"
+            :options="serverList"
+            @change="changeServer"
+            :field-names="{ label: 'serverName', value: 'serverIp' }"
+          />
+        </a-form-item>
+        <a-form-item ref="domain" label="域名" name="domain">
+          <a-input-search
+            v-model:value="wpPublishForm.domain"
+            placeholder="请输入域名"
+            enter-button="检测"
+            :loading="loadingBtn"
+            size="default"
+            @search="checkWpDomain"
+          />
+        </a-form-item>
+        <p>域名请勿带http://或https://</p>
+        <p>请确保您填写的域名指向我们给定CNAME</p>
+        <p>如有问题请联系域名供应商</p>
+        <p>此过程大约需要2分钟,稍后您可以到我的网站查看结果</p>
+        <p>如未显示请刷新页面后重试</p>
+      </a-form>
+    </a-spin>
+
+    <div
+      :style="{
+        position: 'absolute',
+        right: 0,
+        bottom: 0,
+        width: '100%',
+        borderTop: '1px solid #e9e9e9',
+        padding: '10px 16px',
+        background: '#fff',
+        textAlign: 'right',
+        zIndex: 1,
+      }"
+    >
+      <a-button type="primary" @click="handleOk" :loading="loadingDrawerBtn"> 提交 </a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script setup lang="ts">
+  import { getAction, postAction, postActionForm } from '@/api/manage/manage';
+  import { reactive, ref } from 'vue';
+  import { useMessage } from '@/hooks/web/useMessage';
+
+  const modalVisible = ref(false);
+  const labelCol = reactive({ span: 3 });
+  const wrapperCol = reactive({ span: 21 });
+  const spinning = ref(false);
+  const loadingBtn = ref(false);
+  const loadingDrawerBtn = ref(false);
+  const tipTitle = ref('');
+
+  const wpPublishFormRules = reactive({
+    domain: [{ required: true, message: '请输入正确网站域名格式', trigger: 'blur' }],
+    serverIp: [{ required: true, message: '请选择生产服务器', trigger: 'submit' }],
+  });
+  const { createMessage } = useMessage();
+  const url = {
+    serverListUrl: '/adweb/adwebServer/list',
+    checkDomainUrl: '/wpWebSite/check/domain',
+    wpSiteReleaseUrl: '/wpWebSite/releaseWebsite',
+  };
+
+  const emit = defineEmits(['ok', 'close', 'reload']);
+
+  //服务器搜索
+  const filterOption = (input: string, option: any) => {
+    return option.serverName.toLowerCase().indexOf(input.toLowerCase()) >= 0;
+  };
+
+  let wpPublishForm = reactive({ cname: '', ip: '', domain: '', siteCode: '' });
+  let serverList = reactive([{ id: '', serverName: '', serverIp: '', cname: '' }]);
+  let selectServer = reactive({ id: '', serverName: '', serverIp: '', cname: '' });
+
+  function init(record) {
+    modalVisible.value = true;
+    spinning.value = true;
+
+    console.log(record, 'record');
+    wpPublishForm.siteCode = record.code;
+
+    getAction(url.serverListUrl, null)
+      .then(function (res) {
+        spinning.value = false;
+        if (res.code === 200) {
+          serverList = res.result.records;
+        }
+      })
+      .catch(function (err) {
+        console.log(err);
+      });
+  }
+
+  function changeServer(value) {
+    if (value !== undefined) {
+      // 更改选中的站点对象
+      for (let i in serverList) {
+        if (serverList[i].serverIp === value) {
+          selectServer = serverList[i];
+        }
+      }
+    } else {
+      selectServer = reactive({ serverName: '', serverIp: '', cname: '' });
+    }
+  }
+
+  // 检测域名
+  function checkWpDomain() {
+    loadingBtn.value = true;
+    if (wpPublishForm.domain == null || wpPublishForm.domain === '') {
+      createMessage.error('域名不能为空!');
+      loadingBtn.value = false;
+      return;
+    }
+
+    if (selectServer.serverIp == null || selectServer.serverIp === '') {
+      createMessage.error('请选择生产服务器之后再次检测!');
+      loadingBtn.value = false;
+      return;
+    }
+
+    let params = {
+      domain: wpPublishForm.domain,
+      cname: selectServer.cname,
+      ip: selectServer.serverIp,
+    };
+    let checkDomainUrl = `${url.checkDomainUrl}`;
+    postActionForm(checkDomainUrl, params, 120000)
+      .then(function (res) {
+        loadingBtn.value = false;
+        if (res.code === 200) {
+          createMessage.success('检测成功,域名可用!');
+        } else if (res.code === 101) {
+          createMessage.error('域名请勿以http://或https://开头');
+        } else if (res.code === 103) {
+          createMessage.error('请确认您的域名已指向CNAME或IP');
+        } else if (res.code === 100) {
+          createMessage.warning('请勿提交我们的CNAME或IP');
+        } else if (res.code === 102) {
+          createMessage.warning('您填写的域名已发布或被他人使用,请勿重复提交!');
+        }
+      })
+      .catch(function (err) {
+        console.log(err);
+      });
+  }
+
+  async function handleOk() {
+    loadingBtn.value = true;
+    if (wpPublishForm.domain == null || wpPublishForm.domain === '') {
+      createMessage.error('域名不能为空!');
+      loadingBtn.value = false;
+      return;
+    }
+
+    if (selectServer.serverIp == null || selectServer.serverIp === '') {
+      createMessage.error('请选择生产服务器之后再次检测!');
+      loadingBtn.value = false;
+      return;
+    }
+
+    let params = {
+      domain: wpPublishForm.domain,
+      cname: selectServer.cname,
+      ip: selectServer.serverIp,
+    };
+    let checkDomainUrl = `${url.checkDomainUrl}`;
+    postActionForm(checkDomainUrl, params, 120000)
+      .then(function (res) {
+        loadingBtn.value = false;
+        if (res.code === 200) {
+          createMessage.success('检测成功,域名可用!');
+          spinning.value = true;
+          tipTitle.value = '正在发布站点';
+          let data = {
+            serverId: selectServer.id,
+            domain: wpPublishForm.domain,
+            siteCode: wpPublishForm.siteCode,
+          };
+          let wpSiteReleaseUrl = `${url.wpSiteReleaseUrl}`;
+          postAction(wpSiteReleaseUrl, data, 120000)
+            .then(function (res) {
+              if (res.code === 200) {
+                createMessage.success('发布成功!');
+
+                spinning.value = false;
+                tipTitle.value = '';
+                modalVisible.value = false;
+                emit('reload');
+              }
+            })
+            .catch(function () {
+              createMessage.error('网络超时,请重试!');
+              emit('reload');
+            });
+        } else if (res.code === 101) {
+          createMessage.error('域名请勿以http://或https://开头');
+        } else if (res.code === 103) {
+          createMessage.error('请确认您的域名已指向CNAME或IP');
+        } else if (res.code === 100) {
+          createMessage.warning('请勿提交我们的CNAME或IP');
+        } else if (res.code === 102) {
+          createMessage.warning('您填写的域名已发布或被他人使用,请勿重复提交!');
+        }
+      })
+      .catch(function (err) {
+        console.log(err);
+      });
+  }
+
+  function handleCancel() {
+    wpPublishForm.cname = '';
+    wpPublishForm.ip = '';
+    wpPublishForm.domain = '';
+    wpPublishForm.siteCode = '';
+    spinning.value = false;
+    modalVisible.value = false;
+    loadingDrawerBtn.value = false;
+    loadingBtn.value = false;
+  }
+
+  defineExpose({ init });
+</script>
+
+<style scoped lang="less"></style>

+ 5 - 1
src/views/adweb/theme/components/AdwebCreateSite.vue

@@ -34,7 +34,11 @@
           <a-form-item name="planId" label="营销方案">
             <a-row :gutter="8">
               <a-col :span="21">
-                <j-search-select placeholder="请选择营销方案" v-model:value="createSiteForm.planId" dict="subscribe_plan,plan_name,id,status=1" />
+                <j-search-select
+                  placeholder="请选择营销方案"
+                  v-model:value="createSiteForm.planId"
+                  dict="adweb_subscribe_plan,plan_name,id,status=1"
+                />
               </a-col>
               <a-col :span="3">
                 <router-link :to="{ path: '/deliver/serp/seoMarketPlan/list', query: { from: 'themeList' } }">