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

feat: 完成添加用户,但是编辑用户有问题

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

+ 203 - 0
src/api/system/role.ts

@@ -0,0 +1,203 @@
+import { http } from '@/utils/http/axios';
+import { Role, RolePageRequest, RolePageResponse, RoleForm, AssignedPermissions } from '@/types/role/type';
+
+/**
+ * @description: 添加管理角色
+ */
+export function addAdminRole(params) {
+  return http.request({
+    url: '/role/addAdmin',
+    method: 'POST',
+    params,
+  });
+}
+
+export interface RoleType<T> {
+  permissionList?: T[];
+  remark?: string;
+  roleName?: string;
+  roleCode?: string;
+  roleId?: number;
+}
+
+export interface PermissionType {
+  workshopCode: string;
+  permissionId: string;
+}
+
+/**
+ * @description: 添加用户角色
+ */
+export function addRole(params: RoleType<PermissionType>) {
+  return http.request({
+    url: '/role/add',
+    method: 'POST',
+    params,
+  });
+}
+
+/**
+ * @description: 修改用户角色
+ */
+export function updateRole(params: RoleType<PermissionType>) {
+  return http.request({
+    url: '/role/update',
+    method: 'POST',
+    params,
+  });
+}
+
+/**
+ * @description: 查询管理角色信息
+ */
+export function roleAdminInfo(params) {
+  return http.request({
+    url: '/role/infoAdmin',
+
+    params,
+  });
+}
+
+/**
+ * @description: 查询用户角色信息
+ */
+export function roleUserInfo(params) {
+  return http.request({
+    url: '/role/info',
+
+    params,
+  });
+}
+
+/**
+ * @description: 编辑管理角色
+ */
+export function editAdminRole(params) {
+  return http.request({
+    url: '/role/updateAdmin',
+    method: 'POST',
+    params,
+  });
+}
+
+/**
+ * @description: 删除管理角色
+ */
+export function delAdminRole(params) {
+  return http.request({
+    url: '/role/deleteAdmin',
+    method: 'POST',
+    params,
+  });
+}
+
+/**
+ * @description: 删除用户角色
+ */
+export function delUserRole(params) {
+  return http.request({
+    url: '/role/delete',
+    method: 'POST',
+    params,
+  });
+}
+
+/**
+ * @description: 角色列表
+ */
+export function roleList(params?) {
+  return http.request({
+    url: '/role/pageList',
+    params,
+  });
+}
+
+/**
+ * @description: 所有角色列表
+ */
+export function roleAllList(params?) {
+  return http.request({
+    url: '/role/getAllRoles',
+
+    params,
+  });
+}
+
+/**
+ * @description: 获取所有权限
+ */
+export function permissionList() {
+  return http.request({
+    url: '/role/listAllPermission',
+  });
+}
+
+/** @description: 获取功能权限 */
+export function getFeaturePermissions() {
+  return http.request({
+    url: '/role/listFunctionPermission',
+  });
+}
+
+/**
+ * v4: 获取自己拥有的和自己创建的角色(分页)
+ */
+export function getRolesPage(params: RolePageRequest) {
+  return http.request<RolePageResponse>({
+    url: '/admin/role/queryRolePage',
+    method: 'POST',
+    data: params,
+  });
+}
+
+/**
+ * v4: 获取自己拥有和自己创建的角色(全量)
+ */
+export function getRoles() {
+  return http.request<Role[]>({
+    url: '/admin/role/getRoleList',
+    method: 'GET',
+  });
+}
+
+/**
+ * v4: 创建角色
+ */
+export function createRole(data: RoleForm) {
+  return http.request({
+    url: '/admin/role/addRole',
+    method: 'POST',
+    data,
+  });
+}
+
+/**
+ * v4: 编辑角色
+ */
+export function editRole(data: RoleForm) {
+  return http.request({
+    url: '/admin/role/updateRole',
+    method: 'POST',
+    data,
+  });
+}
+
+/**
+ * v4:删除菜单角色
+ */
+export function deleteRole(roleId: number) {
+  return http.request({
+    url: `/admin/role/deleteRole?roleId=${roleId}`,
+    method: 'DELETE',
+  });
+}
+
+/**
+ * v4:获取角色已分配的权限(相机、菜单、功能)
+ */
+export function getAssignedPerms(roleId: number) {
+  return http.request<AssignedPermissions>({
+    url: `/admin/role/getSelectedPerm?roleId=${roleId}`,
+    method: 'GET',
+  });
+}

+ 262 - 0
src/api/system/user-operate.ts

@@ -0,0 +1,262 @@
+import { http } from '@/utils/http/axios';
+import type { PaginationResponse } from '@/types/common/type';
+
+export interface UserType {
+  userId?: number;
+  password?: string;
+  deptId?: number | null;
+  username?: string;
+  staffNo?: string;
+  mobile?: string;
+  isDisabled?: boolean | number;
+  realname?: string;
+  roleIdList?: number[];
+  passwordRe?: string;
+  /** 租户id */
+  tenantId?: number;
+}
+
+interface AdminUserType {
+  /** 昵称 */
+  nickname: string;
+  /** 登录用户名 */
+  username: string;
+  /** 部门id */
+  deptId?: number;
+  /** 员工编号 */
+  staffNo?: string;
+  /** 密码 */
+  password: string;
+  /** 所属租户id */
+  tenantId: number;
+}
+
+export interface DeptListItem {
+  children: [];
+  createdAt: string;
+  createdBy: string;
+  deptName: string;
+  id: number;
+  isDeleted: number;
+  isDisabled: number;
+  orderNum: number;
+  parentId: string;
+  tenantId: number;
+  updatedAt: string;
+  updatedBy: string;
+}
+
+export interface RoleListItem {
+  createdAt: string;
+  createdBy: number;
+  id: number;
+  isDeleted: number;
+  roleName: string;
+  tenantId: number;
+  updatedAt: string;
+  updatedBy: null;
+}
+export interface UserLisItem {
+  avatar: string;
+  createdAt: string;
+  createdBy: null;
+  deptId: number;
+  deptList: DeptListItem[];
+  email: null;
+  gender: null;
+  id: number;
+  isDeleted: number;
+  isDisabled: number;
+  mobile: null;
+  password: string;
+  realname: string;
+  remark: null;
+  roleList: RoleListItem[];
+  roleType: number;
+  staffNo: string;
+  tenantId: number;
+  updatedAt: string;
+  updatedBy: null;
+  username: string;
+}
+
+/** root用户给某个租户添加管理员 */
+export function addAdminUser(params: AdminUserType) {
+  return http.request({
+    url: '/user/adds',
+    method: 'POST',
+    params,
+  });
+}
+
+// 添加普通用户-交付管理员
+export function addSingleUser(params: UserType) {
+  return http.request(
+    {
+      url: '/admin/user/saveUser',
+      method: 'POST',
+      params,
+    },
+    {
+      isTransformResponse: false,
+    },
+  );
+}
+
+//添加批量用户
+export function addMultipleUser(params: File) {
+  return http.request({
+    url: '/user/import',
+    method: 'POST',
+    params,
+  });
+}
+
+export interface UserTypeDel {
+  deleteStatus?: string;
+  deptId?: number;
+  email?: string;
+  isEnable?: boolean;
+  mobile?: string;
+  nickname?: string;
+  opertor?: string;
+  password?: string;
+  postId?: string;
+  remark?: string;
+  roleIds?: string[];
+  sex?: string;
+  staffNo?: string;
+  userId?: number;
+  username?: string;
+  updateTime?: string;
+  createTime?: string;
+  certify?: string;
+}
+
+export interface UserProps {
+  userId: number;
+}
+//删除用户
+export function delUser(params: UserProps) {
+  return http.request({
+    url: '/admin/user/deleteUser',
+    method: 'POST',
+    params,
+  });
+}
+
+//修改用户
+export function updateUser(params: UserType) {
+  return http.request(
+    {
+      url: '/admin/user/updateUser',
+      method: 'POST',
+      params,
+    },
+    {
+      isTransformResponse: false,
+    },
+  );
+}
+
+//获取单个用户信息
+// export function getUser(params: string): Promise<UserType> {
+//   return http.request({
+//     url: '/user/info',
+//     method: 'get',
+//     params,
+//   });
+// }
+
+export interface UserList {
+  pageNumber: number;
+  totalPage: number;
+  pageSize: number;
+  page: number;
+  records: UserTypeDel[];
+  totalCount: number;
+  pageNum: number;
+}
+
+export interface QueryUser {
+  staffNo?: string; //工号
+  realname?: string; //姓名
+  mobile?: string; //手机号
+  roleName?: string; //角色
+  deptName?: string; //组织
+  pageNumber?: number; //当前页数
+  pageSize?: number; //每页个数
+  deptId?: string;
+  roleId?: string;
+  userName: string; //登录用户
+}
+
+export interface UserPramas {
+  realname?: string; // 用户姓名
+  mobile?: string; // 手机号
+  staffNo?: string; // 工号
+  deptId?: number; // 部门
+  roleId?: number; // 角色id
+}
+
+export interface QueryUserPramas {
+  pageNumber: number; //当前页数
+  pageSize: number; //每页个数
+  queryParam: UserPramas;
+}
+
+//获取单个用户信息
+export function getUserList(params: QueryUserPramas | null): Promise<PaginationResponse<UserLisItem>> {
+  return http.request({
+    url: '/admin/user/queryUserPage',
+    method: 'post',
+    params,
+  });
+}
+
+/* V4: 修改密码参数 */
+interface ResetCodeType {
+  userId: number;
+  newPwd: string;
+}
+
+// V4: 修改密码
+export function resetCode(data: ResetCodeType) {
+  return http.request({
+    url: '/admin/user/changePassword',
+    method: 'POST',
+    data,
+  });
+}
+
+export interface AddTenantAdminProps {
+  username: string;
+  realname: string;
+  roleIdList: number[];
+  isDisabled: boolean | number;
+  password: string;
+  userId?: number;
+  passwordRe?: string;
+}
+
+// V4: 添加租户管理员
+export function addTenantAdmin(data: AddTenantAdminProps) {
+  return http.request({
+    url: 'admin/user/saveTenantAdmin',
+    method: 'POST',
+    data,
+  });
+}
+
+// V4: 删除用户
+export function deleteUser(params: UserProps) {
+  return http.request(
+    {
+      url: `admin/user/deleteUser?userId=${params.userId}`,
+      method: 'DELETE',
+    },
+    {
+      isTransformResponse: false,
+    },
+  );
+}

+ 2 - 31
src/hooks/useSceneInfos.ts

@@ -1,19 +1,7 @@
 import { computed, ref } from 'vue';
 import { getShopSpaceList, getCamerasByWorkShopId } from '@/api/scene/scene';
 import { CompanyInfoItem } from '@/types/scene/type.ts';
-type ElTreeItem = {
-  value: any;
-  label: string;
-  children?: ElTreeItem[];
-};
-
-type TreeProps = {
-  /** level:1-数据读取至公司 2-数据读取至工厂 3-数据读取至工位 */
-  level: number;
-  labelKey: string;
-  valueKey: string;
-  disabled?: boolean;
-};
+import { calculateTreeData, ElTreeItem, TreeProps } from '@/utils';
 
 export function useSceneInfos() {
   const scenesInfos = ref<CompanyInfoItem[]>([]);
@@ -27,29 +15,12 @@ export function useSceneInfos() {
     return scenesInfos.value.reduce((total, next) => {
       let newArr: any[] = [];
       if (next.children && next.children.length) {
-        newArr = next.children.reduce(
-          (subTotal, subNext) => [...subTotal, ...subNext.children],
-          [],
-        );
+        newArr = next.children.reduce((subTotal, subNext) => [...subTotal, ...subNext.children], []);
       }
       return [...total, ...newArr];
     }, []);
   });
 
-  const calculateTreeData = (infos: any[], treeProps: TreeProps, level: number): ElTreeItem[] => {
-    return infos.map((data) => {
-      return {
-        value: data[treeProps.valueKey],
-        label: data[treeProps.labelKey],
-        children:
-          data.children && data.children.length && treeProps.level > level
-            ? calculateTreeData(data.children, treeProps, level + 1)
-            : [],
-        disabled: treeProps.disabled && level < treeProps.level,
-      };
-    });
-  };
-
   const getScenesTree = (treeProps: TreeProps) => {
     getShopSpaceList().then((res) => {
       scenesInfos.value = res;

+ 29 - 0
src/utils/index.ts

@@ -292,3 +292,32 @@ export const colorRGB2Hex = (color: string): string[] => {
 
   return [hex, Number(array![4]) * 100 + '%'];
 };
+
+export type ElTreeItem = {
+  value: any;
+  label: string;
+  children?: ElTreeItem[];
+};
+
+export type TreeProps = {
+  /** level:1-数据读取至公司 2-数据读取至工厂 3-数据读取至工位 */
+  level: number;
+  labelKey: string;
+  valueKey: string;
+  disabled?: boolean;
+};
+
+/** 生成element-plus树状结构的数据 */
+export const calculateTreeData = (infos: any[], treeProps: TreeProps, level: number): ElTreeItem[] => {
+  return infos.map((data) => {
+    return {
+      value: data[treeProps.valueKey],
+      label: data[treeProps.labelKey],
+      children:
+        data.children && data.children.length && treeProps.level > level
+          ? calculateTreeData(data.children, treeProps, level + 1)
+          : [],
+      disabled: treeProps.disabled && level < treeProps.level,
+    };
+  });
+};

+ 12 - 24
src/views/system/role/components/RoleDrawer.vue

@@ -1,18 +1,12 @@
 <template>
   <el-drawer :title="title" v-model="drawerOpened" @close="reset">
-    <el-form 
-      label-position="left" 
-      label-width="80px" 
-      :model="formData" 
-      :rules="formRules"
-      ref="formInstance"
-    >
+    <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" />
       </el-form-item>
 
       <el-form-item label="角色权限">
-        <PermissioTreeCard title="相机权限" :tree-data="cameraPermTreeData" ref="cameraCardInstance" />
+        <!-- <PermissioTreeCard title="平台入口权限" :tree-data="menuPermTreeData" ref="menuCardInstance" /> -->
         <PermissioTreeCard title="菜单权限" :tree-data="menuPermTreeData" ref="menuCardInstance" />
         <PermissioTreeCard title="功能权限" :tree-data="funcPermTreeData" ref="funcCardInstance" />
       </el-form-item>
@@ -36,7 +30,6 @@
   import { FormRules, FormInstance, ElMessage } from 'element-plus';
   import useMenuPermTree from '../hooks/useMenuPermissionTree';
   import useFuncPermTree from '../hooks/useFunctionPermissionTree';
-  import useCameraPermTree from '../hooks/useCameraPermissionTree';
   import { createRole, editRole, getAssignedPerms } from '@/api/system/role';
   import { PermissionTreeKey } from '@/types/permission/type';
 
@@ -45,17 +38,15 @@
   }>();
 
   const emits = defineEmits<{
-    (e: 'submitted'): void;  // 提交之后触发的事件
+    (e: 'submitted'): void; // 提交之后触发的事件
   }>();
 
-  const { cameraPermTreeData } = useCameraPermTree();
   const { menuPermTreeData } = useMenuPermTree();
-  const { funcPermTreeData} = useFuncPermTree();
+  const { funcPermTreeData } = useFuncPermTree();
 
   const drawerOpened = ref(false);
-  const cameraCardInstance = ref<InstanceType<typeof PermissioTreeCard>>();
   const menuCardInstance = ref<InstanceType<typeof PermissioTreeCard>>();
-  const funcCardInstance = ref<InstanceType<typeof PermissioTreeCard>>();   
+  const funcCardInstance = ref<InstanceType<typeof PermissioTreeCard>>();
 
   // 表单相关
   const defaultFormData = (): RoleForm => ({
@@ -72,7 +63,7 @@
     remark: {},
   };
   const formInstance = ref<FormInstance>();
-  
+
   const isEditing = computed(() => formData.id != null);
 
   /**
@@ -102,13 +93,12 @@
     } 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}`);
-      cameraCardInstance.value?.setAssignedPermissions(cameraIds);
+      const cameraIds = result.cameraIds.map((id) => `camera-${id}`);
     }
 
     if (result.menuIds?.length) {
@@ -118,7 +108,7 @@
     if (result.permIds?.length) {
       funcCardInstance.value?.setAssignedPermissions(result.permIds);
     }
-  }
+  };
 
   /**
    * 重置表单
@@ -126,7 +116,6 @@
   const reset = () => {
     formInstance.value?.resetFields();
     Object.assign(formData, defaultFormData());
-    cameraCardInstance.value?.reset();
     menuCardInstance.value?.reset();
     funcCardInstance.value?.reset();
   };
@@ -135,7 +124,6 @@
    * 提交。创建和编辑统一
    */
   const submit = async () => {
-    formData.cameraIds = cleanCameraPermissions(cameraCardInstance.value!.getSelectedPermissions());
     formData.menuIds = menuCardInstance.value!.getSelectedPermissions();
     formData.permIds = funcCardInstance.value!.getSelectedPermissions();
 
@@ -150,13 +138,13 @@
     } catch (e) {
       console.error(e);
     }
-  }
+  };
 
   /**
    * 获取到的相机的权限码是 camera-xxx, 例如 camera-11, 提交后端转换成数字 11
    */
   const cleanCameraPermissions = (perms: PermissionTreeKey[]) => {
-    return perms.map(perm => {
+    return perms.map((perm) => {
       if (typeof perm === 'string' && perm.includes('-')) {
         const splits = perm.split('-');
         return +splits[1];
@@ -165,7 +153,7 @@
       // 否则正常返回
       return perm;
     });
-  }
+  };
 
   defineExpose({ open });
 </script>

+ 1 - 3
src/views/system/user/user.vue

@@ -176,7 +176,6 @@
   import { Plus, DocumentAdd, Edit, Delete, Stamp } from '@element-plus/icons-vue';
   import { EditType, OptionsProps, SearchParamsProps } from './types';
   import { RoleTypeEnum } from '@/types/role/constants';
-  import useSceneInfos from '@/hooks/useSceneInfos';
   import { getAllDepartments } from '@/api/auth/dept';
   import { getRoles } from '@/api/system/role';
   import { getUserList, UserLisItem, deleteUser } from '@/api/system/user-operate';
@@ -194,11 +193,10 @@
   import deleteIcon from '@/assets/icons/delete.png';
   import { SYS_TENANT_ID } from '@/utils/useTargetTenantIdSetting';
   import { PERM_USER } from '@/types/permission/constants';
+  import { calculateTreeData } from '@/utils';
 
   const userStore = useUserStore();
   const { getUserInfo } = storeToRefs(userStore);
-  const sceneInfos = useSceneInfos();
-  const { calculateTreeData } = sceneInfos;
   const userList = ref<UserLisItem[]>([]);
   const searchFormRef = ref<InstanceType<typeof SearchForm>>();
   const createDrawerRef = ref<InstanceType<typeof CreateDrawer>>();