feat: 新增账号管理功能,完善权限控制与用户信息同步
1. 新增用户管理后台接口与前端页面,支持管理员增删改查用户账号 2. 新增RBAC权限控制系统,按角色分配菜单与操作权限 3. 优化登录响应与用户信息接口,返回完整权限码与用户数据 4. 新增密码安全校验,提示纯数字密码风险 5. 移除废弃的注册接口,统一用户管理逻辑 6. 更新前端路由与侧边栏权限过滤逻辑
This commit is contained in:
@@ -67,64 +67,14 @@ func loginHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
ok(w, map[string]any{
|
||||
"token": token,
|
||||
"expireAt": expireAt,
|
||||
"user": map[string]any{"id": u.ID, "username": u.Username, "realName": u.RealName, "role": u.Role},
|
||||
"user": map[string]any{
|
||||
"id": u.ID, "username": u.Username, "realName": u.RealName,
|
||||
"role": u.Role, "dept": u.Dept, "permissionCodes": permissionsForRole(u.Role),
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func registerHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
var req struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
RealName string `json:"realName"`
|
||||
Role string `json:"role"`
|
||||
}
|
||||
if err := parseJSON(r, &req); err != nil {
|
||||
fail(w, http.StatusBadRequest, "参数错误")
|
||||
return
|
||||
}
|
||||
if req.Username == "" || req.Password == "" {
|
||||
fail(w, http.StatusBadRequest, "用户名和密码必填")
|
||||
return
|
||||
}
|
||||
if len(req.Password) < 6 {
|
||||
fail(w, http.StatusBadRequest, "密码至少 6 位")
|
||||
return
|
||||
}
|
||||
exists, _ := ctx.EntClient.User.Query().Where(user.UsernameEQ(req.Username)).Exist(ctx0())
|
||||
if exists {
|
||||
fail(w, http.StatusConflict, "用户名已存在")
|
||||
return
|
||||
}
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
fail(w, http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
}
|
||||
u, err := ctx.EntClient.User.Create().
|
||||
SetUsername(req.Username).
|
||||
SetPassword(string(hash)).
|
||||
SetNillableRealName(strPtr(req.RealName)).
|
||||
SetRole(roleOrDefault(req.Role)).
|
||||
Save(ctx0())
|
||||
if err != nil {
|
||||
fail(w, http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
}
|
||||
ok(w, map[string]any{"id": u.ID, "username": u.Username})
|
||||
}
|
||||
}
|
||||
|
||||
func roleOrDefault(r string) string {
|
||||
switch r {
|
||||
case "admin", "operator", "inspector":
|
||||
return r
|
||||
default:
|
||||
return "operator"
|
||||
}
|
||||
}
|
||||
|
||||
// changePasswordHandler POST /api/user/change-password(需登录 JWT)
|
||||
// 当前登录用户修改自己的密码;登录人由中间件写入的 X-Username 头确定。
|
||||
func changePasswordHandler(ctx *svc.ServiceContext) http.HandlerFunc {
|
||||
|
||||
Reference in New Issue
Block a user