refactor(user): 优化用户管理功能

- 移除用户编码字段
- 添加真实姓名字段- 更新用户角色选择功能
- 优化表单布局和样式- 调整菜单添加提示信息
This commit is contained in:
du.meimei
2025-04-24 17:56:18 +08:00
parent 921f59e72f
commit 79be862637
4 changed files with 149 additions and 45 deletions

View File

@@ -26,7 +26,7 @@
:type="item.type" :type="item.type"
:sortable="item.sortable" :sortable="item.sortable"
:key="index" :key="index"
:min-width="item.width ? item.width : 225" :min-width="item.width ? item.width : null"
:fixed="item.fixed" :fixed="item.fixed"
v-if="!item.type" v-if="!item.type"
> >
@@ -35,23 +35,46 @@
</template> </template>
<template #default="scope"> <template #default="scope">
<!--表单校验--> <!--表单校验-->
<el-form-item v-if="item.ruleCode" :prop="'data.' + scope.$index + '.' + item.ruleCode" :rules="item.ruleCode ? item.rules : []"> <el-form-item
v-if="item.ruleCode"
:prop="'data.' + scope.$index + '.' + item.ruleCode"
:rules="item.ruleCode ? item.rules : []"
>
<body-slot :item="item" :scope="scope" v-if="item.render" /> <body-slot :item="item" :scope="scope" v-if="item.render" />
</el-form-item> </el-form-item>
<body-slot :item="item" :scope="scope" v-if="!item.ruleCode && item.render" /> <body-slot
:item="item"
:scope="scope"
v-if="!item.ruleCode && item.render"
/>
<!--自定义render模板--> <!--自定义render模板-->
<!--</el-form>--> <!--</el-form>-->
<!--自带的btn 不能有prop 属性--> <!--自带的btn 不能有prop 属性-->
<div v-if="!item.selfBtn && !item.prop && !item.type && !item.render" :fixed="item.fixed ? item.fixed : fixed"> <div
<el-button class="normal-button" :disabled="disabled" icon="el-icon-delete" @click="del(scope.row, scope.$index)"></el-button> v-if="!item.selfBtn && !item.prop && !item.type && !item.render"
<el-button class="normal-button" icon="el-icon-edit-outline" :disabled="disabled" @click="edit(scope.row, scope.$index)"></el-button> :fixed="item.fixed ? item.fixed : fixed"
>
<el-button
class="normal-button"
:disabled="disabled"
icon="el-icon-delete"
@click="del(scope.row, scope.$index)"
></el-button>
<el-button
class="normal-button"
icon="el-icon-edit-outline"
:disabled="disabled"
@click="edit(scope.row, scope.$index)"
></el-button>
</div> </div>
<!--如果渲染的是selfBtn--> <!--如果渲染的是selfBtn-->
<div v-if="item.selfBtn && !item.render"> <div v-if="item.selfBtn && !item.render">
<el-button <el-button
v-for="(btn, btnIndex) in item.selfBtn" v-for="(btn, btnIndex) in item.selfBtn"
:fixed="item.fixed ? item.fixed : fixed" :fixed="item.fixed ? item.fixed : fixed"
:disabled="item.disabled !== undefined ? item.disabled : disabled" :disabled="
item.disabled !== undefined ? item.disabled : disabled
"
:type="btn.type ? btn.type : 'primary'" :type="btn.type ? btn.type : 'primary'"
:size="btn.size ? btn.size : 'mini'" :size="btn.size ? btn.size : 'mini'"
:key="btnIndex" :key="btnIndex"
@@ -62,7 +85,11 @@
</el-button> </el-button>
</div> </div>
<!--提示框 内部判断是否给单元格提示--> <!--提示框 内部判断是否给单元格提示-->
<TooltipScope :scope="scope" :item="item" v-if="!item.type && !item.render && item.prop" /> <TooltipScope
:scope="scope"
:item="item"
v-if="!item.type && !item.render && item.prop"
/>
</template> </template>
</el-table-column> </el-table-column>
<!--有设置type 的表格 type 设置的是selection index--> <!--有设置type 的表格 type 设置的是selection index-->
@@ -85,12 +112,22 @@
v-else-if="item.type === 'radio'" v-else-if="item.type === 'radio'"
> >
<template #default="scope"> <template #default="scope">
<el-radio v-model="check" :label="scope.$index" @change="setCheck($event, scope)">{{ null }}</el-radio> <el-radio
v-model="check"
:label="scope.$index"
@change="setCheck($event, scope)"
>{{ null }}</el-radio
>
</template> </template>
</el-table-column> </el-table-column>
</template> </template>
<!--自定义默认按钮 ps:增加 一行 删除一行--> <!--自定义默认按钮 ps:增加 一行 删除一行-->
<el-table-column v-if="deletion" :align="align" width="180" :fixed="fixed"> <el-table-column
v-if="deletion"
:align="align"
width="180"
:fixed="fixed"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
<el-button <el-button
@@ -229,7 +266,9 @@ export default {
this.$emit('select-row', { row: scope.row, index: scope.$index }) this.$emit('select-row', { row: scope.row, index: scope.$index })
}, },
sortChange(sortData) { sortChange(sortData) {
let filters = this.columns.filter(item => item.key === sortData.column.label) let filters = this.columns.filter(
item => item.key === sortData.column.label
)
if (filters && filters.length > 0) { if (filters && filters.length > 0) {
sortData.prop = filters[0].prop sortData.prop = filters[0].prop
} }
@@ -238,7 +277,9 @@ export default {
}, },
//行拖拽 //行拖拽
rowDrop() { rowDrop() {
const tbody = document.querySelector('.dragTable .el-table__body-wrapper tbody') const tbody = document.querySelector(
'.dragTable .el-table__body-wrapper tbody'
)
Sortable.create(tbody, { Sortable.create(tbody, {
animation: 180, animation: 180,
onEnd: ({ newIndex, oldIndex }) => { onEnd: ({ newIndex, oldIndex }) => {
@@ -249,7 +290,9 @@ export default {
}, },
//列拖拽 目前有问题 暂未解决 //列拖拽 目前有问题 暂未解决
columnDrop() { columnDrop() {
const wrapperTr = document.querySelector('.dragTable .el-table__header-wrapper tr') const wrapperTr = document.querySelector(
'.dragTable .el-table__header-wrapper tr'
)
Sortable.create(wrapperTr, { Sortable.create(wrapperTr, {
animation: 180, animation: 180,
filter: '.el-table-column--selection', filter: '.el-table-column--selection',
@@ -293,7 +336,9 @@ export default {
addRow(row, index) { addRow(row, index) {
let newRow = JSON.parse(JSON.stringify(row)) let newRow = JSON.parse(JSON.stringify(row))
for (let item in newRow) { for (let item in newRow) {
newRow[item] = this.getDataType(Object.prototype.toString.call(newRow[item])) newRow[item] = this.getDataType(
Object.prototype.toString.call(newRow[item])
)
} }
this.data.splice(index + 1, 0, newRow) this.data.splice(index + 1, 0, newRow)
this.$emit('buttonAdd', row, newRow) this.$emit('buttonAdd', row, newRow)
@@ -307,7 +352,9 @@ export default {
this.data.splice(index, 1) this.data.splice(index, 1)
if (this.data.length === 0) { if (this.data.length === 0) {
for (let item in newRow) { for (let item in newRow) {
newRow[item] = this.getDataType(Object.prototype.toString.call(newRow[item])) newRow[item] = this.getDataType(
Object.prototype.toString.call(newRow[item])
)
} }
this.data.push(newRow) this.data.push(newRow)
} }

View File

@@ -200,7 +200,7 @@ export default {
this.isView = false this.isView = false
this.currentMenuData = {} this.currentMenuData = {}
this.dialogVisible = true this.dialogVisible = true
this.dialogTitle = '添加角色' this.dialogTitle = '添加菜单'
}, },
handleEdit(row) { handleEdit(row) {
this.isEdit = true this.isEdit = true
@@ -219,7 +219,7 @@ export default {
} }
}) })
.catch(error => { .catch(error => {
this.$message.error('获取角色详情出错', error) this.$message.error('获取菜单详情出错', error)
}) })
.finally(() => { .finally(() => {
this.loading = false this.loading = false

View File

@@ -1,48 +1,92 @@
<template> <template>
<el-dialog :title="title" :visible.sync="visible" width="800px" append-to-body @close="handleClose"> <el-dialog
:title="title"
:visible.sync="visible"
width="800px"
append-to-body
@close="handleClose"
>
<el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="用户编码" prop="userCode">
<el-input v-model="form.userCode" placeholder="请输入用户编码" clearable size="small" :disabled="isView || isEdit" />
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="用户名称" prop="userName"> <el-form-item label="用户名称" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户名称" clearable size="small" :disabled="isView" /> <el-input
v-model="form.userName"
placeholder="请输入用户名称"
clearable
size="small"
:disabled="isView"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="真实姓名" prop="realName"> <el-form-item label="真实姓名" prop="realName">
<el-input v-model="form.realName" placeholder="请输入真实姓名" clearable size="small" :disabled="isView" /> <el-input
</el-form-item> v-model="form.realName"
</el-col> placeholder="请输入真实姓名"
clearable
size="small"
:disabled="isView"
/>
</el-form-item> </el-col
></el-row>
<el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="手机号" prop="mobile"> <el-form-item label="手机号" prop="mobile">
<el-input v-model="form.mobile" placeholder="请输入手机号" clearable size="small" :disabled="isView" /> <el-input
v-model="form.mobile"
placeholder="请输入手机号"
clearable
size="small"
:disabled="isView"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input
v-model="form.email"
placeholder="请输入邮箱"
clearable
size="small"
:disabled="isView"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入邮箱" clearable size="small" :disabled="isView" />
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="用户角色" prop="sysUserRoleDTOs"> <el-form-item label="用户角色" prop="sysUserRoleDTOs">
<el-select v-model="selectedRoleIds" multiple placeholder="请选择用户角色" clearable size="small" :disabled="isView" @change="handleRolesChange"> <el-select
<el-option v-for="item in roleListData" :key="item.id" :label="item.roleName" :value="item.id" /> v-model="selectedRoleIds"
multiple
placeholder="请选择用户角色"
clearable
size="small"
:disabled="isView"
@change="handleRolesChange"
>
<el-option
v-for="item in roleListData"
:key="item.id"
:label="item.roleName"
:value="item.id"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<div slot="footer" class="dialog-footer" v-if="!isView"> <div slot="footer" class="dialog-footer" v-if="!isView">
<el-button type="primary" size="small" :loading="loading" @click="submitForm"> </el-button> <el-button
type="primary"
size="small"
:loading="loading"
@click="submitForm"
> </el-button
>
<el-button size="small" @click="handleClose"> </el-button> <el-button size="small" @click="handleClose"> </el-button>
</div> </div>
<div slot="footer" class="dialog-footer" v-else> <div slot="footer" class="dialog-footer" v-else>
@@ -92,11 +136,18 @@ export default {
roleListData: [], roleListData: [],
selectedRoleIds: [], // 新增用于绑定选中的角色ID数组 selectedRoleIds: [], // 新增用于绑定选中的角色ID数组
rules: { rules: {
userCode: [{ required: true, message: '请输入用户编码', trigger: 'blur' }], realName: [
userName: [{ required: true, message: '请输入用户名称', trigger: 'blur' }], { required: true, message: '请输入真实姓名', trigger: 'blur' }
],
userName: [
{ required: true, message: '请输入用户名称', trigger: 'blur' }
],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }] password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
}, },
roleOptions: [{ value: 'admin', label: '管理员' }, { value: 'user', label: '普通用户' }], roleOptions: [
{ value: 'admin', label: '管理员' },
{ value: 'user', label: '普通用户' }
],
loading: false loading: false
} }
}, },
@@ -149,7 +200,9 @@ export default {
const submitData = { ...this.form } const submitData = { ...this.form }
// 根据是否是编辑模式调用不同的API // 根据是否是编辑模式调用不同的API
const apiRequest = this.isEdit ? updateUser(submitData) : addUser(submitData) const apiRequest = this.isEdit
? updateUser(submitData)
: addUser(submitData)
apiRequest apiRequest
.then(response => { .then(response => {
@@ -158,11 +211,16 @@ export default {
this.$emit('submit', submitData) this.$emit('submit', submitData)
this.handleClose() this.handleClose()
} else { } else {
this.$message.error(response.msg || (this.isEdit ? '修改失败' : '添加失败')) this.$message.error(
response.msg || (this.isEdit ? '修改失败' : '添加失败')
)
} }
}) })
.catch(error => { .catch(error => {
console.error(this.isEdit ? '修改用户出错:' : '添加用户出错:', error) console.error(
this.isEdit ? '修改用户出错:' : '添加用户出错:',
error
)
this.$message.error(this.isEdit ? '修改用户出错' : '添加用户出错') this.$message.error(this.isEdit ? '修改用户出错' : '添加用户出错')
}) })
.finally(() => { .finally(() => {

View File

@@ -125,7 +125,6 @@ export default {
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
columns: [ columns: [
{ prop: 'userCode', key: '用户编码' },
{ prop: 'userName', key: '用户名称' }, { prop: 'userName', key: '用户名称' },
{ prop: 'realName', key: '真实姓名' }, { prop: 'realName', key: '真实姓名' },
{ prop: 'mobile', key: '手机号' }, { prop: 'mobile', key: '手机号' },