feat: 完成多模块功能迭代与优化
本次提交包含多模块功能更新: 1. 权限系统重构:移除硬编码admin放行逻辑,新增精细化权限控制,完善权限树形结构与用户/角色保护 2. 新增物料导入导出接口,补充台账查询条件 3. 优化列表查询排序逻辑,新增区域编码大小写不敏感搜索 4. 修复帮助抽屉重复弹出问题,补充页面权限控制 5. 新增弱密码提示逻辑,优化MES/WMS用户/角色管理权限 6. 调整路由结构,新增权限校验脚本与前端权限树重构 7. 补充数据库字段与依赖包更新
This commit is contained in:
@@ -76,6 +76,39 @@ func requireAdmin(next func(w http.ResponseWriter, r *http.Request)) func(w http
|
||||
}
|
||||
}
|
||||
|
||||
// requirePerm 按权限码判定:当前用户拥有指定 permissionCode 才放行。
|
||||
// 用于替代 requireAdmin,使管理员也受自身角色权限码约束(精细控制)。
|
||||
// 支持通配 *(拥有 * 视为全部放行)。seed 类系统引导接口仍用 requireAdmin。
|
||||
func requirePerm(ctx *svc.ServiceContext, code string, next func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
username := strings.TrimSpace(r.Header.Get("X-Username"))
|
||||
if username == "" {
|
||||
fail(w, http.StatusUnauthorized, "未登录")
|
||||
return
|
||||
}
|
||||
u, err := ctx.EntClient.User.Query().Where(user.UsernameEQ(username)).Only(ctx0())
|
||||
if err != nil {
|
||||
fail(w, http.StatusUnauthorized, "用户不存在")
|
||||
return
|
||||
}
|
||||
if !hasCode(permissionsForUser(ctx, u), code) {
|
||||
fail(w, http.StatusForbidden, "无权限: "+code)
|
||||
return
|
||||
}
|
||||
next(w, r)
|
||||
}
|
||||
}
|
||||
|
||||
// hasCode 判断权限码列表是否包含指定码(支持通配 *)
|
||||
func hasCode(codes []string, code string) bool {
|
||||
for _, c := range codes {
|
||||
if c == code || c == "*" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// userInfoHandler GET /api/user/info 当前登录用户信息 + 权限码
|
||||
func userInfoHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -116,7 +149,7 @@ func userDTO(u *ent.User) map[string]any {
|
||||
|
||||
// listUsersHandler GET /api/user/list 管理员查看全部用户
|
||||
func listUsersHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
return requireAdmin(func(w http.ResponseWriter, r *http.Request) {
|
||||
return requirePerm(ctx, "user:manage", func(w http.ResponseWriter, r *http.Request) {
|
||||
list, err := ctx.EntClient.User.Query().Order(ent.Asc("id")).All(ctx0())
|
||||
if err != nil {
|
||||
fail(w, http.StatusInternalServerError, err.Error())
|
||||
@@ -132,7 +165,7 @@ func listUsersHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
|
||||
// createUserHandler POST /api/user/create 管理员新建账号
|
||||
func createUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
return requireAdmin(func(w http.ResponseWriter, r *http.Request) {
|
||||
return requirePerm(ctx, "user:create", func(w http.ResponseWriter, r *http.Request) {
|
||||
var req struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
@@ -190,7 +223,7 @@ func createUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
|
||||
// updateUserHandler POST /api/user/update 管理员编辑账号(可选重置密码)
|
||||
func updateUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
return requireAdmin(func(w http.ResponseWriter, r *http.Request) {
|
||||
return requirePerm(ctx, "user:edit", func(w http.ResponseWriter, r *http.Request) {
|
||||
var req struct {
|
||||
ID int `json:"id"`
|
||||
RealName string `json:"realName"`
|
||||
@@ -209,6 +242,11 @@ func updateUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
fail(w, http.StatusNotFound, "用户不存在")
|
||||
return
|
||||
}
|
||||
// 内置管理员账号(username=admin)不允许通过管理接口修改(含禁用/改角色/改密码等)
|
||||
if target.Username == "admin" {
|
||||
fail(w, http.StatusBadRequest, "系统内置管理员账号不允许修改")
|
||||
return
|
||||
}
|
||||
upd := target.Update()
|
||||
if req.RealName != "" {
|
||||
upd.SetRealName(req.RealName)
|
||||
@@ -249,7 +287,7 @@ func updateUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
|
||||
// deleteUserHandler POST /api/user/delete 管理员删除账号
|
||||
func deleteUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
return requireAdmin(func(w http.ResponseWriter, r *http.Request) {
|
||||
return requirePerm(ctx, "user:delete", func(w http.ResponseWriter, r *http.Request) {
|
||||
var req struct {
|
||||
ID int `json:"id"`
|
||||
}
|
||||
@@ -267,6 +305,11 @@ func deleteUserHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
fail(w, http.StatusNotFound, "用户不存在")
|
||||
return
|
||||
}
|
||||
// 内置管理员账号(username=admin)不允许删除
|
||||
if target.Username == "admin" {
|
||||
fail(w, http.StatusBadRequest, "系统内置管理员账号不允许删除")
|
||||
return
|
||||
}
|
||||
// 禁止删除最后一个管理员
|
||||
if target.Role == "admin" {
|
||||
n, _ := ctx.EntClient.User.Query().Where(user.RoleEQ("admin")).Count(ctx0())
|
||||
|
||||
Reference in New Issue
Block a user