feat: 完成多模块功能迭代与优化
本次提交包含多模块功能更新: 1. 权限系统重构:移除硬编码admin放行逻辑,新增精细化权限控制,完善权限树形结构与用户/角色保护 2. 新增物料导入导出接口,补充台账查询条件 3. 优化列表查询排序逻辑,新增区域编码大小写不敏感搜索 4. 修复帮助抽屉重复弹出问题,补充页面权限控制 5. 新增弱密码提示逻辑,优化MES/WMS用户/角色管理权限 6. 调整路由结构,新增权限校验脚本与前端权限树重构 7. 补充数据库字段与依赖包更新
This commit is contained in:
@@ -27,8 +27,8 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="140">
|
||||
<template #default="{row}">
|
||||
<el-button v-if="can('sys.rbac:user')" size="small" @click="openUser(row)">编辑</el-button>
|
||||
<el-button v-if="can('sys.rbac:user')" size="small" type="danger" @click="delUser(row)">删除</el-button>
|
||||
<el-button v-if="can('sys.rbac:user')" size="small" :disabled="isAdminUser(row)" @click="openUser(row)">编辑</el-button>
|
||||
<el-button v-if="can('sys.rbac:user')" size="small" type="danger" :disabled="isAdminUser(row)" @click="delUser(row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -65,17 +65,17 @@
|
||||
<!-- 用户编辑 -->
|
||||
<el-dialog v-model="u.show" :title="u.id?'编辑用户':'新增用户'" width="480px">
|
||||
<el-form :model="u" label-width="90px">
|
||||
<el-form-item label="用户名"><el-input v-model="u.username" :disabled="u.id===1" /></el-form-item>
|
||||
<el-form-item label="用户名"><el-input v-model="u.username" :disabled="u.username==='admin'" /></el-form-item>
|
||||
<el-form-item v-if="!u.id" label="密码"><el-input v-model="u.password" type="password" show-password placeholder="至少6位,不能纯数字" /></el-form-item>
|
||||
<el-form-item v-else label="重置密码"><el-input v-model="u.password" type="password" show-password placeholder="留空则不修改;至少6位,不能纯数字" /></el-form-item>
|
||||
<el-form-item label="姓名"><el-input v-model="u.name" /></el-form-item>
|
||||
<el-form-item label="角色">
|
||||
<el-select v-model="u.roleId" style="width:100%">
|
||||
<el-select v-model="u.roleId" :disabled="u.username==='admin'" style="width:100%">
|
||||
<el-option v-for="rl in roles" :key="rl.id" :label="rl.name" :value="rl.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<el-select v-model="u.status" style="width:100%">
|
||||
<el-select v-model="u.status" :disabled="u.username==='admin'" style="width:100%">
|
||||
<el-option label="启用" value="ENABLED" /><el-option label="禁用" value="DISABLED" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
@@ -113,6 +113,9 @@ const tab = ref('users')
|
||||
const users = ref([]), roles = ref([]), perms = ref([])
|
||||
const u = reactive({ show: false, id: 0, username: '', password: '', name: '', roleId: 0, status: 'ENABLED', canLoginWorkstation: false, workstationPassword: '', stations: [] })
|
||||
|
||||
// 系统内置管理员账号(username=admin / 角色 SUPER_ADMIN)不允许被修改或删除
|
||||
const isAdminUser = (row) => row && (row.username === 'admin' || row.roleCode === 'SUPER_ADMIN')
|
||||
|
||||
async function loadAll() {
|
||||
users.value = (await request.get('/users')) || []
|
||||
roles.value = (await request.get('/roles')) || []
|
||||
@@ -145,7 +148,7 @@ async function saveUser() {
|
||||
ElMessage.success('保存成功'); u.show = false; loadAll()
|
||||
}
|
||||
async function delUser(row) {
|
||||
if (row.id === 1) return ElMessage.warning('系统管理员不可删除')
|
||||
if (isAdminUser(row)) return ElMessage.warning('系统管理员账号不可删除')
|
||||
await ElMessageBox.confirm('确认删除该用户?', '提示', { type: 'warning' })
|
||||
await request.delete(`/users/${row.id}`); loadAll()
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ func (w *Writer) Query(ctx context.Context, eventType, workOrderNo, operator str
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
list, err := q.Order(ent.Desc(eventlog.FieldCreatedAt)).
|
||||
list, err := q.Order(ent.Desc(eventlog.FieldCreatedAt), ent.Desc(eventlog.FieldID)).
|
||||
Offset((page - 1) * pageSize).Limit(pageSize).All(ctx)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
|
||||
@@ -355,6 +355,15 @@ func (s *Service) CreateUser(ctx context.Context, req UserReq) error {
|
||||
}
|
||||
|
||||
func (s *Service) UpdateUser(ctx context.Context, req UserReq) error {
|
||||
// 内置管理员账号(SUPER_ADMIN)不允许通过管理接口修改(含禁用/改角色/改密码等)
|
||||
if usr, e := s.ctx.EntClient.User.Get(ctx, req.Id); e == nil {
|
||||
if usr.Username == "admin" {
|
||||
return errors.New("系统内置管理员账号不允许修改")
|
||||
}
|
||||
if rl, e2 := s.ctx.EntClient.Role.Get(ctx, usr.RoleId); e2 == nil && rl.Code == "SUPER_ADMIN" {
|
||||
return errors.New("系统内置管理员账号不允许修改")
|
||||
}
|
||||
}
|
||||
u := s.ctx.EntClient.User.UpdateOneID(req.Id).SetRoleId(req.RoleId).SetName(req.Name).
|
||||
SetCanLoginWorkstation(req.CanLoginWorkstation)
|
||||
if req.Password != "" {
|
||||
@@ -413,8 +422,16 @@ func (s *Service) UserStations(ctx context.Context, userId int) []int {
|
||||
}
|
||||
|
||||
func (s *Service) DeleteUser(ctx context.Context, id int) error {
|
||||
if id == 1 {
|
||||
return errors.New("不能删除超级管理员")
|
||||
usr, err := s.ctx.EntClient.User.Get(ctx, id)
|
||||
if err != nil {
|
||||
return errors.New("用户不存在")
|
||||
}
|
||||
// 内置管理员账号(SUPER_ADMIN)不允许删除
|
||||
if usr.Username == "admin" {
|
||||
return errors.New("系统内置管理员账号不允许删除")
|
||||
}
|
||||
if rl, e2 := s.ctx.EntClient.Role.Get(ctx, usr.RoleId); e2 == nil && rl.Code == "SUPER_ADMIN" {
|
||||
return errors.New("系统内置管理员账号不允许删除")
|
||||
}
|
||||
return s.ctx.EntClient.User.DeleteOneID(id).Exec(ctx)
|
||||
}
|
||||
@@ -465,6 +482,10 @@ func (s *Service) CreateRole(ctx context.Context, req RoleReq) error {
|
||||
}
|
||||
|
||||
func (s *Service) UpdateRole(ctx context.Context, req RoleReq) error {
|
||||
// 内置管理员角色(SUPER_ADMIN)不允许修改其权限(admin 拥有所有权限,且不可被缩减)
|
||||
if rl, e := s.ctx.EntClient.Role.Get(ctx, req.Id); e == nil && rl.Code == "SUPER_ADMIN" {
|
||||
return errors.New("内置管理员角色不允许修改其权限")
|
||||
}
|
||||
return s.ctx.EntClient.Role.UpdateOneID(req.Id).
|
||||
SetName(req.Name).SetCode(req.Code).SetRemark(req.Remark).
|
||||
SetPermissionCodes(req.PermissionCodes).Exec(ctx)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<title>MES 产线控制</title>
|
||||
<!-- 系统图标:产线齿轮(内联 SVG,避免依赖外部文件) -->
|
||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='6' fill='%231668dc'/><circle cx='16' cy='16' r='4.2' fill='none' stroke='%23fff' stroke-width='2'/><path d='M16 5v3M16 24v3M5 16h3M24 16h3M8.2 8.2l2.1 2.1M21.7 21.7l2.1 2.1M23.8 8.2l-2.1 2.1M10.3 21.7l-2.1 2.1' stroke='%23fff' stroke-width='2' stroke-linecap='round'/></svg>">
|
||||
<script type="module" crossorigin src="./assets/index-t_TbkSJL.js"></script>
|
||||
<script type="module" crossorigin src="./assets/index-BEc2MCok.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="./assets/index-vrQAtaxd.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
Reference in New Issue
Block a user