package user import ( "UserManager/internal/dao" "UserManager/internal/model" "UserManager/internal/service" "context" "github.com/gogf/gf/v2/crypto/gmd5" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/guid" ) type sUser struct{} func init() { service.RegisterUser(New()) } func New() *sUser { return &sUser{} } // Register 业务:唯一性校验 + 加密密码 + 插入 func (s *sUser) Register(ctx context.Context, in model.UserRegisterInput) error { // 账号是否已存在 count, err := dao.User.Ctx(ctx).Where("passport", in.Passport).Count() if err != nil { return err } if count > 0 { return gerror.New("账号已存在") } // 写入 _, err = dao.User.Ctx(ctx).Data(g.Map{ "passport": in.Passport, "password": gmd5.MustEncryptString(in.Password), "nickname": in.Nickname, }).Insert() return err } // GetList 获取用户列表 func (s *sUser) GetList(ctx context.Context, in model.UserListInput) (out *model.UserListOutput, err error) { out = &model.UserListOutput{ Page: in.Page, } m := dao.User.Ctx(ctx) // 条件查询 if in.Passport != "" { m = m.WhereLike("passport", "%"+in.Passport+"%") } if in.Nickname != "" { m = m.WhereLike("nickname", "%"+in.Nickname+"%") } // 获取总数 out.Total, err = m.Count() if err != nil { return nil, err } // 分页查询 err = m.Page(in.Page, in.PageSize).Scan(&out.List) if err != nil { return nil, err } return out, nil } // GetByPassport 根据账号获取用户信息 func (s *sUser) GetByPassport(ctx context.Context, passport string) (out *model.UserOutput, err error) { err = dao.User.Ctx(ctx).Where("passport", passport).Scan(&out) return out, err } // Login 用户登录 func (s *sUser) Login(ctx context.Context, in model.UserLoginInput) (out *model.UserLoginOutput, err error) { // 1. 根据账号查询用户 var user *model.UserOutput err = dao.User.Ctx(ctx).Where("passport", in.Passport).Scan(&user) if err != nil { return nil, gerror.New("登录失败,请稍后重试") // 不返回具体错误 } // 2. 用户不存在 if user == nil { return nil, gerror.New("账号或密码错误") // 模糊错误信息 } // 3. 验证密码 encryptedPassword := gmd5.MustEncryptString(in.Password) correctPassword, err := dao.User.Ctx(ctx). Where("passport", in.Passport). Where("password", encryptedPassword). Count() if err != nil { return nil, gerror.New("登录失败,请稍后重试") } if correctPassword == 0 { return nil, gerror.New("账号或密码错误") // 模糊错误信息 } // 4. 生成token token := guid.S() // 5. 返回登录结果 out = &model.UserLoginOutput{ Token: token, UserInfo: user, } return out, nil }