package user import ( "context" "fmt" "git.echol.cn/loser/lckt/global" "git.echol.cn/loser/lckt/model/app" "git.echol.cn/loser/lckt/model/app/vo" common "git.echol.cn/loser/lckt/model/common/request" "git.echol.cn/loser/lckt/model/user" "git.echol.cn/loser/lckt/model/user/request" "git.echol.cn/loser/lckt/utils/sms" "go.uber.org/zap" "golang.org/x/crypto/bcrypt" "math/rand" "time" ) type UserService struct{} func (u *UserService) GetUserById(id string) (user user.User, err error) { err = global.GVA_DB.Where("id = ?", id).First(&user).Error if err != nil { global.GVA_LOG.Error("查询用户失败", zap.Error(err)) return } return } // SendCode 发送验证码 func (u *UserService) SendCode(req request.SendCodeReq) (err error) { rdb := global.GVA_REDIS key := fmt.Sprintf("VerifyCode:%s", req.Phone) // 发送频率检查 result, err := rdb.Get(context.Background(), key).Result() if result != "" { global.GVA_LOG.Error("验证码发送过于频繁", zap.String("phone", req.Phone)) err = fmt.Errorf("验证码发送过于频繁,请稍后再试") return } rand.New(rand.NewSource(time.Now().UnixNano())) verifyCode := fmt.Sprintf("%06v", rand.Int31n(1000000)) if ok := sms.DxbSendSMS(req.Phone, verifyCode); !ok { global.GVA_LOG.Error("发送验证码失败") return } if err = rdb.Set(context.Background(), key, verifyCode, 5*time.Minute).Err(); err != nil { global.GVA_LOG.Error("设置验证码缓存失败", zap.Error(err)) return } return } // GetUserList 获取用户列表 func (u *UserService) GetUserList(p request.GetUserListReq) (userList []user.User, total int64, err error) { limit := p.PageSize offset := p.PageSize * (p.Page - 1) // 创建db db := global.GVA_DB.Model(&user.User{}) // 如果有条件搜索 下方会自动创建搜索语句 if p.Type != 0 { db = db.Where("user_type = ?", p.Type) } if p.UserLabel != "" { db = db.Where("user_label = ?", p.UserLabel) } if p.Status == 1 { db = db.Where("status = 1") } if p.Status == 2 { db = db.Where("status = 0") } if p.Name != "" { db = db.Where("nick_name like ?", "%"+p.Name+"%") } err = db.Count(&total).Error if err != nil { return } if limit != 0 { db = db.Limit(limit).Offset(offset) } err = db.Find(&userList).Error return } // SetBalance 设置用户余额 func (u *UserService) SetBalance(p request.SetBalanceReq) (err error) { // 1. 查询用户 var userInfo user.User err = global.GVA_DB.Model(&userInfo).Where("id = ?", p.Id).First(&userInfo).Error if err != nil { global.GVA_LOG.Error("查询用户失败", zap.Error(err)) return } if p.ChangeType == 1 { // 增加 userInfo.Balance += p.Balance err = global.GVA_DB.Save(&userInfo).Error if err != nil { global.GVA_LOG.Error("增加用户余额失败", zap.Error(err)) return } } else { // 减少 if userInfo.Balance < p.Balance { // 余额不足 err = fmt.Errorf("用户余额不足") return } userInfo.Balance -= p.Balance err = global.GVA_DB.Save(&userInfo).Error if err != nil { global.GVA_LOG.Error("减少用户余额失败", zap.Error(err)) return } } // 记录日志 balanceLog := app.BalanceLog{ UserID: uint(p.Id), ChangeType: p.ChangeType, ChangeValue: p.Balance, Balance: userInfo.Balance, } err = global.GVA_DB.Create(&balanceLog).Error if err != nil { global.GVA_LOG.Error("记录用户余额变动日志失败", zap.Error(err)) return } return } // Register 用户注册-后台用 func (u *UserService) Register(req request.RegisterReq) (err error) { // 1. 判断用户是否存在 var count int64 err = global.GVA_DB.Model(&user.User{}).Where("phone = ?", req.Phone).Count(&count).Error if err != nil { global.GVA_LOG.Error("查询用户失败", zap.Error(err)) return } if count == 0 { var password []byte password, err = bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost) if err != nil { global.GVA_LOG.Error("密码加密失败", zap.Error(err)) return } user := user.User{ Phone: req.Phone, Password: string(password), NickName: req.NickName, UserLabel: req.UserLabel, Status: 1, UserType: req.UserType, } if req.UserLabel != 0 { user.IsVip = 1 date := time.Now().Truncate(24*time.Hour).AddDate(0, 0, 30) //将date转为string user.VipExpireTime = date.Format("2006-01-02 15:04:05") } err = global.GVA_DB.Save(&user).Error if err != nil { global.GVA_LOG.Error("创建用户失败", zap.Error(err)) return } return } else { err = fmt.Errorf("用户已存在") } return } // SetUserStatus 设置用户状态 func (u *UserService) SetUserStatus(id string) (err error) { user := user.User{} err = global.GVA_DB.Model(&user).Where("id = ?", id).First(&user).Error if err != nil { global.GVA_LOG.Error("查询用户状态失败", zap.Error(err)) return } if user.Status == 1 { err = global.GVA_DB.Model(&user).Where("id = ?", id).Update("status", 0).Error } else { err = global.GVA_DB.Model(&user).Where("id = ?", id).Update("status", 1).Error } if err != nil { global.GVA_LOG.Error("设置用户状态失败", zap.Error(err)) return } return } // GetTeachers 获取教师列表 func (u *UserService) GetTeachers(p common.PageInfo) (list []vo.UserInfo, total int64, err error) { limit := p.PageSize offset := p.PageSize * (p.Page - 1) // 创建db db := global.GVA_DB.Model(&user.User{}).Where("user_type = ?", 2) err = db.Count(&total).Error if err != nil { return } err = db.Limit(limit).Offset(offset).Find(&list).Error return } // GetTeacherApplyList 获取教师申请列表 func (u *UserService) GetTeacherApplyList(p request.GetTeacherApplyListReq) (list []app.TeacherApply, total int64, err error) { query := global.GVA_DB.Model(&app.TeacherApply{}) if p.Phone != "" { query = query.Where("phone LIKE ?", "%"+p.Phone+"%") } if p.Nickname != "" { query = query.Where("nick_name LIKE ?", "%"+p.Nickname+"%") } err = query.Count(&total).Error if err != nil { global.GVA_LOG.Error("查询申请列表总数失败", zap.Error(err)) return } err = query.Offset((p.Page - 1) * p.PageSize).Limit(p.PageSize).Order("created_at desc").Find(&list).Error if err != nil { global.GVA_LOG.Error("查询申请列表失败", zap.Error(err)) return } return } // UpdateTeacherApplyStatus 更新教师申请状态 func (u *UserService) UpdateTeacherApplyStatus(p app.TeacherApply) (err error) { err = global.GVA_DB.Updates(&p).Error if err != nil { global.GVA_LOG.Error("更新教师申请状态失败", zap.Error(err)) return } // 如果申请通过,更新用户类型为教师 if p.Status == 1 { var user user.User err = global.GVA_DB.Model(&user).Where("id = ?", p.UserId).First(&user).Error if err != nil { global.GVA_LOG.Error("查询用户信息失败", zap.Error(err)) return } user.UserType = 2 // 设置为教师 err = global.GVA_DB.Save(&user).Error if err != nil { global.GVA_LOG.Error("更新用户类型失败", zap.Error(err)) return } } return } // SetUserVip 设置用户为VIP func (u *UserService) SetUserVip(p request.SetUserVipReq) error { var user user.User err := global.GVA_DB.Model(&user).Where("id = ?", p.Id).First(&user).Error if err != nil { global.GVA_LOG.Error("查询用户信息失败", zap.Error(err)) return err } user.IsVip = 1 user.UserLabel = p.UserLabel user.VipExpireTime = p.VipExpireTime err = global.GVA_DB.Save(&user).Error if err != nil { global.GVA_LOG.Error("设置用户VIP失败", zap.Error(err)) return err } return nil } // GetLoginLog 获取登录日志 func (u *UserService) GetLoginLog(p request.GetUserListReq) (list []user.LoginLog, total int64, err error) { limit := p.PageSize offset := (p.Page - 1) * p.PageSize db := global.GVA_DB.Model(&user.LoginLog{}) if p.UserId != 0 { db = db.Where("user_id = ?", p.UserId) } if p.Name != "" { db = db.Where("user_name LIKE ?", "%"+p.Name+"%") } err = db.Count(&total).Error if err != nil { global.GVA_LOG.Error("查询登录日志总数失败", zap.Error(err)) return nil, 0, err } err = db.Limit(limit).Offset(offset).Order("created_at desc").Find(&list).Error if err != nil { global.GVA_LOG.Error("查询登录日志列表失败", zap.Error(err)) return nil, 0, err } return } // RemoveUserVip 移除用户VIP func (u *UserService) RemoveUserVip(id int) error { var user user.User err := global.GVA_DB.Model(&user).Where("id = ?", id).First(&user).Error if err != nil { global.GVA_LOG.Error("查询用户信息失败", zap.Error(err)) return err } user.IsVip = 0 user.UserLabel = 1 user.VipExpireTime = "" err = global.GVA_DB.Save(&user).Error if err != nil { global.GVA_LOG.Error("移除用户VIP失败", zap.Error(err)) return err } return nil } // GetUserVipList 获取用户会员列表 func (u *UserService) GetUserVipList(p request.GetUserListReq) (list []vo.UserInfo, total int64, err error) { limit := p.PageSize offset := (p.Page - 1) * p.PageSize db := global.GVA_DB.Model(&user.User{}).Where("is_vip = ? and status = 1", 1) if p.Name != "" { db = db.Where("nick_name LIKE ?", "%"+p.Name+"%") } if p.UserId != 0 { db = db.Where("id = ?", p.UserId) } err = db.Count(&total).Error if err != nil { global.GVA_LOG.Error("查询用户会员总数失败", zap.Error(err)) return nil, 0, err } err = db.Limit(limit).Offset(offset).Order("created_at desc").Find(&list).Error if err != nil { global.GVA_LOG.Error("查询用户会员列表失败", zap.Error(err)) return nil, 0, err } return } // SetTeacherWeight 设置讲师权重 func (u *UserService) SetTeacherWeight(p request.SetTeacherInfo) (err error) { err = global.GVA_DB.Model(&user.User{}).Where("id = ?", p.Id).Update("weight", p.Weight).Error if err != nil { global.GVA_LOG.Error("设置讲师权重失败", zap.Error(err)) return } return } // SetTeacherExpectRate 设置讲师分成 func (u *UserService) SetTeacherExpectRate(p request.SetTeacherInfo) (err error) { err = global.GVA_DB.Model(&user.User{}).Where("id = ?", p.Id).Update("expect_rate", p.ExpectRate).Error if err != nil { global.GVA_LOG.Error("设置讲师权重失败", zap.Error(err)) return } return }