Преглед изворни кода

Merge branch 'all-v4-qindao' into 'all-v4'

feat: V4 版本用户管理

See merge request skyeye/skyeye_frontend/skyeye-admin!207
Fei Liu пре 1 година
родитељ
комит
725d990a8d

+ 120 - 22
src/api/system/user-operate.ts

@@ -1,4 +1,5 @@
 import { http } from '@/utils/http/axios';
+import type { PaginationResponse } from '@/types/common/type';
 
 export interface UserType {
   userId?: number;
@@ -7,9 +8,9 @@ export interface UserType {
   username?: string;
   staffNo?: string;
   mobile?: string;
-  isEnable?: boolean;
-  nickname?: string;
-  roleIds?: number[];
+  isDisabled?: boolean;
+  realname?: string;
+  roleIdList?: number[];
   passwordRe?: string;
   /** 租户id */
   tenantId?: number;
@@ -30,6 +31,56 @@ interface AdminUserType {
   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({
@@ -39,11 +90,11 @@ export function addAdminUser(params: AdminUserType) {
   });
 }
 
-//添加用户
+// 添加普通用户-交付管理员
 export function addSingleUser(params: UserType) {
   return http.request(
     {
-      url: '/user/add',
+      url: '/admin/user/saveUser',
       method: 'POST',
       params,
     },
@@ -83,10 +134,13 @@ export interface UserTypeDel {
   certify?: string;
 }
 
+export interface UserProps {
+  userId: number
+}
 //删除用户
-export function delUser(params: UserTypeDel) {
+export function delUser(params: UserProps) {
   return http.request({
-    url: '/user/delete',
+    url: '/admin/user/deleteUser',
     method: 'POST',
     params,
   });
@@ -96,7 +150,7 @@ export function delUser(params: UserTypeDel) {
 export function updateUser(params: UserType) {
   return http.request(
     {
-      url: '/user/update',
+      url: '/admin/user/updateUser',
       method: 'POST',
       params,
     },
@@ -120,42 +174,86 @@ export interface UserList {
   totalPage: number;
   pageSize: number;
   page: number;
-  list: UserTypeDel[];
+  records: UserTypeDel[];
   totalCount: number;
   pageNum: number;
 }
 
 export interface QueryUser {
   staffNo?: string; //工号
-  nickname?: string; //姓名
+  realname?: string; //姓名
   mobile?: string; //手机号
   roleName?: string; //角色
   deptName?: string; //组织
-  page?: number; //当前页数
-  pageRow?: number; //每页个数
+  pageNumber?: number; //当前页数
+  pageSize?: number; //每页个数
   deptId?: string;
-  roleId?:string;
+  roleId?: string;
+  userName: string; //登录用户
+}
+
+export interface UserPramas {
+  username: string, // 登录用户
+  realname?: string, // 用户姓名
+  mobile?: string, // 手机号
+  staffNo?: string, // 工号
+  deptId?: number, // 部门
+  roleId?: number; // 角色id
+}
+
+export interface QueryUserPramas {
+  pageNumber: number; //当前页数
+  pageSize: number; //每页个数
+  queryParam: UserPramas
 }
 
 //获取单个用户信息
-export function getUserList(params: QueryUser | null): Promise<UserList> {
+export function getUserList(params: QueryUserPramas | null): Promise<PaginationResponse<UserLisItem>> {
   return http.request({
-    url: '/user/list',
-    method: 'get',
+    url: '/admin/user/queryUserPage',
+    method: 'post',
     params,
   });
 }
 
+/* V4: 修改密码参数 */
 interface ResetCodeType {
-  password?: string;
-  userId?: number;
+  userId: number;
+  newPwd: string;
 }
 
-// 修改密码
-export function resetCode(params: ResetCodeType) {
+// V4: 修改密码
+export function resetCode(data: ResetCodeType) {
   return http.request({
-    url: '/user/changePassword',
+    url: '/admin/user/changePassword',
     method: 'POST',
-    params,
+    data,
   });
 }
+ 
+export interface AddTenantAdminProps {
+  username: string;
+  realname: string;
+  roleIdList: number[];
+  isDisabled: boolean;
+  password: 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
+  })
+}

+ 22 - 12
src/api/system/user-query.ts

@@ -6,17 +6,10 @@ export interface Role {
 }
 
 export interface RoleList {
+  map(arg0: (item: any) => { value: any; label: any; }): never[];
   list?: Role[];
 }
 
-//获取所有角色
-export function getAllRoles(): Promise<RoleList> {
-  return http.request({
-    url: '/role/getAllRoles',
-    method: 'get',
-  });
-}
-
 export interface Department {
   deptId: number;
   createDate: string;
@@ -28,10 +21,27 @@ export interface Department {
   orderNum: number | null;
   isEnable: boolean;
 }
-//获取所有组织
-export function getAllDepartments(): Promise<Department[]> {
+
+/* 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: '/dept/getAllDept',
-    method: 'get',
+    url: '/admin/dept/queryAllDeptTree',
+    method: 'post',
   });
 }

+ 3 - 3
src/api/system/user.ts

@@ -1,5 +1,5 @@
 import { http } from '@/utils/http/axios';
-
+import { UserProps } from './user-operate';
 export interface BasicResponseModel<T = any> {
   code: number;
   msg: string;
@@ -48,9 +48,9 @@ export function editUsur(params) {
 /**
  * @description: 用户信息
  */
-export function userInfo(params) {
+export function userInfo(params:UserProps) {
   return http.request({
-    url: '/user/info',
+    url: '/admin/user/queryUserInfo',
     method: 'GET',
     params,
   });

+ 11 - 1
src/api/tenant/index.ts

@@ -70,7 +70,6 @@ export function getListUseZongbu() {
 /**
  * @description: 查询租户树
  */
-
 export function queryTenantTreeApi(params: { tenantName: string; tenantCode: string }) {
   return http.request({
     url: '/admin/tenant/queryTenantTree',
@@ -113,3 +112,14 @@ export function updateTenantApi(params: tenantFormType) {
     params,
   });
 }
+
+/* V4: 获取租户列表 */
+export function queryListTenant() {
+  return http.request(
+    {
+      url: '/admin/tenant/listTenantForTargetTenant',
+      method: 'post',
+    },
+    { isShowErrorMessage: false, isShowMessage: false },
+  );
+}

+ 4 - 4
src/layout/components/Header/SwitchTenant.vue

@@ -16,7 +16,7 @@
   import { ElSelect } from 'element-plus';
   import { ref, computed, onMounted } from 'vue';
   import { useUserStore } from '@/store/modules/user';
-  import { getListUseZongbu } from '@/api/tenant';
+  import { getListUseZongbu, queryListTenant} from '@/api/tenant';
   import { useTargetTenantIdSetting } from '@/utils/useTargetTenantIdSetting';
 
   interface TenantOption {
@@ -24,7 +24,7 @@
     value: string;
   }
 
-  const { setValue, getValue } = useTargetTenantIdSetting();
+  const { setValue, getValue, isSysTenant } = useTargetTenantIdSetting();
 
   const localTId = getValue();
 
@@ -39,9 +39,9 @@
   });
 
   onMounted(() => {
-    getListUseZongbu().then((res) => {
+    queryListTenant().then((res) => {
       if (!res) return;
-      options.value = res.map((x) => ({ ...x, label: x.tenantName, value: x.tenantId }));
+      options.value = res.map((x) => ({ ...x, label: x.tenantName, value: x.id }));
     });
   });
 

+ 8 - 5
src/utils/useTargetTenantIdSetting.ts

@@ -1,5 +1,7 @@
 import { useUserStore } from '@/store/modules/user';
-import { watch } from 'vue';
+import { computed, watch } from 'vue';
+
+export const SYS_TENANT_ID = 0;
 
 /** 设置targetTenantId */
 export function useTargetTenantIdSetting() {
@@ -10,14 +12,13 @@ export function useTargetTenantIdSetting() {
     () => [userStore.info.username, userStore.info.tenantCode],
     ([username, tenantCode]) => {
       fullKey = `${tenantCode || ''}_${username}_targetTenantId`;
-      console.log('fullKey', fullKey);
     },
     { immediate: true },
   );
 
   function setValue(tenantId: string | string) {
     if (!fullKey) {
-      console.error('请先设置targetTenantId');
+      
       return;
     }
     localStorage.setItem(fullKey, String(tenantId));
@@ -25,11 +26,13 @@ export function useTargetTenantIdSetting() {
 
   function getValue() {
     if (!fullKey) {
-      console.error('请先设置targetTenantId');
+      
       return;
     }
     return localStorage.getItem(fullKey);
   }
 
-  return { setValue, getValue };
+  const isSysTenant = computed(() => getValue() === SYS_TENANT_ID.toString())
+
+  return { setValue, getValue, isSysTenant };
 }

+ 63 - 172
src/views/system/user/CreateAdminDrawer.vue

@@ -8,49 +8,22 @@
       :label-width="80"
     >
       <el-form-item label="登录账号" prop="username">
-        <el-input placeholder="请输入登录账号" v-model="formParams.username" />
+        <el-input placeholder="请输入登录账号" v-model="formParams.username"  :disabled="!isAddUser" />
       </el-form-item>
-      <el-form-item label="选择租户" prop="tenantId">
-        <el-select v-model="formParams.tenantId" placeholder="请选择租户" class="protocal-select">
-          <el-option
-            v-for="item in tenantList"
-            :key="item.tenantId"
-            :label="item.tenantName"
-            :value="item.tenantId"
-          />
-        </el-select>
+      <el-form-item label="姓名" prop="realname">
+        <el-input placeholder="请输入姓名" v-model="formParams.realname" />
       </el-form-item>
-      <!-- <el-form-item label="所属部门" prop="deptId">
-        <el-select v-model="formParams.deptId" placeholder="请选择组织" class="protocal-select">
-          <el-option
-            v-for="item in departmentList"
-            :key="item.deptId"
-            :label="item.deptName"
-            :value="item.deptId"
-          />
-        </el-select>
-      </el-form-item> -->
-
-      <!-- <el-form-item label="角色" prop="roleIds">
-        <el-select clearable v-model="formParams.roleIds" multiple>
+      <el-form-item label="角色" prop="roleIdList">
+        <el-select clearable v-model="formParams.roleIdList" multiple>
           <el-option
-            v-for="item in roleList!"
-            :key="item.roleId"
-            :label="item.roleName"
-            :value="item.roleId"
+            v-for="item in roleData"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
           />
         </el-select>
-      </el-form-item> -->
-      <el-form-item label="姓名" prop="nickname">
-        <el-input placeholder="请输入姓名" v-model="formParams.nickname" />
-      </el-form-item>
-      <el-form-item label="手机" prop="mobile">
-        <el-input placeholder="请输入手机" v-model="formParams.mobile" />
       </el-form-item>
-      <el-form-item label="工号" prop="staffNo">
-        <el-input placeholder="请输入工号" v-model="formParams.staffNo" />
-      </el-form-item>
-      <el-form-item v-if="isAddUser" label="密码" prop="password">
+       <el-form-item v-if="isAddUser" label="密码" prop="password">
         <el-input
           type="password"
           show-password-on="mousedown"
@@ -58,7 +31,11 @@
           v-model="formParams.password"
         />
       </el-form-item>
-      <el-form-item v-if="isAddUser" label="确认密码" prop="passwordRe">
+      <el-form-item
+        v-if="isAddUser"
+        label="确认密码"
+        :prop="!formParams.username ? 'passwordRe' : ''"
+      >
         <el-input
           type="password"
           show-password-on="mousedown"
@@ -66,12 +43,10 @@
           v-model="formParams.passwordRe"
         />
       </el-form-item>
-
-      <el-form-item label="是否启用" prop="isEnable">
-        <el-switch v-model="formParams.isEnable" />
+      <el-form-item label="是否启用" prop="isDisabled">
+        <el-switch v-model="formParams.isDisabled" />
       </el-form-item>
     </el-form>
-
     <template #footer>
       <el-space>
         <el-button @click="handleReset">重置</el-button>
@@ -82,43 +57,29 @@
 </template>
 
 <script lang="ts" setup>
-  import { ref, onMounted } from 'vue';
+  import { ref,computed, onMounted } from 'vue';
   import { FormRules, ElMessage } from 'element-plus';
-  import { useDictionary } from '@/hooks/web/useDictionary';
   import { userInfo } from '@/api/system/user';
-  import { postList } from '@/api/common/index';
   import { cloneDeep } from 'lodash-es';
-  import { UserType, addAdminUser, addSingleUser, updateUser } from '@/api/system/user-operate';
-  import useSelectContent from './hooks/use-user-para';
-  import { EditType } from './types';
-  import { useTenantList } from './useTenantList';
-  import { computed } from 'vue';
-
-  const selectContent = useSelectContent();
-  const { roleList, departmentList } = selectContent;
-
+  import { addTenantAdmin, AddTenantAdminProps, updateUser } from '@/api/system/user-operate';
+  import { EditType, OptionsProps } from './types';
+  import { ResultEnum } from '@/enums/httpEnum';
+  
   const rules: FormRules = {
     username: {
       required: true,
       message: '登录账号不能为空',
       trigger: 'blur',
     },
-    tenantId: {
+    realname: {
       required: true,
-      message: '租户不能为空',
+      message: '姓名不能为空',
       trigger: 'blur',
     },
-    deptId: {
-      required: true,
-      message: '部门不能为空',
-      trigger: 'change',
-      type: 'number',
-    },
-    roleIds: {
+    roleIdList: {
       required: true,
-      message: '角色不能为空',
+      message: '请选择角色',
       trigger: 'change',
-      type: 'array',
     },
     password: {
       required: true,
@@ -130,64 +91,33 @@
       message: '密码不能为空',
       trigger: 'blur',
     },
-    nickname: {
-      required: true,
-      message: '用户名不能为空',
-      trigger: 'blur',
-    },
-    mobile: {
-      required: true,
-      message: '手机不能为空',
-      trigger: 'blur',
-    },
-    staffNo: {
-      required: true,
-      message: '工号不能为空',
-      trigger: 'blur',
-    },
   };
 
-  interface PostOption {
-    postName: string;
-    postId: number;
-  }
-
   const emit = defineEmits(['change']);
-  const { getDictTypeList } = useDictionary();
 
-  const props = withDefaults(defineProps<{ title: string; width: number; editType: EditType }>(), {
-    title: '添加用户',
-    width: 450,
-  });
+  const props = withDefaults(defineProps<{ title: string; width: number; editType: EditType,roleData: OptionsProps[]}>(), {
+      title: '添加用户',
+      width: 450,
+    });
 
-  const sexList = ref<any[]>();
-  // const deptList = ref<any[]>();
-  const postDataList = ref<PostOption[]>([]);
   const defaultValueRef = () => ({
-    password: '',
-    passwordRe: '',
-    deptId: null,
     username: '',
-    staffNo: '',
-    mobile: '',
-    isEnable: true,
-    nickname: '',
-    roleIds: [],
+    isDisabled: true,
+    realname: '',
+    roleIdList: [],
+    password: ''
   });
 
-  const { data: tenantList, loading } = useTenantList();
   const message = ElMessage;
   const formRef: any = ref(null);
   const isDrawer = ref(false);
   const subLoading = ref(false);
 
-  const formParams = ref<UserType>(defaultValueRef());
+  const formParams = ref<AddTenantAdminProps>(defaultValueRef());
 
-  async function openDrawer(username?) {
-    const postListRes = await postList();
-    postDataList.value = postListRes;
-    if (username) {
-      formParams.value.username = username;
+  async function openDrawer(userId?) {
+    if (userId) {
+      formParams.value.userId = userId;
       getInfo();
       return;
     }
@@ -211,60 +141,39 @@
       console.log('formParams', formParams.value);
       // 克隆
       const params = cloneDeep(formParams.value);
-
-      // 处理部门
-      console.log('params', params);
-
-      if (params.deptId) {
-        params.deptId = params.deptId;
-      }
       if (params.password != params.passwordRe) {
         return message.error('两次密码不一致');
       }
-      // const msg = params.username ? '编辑成功' : '添加成功';
       if (isAddUser.value) {
         const addData = {
-          password: formParams.value.password!,
-          tenantId: formParams.value.tenantId!,
-          deptId: formParams.value.deptId!,
           username: formParams.value.username!,
-          staffNo: formParams.value.staffNo,
-          mobile: formParams.value.mobile,
-          isEnable: formParams.value.isEnable,
-          nickname: formParams.value.nickname!,
-          roleIds: formParams.value.roleIds,
+          isDisabled: formParams.value.isDisabled,
+          realname: formParams.value.realname!,
+          roleIdList: formParams.value.roleIdList,
+          password: formParams.value.password
         };
-        addAdminUser(addData).then((res) => {
+        addTenantAdmin(formParams.value).then((res) => {
           console.log('添加账户成功', res);
           message.success('添加管理员账户成功');
           emit('change');
           handleReset();
           closeDrawer();
         });
-        // addSingleUser(addData).then(() => {
-        //   emit('change');
-        //   handleReset();
-        //   closeDrawer();
-        // });
+     
       } else {
-        /** 编辑的暂不添加 */
-        const updateData = {
-          userId: params.userId,
-          // password: formParams.value.password,
-          deptId: formParams.value.deptId,
-          username: formParams.value.username,
-          staffNo: formParams.value.staffNo,
-          mobile: formParams.value.mobile,
-          isEnable: formParams.value.isEnable,
-          nickname: formParams.value.nickname,
-          roleIds: formParams.value.roleIds,
-          deleteStatus: '1',
-        };
-        // updateUser(updateData).then(() => {
-        //   emit('change');
-        //   handleReset();
-        //   closeDrawer();
-        // });
+        updateUser(formParams.value)
+        .then((res) => {
+          if (res.code !== ResultEnum.SUCCESS) {
+            return Promise.reject(res.msg);
+          }
+          emit('change');
+          handleReset();
+          closeDrawer();
+          ElMessage.success('修改成功');
+        })
+        .catch((error) => {
+          ElMessage.error(error);
+        });
       }
     });
   }
@@ -275,34 +184,16 @@
   }
 
   function getInfo() {
-    userInfo({ userId: formParams.value.username }).then((res) => {
-      const params = {
-        userId: formParams.value.username,
-        deleteStatus: parseInt(res.deleteStatus),
-        isEnable: res.isEnable,
-        email: res.email,
-        mobile: res.mobile,
-        nickname: res.nickname,
-        password: res.password,
-        passwordRe: res.password,
-        remark: res.remark,
-        sex: res.sex,
-        username: res.username,
-        roleIds: res.roleIds,
-        postId: res.postId ? res.postId.split(',').map(Number) : null,
-        deptId: res.deptId || null,
-        staffNo: res.staffNo,
-      };
-      formParams.value = Object.assign(formParams.value, params);
+    userInfo({ userId: Number(formParams.value.userId)  }).then((res) => {
+      Object.entries(res).forEach(([key, value]) => {
+        formParams.value[key] = value
+      })
+      formParams.value.roleIdList = res.roleIds;
+      formParams.value.passwordRe = res.password;
       isDrawer.value = true;
     });
   }
 
-  onMounted(async () => {
-    const list = await getDictTypeList({ dictType: 'sys_user_sex' });
-    sexList.value = list;
-  });
-
   defineExpose({
     openDrawer,
     closeDrawer,

+ 43 - 122
src/views/system/user/CreateDrawer.vue

@@ -15,21 +15,13 @@
         />
       </el-form-item>
       <el-form-item label="所属部门" prop="deptId">
-        <!-- <el-select v-model="formParams.deptId" placeholder="请选择组织" class="protocal-select">
-          <el-option
-            v-for="item in departmentList"
-            :key="item.deptId"
-            :label="item.deptName"
-            :value="item.deptId"
-          />
-        </el-select> -->
         <el-tree-select
           v-model="formParams.deptId"
           :data="props.departmentList"
           :render-after-expand="false"
           :default-expand-all="true"
           check-strictly
-          placeholder="请选择所属部门"
+          placeholder="请选择所属组织"
           class="protocal-select"
         />
       </el-form-item>
@@ -54,18 +46,18 @@
         />
       </el-form-item>
 
-      <el-form-item label="角色" prop="roleIds">
-        <el-select clearable v-model="formParams.roleIds" multiple>
+      <el-form-item label="角色" prop="roleIdList">
+        <el-select clearable v-model="formParams.roleIdList" multiple>
           <el-option
-            v-for="item in roleList!"
-            :key="item.roleId"
-            :label="item.roleName"
-            :value="item.roleId"
+            v-for="item in roleData"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="姓名" prop="nickname">
-        <el-input placeholder="请输入姓名" v-model="formParams.nickname" />
+      <el-form-item label="姓名" prop="realname">
+        <el-input placeholder="请输入姓名" v-model="formParams.realname" />
       </el-form-item>
       <el-form-item label="手机" prop="mobile">
         <el-input placeholder="请输入手机" v-model="formParams.mobile" />
@@ -73,8 +65,8 @@
       <el-form-item label="工号" prop="staffNo">
         <el-input placeholder="请输入工号" v-model="formParams.staffNo" />
       </el-form-item>
-      <el-form-item label="是否启用" prop="isEnable">
-        <el-switch v-model="formParams.isEnable" />
+      <el-form-item label="是否启用" prop="isDisabled">
+        <el-switch v-model="formParams.isDisabled" />
       </el-form-item>
     </el-form>
 
@@ -88,17 +80,13 @@
 </template>
 
 <script lang="ts" setup>
-    import { ref, onMounted, computed } from 'vue';
-    import { FormRules, ElMessage } from 'element-plus';
-    import { useDictionary } from '@/hooks/web/useDictionary';
-    import { userInfo } from '@/api/system/user';
-    import { postList } from '@/api/common/index';
-    import { cloneDeep } from 'lodash-es';
-    import { UserType, addSingleUser, updateUser } from '@/api/system/user-operate';
-    import useSelectContent from './hooks/use-user-para';
-
-    const selectContent = useSelectContent();
-    const { roleList } = selectContent;
+  import { ref, computed } from 'vue';
+  import { FormRules, ElMessage } from 'element-plus';
+  import { userInfo } from '@/api/system/user';
+  import { cloneDeep } from 'lodash-es';
+  import { UserType, addSingleUser, updateUser } from '@/api/system/user-operate';
+  import { OptionsProps } from './types';
+  import { ResultEnum } from '@/enums/httpEnum';
 
     const rules: FormRules = {
       username: {
@@ -112,7 +100,7 @@
         trigger: 'change',
         type: 'number',
       },
-      roleIds: {
+      roleIdList: {
         required: true,
         message: '角色不能为空',
         trigger: 'change',
@@ -128,7 +116,7 @@
         message: '密码不能为空',
         trigger: 'blur',
       },
-      nickname: {
+      realname: {
         required: true,
         message: '用户名不能为空',
         trigger: 'blur',
@@ -144,33 +132,14 @@
         trigger: 'blur',
       },
     };
-
-    interface PostOption {
-      postName: string;
-      postId: number;
-    }
-
     const emit = defineEmits(['change']);
-    const { getDictTypeList } = useDictionary();
-
-    const props = defineProps({
-      title: {
-        type: String,
-        default: '添加用户',
-      },
-      width: {
-        type: Number,
-        default: 450,
-      },
-      departmentList:{
-        type: Array,
-        default: [],
-      }
-    });
 
-    const sexList = ref<any[]>();
-    // const deptList = ref<any[]>();
-    const postDataList = ref<PostOption[]>([]);
+  const props = withDefaults(defineProps
+  <{ title: string; width: number; departmentList: OptionsProps[], roleData: OptionsProps[] }>(),
+      {
+        title: '添加用户',
+        width: 450,
+      });
     const defaultValueRef = () => ({
       password: '',
       passwordRe: '',
@@ -178,27 +147,23 @@
       username: '',
       staffNo: '',
       mobile: '',
-      isEnable: true,
-      nickname: '',
-      roleIds: [],
+      isDisabled: true,
+      realname: '',
+      roleIdList: [],
     });
 
     const message = ElMessage;
     const formRef: any = ref(null);
     const isDrawer = ref(false);
     const subLoading = ref(false);
-
     const formParams = ref<UserType>(defaultValueRef());
-
     const isAddUser = computed(() => {
       return props.title === '添加用户';
     });
 
-    async function openDrawer(username?) {
-      const postListRes = await postList();
-      postDataList.value = postListRes;
-      if (username) {
-        formParams.value.username = username;
+    async function openDrawer(userId?) {
+      if (userId) {
+        formParams.value.userId = userId;
         getInfo();
         return;
       }
@@ -217,30 +182,16 @@
         // 克隆
         const params = cloneDeep(formParams.value);
 
-        // 处理部门
-        console.log('params', params);
-
         if (params.deptId) {
           params.deptId = params.deptId;
         }
         if (params.password != params.passwordRe) {
           return message.error('两次密码不一致');
         }
-        // const msg = params.username ? '编辑成功' : '添加成功';
         if (isAddUser.value) {
-          const addData = {
-            password: formParams.value.password,
-            deptId: formParams.value.deptId,
-            username: formParams.value.username,
-            staffNo: formParams.value.staffNo,
-            mobile: formParams.value.mobile,
-            isEnable: formParams.value.isEnable,
-            nickname: formParams.value.nickname,
-            roleIds: formParams.value.roleIds,
-          };
-          addSingleUser(addData)
+          addSingleUser(formParams.value)
             .then((res) => {
-              if (res.code !== 200) {
+              if (res.code !== ResultEnum.SUCCESS) {
                 return Promise.reject(res.msg);
               }
               emit('change');
@@ -252,21 +203,9 @@
               ElMessage.error(error);
             });
         } else {
-          const updateData = {
-            userId: params.userId,
-            // password: formParams.value.password,
-            deptId: formParams.value.deptId,
-            username: formParams.value.username,
-            staffNo: formParams.value.staffNo,
-            mobile: formParams.value.mobile,
-            isEnable: formParams.value.isEnable,
-            nickname: formParams.value.nickname,
-            roleIds: formParams.value.roleIds,
-            deleteStatus: '1',
-          };
-          updateUser(updateData)
+          updateUser(formParams.value)
             .then((res) => {
-              if (res.code !== 200) {
+              if (res.code !== ResultEnum.SUCCESS) {
                 return Promise.reject(res.msg);
               }
               emit('change');
@@ -287,34 +226,16 @@
     }
 
     function getInfo() {
-      userInfo({ userId: formParams.value.username }).then((res) => {
-        const params = {
-          userId: formParams.value.username,
-          deleteStatus: parseInt(res.deleteStatus),
-          isEnable: res.isEnable,
-          email: res.email,
-          mobile: res.mobile,
-          nickname: res.nickname,
-          password: res.password,
-          passwordRe: res.password,
-          remark: res.remark,
-          sex: res.sex,
-          username: res.username,
-          roleIds: res.roleIds,
-          postId: res.postId ? res.postId.split(',').map(Number) : null,
-          deptId: res.deptId || null,
-          staffNo: res.staffNo,
-        };
-        formParams.value = Object.assign(formParams.value, params);
+      userInfo({ userId: Number(formParams.value.userId)}).then((res) => {
+        Object.entries(res).forEach(([key, value]) => {
+          formParams.value[key] = value
+        })
+        formParams.value.roleIdList = res.roleIds;
+        formParams.value.passwordRe = res.password;
         isDrawer.value = true;
       });
     }
-
-    onMounted(async () => {
-      const list = await getDictTypeList({ dictType: 'sys_user_sex' });
-      sexList.value = list;
-    });
-
+   
     defineExpose({
       openDrawer,
       closeDrawer,

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

@@ -85,7 +85,7 @@
 
   const formParams = ref<UserType>(defaultValueRef());
 
-  async function openDrawer(username?,userId?) {
+  async function openDrawer(username?, userId? ) {
     formParams.value.username = username;
     formParams.value.userId = userId;
     isDrawer.value = true;
@@ -106,8 +106,8 @@
         return message.error('两次密码不一致');
       }
       const addData = {
-        password: formParams.value.password,
-        userId: formParams.value.userId!,
+        newPwd: formParams.value.password as string,
+        userId: Number(formParams.value.userId),
       };
       resetCode(addData).then(() => {
         emit('change');

+ 53 - 83
src/views/system/user/columns.ts

@@ -1,93 +1,57 @@
 import { h } from 'vue';
 import { ElTag } from 'element-plus';
 import { BasicColumn } from '@/components/Table';
-
-// export const columns: BasicColumn[] = [
-//   // {
-//   //   type: 'selection',
-//   // },
-//   {
-//     label: '账号',
-//     prop: 'username',
-//   },
-//   {
-//     label: '用户名',
-//     prop: 'nickname',
-//   },
-//   {
-//     label: '手机',
-//     prop: 'mobile',
-//   },
-//   {
-//     label: '状态',
-//     prop: 'isEnable',
-//     render(record) {
-//       return h(
-//         ElTag,
-//         {
-//           type: record.row.isEnable ? 'success' : 'danger',
-//         },
-//         {
-//           default: () => (record.row.isEnable ? '启用' : '禁用'),
-//         },
-//       );
-//     },
-//   },
-//   {
-//     label: '角色',
-//     prop: 'roleName',
-//   },
-//   {
-//     label: '租户',
-//     prop: 'tenantName',
-//   },
-//   {
-//     label: '部门',
-//     prop: 'deptName',
-//   },
-//   {
-//     label: '岗位',
-//     prop: 'postName',
-//   },
-//   // {
-//   //   label: '描述',
-//   //   prop: 'remark',
-//   // },
-//   {
-//     label: '创建时间',
-//     prop: 'createTime',
-//   },
-// ];
+import type { RoleListItem } from '@/api/system/user-operate';
+import type {DeptTreeItem } from '@/api/system/user-query'
 
 export const columns: BasicColumn[] = [
   {
     type: 'selection',
   },
-
   {
     label: '工号',
     prop: 'staffNo',
+    render(record) {
+     return h(
+        'span',
+        record.row.staffNo ? record.row.staffNo : '--'
+      );
+    },
   },
   {
     label: '登录账号',
     prop: 'username',
+    render(record) {
+     return h(
+        'span',
+        record.row.username ? record.row.username : '--'
+      );
+    },
   },
-  // {
-  //   label: '用户名',
-  //   prop: 'nickname',
-  // },
   {
     label: '姓名',
-    prop: 'nickname',
+    prop: 'realname',
+    render(record) {
+     return h(
+        'span',
+        record.row.realname ? record.row.realname : '--'
+      );
+    },
   },
   {
     label: '手机',
     prop: 'mobile',
+    render(record) {
+     return h(
+        'span',
+        record.row.mobile ? record.row.mobile : '--'
+      );
+    },
   },
   {
     label: '状态',
     prop: 'isEnable',
-    minWidth: 40,
+    minWidth: 50,
     render(record) {
       return h(
         ElTag,
@@ -95,43 +59,49 @@ export const columns: BasicColumn[] = [
           type: record.row.isEnable ? 'success' : 'danger',
         },
         {
-          default: () => (record.row.isEnable ? '正常' : '锁定'),
+          default: () => (record.row.isEnable ? '正常' : '锁定')
         },
       );
     },
   },
   {
     label: '角色',
-    prop: 'roleName',
+    prop: 'roleList',
+    render(record) {
+      return h(
+        'span',
+        tranformRoleList(record.row.roleList)
+      );
+    },
   },
-  // {
-  //   label: '租户',
-  //   prop: 'tenantName',
-  // },
-  // {
-  //   label: '部门',
-  //   prop: 'deptName',
-  // },
   {
     label: '组织',
     prop: 'deptName',
     minWidth: 100,
+     render(record) {
+      return h(
+        'span',
+        tranformDeptList(record.row.deptList)
+      );
+    },
   },
   {
     label: '认证方式',
     prop: 'certify',
   },
-  // {
-  //   label: '岗位',
-  //   prop: 'postName',
-  // },
-  // {
-  //   label: '描述',
-  //   prop: 'remark',
-  // },
   {
     label: '创建时间',
-    prop: 'createTime',
+    prop: 'createdAt',
     minWidth: 70,
   },
 ];
+
+const tranformRoleList = (arr:RoleListItem[]) => {
+  if (arr && arr.length === 0) return '--'
+  return arr?.map(item => item.roleName).join(',')
+}
+
+const tranformDeptList = (arr:DeptTreeItem[]) => {
+  if (arr && arr.length === 0) return '--'
+  return arr?.map(item => item.deptName).join(',')
+}

+ 12 - 12
src/views/system/user/component/ActionColomns.vue

@@ -2,9 +2,9 @@
   <div class="flex items-center justify-center">
     <el-space :size="space">
       <div v-for="item in props.actionIcons" :key="item.label" @click="item.onClick">
-        <div v-if="item.label === '重置密码'" style="font-size: 12px;color: #629bf9;cursor: pointer;">{{item.label}}</div>
-        <el-tooltip v-else :content="item.label" effect="light">
-          <el-icon v-if="props.style === 'icon'" :color="props.color" :size="props.size">
+        <div  v-if="item.label === '重置密码'" style="font-size: 12px;color: #629bf9;cursor: pointer;">{{item.label}}</div>
+        <el-tooltip v-else :content="item.label" effect="light" disabled>
+          <el-icon v-if="props.style === 'icon'" :color="props.color" :size="props.size" >
             <component :is="item.icon" />
           </el-icon>
           <img
@@ -19,15 +19,15 @@
 </template>
 
 <script setup lang="ts">
-  import { ActionItem } from '@/components/Table';
-
-  const props = defineProps<{
-    space: number;
-    size: number;
-    color: string;
-    style: 'img' | 'icon';
-    actionIcons: ActionItem[];
-  }>();
+import { ActionItem } from '@/components/Table';
+  
+const props = defineProps<{
+  space: number;
+  size: number;
+  color: string;
+  style: 'img' | 'icon';
+  actionIcons: ActionItem[];
+}>();
 </script>
 
 <style scoped></style>

+ 135 - 0
src/views/system/user/component/SearchForm.vue

@@ -0,0 +1,135 @@
+<!--
+ * @since: 2025-01-10
+ * SearchFrom.vue
+-->
+<template>
+   <el-form ref="searchFormRef" :inline="true" :model="searchForm" class="form-inline">
+     <el-form-item  label-position="left" prop="queryType">
+      <el-select v-model="searchForm.queryType" placeholder="选择类型" class="type-select">
+          <el-option
+            v-for="item in queryTypeSelect"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+        <el-input
+          :style="{ width: '180px' }"
+          v-model="searchForm.queryTypeContent"
+          clearable
+          placeholder="请输入查找内容"
+          :disabled="!searchForm.queryType"
+        />
+    </el-form-item>
+    <el-form-item label="请选择角色:"  label-position="left" prop="roleId">
+      <el-select v-model="searchForm.roleId" placeholder="请选择角色" class="protocal-select">
+          <el-option
+            v-for="item in roleData"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+    </el-form-item>
+    <el-form-item label="请选择组织:" label-position="left" prop="deptId">
+       <el-tree-select
+          v-model="searchForm.deptId"
+          :data="departmentList"
+          :render-after-expand="false"
+          :default-expand-all="true"
+          check-strictly
+          placeholder="请选择组织"
+          class="protocal-select"
+        />
+    </el-form-item>
+    <el-form-item>
+      <el-button type="primary" :icon="Filter" @click="serachHandle">查询</el-button>
+      <el-button :icon="Refresh" @click="resetFormHandle(searchFormRef)">重置</el-button>
+    </el-form-item>
+   </el-form>
+</template>
+
+<script setup lang="ts">
+  import { ref } from 'vue';
+  import { Filter, Refresh } from '@element-plus/icons-vue';
+  import { FormInstance } from 'element-plus';
+  import { queryTypeSelect } from '../constant';
+  import { OptionsProps } from '../types';
+    
+  interface Props {
+    roleData: OptionsProps[],
+    departmentList: OptionsProps[]
+  }
+  const props = defineProps<Props>();
+  console.log('props: ', props.roleData);
+  
+  interface SearchFromProps {
+    queryType: string;
+    queryTypeContent: string;
+    roleId: string;
+    deptId: string;
+  }
+
+  const searchForm = ref<SearchFromProps>({
+    queryType: '',
+    queryTypeContent: '',
+    roleId: '',
+    deptId: ''
+  })
+
+ // 重置表单
+  const searchFormRef = ref<FormInstance>();
+  const resetFormHandle = (formEl: FormInstance | undefined) => {
+    if (!formEl) return;
+    formEl?.resetFields();
+    searchForm.value.queryTypeContent = ''
+    emit('resetForm');
+  };
+
+  const emit = defineEmits(['getTableData', 'resetForm']);
+  // 获取列表数据
+  const serachHandle = () => {
+    emit('getTableData', searchForm.value);
+  };
+
+  const getSearchFromData = () => {
+    return searchForm.value;
+  };
+
+  defineExpose({ getSearchFromData, resetFormHandle });
+</script>
+
+<style scoped lang="scss">
+
+.type-select {
+    width: 100px;
+  }
+
+  .protocal-select {
+    width: 160px;
+  }
+
+  .query-head {
+    padding: 24px 57px 18px 21px;
+  }
+
+  .protocal-select {
+    width: 160px;
+  }
+  .form-inline .el-input {
+    --el-input-width: 160px;
+  }
+
+  .form-inline .el-select {
+    --el-select-width: 160px;
+  }
+  .el-radio.el-radio--large {
+    height: 22px;
+  }
+  .el-form--inline .el-form-item {
+    margin-right: 40px;
+  }
+  .el-form {
+    padding: 20px 0 20px 20px;
+  }
+</style>

+ 7 - 2
src/views/system/user/constant.ts

@@ -4,7 +4,7 @@ export const queryTypeSelect = [
     label: '工号',
   },
   {
-    value: 'nickname',
+    value: 'realname',
     label: '姓名',
   },
   {
@@ -15,7 +15,7 @@ export const queryTypeSelect = [
 
 export enum QuerySelect {
   'staffNo' = 'staffNo',
-  'nickname' = 'nickname',
+  'realname' = 'realname',
   'mobile' = 'mobile',
 }
 
@@ -33,3 +33,8 @@ export enum QuerySelect {
 //     label: '手机号',
 //   },
 // ];
+
+export const DEFAULT_DRAWER = {
+  TITLE: '添加用户',
+  WIDTH: 450
+}

+ 22 - 16
src/views/system/user/types/index.ts

@@ -1,19 +1,4 @@
-// export interface formParamsType {
-//   userId?: number | null;
-//   roleIds?: number[];
-//   isEnable: boolean;
-//   email: string;
-//   mobile: string;
-//   nickname: string;
-//   password: string;
-//   passwordRe: string;
-//   remark: string;
-//   sex: string;
-//   username: string;
-//   deptId?: null;
-//   postId?: number[];
-// }
-
+import { PaginationRequest } from "@/types/common/type";
 export interface formParamsType {
   userId?: number | null;
   roleIds?: number[];
@@ -37,3 +22,24 @@ export enum EditType {
 }
 
 export const ROOT_USER = 'root';
+
+export interface OptionsProps {
+  value: string | number,
+  label: string
+}
+
+export interface QueryParamas {
+  username: string, // 登录用户
+  realname?: string, // 用户姓名
+  mobile?: string, // 手机号
+  staffNo?: string, // 工号
+  deptId?: number, // 部门
+  roleId?: number; // 角色id
+}
+export type SearchParamsProps = PaginationRequest & {queryParam: QueryParamas}
+
+export enum RoleType {
+  HORMAL_USER = 0,
+  SUPER_ADMIN = 1,
+  TENANT_ADMIN = 2,
+}

+ 140 - 74
src/views/system/user/user.vue

@@ -1,13 +1,17 @@
 <template>
   <div class="user-page">
-    <UserQuery :departmentList="departmentList" />
+    <SearchForm ref="searchFormRef" 
+      :departmentList="departmentList"
+      :roleData="roleData" 
+      @get-table-data="onSearchCommit" 
+      @reset-form="onResetForm"/>
     <div class="user-list">
       <BasicTable
         :columns="columns"
         :data-source="userList"
         :row-key="(row) => row.userId"
         ref="basicTableRef"
-        :pagination="{ total: totalCount, pageSize: pageSize, hideOnSinglePage: false }"
+        :pagination="{ total: total, pageSize: params.pageSize, hideOnSinglePage: false }"
         :actionColumn="actionColumn"
         :tableSetting="{
           size: false,
@@ -31,7 +35,7 @@
               </template>
               添加用户
             </el-button>
-            <el-button @click="openAddAdminDrawer" v-if="userStore?.info?.username === ROOT_USER">
+            <el-button @click="openAddAdminDrawer"  v-if="isSysTenant">
               <template #icon>
                 <el-icon>
                   <Plus />
@@ -61,14 +65,17 @@
       :title="drawerTitle"
       @change="reloadTable"
       :departmentList="departmentList"
+      :roleData="roleData"
+      :width="450"
     />
     <ResetCodeDrawer ref="ResetCodeDrawerRef" :title="drawerTitle" @change="reloadTable" />
     <CreateAdminDrawer
-      v-if="userStore?.info?.username === ROOT_USER"
-      ref="createAdminDrawer"
+      ref="createAdminDrawerRef"
       :title="createAdminTitle"
       @change="reloadTable"
       :editType="createAdminType"
+      :roleData="roleData"
+      :width="450"
     />
     <AddUser
       v-if="showAddPopover"
@@ -81,63 +88,64 @@
 </template>
 
 <script lang="ts" setup>
-  import { h, reactive, ref, onMounted, onBeforeUnmount } from 'vue';
-  import { BasicTable, BasicColumn } from '@/components/Table';
+  import { h, reactive, ref, computed, onMounted } from 'vue';
+  import { ElMessage, ElMessageBox } from 'element-plus';
+  import { storeToRefs } from 'pinia';
   import { Plus, DocumentAdd } from '@element-plus/icons-vue';
-  import { roleAllList } from '@/api/system/role';
+  import { isEmpty } from 'lodash-es';
   import editIcon from '@/assets/images/table/table-edit.png';
   import deleteIcon from '@/assets/images/table/table-delete.png';
   import { useUserStore } from '@/store/modules/user';
+  import { BasicTable, BasicColumn } from '@/components/Table';
+  import { columns } from './columns';
+  // import useUser from './hooks/use-user';
+  import { EditType, OptionsProps, SearchParamsProps } from './types';
+  import { RoleTypeEnum } from '@/types/role/constants';
+  import useSceneInfos from '@/hooks/useSceneInfos';
+  import { getAllDepartments, DeptTreeItem } from '@/api/system/user-query';
+  import { getRoles } from '@/api/system/role';
+  import { getUserList, UserLisItem, deleteUser } from '@/api/system/user-operate';
+  import { ResultEnum } from '@/enums/httpEnum';
+  import { useTargetTenantIdSetting } from '@/utils/useTargetTenantIdSetting';
+  import SearchForm from './component/SearchForm.vue';
+  import AddUser from './component/AddUser.vue';
+  import ActionColomns from './component/ActionColomns.vue';
   import CreateDrawer from './CreateDrawer.vue';
   import ResetCodeDrawer from './ResetCodeDrawer.vue';
   import CreateAdminDrawer from './CreateAdminDrawer.vue';
-  import { columns } from './columns';
-  import ActionColomns from './component/ActionColomns.vue';
-  import AddUser from './component/AddUser.vue';
-  // import { Search } from '@element-plus/icons-vue';
-  import UserQuery from './component/UserQuery.vue';
-  import useUser from './hooks/use-user';
-  import { storeToRefs } from 'pinia';
-  import { EditType } from './types';
-  import { ROOT_USER } from './types';
-  import { deptTreeList } from '@/api/auth/dept';
-  import useSceneInfos from '@/hooks/useSceneInfos';
-  import { ElMessage, ElMessageBox } from 'element-plus';
-  // import { TreeProps,ElTreeItem } from 'element-plus/es/components/tree-v2/src/types';
-
+  
   const sceneInfos = useSceneInfos();
   const { calculateTreeData } = sceneInfos;
-
-  const useUserDetail = useUser();
-  const { userList, page, pageSize, totalCount } = storeToRefs(useUserDetail);
-  const { conditionSearch, userDel, getList, resetArgs } = useUserDetail;
-
+  // const useUserDetail = useUser();
+  // const { page, pageSize } = storeToRefs(useUserDetail);
   const userStore = useUserStore();
-
-  const basicTableRef = ref();
+  const userInfo: object = userStore.getUserInfo || {};
+  const isSuperAdmin = computed(() => userInfo['roleType'] === RoleTypeEnum.SUPER_ADMIN);
+  const username = computed(() => userInfo['username']);
+  const userList = ref<UserLisItem[]>([]);
+  const searchFormRef = ref<InstanceType<typeof SearchForm>>();
+  const basicTableRef = ref<InstanceType<typeof BasicTable>>();
+  const createDrawerRef = ref<InstanceType<typeof CreateDrawer>>();
+  const ResetCodeDrawerRef = ref<InstanceType<typeof ResetCodeDrawer>>();
+  const createAdminDrawerRef = ref<InstanceType<typeof CreateAdminDrawer>>();
   const rowKeys = ref([]);
   const rowKeysName = ref([]);
   const tableData = ref();
-  const createDrawerRef = ref();
-  const ResetCodeDrawerRef = ref();
-  const createAdminDrawer = ref();
   const drawerTitle = ref('添加用户');
   const createAdminTitle = ref('添加租户管理员');
-  const roleData = ref([]);
-  const departmentList = ref<any[]>([]);
-
+  const roleData = ref<OptionsProps[]>([]);
+  const departmentList = ref<OptionsProps[]>([]);
   const createAdminType = ref(EditType.create);
+  const { isSysTenant } = useTargetTenantIdSetting();
 
   const handlePageNumChange = (pageNum) => {
-    console.log('pageNum', pageNum);
-
     page.value = pageNum;
-    conditionSearch();
+    loadPageData();
   };
   const handlePageSizeChange = (size) => {
     page.value = 1;
     pageSize.value = size;
-    conditionSearch();
+    loadPageData();
   };
 
   const actionColumn: BasicColumn = reactive({
@@ -152,7 +160,7 @@
         color: '#629bf9',
         style: 'img',
         size: 16,
-        actionIcons: [
+        actionIcons: ( record.row.roleType !== RoleTypeEnum.SUPER_ADMIN ?[
           {
             label: '编辑',
             icon: editIcon,
@@ -167,7 +175,12 @@
             label: '重置密码',
             onClick: handleResetCode.bind(null, record.row),
           },
-        ],
+        ] : [
+          {
+            label: '重置密码',
+            onClick: handleResetCode.bind(null, record.row),
+          },
+        ]),
       });
     },
   });
@@ -185,25 +198,27 @@
   }
 
   function reloadTable() {
-    conditionSearch();
+    loadPageData()
   }
 
   const openAddSingleDrawer = () => {
     drawerTitle.value = '添加用户';
-    const { openDrawer } = createDrawerRef.value;
-    openDrawer();
+    if (!isSysTenant.value) {
+      createAdminDrawerRef.value?.openDrawer();
+    } else {
+      createDrawerRef.value?.openDrawer();
+    }
+  
   };
   const openAddAdminDrawer = () => {
     createAdminTitle.value = '添加租户管理员';
-    const { openDrawer } = createAdminDrawer.value;
-    openDrawer();
+    createAdminDrawerRef.value?.openDrawer();
+    createAdminType.value = EditType.create;
   };
 
   const showAddPopover = ref<boolean>(false);
-
   const openAddMultipleDrawer = () => {
     showAddPopover.value = true;
-    console.log('showAddPopover', showAddPopover.value);
   };
 
   //传个方法到子组件,当上传成功后把showAddPopover的值改为false;
@@ -212,37 +227,36 @@
   };
 
   function handleEdit(record: Recordable) {
-    console.log('点击了编辑', record);
     drawerTitle.value = '编辑用户';
-    const { openDrawer } = createDrawerRef.value;
-    openDrawer(record.userId);
+    if (record.roleType === RoleTypeEnum.TENANT_ADMIN) {
+      createAdminDrawerRef.value?.openDrawer(record.id);
+      createAdminType.value = EditType.edit;
+    } else {
+      createDrawerRef.value?.openDrawer(record.id);
+    }
   }
 
   function handleResetCode(record: Recordable) {
     drawerTitle.value = '重置密码';
-    const { openDrawer } = ResetCodeDrawerRef.value;
-    openDrawer(record.username, record.userId);
+    ResetCodeDrawerRef.value?.openDrawer(record.username, record.id);
   }
 
   function handleDelete(record: Recordable) {
-    const delDetail = {
-      userId: record.userId,
-      nickname: record.nickname,
-      username: record.username,
-      mobile: record.mobile,
-      staffNo: record.staffNo,
-    };
     ElMessageBox.confirm('确认要删除该用户吗', {
       confirmButtonText: '确认',
       cancelButtonText: '取消',
       type: 'warning',
     })
       .then(() => {
-        userDel(delDetail);
-        ElMessage({
-          type: 'success',
-          message: '删除成功',
-        });
+        deleteUser({ userId: record.id }).then(res => {
+          if (res.code === ResultEnum.SUCCESS) {
+            ElMessage({
+              type: 'success',
+              message: '删除成功',
+            });
+            loadPageData()
+          }
+        })
       })
       .catch(() => {
         ElMessage({
@@ -253,26 +267,78 @@
   }
 
   onMounted(async () => {
-    getList();
-    deptTreeList().then((res) => {
+    loadPageData()
+    getAllDepartments().then((res) => {
       departmentList.value = calculateTreeData(
         res,
         { level: 3, valueKey: 'deptId', labelKey: 'deptName' },
         1,
       );
     });
-    const res = await roleAllList();
-    roleData.value = res.list.map((item: any) => {
+    const res = await getRoles() || [];
+    roleData.value = res.map((item: any) => {
       return {
-        value: item.roleId,
-        label: item.roleName,
+        value: item.id,
+        label: item.roleName + 'test',
       };
     });
   });
 
-  onBeforeUnmount(() => {
-    resetArgs();
-  });
+  // 基本参数
+  const params = reactive<SearchParamsProps>({
+    pageNumber: 1,
+    pageSize: 10,
+    queryParam: {
+      username: username.value
+    }
+  })
+
+  // 获取页面数据
+  const total = ref(0);
+  const loadPageData = () => {
+    const searchFormData = searchFormRef.value?.getSearchFromData();
+    if (searchFormData) {
+      const { queryType, queryTypeContent } = searchFormData;
+      Object.entries(searchFormData).forEach(([key, value]) => {
+        if (!isEmpty(value)) {
+          if (['deptId, roleId'].includes(key)) {
+            params.queryParam[key] = value
+          }
+          params.queryParam[queryType] = queryTypeContent;
+        } 
+      })
+      // 删除多余参数
+      delteExtraParams(queryType);
+      getUserList(params).then(res => {
+        userList.value = res.records;
+        userList.value.forEach(item =>{item.certify = "本地认证";})
+        total.value = res.totalPage;
+      })
+    }
+   
+  }
+  const extraParams = ['realname', 'mobile', 'staffNo'];
+  const delteExtraParams = (type) => {
+    const needDeleteArr = extraParams.filter(item => item !== type);
+    needDeleteArr.forEach(item => {
+      delete params.queryParam[item];
+    });
+  }
+
+  //  获取列表数据
+  const onSearchCommit = () => {
+    loadPageData();
+  };
+
+  // 重置列表数据
+  const onResetForm = () => {
+    params.pageNumber = 1;
+    params.pageSize = 10
+    params.queryParam = {
+      username: username.value
+    }
+    loadPageData();
+  }
 </script>
 <style scoped>
   .user-page {

+ 1 - 1
utils/devProxy/local/proxy.ts

@@ -3,7 +3,7 @@ import path from 'path';
 
 // 连后端本机时的代理staff环境
 const proxyStaff: PROXY_TYPE = {
-  serverHost: 'http://192.168.13.68/eye_api_bak',
+  serverHost: 'http://192.168.13.68:8808/',
   loginHost: 'http://192.168.13.68/skyeye-login/',
   skyeyeFileUploadHost: 'http://192.168.13.102:9000/',
   nvrDownload: 'http://192.168.13.68/nvr_download',