user.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package user
  2. import (
  3. "UserManager/internal/dao"
  4. "UserManager/internal/model"
  5. "UserManager/internal/service"
  6. "context"
  7. "github.com/gogf/gf/v2/crypto/gmd5"
  8. "github.com/gogf/gf/v2/errors/gerror"
  9. "github.com/gogf/gf/v2/frame/g"
  10. "github.com/gogf/gf/v2/util/guid"
  11. )
  12. type sUser struct{}
  13. func init() { service.RegisterUser(New()) }
  14. func New() *sUser { return &sUser{} }
  15. // Register 业务:唯一性校验 + 加密密码 + 插入
  16. func (s *sUser) Register(ctx context.Context, in model.UserRegisterInput) error {
  17. // 账号是否已存在
  18. count, err := dao.User.Ctx(ctx).Where("passport", in.Passport).Count()
  19. if err != nil {
  20. return err
  21. }
  22. if count > 0 {
  23. return gerror.New("账号已存在")
  24. }
  25. // 写入
  26. _, err = dao.User.Ctx(ctx).Data(g.Map{
  27. "passport": in.Passport,
  28. "password": gmd5.MustEncryptString(in.Password),
  29. "nickname": in.Nickname,
  30. }).Insert()
  31. return err
  32. }
  33. // GetList 获取用户列表
  34. func (s *sUser) GetList(ctx context.Context, in model.UserListInput) (out *model.UserListOutput, err error) {
  35. out = &model.UserListOutput{
  36. Page: in.Page,
  37. }
  38. m := dao.User.Ctx(ctx)
  39. // 条件查询
  40. if in.Passport != "" {
  41. m = m.WhereLike("passport", "%"+in.Passport+"%")
  42. }
  43. if in.Nickname != "" {
  44. m = m.WhereLike("nickname", "%"+in.Nickname+"%")
  45. }
  46. // 获取总数
  47. out.Total, err = m.Count()
  48. if err != nil {
  49. return nil, err
  50. }
  51. // 分页查询
  52. err = m.Page(in.Page, in.PageSize).Scan(&out.List)
  53. if err != nil {
  54. return nil, err
  55. }
  56. return out, nil
  57. }
  58. // GetByPassport 根据账号获取用户信息
  59. func (s *sUser) GetByPassport(ctx context.Context, passport string) (out *model.UserOutput, err error) {
  60. err = dao.User.Ctx(ctx).Where("passport", passport).Scan(&out)
  61. return out, err
  62. }
  63. // Login 用户登录
  64. func (s *sUser) Login(ctx context.Context, in model.UserLoginInput) (out *model.UserLoginOutput, err error) {
  65. // 1. 根据账号查询用户
  66. var user *model.UserOutput
  67. err = dao.User.Ctx(ctx).Where("passport", in.Passport).Scan(&user)
  68. if err != nil {
  69. return nil, gerror.New("登录失败,请稍后重试") // 不返回具体错误
  70. }
  71. // 2. 用户不存在
  72. if user == nil {
  73. return nil, gerror.New("账号或密码错误") // 模糊错误信息
  74. }
  75. // 3. 验证密码
  76. encryptedPassword := gmd5.MustEncryptString(in.Password)
  77. correctPassword, err := dao.User.Ctx(ctx).
  78. Where("passport", in.Passport).
  79. Where("password", encryptedPassword).
  80. Count()
  81. if err != nil {
  82. return nil, gerror.New("登录失败,请稍后重试")
  83. }
  84. if correctPassword == 0 {
  85. return nil, gerror.New("账号或密码错误") // 模糊错误信息
  86. }
  87. // 4. 生成token
  88. token := guid.S()
  89. // 5. 返回登录结果
  90. out = &model.UserLoginOutput{
  91. Token: token,
  92. UserInfo: user,
  93. }
  94. return out, nil
  95. }