Quellcode durchsuchen

用户管理及组织管理调整

zhudie vor 1 Jahr
Ursprung
Commit
98c4d30aa2

+ 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://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.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"]]
+# 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 接口地址

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

@@ -133,6 +133,7 @@ export interface QueryUser {
   deptName?: string; //组织
   page?: number; //当前页数
   pageRow?: number; //每页个数
+  deptId?: string;
 }
 
 //获取单个用户信息
@@ -143,3 +144,17 @@ export function getUserList(params: QueryUser | null): Promise<UserList> {
     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 { CompanyInfoItem, getShopSpaceList, getCamerasByWorkSpace } from '@/api/scene/scene';
 
-type ElTreeItem = {
+ type ElTreeItem = {
   value: any;
   label: string;
   children?: ElTreeItem[];
 };
 
-type TreeProps = {
+ type TreeProps = {
   /** level:1-数据读取至公司 2-数据读取至工厂 3-数据读取至工位 */
   level: number;
   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 {
         value: data[treeProps.valueKey],
@@ -70,6 +70,7 @@ export function useSceneInfos() {
     flattenedWorkshops,
     flattendWorkspaces,
     getScenesTree,
+    calculateTreeData,
     getCameraList,
   };
 }

+ 1 - 1
src/views/auth/dept/columns.ts

@@ -22,7 +22,7 @@ export const columns: BasicColumn[] = [
         'span',
         {},
         {
-          default: () => record.row.deptName + '   (' + record.row.deptId + ')',
+          default: () => record.row.deptName + '   (' + record.row.userCount + ')',
         },
       );
     },

+ 224 - 210
src/views/system/user/CreateDrawer.vue

@@ -15,14 +15,23 @@
         />
       </el-form-item>
       <el-form-item label="所属部门" prop="deptId">
-        <el-select v-model="formParams.deptId" placeholder="请选择组织" class="protocal-select">
+        <!-- <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-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-input
@@ -79,231 +88,236 @@
 </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';
+    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 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 props = defineProps({
+      title: {
+        type: String,
+        default: '添加用户',
+      },
+      width: {
+        type: Number,
+        default: 450,
+      },
+      departmentList:{
+        type: Array,
+        default: [],
+      }
+    });
 
-  const message = ElMessage;
-  const formRef: any = ref(null);
-  const isDrawer = ref(false);
-  const subLoading = ref(false);
+    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 formParams = ref<UserType>(defaultValueRef());
+    const message = ElMessage;
+    const formRef: any = ref(null);
+    const isDrawer = ref(false);
+    const subLoading = ref(false);
 
-  const isAddUser = computed(() => {
-    return props.title === '添加用户';
-  });
+    const formParams = ref<UserType>(defaultValueRef());
 
-  async function openDrawer(username?) {
-    const postListRes = await postList();
-    postDataList.value = postListRes;
-    if (username) {
-      formParams.value.username = username;
-      getInfo();
-      return;
+    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;
+      }
+      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>

+ 8 - 2
src/views/system/user/ResetCodeDrawer.vue

@@ -41,7 +41,7 @@
   import { ref } from 'vue';
   import { FormRules, ElMessage } from 'element-plus';
   import { cloneDeep } from 'lodash-es';
-  import { UserType } from '@/api/system/user-operate';
+  import { UserType, resetCode } from '@/api/system/user-operate';
 
   const rules: FormRules = {
     username: {
@@ -106,8 +106,14 @@
       }
       const addData = {
         password: formParams.value.password,
-        username: formParams.value.username,
+        userId: formParams.value.username,
       };
+      resetCode(addData).then(() => {
+        emit('change');
+        handleReset();
+        closeDrawer();
+        ElMessage.success('重置成功');
+      });
 
       //然后进行调接口
     });

+ 1 - 0
src/views/system/user/columns.ts

@@ -115,6 +115,7 @@ export const columns: BasicColumn[] = [
   {
     label: '组织',
     prop: 'deptName',
+    minWidth: 100,
   },
   {
     label: '认证方式',

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

@@ -31,14 +31,23 @@
       </div>
       <div>
         <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
-            v-for="item in departmentList"
+            v-for="item in props.departmentList"
             :key="item.deptId"
             :label="item.deptName"
             :value="item.deptName"
           />
-        </el-select>
+        </el-select> -->
       </div>
     </el-space>
     <div class="flex-1 flex justify-end">
@@ -54,8 +63,14 @@
   import useUser from '../hooks/use-user';
   import { storeToRefs } from 'pinia';
 
+  interface Props {
+  departmentList: any[];
+}
+
+const props = defineProps<Props>();
+
   const selectContent = useSelectContent();
-  const { roleList, departmentList } = selectContent;
+  const { roleList } = selectContent;
 
   const useUserDetail = useUser();
   const {
@@ -69,6 +84,8 @@
   } = storeToRefs(useUserDetail);
   const { conditionSearch } = useUserDetail;
 
+
+
   // 重置查询条件
   const resetSearch = () => {
     queryType.value = '';
@@ -93,4 +110,8 @@
   .query-head {
     padding: 24px 57px 18px 21px;
   }
+
+  .protocal-select {
+    width: 160px;
+  }
 </style>

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

@@ -71,7 +71,7 @@ export const useUser = defineStore('user-list', () => {
       params.roleName = queryRoleName.value;
     }
     if (queryDeptName.value) {
-      params.deptName = queryDeptName.value;
+      params.deptId = queryDeptName.value;
     }
     getUserList(params).then((res) => {
       userList.value = res.list;

+ 19 - 10
src/views/system/user/user.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="user-page">
-    <UserQuery />
+    <UserQuery  :departmentList="departmentList" />
     <div class="user-list">
       <BasicTable
         :columns="columns"
@@ -56,7 +56,7 @@
         </template>
       </BasicTable>
     </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
       v-if="userStore?.info?.username === ROOT_USER"
@@ -77,13 +77,13 @@
 <script lang="ts" setup>
   import { h, reactive, ref, onMounted, onBeforeUnmount } from 'vue';
   import { BasicTable, BasicColumn } from '@/components/Table';
-  import { Plus, DocumentAdd, Refresh } from '@element-plus/icons-vue';
+  import { Plus, DocumentAdd } from '@element-plus/icons-vue';
   import { roleAllList } from '@/api/system/role';
   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 CreateDrawer from './CreateDrawer.vue';
-  import ResetCodeDrawer from './ResetCodeDrawer.vue'
+  import ResetCodeDrawer from './ResetCodeDrawer.vue';
   import CreateAdminDrawer from './CreateAdminDrawer.vue';
   import { columns } from './columns';
   import ActionColomns from './component/ActionColomns.vue';
@@ -94,6 +94,13 @@
   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 { 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);
@@ -106,11 +113,12 @@
   const rowKeysName = ref([]);
   const tableData = ref();
   const createDrawerRef = ref();
-  const ResetCodeDrawerRef =ref();
+  const ResetCodeDrawerRef = ref();
   const createAdminDrawer = ref();
   const drawerTitle = ref('添加用户');
   const createAdminTitle = ref('添加租户管理员');
   const roleData = ref([]);
+  const departmentList = ref<any[]>([]);
 
   const createAdminType = ref(EditType.create);
 
@@ -197,15 +205,13 @@
     drawerTitle.value = '编辑用户';
     const { openDrawer } = createDrawerRef.value;
     openDrawer(record.userId);
-  };
+  }
 
-  function handleResetCode(record: Recordable)
-  {
-    // console.log('点击了修改密码', record);
+  function handleResetCode(record: Recordable) {
     drawerTitle.value = '重置密码';
     const { openDrawer } = ResetCodeDrawerRef.value;
     openDrawer(record.userId);
-  };
+  }
 
   function handleDelete(record: Recordable) {
     const delDetail = {
@@ -218,6 +224,9 @@
 
   onMounted(async () => {
     getList();
+    deptTreeList().then((res) => {
+      departmentList.value = calculateTreeData(res, { level: 3, valueKey: 'deptId', labelKey: 'deptName' }, 1);
+    });
     const res = await roleAllList();
     roleData.value = res.list.map((item: any) => {
       return {