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

Merge branch 'user' into 'dev'

zjc界面调整

See merge request skyeye/skyeye_frontend/skyeye-admin!26
航飞 楼 1 год назад
Родитель
Сommit
a0d167feda

+ 3 - 1
.env.development

@@ -17,7 +17,9 @@ VITE_DROP_CONSOLE = true
 #VITE_PROXY=[["/skyeye-admin-api","http://172.16.23.144/skyeye-admin-api"],[],["/eye_api_bak","http://172.16.23.144/eye_api"],["/push_stream_host","http://172.16.23.144/push_stream_host"],["/skyeye-login","http://172.16.23.144/skyeye-login"],["/ws_api_bak","ws://172.16.23.144/ws_api_bak"]]
 #VITE_PROXY=[["/skyeye-admin-api","http://172.16.23.144/skyeye-admin-api"],[],["/eye_api_bak","http://172.16.23.144/eye_api"],["/push_stream_host","http://172.16.23.144/push_stream_host"],["/skyeye-login","http://172.16.23.144/skyeye-login"],["/ws_api_bak","ws://172.16.23.144/ws_api_bak"]]
 # VITE_PROXY=[["/skyeye-admin-api","http://192.168.32.47/skyeye-admin-api"],["/eye_api","http://192.168.32.47/eye_api"],["/push_stream_host","http:/192.168.32.47/push_stream_host"],["/skyeye-login","http://192.168.32.47/skyeye-login"]]
 # VITE_PROXY=[["/skyeye-admin-api","http://192.168.32.47/skyeye-admin-api"],["/eye_api","http://192.168.32.47/eye_api"],["/push_stream_host","http:/192.168.32.47/push_stream_host"],["/skyeye-login","http://192.168.32.47/skyeye-login"]]
 # VITE_PROXY=[["/skyeye-admin-api","http://192.168.14.68/skyeye-admin-api"],[],["/eye_api_bak","http://192.168.14.68/eye_api"],["/push_stream_host","http://192.168.14.68/push_stream_host"],["/skyeye-login","http://192.168.14.68/skyeye-login"],["/ws_api_bak","ws://192.168.14.68/ws_api_bak"]]
 # VITE_PROXY=[["/skyeye-admin-api","http://192.168.14.68/skyeye-admin-api"],[],["/eye_api_bak","http://192.168.14.68/eye_api"],["/push_stream_host","http://192.168.14.68/push_stream_host"],["/skyeye-login","http://192.168.14.68/skyeye-login"],["/ws_api_bak","ws://192.168.14.68/ws_api_bak"]]
-VITE_PROXY=[["/skyeye-admin-api","http://192.168.14.68/skyeye-admin-api"],[],["/eye_api_bak","http://192.168.14.68/eye_api"],["/push_stream_host","http://192.168.14.68/push_stream_host"],["/skyeye-login","http://192.168.14.68/skyeye-login"],["/ws_api_bak","ws://192.168.14.68/ws_api_bak"]]
+# VITE_PROXY=[["/skyeye-admin-api","http://192.168.13.68/skyeye-admin-api"],[],["/eye_api_bak","http://192.168.13.68/eye_api"],["/push_stream_host","http://192.168.13.68/push_stream_host"],["/skyeye-login","http://192.168.13.68/skyeye-login"],["/ws_api_bak","ws://192.168.13.68/ws_api_bak"]]
+# 中建材 staff
+VITE_PROXY=[["/skyeye-admin-api","http://192.168.13.68:70/skyeye-admin-api"],["/eye_api_bak","http://192.168.13.68:70/eye_api"],["/push_stream_host","http://192.168.13.68:70/push_stream_host"],["/skyeye-login","http://192.168.13.68:70/skyeye-login"],["/ws_api_bak","ws://192.168.13.68:70/ws_api_bak"]]
 
 
 
 
 # API 接口地址
 # API 接口地址

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

@@ -80,6 +80,7 @@ export interface UserTypeDel {
   username?: string;
   username?: string;
   updateTime?: string;
   updateTime?: string;
   createTime?: string;
   createTime?: string;
+  certify?: string;
 }
 }
 
 
 //删除用户
 //删除用户
@@ -132,6 +133,7 @@ export interface QueryUser {
   deptName?: string; //组织
   deptName?: string; //组织
   page?: number; //当前页数
   page?: number; //当前页数
   pageRow?: number; //每页个数
   pageRow?: number; //每页个数
+  deptId?: string;
 }
 }
 
 
 //获取单个用户信息
 //获取单个用户信息
@@ -142,3 +144,17 @@ export function getUserList(params: QueryUser | null): Promise<UserList> {
     params,
     params,
   });
   });
 }
 }
+
+interface ResetCodeType {
+  password?: string;
+  userId?: string;
+}
+
+// 修改密码
+export function resetCode(params: ResetCodeType) {
+  return http.request({
+    url: '/user/changePassword',
+    method: 'POST',
+    params,
+  });
+}

+ 4 - 3
src/hooks/useSceneInfos.ts

@@ -1,13 +1,13 @@
 import { computed, ref } from 'vue';
 import { computed, ref } from 'vue';
 import { CompanyInfoItem, getShopSpaceList, getCamerasByWorkSpace } from '@/api/scene/scene';
 import { CompanyInfoItem, getShopSpaceList, getCamerasByWorkSpace } from '@/api/scene/scene';
 
 
-type ElTreeItem = {
+ type ElTreeItem = {
   value: any;
   value: any;
   label: string;
   label: string;
   children?: ElTreeItem[];
   children?: ElTreeItem[];
 };
 };
 
 
-type TreeProps = {
+ type TreeProps = {
   /** level:1-数据读取至公司 2-数据读取至工厂 3-数据读取至工位 */
   /** level:1-数据读取至公司 2-数据读取至工厂 3-数据读取至工位 */
   level: number;
   level: number;
   labelKey: string;
   labelKey: string;
@@ -36,7 +36,7 @@ export function useSceneInfos() {
     }, []);
     }, []);
   });
   });
 
 
-  const calculateTreeData = (infos: any[], treeProps: TreeProps, level: number): ElTreeItem[] => {
+   const calculateTreeData = (infos: any[], treeProps: TreeProps, level: number): ElTreeItem[] => {
     return infos.map((data) => {
     return infos.map((data) => {
       return {
       return {
         value: data[treeProps.valueKey],
         value: data[treeProps.valueKey],
@@ -70,6 +70,7 @@ export function useSceneInfos() {
     flattenedWorkshops,
     flattenedWorkshops,
     flattendWorkspaces,
     flattendWorkspaces,
     getScenesTree,
     getScenesTree,
+    calculateTreeData,
     getCameraList,
     getCameraList,
   };
   };
 }
 }

+ 10 - 0
src/views/auth/dept/columns.ts

@@ -1,4 +1,5 @@
 import { BasicColumn } from '@/components/Table';
 import { BasicColumn } from '@/components/Table';
+import { h } from 'vue';
 
 
 export const columns: BasicColumn[] = [
 export const columns: BasicColumn[] = [
   // {
   // {
@@ -16,6 +17,15 @@ export const columns: BasicColumn[] = [
   {
   {
     label: '组织名称',
     label: '组织名称',
     prop: 'deptName',
     prop: 'deptName',
+    render(record) {
+      return h(
+        'span',
+        {},
+        {
+          default: () => record.row.deptName + '   (' + record.row.userCount + ')',
+        },
+      );
+    },
   },
   },
   {
   {
     label: '上级组织名称',
     label: '上级组织名称',

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

@@ -41,8 +41,8 @@
           />
           />
         </el-select>
         </el-select>
       </el-form-item> -->
       </el-form-item> -->
-      <el-form-item label="昵称" prop="nickname">
-        <el-input placeholder="请输入昵称" v-model="formParams.nickname" />
+      <el-form-item label="姓名" prop="nickname">
+        <el-input placeholder="请输入姓名" v-model="formParams.nickname" />
       </el-form-item>
       </el-form-item>
       <!-- <el-form-item label="手机" prop="mobile">
       <!-- <el-form-item label="手机" prop="mobile">
         <el-input placeholder="请输入手机" v-model="formParams.mobile" />
         <el-input placeholder="请输入手机" v-model="formParams.mobile" />

+ 228 - 214
src/views/system/user/CreateDrawer.vue

@@ -14,16 +14,25 @@
           :disabled="!isAddUser"
           :disabled="!isAddUser"
         />
         />
       </el-form-item>
       </el-form-item>
-      <!-- <el-form-item label="所属部门" prop="deptId">
-        <el-select v-model="formParams.deptId" placeholder="请选择组织" class="protocal-select">
+      <el-form-item label="所属部门" prop="deptId">
+        <!-- <el-select v-model="formParams.deptId" placeholder="请选择组织" class="protocal-select">
           <el-option
           <el-option
             v-for="item in departmentList"
             v-for="item in departmentList"
             :key="item.deptId"
             :key="item.deptId"
             :label="item.deptName"
             :label="item.deptName"
             :value="item.deptId"
             :value="item.deptId"
           />
           />
-        </el-select>
-      </el-form-item> -->
+        </el-select> -->
+        <el-tree-select
+          v-model="formParams.deptId"
+          :data="props.departmentList"
+          :render-after-expand="false"
+          :default-expand-all="true"
+          check-strictly
+          placeholder="请选择所属部门"
+          class="protocal-select"
+        />
+      </el-form-item>
       <el-form-item v-if="isAddUser" label="密码" prop="password">
       <el-form-item v-if="isAddUser" label="密码" prop="password">
         <el-input
         <el-input
           type="password"
           type="password"
@@ -55,8 +64,8 @@
           />
           />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="昵称" prop="nickname">
-        <el-input placeholder="请输入昵称" v-model="formParams.nickname" />
+      <el-form-item label="姓名" prop="nickname">
+        <el-input placeholder="请输入姓名" v-model="formParams.nickname" />
       </el-form-item>
       </el-form-item>
       <el-form-item label="手机" prop="mobile">
       <el-form-item label="手机" prop="mobile">
         <el-input placeholder="请输入手机" v-model="formParams.mobile" />
         <el-input placeholder="请输入手机" v-model="formParams.mobile" />
@@ -79,231 +88,236 @@
 </template>
 </template>
 
 
 <script lang="ts" setup>
 <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';
+    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, departmentList } = selectContent;
 
 
-  const rules: FormRules = {
-    username: {
-      required: true,
-      message: '登录账号不能为空',
-      trigger: 'blur',
-    },
-    deptId: {
-      required: true,
-      message: '部门不能为空',
-      trigger: 'change',
-      type: 'number',
-    },
-    roleIds: {
-      required: true,
-      message: '角色不能为空',
-      trigger: 'change',
-      type: 'array',
-    },
-    password: {
-      required: true,
-      message: '密码不能为空',
-      trigger: 'blur',
-    },
-    passwordRe: {
-      required: true,
-      message: '密码不能为空',
-      trigger: 'blur',
-    },
-    nickname: {
-      required: true,
-      message: '用户名不能为空',
-      trigger: 'blur',
-    },
-    mobile: {
-      required: true,
-      message: '手机不能为空',
-      trigger: 'blur',
-    },
-    staffNo: {
-      required: true,
-      message: '工号不能为空',
-      trigger: 'blur',
-    },
-  };
+    const selectContent = useSelectContent();
+    const { roleList } = selectContent;
 
 
-  interface PostOption {
-    postName: string;
-    postId: number;
-  }
+    const rules: FormRules = {
+      username: {
+        required: true,
+        message: '登录账号不能为空',
+        trigger: 'blur',
+      },
+      deptId: {
+        required: true,
+        message: '部门不能为空',
+        trigger: 'change',
+        type: 'number',
+      },
+      roleIds: {
+        required: true,
+        message: '角色不能为空',
+        trigger: 'change',
+        type: 'array',
+      },
+      password: {
+        required: true,
+        message: '密码不能为空',
+        trigger: 'blur',
+      },
+      passwordRe: {
+        required: true,
+        message: '密码不能为空',
+        trigger: 'blur',
+      },
+      nickname: {
+        required: true,
+        message: '用户名不能为空',
+        trigger: 'blur',
+      },
+      mobile: {
+        required: true,
+        message: '手机不能为空',
+        trigger: 'blur',
+      },
+      staffNo: {
+        required: true,
+        message: '工号不能为空',
+        trigger: 'blur',
+      },
+    };
 
 
-  const emit = defineEmits(['change']);
-  const { getDictTypeList } = useDictionary();
+    interface PostOption {
+      postName: string;
+      postId: number;
+    }
 
 
-  const props = defineProps({
-    title: {
-      type: String,
-      default: '添加用户',
-    },
-    width: {
-      type: Number,
-      default: 450,
-    },
-  });
+    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 defaultValueRef = () => ({
-    password: '',
-    passwordRe: '',
-    deptId: null,
-    username: '',
-    staffNo: '',
-    mobile: '',
-    isEnable: true,
-    nickname: '',
-    roleIds: [],
-  });
+    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: [],
+    });
 
 
-  const message = ElMessage;
-  const formRef: any = ref(null);
-  const isDrawer = ref(false);
-  const subLoading = ref(false);
+    const message = ElMessage;
+    const formRef: any = ref(null);
+    const isDrawer = ref(false);
+    const subLoading = ref(false);
 
 
-  const formParams = ref<UserType>(defaultValueRef());
+    const formParams = ref<UserType>(defaultValueRef());
 
 
-  const isAddUser = computed(() => {
-    return props.title === '添加用户';
-  });
+    const isAddUser = computed(() => {
+      return props.title === '添加用户';
+    });
 
 
-  async function openDrawer(username?) {
-    const postListRes = await postList();
-    postDataList.value = postListRes;
-    if (username) {
-      formParams.value.username = username;
-      getInfo();
-      return;
+    async function openDrawer(username?) {
+      const postListRes = await postList();
+      postDataList.value = postListRes;
+      if (username) {
+        formParams.value.username = username;
+        getInfo();
+        return;
+      }
+      isDrawer.value = true;
     }
     }
-    isDrawer.value = true;
-  }
 
 
-  function closeDrawer() {
-    isDrawer.value = false;
-  }
+    function closeDrawer() {
+      isDrawer.value = false;
+    }
 
 
-  function formSubmit() {
-    formRef.value.validate((valid) => {
-      if (!valid) {
-        return message.error('请填写完整信息');
-      }
-      // 克隆
-      const params = cloneDeep(formParams.value);
+    function formSubmit() {
+      formRef.value.validate((valid) => {
+        if (!valid) {
+          return message.error('请填写完整信息');
+        }
+        // 克隆
+        const params = cloneDeep(formParams.value);
 
 
-      // 处理部门
-      console.log('params', params);
+        // 处理部门
+        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)
-          .then((res) => {
-            if (res.code !== 200) {
-              return Promise.reject(res.msg);
-            }
-            emit('change');
-            handleReset();
-            closeDrawer();
-            ElMessage.success('添加成功');
-          })
-          .catch((error) => {
-            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)
-          .then((res) => {
-            if (res.code !== 200) {
-              return Promise.reject(res.msg);
-            }
-            emit('change');
-            handleReset();
-            closeDrawer();
-            ElMessage.success('修改成功');
-          })
-          .catch((error) => {
-            ElMessage.error(error);
-          });
-      }
-    });
-  }
+        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)
+            .then((res) => {
+              if (res.code !== 200) {
+                return Promise.reject(res.msg);
+              }
+              emit('change');
+              handleReset();
+              closeDrawer();
+              ElMessage.success('添加成功');
+            })
+            .catch((error) => {
+              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)
+            .then((res) => {
+              if (res.code !== 200) {
+                return Promise.reject(res.msg);
+              }
+              emit('change');
+              handleReset();
+              closeDrawer();
+              ElMessage.success('修改成功');
+            })
+            .catch((error) => {
+              ElMessage.error(error);
+            });
+        }
+      });
+    }
 
 
-  function handleReset() {
-    formRef.value.resetFields();
-    formParams.value = Object.assign(formParams.value, defaultValueRef());
-  }
+    function handleReset() {
+      formRef.value.resetFields();
+      formParams.value = Object.assign(formParams.value, defaultValueRef());
+    }
 
 
-  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);
-      isDrawer.value = true;
-    });
-  }
+    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);
+        isDrawer.value = true;
+      });
+    }
 
 
-  onMounted(async () => {
-    const list = await getDictTypeList({ dictType: 'sys_user_sex' });
-    sexList.value = list;
-  });
+    onMounted(async () => {
+      const list = await getDictTypeList({ dictType: 'sys_user_sex' });
+      sexList.value = list;
+    });
 
 
-  defineExpose({
-    openDrawer,
-    closeDrawer,
-  });
+    defineExpose({
+      openDrawer,
+      closeDrawer,
+    });
 </script>
 </script>

+ 131 - 0
src/views/system/user/ResetCodeDrawer.vue

@@ -0,0 +1,131 @@
+<template>
+  <el-drawer v-model="isDrawer" :size="width" :title="props.title" @close="handleReset">
+    <el-form
+      :model="formParams"
+      :rules="rules"
+      ref="formRef"
+      label-placement="left"
+      :label-width="80"
+    >
+      <el-form-item label="登录账号" prop="username">
+        <el-input placeholder="请输入登录账号" v-model="formParams.username" disabled />
+      </el-form-item>
+      <el-form-item label="新密码" prop="password">
+        <el-input
+          type="password"
+          show-password-on="mousedown"
+          placeholder="请输入密码"
+          v-model="formParams.password"
+        />
+      </el-form-item>
+      <el-form-item label="确认密码" prop="passwordRe">
+        <el-input
+          type="password"
+          show-password-on="mousedown"
+          placeholder="请输入密码"
+          v-model="formParams.passwordRe"
+        />
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <el-space>
+        <el-button @click="handleReset">重置</el-button>
+        <el-button type="primary" :loading="subLoading" @click="formSubmit">提交</el-button>
+      </el-space>
+    </template>
+  </el-drawer>
+</template>
+
+<script lang="ts" setup>
+  import { ref } from 'vue';
+  import { FormRules, ElMessage } from 'element-plus';
+  import { cloneDeep } from 'lodash-es';
+  import { UserType, resetCode } from '@/api/system/user-operate';
+
+  const rules: FormRules = {
+    username: {
+      required: true,
+      message: '登录账号不能为空',
+      trigger: 'blur',
+    },
+    password: {
+      required: true,
+      message: '密码不能为空',
+      trigger: 'blur',
+    },
+    passwordRe: {
+      required: true,
+      message: '密码不能为空',
+      trigger: 'blur',
+    },
+  };
+  const emit = defineEmits(['change']);
+
+  const props = defineProps({
+    title: {
+      type: String,
+      default: '添加用户',
+    },
+    width: {
+      type: Number,
+      default: 450,
+    },
+  });
+
+  const defaultValueRef = () => ({
+    password: '',
+    passwordRe: '',
+  });
+
+  const message = ElMessage;
+  const formRef: any = ref(null);
+  const isDrawer = ref(false);
+  const subLoading = ref(false);
+
+  const formParams = ref<UserType>(defaultValueRef());
+
+  async function openDrawer(username?) {
+    formParams.value.username = username;
+    isDrawer.value = true;
+  }
+
+  function closeDrawer() {
+    isDrawer.value = false;
+  }
+
+  function formSubmit() {
+    formRef.value.validate((valid) => {
+      if (!valid) {
+        return message.error('请填写完整信息');
+      }
+      // 克隆
+      const params = cloneDeep(formParams.value);
+      if (params.password != params.passwordRe) {
+        return message.error('两次密码不一致');
+      }
+      const addData = {
+        password: formParams.value.password,
+        userId: formParams.value.username,
+      };
+      resetCode(addData).then(() => {
+        emit('change');
+        handleReset();
+        closeDrawer();
+        ElMessage.success('重置成功');
+      });
+
+      //然后进行调接口
+    });
+  }
+
+  function handleReset() {
+    formRef.value.resetFields();
+    formParams.value = Object.assign(formParams.value, defaultValueRef());
+  }
+
+  defineExpose({
+    openDrawer,
+    closeDrawer,
+  });
+</script>

+ 8 - 2
src/views/system/user/columns.ts

@@ -77,7 +77,7 @@ export const columns: BasicColumn[] = [
   //   prop: 'nickname',
   //   prop: 'nickname',
   // },
   // },
   {
   {
-    label: '昵称',
+    label: '姓名',
     prop: 'nickname',
     prop: 'nickname',
   },
   },
   {
   {
@@ -87,6 +87,7 @@ export const columns: BasicColumn[] = [
   {
   {
     label: '状态',
     label: '状态',
     prop: 'isEnable',
     prop: 'isEnable',
+    minWidth: 40,
     render(record) {
     render(record) {
       return h(
       return h(
         ElTag,
         ElTag,
@@ -114,6 +115,11 @@ export const columns: BasicColumn[] = [
   {
   {
     label: '组织',
     label: '组织',
     prop: 'deptName',
     prop: 'deptName',
+    minWidth: 100,
+  },
+  {
+    label: '认证方式',
+    prop: 'certify',
   },
   },
   // {
   // {
   //   label: '岗位',
   //   label: '岗位',
@@ -126,6 +132,6 @@ export const columns: BasicColumn[] = [
   {
   {
     label: '创建时间',
     label: '创建时间',
     prop: 'createTime',
     prop: 'createTime',
-    minWidth: 100,
+    minWidth: 70,
   },
   },
 ];
 ];

+ 3 - 2
src/views/system/user/component/ActionColomns.vue

@@ -2,7 +2,8 @@
   <div class="flex items-center justify-center">
   <div class="flex items-center justify-center">
     <el-space :size="space">
     <el-space :size="space">
       <div v-for="item in props.actionIcons" :key="item.label" @click="item.onClick">
       <div v-for="item in props.actionIcons" :key="item.label" @click="item.onClick">
-        <el-tooltip :content="item.label" effect="light">
+        <div v-if="item.label === '重置密码'" style="font-size: 10px;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">
           <el-icon v-if="props.style === 'icon'" :color="props.color" :size="props.size">
             <component :is="item.icon" />
             <component :is="item.icon" />
           </el-icon>
           </el-icon>
@@ -11,7 +12,7 @@
             :src="item.icon"
             :src="item.icon"
             :style="{ width: `${props.size}px` }"
             :style="{ width: `${props.size}px` }"
           />
           />
-        </el-tooltip>
+        </el-tooltip>  
       </div>
       </div>
     </el-space>
     </el-space>
   </div>
   </div>

+ 25 - 4
src/views/system/user/component/UserQuery.vue

@@ -31,14 +31,23 @@
       </div>
       </div>
       <div>
       <div>
         <span>请选择组织:</span>
         <span>请选择组织:</span>
-        <el-select v-model="queryDeptName" placeholder="请选择组织" class="protocal-select">
+        <el-tree-select
+          v-model="queryDeptName"
+          :data="props.departmentList"
+          :render-after-expand="false"
+          :default-expand-all="true"
+          check-strictly
+          placeholder="请选择组织"
+          class="protocal-select"
+        />
+        <!-- <el-select v-model="queryDeptName" placeholder="请选择组织" class="protocal-select">
           <el-option
           <el-option
-            v-for="item in departmentList"
+            v-for="item in props.departmentList"
             :key="item.deptId"
             :key="item.deptId"
             :label="item.deptName"
             :label="item.deptName"
             :value="item.deptName"
             :value="item.deptName"
           />
           />
-        </el-select>
+        </el-select> -->
       </div>
       </div>
     </el-space>
     </el-space>
     <div class="flex-1 flex justify-end">
     <div class="flex-1 flex justify-end">
@@ -54,8 +63,14 @@
   import useUser from '../hooks/use-user';
   import useUser from '../hooks/use-user';
   import { storeToRefs } from 'pinia';
   import { storeToRefs } from 'pinia';
 
 
+  interface Props {
+  departmentList: any[];
+}
+
+const props = defineProps<Props>();
+
   const selectContent = useSelectContent();
   const selectContent = useSelectContent();
-  const { roleList, departmentList } = selectContent;
+  const { roleList } = selectContent;
 
 
   const useUserDetail = useUser();
   const useUserDetail = useUser();
   const {
   const {
@@ -69,6 +84,8 @@
   } = storeToRefs(useUserDetail);
   } = storeToRefs(useUserDetail);
   const { conditionSearch } = useUserDetail;
   const { conditionSearch } = useUserDetail;
 
 
+
+
   // 重置查询条件
   // 重置查询条件
   const resetSearch = () => {
   const resetSearch = () => {
     queryType.value = '';
     queryType.value = '';
@@ -93,4 +110,8 @@
   .query-head {
   .query-head {
     padding: 24px 57px 18px 21px;
     padding: 24px 57px 18px 21px;
   }
   }
+
+  .protocal-select {
+    width: 160px;
+  }
 </style>
 </style>

+ 3 - 3
src/views/system/user/hooks/use-user.ts

@@ -71,10 +71,11 @@ export const useUser = defineStore('user-list', () => {
       params.roleName = queryRoleName.value;
       params.roleName = queryRoleName.value;
     }
     }
     if (queryDeptName.value) {
     if (queryDeptName.value) {
-      params.deptName = queryDeptName.value;
+      params.deptId = queryDeptName.value;
     }
     }
     getUserList(params).then((res) => {
     getUserList(params).then((res) => {
       userList.value = res.list;
       userList.value = res.list;
+      userList.value.forEach(item =>{item.certify = "本地认证";})    
       totalCount.value = res.totalCount;
       totalCount.value = res.totalCount;
     });
     });
   };
   };
@@ -83,8 +84,7 @@ export const useUser = defineStore('user-list', () => {
   const getList = () => {
   const getList = () => {
     getUserList(null).then((res) => {
     getUserList(null).then((res) => {
       userList.value = res.list;
       userList.value = res.list;
-      console.log('userList.value', userList.value);
-
+      userList.value.forEach(item =>{item.certify = "本地认证";})
       totalCount.value = res.totalCount;
       totalCount.value = res.totalCount;
     });
     });
   };
   };

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

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div class="user-page">
   <div class="user-page">
-    <UserQuery />
+    <UserQuery  :departmentList="departmentList" />
     <div class="user-list">
     <div class="user-list">
       <BasicTable
       <BasicTable
         :columns="columns"
         :columns="columns"
@@ -56,7 +56,8 @@
         </template>
         </template>
       </BasicTable>
       </BasicTable>
     </div>
     </div>
-    <CreateDrawer ref="createDrawerRef" :title="drawerTitle" @change="reloadTable" />
+    <CreateDrawer ref="createDrawerRef" :title="drawerTitle" @change="reloadTable" :departmentList="departmentList" />
+    <ResetCodeDrawer ref="ResetCodeDrawerRef" :title="drawerTitle" @change="reloadTable" />
     <CreateAdminDrawer
     <CreateAdminDrawer
       v-if="userStore?.info?.username === ROOT_USER"
       v-if="userStore?.info?.username === ROOT_USER"
       ref="createAdminDrawer"
       ref="createAdminDrawer"
@@ -82,6 +83,7 @@
   import deleteIcon from '@/assets/images/table/table-delete.png';
   import deleteIcon from '@/assets/images/table/table-delete.png';
   import { useUserStore } from '@/store/modules/user';
   import { useUserStore } from '@/store/modules/user';
   import CreateDrawer from './CreateDrawer.vue';
   import CreateDrawer from './CreateDrawer.vue';
+  import ResetCodeDrawer from './ResetCodeDrawer.vue';
   import CreateAdminDrawer from './CreateAdminDrawer.vue';
   import CreateAdminDrawer from './CreateAdminDrawer.vue';
   import { columns } from './columns';
   import { columns } from './columns';
   import ActionColomns from './component/ActionColomns.vue';
   import ActionColomns from './component/ActionColomns.vue';
@@ -92,6 +94,13 @@
   import { storeToRefs } from 'pinia';
   import { storeToRefs } from 'pinia';
   import { EditType } from './types';
   import { EditType } from './types';
   import { ROOT_USER } from './types';
   import { ROOT_USER } from './types';
+  import { deptTreeList } from '@/api/auth/dept';
+import useSceneInfos from '@/hooks/useSceneInfos';
+// import { TreeProps,ElTreeItem } from 'element-plus/es/components/tree-v2/src/types';
+
+const sceneInfos = useSceneInfos();
+  const {calculateTreeData } = sceneInfos;
+
 
 
   const useUserDetail = useUser();
   const useUserDetail = useUser();
   const { userList, page, pageSize, totalCount } = storeToRefs(useUserDetail);
   const { userList, page, pageSize, totalCount } = storeToRefs(useUserDetail);
@@ -104,10 +113,12 @@
   const rowKeysName = ref([]);
   const rowKeysName = ref([]);
   const tableData = ref();
   const tableData = ref();
   const createDrawerRef = ref();
   const createDrawerRef = ref();
+  const ResetCodeDrawerRef = ref();
   const createAdminDrawer = ref();
   const createAdminDrawer = ref();
   const drawerTitle = ref('添加用户');
   const drawerTitle = ref('添加用户');
   const createAdminTitle = ref('添加租户管理员');
   const createAdminTitle = ref('添加租户管理员');
   const roleData = ref([]);
   const roleData = ref([]);
+  const departmentList = ref<any[]>([]);
 
 
   const createAdminType = ref(EditType.create);
   const createAdminType = ref(EditType.create);
 
 
@@ -130,7 +141,7 @@
     key: 'action',
     key: 'action',
     fixed: 'right',
     fixed: 'right',
     render(record) {
     render(record) {
-      return h(ActionColomns as any, {
+      return h(ActionColomns as any,{
         space: 20,
         space: 20,
         color: '#629bf9',
         color: '#629bf9',
         style: 'img',
         style: 'img',
@@ -146,6 +157,10 @@
             icon: deleteIcon,
             icon: deleteIcon,
             onClick: handleDelete.bind(null, record.row),
             onClick: handleDelete.bind(null, record.row),
           },
           },
+          {
+            label: '重置密码',
+            onClick: handleResetCode.bind(null, record.row),
+          },
         ],
         ],
       });
       });
     },
     },
@@ -192,6 +207,12 @@
     openDrawer(record.userId);
     openDrawer(record.userId);
   }
   }
 
 
+  function handleResetCode(record: Recordable) {
+    drawerTitle.value = '重置密码';
+    const { openDrawer } = ResetCodeDrawerRef.value;
+    openDrawer(record.userId);
+  }
+
   function handleDelete(record: Recordable) {
   function handleDelete(record: Recordable) {
     const delDetail = {
     const delDetail = {
       userId: record.userId,
       userId: record.userId,
@@ -203,6 +224,9 @@
 
 
   onMounted(async () => {
   onMounted(async () => {
     getList();
     getList();
+    deptTreeList().then((res) => {
+      departmentList.value = calculateTreeData(res, { level: 3, valueKey: 'deptId', labelKey: 'deptName' }, 1);
+    });
     const res = await roleAllList();
     const res = await roleAllList();
     roleData.value = res.list.map((item: any) => {
     roleData.value = res.list.map((item: any) => {
       return {
       return {