feat: 完成多模块功能迭代与优化

本次提交包含多模块功能更新:
1. 权限系统重构:移除硬编码admin放行逻辑,新增精细化权限控制,完善权限树形结构与用户/角色保护
2. 新增物料导入导出接口,补充台账查询条件
3. 优化列表查询排序逻辑,新增区域编码大小写不敏感搜索
4. 修复帮助抽屉重复弹出问题,补充页面权限控制
5. 新增弱密码提示逻辑,优化MES/WMS用户/角色管理权限
6. 调整路由结构,新增权限校验脚本与前端权限树重构
7. 补充数据库字段与依赖包更新
This commit is contained in:
SunYF
2026-09-03 18:13:59 +08:00
parent 572fa975bc
commit c1fc6d32b2
47 changed files with 1761 additions and 926 deletions
+47 -4
View File
@@ -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())