memberListLogic.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package member
  2. import (
  3. "context"
  4. "perms-system-server/internal/middleware"
  5. "perms-system-server/internal/model/productmember"
  6. "perms-system-server/internal/response"
  7. "perms-system-server/internal/svc"
  8. "perms-system-server/internal/types"
  9. "perms-system-server/internal/util"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. )
  12. type MemberListLogic struct {
  13. logx.Logger
  14. ctx context.Context
  15. svcCtx *svc.ServiceContext
  16. }
  17. // userDisplay 审计 L-R18-4:把 MemberList 里原先用的匿名 `struct{ Username, Nickname string }`
  18. // 具名化。匿名类型每次构造都要重新推导,IDE 跳转 / pprof 看到的类型字符串形如
  19. // `struct{Username string; Nickname string}`,排障时难以按类型名反查用途;具名后一目了然。
  20. type userDisplay struct {
  21. Username string
  22. Nickname string
  23. }
  24. func NewMemberListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MemberListLogic {
  25. return &MemberListLogic{
  26. Logger: logx.WithContext(ctx),
  27. ctx: ctx,
  28. svcCtx: svcCtx,
  29. }
  30. }
  31. // MemberList 成员列表。按产品分页查询成员信息,包含用户名、昵称和成员类型,用于产品成员管理页面。
  32. func (l *MemberListLogic) MemberList(req *types.MemberListReq) (resp *types.PageResp, err error) {
  33. page, pageSize := util.NormalizePage(req.Page, req.PageSize)
  34. caller := middleware.GetUserDetails(l.ctx)
  35. if caller == nil {
  36. return nil, response.ErrUnauthorized("未登录")
  37. }
  38. var productCode string
  39. if caller.IsSuperAdmin {
  40. productCode = req.ProductCode
  41. } else {
  42. productCode = middleware.GetProductCode(l.ctx)
  43. if productCode == "" {
  44. return nil, response.ErrForbidden("缺少产品上下文")
  45. }
  46. }
  47. var list []*productmember.SysProductMember
  48. var total int64
  49. if productCode != "" {
  50. list, total, err = l.svcCtx.SysProductMemberModel.FindListByProductCode(l.ctx, productCode, page, pageSize)
  51. } else {
  52. list, total, err = l.svcCtx.SysProductMemberModel.FindListByPage(l.ctx, page, pageSize)
  53. }
  54. if err != nil {
  55. return nil, err
  56. }
  57. userIds := make([]int64, 0, len(list))
  58. for _, m := range list {
  59. userIds = append(userIds, m.UserId)
  60. }
  61. users, err := l.svcCtx.SysUserModel.FindByIds(l.ctx, userIds)
  62. if err != nil {
  63. return nil, err
  64. }
  65. userMap := make(map[int64]userDisplay, len(users))
  66. for _, u := range users {
  67. userMap[u.Id] = userDisplay{Username: u.Username, Nickname: u.Nickname}
  68. }
  69. items := make([]types.MemberItem, 0, len(list))
  70. for _, m := range list {
  71. var username, nickname string
  72. if u, ok := userMap[m.UserId]; ok {
  73. username = u.Username
  74. nickname = u.Nickname
  75. }
  76. items = append(items, types.MemberItem{
  77. Id: m.Id,
  78. ProductCode: m.ProductCode,
  79. UserId: m.UserId,
  80. Username: username,
  81. Nickname: nickname,
  82. MemberType: m.MemberType,
  83. Status: m.Status,
  84. CreateTime: m.CreateTime,
  85. })
  86. }
  87. return &types.PageResp{
  88. Total: total,
  89. List: items,
  90. }, nil
  91. }