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.

163 lines
3.9 KiB
Go

3 weeks ago
package user
import (
coupon2 "cls-server/internal/application/coupon"
"cls-server/internal/application/crypto"
gift_log "cls-server/internal/application/gift_log"
"cls-server/internal/domain/coupon"
gift_log2 "cls-server/internal/domain/gift_log"
"cls-server/internal/domain/user"
"cls-server/pkg/logger"
"cls-server/pkg/util/page"
"cls-server/pkg/web"
"errors"
"fmt"
"math/rand"
"regexp"
"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
uglAggregate user.UserGiftLogAggregateRepository
couponRepo coupon.CouponRepository
log logger.Logger
}
func NewUserService(repo user.UserRepository,
phoneEncryption *crypto.PhoneEncryptionService,
uglAggregate user.UserGiftLogAggregateRepository,
couponRepo coupon.CouponRepository,
passwordHash *crypto.PasswordHashService, logger logger.New) *UserService {
return &UserService{
repo: repo,
phoneEncryption: phoneEncryption,
passwordHash: passwordHash,
uglAggregate: uglAggregate,
couponRepo: couponRepo,
log: logger("panoramic:AccountModule:UserService"),
}
}
// ListUsers 获取用户列表
func (u *UserService) ListUsers(p *page.Page, params map[string]string) error {
conds := web.ParseFilters(params)
data := make([]*user.User, 0)
p.Content = &data
err := u.repo.FindAll(p, conds)
if err != nil {
u.log.Error(err)
return err
}
dtoData := make([]*UserDto, 0, len(data))
for _, v := range data {
sP, err := u.phoneEncryption.StringPhone(v.Phone)
if err != nil {
u.log.Error(err)
continue
}
dtoData = append(dtoData, &UserDto{
Uid: v.Id,
Username: v.Username,
Phone: sP,
Password: v.Password != "",
GiftCount: v.GiftCount,
Status: v.Status,
})
}
p.Content = &dtoData
return nil
}
func (u *UserService) GiveGift(gl *gift_log.GiftLogDto) error {
ugla, err := u.uglAggregate.GetUserGiftLogAggregate(gl.UserId)
if err != nil {
u.log.Error(err)
return err
}
fmt.Printf("%+v\n", ugla)
err = ugla.AddGiftToUser(&gift_log2.GiftLog{
Id: gl.Id,
AdminId: gl.AdminId,
UserId: gl.UserId,
Num: gl.Num,
})
if err != nil {
u.log.Error(err)
return err
}
err = u.uglAggregate.SaveUserGiftLogAggregate(ugla)
if err != nil {
u.log.Error(err)
}
return err
}
func (u *UserService) GiveCoupon(uc *coupon2.CouponDto) error {
fmt.Println("发放优惠券", uc)
err := u.couponRepo.Create(&coupon.Coupon{
Name: uc.Name,
Type: uc.Type,
Value: uc.Value,
MinAmount: uc.MinAmount,
StartTime: uc.StartTime,
EndTime: uc.EndTime,
AdminID: uc.AdminId,
UserID: uc.UserId,
})
if err != nil {
u.log.Error(err)
}
return err
}
// 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))
}