package member import ( "context" "perms-system-server/internal/middleware" "perms-system-server/internal/response" "perms-system-server/internal/svc" "perms-system-server/internal/types" "perms-system-server/internal/util" "github.com/zeromicro/go-zero/core/logx" ) type MemberListLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } // userDisplay 审计 L-R18-4:把 MemberList 里原先用的匿名 `struct{ Username, Nickname string }` // 具名化。匿名类型每次构造都要重新推导,IDE 跳转 / pprof 看到的类型字符串形如 // `struct{Username string; Nickname string}`,排障时难以按类型名反查用途;具名后一目了然。 type userDisplay struct { Username string Nickname string } func NewMemberListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MemberListLogic { return &MemberListLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } // MemberList 成员列表。按产品分页查询成员信息,包含用户名、昵称和成员类型,用于产品成员管理页面。 func (l *MemberListLogic) MemberList(req *types.MemberListReq) (resp *types.PageResp, err error) { page, pageSize := util.NormalizePage(req.Page, req.PageSize) caller := middleware.GetUserDetails(l.ctx) if caller == nil { return nil, response.ErrUnauthorized("未登录") } if !caller.IsSuperAdmin && caller.ProductCode != req.ProductCode { return nil, response.ErrForbidden("无权访问该产品的数据") } list, total, err := l.svcCtx.SysProductMemberModel.FindListByProductCode(l.ctx, req.ProductCode, page, pageSize) if err != nil { return nil, err } userIds := make([]int64, 0, len(list)) for _, m := range list { userIds = append(userIds, m.UserId) } users, err := l.svcCtx.SysUserModel.FindByIds(l.ctx, userIds) if err != nil { return nil, err } userMap := make(map[int64]userDisplay, len(users)) for _, u := range users { userMap[u.Id] = userDisplay{Username: u.Username, Nickname: u.Nickname} } items := make([]types.MemberItem, 0, len(list)) for _, m := range list { var username, nickname string if u, ok := userMap[m.UserId]; ok { username = u.Username nickname = u.Nickname } items = append(items, types.MemberItem{ Id: m.Id, ProductCode: m.ProductCode, UserId: m.UserId, Username: username, Nickname: nickname, MemberType: m.MemberType, Status: m.Status, CreateTime: m.CreateTime, }) } return &types.PageResp{ Total: total, List: items, }, nil }