Ver código fonte

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

XiaXxxxxx 2 anos atrás
pai
commit
750a4b2f86

Diferenças do arquivo suprimidas por serem muito extensas
+ 24 - 0
src/api/sys/menu.ts


+ 29 - 13
src/views/authorize/empower/map.data.ts

@@ -27,35 +27,51 @@ export const RoleMenuDictEnum: Recordable<{ key: string; keyType: KeysTypeEnum }
  * 查询条件
 */
 export const searchFormSchema: FormSchema[] = [
+  {
+    field: 'resName',
+    label: '关键字',
+    component: 'Input',
+    colProps: { span: 5 },
+    componentProps: {
+      placeholder: '请输入名称查询',
+      maxLength: 255,
+    },
+  },
   {
     field: 'resTag',
-    label: '资源标签',
+    label: '资源类型',
     component: 'Select',
     componentProps: {
       options:
         [
-          { label: '标签1', value: 1 },
-          { label: '标签2', value: 2 },
-          { label: '标签3', value: 3 },
+          { label: '地图资源', value: 1 },
+          { label: '组件资源', value: 2 },
+          { label: '场景资源', value: 3 },
+          { label: '接口资源', value: 4 },
         ],
     },
-    colProps: { span: 5 },
+    colProps: { span: 4 },
   },
   {
-    field: 'resName',
-    label: '资源名称',
-    component: 'Input',
-    colProps: { span: 5 },
+    field: 'checkStatus',
+    label: '审核状态',
+    component: 'Select',
     componentProps: {
-      maxLength: 255,
+      options: checkStatus,
     },
+    colProps: { span: 4 },
   },
   {
-    field: 'checkStatus',
-    label: '审核状态',
+    field: 'resTag',
+    label: '应用系统',
     component: 'Select',
     componentProps: {
-      options: checkStatus,
+      options:
+        [
+          { label: '标签1', value: 1 },
+          { label: '标签2', value: 2 },
+          { label: '标签3', value: 3 },
+        ],
     },
     colProps: { span: 5 },
   },

+ 337 - 0
src/views/systemAdmin/system/account/PowerDrawer.vue

@@ -0,0 +1,337 @@
+<template>
+  <BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="500px" @ok="handleSubmit">
+    <BasicForm @register="registerForm">
+      <template #menu>
+        <Spin :spinning="spinning">
+          <!-- <BasicTable @register="registerTable">
+            <template #metacolums="{ record }">
+              <a-checkbox-group @change="(e) => columnsCheck(record, e)" :value="getCheckValue(record.id)">
+                <Checkbox v-for="item in record.fieldMap" :value="item.propField" :key="item.propField">
+                  {{ item.propName }}
+                </Checkbox>
+              </a-checkbox-group>
+            </template>
+          </BasicTable> -->
+
+          <!-- <a-checkbox-group @change="(e) => columnsCheck(record, e)" :value="getCheckValue(record.id)">
+            <Checkbox v-for="item in record.fieldMap" :value="item.propField" :key="item.propField">
+              {{ item.propName }}
+            </Checkbox>
+          </a-checkbox-group> -->
+        </Spin>
+      </template>
+    </BasicForm>
+    <div class="selectPower">
+      <p>选择权限</p>
+      <a-tree checkable :tree-data="treeData2" v-model:expandedKeys="expandedKeys" v-model:selectedKeys="selectedKeys"
+        v-model:checkedKeys="checkedKeys" :replaceFields="replaceFields">
+        <template #title0010><span style="color: #1890ff">sss</span></template>
+      </a-tree>
+    </div>
+  </BasicDrawer>
+</template>
+<script lang="ts">
+import { defineComponent, ref, computed, nextTick, unref, watch } from 'vue';
+import { BasicForm, useForm } from '/@/components/Form/index';
+import { powerSchema, KeysTypeEnum, RoleMenuDictEnum, menuColumns } from './role.data';
+import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
+import { BasicTree, TreeItem } from '/@/components/Tree';
+import { useMessage } from '/@/hooks/web/useMessage';
+const { t } = useI18n(); //加载国际化
+// 加载菜单数据
+import { getMenuList, menuList } 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, message } from 'ant-design-vue';
+import { useUserStore } from '/@/store/modules/user';
+import { session } from '/@/utils/Memory';
+import { BasicTable, useTable } from '/@/components/Table';
+import { onMounted } from 'vue';
+import { saveRoleMenu, getRoleMenus } from '/@/api/sys/user';
+
+
+
+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: powerSchema,
+      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) => {
+      console.log('data', data);
+      var arr = await getRoleMenusWay(data.record.id)
+
+      // expandedKeys.value = arr;
+      // selectedKeys.value = arr;
+      checkedKeys.value = arr;
+
+      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 = '编辑用户权限';
+    async function handleSubmit() {
+      setDrawerProps({ confirmLoading: true });
+      const values = await validate()
+      saveRoleMenu({
+        menusId: menusIds.join(","),
+        systemId: "1",
+        roleId: values.groupid,
+      }).then(r => {
+        closeDrawer();
+        if (r) {
+          setDrawerProps({ confirmLoading: false });
+          message.success('权限添加成功!');
+        }
+      })
+
+    }
+
+    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;
+    };
+
+    const colcheckKeys = ref(new Map());
+    const visibleFieldList = ref(new Map());
+    function columnsCheck(record: Recordable, e: any) {
+      debugger
+      colcheckKeys.value.set(record.id, e);
+      const list = record.fieldMap?.map((item) => {
+        if (e.indexOf(item.propField) > -1) {
+          return { ...item, isVisible: '1' };
+        } else {
+          return { ...item, isVisible: '0' };
+        }
+      });
+      visibleFieldList.value.set(record.id, list);
+    }
+
+    function getCheckValue(id: string) {
+      const list = visibleFieldList.value.get(id);
+      if (list && list.length > 0) {
+        const templist = list.filter((item) => item.isVisible == '1');
+
+        return templist.map((item) => {
+          return item.propField;
+        });
+      }
+      return [];
+    }
+
+    const [registerTable, { setSelectedRowKeys, setTableData, getSelectRowKeys }] = useTable({
+      title: '权限分配',
+      api: getMenuList, //加载数据
+      columns: menuColumns, //加载列
+      isTreeTable: true,
+      pagination: false,
+      striped: false,
+      showTableSetting: true,
+      bordered: true,
+      showIndexColumn: false,
+      canResize: false,
+      rowKey: (record) => record.id,
+      rowSelection: {
+        type: 'checkbox',
+        // selectedRowKeys: roleMenus.value,
+      },
+    });
+
+
+    const treeData2 = ref([]);
+    const replaceFields = { title: 'name', key: 'id' }
+    const expandedKeys = ref<string[]>([]);
+    const selectedKeys = ref<string[]>([]);
+    const checkedKeys = ref<string[]>([]);
+    let menusIds = [];
+    watch(expandedKeys, () => {
+      menusIds = [...new Set(menusIds.concat(expandedKeys.value))]
+    });
+    watch(selectedKeys, () => {
+      menusIds = [...new Set(menusIds.concat(selectedKeys.value))]
+    });
+    watch(checkedKeys, () => {
+      menusIds = [...new Set([].concat(checkedKeys.value))]
+    });
+
+    function getRoleMenusWay(id) {
+      return new Promise<void>((resolve, reject) => {
+        getRoleMenus({
+          menusId: true,
+          systemId: '1',
+          roleIds: id || 'FB264E2A-BBEN-FB9T-9CEU-FF94AF30DB87',//values.groupid,
+        }).then(r => {
+          resolve(r.map(i => i.id))
+        }).catch(e => {
+          reject(false)
+        })
+      })
+    }
+
+    onMounted(() => {
+      // getRoleMenusWay()
+      menuList().then(e => treeData2.value = e)
+    })
+
+    return {
+      replaceFields,
+      treeData2,
+      expandedKeys,
+      selectedKeys,
+      checkedKeys,
+      registerTable,
+      getCheckValue,
+      columnsCheck,
+      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;
+}
+
+.selectPower {
+  padding-left: 36px;
+}
+</style>

+ 5 - 0
src/views/systemAdmin/system/account/account.data.ts

@@ -23,6 +23,11 @@ export const columns: BasicColumn[] = [
     dataIndex: 'EMPLOYEE_ID',
     width: 200,
   },
+  {
+    title: '性别',
+    dataIndex: 'SEX',
+    width: 80,
+  },
 ];
 
 export const searchFormSchema: FormSchema[] = [

+ 227 - 213
src/views/systemAdmin/system/account/index.vue

@@ -1,43 +1,29 @@
 <template>
-  222
   <div>
     <PageWrapper dense contentFullHeight contentClass="flex">
       <OrganizationIdTree @select="handleSelect" ref="organizationIdTreeRef" />
-      <BasicTable
-        style="flex: auto"
-        :clickToRowSelect="false"
-        @register="registerTable"
-        class="w-3/4 xl:w-4/5"
-      >
+      <BasicTable style="flex: auto" :clickToRowSelect="false" @register="registerTable" class="w-3/4 xl:w-4/5">
         <template #toolbar>
           <Authority>
             <a-button type="primary" @click="handleCreate">新增账号</a-button>
           </Authority>
           <Authority value="api:yt:user:delete">
-            <Popconfirm
-              title="您确定要批量删除数据"
-              ok-text="确定"
-              cancel-text="取消"
-              @confirm="handleDeleteOrBatchDelete(null)"
-            >
+            <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消" @confirm="handleDeleteOrBatchDelete(null)">
               <a-button color="error" :disabled="hasBatchDelete"> 批量删除 </a-button>
             </Popconfirm>
           </Authority>
         </template>
         <template #status="{ record }">
-          <Tag
-            :color="
-              record.userStatusEnum === 'NORMAL'
-                ? 'green'
-                : record.userStatusEnum === 'DISABLED'
-                ? 'red'
-                : 'orange'
-            "
-          >
+          <Tag :color="record.userStatusEnum === 'NORMAL'
+            ? 'green'
+            : record.userStatusEnum === 'DISABLED'
+              ? 'red'
+              : 'orange'
+            ">
             {{
               record.userStatusEnum === 'NORMAL'
-                ? '正常'
-                : record.userStatusEnum === 'DISABLED'
+              ? '正常'
+              : record.userStatusEnum === 'DISABLED'
                 ? '已禁用'
                 : '已过期'
             }}
@@ -49,211 +35,239 @@
           </Tag>
         </template>
         <template #action="{ record }">
-          <TableAction
-            :actions="[
-              {
-                label: '进入',
-                icon: 'ant-design:login-outlined',
-                tooltip: '以客户用户身份登录',
-                onClick: handleLoginCustomAdmin.bind(null, record),
-                ifShow: !isAdmin(role),
-              },
-              {
-                label: '用户详情',
-                // auth: 'api:yt:user:get',
-                icon: 'clarity:info-standard-line',
-                tooltip: '用户详情',
-                onClick: handleView.bind(null, record),
-                ifShow: record.level != 0,
-              },
-              {
-                label: '编辑',
-                // auth: 'api:yt:user:update',
-                icon: 'clarity:note-edit-line',
-                tooltip: '编辑',
-                onClick: handleEdit.bind(null, record),
-                ifShow: record.level != 0,
+          <TableAction :actions="[
+            // {
+            //   label: '进入',
+            //   icon: 'ant-design:login-outlined',
+            //   tooltip: '以客户用户身份登录',
+            //   onClick: handleLoginCustomAdmin.bind(null, record),
+            //   ifShow: !isAdmin(role),
+            // },
+            // {
+            //   label: '用户详情',
+            //   // auth: 'api:yt:user:get',
+            //   icon: 'clarity:info-standard-line',
+            //   tooltip: '用户详情',
+            //   onClick: handleView.bind(null, record),
+            //   ifShow: record.level != 0,
+            // },
+            {
+              label: '编辑',
+              // auth: 'api:yt:user:update',
+              icon: 'clarity:note-edit-line',
+              tooltip: '编辑',
+              onClick: handleEdit.bind(null, record),
+              ifShow: record.level != 0,
+            },
+            {
+              label: '权限设置',
+              icon: 'ant-design:key-outlined',
+              onClick: power.bind(null, record),
+            },
+            {
+              label: '删除',
+              // auth: 'api:yt:user:delete',
+              icon: 'ant-design:delete-outlined',
+              color: 'error',
+              tooltip: '删除',
+              ifShow: record.level != 0,
+              popConfirm: {
+                title: '是否确认删除',
+                confirm: handleDeleteOrBatchDelete.bind(null, record),
               },
-            ]"
-            :drop-down-actions="[
-              {
-                label: '删除',
-                // auth: 'api:yt:user:delete',
-                icon: 'ant-design:delete-outlined',
-                color: 'error',
-                tooltip: '删除',
-                ifShow: record.level != 0,
-                popConfirm: {
-                  title: '是否确认删除',
-                  confirm: handleDeleteOrBatchDelete.bind(null, record),
-                },
-              },
-              {
-                label: '解锁',
-                auth: 'api:yt:user:delete',
-                icon: 'ant-design:key-outlined',
-                color: 'error',
-                tooltip: '解锁',
-                ifShow: record.level != 0,
-                popConfirm: {
-                  title: '是否确认解锁',
-                  confirm: unlock.bind(null, record),
-                },
-              },
-            ]"
-          />
+            },
+          ]" :drop-down-actions="[
+  // {
+  //   label: '删除',
+  //   // auth: 'api:yt:user:delete',
+  //   icon: 'ant-design:delete-outlined',
+  //   color: 'error',
+  //   tooltip: '删除',
+  //   ifShow: record.level != 0,
+  //   popConfirm: {
+  //     title: '是否确认删除',
+  //     confirm: handleDeleteOrBatchDelete.bind(null, record),
+  //   },
+  // },
+  // {
+  //   label: '解锁',
+  //   auth: 'api:yt:user:delete',
+  //   icon: 'ant-design:key-outlined',
+  //   color: 'error',
+  //   tooltip: '解锁',
+  //   ifShow: record.level != 0,
+  //   popConfirm: {
+  //     title: '是否确认解锁',
+  //     confirm: unlock.bind(null, record),
+  //   },
+  // },
+]" />
         </template>
       </BasicTable>
       <AccountModal @register="registerModal" @success="handleSuccess" />
     </PageWrapper>
+    <PowerDrawer  @register="registerDrawer" @success="handleSuccess"></PowerDrawer>
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, reactive, nextTick, toRaw } from 'vue';
-  import { BasicTable, useTable, TableAction } from '/@/components/Table';
-  import { deleteUser, getAccountList, alterUnlock } from '/@/api/system/system';
-  import { PageWrapper } from '/@/components/Page';
-  import { useResetOrganizationTree, OrganizationIdTree } from '/@/views/common/organizationIdTree';
-  import { Tag, Popconfirm } from 'ant-design-vue';
-  import { useModal } from '/@/components/Modal';
-  import AccountModal from './AccountModal.vue';
-  import { columns, searchFormSchema } from './account.data';
-  import { useGo } from '/@/hooks/web/usePage';
-  import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
-  import { Authority } from '/@/components/Authority';
-  import { getMyInfo, getPermCode, getUserToken } from '/@/api/sys/user';
-  import { useUserStore } from '/@/store/modules/user';
-  import { usePermissionStore } from '/@/store/modules/permission';
-  import { router } from '/@/router';
-  import { RoleEnum } from '/@/enums/roleEnum';
-  import { RouteRecordRaw } from 'vue-router';
-  import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
-  import { PageEnum } from '/@/enums/pageEnum';
-  import { getAuthCache } from '/@/utils/auth';
-  import { USER_INFO_KEY } from '/@/enums/cacheEnum';
-  import { isAdmin } from '/@/enums/roleEnum';
+import { defineComponent, reactive, nextTick, toRaw } from 'vue';
+import { BasicTable, useTable, TableAction } from '/@/components/Table';
+import { deleteUser, getAccountList, alterUnlock } from '/@/api/system/system';
+import { PageWrapper } from '/@/components/Page';
+import { useResetOrganizationTree, OrganizationIdTree } from '/@/views/common/organizationIdTree';
+import { Tag, Popconfirm } from 'ant-design-vue';
+import { useModal } from '/@/components/Modal';
+import AccountModal from './AccountModal.vue';
+import { columns, searchFormSchema } from './account.data';
+import { useGo } from '/@/hooks/web/usePage';
+import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
+import { Authority } from '/@/components/Authority';
+import { getMyInfo, getPermCode, getUserToken } from '/@/api/sys/user';
+import { useUserStore } from '/@/store/modules/user';
+import { usePermissionStore } from '/@/store/modules/permission';
+import { router } from '/@/router';
+import { RoleEnum } from '/@/enums/roleEnum';
+import { RouteRecordRaw } from 'vue-router';
+import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
+import { PageEnum } from '/@/enums/pageEnum';
+import { getAuthCache } from '/@/utils/auth';
+import { USER_INFO_KEY } from '/@/enums/cacheEnum';
+import { isAdmin } from '/@/enums/roleEnum';
+import { useDrawer } from '/@/components/Drawer';
+import PowerDrawer from './PowerDrawer.vue';
 
-  export default defineComponent({
-    name: 'AccountManagement',
-    components: {
-      BasicTable,
-      PageWrapper,
-      OrganizationIdTree,
-      AccountModal,
-      TableAction,
-      Tag,
-      Authority,
-      Popconfirm,
-    },
-    setup() {
-      const userInfo: any = getAuthCache(USER_INFO_KEY);
-      const role: string = userInfo?.roles[0];
 
-      const go = useGo();
-      const [registerModal, { openModal }] = useModal();
-      let searchInfo = reactive<Recordable>({});
-      const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo);
-      const [registerTable, { reload, setProps }] = useTable({
-        title: '账号列表',
-        api: getAccountList,
-        rowKey: 'id',
-        columns,
-        searchInfo,
-        formConfig: {
-          labelWidth: 120,
-          schemas: searchFormSchema,
-          // autoSubmitOnEnter: true,
-          resetFunc: resetFn,
-        },
-        useSearchForm: true,
-        showTableSetting: true,
-        bordered: true,
-        actionColumn: {
-          width: 240,
-          title: '操作',
-          dataIndex: 'action',
-          slots: { customRender: 'action' },
-          fixed: 'right',
-        },
-      });
-      const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(
-        deleteUser,
-        handleSuccess,
-        setProps
-      );
-      nextTick(() => {
-        setProps(selectionOptions);
-      });
+export default defineComponent({
+  name: 'AccountManagement',
+  components: {
+    BasicTable,
+    PageWrapper,
+    OrganizationIdTree,
+    AccountModal,
+    TableAction,
+    Tag,
+    Authority,
+    Popconfirm,
+    PowerDrawer,
+  },
+  setup() {
+    const userInfo: any = getAuthCache(USER_INFO_KEY);
+    const role: string = userInfo?.roles[0];
+    const [registerDrawer, { openDrawer }] = useDrawer();
+    const go = useGo();
+    const [registerModal, { openModal }] = useModal();
+    let searchInfo = reactive<Recordable>({});
+    const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo);
+    const [registerTable, { reload, setProps }] = useTable({
+      title: '账号列表',
+      api: getAccountList,
+      rowKey: 'id',
+      columns,
+      searchInfo,
+      formConfig: {
+        labelWidth: 120,
+        schemas: searchFormSchema,
+        // autoSubmitOnEnter: true,
+        resetFunc: resetFn,
+      },
+      useSearchForm: true,
+      showTableSetting: true,
+      bordered: true,
+      actionColumn: {
+        width: 240,
+        title: '操作',
+        dataIndex: 'action',
+        slots: { customRender: 'action' },
+        fixed: 'right',
+      },
+    });
+    const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(
+      deleteUser,
+      handleSuccess,
+      setProps
+    );
+    nextTick(() => {
+      setProps(selectionOptions);
+    });
 
-      function handleCreate() {
-        openModal(true, {
-          isUpdate: false,
-        });
-      }
+    function handleCreate() {
+      openModal(true, {
+        isUpdate: false,
+      });
+    }
 
-      function unlock(data) {
-        alterUnlock(data.tbUser).then(() => {
-          reload();
-        });
-      }
-      function handleEdit(record: Recordable) {
-        openModal(true, {
-          record,
-          isUpdate: true,
-        });
-      }
-      function handleSuccess() {
+    function unlock(data) {
+      alterUnlock(data.tbUser).then(() => {
         reload();
-      }
+      });
+    }
+    function handleEdit(record: Recordable) {
+      openModal(true, {
+        record,
+        isUpdate: true,
+      });
+    }
+    function handleSuccess() {
+      reload();
+    }
 
-      function handleSelect(organization) {
-        searchInfo.organizationId = organization;
-        reload();
-      }
+    function handleSelect(organization) {
+      searchInfo.organizationId = organization;
+      reload();
+    }
 
-      function handleView(record: Recordable) {
-        go('/system/account_detail/' + record.id);
-      }
-      const userStore = useUserStore();
+    function handleView(record: Recordable) {
+      go('/system/account_detail/' + record.id);
+    }
+    const userStore = useUserStore();
 
-      const permissionStore = usePermissionStore();
-      async function handleLoginCustomAdmin(record: { tbUser: string; id: string }) {
-        try {
-          const { token, refreshToken } = await getUserToken(record.id);
-          userStore.storeToken(token, refreshToken);
-          const userInfo = await getMyInfo();
-          const permissionList = await getPermCode();
-          permissionStore.setPermCodeList(permissionList);
-          userStore.setUserInfo(userInfo);
-          userStore.setRoleList(userInfo.roles as RoleEnum[]);
-          const routes = await permissionStore.buildRoutesAction();
-          routes.forEach((route) => {
-            router.addRoute(route as unknown as RouteRecordRaw);
-          });
-          router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
-          permissionStore.setDynamicAddedRoute(true);
-          go(PageEnum.BASE_HOME);
-        } catch (error) {
-        } finally {
-        }
+    const permissionStore = usePermissionStore();
+    async function handleLoginCustomAdmin(record: { tbUser: string; id: string }) {
+      try {
+        const { token, refreshToken } = await getUserToken(record.id);
+        userStore.storeToken(token, refreshToken);
+        const userInfo = await getMyInfo();
+        const permissionList = await getPermCode();
+        permissionStore.setPermCodeList(permissionList);
+        userStore.setUserInfo(userInfo);
+        userStore.setRoleList(userInfo.roles as RoleEnum[]);
+        const routes = await permissionStore.buildRoutesAction();
+        routes.forEach((route) => {
+          router.addRoute(route as unknown as RouteRecordRaw);
+        });
+        router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
+        permissionStore.setDynamicAddedRoute(true);
+        go(PageEnum.BASE_HOME);
+      } catch (error) {
+      } finally {
       }
+    }
+
+    function power(record: Recordable) {
+      openDrawer(true, {
+        record,
+        isUpdate: true,
+      });
+    }
 
-      return {
-        handleLoginCustomAdmin,
-        registerTable,
-        registerModal,
-        handleCreate,
-        handleEdit,
-        handleSuccess,
-        handleSelect,
-        handleView,
-        unlock,
-        organizationIdTreeRef,
-        hasBatchDelete,
-        handleDeleteOrBatchDelete,
-        isAdmin,
-        role,
-      };
-    },
-  });
+    return {
+      registerDrawer,
+      power,
+      handleLoginCustomAdmin,
+      registerTable,
+      registerModal,
+      handleCreate,
+      handleEdit,
+      handleSuccess,
+      handleSelect,
+      handleView,
+      unlock,
+      organizationIdTreeRef,
+      hasBatchDelete,
+      handleDeleteOrBatchDelete,
+      isAdmin,
+      role,
+    };
+  },
+});
 </script>

+ 126 - 0
src/views/systemAdmin/system/account/role.data.ts

@@ -0,0 +1,126 @@
+import { BasicColumn } from '/@/components/Table';
+import { FormSchema } from '/@/components/Table';
+import { RoleEnum } from '/@/enums/roleEnum';
+
+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 columns: BasicColumn[] = [
+  {
+    title: '角色名称',
+    dataIndex: 'groupName',
+    width: 200,
+  },
+  {
+    title: '角色Code',
+    dataIndex: 'groupid',
+    width: 200,
+  },
+  {
+    title: '类型',
+    dataIndex: 'groupType',
+    width: 120,
+  },
+
+  {
+    title: '备注',
+    dataIndex: 'memo',
+    width: 240,
+  },
+  {
+    title: '排序',
+    dataIndex: 'sort',
+    width: 180,
+  },
+];
+
+export const searchFormSchema: FormSchema[] = [
+  {
+    field: 'roleName',
+    label: '角色名称',
+    component: 'Input',
+    colProps: { span: 6 },
+    componentProps: {
+      maxLength: 255,
+    },
+  },
+  {
+    field: 'status',
+    label: '状态',
+    component: 'Select',
+    componentProps: {
+      options: [
+        { label: '启用', value: 1 },
+        { label: '停用', value: 0 },
+      ],
+    },
+    colProps: { span: 6 },
+  },
+];
+
+export const formSchema: FormSchema[] = [
+  {
+    field: 'groupName',
+    label: '角色名称',
+    required: true,
+    component: 'Input',
+    componentProps: {
+      maxLength: 255,
+      placeholder: '请输入角色名称',
+    },
+  },
+  {
+    label: '排序',
+    field: 'sort',
+    component: 'Input',
+    componentProps: {
+      maxLength: 255,
+      placeholder: '请输入排序',
+    },
+  }
+];
+
+
+export const powerSchema: FormSchema[] = [
+  {
+    field: 'NAME',
+    label: '用户名称',
+    required: true,
+    component: 'Input',
+    componentProps: {
+      maxLength: 255,
+      disabled: true,
+      placeholder: '请输入角色名称',
+    },
+  },
+  {
+    field: 'LOGIN_NAME',
+    label: '登录名称',
+    required: true,
+    component: 'Input',
+    componentProps: {
+      maxLength: 255,
+      disabled: true,
+      placeholder: '请输入角色名称',
+    },
+  }
+];
+
+
+export const menuColumns: BasicColumn[] = [
+  {
+    title: '菜单名称',
+    dataIndex: 'meta.title',
+    width: 180,
+    align: 'left',
+  },
+];

+ 1 - 1
src/views/systemAdmin/system/menu/menu.data.ts

@@ -65,7 +65,7 @@ export const columns: BasicColumn[] = [
   {
     title: t('routes.common.system.tableTitleSystemCreateTime'), //'创建时间'
     // title:'创建时间',
-    dataIndex: 'createTime',
+    dataIndex: 'createtime',
     width: 180,
   },
 ];

+ 6 - 7
src/views/systemAdmin/system/role/role.data.ts

@@ -23,19 +23,18 @@ export const columns: BasicColumn[] = [
   {
     title: '角色Code',
     dataIndex: 'groupid',
-    width: 200,
+    width: 300,
   },
   {
     title: '类型',
     dataIndex: 'groupType',
     width: 120,
   },
-
-  {
-    title: '备注',
-    dataIndex: 'memo',
-    width: 240,
-  },
+  // {
+  //   title: '备注',
+  //   dataIndex: 'memo',
+  //   width: 240,
+  // },
   {
     title: '排序',
     dataIndex: 'sort',