From a01fecdc11919ff671b35e03b7e32b1094cf1871 Mon Sep 17 00:00:00 2001 From: Yvan <8574526@qq,com> Date: Wed, 7 Jan 2026 12:00:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/service/system/user.go | 58 ++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/internal/service/system/user.go b/internal/service/system/user.go index e61f8fb..30176c9 100644 --- a/internal/service/system/user.go +++ b/internal/service/system/user.go @@ -3,6 +3,7 @@ package system import ( "context" "encoding/json" + "fmt" "kra/internal/biz/system" "kra/internal/server/middleware" @@ -224,7 +225,14 @@ type SetUserInfoRequest struct { } // SetUserInfo 设置用户信息 -func (s *UserService) SetUserInfo(ctx context.Context, req *SetUserInfoRequest) error { +func (s *UserService) SetUserInfo(ctx context.Context, adminAuthorityID uint, req *SetUserInfoRequest) error { + // 如果提供了AuthorityIds,先设置用户角色(与GVA保持一致) + if len(req.AuthorityIds) > 0 { + if err := s.uc.SetUserAuthorities(ctx, adminAuthorityID, req.ID, req.AuthorityIds); err != nil { + return err + } + } + user := &system.User{ ID: req.ID, NickName: req.NickName, @@ -275,9 +283,35 @@ type SetUserAuthorityRequest struct { AuthorityId uint `json:"authorityId"` } -// SetUserAuthority 设置用户角色(切换角色) -func (s *UserService) SetUserAuthority(ctx context.Context, userID uint, req *SetUserAuthorityRequest) error { - return s.uc.SetUserAuthority(ctx, userID, req.AuthorityId) +// SetUserAuthorityResponse 设置用户角色响应 +type SetUserAuthorityResponse struct { + Token string `json:"token"` + ExpiresAt int64 `json:"expiresAt"` +} + +// SetUserAuthority 设置用户角色(切换角色)- 返回新token +func (s *UserService) SetUserAuthority(ctx context.Context, userID uint, uuid string, username string, nickName string, req *SetUserAuthorityRequest) (*SetUserAuthorityResponse, error) { + if err := s.uc.SetUserAuthority(ctx, userID, req.AuthorityId); err != nil { + return nil, err + } + + // 生成新的JWT token(与GVA保持一致) + claims := s.jwtPkg.CreateClaims(jwt.BaseClaims{ + UUID: uuid, + ID: userID, + Username: username, + NickName: nickName, + AuthorityID: req.AuthorityId, + }) + token, err := s.jwtPkg.CreateToken(claims.BaseClaims) + if err != nil { + return nil, errors.InternalServer("TOKEN_ERROR", "生成token失败") + } + + return &SetUserAuthorityResponse{ + Token: token, + ExpiresAt: claims.ExpiresAt.UnixMilli(), + }, nil } // SetUserAuthoritiesRequest 设置用户多角色请求 @@ -455,7 +489,11 @@ func (s *UserService) handleSetUserInfo(ctx http.Context) error { if err := ctx.Bind(&req); err != nil { return err } - if err := s.SetUserInfo(ctx, &req); err != nil { + adminAuthorityID := middleware.GetAuthorityID(ctx) + if adminAuthorityID == 0 { + return errors.Unauthorized("UNAUTHORIZED", "请先登录") + } + if err := s.SetUserInfo(ctx, adminAuthorityID, &req); err != nil { return err } return ctx.Result(200, map[string]any{ @@ -526,13 +564,17 @@ func (s *UserService) handleSetUserAuthority(ctx http.Context) error { if err := ctx.Bind(&req); err != nil { return err } - userID := middleware.GetUserID(ctx) - if userID == 0 { + claims, ok := middleware.GetClaims(ctx) + if !ok { return errors.Unauthorized("UNAUTHORIZED", "请先登录") } - if err := s.SetUserAuthority(ctx, userID, &req); err != nil { + resp, err := s.SetUserAuthority(ctx, claims.BaseClaims.ID, claims.UUID, claims.Username, claims.NickName, &req) + if err != nil { return err } + // 设置响应头(与GVA保持一致) + ctx.Response().Header().Set("new-token", resp.Token) + ctx.Response().Header().Set("new-expires-at", fmt.Sprintf("%d", resp.ExpiresAt/1000)) return ctx.Result(200, map[string]any{ "code": 0, "msg": "修改成功",