Browse Source

增加站点管理

chenlei1231 6 months ago
parent
commit
e19f714821

+ 1 - 0
src/App.vue

@@ -17,6 +17,7 @@
   import { useRootSetting } from '/@/hooks/setting/useRootSetting';
   import { ThemeEnum } from '/@/enums/appEnum';
   import { changeTheme } from '/@/logics/theme/index';
+  import '/src/assets/less/common.less';
 
   const appStore = useAppStore();
   // 解决日期时间国际化问题

+ 35 - 31
src/hooks/system/useListPage.ts

@@ -1,14 +1,15 @@
-import { reactive, ref, Ref, unref } from 'vue';
-import { merge } from 'lodash-es';
-import { DynamicProps } from '/#/utils';
-import { BasicTableProps, TableActionType, useTable } from '/@/components/Table';
-import { ColEx } from '/@/components/Form/src/types';
-import { FormActionType } from '/@/components/Form';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { useMethods } from '/@/hooks/system/useMethods';
-import { useDesign } from '/@/hooks/web/useDesign';
-import { filterObj } from '/@/utils/common/compUtils';
-const { handleExportXls, handleImportXls } = useMethods();
+import {reactive, ref, Ref, unref} from 'vue';
+import {merge} from 'lodash-es';
+import {DynamicProps} from '/#/utils';
+import {BasicTableProps, TableActionType, useTable} from '/@/components/Table';
+import {ColEx} from '/@/components/Form/src/types';
+import {FormActionType} from '/@/components/Form';
+import {useMessage} from '/@/hooks/web/useMessage';
+import {useMethods} from '/@/hooks/system/useMethods';
+import {useDesign} from '/@/hooks/web/useDesign';
+import {filterObj} from '/@/utils/common/compUtils';
+
+const {handleExportXls, handleImportXls} = useMethods();
 
 // 定义 useListPage 方法所需参数
 interface ListPageOptions {
@@ -57,32 +58,35 @@ export function useListPage(options: ListPageOptions) {
     $design = useDesign(options.designScope);
   }
 
+  // 全局将table list的分页数量设置为30
+  options.tableProps.pagination = Object.assign({}, options.tableProps.pagination, {pageSize: 30});
+
   const tableContext = useListTable(options.tableProps);
 
-  const [, { getForm, reload, setLoading }, { selectedRowKeys }] = tableContext;
+  const [, {getForm, reload, setLoading}, {selectedRowKeys}] = tableContext;
 
   // 导出 excel
   async function onExportXls() {
     //update-begin---author:wangshuai ---date:20220411  for:导出新增自定义参数------------
-    let { url, name, params } = options?.exportConfig ?? {};
+    let {url, name, params} = options?.exportConfig ?? {};
     let realUrl = typeof url === 'function' ? url() : url;
     if (realUrl) {
       let title = typeof name === 'function' ? name() : name;
       //update-begin-author:taoyan date:20220507 for: erp代码生成 子表 导出报错,原因未知-
-      let paramsForm:any = {};
+      let paramsForm: any = {};
       try {
         paramsForm = await getForm().validate();
       } catch (e) {
         console.error(e);
       }
       //update-end-author:taoyan date:20220507 for: erp代码生成 子表 导出报错,原因未知-
-      
+
       //update-begin-author:liusq date:20230410 for:[/issues/409]导出功能没有按排序结果导出,设置导出默认排序,创建时间倒序
-      if(!paramsForm?.column){
-         Object.assign(paramsForm,{column:'createTime',order:'desc'});
+      if (!paramsForm?.column) {
+        Object.assign(paramsForm, {column: 'createTime', order: 'desc'});
       }
       //update-begin-author:liusq date:20230410 for: [/issues/409]导出功能没有按排序结果导出,设置导出默认排序,创建时间倒序
-      
+
       //如果参数不为空,则整合到一起
       //update-begin-author:taoyan date:20220507 for: erp代码生成 子表 导出动态设置mainId
       if (params) {
@@ -108,7 +112,7 @@ export function useListPage(options: ListPageOptions) {
 
   // 导入 excel
   function onImportXls(file) {
-    let { url, success } = options?.importConfig ?? {};
+    let {url, success} = options?.importConfig ?? {};
     //update-begin-author:taoyan date:20220507 for: erp代码生成 子表 导入地址是动态的
     let realUrl = typeof url === 'function' ? url() : url;
     if (realUrl) {
@@ -160,7 +164,7 @@ export function useListPage(options: ListPageOptions) {
 
   /** 执行单个删除操作 */
   function doDeleteRecord(api: () => Promise<any>) {
-    return doRequest(api, { confirm: false, clearSelection: false });
+    return doRequest(api, {confirm: false, clearSelection: false});
   }
 
   return {
@@ -187,7 +191,7 @@ type UseTableMethod = TableActionType & {
  */
 export function useListTable(tableProps: TableProps): [
   (instance: TableActionType, formInstance: UseTableMethod) => void,
-  TableActionType & {
+    TableActionType & {
     getForm: () => FormActionType;
   },
   {
@@ -218,7 +222,7 @@ export function useListTable(tableProps: TableProps): [
       // 按下回车后自动提交
       autoSubmitOnEnter: true,
       // 默认 row 配置
-      rowProps: { gutter: 8 },
+      rowProps: {gutter: 8},
       // 默认 col 配置
       baseColProps: {
         ...adaptiveColProps,
@@ -239,7 +243,7 @@ export function useListTable(tableProps: TableProps): [
       // 操作按钮配置
       actionColOptions: {
         ...adaptiveColProps,
-        style: { textAlign: 'left' },
+        style: {textAlign: 'left'},
       },
     },
     // 斑马纹
@@ -271,13 +275,13 @@ export function useListTable(tableProps: TableProps): [
       //是否锁定操作列取值 right ,left,false
       fixed: false,
       dataIndex: 'action',
-      slots: { customRender: 'action' },
+      slots: {customRender: 'action'},
     },
   };
   // 合并用户个性化配置
   if (tableProps) {
     //update-begin---author:wangshuai---date:2024-04-28---for:【issues/6180】前端代码配置表变查询条件显示列不生效---
-    if(tableProps.formConfig){
+    if (tableProps.formConfig) {
       setTableProps(tableProps.formConfig);
     }
     //update-end---author:wangshuai---date:2024-04-28---for:【issues/6180】前端代码配置表变查询条件显示列不生效---
@@ -288,11 +292,11 @@ export function useListTable(tableProps: TableProps): [
   // 发送请求之前调用的方法
   function beforeFetch(params) {
     // 默认以 createTime 降序排序
-    return Object.assign({ column: 'createTime', order: 'desc' }, params);
+    return Object.assign({column: 'createTime', order: 'desc'}, params);
   }
 
   // 合并方法
-  Object.assign(defaultTableProps, { beforeFetch });
+  Object.assign(defaultTableProps, {beforeFetch});
   if (typeof tableProps.beforeFetch === 'function') {
     defaultTableProps.beforeFetch = function (params) {
       params = beforeFetch(params);
@@ -332,11 +336,11 @@ export function useListTable(tableProps: TableProps): [
    * @param formConfig
    */
   function setTableProps(formConfig: any) {
-    const replaceAttributeArray: string[] = ['baseColProps','labelCol'];
+    const replaceAttributeArray: string[] = ['baseColProps', 'labelCol'];
     for (let item of replaceAttributeArray) {
-      if(formConfig && formConfig[item]){
-        if(defaultTableProps.formConfig){
-          let defaultFormConfig:any = defaultTableProps.formConfig;
+      if (formConfig && formConfig[item]) {
+        if (defaultTableProps.formConfig) {
+          let defaultFormConfig: any = defaultTableProps.formConfig;
           defaultFormConfig[item] = formConfig[item];
         }
         formConfig[item] = {};

+ 2 - 2
src/views/adweb/seo/SeoMarketPlan.api.ts → src/views/adweb/marketPlan/SeoMarketPlan.api.ts

@@ -1,5 +1,5 @@
-import { defHttp } from '/@/utils/http/axios';
-import { useMessage } from '/@/hooks/web/useMessage';
+import { defHttp } from '/src/utils/http/axios';
+import { useMessage } from '/src/hooks/web/useMessage';
 
 const { createConfirm } = useMessage();
 

+ 1 - 1
src/views/adweb/seo/SeoMarketPlan.data.ts → src/views/adweb/marketPlan/SeoMarketPlan.data.ts

@@ -1,4 +1,4 @@
-import {BasicColumn} from '/@/components/Table';
+import {BasicColumn} from '/src/components/Table';
 //列表数据
 export const columns: BasicColumn[] = [
   {

+ 3 - 6
src/views/adweb/seo/SeoMarketPlanList.vue → src/views/adweb/marketPlan/SeoMarketPlanList.vue

@@ -93,13 +93,13 @@
 
 <script lang="ts" name="adweb-seoMarketPlan" setup>
   import { reactive, ref } from 'vue';
-  import { BasicTable, TableAction } from '/@/components/Table';
-  import { useListPage } from '/@/hooks/system/useListPage';
+  import { BasicTable, TableAction } from '/src/components/Table';
+  import { useListPage } from '/src/hooks/system/useListPage';
   import { columns, superQuerySchema } from './SeoMarketPlan.data';
   import { batchDelete, deleteOne, getExportUrl, getImportUrl, list } from './SeoMarketPlan.api';
   import SeoMarketPlanModal from './components/SeoMarketPlanModal.vue';
   import IntegrityCheckingDrawer from './components/IntegrityCheckingDrawer.vue';
-  import { useUserStore } from '/@/store/modules/user';
+  import { useUserStore } from '/src/store/modules/user';
   // import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue';
   import JDictSelectTag from "@/components/Form/src/jeecg/components/JDictSelectTag.vue";
   const formRef = ref();
@@ -121,9 +121,6 @@
         width: 200,
         fixed: 'right',
       },
-      pagination: {
-        pageSize: 30,
-      },
       beforeFetch: (params) => {
         return Object.assign(params, queryParam);
       },

+ 1 - 3
src/views/adweb/seo/components/IntegrityCheckingDrawer.vue → src/views/adweb/marketPlan/components/IntegrityCheckingDrawer.vue

@@ -110,9 +110,7 @@
 </template>
 
 <script>
-
-import { getAction, postAction } from '/@/api/manage/manage'
-import '/@/assets/less/common.less';
+import { getAction, postAction } from '/src/api/manage/manage'
 
 export default {
   name: 'IntegrityCheckingDrawer',

+ 5 - 5
src/views/adweb/seo/components/SeoMarketPlanForm.vue → src/views/adweb/marketPlan/components/SeoMarketPlanForm.vue

@@ -43,13 +43,13 @@
 
 <script lang="ts" setup>
   import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
-  import { defHttp } from '/@/utils/http/axios';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
-  import { getValueType } from '/@/utils';
+  import { defHttp } from '/src/utils/http/axios';
+  import { useMessage } from '/src/hooks/web/useMessage';
+  import JDictSelectTag from '/src/components/Form/src/jeecg/components/JDictSelectTag.vue';
+  import { getValueType } from '/src/utils';
   import { saveOrUpdate } from '../SeoMarketPlan.api';
   import { Form } from 'ant-design-vue';
-  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
+  import JFormContainer from '/src/components/Form/src/container/JFormContainer.vue';
 
   const props = defineProps({
     formDisabled: { type: Boolean, default: false },

+ 1 - 1
src/views/adweb/seo/components/SeoMarketPlanModal.vue → src/views/adweb/marketPlan/components/SeoMarketPlanModal.vue

@@ -15,7 +15,7 @@
 <script lang="ts" setup>
   import { ref, nextTick, defineExpose } from 'vue';
   import SeoMarketPlanForm from './SeoMarketPlanForm.vue';
-  import JModal from '/@/components/Modal/src/JModal/JModal.vue';
+  import JModal from '/src/components/Modal/src/JModal/JModal.vue';
 
   const title = ref<string>('');
   const width = ref<number>(800);

+ 72 - 0
src/views/adweb/site/AdwebSite.api.ts

@@ -0,0 +1,72 @@
+import { defHttp } from '/src/utils/http/axios';
+import { useMessage } from "/src/hooks/web/useMessage";
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/adweb/adwebSite/list',
+  save='/adweb/adwebSite/add',
+  edit='/adweb/adwebSite/edit',
+  deleteOne = '/adweb/adwebSite/delete',
+  deleteBatch = '/adweb/adwebSite/deleteBatch',
+  importExcel = '/adweb/adwebSite/importExcel',
+  exportXls = '/adweb/adwebSite/exportXls',
+}
+
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) => defHttp.get({ url: Api.list, params });
+
+/**
+ * 删除单个
+ * @param params
+ * @param handleSuccess
+ */
+export const deleteOne = (params,handleSuccess) => {
+  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
+    handleSuccess();
+  });
+}
+
+/**
+ * 批量删除
+ * @param params
+ * @param handleSuccess
+ */
+export const batchDelete = (params, handleSuccess) => {
+  createConfirm({
+    iconType: 'warning',
+    title: '确认删除',
+    content: '是否删除选中数据',
+    okText: '确认',
+    cancelText: '取消',
+    onOk: () => {
+      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
+        handleSuccess();
+      });
+    }
+  });
+}
+
+/**
+ * 保存或者更新
+ * @param params
+ * @param isUpdate
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+  let url = isUpdate ? Api.edit : Api.save;
+  return defHttp.post({ url: url, params }, { isTransformResponse: false });
+}

+ 58 - 0
src/views/adweb/site/AdwebSite.data.ts

@@ -0,0 +1,58 @@
+import {BasicColumn} from '/src/components/Table';
+import {FormSchema} from '/src/components/Table';
+import {rules} from '/src/utils/helper/validator';
+import {render} from '/src/utils/common/renderUtils';
+import {getWeekMonthQuarterYear} from '/src/utils';
+//列表数据
+export const columns: BasicColumn[] = [
+  {
+    title: '用户名',
+    align: "left",
+    dataIndex: 'uid_dictText'
+  },
+  {
+    title: '站点code',
+    align: "center",
+    dataIndex: 'code'
+  },
+  {
+    title: '站点名称',
+    align: "center",
+    dataIndex: 'name'
+  },
+  {
+    title: '站点域名',
+    align: "center",
+    dataIndex: 'domain'
+  },
+  {
+    title: '当前状态',
+    align: "center",
+    dataIndex: 'status'
+  },
+  {
+    title: '到期时间',
+    align: "center",
+    dataIndex: 'etime'
+  },
+];
+
+// 高级查询数据
+export const superQuerySchema = {
+  uid: {title: '用户ID,与用户表关联', order: 0, view: 'sel_user', type: 'string',},
+  code: {
+    title: '站点code,生成6位长度随机码,取值范围[a-z0-9],保证系统唯一',
+    order: 1,
+    view: 'text',
+    type: 'string',
+  },
+  name: {title: '站点名称', order: 2, view: 'text', type: 'string',},
+  domain: {title: '站点域名', order: 3, view: 'text', type: 'string',},
+  status: {
+    title: '当前状态:0:已删除;1:正常;2:未发布  3:拉取测试站点中 ;4:发布正式站点中 ;5:拉取异常',
+    order: 4,
+    view: 'number',
+    type: 'number',
+  },
+  etime: {title: '到期时间,默认为ctime+1年', order: 5, view: 'datetime', type: 'string',},
+};

+ 270 - 0
src/views/adweb/site/AdwebSiteList.vue

@@ -0,0 +1,270 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+          <a-col :lg="6">
+            <a-form-item>
+               <template #label><span title="站点名称">站点名称</span></template>
+               <div style="display: flex">
+                 <a-form-item name="name_begin" style="margin-bottom: 0;">
+                   <a-input placeholder="请输入最小值" v-model:value="queryParam.name_begin" class="query-group-cust" allow-clear ></a-input>
+                 </a-form-item>
+                 <span class="query-group-left query-group-split-cust">~</span>
+                 <a-form-item name="name_end" style="margin-bottom: 0;">
+                  <a-input placeholder="请输入最大值" v-model:value="queryParam.name_end" class="query-group-cust" allow-clear ></a-input>
+                 </a-form-item>
+               </div>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+              <a-col :lg="6">
+                <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
+                <a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
+                <a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
+                  {{ toggleSearchStatus ? '收起' : '展开' }}
+                  <Icon :icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" />
+                </a>
+              </a-col>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+    <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" 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">
+          <template #overlay>
+            <a-menu>
+              <a-menu-item key="1" @click="batchHandleDelete">
+                <Icon icon="ant-design:delete-outlined"></Icon>
+                删除
+              </a-menu-item>
+            </a-menu>
+          </template>
+          <a-button>批量操作
+            <Icon icon="mdi:chevron-down"></Icon>
+          </a-button>
+        </a-dropdown>
+        <!-- 高级查询 -->
+        <super-query :config="superQueryConfig" @search="handleSuperQuery" />
+      </template>
+      <!--操作栏-->
+      <template #action="{ record }">
+        <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
+      </template>
+      <template v-slot:bodyCell="{ column, record, index, text }">
+      </template>
+    </BasicTable>
+    <!-- 表单区域 -->
+    <AdwebSiteModal ref="registerModal" @success="handleSuccess"></AdwebSiteModal>
+  </div>
+</template>
+
+<script lang="ts" name="adweb-adwebSite" setup>
+  import { ref, reactive } from 'vue';
+  import { BasicTable, useTable, TableAction } from '/src/components/Table';
+  import { useListPage } from '/src/hooks/system/useListPage';
+  import { columns, superQuerySchema } from './AdwebSite.data';
+  import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './AdwebSite.api';
+  import { downloadFile } from '/src/utils/common/renderUtils';
+  import AdwebSiteModal from './components/AdwebSiteModal.vue'
+  import { useUserStore } from '/src/store/modules/user';
+  import JSelectUser from '/src/components/Form/src/jeecg/components/JSelectUser.vue';
+
+  const formRef = ref();
+  const queryParam = reactive<any>({});
+  const toggleSearchStatus = ref<boolean>(false);
+  const registerModal = ref();
+  const userStore = useUserStore();
+  //注册table数据
+  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
+    tableProps: {
+      title: 'adweb站点配置表单',
+      api: list,
+      columns,
+      canResize:false,
+      useSearchForm: false,
+      actionColumn: {
+        width: 120,
+        fixed: 'right',
+      },
+      beforeFetch: (params) => {
+        return Object.assign(params, queryParam);
+      },
+    },
+    exportConfig: {
+      name: "adweb站点配置表单",
+      url: getExportUrl,
+      params: queryParam,
+    },
+	  importConfig: {
+	    url: getImportUrl,
+	    success: handleSuccess
+	  },
+  });
+  const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
+  const labelCol = reactive({
+    xs:24,
+    sm:4,
+    xl:6,
+    xxl:4
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+
+  // 高级查询配置
+  const superQueryConfig = reactive(superQuerySchema);
+
+  /**
+   * 高级查询事件
+   */
+  function handleSuperQuery(params) {
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
+    });
+    searchQuery();
+  }
+
+  /**
+   * 新增事件
+   */
+  function handleAdd() {
+    registerModal.value.disableSubmit = false;
+    registerModal.value.add();
+  }
+
+  /**
+   * 编辑事件
+   */
+  function handleEdit(record: Recordable) {
+    registerModal.value.disableSubmit = false;
+    registerModal.value.edit(record);
+  }
+
+  /**
+   * 详情
+   */
+  function handleDetail(record: Recordable) {
+    registerModal.value.disableSubmit = true;
+    registerModal.value.edit(record);
+  }
+
+  /**
+   * 删除事件
+   */
+  async function handleDelete(record) {
+    await deleteOne({ id: record.id }, handleSuccess);
+  }
+
+  /**
+   * 批量删除事件
+   */
+  async function batchHandleDelete() {
+    await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
+  }
+
+  /**
+   * 成功回调
+   */
+  function handleSuccess() {
+    (selectedRowKeys.value = []) && reload();
+  }
+
+  /**
+   * 操作栏
+   */
+  function getTableAction(record) {
+    return [
+      {
+        label: '编辑',
+        onClick: handleEdit.bind(null, record),
+      },
+    ];
+  }
+
+  /**
+   * 下拉操作栏
+   */
+  function getDropDownAction(record) {
+    return [
+      {
+        label: '详情',
+        onClick: handleDetail.bind(null, record),
+      }, {
+        label: '删除',
+        popConfirm: {
+          title: '是否确认删除',
+          confirm: handleDelete.bind(null, record),
+          placement: 'topLeft',
+        }
+      }
+    ]
+  }
+
+  /**
+   * 查询
+   */
+  function searchQuery() {
+    reload();
+  }
+
+  /**
+   * 重置
+   */
+  function searchReset() {
+    formRef.value.resetFields();
+    selectedRowKeys.value = [];
+    //刷新数据
+    reload();
+  }
+
+
+  /**
+   * form点击事件(以逗号分割)
+   * @param key
+   * @param value
+   */
+  function handleFormJoinChange(key, value) {
+    if (typeof value != 'string') {
+      queryParam[key] = value.join(',');
+    }
+  }
+
+
+</script>
+
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .query-group-cust{
+      min-width: 100px !important;
+    }
+    .query-group-split-cust{
+      width: 30px;
+      display: inline-block;
+      text-align: center
+    }
+    .ant-form-item:not(.ant-form-item-with-help){
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),:deep(.ant-input-number){
+      width: 100%;
+    }
+  }
+</style>

+ 165 - 0
src/views/adweb/site/components/AdwebSiteForm.vue

@@ -0,0 +1,165 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <JFormContainer :disabled="disabled">
+      <template #detail>
+        <a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-row>
+						<a-col :span="24">
+							<a-form-item label="用户ID,与用户表关联" v-bind="validateInfos.uid">
+						<j-select-user v-model:value="formData.uid"  allow-clear />
+							</a-form-item>
+						</a-col>
+						<a-col :span="24">
+							<a-form-item label="站点名称" v-bind="validateInfos.name">
+								<a-input v-model:value="formData.name" placeholder="请输入站点名称"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="24">
+							<a-form-item label="站点域名" v-bind="validateInfos.domain">
+								<a-input v-model:value="formData.domain" placeholder="请输入站点域名"  allow-clear ></a-input>
+							</a-form-item>
+						</a-col>
+						<a-col :span="24">
+							<a-form-item label="到期时间,默认为ctime+1年" v-bind="validateInfos.etime">
+								<a-date-picker placeholder="请选择到期时间,默认为ctime+1年"  v-model:value="formData.etime" showTime value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%"  allow-clear />
+							</a-form-item>
+						</a-col>
+						<a-col :span="24">
+							<a-form-item label="发布正式环境时间(首次发布)" v-bind="validateInfos.issueTime">
+								<a-date-picker placeholder="请选择发布正式环境时间(首次发布)"  v-model:value="formData.issueTime" showTime value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%"  allow-clear />
+							</a-form-item>
+						</a-col>
+          </a-row>
+        </a-form>
+      </template>
+    </JFormContainer>
+  </a-spin>
+</template>
+
+<script lang="ts" setup>
+  import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
+  import { defHttp } from '/src/utils/http/axios';
+  import { useMessage } from '/src/hooks/web/useMessage';
+  import JSelectUser from '/src/components/Form/src/jeecg/components/JSelectUser.vue';
+  import { getValueType } from '/src/utils';
+  import { saveOrUpdate } from '../AdwebSite.api';
+  import { Form } from 'ant-design-vue';
+  import JFormContainer from '/src/components/Form/src/container/JFormContainer.vue';
+
+  const props = defineProps({
+    formDisabled: { type: Boolean, default: false },
+    formData: { type: Object, default: () => ({})},
+    formBpm: { type: Boolean, default: true }
+  });
+  const formRef = ref();
+  const useForm = Form.useForm;
+  const emit = defineEmits(['register', 'ok']);
+  const formData = reactive<Record<string, any>>({
+    id: '',
+    uid: '',
+    name: '',
+    domain: '',
+    etime: '',
+    issueTime: '',
+  });
+  const { createMessage } = useMessage();
+  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
+  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
+  const confirmLoading = ref<boolean>(false);
+  //表单验证
+  const validatorRules = reactive({
+    uid: [{ required: true, message: '请输入用户ID,与用户表关联!'},],
+    name: [{ required: true, message: '请输入站点名称!'},],
+    domain: [{ required: true, message: '请输入站点域名!'},],
+    etime: [{ required: true, message: '请输入到期时间,默认为ctime+1年!'},],
+  });
+  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
+
+  // 表单禁用
+  const disabled = computed(()=>{
+    if(props.formBpm === true){
+      if(props.formData.disabled === false){
+        return false;
+      }else{
+        return true;
+      }
+    }
+    return props.formDisabled;
+  });
+
+
+  /**
+   * 新增
+   */
+  function add() {
+    edit({});
+  }
+
+  /**
+   * 编辑
+   */
+  function edit(record) {
+    nextTick(() => {
+      resetFields();
+      const tmpData = {};
+      Object.keys(formData).forEach((key) => {
+        if(record.hasOwnProperty(key)){
+          tmpData[key] = record[key]
+        }
+      })
+      //赋值
+      Object.assign(formData, tmpData);
+    });
+  }
+
+  /**
+   * 提交数据
+   */
+  async function submitForm() {
+    // 触发表单验证
+    await validate();
+    confirmLoading.value = true;
+    const isUpdate = ref<boolean>(false);
+    //时间格式化
+    let model = formData;
+    if (model.id) {
+      isUpdate.value = true;
+    }
+    //循环数据
+    for (let data in model) {
+      //如果该数据是数组并且是字符串类型
+      if (model[data] instanceof Array) {
+        let valueType = getValueType(formRef.value.getProps, data);
+        //如果是字符串类型的需要变成以逗号分割的字符串
+        if (valueType === 'string') {
+          model[data] = model[data].join(',');
+        }
+      }
+    }
+    await saveOrUpdate(model, isUpdate.value)
+      .then((res) => {
+        if (res.success) {
+          createMessage.success(res.message);
+          emit('ok');
+        } else {
+          createMessage.warning(res.message);
+        }
+      })
+      .finally(() => {
+        confirmLoading.value = false;
+      });
+  }
+
+
+  defineExpose({
+    add,
+    edit,
+    submitForm,
+  });
+</script>
+
+<style lang="less" scoped>
+  .antd-modal-form {
+    padding: 14px;
+  }
+</style>

+ 77 - 0
src/views/adweb/site/components/AdwebSiteModal.vue

@@ -0,0 +1,77 @@
+<template>
+  <j-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
+    <AdwebSiteForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></AdwebSiteForm>
+  </j-modal>
+</template>
+
+<script lang="ts" setup>
+  import { ref, nextTick, defineExpose } from 'vue';
+  import AdwebSiteForm from './AdwebSiteForm.vue'
+  import JModal from '/src/components/Modal/src/JModal/JModal.vue';
+
+  const title = ref<string>('');
+  const width = ref<number>(800);
+  const visible = ref<boolean>(false);
+  const disableSubmit = ref<boolean>(false);
+  const registerForm = ref();
+  const emit = defineEmits(['register', 'success']);
+
+  /**
+   * 新增
+   */
+  function add() {
+    title.value = '新增';
+    visible.value = true;
+    nextTick(() => {
+      registerForm.value.add();
+    });
+  }
+
+  /**
+   * 编辑
+   * @param record
+   */
+  function edit(record) {
+    title.value = disableSubmit.value ? '详情' : '编辑';
+    visible.value = true;
+    nextTick(() => {
+      registerForm.value.edit(record);
+    });
+  }
+
+  /**
+   * 确定按钮点击事件
+   */
+  function handleOk() {
+    registerForm.value.submitForm();
+  }
+
+  /**
+   * form保存回调事件
+   */
+  function submitCallback() {
+    handleCancel();
+    emit('success');
+  }
+
+  /**
+   * 取消按钮回调事件
+   */
+  function handleCancel() {
+    visible.value = false;
+  }
+
+  defineExpose({
+    add,
+    edit,
+    disableSubmit,
+  });
+</script>
+
+<style lang="less">
+  /**隐藏样式-modal确定按钮 */
+  .jee-hidden {
+    display: none !important;
+  }
+</style>
+<style lang="less" scoped></style>