Просмотр исходного кода

Merge branch 'dev-lhf' into 'dev'

Dev lhf

See merge request product-group-fe/sfy-safety-group/sfy-safety!27
楼航飞 11 месяцев назад
Родитель
Сommit
6581a7c34c

+ 1 - 4
src/types/role/type.ts

@@ -12,7 +12,7 @@ export interface Role {
   // 备注
   remark: string;
   // 租户ID
-  tenantId?: number; 
+  tenantId?: number;
   isDeleted?: number;
   createdAt?: string;
   createdBy?: string;
@@ -35,7 +35,6 @@ export interface RolePageRequest extends PaginationRequest {
  */
 export type RolePageResponse = PaginationResponse<Role>;
 
-
 /**
  * 角色表单
  */
@@ -43,11 +42,9 @@ export interface RoleForm {
   id: number | null;
   roleName: string;
   remark: string;
-  cameraIds: PermissionTreeKey[];
   menuIds: PermissionTreeKey[];
   permIds: PermissionTreeKey[];
   tenantId?: number;
 }
 
 export type AssignedPermissions = Pick<RoleForm, 'cameraIds' | 'menuIds' | 'permIds'>;
-

+ 14 - 16
src/views/system/role/components/PermissionTreeCard.vue

@@ -3,15 +3,15 @@
     <template #header>
       <section class="title">{{ title }}</section>
       <section>
-        <el-checkbox label="全部展开 / 全部收起" @change="expandAll"  />
+        <el-checkbox label="全部展开 / 全部收起" @change="expandAll" />
         <el-checkbox label="全选 / 全不选" @change="checkAll" />
       </section>
     </template>
 
     <el-tree
       ref="treeInstance"
-      :data="treeData" 
-      node-key="value" 
+      :data="treeData"
+      node-key="value"
       show-checkbox
       :expand-on-click-node="false"
       @check="onNodeCheck"
@@ -28,7 +28,7 @@
     title: string;
     treeData: PermissionViewTree;
   }>();
-  
+
   const treeInstance = ref<InstanceType<typeof ElTree>>();
   const leafCheckedKeys = shallowRef<PermissionTreeKey[]>([]);
 
@@ -41,16 +41,15 @@
 
   /**
    * 全部展开 / 全部收起
-   * @param expanded 
+   * @param expanded
    */
   const expandAll = (expanded: boolean) => {
-    treeInstance.value?.store._getAllNodes().forEach(node => node.expanded = expanded);
+    treeInstance.value?.store._getAllNodes().forEach((node) => (node.expanded = expanded));
   };
 
-  
   /**
    * 全选 / 全不选
-   * @param checked 
+   * @param checked
    */
   const checkAll = (checked: boolean) => {
     leafCheckedKeys.value = checked ? getAllLeafKeys() : [];
@@ -61,9 +60,10 @@
    * 获取所有叶子节点的 node-key
    */
   const getAllLeafKeys = () => {
-    return treeInstance.value?.store._getAllNodes()
-      .filter(node => node.isLeaf)
-      .map(node => node.data.value) as PermissionTreeKey[];
+    return treeInstance.value?.store
+      ._getAllNodes()
+      .filter((node) => node.isLeaf)
+      .map((node) => node.data.value) as PermissionTreeKey[];
   };
 
   /**
@@ -74,22 +74,20 @@
     leafCheckedKeys.value = keys;
   };
 
-  
   /**
    * 返回选择的权限值.
    * 权限值可能是 相机ID、菜单ID、或 权限ID
    */
   const getSelectedPermissions = (): PermissionTreeKey[] => {
-    return [ ...leafCheckedKeys.value ];
+    return [...leafCheckedKeys.value];
   };
 
-
   /**
    * 重置
    */
   const reset = () => {
     checkAll(false);
-  }
+  };
 
   defineExpose({ getSelectedPermissions, reset, setAssignedPermissions });
 </script>
@@ -108,4 +106,4 @@
     margin-right: 10px;
     border-left: 3px solid #1890ff;
   }
-</style>
+</style>

+ 39 - 36
src/views/system/role/components/RoleDrawer.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-drawer :title="title" v-model="drawerOpened" @close="reset">
+  <el-drawer :title="title" v-model="drawerOpened" @close="clear">
     <el-form label-position="left" label-width="80px" :model="formData" :rules="formRules" ref="formInstance">
       <el-form-item label="角色名称" prop="roleName">
         <el-input placeholder="角色名称" v-model="formData.roleName" />
@@ -31,7 +31,6 @@
   import useMenuPermTree from '../hooks/useMenuPermissionTree';
   import useFuncPermTree from '../hooks/useFunctionPermissionTree';
   import { createRole, editRole, getAssignedPerms } from '@/api/system/role';
-  import { PermissionTreeKey } from '@/types/permission/type';
 
   defineProps<{
     title: string;
@@ -48,16 +47,17 @@
   const menuCardInstance = ref<InstanceType<typeof PermissioTreeCard>>();
   const funcCardInstance = ref<InstanceType<typeof PermissioTreeCard>>();
 
-  // 表单相关
-  const defaultFormData = (): RoleForm => ({
+  let initialPermissions: AssignedPermissions | null = null;
+  const emptyValue = {
     id: null,
     roleName: '',
     remark: '',
-    cameraIds: [],
     menuIds: [],
     permIds: [],
-  });
-  const formData = reactive<RoleForm>(defaultFormData());
+  };
+  // 表单相关
+  let defaultFormData: RoleForm = { ...emptyValue };
+  let formData = reactive<RoleForm>(defaultFormData);
   const formRules: FormRules = {
     roleName: { required: true, trigger: 'blur', message: '请填写角色名称' },
     remark: {},
@@ -72,14 +72,23 @@
    */
   const open = (role?: Role) => {
     if (role) {
+      defaultFormData.id = role.id;
+      defaultFormData.roleName = role.roleName;
+      defaultFormData.remark = role.remark;
       formData.id = role.id;
       formData.roleName = role.roleName;
       formData.remark = role.remark;
       getAssignedPermissions(role.id);
 
       // TODO: 获取已拥有的权限
+    } else {
+      formData.id = null;
+      formData.roleName = '';
+      formData.remark = '';
+      defaultFormData = { ...emptyValue };
+      menuCardInstance.value?.setAssignedPermissions([]);
+      funcCardInstance.value?.setAssignedPermissions([]);
     }
-
     drawerOpened.value = true;
   };
 
@@ -88,36 +97,45 @@
    */
   const getAssignedPermissions = async (roleId: number) => {
     try {
-      const result = await getAssignedPerms(roleId);
-      displayAssignedPermissions(result);
+      initialPermissions = await getAssignedPerms(roleId);
+      displayAssignedPermissions(initialPermissions);
     } catch (e) {
       console.error(e);
     }
   };
 
-  const displayAssignedPermissions = (result: AssignedPermissions) => {
-    if (result.cameraIds?.length) {
-      // 相机树很有可能会有 id 重复的情况,比如说 一个camera id 和 一个 workspace id 相同,这样会导致 tree 节点 value 不唯一,因此需要给个前缀
-      const cameraIds = result.cameraIds.map((id) => `camera-${id}`);
+  const displayAssignedPermissions = (result: AssignedPermissions | null) => {
+    if (!result) {
+      menuCardInstance.value?.setAssignedPermissions([]);
+      funcCardInstance.value?.setAssignedPermissions([]);
+      return;
     }
-
-    if (result.menuIds?.length) {
+    if (result?.menuIds?.length) {
       menuCardInstance.value?.setAssignedPermissions(result.menuIds);
+    } else {
+      menuCardInstance.value?.setAssignedPermissions([]);
     }
 
-    if (result.permIds?.length) {
+    if (result?.permIds?.length) {
       funcCardInstance.value?.setAssignedPermissions(result.permIds);
+    } else {
+      funcCardInstance.value?.setAssignedPermissions([]);
     }
   };
 
   /**
-   * 重置表单
+   * 重置表单,恢复为修改之前的默认值
    */
   const reset = () => {
     formInstance.value?.resetFields();
-    Object.assign(formData, defaultFormData());
-    menuCardInstance.value?.reset();
-    funcCardInstance.value?.reset();
+    Object.assign(formData, defaultFormData);
+    displayAssignedPermissions(initialPermissions!);
+  };
+
+  const clear = () => {
+    formInstance.value?.resetFields();
+    formData = Object.assign(formData, emptyValue);
+    displayAssignedPermissions(null);
   };
 
   /**
@@ -140,20 +158,5 @@
     }
   };
 
-  /**
-   * 获取到的相机的权限码是 camera-xxx, 例如 camera-11, 提交后端转换成数字 11
-   */
-  const cleanCameraPermissions = (perms: PermissionTreeKey[]) => {
-    return perms.map((perm) => {
-      if (typeof perm === 'string' && perm.includes('-')) {
-        const splits = perm.split('-');
-        return +splits[1];
-      }
-
-      // 否则正常返回
-      return perm;
-    });
-  };
-
   defineExpose({ open });
 </script>

+ 21 - 9
src/views/system/user/CreateDrawer.vue

@@ -1,5 +1,5 @@
 <template>
-  <el-drawer v-model="isDrawer" :size="width" :title="props.title" @close="handleReset">
+  <el-drawer v-model="isDrawer" :size="width" :title="props.title" @close="clear">
     <el-form :model="formParams" :rules="rules" ref="formRef" label-placement="left" :label-width="80">
       <el-form-item label="工号" prop="staffNo">
         <el-input placeholder="请输入工号" v-model="formParams.staffNo" v-if="staffNoHtmlType === 'INPUT'" />
@@ -20,7 +20,11 @@
           @change="handleChange"
           v-else
         />
+        <el-text class="mx-1 text-mode" type="primary" @click="handleChangeStaff">{{
+          `工号${staffNoHtmlType === 'INPUT' ? '选择' : '输入'}方式`
+        }}</el-text>
       </el-form-item>
+
       <el-form-item label="所属部门" prop="deptId">
         <el-tree-select
           v-model="formParams.deptId"
@@ -32,6 +36,7 @@
           class="protocal-select"
         />
       </el-form-item>
+
       <el-form-item label="角色" prop="roleIdList">
         <el-select clearable v-model="formParams.roleIdList" multiple>
           <el-option v-for="item in roleData" :key="item.value" :label="item.label" :value="item.value" />
@@ -143,7 +148,8 @@
       width: 450,
     },
   );
-  let defaultValue = {
+
+  const emptyValue = {
     password: '',
     passwordRe: '',
     deptId: null,
@@ -154,6 +160,7 @@
     realname: '',
     roleIdList: [],
   };
+  let defaultValue = { ...emptyValue };
   const message = ElMessage;
   const formRef: any = ref(null);
   const isDrawer = ref(false);
@@ -193,13 +200,13 @@
   const debouncedRemoteMethod = debounce(remoteMethod, 1000);
 
   type STAFFNO_HTML_TYPE = 'INPUT' | 'SELECT';
-  const staffNoHtmlType = ref<STAFFNO_HTML_TYPE>('SELECT');
-  // const handleChangeStaff = () => {
-  //   staffNoHtmlType.value = staffNoHtmlType.value === 'INPUT' ? 'SELECT' : 'INPUT';
-  //   if (staffNoHtmlType.value === 'INPUT') {
-  //     departmentArr.value = props.departmentList;
-  //   }
-  // };
+  const staffNoHtmlType = ref<STAFFNO_HTML_TYPE>('INPUT');
+  const handleChangeStaff = () => {
+    staffNoHtmlType.value = staffNoHtmlType.value === 'INPUT' ? 'SELECT' : 'INPUT';
+    if (staffNoHtmlType.value === 'INPUT') {
+      departmentArr.value = props.departmentList;
+    }
+  };
 
   const handleClear = () => {
     formRef.value.resetFields();
@@ -286,6 +293,11 @@
     formParams.value = Object.assign(formParams.value, defaultValue);
   }
 
+  function clear() {
+    formRef.value.resetFields();
+    formParams.value = Object.assign(formParams.value, emptyValue);
+  }
+
   function getInfo() {
     userInfo({ userId: Number(formParams.value.userId) }).then((res) => {
       defaultValue = res;

+ 5 - 53
src/views/system/user/user.vue

@@ -10,14 +10,6 @@
     <el-card>
       <template #header>
         <el-space align="center">
-          <el-button @click="openAddAdminDrawer" v-if="!isTargetTenantSys && isCanAddTenant && hasUserPermission()">
-            <template #icon>
-              <el-icon>
-                <Plus />
-              </el-icon>
-            </template>
-            添加租户管理员
-          </el-button>
           <el-button type="primary" @click="openAddSingleDrawer" v-permission="{ action: [PERM_USER.ACCOUNT_MANAGE] }">
             <template #icon>
               <el-icon>
@@ -26,13 +18,7 @@
             </template>
             添加用户
           </el-button>
-          <!-- <el-button
-            color="#1890FF"
-            @click="openAddMultipleDrawer"
-            style="margin-left: 18px"
-            plain
-            v-permission="{ action: [PERM_USER.ACCOUNT_ADD] }"
-          > -->
+
           <el-button color="#1890FF" @click="openAddMultipleDrawer" style="margin-left: 18px" plain>
             <template #icon>
               <el-icon>
@@ -151,17 +137,7 @@
       :width="450"
     />
     <ResetCodeDrawer ref="ResetCodeDrawerRef" :title="drawerTitle" @change="reloadTable" />
-    <CreateAdminDrawer
-      ref="createAdminDrawerRef"
-      :title="createAdminTitle"
-      @change="reloadTable"
-      :editType="createAdminType"
-      :roleData="roleData"
-      :width="450"
-      :isCanAddTenant="isCanAddTenant"
-      :isTargetTenantSys="isTargetTenantSys"
-      :departmentList="departmentList"
-    />
+
     <AddUser
       v-if="showAddPopover"
       :colseAddUser="setShowAddPopoverFalse"
@@ -177,7 +153,7 @@
   import { storeToRefs } from 'pinia';
   import { ElMessage, ElMessageBox } from 'element-plus';
   import { Plus, DocumentAdd, Stamp } from '@element-plus/icons-vue';
-  import { EditType, OptionsProps, SearchParamsProps } from './types';
+  import { OptionsProps, SearchParamsProps } from './types';
   import { RoleTypeEnum } from '@/types/role/constants';
   import { getAllDepartments } from '@/api/auth/dept';
   import { getRoles } from '@/api/system/role';
@@ -190,7 +166,6 @@
   import AddUser from './component/AddUser.vue';
   import CreateDrawer from './CreateDrawer.vue';
   import ResetCodeDrawer from './ResetCodeDrawer.vue';
-  import CreateAdminDrawer from './CreateAdminDrawer.vue';
   import editIcon from '@/assets/icons/edit.png';
   import deleteIcon from '@/assets/icons/delete.png';
   import { SYS_TENANT_ID } from '@/utils/useTargetTenantIdSetting';
@@ -204,12 +179,9 @@
   const searchFormRef = ref<InstanceType<typeof SearchForm>>();
   const createDrawerRef = ref<InstanceType<typeof CreateDrawer>>();
   const ResetCodeDrawerRef = ref<InstanceType<typeof ResetCodeDrawer>>();
-  const createAdminDrawerRef = ref<InstanceType<typeof CreateAdminDrawer>>();
   const drawerTitle = ref('添加用户');
-  const createAdminTitle = ref('添加租户管理员');
   const roleData = ref<OptionsProps[]>([]);
   const departmentList = ref<OptionsProps[]>([]);
-  const createAdminType = ref(EditType.create);
   const { isTargetTenantSys } = useTargetTenantIdSetting();
 
   function reloadTable() {
@@ -217,26 +189,11 @@
   }
 
   const hasResetPasswordPermission = () => userStore.checkPermission(PERM_USER.ACCOUNT_RESET_PASSWORD);
-  const hasUserPermission = () => userStore.checkPermission(PERM_USER.ACCOUNT_MANAGE);
   // 当前用户类型
-  const currrentRoleType = getUserInfo.value.roleType;
   const currrentTenantId = getUserInfo.value.tenantId;
-  // 是否拥有添加租户管理人员权限,条件:1.系统用户,2.选择租户切换到租户选项
-  const isCanAddTenant = Number(currrentRoleType) !== RoleTypeEnum.TENANT_ADMIN && currrentTenantId === SYS_TENANT_ID;
   const openAddSingleDrawer = () => {
     drawerTitle.value = '添加用户';
-    if (isTargetTenantSys) {
-      createAdminTitle.value = '添加用户';
-      createAdminType.value = EditType.create;
-      createAdminDrawerRef.value?.openDrawer();
-    } else {
-      createDrawerRef.value?.openDrawer();
-    }
-  };
-  const openAddAdminDrawer = () => {
-    createAdminTitle.value = '添加租户管理员';
-    createAdminDrawerRef.value?.openDrawer();
-    createAdminType.value = EditType.create;
+    createDrawerRef.value?.openDrawer();
   };
 
   const showAddPopover = ref<boolean>(false);
@@ -251,12 +208,7 @@
 
   function handleEdit(record: Recordable) {
     drawerTitle.value = '编辑用户';
-    if (record.roleType === RoleTypeEnum.TENANT_ADMIN || isTargetTenantSys) {
-      createAdminDrawerRef.value?.openDrawer(record.id);
-      createAdminType.value = EditType.edit;
-    } else {
-      createDrawerRef.value?.openDrawer(record.id);
-    }
+    createDrawerRef.value?.openDrawer(record.id);
   }
 
   function handleResetCode(record: Recordable) {