refactor(用户管理): 优化用户管理和审核功能

- 在用户管理模块中移除未使用的导入并优化用户对话框逻辑
- 在用户审核模块中重构查询表单和状态显示,添加重置功能
- 完善用户对话框的编辑功能,包括树形选择器高亮和表单验证
This commit is contained in:
liangbin 2026-01-30 10:04:32 +08:00
parent f56c7923df
commit 37747116ed
3 changed files with 131 additions and 30 deletions

View File

@ -18,7 +18,8 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="初始密码"> <el-form-item label="初始密码">
<el-input v-model="formData.password" type="password" placeholder="请输入密码" show-password /> <el-input v-model="formData.password" type="password" placeholder="请输入密码" show-password
:disabled="!!props.userId" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -35,10 +36,10 @@
<el-form-item label="所属单位"> <el-form-item label="所属单位">
<div class="TreeBox"> <div class="TreeBox">
<el-tree :data="unitTreeData" :props="treeProps" show-line highlight-current default-expand-all <el-tree ref="treeRef" :current-node-key="formData.deptId" :data="unitTreeData"
:props="treeProps" node-key="id" show-line highlight-current default-expand-all
@current-change="handleUnitChange" :expand-on-click-node="false" class="unit-tree" /> @current-change="handleUnitChange" :expand-on-click-node="false" class="unit-tree" />
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="角色"> <el-form-item label="角色">
@ -63,11 +64,11 @@
</template> </template>
<script setup> <script setup>
import { getUser, deptTreeSelect, addUser } from '@/api/system/user.js' import { getUser, deptTreeSelect, addUser, updateUser } from '@/api/system/user.js'
import { listRole } from '@/api/system/role.js' import { listRole } from '@/api/system/role.js'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { ref, onBeforeMount } from 'vue' import { ref, onBeforeMount, onMounted, watch, nextTick } from 'vue'
const props = defineProps({ const props = defineProps({
userId: { userId: {
type: Number || String, type: Number || String,
@ -103,6 +104,9 @@ const roleList = ref([])
// //
const unitTreeData = ref([]) const unitTreeData = ref([])
//
const treeRef = ref(null)
// //
const treeProps = { const treeProps = {
children: 'children', children: 'children',
@ -113,6 +117,12 @@ onBeforeMount(() => {
getUnitTree() getUnitTree()
}) })
onMounted(() => {
if (props.userId) {
getUserDetail()
}
})
// //
const getRoleList = async () => { const getRoleList = async () => {
let res = await listRole() let res = await listRole()
@ -133,14 +143,33 @@ const getUnitTree = async () => {
// //
const getUserDetail = async () => { const getUserDetail = async () => {
let res = await getUser({ let res = await getUser(props.userId)
account: formData.value.account
})
if (res.code === 200) { if (res.code === 200) {
formData.value = res.data console.log('用户详情:', res.data)
formData.value.userName = res.data.userName //
formData.value.nickName = res.data.nickName //
formData.value.password = res.data.password //
formData.value.phonenumber = res.data.phonenumber //
formData.value.email = res.data.email //
//
formData.value.roleId = res.data.roleId
formData.value.roleName = res.data.roleName
//
formData.value.deptId = res.data.dept.deptId
formData.value.deptName = res.data.dept.deptName
} }
} }
// deptId
watch(() => formData.value.deptId, (newVal) => {
if (newVal && treeRef.value) {
nextTick(() => {
treeRef.value.setCurrentKey(newVal)
})
}
}, { immediate: true })
// //
const handleRoleChange = (roleId) => { const handleRoleChange = (roleId) => {
console.log('Selected roleId:', roleId) console.log('Selected roleId:', roleId)
@ -164,13 +193,17 @@ const handleClose = () => {
} }
// //
const handleSubmit = () => { const handleSubmit = async () => {
console.log('提交数据:', formData.value) console.log('提交数据:', formData.value)
// //
if (!formData.value.roleId) { if (!formData.value.roleId) {
ElMessage.warning('请选择角色') ElMessage.warning('请选择角色')
return return
} }
if (!formData.value.password && !props.userId) {
ElMessage.warning('请输入初始密码')
return
}
if (!formData.value.deptId) { if (!formData.value.deptId) {
ElMessage.warning('请选择所属单位') ElMessage.warning('请选择所属单位')
return return
@ -188,15 +221,32 @@ const handleSubmit = () => {
return return
} }
const isEditMode = !!props.userId
const fetchFunc = isEditMode ? updateUser : addUser
const successMsg = isEditMode ? '更新成功' : '添加成功'
const errorMsg = isEditMode ? '更新失败' : '添加失败'
addUser(formData.value).then(res => { const params = {
...formData.value,
userId: props.userId
}
if (isEditMode) {
delete params.password
}
try {
const res = await fetchFunc(params)
if (res.code === 200) { if (res.code === 200) {
ElMessage.success('添加成功') ElMessage.success(successMsg)
props.CloseDialog() props.CloseDialog()
} else { } else {
ElMessage.error(res.msg || '添加失败') ElMessage.error(res.msg || errorMsg)
} }
}) } catch (error) {
ElMessage.error(errorMsg)
}
// //

View File

@ -117,7 +117,7 @@
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, onMounted, getCurrentInstance, reactive, toRefs, nextTick } from 'vue' import { ref, onMounted, getCurrentInstance, reactive } from 'vue'
import { listDept } from '@/api/treeRatingManagement' import { listDept } from '@/api/treeRatingManagement'
import { listUser, delUser } from '@/api/system/user.js' import { listUser, delUser } from '@/api/system/user.js'
import UserDialog from "./UserDialog.vue"; import UserDialog from "./UserDialog.vue";

View File

@ -2,18 +2,18 @@
<template> <template>
<div class="MainBox"> <div class="MainBox">
<div class="FormBox card-box"> <div class="FormBox card-box">
<el-form :model="formData" inline ref="formRef"> <el-form :model="queryData" inline ref="formRef">
<el-form-item label="用户名" prop="username"> <el-form-item label="用户名" prop="username">
<el-input v-model="formData.username" placeholder="请输入用户名"></el-input> <el-input v-model="queryData.username" placeholder="请输入用户名"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="时间范围" prop="timeRange"> <el-form-item label="时间范围" prop="timeRange">
<el-date-picker v-model="formData.timeRange" type="daterange" value-format="yyyy-MM-dd" <el-date-picker v-model="queryData.timeRange" type="daterange" value-format="yyyy-MM-dd"
range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" /> range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="ButtonBox"> <div class="ButtonBox">
<el-button type="primary" @click="handleSearch">查询</el-button> <el-button type="primary" @click="handleSearch">查询</el-button>
<el-button type="primary" @click="handleSearch">重置</el-button> <el-button type="primary" @click="handleReset">重置</el-button>
</div> </div>
</div> </div>
<div class="card-box"> <div class="card-box">
@ -28,11 +28,17 @@
</el-table-column> </el-table-column>
<el-table-column prop="phonenumber" label="联系电话" /> <el-table-column prop="phonenumber" label="联系电话" />
<el-table-column prop="remark" label="角色" /> <el-table-column prop="remark" label="角色" />
<el-table-column prop="status" label="状态" /> <el-table-column prop="status" label="状态">
<template #default="{ row }">
<el-tag type="primary">
{{ statusMap[row.status] || '-' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="operation" label="操作" width="100"> <el-table-column prop="operation" label="操作" width="100">
<template #default="scope"> <template #default="scope">
<div class="FlexBox"> <div class="FlexBox">
<el-button type="text" size="mini" @click="handleApprove(scope.row)">审批</el-button> <el-button type="text" size="mini" @click="handleApprove(scope.row)">审批</el-button>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@ -44,17 +50,21 @@
@current-change="handleCurrentChange" /> @current-change="handleCurrentChange" />
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
import dayjs from "dayjs"; import dayjs from "dayjs";
import { ref, onBeforeMount } from "vue"; import { ref, onBeforeMount } from "vue";
import { listUser } from "@/api/system/user"; import { listUser, FetchUserReview } from "@/api/system/user";
//
const statusMap = {
'0': '已生效',
'1': '已停用',
'2': '待审核',
}
// //
const formData = ref({ const queryData = ref({
username: "", username: "",
timeRange: [], timeRange: [],
}); });
@ -72,19 +82,44 @@ const pageInfo = ref({
// //
const tableData = ref([]); const tableData = ref([]);
//
const currentUser = ref();
//
const handleCurrentChange = (val) => {
pageInfo.value.pageNum = val;
getinit();
}
onBeforeMount(() => { onBeforeMount(() => {
getinit(); getinit();
}); });
//
const handleSearch = () => {
pageInfo.value.pageNum = 1;
getinit();
}
//
const handleReset = () => {
queryData.value = {
username: "",
timeRange: [],
};
pageInfo.value.pageNum = 1;
getinit();
}
// //
const getinit = async () => { const getinit = async () => {
let query = { let query = {
username: formData.value.username, username: queryData.value.username,
startTime: formData.value.timeRange[0] ? dayjs(formData.value.timeRange[0]).format('YYYY-MM-DD') : '', startTime: queryData.value.timeRange[0] ? dayjs(queryData.value.timeRange[0]).format('YYYY-MM-DD') : '',
endTime: formData.value.timeRange[1] ? dayjs(formData.value.timeRange[1]).format('YYYY-MM-DD') : '', endTime: queryData.value.timeRange[1] ? dayjs(queryData.value.timeRange[1]).format('YYYY-MM-DD') : '',
pageNum: pageInfo.value.pageNum, pageNum: pageInfo.value.pageNum,
pageSize: pageInfo.value.pageSize, pageSize: pageInfo.value.pageSize,
status: 2
}; };
loading.value = true; loading.value = true;
let res = await listUser(query); let res = await listUser(query);
@ -95,6 +130,22 @@ const getinit = async () => {
} }
}; };
//
const handleApprove = async (row) => {
let params = {
userId: row.userId,
status: row.status === 2 ? 0 : 2,
};
let res = await FetchUserReview(params);
if (res.code === 200) {
ElMessage.success('操作成功');
getinit();
} else {
ElMessage.error(res.msg || '操作失败');
}
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.MainBox { .MainBox {