Bladeren bron

新增数据资源功能,包括添加多种类的菜单种子数据

kenny 4 jaren geleden
bovenliggende
commit
c75737d136

+ 2 - 2
Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs

@@ -441,9 +441,9 @@ namespace Admin.NET.Core
         D1601,
 
         /// <summary>
-        /// 已有相同行政区域,编码或名称相同
+        /// 已有相同编码或名称
         /// </summary>
-        [ErrorCodeItemMetadata("已有相同编码或名称行政区域")]
+        [ErrorCodeItemMetadata("已有相同编码或名称")]
         D1602,
 
         /// <summary>

+ 9 - 6
Admin.NET/Admin.NET.Core/SeedData/SysDataResourceSeedData.cs

@@ -4,21 +4,24 @@ using System.Collections.Generic;
 namespace Admin.NET.Core.SeedData
 {
     /// <summary>
-    /// 系统行政区域种子数据
+    /// 系统数据资源种子数据
     /// </summary>
-    public class SysDataResourceSeedData : ISqlSugarEntitySeedData<SysDistrict>
+    public class SysDataResourceSeedData : ISqlSugarEntitySeedData<SysDataResource>
     {
         /// <summary>
         /// 种子数据
         /// </summary>
         /// <returns></returns>
-        public IEnumerable<SysDistrict> HasData()
+        public IEnumerable<SysDataResource> HasData()
         {
             return new[]
             {
-                new SysDistrict{ Id=243848612100001, Pid=0, Name="行政区",Value="district", Code="1001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="行政区"},
-                new SysDistrict{ Id=243848612100002, Pid=243848612100001, Name="北京市",Value="110000", Code="1001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="北京市"},
-                new SysDistrict{ Id=243848612100003, Pid=243848612100002, Name="东城区",Value="110101", Code="1001001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="东城区"},
+                new SysDataResource{ Id=243848612100001, Pid=0, Name="行政区",Value="district", Code="1001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="行政区"},
+                new SysDataResource{ Id=243848612100002, Pid=243848612100001, Name="北京市",Value="110000", Code="1001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="北京市"},
+                new SysDataResource{ Id=243848612100003, Pid=243848612100002, Name="东城区",Value="110101", Code="1001001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="东城区"},
+                new SysDataResource{ Id=243848612100004, Pid=0, Name="行业",Value="industry", Code="1002", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="行业"},
+                new SysDataResource{ Id=243848612100005, Pid=243848612100004, Name="一产",Value="一产", Code="1002001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="一产"},
+                new SysDataResource{ Id=243848612100006, Pid=243848612100005, Name="农、林、牧、渔",Value="农、林、牧、渔", Code="1002001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="农、林、牧、渔"},
             };
         }
     }

+ 25 - 0
Admin.NET/Admin.NET.Core/SeedData/SysDistrictSeedData.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace Admin.NET.Core.SeedData
+{
+    /// <summary>
+    /// 系统行政区域种子数据
+    /// </summary>
+    public class SysDistrictSeedData : ISqlSugarEntitySeedData<SysDistrict>
+    {
+        /// <summary>
+        /// 种子数据
+        /// </summary>
+        /// <returns></returns>
+        public IEnumerable<SysDistrict> HasData()
+        {
+            return new[]
+            {
+                new SysDistrict{ Id=243848612100001, Pid=0, Name="行政区",Value="district", Code="1001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="行政区"},
+                new SysDistrict{ Id=243848612100002, Pid=243848612100001, Name="北京市",Value="110000", Code="1001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="北京市"},
+                new SysDistrict{ Id=243848612100003, Pid=243848612100002, Name="东城区",Value="110101", Code="1001001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="东城区"},
+            };
+        }
+    }
+}

+ 11 - 5
Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs

@@ -99,11 +99,17 @@ namespace Admin.NET.Core
                 new SysMenu{ Id=252885263003881, Pid=252885263003880, Title="缓存查询", Permission="cache:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
                 new SysMenu{ Id=252885263003882, Pid=252885263003880, Title="缓存删除", Permission="cache:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
 
-                new SysMenu{ Id=252885263003890, Pid=252885263003780, Title="行政区域", Path="district", Name="DistrictManagement", Component="/sys/admin/district/index", Icon="ant-design:pushpin-outlined", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
-                new SysMenu{ Id=252885263003891, Pid=252885263003890, Title="区域查询", Permission="sysDistrict:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
-                new SysMenu{ Id=252885263003892, Pid=252885263003890, Title="区域编辑", Permission="sysDistrict:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
-                new SysMenu{ Id=252885263003893, Pid=252885263003890, Title="区域增加", Permission="sysDistrict:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
-                new SysMenu{ Id=252885263003894, Pid=252885263003890, Title="区域删除", Permission="sysDistrict:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003890, Pid=252885263003780, Title="数据资源管理", Path="dataResource", Name="DataResourceManagement", Component="/sys/admin/dataResource/index", Icon="ant-design:funnel-plot-filled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003891, Pid=252885263003890, Title="数据资源查询", Permission="sysDataResource:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003892, Pid=252885263003890, Title="数据资源编辑", Permission="sysDataResource:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003893, Pid=252885263003890, Title="数据资源增加", Permission="sysDataResource:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003894, Pid=252885263003890, Title="数据资源删除", Permission="sysDataResource:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+
+                new SysMenu{ Id=252885263003895, Pid=252885263003780, Title="行政区域", Path="district", Name="DistrictManagement", Component="/sys/admin/district/index", Icon="ant-design:pushpin-outlined", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003896, Pid=252885263003895, Title="区域查询", Permission="sysDistrict:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003897, Pid=252885263003895, Title="区域编辑", Permission="sysDistrict:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003898, Pid=252885263003895, Title="区域增加", Permission="sysDistrict:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003899, Pid=252885263003895, Title="区域删除", Permission="sysDistrict:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
 
                 new SysMenu{ Id=252885263003900, Pid=0, Title="日志管理", Path="/log", Name="log", Component="LAYOUT", Redirect="", Icon="ant-design:carry-out-outlined", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=300 },
                 new SysMenu{ Id=252885263003910, Pid=252885263003900, Title="访问日志", Path="vislog", Name="VislogManagement", Component="/sys/admin/log/vislog/index", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },

+ 19 - 0
Vben2/src/api/sys/admin.ts

@@ -130,6 +130,12 @@ enum Api {
   AddDistrict = '/sysDistrict/add',
   DeleteDistrict = '/sysDistrict/delete',
   UpdateDistrict = '/sysDistrict/update',
+
+  // 数据资源接口
+  DataResourceList = '/sysDataResource/list',
+  AddDataResource = '/sysDataResource/add',
+  DeleteDataResource = '/sysDataResource/delete',
+  UpdateDataResource = '/sysDataResource/update',
 }
 
 ////////// 账号管理接口 //////////
@@ -445,3 +451,16 @@ export const deleteDistrict = (id: number) =>
   defHttp.post({ url: Api.DeleteDistrict, params: { id } });
 // 更新行政区域
 export const updateDistrict = (params: any) => defHttp.post({ url: Api.UpdateDistrict, params });
+
+////////// 数据资源管理接口 //////////
+// 获取数据资源列表
+export const getDataResourceList = (params?: any) =>
+  defHttp.get<any>({ url: Api.DataResourceList, params });
+// 增加数据资源
+export const addDataResource = (params: any) => defHttp.post({ url: Api.AddDataResource, params });
+// 删除数据资源
+export const deleteDataResource = (id: number) =>
+  defHttp.post({ url: Api.DeleteDataResource, params: { id } });
+// 更新数据资源
+export const updateDataResource = (params: any) =>
+  defHttp.post({ url: Api.UpdateDataResource, params });

+ 94 - 0
Vben2/src/views/sys/admin/dataResource/DataResourceModal.vue

@@ -0,0 +1,94 @@
+<!--
+ * @Author: kenny 362270511@qq.com
+ * @Date: 2022-05-30 11:36:19
+ * @LastEditors: kenny 362270511@qq.com
+ * @LastEditTime: 2022-05-30 16:00:49
+ * @FilePath: \frontend\src\views\sys\admin\dataResource\org\DataResourceModal.vue
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
+<template>
+  <BasicModal v-bind="$attrs" @register="registerModal" :title="getTitle" @ok="handleSubmit">
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, computed, unref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, useForm } from '/@/components/Form/index';
+
+  import { formSchema } from './dataResource.data';
+  import { getDataResourceList, addDataResource, updateDataResource } from '/@/api/sys/admin';
+
+  export default defineComponent({
+    name: 'DataResourceModal',
+    components: { BasicModal, BasicForm },
+    emits: ['success', 'register'],
+    setup(_, { emit }) {
+      const isUpdate = ref(true);
+      let rowId: number;
+
+      const [registerForm, { resetFields, setFieldsValue, updateSchema, validate }] = useForm({
+        labelWidth: 100,
+        schemas: formSchema,
+        showActionButtonGroup: false,
+      });
+
+      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
+        resetFields();
+        setModalProps({ confirmLoading: false });
+        isUpdate.value = !!data?.isUpdate;
+
+        const treeData = await getDataResourceList({ id: data.parentId || 0 });
+        debugger;
+        if (!data.parentId) {
+          treeData.push({
+            id: 0,
+            name: '根节点',
+            pid: 0,
+            remark: '根节点',
+            children: [],
+          });
+        }
+        updateSchema({
+          field: 'pid',
+          componentProps: { treeData },
+        });
+
+        if (unref(isUpdate)) {
+          rowId = data.record.id;
+          setFieldsValue({
+            ...data.record,
+          });
+        } else {
+          setFieldsValue({ pid: data.parentId });
+        }
+      });
+
+      const getTitle = computed(() => (!unref(isUpdate) ? '新增数据资源' : '编辑数据资源'));
+
+      async function handleSubmit() {
+        try {
+          const values = await validate();
+          setModalProps({ confirmLoading: true });
+
+          if (unref(isUpdate)) {
+            values.id = rowId;
+            await updateDataResource(values);
+          } else {
+            rowId = await addDataResource(values);
+          }
+
+          closeModal();
+          emit('success', {
+            isUpdate: unref(isUpdate),
+            values: { ...values, id: rowId },
+          });
+        } finally {
+          setModalProps({ confirmLoading: false });
+        }
+      }
+
+      return { registerModal, registerForm, getTitle, handleSubmit };
+    },
+  });
+</script>

+ 82 - 0
Vben2/src/views/sys/admin/dataResource/DataResourceTree.vue

@@ -0,0 +1,82 @@
+<!--
+ * @Author: kenny 362270511@qq.com
+ * @Date: 2022-05-30 14:35:51
+ * @LastEditors: kenny 362270511@qq.com
+ * @LastEditTime: 2022-05-30 14:41:06
+ * @FilePath: \frontend\src\views\sys\admin\dataResource\DataResourceTree.vue
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
+<template>
+  <div class="m-4 mr-0 overflow-hidden bg-white">
+    <BasicTree
+      title="数据资源列表"
+      toolbar
+      search
+      :clickRowToExpand="true"
+      :treeData="treeData"
+      :fieldNames="{ key: 'id', title: 'name' }"
+      @select="handleSelect"
+      ref="treeAction"
+    />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, onMounted, ref, unref, nextTick } from 'vue';
+  import { BasicTree, TreeActionType, TreeItem } from '/@/components/Tree/index';
+
+  import { getDataResourceList } from '/@/api/sys/admin';
+
+  export default defineComponent({
+    name: 'DataResourceTree',
+    components: { BasicTree },
+
+    emits: ['select'],
+    setup(_, { emit }) {
+      const treeData = ref<TreeItem[]>([]);
+      const treeAction = ref<Nullable<TreeActionType>>(null);
+
+      const appendNodeByKey = (parentKey: string, values) => {
+        unref(treeAction).insertNodeByKey({
+          parentKey: parentKey,
+          node: values,
+          // 往后插入
+          push: 'push',
+          // 往前插入
+          // push:'unshift'
+        });
+      };
+
+      const updateNodeByKey = (key: string, values) => {
+        unref(treeAction).updateNodeByKey(key, values);
+      };
+
+      const deleteNodeByKey = (key: string) => {
+        unref(treeAction).deleteNodeByKey(key);
+      };
+
+      async function fetch() {
+        treeData.value = (await getDataResourceList()) as unknown as TreeItem[];
+        nextTick(() => {
+          unref(treeAction)?.filterByLevel(2);
+        });
+      }
+
+      function handleSelect(keys, obj) {
+        emit('select', keys[0], obj.selectedNodes[0]);
+      }
+
+      onMounted(() => {
+        fetch();
+      });
+      return {
+        treeData,
+        handleSelect,
+        treeAction,
+        appendNodeByKey,
+        updateNodeByKey,
+        deleteNodeByKey,
+        fetch,
+      };
+    },
+  });
+</script>

+ 140 - 0
Vben2/src/views/sys/admin/dataResource/dataResource.data.ts

@@ -0,0 +1,140 @@
+import { BasicColumn } from '/@/components/Table';
+import { FormSchema } from '/@/components/Table';
+import { h } from 'vue';
+import { Tag } from 'ant-design-vue';
+
+export const columns: BasicColumn[] = [
+  {
+    title: '资源名称',
+    dataIndex: 'name',
+    width: 200,
+    align: 'left',
+  },
+  {
+    title: '资源值',
+    dataIndex: 'value',
+    width: 200,
+    align: 'left',
+  },
+  {
+    title: '编码',
+    dataIndex: 'code',
+    width: 200,
+    align: 'left',
+  },
+  {
+    title: '状态',
+    dataIndex: 'status',
+    width: 80,
+    customRender: ({ record }) => {
+      const status = record.status;
+      const enable = ~~status === 1;
+      const color = enable ? 'green' : 'red';
+      const text = enable ? '启用' : '停用';
+      return h(Tag, { color: color }, () => text);
+    },
+  },
+  {
+    title: '创建时间',
+    dataIndex: 'createTime',
+    width: 180,
+  },
+  {
+    title: '排序',
+    dataIndex: 'order',
+    width: 50,
+  },
+  {
+    title: '备注',
+    dataIndex: 'remark',
+  },
+];
+
+export const searchFormSchema: FormSchema[] = [
+  {
+    field: 'name',
+    label: '资源名称',
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+  {
+    field: 'value',
+    label: '资源值',
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+  {
+    field: 'code',
+    label: '资源编码',
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+];
+
+export const formSchema: FormSchema[] = [
+  {
+    field: 'pid',
+    label: '上级资源',
+    component: 'TreeSelect',
+    defaultValue: 0,
+    componentProps: {
+      fieldNames: {
+        label: 'name',
+        key: 'id',
+        value: 'id',
+      },
+      getPopupContainer: () => document.body,
+    },
+    required: true,
+    colProps: { span: 24 },
+  },
+  {
+    field: 'name',
+    label: '资源名称',
+    component: 'Input',
+    required: true,
+    colProps: { span: 24 },
+  },
+  {
+    field: 'value',
+    label: '资源值',
+    component: 'Input',
+    required: true,
+    colProps: { span: 24 },
+  },
+  // {
+  //   field: 'code',
+  //   label: '编码',
+  //   component: 'Input',
+  //   colProps: { span: 24 },
+  // },
+  {
+    field: 'order',
+    label: '排序',
+    component: 'InputNumber',
+    defaultValue: 0,
+    required: true,
+    componentProps: { style: { width: '100%' } },
+    colProps: { span: 24 },
+  },
+  {
+    field: 'status',
+    label: '状态',
+    component: 'RadioButtonGroup',
+    defaultValue: 1,
+    componentProps: {
+      options: [
+        { label: '启用', value: 1 },
+        { label: '停用', value: 2 },
+      ],
+    },
+    required: true,
+    colProps: { span: 24 },
+  },
+  {
+    label: '备注',
+    field: 'remark',
+    component: 'InputTextArea',
+    colProps: { span: 24 },
+  },
+];

+ 189 - 0
Vben2/src/views/sys/admin/dataResource/index.vue

@@ -0,0 +1,189 @@
+<template>
+  <PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
+    <DataResourceTree
+      class="w-1/4 xl:w-1/5"
+      style="overflow: auto"
+      @select="handleSelect"
+      ref="DataResourceTreeChild"
+    />
+    <BasicTable @register="registerTable" class="w-3/4 xl:w-4/5" :searchInfo="searchInfo">
+      <template #toolbar>
+        <a-button
+          type="primary"
+          @click="handleCreatebrother"
+          :disabled="!hasPermission('sysDataResource:add')"
+        >
+          添加同级资源
+        </a-button>
+        <a-button
+          type="primary"
+          @click="handleCreatechild()"
+          :disabled="!hasPermission('sysDataResource:add')"
+        >
+          添加下级资源
+        </a-button>
+      </template>
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              icon: 'clarity:note-edit-line',
+              label: '编辑',
+              disabled: !hasPermission('sysDataResource:update'),
+              onClick: handleEdit.bind(null, record),
+            },
+            {
+              icon: 'ant-design:delete-outlined',
+              label: '删除',
+              color: 'error',
+              ifShow: hasPermission('sysDataResource:delete'),
+              popConfirm: {
+                title: '是否确认删除',
+                confirm: handleDelete.bind(null, record),
+              },
+            },
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <DataResourceModal @register="registerModal" @success="handleSuccess" />
+  </PageWrapper>
+</template>
+<script lang="ts">
+  import { defineComponent, reactive, ref, unref } from 'vue';
+  import { BasicTable, useTable, TableAction } from '/@/components/Table';
+  import { useModal } from '/@/components/Modal';
+  import { usePermission } from '/@/hooks/web/usePermission';
+
+  import { PageWrapper } from '/@/components/Page';
+  import DataResourceTree from './DataResourceTree.vue';
+
+  import DataResourceModal from './DataResourceModal.vue';
+
+  import { columns, searchFormSchema } from './dataResource.data';
+  import { getDataResourceList, deleteDataResource } from '/@/api/sys/admin';
+
+  export default defineComponent({
+    name: 'DataResourceManagement',
+    components: { BasicTable, DataResourceModal, TableAction, PageWrapper, DataResourceTree },
+    setup() {
+      const { hasPermission } = usePermission();
+      const DataResourceTreeChild = ref(null);
+      const [registerModal, { openModal }] = useModal();
+      const searchInfo = reactive<Recordable>({});
+      const [registerTable, { reload, updateTableDataRecord }] = useTable({
+        title: '数据资源列表',
+        api: getDataResourceList,
+        columns,
+        formConfig: {
+          labelWidth: 120,
+          schemas: searchFormSchema,
+        },
+        rowKey: 'id',
+        pagination: false,
+        striped: false,
+        useSearchForm: true,
+        showTableSetting: true,
+        bordered: true,
+        showIndexColumn: false,
+        canResize: true,
+        actionColumn: {
+          width: 150,
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          fixed: undefined,
+        },
+      });
+
+      function getTree() {
+        const tree = unref(DataResourceTreeChild);
+        if (!tree) {
+          throw new Error('Tree is null!');
+        }
+        return tree;
+      }
+
+      function appendNodeByKey(parentKey, values) {
+        getTree().appendNodeByKey(parentKey, values);
+      }
+
+      function updateNodeByKey(key, values) {
+        getTree().updateNodeByKey(key, values); // 子组件里的方法
+      }
+
+      function deleteNodeByKey(key) {
+        getTree().deleteNodeByKey(key);
+      }
+
+      function handleCreate() {
+        openModal(true, {
+          isUpdate: false,
+        });
+      }
+
+      function handleCreatechild() {
+        openModal(true, {
+          isUpdate: false,
+          parentId: searchInfo.Id,
+        });
+      }
+
+      function handleCreatebrother() {
+        openModal(true, {
+          isUpdate: false,
+          parentId: searchInfo.pId,
+        });
+      }
+
+      function handleEdit(record: Recordable) {
+        openModal(true, {
+          record,
+          isUpdate: true,
+        });
+      }
+
+      async function handleDelete(record: Recordable) {
+        await deleteDataResource(record.id);
+        deleteNodeByKey(record.id);
+        searchInfo.Id = record.pid;
+        reload();
+      }
+
+      function handleSelect(orgId: number, obj) {
+        searchInfo.Id = orgId;
+        searchInfo.pId = obj.pid ? obj.pid : 0;
+        reload();
+      }
+
+      function handleSuccess({ isUpdate, values }) {
+        if (isUpdate) {
+          updateTableDataRecord(values.id, values);
+          updateNodeByKey(values.id, values);
+        } else {
+          reload();
+          appendNodeByKey(values.pid, values);
+        }
+        // getTree().fetch();
+      }
+
+      return {
+        registerTable,
+        registerModal,
+        searchInfo,
+        DataResourceTreeChild,
+        handleSelect,
+        updateNodeByKey,
+        appendNodeByKey,
+        deleteNodeByKey,
+        handleCreate,
+        handleCreatebrother,
+        handleCreatechild,
+        handleEdit,
+        handleDelete,
+        handleSuccess,
+        hasPermission,
+      };
+    },
+  });
+</script>