Browse Source

Merge branch 'main' of http://221.182.8.141:2300/sujunling/xld-gis-admin

XiaXxxxxx 2 years ago
parent
commit
f1368c3f7d

BIN
.DS_Store


BIN
public/static/img/Earth.jpg


+ 224 - 0
src/api/dataAdmin/assembly.ts

@@ -0,0 +1,224 @@
+
+import { defHttp } from '/@/utils/http/axios';
+import { session } from "/@/utils/Memory.js";
+import type { ErrorMessageMode } from '/#/axios';
+
+enum Api {
+    CallProvider = '/callProvider',
+    Update = '/datastore/file/uploadFile/1fcf0fc166206ceb7f2780302ec8f854',
+    Download = '/datastore/file/download'
+}
+
+const client = {
+    grant_type: "password",
+    scope: "all",
+    client_id: "space",
+    client_secret: 'e10adc3949ba59abbe56e057f20f883e',
+}
+
+const interfaceType = { apiUrl2: true };
+
+/**
+ * @description:获取组件资源列表
+ */
+export function list() {
+    const formData = new FormData();
+    formData.append("interfaceName", "antu.space.provider.sservicebase.ServiceBaseMetaDataViewProvider");
+    formData.append("methodName", "getResourceList");
+    formData.append("args[]", session.getItem('tokenV2'));
+    formData.append("args[]", "{ 'type': 'SR', 'servicetype': 'WidgetService' }");
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({ url: Api.CallProvider, params: formData, ...interfaceType })
+            .then((r) => {
+                var e = r.result ? JSON.parse(r.result) : [];
+                resolve(e);
+            })
+    })
+}
+
+
+/**
+ * @description:获取资源类型字典
+ */
+export function getServiceTypes() {
+    const formData = new FormData();
+    formData.append("interfaceName", "antu.space.provider.sservicebase.SServicebaseProvider");
+    formData.append("methodName", "getSServiceTypes");
+    formData.append("args[]", session.getItem('tokenV2'));
+    formData.append("args[]", '{"abbreviation":"MR","pid":"MapResource"}');
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({ url: Api.CallProvider, params: formData, ...interfaceType })
+            .then((r) => {
+                let result = r.result === '' ? [] : JSON.parse(r.result)
+                resolve(result);
+            })
+    })
+}
+
+
+/**
+ * @description:获取资源标签
+ */
+export function queryServiceTags() {
+    const formData = new FormData();
+    formData.append("interfaceName", "antu.space.provider.tags.TagsProvider");
+    formData.append("methodName", "getAllByType");
+    formData.append("args[]", session.getItem('tokenV2'));
+    formData.append("args[]", '业务类型,服务专题,数据类型,年度');
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({ url: Api.CallProvider, params: formData, ...interfaceType })
+            .then((r) => {
+                let result = r.result === '' ? [] : JSON.parse(r.result)
+                resolve(result);
+            })
+    })
+}
+
+
+/**
+ * @description:根据标签获取字典
+ */
+export function queryDicsByName(name) {
+    const formData = new FormData();
+    formData.append("interfaceName", "antu.space.provider.tags.TagsProvider");
+    formData.append("methodName", "getAllByType");
+    formData.append("args[]", session.getItem('tokenV2'));
+    formData.append("args[]", name);
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({ url: Api.CallProvider, params: formData, ...interfaceType })
+            .then((r) => {
+                let result = r.result === '' ? [] : JSON.parse(r.result)
+                resolve(result);
+            })
+    })
+}
+
+
+/**
+ * @description:获取坐标系列表
+ */
+export function queryCoors() {
+    const formData = new FormData();
+    formData.append("interfaceName", "antu.space.provider.geomname.GeomNameCDProvider");
+    formData.append("methodName", "getGeomNameList");
+    formData.append("args[]", session.getItem('tokenV2'));
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({ url: Api.CallProvider, params: formData, ...interfaceType })
+            .then((r) => {
+                let result = r.result === '' ? [] : JSON.parse(r.result)
+                resolve(result);
+            })
+    })
+}
+
+/**
+ * @description:新增组件资源
+ */
+export function insertService(params) {
+    if (!params) return
+    params.servicebase.appid = "CBEC5C04E50E4088AB9D343314912674";
+    params.servicebase.servicetype = 'WidgetService';
+    params.metadata.servicetype = 'WidgetService';
+    const str = JSON.stringify([params])
+    const formData = new URLSearchParams();
+    formData.append("interfaceName", "antu.space.provider.sservicebase.ServiceBaseMetaDataViewProvider");
+    formData.append("methodName", "insertList");
+    formData.append("args[]", session.getItem('tokenV2'));
+    formData.append("args[]", str)
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({ url: Api.CallProvider, params: formData, ...interfaceType })
+            .then((r) => {
+                resolve(r);
+            })
+    })
+}
+/**
+ * @description:修改组件资源
+ */
+export function updateService(params) {
+    if (!params) return
+    params.servicebase.appid = "CBEC5C04E50E4088AB9D343314912674";
+    params.servicebase.servicetype = 'WidgetService';
+    params.metadata.servicetype = 'WidgetService';
+    const str = JSON.stringify(params)
+    const formData = new URLSearchParams();
+    formData.append("interfaceName", "antu.space.provider.sservicebase.ServiceBaseMetaDataViewProvider");
+    formData.append("methodName", "update");
+    formData.append("args[]", session.getItem('tokenV2'));
+    formData.append("args[]", str)
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({ url: Api.CallProvider, params: formData, ...interfaceType })
+            .then((r) => {
+                resolve(r);
+            })
+    })
+}
+
+
+
+/**
+ * @description:删除组件资源
+ */
+export function deleteService(param) {
+    if (!param) return
+    const formData = new FormData();
+    formData.append("interfaceName", "antu.space.provider.sservicebase.ServiceBaseMetaDataViewProvider");
+    formData.append("methodName", "delete");
+    formData.append("args[]", session.getItem('tokenV2'));
+    formData.append("args[]", param)
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({ url: Api.CallProvider, params: formData, ...interfaceType })
+            .then((r) => {
+                resolve(r);
+            })
+    })
+}
+
+
+/**
+ * @description:文件资源上传
+ */
+export function update(param, id) {
+    return new Promise<void>((resolve, reject) => {
+        defHttp.post({
+            url: Api.Update,
+            params: param,
+            headers: {
+                bucketId: id,
+            }
+        })
+            .then((r) => {
+                resolve(r);
+            }).catch(e => {
+                resolve()
+            })
+    })
+}
+
+/**
+ * @description:文件资源上传
+ */
+export function getImgUrl(id, pid) {
+    return new Promise<void>((resolve, reject) => {
+        try {
+            defHttp.post({
+                url: Api.Download,
+                params: {
+                    objs: [{ id: id, objType: "FILE", userId: "" }],
+                    parentId: pid
+                },
+            })
+                .then((r) => {
+                    if (r && r.resp_code == 0 && r.resp_msg == "OK") {
+                        resolve(r.datas[0].url);
+                    } else {
+                        resolve()
+                    }
+                }).catch(e => {
+                    resolve()
+                })
+        } catch (error) {
+            resolve()
+        }
+    })
+}

+ 16 - 1
src/api/sys/user.ts

@@ -33,7 +33,8 @@ enum Api {
   SelectGroupList = "/user-center/role/selectGroupList",
   AddLoginRecord = "/base-center/syslog/AddLogin",
   SaveRoleMenu = "/base-center/newmenu/saveRoleMenu",
-  GetRoleMenus = "/base-center/newmenu/getRoleMenus"
+  GetRoleMenus = "/base-center/newmenu/getRoleMenus",
+  allSys = '/datastore/dir/sys/list'
 }
 
 const client = {
@@ -60,6 +61,7 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
         r.token = r.access_token;
         session.setItem('token', r.access_token);
         resolve(r);
+        allSys();
         // loginCallProvider();
       })
   })
@@ -200,6 +202,19 @@ export const getRoleMenus = (params) => {
   })
 }
 
+/**
+ * @description: 获取角色和菜单的关系
+ */
+
+export function allSys() {
+  defHttp.post({ url: Api.allSys })
+    .then((r) => {
+      if (r && r.datas) {
+        var l = r.datas.filter(i => i.sysName == '中台文件系统')
+        if (l && l.length) session.setItem('sysFild', l[0])
+      }
+    })
+}
 
 /**
  * @description: getUserInfo

+ 2 - 0
src/main.ts

@@ -17,6 +17,8 @@ import '/@/assets/iconfont/iconfont';
 import { usePlatform } from './views/system/customize/hook/usePlatformInfo';
 import { useWebSecurityPolicy } from './hooks/web/useWebSecurityPolicy';
 import 'core-js/es/array/at';
+import eventBus from './utils/eventBus';
+window.eventBus = eventBus;
 
 if (import.meta.env.DEV) {
   import('ant-design-vue/dist/antd.less');

+ 45 - 0
src/utils/eventBus.ts

@@ -0,0 +1,45 @@
+/*
+ * @Purpose: vue项目中的全局调用事件
+ * @FilePath: eventBus.ts
+ * @Author: sujunling
+ * @Date: 2022-11-15 16:18:08
+ * @Original: original
+ * @Descripttion:
+ */
+
+type eventBusClass = {
+  emit: (name: string) => void;
+  on: (name: string, callback: Function) => void;
+};
+
+type ParamsKey = string | number | symbol;
+
+type List = {
+  [key: ParamsKey]: Array<Function>;
+};
+
+class EventBus implements eventBusClass {
+  list: List;
+
+  constructor() {
+    this.list = {};
+  }
+
+  emit(name: string, ...args: Array<any>) {
+    let eventName: Array<Function> = this.list[name];
+    try {
+      eventName.forEach((fn) => {
+        fn.apply(this, args);
+      });
+    } catch (error) {
+      console.log(error);
+    }
+  }
+
+  on(name: string, callback: Function) {
+    let fn: Array<Function> = this.list[name] || [];
+    fn.push(callback);
+    this.list[name] = fn;
+  }
+}
+export default new EventBus();

+ 21 - 12
src/views/assembly/index.vue

@@ -5,11 +5,11 @@
         <p>组件目录</p>
       </div>
       <div class="ztree-container">
-        <p v-for="(i, k) in menu" :key="k">{{ i.name }}({{ i.num }})</p>
+        <p v-for="(i, k) in menu" :key="k">{{ k }}({{ i.length }})</p>
       </div>
     </div>
     <div class="datacenter-right">
-      <AssemblyData></AssemblyData>
+      <AssemblyData :list="assemblylist"></AssemblyData>
     </div>
   </div>
 </template>
@@ -18,7 +18,8 @@
 import { defineComponent, ref, watch } from 'vue';
 import AssemblyData from './item/AssemblyData.vue';
 import { onMounted } from 'vue';
-import { directoryTree, platList } from '/@/api/resource/plat';
+import { list, deleteService } from '/@/api/dataAdmin/assembly';
+
 
 const prefixCls = 'account-center-bottom'
 
@@ -27,19 +28,25 @@ export default defineComponent({
     AssemblyData,
   },
   setup() {
-
-    var menu = [
-      { name: '地图基础功能', num: 10 },
-      { name: '地图覆盖物类', num: 7 },
-      { name: '基础测量工具', num: 8 },
-      { name: '空间分析', num: 9 },
-      { name: '天气效果', num: 6 }
-    ]
+    var menu = ref({});
+    var assemblylist = ref([]);
+    onMounted(() => {
+      list().then(res => {
+        if (res && res.length) {
+          var list = [];
+          res.map(i => {
+            if (!menu.value[i.source] && i.source) menu.value[i.source] = [];
+            if (i.source) menu.value[i.source].push(i), list.push(i);
+          })
+          eventBus.emit('assemblylist', list)
+        }
+      })
+    })
 
     return {
       menu,
+      assemblylist,
       prefixCls: 'account-center',
-
     };
   },
 });
@@ -54,6 +61,8 @@ export default defineComponent({
 .datacenter-right {
   float: left;
   width: calc(100vw - 530px);
+  height: 100%;
+  overflow-y: scroll;
 }
 
 .ztree-container {

+ 32 - 23
src/views/assembly/item/AssemblyData.vue

@@ -4,10 +4,11 @@
     <div class="datacenter-right">
       <div class="resource_list" id="map_list">
         <div v-for="(i, k) in list" :key="k" class="item">
-          <div><img :src="i.src" alt="" srcset=""></div>
-          <b>{{ i.name }}</b>
+          <div><img :src="i.url" srcset=""></div>
+          <b>{{ i.servicename }}</b>
           <p>
-            <span><a :href="[`../../mapview.html?${i.href}`]" target="_blank" rel="noopener noreferrer">浏览</a></span>
+            <span><a :href="[`../../mapview.html?onlineIde_${i.servicealiasname}`]" target="_blank"
+                rel="noopener noreferrer">浏览</a></span>
             <span>详情</span>
             <span>加入库</span>
             <span>已入库</span>
@@ -19,7 +20,7 @@
   </div>
 </template>
 <script lang="ts">
-import { defineComponent, nextTick, onMounted, ref, defineProps, watch } from 'vue';
+import { defineComponent, nextTick, onMounted, ref, defineProps, watch, reactive } from 'vue';
 import { BasicTable, useTable, TableAction } from '/@/components/Table';
 import { columns, searchFormSchema } from './sms.data';
 import { Popconfirm, Tooltip } from 'ant-design-vue';
@@ -32,26 +33,29 @@ import { useDrawer } from '/@/components/Drawer';
 import AssemblyDrawer from './AssemblyDrawer.vue';
 import Search from './child/Search.vue';
 import { session } from '/@/utils/Memory';
+import { getImgUrl } from '/@/api/dataAdmin/assembly';
 
 
 export default defineComponent({
   name: 'SmsLog',
   components: { BasicTable, TableAction, Authority, Search, Popconfirm, Tooltip, AssemblyDrawer },
-  setup() {
+  props: {
+    list: { type: Array, default: ref([]) }
+  },
+  setup(props, { emit }) {
     const [registerModal, { openDrawer }] = useDrawer(); //使用右侧弹出框
-
-    const props = defineProps({
-      listData: {
-        type: Array,
-        default: () => [],
-      }
+    // const list = reactive(props.list);
+    // watch(() => props.list, (obj) => {
+    //   list.values = obj;
+    //   console.log(list.values);
+    // });
+    const list = ref([]);
+    console.log("list", list);
+    eventBus.on('assemblylist', i => {
+      i.map(async (j) => j.url = await getImg(j.mapingurl))
+      setTimeout(() => list.value = i, 1000)
     })
 
-    // setInterval(() => {
-    //   console.log(props)
-    // }, 2000)
-
-
     function handleQuery(record: Recordable) {
       console.log("11111:", record)
       openDrawer(true, {
@@ -59,14 +63,19 @@ export default defineComponent({
       });
     }
 
+    async function getImg(i) {
+      var defUrl = '/static/img/Earth.jpg';
+      var url = null;
+      if (i) {
+        var arr = i.split(',')
+        if (arr.length > 1) url = await getImgUrl(arr[0], arr[1]);
+      }
+      return url ? url : defUrl;
+    }
 
-    var list = [
-      { src: 'http://106.12.170.138:4001/examples/img/Earth.jpg', name: '地图加载', has: false, href: "onlineIde_a1_Hello_World_01" },
-      { src: 'http://106.12.170.138:4001/examples/img/Earth.jpg', name: '地图加载', has: false, href: "onlineIde_a1_Hello_World_01" },
-      { src: 'http://106.12.170.138:4001/examples/img/Earth.jpg', name: '地图加载', has: false, href: "onlineIde_a1_Hello_World_01" }
-    ]
 
     return {
+      getImg,
       registerModal,
       list,
       handleQuery,
@@ -81,7 +90,7 @@ export default defineComponent({
   min-width: 50px;
   height: 34px;
   line-height: 34px;
-  margin-right: 22px;
+  margin-right: 20px;
   padding: 0 10px;
   background: #E8E8E8;
   cursor: pointer;
@@ -95,7 +104,7 @@ export default defineComponent({
 }
 
 .item {
-  width: 386px;
+  width: 342px;
   height: 299px;
   border-radius: 4px;
   background: #FFFFFF;

+ 2 - 9
src/views/dataAdmin/assembly/MapSourceModal.vue

@@ -1,11 +1,4 @@
-<!--
- * @Author: tengmingxue 1473375109@qq.com
- * @Date: 2023-08-15 16:19:10
- * @LastEditors: tengmingxue 1473375109@qq.com
- * @LastEditTime: 2023-08-17 15:54:02
- * @FilePath: \xld-gis-admin\src\views\resource\map\MapSourceModal.vue
- * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
--->
+
 <template>
   <BasicModal
     width="1200px"
@@ -61,7 +54,7 @@ export default defineComponent({
       isUpdate.value = !!data?.isUpdate;
       if(isUpdate.value) formData.value = data.record
     });
-    const getTitle = computed(() => (!unref(isUpdate) ? '新增地图资源' : '编辑地图资源'));
+    const getTitle = computed(() => (!unref(isUpdate) ? '新增组件资源' : '编辑组件资源'));
 
     async function handleSubmit() {
       refSourceDetail.value.submitForm();

+ 84 - 271
src/views/dataAdmin/assembly/SourceDetail.vue

@@ -13,56 +13,34 @@
         <div class="title">基本信息</div>
         <a-row class="form-container">
           <a-col :span="12" class="form-col">
-            <a-form-item ref="code" label="资源编码" name="code" class="label-form-item">
-              <a-input v-model:value="formState.code" />
-            </a-form-item>
-          </a-col>
-          <a-col :span="12" class="form-col">
-            <a-form-item
-              ref="servicename"
-              label="资源名称"
-              name="servicename"
-              class="label-form-item"
-            >
+            <a-form-item ref="servicename" label="资源名称" name="servicename" class="label-form-item">
               <a-input v-model:value="formState.servicename" />
             </a-form-item>
           </a-col>
 
           <a-col :span="12" class="form-col">
-            <a-form-item
-              ref="servicealiasname"
-              label="资源别名"
-              name="servicealiasname"
-              class="label-form-item"
-            >
+            <a-form-item ref="servicealiasname" label="资源别名" name="servicealiasname" class="label-form-item">
               <a-input v-model:value="formState.servicealiasname" />
             </a-form-item>
           </a-col>
 
+          <a-col :span="24" class="form-col">
+            <a-form-item ref="description" label="资源描述" name="description" class="label-form-item">
+              <a-textarea v-model:value="formState.description" :rows="2" />
+            </a-form-item>
+          </a-col>
           <a-col :span="12" class="form-col">
-            <a-form-item ref="keywords" label="资源标签" name="keywords" class="label-form-item">
-              <a-select v-model:value="formState.keywords" mode="multiple">
-                <template v-for="tag in serviceTags" :key="tag.code">
-                  <a-select-option :value="tag.value">{{ tag.label }}</a-select-option>
+            <a-form-item ref="servicetype" label="资源类型" name="servicetype" class="label-form-item">
+              <a-select v-model:value="formState.servicetype">
+                <template v-for="(tag, index) in assemblyType" :key="index">
+                  <a-select-option :value="tag.value">{{ tag.value }}</a-select-option>
                 </template>
               </a-select>
             </a-form-item>
           </a-col>
-
-          <a-col :span="24" class="form-col">
-            <a-form-item
-              ref="description"
-              label="资源描述"
-              name="description"
-              class="label-form-item"
-            >
-              <a-textarea v-model:value="formState.description" :rows="2" />
-            </a-form-item>
-          </a-col>
-
-          <a-col :span="24" class="form-col">
+          <a-col :span="12" class="form-col">
             <a-form-item ref="thumbnail" label="缩略图" name="thumbnail" class="label-form-item">
-              <a-upload action="" v-model:file-list="fileList">
+              <a-upload :custom-request="customUpload" v-model:file-list="fileList">
                 <a-button style="background-color: #0671dd; color: #fff; border-radius: 4px">
                   <upload-outlined></upload-outlined>
                   文件上传
@@ -76,94 +54,18 @@
       <div class="compontents">
         <div class="title">描述信息</div>
         <a-row class="form-container">
-          <a-col :span="12" class="form-col">
-            <a-form-item
-              ref="servicetype"
-              label="资源类型"
-              name="servicetype"
-              class="label-form-item"
-            >
-              <a-select v-model:value="formState.servicetype">
-                <template v-for="tag in serviceTypes" :key="tag.id">
-                  <a-select-option :value="tag.id">{{ tag.name }}</a-select-option>
-                </template>
-              </a-select>
-            </a-form-item>
-          </a-col>
 
-          <a-col :span="12" class="form-col">
-            <a-form-item ref="coordinate" label="坐标系" name="coordinate" class="label-form-item">
-              <a-select v-model:value="formState.coordinate">
-                <template v-for="tag in sysCoors" :key="tag.GEOMNAME">
-                  <a-select-option :value="tag.GEOMNAME">{{ tag.GEOMTITLE }}</a-select-option>
-                </template>
-              </a-select>
-            </a-form-item>
-          </a-col>
-          <a-col :span="24" class="form-col">
-            <a-form-item ref="mapingurl" label="服务地址" name="mapingurl" class="label-form-item">
-              <a-input v-model:value="formState.mapingurl" />
-            </a-form-item>
-          </a-col>
-          <a-col :span="12" class="form-col">
-            <a-form-item ref="dataScope" label="数据范围" name="dataScope" class="label-form-item">
-              <a-input v-model:value="formState.dataScope" />
-            </a-form-item>
-          </a-col>
-          <a-col :span="12" class="form-col">
-            <a-form-item ref="source" label="数据来源" name="source" class="label-form-item">
-              <a-input v-model:value="formState.source" />
-            </a-form-item>
-          </a-col>
 
-          <a-col :span="12" class="form-col">
-            <a-form-item ref="restype" label="密级" name="secrets" class="label-form-item">
-              <a-select v-model:value="formState.secrets">
-                <template v-for="tag in secrets" :key="tag.code">
-                  <a-select-option :value="tag.code">{{ tag.name }}</a-select-option>
-                </template>
-              </a-select>
-            </a-form-item>
-          </a-col>
-          <a-col :span="12" class="form-col">
-            <a-form-item
-              ref="sourcetable"
-              label="数据表"
-              name="sourcetable"
-              class="label-form-item"
-            >
-              <a-input v-model:value="formState.formdatabase" />
-            </a-form-item>
-          </a-col>
 
-          <a-col :span="12" class="form-col">
-            <a-form-item ref="collect" label="保管单位" name="collect" class="label-form-item">
-              <a-select v-model:value="formState.collect">
-                <template v-for="tag in collectDept" :key="tag.code">
-                  <a-select-option :value="tag.code">{{ tag.name }}</a-select-option>
-                </template>
-              </a-select>
-            </a-form-item>
-          </a-col>
-          <a-col :span="12" class="form-col">
-            <a-form-item ref="respUnit" label="责任处室" name="respUnit" class="label-form-item">
-              <a-select v-model:value="formState.respUnit">
-                <template v-for="tag in respDept" :key="tag.code">
-                  <a-select-option :value="tag.code">{{ tag.name }}</a-select-option>
-                </template>
-              </a-select>
-            </a-form-item>
-          </a-col>
+
+
+
+
           <a-col :span="12" class="form-col">
             <a-form-item ref="source" label="发布日期" name="source" class="label-form-item">
               <!-- <a-input v-model:value="formState.publishtime" disabled /> -->
-              <a-date-picker
-                v-model:value="formState.publishtime"
-                format="YYYY-MM-DD hh:mm:ss"
-                style="width: 100%"
-                disabled
-                show-time
-              >
+              <a-date-picker v-model:value="formState.publishtime" format="YYYY-MM-DD hh:mm:ss" style="width: 100%"
+                disabled show-time>
                 <template #renderExtraFooter>extra footer</template>
               </a-date-picker>
             </a-form-item>
@@ -175,97 +77,38 @@
           </a-col>
 
           <a-col :span="12" class="form-col">
-            <a-form-item
-              ref="updatetype"
-              label="更新方式"
-              name="updatetype"
-              class="label-form-item"
-            >
+            <a-form-item ref="updatetype" label="更新方式" name="updatetype" class="label-form-item">
               <a-input v-model:value="formState.updateType" />
             </a-form-item>
           </a-col>
           <a-col :span="12" class="form-col">
-            <a-form-item
-              ref="updatetime"
-              label="更新时间"
-              name="updatetime"
-              class="label-form-item"
-            >
-              <a-date-picker
-                v-model:value="formState.updatetime"
-                format="YYYY-MM-DD hh:mm:ss"
-                style="width: 100%"
-                disabled
-                show-time
-              >
+            <a-form-item ref="updatetime" label="更新时间" name="updatetime" class="label-form-item">
+              <a-date-picker v-model:value="formState.updatetime" format="YYYY-MM-DD hh:mm:ss" style="width: 100%"
+                disabled show-time>
                 <template #renderExtraFooter>extra footer</template>
               </a-date-picker>
             </a-form-item>
           </a-col>
-          <a-col :span="12" class="form-col">
-            <a-form-item ref="epsgcode" label="EPSGCode" name="epsgcode" class="label-form-item">
-              <a-select v-model:value="formState.epsgcode">
-                <template v-for="tag in EPSGCodes" :key="tag.code">
-                  <a-select-option :value="tag.code">{{ tag.name }}</a-select-option>
-                </template>
-              </a-select>
-            </a-form-item>
-          </a-col>
 
-          <a-col :span="12" class="form-col">
-            <a-form-item
-              ref="runtimestatus"
-              label="运行状态"
-              name="runtimestatus"
-              class="label-form-item"
-            >
-              <a-switch
-                checked-children=""
-                un-checked-children=""
-                v-model:checked="formState.runtimestatus"
-              />
-            </a-form-item>
-          </a-col>
 
           <a-col :span="6" class="form-col">
             <a-form-item ref="public" label="是否公开" name="public" class="label-form-item">
-              <a-switch
-                checked-children=""
-                un-checked-children=""
-                v-model:checked="formState.public"
-              />
+              <a-switch checked-children="" un-checked-children="" v-model:checked="formState.public" />
             </a-form-item>
           </a-col>
           <a-col :span="6" class="form-col">
             <a-form-item ref="share" label="是否共享" name="share" class="label-form-item">
-              <a-switch
-                checked-children=""
-                un-checked-children=""
-                v-model:checked="formState.share"
-              />
+              <a-switch checked-children="" un-checked-children="" v-model:checked="formState.share" />
             </a-form-item>
           </a-col>
           <a-col :span="6" class="form-col">
-            <a-form-item
-              ref="externalApply"
-              label="是否外部申请"
-              name="externalApply"
-              class="label-form-item"
-            >
-              <a-switch
-                checked-children=""
-                un-checked-children=""
-                v-model:checked="formState.externalApply"
-              />
+            <a-form-item ref="externalApply" label="是否外部申请" name="externalApply" class="label-form-item">
+              <a-switch checked-children="" un-checked-children="" v-model:checked="formState.externalApply" />
             </a-form-item>
           </a-col>
           <a-col :span="6" class="form-col">
             <a-form-item ref="searched" label="是否展示" name="searched" class="label-form-item">
-              <a-switch
-                checked-children=""
-                un-checked-children=""
-                v-model:checked="formState.searched"
-              />
+              <a-switch checked-children="" un-checked-children="" v-model:checked="formState.searched" />
             </a-form-item>
           </a-col>
         </a-row>
@@ -296,42 +139,23 @@ const { t } = useI18n(); //加载国际化
 // 加载菜单数据
 import { useI18n } from '/@/hooks/web/useI18n';
 import Moment from 'moment';
-import { insertService, updateService } from '/@/api/resource/map';
-import {
-  serviceTypes,
-  serviceTags,
-  secrets,
-  sysCoors,
-  respDept,
-  collectDept,
-  EPSGCodes,
-} from './map.data';
+import { insertService, updateService, update } from '/@/api/dataAdmin/assembly';
 import { session } from '/@/utils/Memory.js';
+
 const props = {
   formData: { type: Object, default: ref(null) },
   isUpdate: { type: Boolean, default: ref(false) },
 };
 interface FormState {
-  code: string;
+  servicetype: string,
   servicename: string;
+  mapingurl: string,
   servicealiasname: string;
-  keywords: string[];
   description: string;
-  servicetype: string;
-  coordinate: string;
-  mapingurl: string;
-  dataScope: string;
-  source: string;
-  secrets: string;
-  formdatabase: string;
-  collect: string;
-  respUnit: string;
   publishtime: string;
   publisher: string;
   updateType: string;
   updatetime: string;
-  epsgcode: string;
-  runtimestatus: boolean;
   public: boolean;
   share: boolean;
   searched: boolean;
@@ -347,36 +171,27 @@ export default defineComponent({
       detail: props.formData,
       isUpdate: props.isUpdate,
       fileList: [],
-      serviceTags: serviceTags,
-      secrets: secrets, //密级
-      sysCoors: sysCoors, //坐标系
-      serviceTypes: serviceTypes, //资源类型
-      respDept: respDept, //责任科室
-      collectDept: collectDept, //保管部门
-      EPSGCodes: EPSGCodes, //EPSGCode
     });
+    var assemblyType = ref([
+      { value: '地图基础功能' },
+      { value: '覆盖物' },
+      { value: '测量工具' },
+      { value: '绘制工具' },
+      { value: '空间分析' },
+      { value: '天气特效' },
+    ])
+
     const formRef = ref();
     const formState: UnwrapRef<FormState> = reactive({
-      code: '',
+      mapingurl: '',
       servicename: '',
       servicealiasname: '',
-      keywords: [],
-      description: '',
       servicetype: '',
-      coordinate: '',
-      mapingurl: '',
-      dataScope: '',
-      source: '',
-      secrets: '',
-      formdatabase: '',
-      collect: '',
-      respUnit: '',
+      description: '',
       publishtime: '',
       publisher: '',
       updateType: '',
       updatetime: '',
-      epsgcode: '',
-      runtimestatus: true,
       public: true,
       share: true,
       searched: true,
@@ -385,6 +200,9 @@ export default defineComponent({
     });
     const moment = Moment;
     const rules = {
+      // mapingurl: [{ required: true, message: '请输入服务地址', trigger: 'blur' }],
+      servicetype: [{ required: true, message: '请选择资源类型', trigger: 'change' }],
+
       servicename: [
         { required: true, message: '请填写资源名称', trigger: 'blur' },
         { min: 3, max: 20, message: '长度必须在3到20个字符', trigger: 'blur' },
@@ -394,10 +212,6 @@ export default defineComponent({
         { min: 3, max: 20, message: '长度必须在3到20个字符', trigger: 'blur' },
       ],
       systag: [{ required: true, message: '请选择系统标签', trigger: 'change' }],
-      servicetype: [{ required: true, message: '请选择资源类型', trigger: 'change' }],
-      coordinate: [{ required: true, message: '请选择坐标系', trigger: 'change' }],
-      mapingurl: [{ required: true, message: '请输入服务地址', trigger: 'blur' }],
-
       date1: [{ required: true, message: 'Please pick a date', trigger: 'change', type: 'object' }],
       type: [
         {
@@ -429,11 +243,19 @@ export default defineComponent({
         formRef.value
           .validate()
           .then(async () => {
-            //console.log('values', formState, toRaw(formState));
             const params = setSubmitForm();
+            console.log(params);
             if (params) {
               if (data.isUpdate) {
-                params['serviceid'] = data.detail.serviceid;
+                params.servicebase.serviceid = data.detail.serviceid;
+                params.servicebase.id = data.detail.id;
+                if (!params.servicebase.mapingurl) params.servicebase.mapingurl = data.detail.mapingurl;
+
+                params.metadata.serviceid = data.detail.serviceid;
+                params.metadata.id = data.detail.id;
+                if (!params.metadata.mapingurl) params.metadata.mapingurl = data.detail.mapingurl;
+
+
                 const res = await updateService(params);
                 if (res && res?.status !== '-1') {
                   createMessage.success('修改地图资源成功!');
@@ -467,13 +289,8 @@ export default defineComponent({
      */
     const setSubmitForm = () => {
       const userinfo = session.getItem('userInfo');
-      const collect = collectDept.find((item) => item.code === formState.collect);
-      const rboffices = respDept.find((item) => item.code === formState.respUnit);
-      const secretlevels = secrets.find((item) => item.code === formState.secrets);
-      const coor = sysCoors.find((item) => item.GEOMNAME === formState.coordinate);
-      const EPSGCode = EPSGCodes.find((item) => item.code === formState.epsgcode);
       return {
-        type: 'MR',
+        type: 'SR',
         servicebase: {
           publisher: userinfo?.EMPLOYEE?.NAME, //'系统管理员',
           username: userinfo?.EMPLOYEE?.NAME, //'系统管理员',
@@ -482,32 +299,21 @@ export default defineComponent({
           description: formState.description, //资源描述
           ispublic: formState.public ? '1' : '0', //是否公开
           searched: formState.searched ? '1' : '0', //是否展示
-          servicetype: formState.servicetype, //资源类型
           externalApply: formState.externalApply ? '1' : '0', //外部申请
-          runtimestatus: formState.runtimestatus ? '1' : '0', //运行状态
           servicename: formState.servicename, //资源名
-          mapingurl: formState.mapingurl, //服务地址
           otherService: '',
+          source: formState.servicetype, //资源类型
+          mapingurl: formState.mapingurl //服务地址
         },
         metadata: {
+          source: formState.servicetype, //资源类型
           mapingurl: formState.mapingurl, //服务地址
           name: formState.servicename, //资源名
           servicealiasname: formState.servicealiasname, //资源别名
           thumbnail: '',
           description: formState.description,
-          keywords: formState.keywords.toString(),
-          servicetype: formState.servicetype, //资源类型
-          dataScope: formState.dataScope, //数据范围
           updateType: formState.updateType, //更新方式
-          source: formState.source, //数据来源
-          formdatabase: formState.formdatabase, //数据表
-          rboffice: rboffices ? rboffices.codeName : '', //责任单位
-          keepingunit: collect ? collect.codeName : '', //保管单位
-          secretlevel: secretlevels ? secretlevels.codeName : '',
-          crs: coor ? coor.GEOMNAME : '',
-          epsgCode: EPSGCode ? EPSGCode.codeName : '',
           workSpace: '',
-          runtimestatus: formState.runtimestatus ? '1' : '0', //运行状态
           ishistory: '0',
           shsqlc: 'ggdata',
           urlInfo: '',
@@ -520,45 +326,45 @@ export default defineComponent({
           publisher: userinfo?.EMPLOYEE?.NAME, //'系统管理员',
           username: userinfo?.EMPLOYEE?.NAME, //'系统管理员',
           userid: userinfo?.EMPLOYEE?.EMPLOYEE_ID, //'27AF004A-8BDN-885T-30FU-89DE3388762B',
-        },
-        sourcetraces: [],
-        dataVersionConf: {},
+        }
       };
     };
     /**
      * 设置表单数据
      */
     const setFormData = () => {
-      console.log('表单数据请看', data.detail);
-      console.log('服务类型', serviceTypes);
-      console.log('服务标签', serviceTags);
-      console.log('密级', secrets);
-      console.log('坐标系', sysCoors);
-      console.log('责任科室', respDept);
-      console.log('保管部门', collectDept);
-      console.log('EPSGCodes', EPSGCodes);
       formState.public = data.detail.ispublic === '1' ? true : false;
       formState.servicename = data.detail?.servicename;
       formState.publishtime = data.detail?.publishdate
         ? moment(data.detail?.publishdate).format('YYYY-MM-DD HH:mm:ss')
         : '';
       formState.publisher = data.detail?.publisher;
-      formState.runtimestatus = data.detail.runtimestatus === 0 ? false : true;
       formState.servicealiasname = data.detail?.servicealiasname;
-      formState.code = data.detail?.serviceid;
-      formState.servicetype = data.detail?.servicetype;
       formState.updatetime = data.detail?.updatedate
         ? moment(data.detail?.updatedate).format('YYYY-MM-DD HH:mm:ss')
         : '';
-      formState.servicetype = data.detail?.servicetype;
-      formState.coordinate = data.detail?.crs;
       formState.searched = data.detail.searched === 0 ? false : true;
     };
 
     onMounted(() => {
       resetForm();
     });
+
+    function customUpload({ file, onSuccess, onError }) {
+      const formData = new FormData();
+      formData.append('file', file);
+      update(formData, session.getItem('sysFild').dirId).then(r => {
+        if (r && r.resp_code == 0 && r.resp_msg == "OK") {
+          formState.mapingurl = `${r.datas.id},${r.datas.dirId}`;
+          onSuccess()
+        } else {
+          onError()
+        }
+      })
+    }
     return {
+      assemblyType,
+      customUpload,
       ...toRefs(data),
       formRef,
       moment,
@@ -574,14 +380,16 @@ export default defineComponent({
 });
 </script>
   
-  <style scoped lang="less">
+<style scoped lang="less">
 .source-detail {
   height: 100%;
   width: 100%;
   padding: 0 20px;
+
   .compontents {
     width: 100%;
     height: auto;
+
     .title {
       height: 19px;
       line-height: 18px;
@@ -593,22 +401,27 @@ export default defineComponent({
       font-weight: 350;
       letter-spacing: 0px;
     }
+
     .form-container {
       width: 100%;
       height: auto;
+
       .form-col {
         height: 100%;
       }
+
       .form-col-left {
         padding-right: 20px;
       }
     }
   }
 }
+
 .label-form-item {
   :deep(.ant-form-item-label) {
     width: 90px;
   }
+
   :deep(.ant-form-item-control) {
     width: calc(100% - 90px);
   }

+ 52 - 57
src/views/dataAdmin/assembly/index.vue

@@ -1,21 +1,12 @@
 <template>
   <div>
-    <BasicTable
-      :rowSelection="{ type: 'checkbox' }"
-      @register="registerTable"
-      :clickToRowSelect="false"
-    >
+    <BasicTable :rowSelection="{ type: 'checkbox' }" @register="registerTable" :clickToRowSelect="false">
       <template #toolbar>
         <Authority>
           <a-button type="primary" @click="handleCreate">新增地图</a-button>
         </Authority>
         <Authority>
-          <Popconfirm
-            title="您确定要批量删除数据"
-            ok-text="确定"
-            cancel-text="取消"
-            @confirm="handleDeleteOrBatchDelete(null)"
-          >
+          <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消" @confirm="handleDeleteOrBatchDelete(null)">
             <a-button type="primary" color="error" :disabled="hasBatchDelete"> 批量删除 </a-button>
           </Popconfirm>
         </Authority>
@@ -25,52 +16,50 @@
           @change="(checked: boolean) => statusChange(checked, record)" />
       </template> -->
       <template #action="{ record }">
-        <TableAction
-          :actions="[
-            {
-              label: '浏览',
-              icon: '' /**clarity:note-edit-line*/,
-              onClick: handleEdit.bind(null, record),
+        <TableAction :actions="[
+          {
+            label: '浏览',
+            icon: '' /**clarity:note-edit-line*/,
+            // ifShow: record.servicealiasname,
+            // ifShow: ((action) => action.servicealiasname),
+            ifShow: record.servicealiasname,
+            onClick: see.bind(null, record),
+          },
+          {
+            label: '查看',
+            icon: '' /**clarity:note-edit-line*/,
+            onClick: handleEdit.bind(null, record),
+          },
+          {
+            label: '编辑',
+            icon: '' /**clarity:note-edit-line*/,
+            color: 'warning',
+            onClick: handleEdit.bind(null, record),
+          },
+          {
+            label: '删除',
+            icon: '' /**ant-design:delete-outlined'*/,
+            color: 'error',
+            ifShow: record.roleType != RoleEnum.SYS_ADMIN,
+            popConfirm: {
+              title: '是否确认删除',
+              confirm: handleDelete.bind(null, record),
             },
-            {
-              label: '查看',
-              icon: '' /**clarity:note-edit-line*/,
-              onClick: handleEdit.bind(null, record),
-            },
-            {
-              label: '编辑',
-              icon: '' /**clarity:note-edit-line*/,
-              color: 'warning',
-              onClick: handleEdit.bind(null, record),
-            },
-            {
-              label: '删除',
-              icon: '' /**ant-design:delete-outlined'*/,
-              color: 'error',
-              ifShow: record.roleType != RoleEnum.SYS_ADMIN,
-              popConfirm: {
-                title: '是否确认删除',
-                confirm: handleDelete.bind(null, record),
-              },
-            },
-          ]"
-        />
+          },
+        ]" />
       </template>
       <template #pdate="{ record }">
-        <Tag
-          :color="'red'"
-        >
+        <Tag :color="'red'">
           {{
-           record.publishdate ? moment(record.publishdate).format('YYYY-MM-DD HH:mm:ss') : ''
+            record.publishdate ? moment(record.publishdate).format('YYYY-MM-DD HH:mm:ss') : ''
           }}
         </Tag>
       </template>
       <template #status="{ record }">
-        <Tag
-          :style="`color:${ record.status === 3 || record.status === 3 ? 'red' : '' };`"
-        >
+        <Tag :style="`color:${record.status === 3 || record.status === 3 ? 'red' : ''};`">
           {{
-           record.status === 0 ? '待审核' : (record.status === 1 ? '审核通过' : (record.status === 2 ? '审核不通过' : ( record.status === 3 ? '被驳回' : '未提交' )))
+            record.status === 0 ? '待审核' : (record.status === 1 ? '审核通过' : (record.status === 2 ? '审核不通过' : (record.status
+              === 3 ? '被驳回' : '未提交')))
           }}
         </Tag>
       </template>
@@ -80,7 +69,7 @@
   </div>
 </template>
 <script lang="ts">
-import { defineComponent, nextTick,onBeforeMount } from 'vue';
+import { defineComponent, nextTick, onBeforeMount } from 'vue';
 import { BasicTable, useTable, TableAction } from '/@/components/Table';
 import { delRole, getRoleListByPage, setRoleStatus } from '/@/api/system/system';
 // import { useDrawer } from '/@/components/Drawer';
@@ -93,7 +82,7 @@ import { Authority } from '/@/components/Authority';
 import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
 import { useMessage } from '/@/hooks/web/useMessage';
 import { Switch, Popconfirm } from 'ant-design-vue';
-import { list,deleteService } from '/@/api/resource/map';
+import { list, deleteService } from '/@/api/dataAdmin/assembly';
 import Moment from 'moment'
 
 export default defineComponent({
@@ -158,15 +147,20 @@ export default defineComponent({
       });
     }
 
-    const handleDelete = async(record: Recordable) => {
-      if(record?.serviceid){
+    function see(e) {
+      console.log(e);
+      if (e.servicealiasname) window.open(`../../mapview.html?onlineIde_${e.servicealiasname}`, '_blank');
+    }
+
+    const handleDelete = async (record: Recordable) => {
+      if (record?.serviceid) {
         const res = await deleteService(record?.serviceid)
-        if(res?.status !== '-1'){
+        if (res?.status !== '-1') {
           reload();
-          createMessage.success('删除成功!',1)
+          createMessage.success('删除成功!', 1)
         }
-        else{
-          createMessage.error('删除失败!失败原因:'+res?.message,1)
+        else {
+          createMessage.error('删除失败!失败原因:' + res?.message, 1)
         }
       }
     }
@@ -199,7 +193,7 @@ export default defineComponent({
         reload();
       }
     };
-    onBeforeMount(async()=>{
+    onBeforeMount(async () => {
 
     })
 
@@ -210,6 +204,7 @@ export default defineComponent({
       // registerDrawer,
       registerModal,
       handleCreate,
+      see,
       handleEdit,
       handleDelete,
       handleSuccess,

+ 2 - 7
src/views/dataAdmin/assembly/map.data.ts

@@ -114,13 +114,13 @@ export const columns: BasicColumn[] = [
   },
   {
     title: '资源标签',
-    dataIndex: 'service',
+    dataIndex: 'typename',
     width: 120,
   },
   {
     title: '发布人',
     dataIndex: 'publisher',
-    width: 100,
+    width: 120,
   },
   {
     title: '发布时间',
@@ -144,11 +144,6 @@ export const columns: BasicColumn[] = [
     dataIndex: 'checkTime',
     width: 100,
   },
-  // {
-  //   title: '当前环节',
-  //   dataIndex: 'curLink',
-  //   width: 90,
-  // },
 ];
 
 

+ 17 - 0
src/views/interface/data.ts

@@ -0,0 +1,17 @@
+export interface TabItem {
+  key: string;
+  name: string;
+  component: string;
+}
+export const achieveList: TabItem[] = [
+  {
+    key: '1',
+    name: '地图资源(1)',
+    component: 'SmsLog',
+  },
+  {
+    key: '2',
+    name: '成果数据(2)',
+    component: 'EmailLog',
+  },
+];

+ 120 - 0
src/views/interface/index.vue

@@ -0,0 +1,120 @@
+<template>
+  <div :class="[`${prefixCls}-bottom`, '!dark:bg-dark-900']">
+    <div class="datacenter-left">
+      <div class="page-name">
+        <p>通用接口</p>
+      </div>
+      <div class="ztree-container">
+        <p v-for="(i, k) in menu" :key="k">{{ i.name }}({{ i.num }})</p>
+      </div>
+    </div>
+    <div class="datacenter-right">
+      <AssemblyData></AssemblyData>
+    </div>
+  </div>
+</template>
+
+<script lang="ts">
+import { defineComponent, ref, watch } from 'vue';
+import AssemblyData from './item/AssemblyData.vue';
+import { onMounted } from 'vue';
+import { directoryTree, platList } from '/@/api/resource/plat';
+
+const prefixCls = 'account-center-bottom'
+
+export default defineComponent({
+  components: {
+    AssemblyData,
+  },
+  setup() {
+
+    var menu = [
+      { name: '数据分析', num: 10 },
+      { name: '用户中心', num: 7 },
+      { name: '授权中心', num: 8 },
+      { name: '空间分析', num: 9 },
+      { name: '专项接口', num: 6 }
+    ]
+
+    return {
+      menu,
+      prefixCls: 'account-center',
+
+    };
+  },
+});
+</script>
+<style lang="less" scoped>
+.account-center-bottom {
+  background: #fff;
+  height: calc(100vh - 110px);
+  overflow: hidden;
+}
+
+.datacenter-right {
+  float: left;
+  width: calc(100vw - 530px);
+}
+
+.ztree-container {
+  float: left;
+  overflow: auto;
+  width: 100%;
+  height: auto;
+  max-height: 976px;
+}
+
+.ztree-container p {
+  padding-left: 30px;
+  line-height: 40px;
+  margin-left: 9px;
+  width: 233px;
+  height: 40px;
+  text-align: left;
+  height: 40px;
+  background: #FFFFFF;
+  cursor: pointer;
+}
+
+.ztree-container p:hover {
+  background: #0671DD;
+  color: #fff;
+}
+
+.datacenter-left .page-name {
+  margin-bottom: 30px;
+  border-bottom: solid 1px #DEDEDE;
+}
+
+.datacenter-left .page-name p {
+  height: 42px;
+  line-height: 42px;
+  font-size: 16px;
+  font-family: PingFang SC;
+  font-weight: bold;
+  color: #333333;
+  text-align: center;
+  margin-bottom: 0px;
+}
+
+.datacenter-left {
+  float: left;
+  width: 250px;
+  height: auto;
+  margin-right: 16px;
+  border-top: none;
+  background: #F8F8F8;
+  overflow: auto;
+  height: calc(100% - 20px);
+  max-height: 1306px;
+}
+
+.account-center {
+  &-bottom {
+    padding: 10px;
+    margin: 16px;
+    // background-color: @component-background;
+    border-radius: 3px;
+  }
+}
+</style>

+ 185 - 0
src/views/interface/item/AssemblyData.vue

@@ -0,0 +1,185 @@
+<template>
+  <Search></Search>
+  <div style="background-color: #f0f2f5" class="dark:bg-dark-900">
+    <div class="datacenter-right">
+      <div class="resource_list" id="map_list">
+        <div v-for="(i, k) in list" :key="k" class="item">
+          <div><img :src="i.src" alt="" srcset=""></div>
+          <div class="itemLetf">
+            <span>
+              <h1>查询是否配置资源图层</h1>
+              <b>
+                <span>加入申请库</span>
+                <span>查看详情</span>
+              </b>
+            </span>
+            <p><span>描述:</span>查询是否配置资源图层查询是否配置资源图层查询是否配置资源图层查询是否配置资源图层查询是否配置资源图层</p>
+            <div class="leftBut">
+              <p><span>当前版本:</span><span>1.0.1</span></p>
+              <p><span>调用次数:</span><span>1000</span></p>
+              <p><span>发布时间:</span><span>2023-08-15 12:12:12</span></p>
+              <p><span>更新时间:</span><span>2023-08-15 12:12:12</span></p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <AssemblyDrawer @register="registerModal" />
+  </div>
+</template>
+<script lang="ts">
+import { defineComponent, nextTick, onMounted, ref, defineProps, watch } from 'vue';
+import { BasicTable, useTable, TableAction } from '/@/components/Table';
+import { columns, searchFormSchema } from './sms.data';
+import { Popconfirm, Tooltip } from 'ant-design-vue';
+import { Authority } from '/@/components/Authority';
+import { platList, img, apply } from '/@/api/resource/plat';
+import { message } from 'ant-design-vue';
+// 加载自定义侧边弹出框 组件
+import { useDrawer } from '/@/components/Drawer';
+// 导入子页面【新增、修改】
+import AssemblyDrawer from './AssemblyDrawer.vue';
+import Search from './child/Search.vue';
+import { session } from '/@/utils/Memory';
+
+
+export default defineComponent({
+  name: 'SmsLog',
+  components: { BasicTable, TableAction, Authority, Search, Popconfirm, Tooltip, AssemblyDrawer },
+  setup() {
+    const [registerModal, { openDrawer }] = useDrawer(); //使用右侧弹出框
+
+    const props = defineProps({
+      listData: {
+        type: Array,
+        default: () => [],
+      }
+    })
+
+    // setInterval(() => {
+    //   console.log(props)
+    // }, 2000)
+
+
+    function handleQuery(record: Recordable) {
+      console.log("11111:", record)
+      openDrawer(true, {
+        record,
+      });
+    }
+
+
+    var list = [
+      { src: 'http://106.12.170.138:4001/examples/img/Earth.jpg', name: '地图加载', has: false, href: "onlineIde_a1_Hello_World_01" },
+      { src: 'http://106.12.170.138:4001/examples/img/Earth.jpg', name: '地图加载', has: false, href: "onlineIde_a1_Hello_World_01" },
+      { src: 'http://106.12.170.138:4001/examples/img/Earth.jpg', name: '地图加载', has: false, href: "onlineIde_a1_Hello_World_01" }
+    ]
+
+    return {
+      registerModal,
+      list,
+      handleQuery,
+    };
+  },
+});
+</script>
+
+<style scoped>
+.leftBut>p {
+  display: inline-block;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 16.38px;
+  letter-spacing: 0px;
+  color: #888888;
+  width: 25%;
+}
+
+.leftBut>p span:last-child {
+  color: #333;
+}
+
+.item b {
+  font-size: 16px;
+  font-weight: bold;
+  display: inline-block;
+  margin: 10px 0;
+}
+
+.item {
+  width: 100%;
+  height: 110px;
+  border-radius: 4px;
+  background: #FFFFFF;
+  border: 1px solid #DEDEDE;
+  padding: 10px;
+  float: left;
+  margin: 0px 20px 20px 0px;
+}
+
+.item img {
+  width: 140px;
+  height: 90px;
+}
+
+.item>div:first-child {
+  float: left;
+  width: 140px;
+  height: 90px;
+  overflow: hidden;
+}
+
+.item>div:last-child {
+  float: left;
+  width: calc(100vw - 722px);
+  margin-left: 20px;
+}
+
+.itemLetf>span {
+  display: block;
+  height: 24px;
+  line-height: 24px;
+}
+
+.itemLetf>span>h1 {
+  font-size: 16px;
+  font-weight: bold;
+  line-height: 16px;
+  color: #333333;
+  float: left;
+}
+
+.itemLetf>span>b {
+  float: right;
+  margin: 0px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 16.38px;
+  letter-spacing: 0px;
+  color: #0671DD;
+}
+
+.itemLetf>span>b>span:first-child {
+  border-right: solid 1px #999999;
+  padding-right: 10px;
+}
+
+.itemLetf>span>b>span:last-child {
+  padding-left: 10px;
+}
+
+.itemLetf>p {
+  text-align: left;
+  border-bottom: 1px solid #DEDEDE;
+  padding-bottom: 10px;
+}
+
+.itemLetf>p>span {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 16.38px;
+  letter-spacing: 0px;
+  color: #888888;
+  margin-right: 20px;
+}
+</style>

File diff suppressed because it is too large
+ 789 - 0
src/views/interface/item/AssemblyDrawer.vue


+ 221 - 0
src/views/interface/item/assembly.data.ts

@@ -0,0 +1,221 @@
+import { BasicColumn } from '/@/components/Table';
+import { FormSchema } from '/@/components/Table';
+import { h } from 'vue';
+import { Tag } from 'ant-design-vue';
+import { Icon } from '/@/components/Icon';
+import { useI18n } from '/@/hooks/web/useI18n';
+const { t } = useI18n();
+
+//菜单管理页,所需的列 配置
+export const columns: BasicColumn[] = [
+  {
+    title: t('routes.common.system.tableTitleSystemMenuName'), //菜单名称
+    // title:'菜单名称',
+    dataIndex: 'meta.title',
+    width: 180,
+    align: 'left',
+    customRender: ({ record }) => {
+      record = t(record.title); //国际化处理
+      return record;
+    },
+  },
+  {
+    title: t('routes.common.system.tableTitleSystemPermissionTag'), //权限标识
+    // title:'权限标识',
+    dataIndex: 'permission',
+    width: 220,
+  },
+  {
+    title: t('routes.common.system.tableTitleSystemComponents'), //'组件'
+    // title:'组件',
+    width: 120,
+    // dataIndex: 'component',
+    dataIndex: 'url',
+  },
+  {
+    title: t('routes.common.system.tableTitleSystemSort'), //'排序'
+    // title:'排序',
+    dataIndex: 'sort',
+    width: 50,
+  },
+
+];
+
+const isDir = (type: string) => type === '0';
+const isMenu = (type: string) => type === '1';
+const isButton = (type: string) => type === '2';
+
+//----------------------------------新增、编辑----------------------------------------------------------
+export const formSchema: FormSchema[] = [
+  {
+    field: 'menuType',
+    label: t('routes.common.system.menuEditPagesMenuType'), //菜单类型
+    component: 'RadioButtonGroup',
+    defaultValue: '0',
+    componentProps: {
+      options: [
+        { label: t('routes.common.system.menuEditPagesDirectory'), value: '0' }, //目录
+        { label: t('routes.common.system.menuEditPagesMenu'), value: '1' }, //菜单
+        { label: t('routes.common.system.menuEditPagesButton'), value: '2' }, //按钮
+      ],
+    },
+    colProps: { lg: 24, md: 24 },
+  },
+  {
+    field: 'title',
+    label: t('routes.common.system.tableTitleSystemMenuName'), //菜单名称
+    component: 'Input',
+    required: true,
+    componentProps: {
+      maxLength: 255,
+    },
+  },
+
+  {
+    field: 'parentId',
+    label: t('routes.common.system.menuEditPagesParentMenu'), //上级菜单
+    component: 'TreeSelect',
+    componentProps: {
+      replaceFields: {
+        title: 'menuName',
+        key: 'id',
+        value: 'id',
+      },
+      getPopupContainer: () => document.body,
+    },
+  },
+
+  {
+    field: 'sort',
+    label: t('routes.common.system.tableTitleSystemSort'), //排序
+    component: 'InputNumber',
+    required: true,
+    componentProps: {
+      maxLength: 32,
+    },
+  },
+  {
+    field: 'icon',
+    label: t('routes.common.system.tableTitleSystemIcon'), //图标
+    component: 'IconPicker',
+    required: true,
+    ifShow: ({ values }) => !isButton(Reflect.get(values, 'menuType')),
+  },
+
+  {
+    field: 'path',
+    label: t('routes.common.system.menuEditPagesRouterAddress'), //路由地址
+    component: 'Input',
+    required: true,
+    ifShow: ({ values }) => !isButton(Reflect.get(values, 'menuType')),
+    componentProps: {
+      maxLength: 255,
+    },
+  },
+  {
+    field: 'permission',
+    label: '权限标识', //路由地址
+    component: 'Input',
+    // required: true,//是否必须
+    componentProps: {
+      maxLength: 255,
+    },
+  },
+  {
+    field: 'component',
+    label: t('routes.common.system.menuEditPagesComponentsPath'), //组件路径
+    component: 'Input',
+    ifShow: ({ values }) => isMenu(Reflect.get(values, 'menuType')),
+    componentProps: {
+      maxLength: 100,
+    },
+    dynamicRules: () => {
+      return [
+        {
+          required: false,
+          validator: (_, value) => {
+            if (String(value).length > 100) {
+              return Promise.reject('字数不超过100个字');
+            }
+            return Promise.resolve();
+          },
+        },
+      ];
+    },
+  },
+  {
+    field: 'permission',
+    label: t('routes.common.system.tableTitleSystemPermissionTag'), //权限标识
+    component: 'Input',
+    ifShow: ({ values }) => !isDir(Reflect.get(values, 'menuType')),
+    componentProps: {
+      maxLength: 100,
+    },
+    dynamicRules: () => {
+      return [
+        {
+          required: false,
+          validator: (_, value) => {
+            if (String(value).length > 100) {
+              return Promise.reject('字数不超过100个字');
+            }
+            return Promise.resolve();
+          },
+        },
+      ];
+    },
+  },
+  {
+    field: 'status',
+    label: t('routes.common.system.tableTitleSystemStatus'), //状态
+    component: 'RadioButtonGroup',
+    defaultValue: '0',
+    componentProps: {
+      options: [
+        { label: t('routes.common.system.tableTitleSystemEnable'), value: '0' }, //启用
+        { label: t('routes.common.system.tableTitleSystemStop'), value: '1' }, //禁用
+      ],
+    },
+  },
+  {
+    field: 'isLink',
+    label: t('routes.common.system.menuEditPagesIsExt'), //是否外链
+    component: 'RadioButtonGroup',
+    defaultValue: false,
+    componentProps: {
+      options: [
+        { label: t('routes.common.system.menuEditPagesYes'), value: true }, //是
+        { label: t('routes.common.system.menuEditPagesNo'), value: false }, //否
+      ],
+    },
+    ifShow: ({ values }) => !isButton(Reflect.get(values, 'menuType')),
+  },
+
+  {
+    field: 'ignoreKeepAlive',
+    label: t('routes.common.system.menuEditPagesIsKeepAlive'), //是否缓存
+    component: 'RadioButtonGroup',
+    defaultValue: false,
+    componentProps: {
+      options: [
+        { label: t('routes.common.system.menuEditPagesYes'), value: true }, //是
+        { label: t('routes.common.system.menuEditPagesNo'), value: false }, //否
+      ],
+    },
+    ifShow: ({ values }) => isMenu(Reflect.get(values, 'menuType')),
+  },
+
+  {
+    field: 'hideMenu',
+    label: t('routes.common.system.menuEditPagesIsHide'), //是否隐藏
+    component: 'RadioButtonGroup',
+    defaultValue: false,
+    componentProps: {
+      options: [
+        { label: t('routes.common.system.menuEditPagesYes'), value: true }, //是
+        { label: t('routes.common.system.menuEditPagesNo'), value: false }, //否
+      ],
+    },
+    ifShow: ({ values }) => !isButton(Reflect.get(values, 'menuType')),
+  },
+];

+ 98 - 0
src/views/interface/item/child/Search.vue

@@ -0,0 +1,98 @@
+<template>
+    <div class="wrapper">
+        <span class="sqrk">申请入库(1)</span>
+        <span>
+            <a-select ref="select" v-model:value="value" style="width: 200px" :options="options" @focus="focus"
+                @change="handleChange">
+            </a-select>
+        </span>
+        <span>
+            <a-input-search v-model:value="key" placeholder="请输入搜索内容" style="width: 200px" @search="onSearch" />
+        </span>
+        <div>
+            <!-- <a-checkbox v-model:checked="checked1">全部</a-checkbox>
+            <a-checkbox v-model:checked="checked2">测试数据1</a-checkbox>
+            <a-checkbox v-model:checked="checked3">测试数据2</a-checkbox>
+            <a-checkbox v-model:checked="checked4">测试数据3</a-checkbox> -->
+            一共有6个通用接口
+        </div>
+    </div>
+</template>
+
+
+<script lang="ts">
+import { defineComponent, ref, computed, unref } from 'vue';
+export default defineComponent({
+    name: 'Search',
+    components: {},
+    setup() {
+        const value = ref<string>('1');
+        const key = ref<string>('');
+        const checked1 = ref<boolean>(false);
+        const checked2 = ref<boolean>(false);
+        const checked3 = ref<boolean>(false);
+        const checked4 = ref<boolean>(false);
+
+        const options = ref<SelectTypes['options']>([
+            {
+                value: '1',
+                label: '已审核',
+            },
+            {
+                value: '2',
+                label: '未审核',
+            },
+            {
+                value: '3',
+                label: '未通过',
+            },
+        ]);
+
+        function onSearch() {
+
+        }
+
+        return {
+            options,
+            value,
+            key,
+            onSearch,
+            checked1,
+            checked2,
+            checked3,
+            checked4,
+        };
+    },
+});
+</script>
+<style scoped>
+.wrapper>div {
+    float: right;
+    height: 32px;
+    padding: 5px 0;
+}
+
+.wrapper>span {
+    display: inline-block;
+    margin-right: 30px
+}
+
+.wrapper {
+    width: 100%;
+    height: 54px;
+    padding: 11px;
+    margin-bottom: 20px;
+    border-bottom: solid 1px #DEDEDE;
+}
+
+.sqrk {
+    width: 94px;
+    height: 32px;
+    background: #0671DD;
+    color: #fff;
+    line-height: 32px;
+    display: block;
+    text-align: center;
+    border-radius: 4px;
+}
+</style>

+ 225 - 0
src/views/resource/library/MapDrawer.vue

@@ -0,0 +1,225 @@
+<template>
+  <BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="500px" @ok="handleSubmit">
+    <BasicForm @register="registerForm">
+      <template #menu>
+        <Spin :spinning="spinning"></Spin>
+      </template>
+    </BasicForm>
+  </BasicDrawer>
+</template>
+<script lang="ts">
+import { defineComponent, ref, computed, unref, nextTick } from 'vue';
+import { BasicForm, useForm } from '/@/components/Form/index';
+import { formSchema, KeysTypeEnum, RoleMenuDictEnum } from './map.data';
+import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
+import { BasicTree, TreeItem } from '/@/components/Tree';
+import { useMessage } from '/@/hooks/web/useMessage';
+const { t } = useI18n(); //加载国际化
+// 加载菜单数据
+import { getMenuList } from '/@/api/sys/menu';
+import { useI18n } from '/@/hooks/web/useI18n';
+import { MenuRecord } from '/@/api/sys/model/menuModel';
+import { saveOrUpdateRoleInfoWithMenu } from '/@/api/system/system';
+import { findDictItemByCode } from '/@/api/system/dict';
+import { RoleEnum } from '/@/enums/roleEnum';
+import { Spin } from 'ant-design-vue';
+import { useUserStore } from '/@/store/modules/user';
+import { session } from '/@/utils/Memory';
+import { v4 as uuidv4 } from 'uuid';
+
+
+type TreeData = MenuRecord & TreeItem;
+
+export default defineComponent({
+  name: 'RoleDrawer',
+  components: { BasicDrawer, BasicForm, BasicTree, Spin },
+  emits: ['success', 'register'],
+  setup(_, { emit }) {
+    const isUpdate = ref<boolean>(true);
+    const treeData = ref<TreeData[]>([]);
+    const roleMenus = ref<string[]>([]);
+    const roleId = ref<string>('');
+    const checked = ref<string[]>([]); //需要选中的节点
+    const spinning = ref(false);
+    var nowRole = null;
+
+    const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
+      labelWidth: 100,
+      schemas: formSchema,
+      showActionButtonGroup: false,
+    });
+
+    const transformName = (data: TreeData[]) => {
+      return data.map((item) => {
+        item.name = t(item.name);
+        if (item.children && item.children.length) {
+          item.children = transformName(item.children as unknown as TreeData[]);
+        }
+        return item;
+      });
+    };
+
+    const userStore = useUserStore();
+    const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
+      resetFields();
+      roleId.value = '';
+      // 在打开弹窗时清除所有选择的菜单
+      isUpdate.value = data.isUpdate;
+      const roleType = data?.record?.roleType || userStore.getRoleList.at(0);
+
+      try {
+        spinning.value = true;
+        // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告
+
+        if (!unref(treeData).length) {
+          // 获取全部的菜单
+          const menuListModel = await getMenuList();
+          treeData.value = transformName(menuListModel as unknown as TreeData[]);
+        }
+
+        const keys = await getPermissionByRole(roleType);
+        const { keyType } = RoleMenuDictEnum[roleType];
+        treeData.value = getPermissionTreeData(
+          unref(treeData) as unknown as TreeData[],
+          keys,
+          keyType
+        );
+        // 更新
+        if (unref(isUpdate)) {
+          checked.value = [];
+          roleId.value = data.record.id;
+          nowRole = data.record;
+          setFieldsValue(data.record);
+        } else {
+        }
+      } catch (error) {
+        throw error;
+      } finally {
+        spinning.value = false;
+      }
+    });
+
+    const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));
+
+    async function handleSubmit() {
+      setDrawerProps({ confirmLoading: true });
+      const { createMessage } = useMessage();
+      try {
+        const values = await validate();
+        const req = {
+          groupName: values.groupName,
+          sort: values.sort
+        };
+        if (unref(isUpdate)) {
+          if (nowRole) {
+            req.updateuser = session.getItem("userInfo").EMPLOYEE.EMPLOYEE_ID;
+            req.groupid = nowRole.groupid;
+          }
+        } else {
+          req.groupid = uuidv4()
+        }
+        saveOrUpdateRoleInfoWithMenu(req).then(() => {
+          closeDrawer();
+          emit('success');
+          nowRole = null;
+          createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);
+        });
+      } finally {
+        setTimeout(() => {
+          setDrawerProps({ confirmLoading: false });
+        }, 300);
+      }
+    }
+
+    const getPermissionByRole = async (roleType: RoleEnum) => {
+      try {
+        const { key } = RoleMenuDictEnum[roleType];
+        const res = await findDictItemByCode({ dictCode: key });
+        return res.map((item) => item.itemValue);
+      } catch (error) { }
+      return [];
+    };
+
+    const getPermissionTreeData = (
+      data: MenuRecord[],
+      permissionKeys: string[],
+      keysType: KeysTypeEnum
+    ) => {
+      const setDisabled = (data: MenuRecord[], flag: boolean) => {
+        return data.map((item) => {
+          item.name = t(item.name);
+          if (item.children && item.children.length) {
+            item.children = setDisabled(item.children, flag);
+          }
+          return {
+            ...item,
+            disabled: flag,
+            icon: item.meta.icon,
+          } as TreeData;
+        });
+      };
+
+      const permissionCompare = (
+        data: MenuRecord[],
+        permissionKeys: string[],
+        keysType: KeysTypeEnum
+      ) => {
+        return data.map((item) => {
+          item.name = t(item.name);
+          const findFlag = permissionKeys.includes(item.permission);
+          if (findFlag) item.isDictCompareDisabled = true;
+          const disabledFlag = keysType === KeysTypeEnum.DISABLED ? findFlag : !findFlag;
+          item.disabled = disabledFlag;
+
+          if (item.isDictCompareDisabled && item.children && item.children.length) {
+            setDisabled(item.children, disabledFlag);
+          } else {
+            if (item.children && item.children.length) {
+              item.children = permissionCompare(item.children, permissionKeys, keysType);
+              item.disabled = item.children.every((temp) => temp.disabled);
+            }
+          }
+          return {
+            ...item,
+            icon: item.meta.icon,
+          } as TreeData;
+        });
+      };
+
+      const result = permissionCompare(data, permissionKeys, keysType).map((item) => {
+        if (item.children && item.children.length) {
+          const rootDisabledFlag = item.children.every((temp) => temp.disabled);
+          item.disabled = rootDisabledFlag;
+        }
+        return item;
+      });
+
+      return result;
+    };
+
+    return {
+      spinning,
+      registerDrawer,
+      registerForm,
+      getTitle,
+      handleSubmit,
+      treeData,
+      roleMenus,
+    };
+  },
+});
+</script>
+
+<style scoped lang="less">
+:deep(.vben-basic-tree) {
+  width: 100% !important;
+}
+
+:deep(.is-unflod) {
+  display: none !important;
+}
+
+:deep(.is-flod) {
+  display: none !important;
+}
+</style>

+ 98 - 0
src/views/resource/library/MapSourceModal.vue

@@ -0,0 +1,98 @@
+
+<template>
+  <BasicModal
+    width="1200px"
+    v-bind="$attrs"
+    @register="registerModal"
+    :title="getTitle"
+    @ok="handleSubmit"
+  >
+    <div style="height: 60vh" class="res-form-container">
+      <a-tabs v-model:activeKey="activeKey" class="res-a-tabs">
+        <a-tab-pane key="1" tab="地图资源信息">
+          <!-- <BasicForm @register="registerForm"></BasicForm> -->
+          <source-detail ref="refSourceDetail" @RtnMain="RtnMain" :formData="formData" :isUpdate="isUpdate"></source-detail>
+        </a-tab-pane>
+        <a-tab-pane key="2" tab="流程信息" force-render>
+          <div class="tab2"></div>
+        </a-tab-pane>
+      </a-tabs>
+    </div>
+  </BasicModal>
+</template>
+  <script lang="ts">
+import { defineComponent, ref, computed, unref, reactive, onMounted } from 'vue';
+import { BasicModal, useModalInner } from '/@/components/Modal';
+import { BasicForm, useForm } from '/@/components/Form/index';
+import { formSchema } from './map.data';
+import { BasicTree } from '/@/components/Tree';
+import { PlusOutlined } from '@ant-design/icons-vue';
+import SourceDetail from './SourceDetail.vue';
+
+export default defineComponent({
+  name: 'AccountModal',
+  components: {
+    BasicModal,
+    BasicForm,
+    BasicTree,
+    PlusOutlined,
+    SourceDetail,
+    VNodes: (_, { attrs }) => {
+      return attrs.vnodes;
+    },
+  },
+  emits: ['success', 'register'],
+  setup(_, { emit }) {
+    const data = reactive({
+      activeKey: '2',
+    });
+    const refSourceDetail = ref(null);
+    let formData = ref(null)
+    const isUpdate = ref(true);
+    const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
+      setModalProps({ confirmLoading: false });
+      isUpdate.value = !!data?.isUpdate;
+      if(isUpdate.value) formData.value = data.record
+    });
+    const getTitle = computed(() => (!unref(isUpdate) ? '新增组件资源' : '编辑组件资源'));
+
+    async function handleSubmit() {
+      refSourceDetail.value.submitForm();
+    }
+    const RtnMain = (status) => {
+      emit('success')
+    }
+
+    onMounted(() => {});
+    return {
+      ...ref(data),
+      registerModal,
+      handleSubmit,
+      getTitle,
+      refSourceDetail,
+      isUpdate,
+      formData,
+      RtnMain,
+    };
+  },
+});
+</script>
+  <style scoped lang="less">
+:deep(.vben-basic-tree) {
+  width: 100% !important;
+}
+
+:deep(.is-unflod) {
+  display: none !important;
+}
+
+:deep(.is-flod) {
+  display: none !important;
+}
+:deep(.res-form-container) {
+  .res-a-tabs {
+    margin-top: 61px !important;
+  }
+}
+</style>
+  

+ 430 - 0
src/views/resource/library/SourceDetail.vue

@@ -0,0 +1,430 @@
+<!--
+ * @Author: tengmingxue 1473375109@qq.com
+ * @Date: 2023-08-15 22:08:21
+ * @LastEditors: tengmingxue 1473375109@qq.com
+ * @LastEditTime: 2023-08-17 15:59:13
+ * @FilePath: \xld-gis-admin\src\views\resource\map\SourceDetail.vue
+ * @Description: 地图资源明细界面
+-->
+<template>
+  <div class="source-detail">
+    <a-form ref="formRef" :model="formState" :rules="rules" style="width: 100%">
+      <div class="compontents">
+        <div class="title">基本信息</div>
+        <a-row class="form-container">
+          <a-col :span="12" class="form-col">
+            <a-form-item ref="servicename" label="资源名称" name="servicename" class="label-form-item">
+              <a-input v-model:value="formState.servicename" />
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12" class="form-col">
+            <a-form-item ref="servicealiasname" label="资源别名" name="servicealiasname" class="label-form-item">
+              <a-input v-model:value="formState.servicealiasname" />
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="24" class="form-col">
+            <a-form-item ref="description" label="资源描述" name="description" class="label-form-item">
+              <a-textarea v-model:value="formState.description" :rows="2" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12" class="form-col">
+            <a-form-item ref="servicetype" label="资源类型" name="servicetype" class="label-form-item">
+              <a-select v-model:value="formState.servicetype">
+                <template v-for="(tag, index) in assemblyType" :key="index">
+                  <a-select-option :value="tag.value">{{ tag.value }}</a-select-option>
+                </template>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12" class="form-col">
+            <a-form-item ref="thumbnail" label="缩略图" name="thumbnail" class="label-form-item">
+              <a-upload :custom-request="customUpload" v-model:file-list="fileList">
+                <a-button style="background-color: #0671dd; color: #fff; border-radius: 4px">
+                  <upload-outlined></upload-outlined>
+                  文件上传
+                </a-button>
+              </a-upload>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </div>
+
+      <div class="compontents">
+        <div class="title">描述信息</div>
+        <a-row class="form-container">
+
+
+
+
+
+
+
+          <a-col :span="12" class="form-col">
+            <a-form-item ref="source" label="发布日期" name="source" class="label-form-item">
+              <!-- <a-input v-model:value="formState.publishtime" disabled /> -->
+              <a-date-picker v-model:value="formState.publishtime" format="YYYY-MM-DD hh:mm:ss" style="width: 100%"
+                disabled show-time>
+                <template #renderExtraFooter>extra footer</template>
+              </a-date-picker>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12" class="form-col">
+            <a-form-item ref="source" label="发布者" name="source" class="label-form-item">
+              <a-input v-model:value="formState.publisher" disabled />
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12" class="form-col">
+            <a-form-item ref="updatetype" label="更新方式" name="updatetype" class="label-form-item">
+              <a-input v-model:value="formState.updateType" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12" class="form-col">
+            <a-form-item ref="updatetime" label="更新时间" name="updatetime" class="label-form-item">
+              <a-date-picker v-model:value="formState.updatetime" format="YYYY-MM-DD hh:mm:ss" style="width: 100%"
+                disabled show-time>
+                <template #renderExtraFooter>extra footer</template>
+              </a-date-picker>
+            </a-form-item>
+          </a-col>
+
+
+          <a-col :span="6" class="form-col">
+            <a-form-item ref="public" label="是否公开" name="public" class="label-form-item">
+              <a-switch checked-children="" un-checked-children="" v-model:checked="formState.public" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6" class="form-col">
+            <a-form-item ref="share" label="是否共享" name="share" class="label-form-item">
+              <a-switch checked-children="" un-checked-children="" v-model:checked="formState.share" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6" class="form-col">
+            <a-form-item ref="externalApply" label="是否外部申请" name="externalApply" class="label-form-item">
+              <a-switch checked-children="" un-checked-children="" v-model:checked="formState.externalApply" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6" class="form-col">
+            <a-form-item ref="searched" label="是否展示" name="searched" class="label-form-item">
+              <a-switch checked-children="" un-checked-children="" v-model:checked="formState.searched" />
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </div>
+    </a-form>
+  </div>
+</template>
+<script lang="ts">
+import {
+  defineComponent,
+  ref,
+  toRefs,
+  toRaw,
+  unref,
+  computed,
+  unref,
+  nextTick,
+  reactive,
+  UnwrapRef,
+  onMounted,
+  watch,
+} from 'vue';
+import { BasicForm, useForm } from '/@/components/Form/index';
+import { UploadOutlined } from '@ant-design/icons-vue';
+import { ValidateErrorEntity } from 'ant-design-vue/es/form/interface';
+import { useMessage } from '/@/hooks/web/useMessage';
+const { t } = useI18n(); //加载国际化
+// 加载菜单数据
+import { useI18n } from '/@/hooks/web/useI18n';
+import Moment from 'moment';
+import { insertService, updateService, update } from '/@/api/dataAdmin/assembly';
+import { session } from '/@/utils/Memory.js';
+
+const props = {
+  formData: { type: Object, default: ref(null) },
+  isUpdate: { type: Boolean, default: ref(false) },
+};
+interface FormState {
+  servicetype: string,
+  servicename: string;
+  mapingurl: string,
+  servicealiasname: string;
+  description: string;
+  publishtime: string;
+  publisher: string;
+  updateType: string;
+  updatetime: string;
+  public: boolean;
+  share: boolean;
+  searched: boolean;
+  externalApply: boolean;
+  date1: undefined;
+}
+export default defineComponent({
+  name: 'SourceDetail',
+  components: { BasicForm, UploadOutlined },
+  props,
+  setup(props, { emit }) {
+    const data = reactive({
+      detail: props.formData,
+      isUpdate: props.isUpdate,
+      fileList: [],
+    });
+    var assemblyType = ref([
+      { value: '地图基础功能' },
+      { value: '覆盖物' },
+      { value: '测量工具' },
+      { value: '绘制工具' },
+      { value: '空间分析' },
+      { value: '天气特效' },
+    ])
+
+    const formRef = ref();
+    const formState: UnwrapRef<FormState> = reactive({
+      mapingurl: '',
+      servicename: '',
+      servicealiasname: '',
+      servicetype: '',
+      description: '',
+      publishtime: '',
+      publisher: '',
+      updateType: '',
+      updatetime: '',
+      public: true,
+      share: true,
+      searched: true,
+      externalApply: true,
+      date1: undefined,
+    });
+    const moment = Moment;
+    const rules = {
+      // mapingurl: [{ required: true, message: '请输入服务地址', trigger: 'blur' }],
+      servicetype: [{ required: true, message: '请选择资源类型', trigger: 'change' }],
+
+      servicename: [
+        { required: true, message: '请填写资源名称', trigger: 'blur' },
+        { min: 3, max: 20, message: '长度必须在3到20个字符', trigger: 'blur' },
+      ],
+      servicealiasname: [
+        { required: true, message: '请输入资源别名', trigger: 'blur' },
+        { min: 3, max: 20, message: '长度必须在3到20个字符', trigger: 'blur' },
+      ],
+      systag: [{ required: true, message: '请选择系统标签', trigger: 'change' }],
+      date1: [{ required: true, message: 'Please pick a date', trigger: 'change', type: 'object' }],
+      type: [
+        {
+          type: 'array',
+          required: true,
+          message: 'Please select at least one activity type',
+          trigger: 'change',
+        },
+      ],
+      resource: [{ required: true, message: 'Please select activity resource', trigger: 'change' }],
+      desc: [{ required: true, message: 'Please input activity form', trigger: 'blur' }],
+    };
+    const { createMessage } = useMessage();
+    watch(
+      () => props.formData,
+      (obj) => {
+        data.detail = obj;
+        if (data.isUpdate) setFormData();
+      }
+    );
+    watch(
+      () => props.isUpdate,
+      (obj) => {
+        data.isUpdate = obj;
+      }
+    );
+    const submitForm = () => {
+      try {
+        formRef.value
+          .validate()
+          .then(async () => {
+            const params = setSubmitForm();
+            console.log(params);
+            if (params) {
+              if (data.isUpdate) {
+                params.servicebase.serviceid = data.detail.serviceid;
+                params.servicebase.id = data.detail.id;
+                if (!params.servicebase.mapingurl) params.servicebase.mapingurl = data.detail.mapingurl;
+
+                params.metadata.serviceid = data.detail.serviceid;
+                params.metadata.id = data.detail.id;
+                if (!params.metadata.mapingurl) params.metadata.mapingurl = data.detail.mapingurl;
+
+
+                const res = await updateService(params);
+                if (res && res?.status !== '-1') {
+                  createMessage.success('修改地图资源成功!');
+                  resetForm();
+                  emit('RtnMain', true);
+                } else createMessage.error('修改地图资源失败!,失败原因:' + res?.message, 1);
+              } else {
+                const res = await insertService(params);
+                if (res && res?.status !== '-1') {
+                  createMessage.success('新增地图资源成功!');
+                  resetForm();
+                  emit('RtnMain', true);
+                } else createMessage.error('新增地图资源失败!,失败原因:' + res?.message, 1);
+              }
+            }
+          })
+          .catch((error: ValidateErrorEntity<FormState>) => {
+            createMessage.error('请完成必填信息!', 1);
+            console.log('error', error);
+          });
+      } catch (ex) {
+        console.log(ex);
+      }
+    };
+    const resetForm = () => {
+      formRef.value.resetFields();
+    };
+
+    /**
+     * 设置提交数据
+     */
+    const setSubmitForm = () => {
+      const userinfo = session.getItem('userInfo');
+      return {
+        type: 'SR',
+        servicebase: {
+          publisher: userinfo?.EMPLOYEE?.NAME, //'系统管理员',
+          username: userinfo?.EMPLOYEE?.NAME, //'系统管理员',
+          userid: userinfo?.EMPLOYEE?.EMPLOYEE_ID, //'27AF004A-8BDN-885T-30FU-89DE3388762B',
+          servicealiasname: formState.servicealiasname, //资源别名
+          description: formState.description, //资源描述
+          ispublic: formState.public ? '1' : '0', //是否公开
+          searched: formState.searched ? '1' : '0', //是否展示
+          externalApply: formState.externalApply ? '1' : '0', //外部申请
+          servicename: formState.servicename, //资源名
+          otherService: '',
+          source: formState.servicetype, //资源类型
+          mapingurl: formState.mapingurl //服务地址
+        },
+        metadata: {
+          source: formState.servicetype, //资源类型
+          mapingurl: formState.mapingurl, //服务地址
+          name: formState.servicename, //资源名
+          servicealiasname: formState.servicealiasname, //资源别名
+          thumbnail: '',
+          description: formState.description,
+          updateType: formState.updateType, //更新方式
+          workSpace: '',
+          ishistory: '0',
+          shsqlc: 'ggdata',
+          urlInfo: '',
+          otherService: '',
+          bz: '',
+          ispublic: formState.public ? '1' : '0', //是否公开
+          searched: formState.searched ? '1' : '0', //是否展示
+          externalApply: formState.externalApply ? '1' : '0', //外部申请
+          isShow: formState.share ? '1' : '0',
+          publisher: userinfo?.EMPLOYEE?.NAME, //'系统管理员',
+          username: userinfo?.EMPLOYEE?.NAME, //'系统管理员',
+          userid: userinfo?.EMPLOYEE?.EMPLOYEE_ID, //'27AF004A-8BDN-885T-30FU-89DE3388762B',
+        }
+      };
+    };
+    /**
+     * 设置表单数据
+     */
+    const setFormData = () => {
+      formState.public = data.detail.ispublic === '1' ? true : false;
+      formState.servicename = data.detail?.servicename;
+      formState.publishtime = data.detail?.publishdate
+        ? moment(data.detail?.publishdate).format('YYYY-MM-DD HH:mm:ss')
+        : '';
+      formState.publisher = data.detail?.publisher;
+      formState.servicealiasname = data.detail?.servicealiasname;
+      formState.updatetime = data.detail?.updatedate
+        ? moment(data.detail?.updatedate).format('YYYY-MM-DD HH:mm:ss')
+        : '';
+      formState.searched = data.detail.searched === 0 ? false : true;
+    };
+
+    onMounted(() => {
+      resetForm();
+    });
+
+    function customUpload({ file, onSuccess, onError }) {
+      const formData = new FormData();
+      formData.append('file', file);
+      update(formData, session.getItem('sysFild').dirId).then(r => {
+        if (r && r.resp_code == 0 && r.resp_msg == "OK") {
+          formState.mapingurl = `${r.datas.id},${r.datas.dirId}`;
+          onSuccess()
+        } else {
+          onError()
+        }
+      })
+    }
+    return {
+      assemblyType,
+      customUpload,
+      ...toRefs(data),
+      formRef,
+      moment,
+      rules,
+      formState,
+      submitForm,
+      resetForm,
+      createMessage,
+      setSubmitForm,
+      setFormData,
+    };
+  },
+});
+</script>
+  
+<style scoped lang="less">
+.source-detail {
+  height: 100%;
+  width: 100%;
+  padding: 0 20px;
+
+  .compontents {
+    width: 100%;
+    height: auto;
+
+    .title {
+      height: 19px;
+      line-height: 18px;
+      padding-left: 6px;
+      margin-bottom: 20px;
+      border-left: 3px solid #0671dd;
+      font-family: Source Han Sans CN;
+      font-size: 16px;
+      font-weight: 350;
+      letter-spacing: 0px;
+    }
+
+    .form-container {
+      width: 100%;
+      height: auto;
+
+      .form-col {
+        height: 100%;
+      }
+
+      .form-col-left {
+        padding-right: 20px;
+      }
+    }
+  }
+}
+
+.label-form-item {
+  :deep(.ant-form-item-label) {
+    width: 90px;
+  }
+
+  :deep(.ant-form-item-control) {
+    width: calc(100% - 90px);
+  }
+}
+</style>
+  

+ 218 - 0
src/views/resource/library/index.vue

@@ -0,0 +1,218 @@
+<template>
+  <div>
+    <BasicTable :rowSelection="{ type: 'checkbox' }" @register="registerTable" :clickToRowSelect="false">
+      <template #toolbar>
+        <Authority>
+          <a-button type="primary" @click="handleCreate">新增地图</a-button>
+        </Authority>
+        <Authority>
+          <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消" @confirm="handleDeleteOrBatchDelete(null)">
+            <a-button type="primary" color="error" :disabled="hasBatchDelete"> 批量删除 </a-button>
+          </Popconfirm>
+        </Authority>
+      </template>
+      <!-- <template #status="{ record }">
+        <Switch :checked="record.status === 1" :loading="record.pendingStatus" checkedChildren="启用" unCheckedChildren="禁用"
+          @change="(checked: boolean) => statusChange(checked, record)" />
+      </template> -->
+      <template #action="{ record }">
+        <TableAction :actions="[
+          {
+            label: '浏览',
+            icon: '' /**clarity:note-edit-line*/,
+            // ifShow: record.servicealiasname,
+            // ifShow: ((action) => action.servicealiasname),
+            ifShow: record.servicealiasname,
+            onClick: see.bind(null, record),
+          },
+          {
+            label: '查看',
+            icon: '' /**clarity:note-edit-line*/,
+            onClick: handleEdit.bind(null, record),
+          },
+          {
+            label: '编辑',
+            icon: '' /**clarity:note-edit-line*/,
+            color: 'warning',
+            onClick: handleEdit.bind(null, record),
+          },
+          {
+            label: '删除',
+            icon: '' /**ant-design:delete-outlined'*/,
+            color: 'error',
+            ifShow: record.roleType != RoleEnum.SYS_ADMIN,
+            popConfirm: {
+              title: '是否确认删除',
+              confirm: handleDelete.bind(null, record),
+            },
+          },
+        ]" />
+      </template>
+      <template #pdate="{ record }">
+        <Tag :color="'red'">
+          {{
+            record.publishdate ? moment(record.publishdate).format('YYYY-MM-DD HH:mm:ss') : ''
+          }}
+        </Tag>
+      </template>
+      <template #status="{ record }">
+        <Tag :style="`color:${record.status === 3 || record.status === 3 ? 'red' : ''};`">
+          {{
+            record.status === 0 ? '待审核' : (record.status === 1 ? '审核通过' : (record.status === 2 ? '审核不通过' : (record.status
+              === 3 ? '被驳回' : '未提交')))
+          }}
+        </Tag>
+      </template>
+    </BasicTable>
+    <!-- <MapDrawer @register="registerDrawer" @success="handleSuccess" /> -->
+    <MapSourceModal @register="registerModal" @success="handleSuccess" />
+  </div>
+</template>
+<script lang="ts">
+import { defineComponent, nextTick, onBeforeMount } from 'vue';
+import { BasicTable, useTable, TableAction } from '/@/components/Table';
+import { delRole, getRoleListByPage, setRoleStatus } from '/@/api/system/system';
+// import { useDrawer } from '/@/components/Drawer';
+import { useModal } from '/@/components/Modal';
+import MapDrawer from './MapDrawer.vue';
+import MapSourceModal from './MapSourceModal.vue';
+import { columns, searchFormSchema } from './map.data';
+import { RoleEnum } from '/@/enums/roleEnum';
+import { Authority } from '/@/components/Authority';
+import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
+import { useMessage } from '/@/hooks/web/useMessage';
+import { Switch, Popconfirm } from 'ant-design-vue';
+import { list, deleteService } from '/@/api/dataAdmin/assembly';
+import Moment from 'moment'
+
+export default defineComponent({
+  name: 'RoleManagement',
+  components: { BasicTable, MapDrawer, MapSourceModal, TableAction, Authority, Switch, Popconfirm },
+  setup() {
+    //const [registerDrawer, { openDrawer }] = useDrawer();
+    const [registerModal, { openModal }] = useModal();
+    const [registerTable, { setProps, reload, setSelectedRowKeys }] = useTable({
+      title: '地图资源列表',
+      api: list,
+      columns,
+      formConfig: {
+        labelWidth: 100,
+        schemas: searchFormSchema,
+      },
+      useSearchForm: true,
+      showTableSetting: true,
+      bordered: true,
+      showIndexColumn: true,
+      actionColumn: {
+        width: 200,
+        title: '操作',
+        dataIndex: 'action',
+        slots: { customRender: 'action' },
+        fixed: 'right',
+      },
+    });
+    const moment = Moment
+    const { createMessage } = useMessage();
+    const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
+      useBatchDelete(delRole, handleSuccess, setProps);
+    selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
+      // Demo:status为1的选择框禁用
+      if (record.status === 1) {
+        return { disabled: true };
+      } else {
+        return { disabled: false };
+      }
+    };
+    nextTick(() => {
+      setProps(selectionOptions);
+    });
+
+    function handleCreate() {
+      // openDrawer(true, {
+      //   isUpdate: false,
+      // });
+      openModal(true, {
+        isUpdate: false,
+      });
+    }
+
+    function handleEdit(record: Recordable) {
+      // openDrawer(true, {
+      //   record,
+      //   isUpdate: true,
+      // });
+      openModal(true, {
+        record,
+        isUpdate: true,
+      });
+    }
+
+    function see(e) {
+      console.log(e);
+      if (e.servicealiasname) window.open(`../../mapview.html?onlineIde_${e.servicealiasname}`, '_blank');
+    }
+
+    const handleDelete = async (record: Recordable) => {
+      if (record?.serviceid) {
+        const res = await deleteService(record?.serviceid)
+        if (res?.status !== '-1') {
+          reload();
+          createMessage.success('删除成功!', 1)
+        }
+        else {
+          createMessage.error('删除失败!失败原因:' + res?.message, 1)
+        }
+      }
+    }
+
+    function handleSuccess() {
+      openModal(false, {
+        isUpdate: false,
+      });
+      reload();
+    }
+
+    const statusChange = async (checked, record) => {
+      setProps({
+        loading: true,
+      });
+      setSelectedRowKeys([]);
+      resetSelectedRowKeys();
+      const newStatus = checked ? 1 : 0;
+      try {
+        await setRoleStatus(record.id, newStatus);
+        if (newStatus) {
+          createMessage.success(`启用成功`);
+        } else {
+          createMessage.success('禁用成功');
+        }
+      } finally {
+        setProps({
+          loading: false,
+        });
+        reload();
+      }
+    };
+    onBeforeMount(async () => {
+
+    })
+
+    return {
+      moment,
+      createMessage,
+      registerTable,
+      // registerDrawer,
+      registerModal,
+      handleCreate,
+      see,
+      handleEdit,
+      handleDelete,
+      handleSuccess,
+      RoleEnum,
+      hasBatchDelete,
+      handleDeleteOrBatchDelete,
+      statusChange,
+    };
+  },
+});
+</script>

+ 174 - 0
src/views/resource/library/map.data.ts

@@ -0,0 +1,174 @@
+import { BasicColumn } from '/@/components/Table';
+import { FormSchema } from '/@/components/Table';
+import { RoleEnum } from '/@/enums/roleEnum';
+import { getServiceTypes,queryServiceTags,queryDicsByName,queryCoors } from '/@/api/resource/map';
+
+const resTag = await queryServiceTags()
+let listTag = []
+resTag.map(item => {
+  listTag.push({
+    label: item.name,
+    value: item.code
+  })
+})
+/**
+ * 密级字典
+*/
+export const secrets = await queryDicsByName('密级')
+/**
+ * 服务标签
+*/
+export const serviceTags = listTag;
+/**
+ * 坐标系列表
+*/
+export const sysCoors = await queryCoors()
+/**
+ * 服务类型
+*/
+export const serviceTypes = await getServiceTypes()
+/**
+ * 责任处室
+*/
+export const respDept = await queryDicsByName('责任处室')
+/**
+ * 保管单位
+*/
+export const collectDept = await queryDicsByName('保管单位')
+/**
+ * EPSG code
+*/
+export const EPSGCodes = await queryDicsByName('EPSG code')
+
+
+const checkStatus = [
+  { label: '未提交', value: 1 },
+  { label: '审核中', value: 2 },
+  { label: '审核不通过', value: 3 },
+  { label: '被驳回', value: 4 },
+  { label: '审核通过', value: 5 },
+]
+export enum KeysTypeEnum {
+  DISABLED = 'disabled',
+  ENABLED = 'enabled',
+}
+
+export const RoleMenuDictEnum: Recordable<{ key: string; keyType: KeysTypeEnum }> = {
+  [RoleEnum.PLATFORM_ADMIN]: { key: 'enabled_platform_admin_auth', keyType: KeysTypeEnum.ENABLED },
+  [RoleEnum.SYS_ADMIN]: { key: 'enabled_sysadmin_auth', keyType: KeysTypeEnum.ENABLED },
+  [RoleEnum.TENANT_ADMIN]: { key: 'disabled_tenant_auth', keyType: KeysTypeEnum.DISABLED },
+  [RoleEnum.CUSTOMER_USER]: { key: 'disabled_tenant_auth', keyType: KeysTypeEnum.DISABLED },
+};
+
+/**
+ * 查询条件
+*/
+export const searchFormSchema: FormSchema[] = [
+  {
+    field: 'resTag',
+    label: '资源标签',
+    component: 'Select',
+    componentProps: {
+      options: serviceTags,
+      // [
+      //   { label: '标签1', value: 1 },
+      //   { label: '标签2', value: 2 },
+      //   { label: '标签3', value: 3 },
+      // ],
+    },
+    colProps: { span: 5 },
+  },
+  {
+    field: 'resName',
+    label: '资源名称',
+    component: 'Input',
+    colProps: { span: 5 },
+    componentProps: {
+      maxLength: 255,
+    },
+  },
+  {
+    field: 'checkStatus',
+    label: '审核状态',
+    component: 'Select',
+    componentProps: {
+      options: checkStatus,
+    },
+    colProps: { span: 5 },
+  },
+];
+
+/**
+ * 列表显示信息
+*/
+export const columns: BasicColumn[] = [
+  {
+    title: '资源编号',
+    dataIndex: 'serviceid',
+    width: 120,
+  },
+  {
+    title: '资源名称',
+    dataIndex: 'servicename',
+    width: 160,
+  },
+  {
+    title: '资源标签',
+    dataIndex: 'typename',
+    width: 120,
+  },
+  {
+    title: '发布人',
+    dataIndex: 'publisher',
+    width: 120,
+  },
+  {
+    title: '发布时间',
+    dataIndex: 'publishdate',
+    width: 180,
+    slots: { customRender: 'pdate' },
+  },
+  {
+    title: '审核状态',
+    dataIndex: 'status',
+    width: 110,
+    slots: { customRender: 'status' },
+  },
+  {
+    title: '审核人',
+    dataIndex: 'curHandler',
+    width: 100,
+  },
+  {
+    title: '审核时间',
+    dataIndex: 'checkTime',
+    width: 100,
+  },
+];
+
+
+
+/**
+ * 表单
+*/
+export const formSchema: FormSchema[] = [
+  {
+    field: 'groupName',
+    label: '角色名称',
+    required: true,
+    component: 'Input',
+    componentProps: {
+      maxLength: 255,
+      placeholder: '请输入角色名称',
+    },
+  },
+  {
+    label: '排序',
+    field: 'sort',
+    component: 'Input',
+    componentProps: {
+      maxLength: 255,
+      placeholder: '请输入排序',
+    },
+  }
+];