package user import ( "cls/internal/application/crypto" "cls/internal/domain/user" "cls/pkg/logger" "cls/pkg/util/page" "errors" "fmt" "math/rand" "regexp" "strings" "time" ) var ( ErrInvalidPhone = errors.New("手机号格式不正确") ErrInvalidVerifyCode = errors.New("验证码不正确") ErrVerifyCodeExpired = errors.New("验证码已过期") ErrUserNotFound = errors.New("用户不存在") ) const ( VerifyCodeKeyPrefix = "sms:verify:code:" // Redis中验证码的key前缀 VerifyCodeExpiration = 5 * time.Minute // 验证码有效期5分钟 ) // UserService 用户业务逻辑 type UserService struct { repo user.UserRepository phoneEncryption *crypto.PhoneEncryptionService passwordHash *crypto.PasswordHashService log logger.Logger } func NewUserService(repo user.UserRepository, phoneEncryption *crypto.PhoneEncryptionService, passwordHash *crypto.PasswordHashService, logger logger.New) *UserService { return &UserService{ repo: repo, phoneEncryption: phoneEncryption, passwordHash: passwordHash, log: logger("panoramic:AccountModule:UserService"), } } func (u *UserService) SetPassword(phone, pwd string) error { username := strings.Join(strings.Split(phone, "")[8:], "") pwd, err := u.passwordHash.Hash(pwd) if err != nil { u.log.Error(err) return err } ePhone, err := u.phoneEncryption.Encrypt(phone) if err != nil { u.log.Error(err) return err } err = u.repo.SetPassword(username, ePhone, pwd) if err != nil { u.log.Error(err) } return err } func (u *UserService) GetUserGiftCount(ePhone string) (int, error) { c, err := u.repo.GetUserGiftCount(ePhone) if err != nil { u.log.Error(err) } return c, nil } // FindLoginUser 查找登录用户 func (u *UserService) FindLoginUser(username string) (*UserDto, error) { existUser, err := u.repo.FindByUsername(username) if err != nil { u.log.Error(err) return nil, err } return &UserDto{ Uid: existUser.Id, Username: existUser.Username, Phone: existUser.Phone, Status: existUser.Status, }, nil } func (u *UserService) GetUserProfileByePhone(ePhone string) (*UserDto, error) { user, err := u.repo.FindByPhone(ePhone) if err != nil { u.log.Error(err) return nil, err } if user == nil { u.log.Error("未找到用户") return nil, errors.New("未找到用户") } p, err := u.phoneEncryption.StringPhone(user.Phone) if err != nil { u.log.Error(err) return nil, err } return &UserDto{ Uid: user.Id, Username: user.Username, Phone: p, Password: user.Password != "", Status: user.Status, GiftCount: user.GiftCount, }, nil } func (u *UserService) GetUserInfoByPhone(phone string) (*UserDto, error) { ePhone, err := u.phoneEncryption.Encrypt(phone) if err != nil { u.log.Error(err) return nil, err } p, _ := u.phoneEncryption.StringPhone(ePhone) user, err := u.repo.FindByPhone(ePhone) if err != nil { u.log.Error(err) return nil, err } if user == nil { return nil, nil } return &UserDto{ Uid: user.Id, Username: user.Username, Phone: p, Password: user.Password != "", Status: user.Status, GiftCount: user.GiftCount, }, nil } // ListUsers 获取用户列表 func (u *UserService) ListUsers(p *page.Page, params map[string]string) error { //return u.repo.FindAll(p, params) return nil } // DisableUser 禁用用户 func (u *UserService) DisableUser(id uint64) error { existUser, err := u.repo.FindByID(id) if err != nil { return err } existUser.Status = 0 return u.repo.Save(existUser) } // EnableUser 启用用户 func (u *UserService) EnableUser(id uint64) error { existUser, err := u.repo.FindByID(id) if err != nil { return err } existUser.Status = 1 return u.repo.Save(existUser) } // isValidPhone 验证手机号格式 func isValidPhone(phone string) bool { pattern := `^1[3-9]\d{9}$` reg := regexp.MustCompile(pattern) return reg.MatchString(phone) } // generateVerifyCode 生成6位数字验证码 func generateVerifyCode() string { rand.Seed(time.Now().UnixNano()) return fmt.Sprintf("%06d", rand.Intn(1000000)) }