Files
lckt-server/service/user/user.go

391 lines
10 KiB
Go

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
}