You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
4.1 KiB
Go
180 lines
4.1 KiB
Go
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))
|
|
}
|