From e423d8afcf5b9666e166565d0509b621ebab17e7 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 13 一月 2025 14:11:00 +0800 Subject: [PATCH] !172 合并 warmflow 功能分支 * update 优化 流程定义页面 点击复制之后跳转到未发布列表 * update 优化 流程定义页面 增加加载loading层 * fix: v-model处理有延迟 需要手动处理 * update 调整流程定义查询 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * update 调整可驳回的节点 * update: 调整文案 * update: 激活/挂起改为switch操作 * update 优化 代码删除无用输出 * update 统一抄送人使用昵称展示 * update 调整分类接口 * update 统一业务id参数 * update 删除默认顶节点 * !168 优化流程分类 * update 恢复误删除代码 * update 优化流程分类 * update 修复 路由跳转未改全 * [update] * fix 修复一些问题 * update 重构流程分类表 * update 流程定义增加表单路径与编辑功能 修复一些其他bug * fix 修复 一些问题 * update 变量统一命名 * add 增加示例 * Merge branch 'warm-flw-future' of https://gitee.com/JavaLionLi/plus-ui… * update 调整办理人 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * add 增加示例 * update 调整审批记录 添加流程导出 * remove 删除无用代码 * remove 删除无用代码 * [update] * [fix] * 流程干预删除委托 * 增加附件 * 附件修改 * 申请人查询修改 * 1.修改查询条件 * !167 fix 修复 import路径修改不全问题 * fix 修复 import路径修改不全问题 * !166 update 清除 ProcessPreview 引用 * update 清除 ProcessPreview 引用 * remove 删除 bpmn.js 设计器 * remove 删除 bpmn.js 设计器 * remove 删除 bpmn.js 设计器 * remove 删除 bpmn.js 设计器 * fix 修复 前端路径修改不全问题 * update 优化接口请求路径 * add 添加作废 * add 添加流程干预 * update 调整加签,减签 * update 调整加签,减签 * add 增加流程查看 * update 调整委托,转办 * update 调整流程变量显示 * update 调整办理人修改 * update 调整流程实例状态页面 * update 调整已办页面 * add 添加流程撤销 * update 调整任务,流程实例 ,流程定义页面 * Merge branch 'dev' into warm-flw-future * update 调整流程定义页面 * add 添加流程变量查看 * update 调整设计器路由名称 * update 调整办理人 * update 调整设计器uri * update 调整设计器请求uri 调整待办状态 * update 调整办理 驳回 终止等状态 * add 添加模型新增 * add 添加warm-ui设计器,删除无用代码 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * add 添加流程设计 * update 调整驳回 * update 调整视图类型错误 * Merge branch 'warm-flw-future' of https://gitee.com/JavaLionLi/plus-ui… * 添加已办,未办 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * update 调整流程实例,待办查询 * add 添加代办人,调整提交按钮校验 * update 调整流程定义查询 * add添加流程定义激活 挂起 * add 添加流程文件部署 调整流程发布 * update 优化 时间搜索组件统一 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * fix 修复 用户管理编辑安全权限错误问题 * Merge remote-tracking branch 'origin/dev' into warm-flw-future * update 优化 类型报错问题 * update 优化 切换租户后刷新首页 * update 优化 实现表格行选中切换 * update 优化 使用 vueuse 重构 websocket 实现 * update 优化 使用 vueuse 重构 websocket 实现 * fix 修复 登出后重新登录 sse推送报错问题 * reset 回滚 代码修改 采用其他方案 * fix 修复 登出后重新登录 sse推送报错问题 * update 优化 删除无用代码 * update element-plus 2.7.5 => 2.7.8 * reset 回滚 错误修复 * update 优化 代码生成器编辑页禁用缓存 防止同步后页面不更新问题 * fix 修复 代码生成同步点击取消报错问题 * 初始化添加warm-flow --- src/views/system/user/index.vue | 88 ++++++++++++++++++++++++-------------------- 1 files changed, 48 insertions(+), 40 deletions(-) diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index ada6749..430c55a 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -23,18 +23,12 @@ <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber"> - <el-input - v-model="queryParams.phonenumber" - placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" - clearable - style="width: 240px" - @keyup.enter="handleQuery" - /> + <el-input v-model="queryParams.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="鐘舵��" prop="status"> @@ -45,11 +39,12 @@ <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px"> <el-date-picker v-model="dateRange" - value-format="YYYY-MM-DD" + value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" ></el-date-picker> </el-form-item> <el-form-item> @@ -68,12 +63,12 @@ <el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus" @click="handleAdd()">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button v-has-permi="['system:user:add']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()"> + <el-button v-has-permi="['system:user:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()"> 淇敼 </el-button> </el-col> <el-col :span="1.5"> - <el-button v-has-permi="['system:user:delete']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()"> + <el-button v-has-permi="['system:user:remove']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> @@ -86,13 +81,13 @@ <template #dropdown> <el-dropdown-menu> <el-dropdown-item icon="Download" @click="importTemplate">涓嬭浇妯℃澘</el-dropdown-item> - <el-dropdown-item icon="Top" @click="handleImport"> 瀵煎叆鏁版嵁</el-dropdown-item> - <el-dropdown-item icon="Download" @click="handleExport"> 瀵煎嚭鏁版嵁</el-dropdown-item> + <el-dropdown-item v-has-permi="['system:user:import']" icon="Top" @click="handleImport">瀵煎叆鏁版嵁</el-dropdown-item> + <el-dropdown-item v-has-permi="['system:user:export']" icon="Download" @click="handleExport">瀵煎嚭鏁版嵁</el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </el-col> - <right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @query-table="getList"></right-toolbar> + <right-toolbar v-model:show-search="showSearch" :columns="columns" :search="true" @query-table="getList"></right-toolbar> </el-row> </template> @@ -159,11 +154,12 @@ <el-form-item label="褰掑睘閮ㄩ棬" prop="deptId"> <el-tree-select v-model="form.deptId" - :data="deptOptions" + :data="enabledDeptOptions" :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="璇烽�夋嫨褰掑睘閮ㄩ棬" check-strictly + @change="handleDeptChange" /> </el-form-item> </el-col> @@ -203,7 +199,7 @@ <el-col :span="12"> <el-form-item label="鐘舵��"> <el-radio-group v-model="form.status"> - <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> + <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio> </el-radio-group> </el-form-item> </el-col> @@ -224,7 +220,7 @@ </el-col> <el-col :span="12"> <el-form-item label="瑙掕壊" prop="roleIds"> - <el-select v-model="form.roleIds" multiple placeholder="璇烽�夋嫨"> + <el-select v-model="form.roleIds" filterable multiple placeholder="璇烽�夋嫨"> <el-option v-for="item in roleOptions" :key="item.roleId" @@ -291,12 +287,13 @@ <script setup name="User" lang="ts"> import api from '@/api/system/user'; import { UserForm, UserQuery, UserVO } from '@/api/system/user/types'; -import { DeptVO } from '@/api/system/dept/types'; +import {DeptTreeVO, DeptVO} from '@/api/system/dept/types'; import { RoleVO } from '@/api/system/role/types'; -import { PostVO } from '@/api/system/post/types'; +import { PostQuery, PostVO } from '@/api/system/post/types'; import { treeselect } from '@/api/system/dept'; import { globalHeaders } from '@/utils/request'; import { to } from 'await-to-js'; +import { optionselect } from '@/api/system/post'; const router = useRouter(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -310,7 +307,8 @@ const total = ref(0); const dateRange = ref<[DateModelType, DateModelType]>(['', '']); const deptName = ref(''); -const deptOptions = ref<DeptVO[]>([]); +const deptOptions = ref<DeptTreeVO[]>([]); +const enabledDeptOptions = ref<DeptTreeVO[]>([]); const initPassword = ref<string>(''); const postOptions = ref<PostVO[]>([]); const roleOptions = ref<RoleVO[]>([]); @@ -396,7 +394,7 @@ message: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', trigger: 'blur' }, - { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" } + { pattern: /^[^<>"'|\\]+$/, message: '涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > " \' \\ |', trigger: 'blur' } ], email: [ { @@ -434,12 +432,6 @@ } ); -/** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */ -const getTreeSelect = async () => { - const res = await api.deptTreeSelect(); - deptOptions.value = res.data; -}; - /** 鏌ヨ鐢ㄦ埛鍒楄〃 */ const getList = async () => { loading.value = true; @@ -447,6 +439,26 @@ loading.value = false; userList.value = res.rows; total.value = res.total; +}; + +/** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */ +const getDeptTree = async () => { + const res = await api.deptTreeSelect(); + deptOptions.value = res.data; + enabledDeptOptions.value = filterDisabledDept(res.data); +}; + +/** 杩囨护绂佺敤鐨勯儴闂� */ +const filterDisabledDept = (deptList: DeptTreeVO[]) => { + return deptList.filter(dept => { + if (dept.disabled) { + return false; + } + if (dept.children && dept.children.length) { + dept.children = filterDisabledDept(dept.children); + } + return true; + }); }; /** 鑺傜偣鍗曞嚮浜嬩欢 */ @@ -509,7 +521,7 @@ inputErrorMessage: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', inputValidator: (value) => { if (/<|>|"|'|\||\\/.test(value)) { - return "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |" + return '涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > " \' \\ |'; } } }) @@ -567,15 +579,6 @@ uploadRef.value?.submit(); } -/** 鍒濆鍖栭儴闂ㄦ暟鎹� */ -const initTreeData = async () => { - // 鍒ゆ柇閮ㄩ棬鐨勬暟鎹槸鍚﹀瓨鍦紝瀛樺湪涓嶈幏鍙栵紝涓嶅瓨鍦ㄥ垯鑾峰彇 - if (deptOptions.value === undefined) { - const { data } = await treeselect(); - deptOptions.value = data; - } -}; - /** 閲嶇疆鎿嶄綔琛ㄥ崟 */ const reset = () => { form.value = { ...initFormData }; @@ -593,11 +596,11 @@ const { data } = await api.getUser(); dialog.visible = true; dialog.title = '鏂板鐢ㄦ埛'; - await initTreeData(); postOptions.value = data.posts; roleOptions.value = data.roles; form.value.password = initPassword.value.toString(); }; + /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: UserForm) => { reset(); @@ -605,7 +608,6 @@ const { data } = await api.getUser(userId); dialog.visible = true; dialog.title = '淇敼鐢ㄦ埛'; - await initTreeData(); Object.assign(form.value, data.user); postOptions.value = data.posts; roleOptions.value = data.roles; @@ -645,12 +647,18 @@ form.value.status = '1'; }; onMounted(() => { - getTreeSelect(); // 鍒濆鍖栭儴闂ㄦ暟鎹� + getDeptTree(); // 鍒濆鍖栭儴闂ㄦ暟鎹� getList(); // 鍒濆鍖栧垪琛ㄦ暟鎹� proxy?.getConfigKey('sys.user.initPassword').then((response) => { initPassword.value = response.data; }); }); + +async function handleDeptChange(value: number | string) { + const response = await optionselect(value); + postOptions.value = response.data; + form.value.postIds = []; +} </script> <style lang="scss" scoped></style> -- Gitblit v1.9.3