Переглянути джерело

feat: 用户管理下的所有都增加权限控制

louhangfei 11 місяців тому
батько
коміт
8e56beb010

+ 14 - 13
src/api/auth/dept.ts

@@ -1,5 +1,5 @@
 import { http } from '@/utils/http/axios';
-import { DeptTree , addDeptProps, editDeptProps} from '@/types/dept/type';
+import { DeptTree, addDeptProps, editDeptProps } from '@/types/dept/type';
 
 /**
  * @description: 部门列表
@@ -67,11 +67,10 @@ export function deleteDept(params) {
   });
 }
 
-
 /**
  * @description: V4: 添加组织
  */
-export function saveDept(params:addDeptProps) {
+export function saveDept(params: addDeptProps) {
   return http.request({
     url: '/admin/dept/saveDept',
     method: 'post',
@@ -82,7 +81,7 @@ export function saveDept(params:addDeptProps) {
 /**
  * @description: V4:编辑组织
  */
-export function updateDepartments(params:editDeptProps) {
+export function updateDepartments(params: editDeptProps) {
   return http.request({
     url: '/admin/dept/updateDept',
     method: 'post',
@@ -98,15 +97,17 @@ export function getAllDepartments(): Promise<DeptTree> {
   });
 }
 
-
 /**
  * @description:V4: 删除部门
  */
-export function deleteDepartments(deptId:number) {
-  return http.request({
-    url: `/admin/dept/deleteDept?deptId=${deptId}`,
-    method: 'DELETE',
-  }, {
-    isTransformResponse: false,
-  });
-}
+export function deleteDepartments(deptId: number) {
+  return http.request(
+    {
+      url: `/admin/dept/deleteDept?deptId=${deptId}`,
+      method: 'DELETE',
+    },
+    {
+      isTransformResponse: false,
+    },
+  );
+}

+ 47 - 0
src/api/system/user-query.ts

@@ -0,0 +1,47 @@
+import { http } from '@/utils/http/axios';
+
+export interface Role {
+  roleId: number;
+  roleName: string;
+}
+
+export interface RoleList {
+  map(arg0: (item: any) => { value: any; label: any }): never[];
+  list?: Role[];
+}
+
+export interface Department {
+  deptId: number;
+  createDate: string;
+  modifyDate: string;
+  deptName: string;
+  treePath: string;
+  grade: number;
+  parent: number;
+  orderNum: number | null;
+  isEnable: boolean;
+}
+
+/* V4: 部门树结构 */
+export interface DeptTreeItem {
+  id: number;
+  deptName: string; // 部门名称
+  parentId: number; // 上级部门 id
+  orderNum: number; // 排序
+  isDisabled: number; // 状态: 0-启用, 1-禁用
+  createdBy: number; // 创建人
+  updatedBy: number; // 更新人
+  createdAt: string; // 创建时间
+  updatedAt: string; // 更新时间
+  isDeleted: number; // 0-未删除。 大于 0-已删除
+  tenantId: number; // 租户 ID
+}
+type DeptTree = DeptTreeItem & { children: DeptTreeItem[] };
+
+// v4: 获取所有组织
+export function getAllDepartments(): Promise<DeptTree[]> {
+  return http.request({
+    url: '/admin/dept/queryAllDeptTree',
+    method: 'post',
+  });
+}

+ 1 - 1
src/layout/components/SwitchTenant.vue

@@ -94,7 +94,7 @@
     display: flex;
     align-items: center;
     justify-content: center;
-    width: 110px;
+    width: 80px;
     margin-left: 10px;
   }
 </style>

+ 4 - 15
src/types/permission/constants.ts

@@ -85,9 +85,7 @@ export enum PERM_NOTICE {
   /**
    * 人员分组
    */
-  PERSONNEL_ADD = 'notice_admin_module:personnel_add',
-  PERSONNEL_EDIT = 'notice_admin_module:personnel_edit',
-  PERSONNEL_DELETE = 'notice_admin_module:personnel_delete',
+  PERSONNEL_GROUP = 'user_admin_module:user_group',
 }
 
 /**
@@ -97,25 +95,16 @@ export enum PERM_USER {
   /**
    * 组织管理
    */
-  DEPT_VIEW = 'user_admin_module:dept_view',
-  DEPT_ADD = 'user_admin_module:dept_add',
-  DEPT_EDIT = 'user_admin_module:dept_edit',
-  DEPT_DELETE = 'user_admin_module:dept_delete',
+  DEPT = 'user_admin_module:dept',
 
   /**
    * 角色管理
    */
-  ROLE_VIEW = 'user_admin_module:role_view',
-  ROLE_ADD = 'user_admin_module:role_add',
-  ROLE_EDIT = 'user_admin_module:role_edit',
-  ROLE_DELETE = 'user_admin_module:role_delete',
+  ROLE = 'user_admin_module:role',
 
   /**
    * 账号管理
    */
-  ACCOUNT_VIEW = 'user_admin_module:account_view',
-  ACCOUNT_ADD = 'user_admin_module:account_add',
-  ACCOUNT_EDIT = 'user_admin_module:account_edit',
-  ACCOUNT_DELETE = 'user_admin_module:account_delete',
+  ACCOUNT_MANAGE = 'user_admin_module:account',
   ACCOUNT_RESET_PASSWORD = 'user_admin_module:account_password',
 }

+ 4 - 2
src/utils/useTargetTenantIdSetting.ts

@@ -1,6 +1,7 @@
 import { useUserStore } from '@/store/modules/user';
 import { watch } from 'vue';
 
+/** 系统租户的id为0 */
 export const SYS_TENANT_ID = 0;
 
 /** 设置targetTenantId */
@@ -32,7 +33,8 @@ export function useTargetTenantIdSetting() {
 
   // 系统租户
   const sysTenantId = getValue() || userStore.info.tenantId?.toString();
-  const isSysTenant = sysTenantId === SYS_TENANT_ID.toString();
+  /** 当前选择的租户是否是系统租户 */
+  const isTargetTenantSys = sysTenantId === SYS_TENANT_ID.toString();
 
-  return { setValue, getValue, isSysTenant };
+  return { setValue, getValue, isTargetTenantSys };
 }

+ 2 - 2
src/views/auth/dept/dept.vue

@@ -2,7 +2,7 @@
   <PageWrapper>
     <el-card :bordered="false" class="proCard">
       <template #header>
-        <el-space align="center">
+        <el-space align="center" v-permission="PERM_USER.DEPT">
           <el-button type="primary" @click="openCreateDrawer">
             <template #icon>
               <el-icon>
@@ -21,7 +21,7 @@
         </el-table-column>
         <el-table-column label="操作" width="200">
           <template #default="scope">
-            <el-space>
+            <el-space v-permission="PERM_USER.DEPT">
               <div class="el-space el-space--horizontal">
                 <div class="el-space__item" @click="handleEdit(scope.row)">
                   <div><img :src="editIcon" class="el-tooltip__trigger" /></div>

+ 8 - 3
src/views/system/person-group/PersonGroup.vue

@@ -2,7 +2,7 @@
   <div>
     <el-card>
       <template #header>
-        <el-button type="primary" @click="openEditDrawer()">
+        <el-button type="primary" @click="openEditDrawer()" v-permission="PERM_NOTICE.PERSONNEL_GROUP">
           <template #icon>
             <el-icon>
               <PlusOutlined />
@@ -22,8 +22,12 @@
           <template #default="{ row }">
             <section class="actions">
               <el-button type="primary" link @click="openCheckDrawer(row)">查看</el-button>
-              <el-button type="primary" link @click="openEditDrawer(row)">编辑</el-button>
-              <el-button type="primary" link @click="deleteGroup(row)">删除</el-button>
+              <el-button type="primary" link @click="openEditDrawer(row)" v-permission="PERM_NOTICE.PERSONNEL_GROUP">
+                编辑
+              </el-button>
+              <el-button type="primary" link @click="deleteGroup(row)" v-permission="PERM_NOTICE.PERSONNEL_GROUP">
+                删除
+              </el-button>
             </section>
           </template>
         </el-table-column>
@@ -55,6 +59,7 @@
   import { onMounted, ref } from 'vue';
   import PersonGroupExhibitionDrawer from './components/PersonGroupExhibitionDrawer.vue';
   import { ElMessage, ElMessageBox } from 'element-plus';
+  import { PERM_NOTICE } from '@/types/permission/constants';
 
   const { personGroupListRequestParams, personGroupList, total, setRequestParams, queryPersonGroupList } =
     usePersonGroupListQuery();

+ 7 - 3
src/views/system/role/role.vue

@@ -15,7 +15,7 @@
 
     <el-card>
       <template #header>
-        <el-button type="primary" @click="openDrawer()"> 添加角色 </el-button>
+        <el-button type="primary" @click="openDrawer()" v-permission="PERM_USER.ROLE"> 添加角色 </el-button>
       </template>
 
       <el-table height="calc(100vh - 340px)" :data="roleList">
@@ -26,8 +26,12 @@
         <el-table-column label="操作" width="160">
           <template #default="{ row }">
             <section class="actions">
-              <img src="@/assets/icons/edit.png" @click="openDrawer(row)" />
-              <img src="@/assets/icons/delete.png" @click="deleteRole(row.id)" />
+              <img src="@/assets/icons/edit.png" @click="openDrawer(row)" v-permission="PERM_USER.ROLE" />
+              <img
+                src="@/assets/icons/delete.png"
+                @click="deleteRole(row.id)"
+                v-permission="{ action: [PERM_USER.ROLE] }"
+              />
             </section>
           </template>
         </el-table-column>

+ 6 - 6
src/views/system/user/CreateAdminDrawer.vue

@@ -8,12 +8,12 @@
         <el-input placeholder="请输入姓名" v-model="formParams.realname" />
       </el-form-item>
       <el-form-item label="角色" prop="roleIdList">
-        <el-select clearable v-model="formParams.roleIdList" multiple v-if="isCanAddTenant && isSysTenant">
+        <el-select clearable v-model="formParams.roleIdList" multiple v-if="isCanAddTenant && isTargetTenantSys">
           <el-option v-for="item in roleData" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
         <el-input v-else placeholder="租户管理员默认拥有全部角色权限" disabled />
       </el-form-item>
-    
+
       <el-form-item v-if="isAddUser" label="密码" prop="password">
         <el-input type="password" show-password-on="mousedown" placeholder="请输入密码" v-model="formParams.password" />
       </el-form-item>
@@ -48,7 +48,7 @@
   import { useTargetTenantIdSetting } from '@/utils/useTargetTenantIdSetting';
   import { ResultEnum } from '@/enums/httpEnum';
 
-  const { isSysTenant } = useTargetTenantIdSetting();
+  const { isTargetTenantSys } = useTargetTenantIdSetting();
   let rules: FormRules = {
     username: {
       required: true,
@@ -85,7 +85,7 @@
       editType: EditType;
       roleData: OptionsProps[];
       isCanAddTenant: boolean;
-      isSysTenant: boolean;
+      isTargetTenantSys: boolean;
       departmentList: OptionsProps[];
     }>(),
     {
@@ -139,7 +139,7 @@
       }
       if (isAddUser.value) {
         formParams.value.isDisabled ? (params.isDisabled = DisabledEnum.NO) : (params.isDisabled = DisabledEnum.YES);
-        if (!isSysTenant) {
+        if (!isTargetTenantSys) {
           addTenantAdmin(params).then((res) => {
             message.success('添加管理员账户成功');
             emit('change');
@@ -201,7 +201,7 @@
   watch(
     () => props,
     () => {
-      if (props.isCanAddTenant && !props.isSysTenant) {
+      if (props.isCanAddTenant && !props.isTargetTenantSys) {
         rules!.roleIdList!.required = false;
       }
     },

+ 14 - 11
src/views/system/user/user.vue

@@ -10,7 +10,7 @@
     <el-card>
       <template #header>
         <el-space align="center">
-          <el-button @click="openAddAdminDrawer" v-if="true || (!isSysTenant && isCanAddTenant && hasAddPermission())">
+          <el-button @click="openAddAdminDrawer" v-if="!isTargetTenantSys && isCanAddTenant && hasUserPermission()">
             <template #icon>
               <el-icon>
                 <Plus />
@@ -18,8 +18,7 @@
             </template>
             添加租户管理员
           </el-button>
-          <!-- <el-button type="primary" @click="openAddSingleDrawer" v-permission="{ action: [PERM_USER.ACCOUNT_ADD] }"> -->
-          <el-button type="primary" @click="openAddSingleDrawer">
+          <el-button type="primary" @click="openAddSingleDrawer" v-permission="{ action: [PERM_USER.ACCOUNT_MANAGE] }">
             <template #icon>
               <el-icon>
                 <Plus />
@@ -160,7 +159,7 @@
       :roleData="roleData"
       :width="450"
       :isCanAddTenant="isCanAddTenant"
-      :isSysTenant="isSysTenant"
+      :isTargetTenantSys="isTargetTenantSys"
       :departmentList="departmentList"
     />
     <AddUser
@@ -177,7 +176,7 @@
   import { reactive, ref, onMounted } from 'vue';
   import { storeToRefs } from 'pinia';
   import { ElMessage, ElMessageBox } from 'element-plus';
-  import { Plus, DocumentAdd, Edit, Delete, Stamp } from '@element-plus/icons-vue';
+  import { Plus, DocumentAdd, Stamp } from '@element-plus/icons-vue';
   import { EditType, OptionsProps, SearchParamsProps } from './types';
   import { RoleTypeEnum } from '@/types/role/constants';
   import { getAllDepartments } from '@/api/auth/dept';
@@ -187,7 +186,6 @@
   import { useTargetTenantIdSetting } from '@/utils/useTargetTenantIdSetting';
   import { useUserStore } from '@/store/modules/user';
   import type { RoleListItem } from '@/api/system/user-operate';
-  import type { DeptTreeItem } from '@/api/system/user-query';
   import SearchForm from './component/SearchForm.vue';
   import AddUser from './component/AddUser.vue';
   import CreateDrawer from './CreateDrawer.vue';
@@ -198,6 +196,7 @@
   import { SYS_TENANT_ID } from '@/utils/useTargetTenantIdSetting';
   import { PERM_USER } from '@/types/permission/constants';
   import { calculateTreeData } from '@/utils';
+  import { DeptTreeItem } from '@/types/dept/type';
 
   const userStore = useUserStore();
   const { getUserInfo } = storeToRefs(userStore);
@@ -211,14 +210,14 @@
   const roleData = ref<OptionsProps[]>([]);
   const departmentList = ref<OptionsProps[]>([]);
   const createAdminType = ref(EditType.create);
-  const { isSysTenant } = useTargetTenantIdSetting();
+  const { isTargetTenantSys } = useTargetTenantIdSetting();
 
   function reloadTable() {
     loadPageData();
   }
 
   const hasResetPasswordPermission = () => userStore.checkPermission(PERM_USER.ACCOUNT_RESET_PASSWORD);
-  const hasAddPermission = () => userStore.checkPermission(PERM_USER.ACCOUNT_ADD);
+  const hasUserPermission = () => userStore.checkPermission(PERM_USER.ACCOUNT_MANAGE);
   // 当前用户类型
   const currrentRoleType = getUserInfo.value.roleType;
   const currrentTenantId = getUserInfo.value.tenantId;
@@ -226,7 +225,7 @@
   const isCanAddTenant = Number(currrentRoleType) !== RoleTypeEnum.TENANT_ADMIN && currrentTenantId === SYS_TENANT_ID;
   const openAddSingleDrawer = () => {
     drawerTitle.value = '添加用户';
-    if (isSysTenant) {
+    if (isTargetTenantSys) {
       createAdminTitle.value = '添加用户';
       createAdminType.value = EditType.create;
       createAdminDrawerRef.value?.openDrawer();
@@ -252,7 +251,7 @@
 
   function handleEdit(record: Recordable) {
     drawerTitle.value = '编辑用户';
-    if (record.roleType === RoleTypeEnum.TENANT_ADMIN || isSysTenant) {
+    if (record.roleType === RoleTypeEnum.TENANT_ADMIN || isTargetTenantSys) {
       createAdminDrawerRef.value?.openDrawer(record.id);
       createAdminType.value = EditType.edit;
     } else {
@@ -292,7 +291,11 @@
 
   /* 是否能重置密码 */
   const visibleRestPassBtn = (type: RoleTypeEnum): boolean => {
-    if (isSysTenant || (!isSysTenant && type !== RoleTypeEnum.TENANT_ADMIN) || currrentTenantId === SYS_TENANT_ID) {
+    if (
+      isTargetTenantSys ||
+      (!isTargetTenantSys && type !== RoleTypeEnum.TENANT_ADMIN) ||
+      currrentTenantId === SYS_TENANT_ID
+    ) {
       return true;
     }
     return false;

+ 3 - 1
tsconfig.json

@@ -37,7 +37,9 @@
     "src/**/*.tsx",
     "src/**/*.vue",
     "auto-imports.d.ts",
-    "components.d.ts"
+    "components.d.ts",
+    "types/**/*.d.ts",
+    "types/**/*.ts",
   ],
   "references": [
     {

+ 2 - 4
types/global.d.ts

@@ -26,7 +26,7 @@ declare global {
   // 目前框架只用到 env 和 glob
   interface ImportMeta {
     env: Record<string, string>;
-    glob: Record<function>;
+    glob: Record<string, Function>;
   }
 
   // vue
@@ -108,7 +108,5 @@ declare global {
 }
 
 declare module 'vue' {
-  export type JSXComponent<Props = any> =
-    | { new (): ComponentPublicInstance<Props> }
-    | FunctionalComponent<Props>;
+  export type JSXComponent<Props = any> = { new (): ComponentPublicInstance<Props> } | FunctionalComponent<Props>;
 }