🎨 新增余额记录功能
This commit is contained in:
@@ -406,6 +406,38 @@ func (a *AppUserApi) BindPhone(context *gin.Context) {
|
|||||||
r.OkWithDetailed(user, "绑定手机号成功", context)
|
r.OkWithDetailed(user, "绑定手机号成功", context)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetBalanceLog 获取用户余额变动日志
|
||||||
|
func (a *AppUserApi) GetBalanceLog(context *gin.Context) {
|
||||||
|
var p common.PageInfo
|
||||||
|
if err := context.ShouldBind(&p); err != nil {
|
||||||
|
global.GVA_LOG.Error("参数错误,获取用户余额变动日志失败", zap.Error(err))
|
||||||
|
r.FailWithMessage("参数错误,获取用户余额变动日志失败", context)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
id := user_jwt.GetUserID(context)
|
||||||
|
if id == 0 {
|
||||||
|
global.GVA_LOG.Error("获取用户ID失败")
|
||||||
|
r.FailWithMessage("获取用户ID失败", context)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
logs, total, err := appUserService.GetBalanceLog(id, p)
|
||||||
|
if err != nil {
|
||||||
|
global.GVA_LOG.Error("获取用户余额变动日志失败", zap.Error(err))
|
||||||
|
r.FailWithMessage("获取用户余额变动日志失败", context)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
r.OkWithDetailed(
|
||||||
|
r.PageResult{
|
||||||
|
List: logs,
|
||||||
|
Total: total,
|
||||||
|
Page: p.Page,
|
||||||
|
PageSize: p.PageSize,
|
||||||
|
}, "获取用户余额变动日志成功", context)
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------讲师相关---------------------
|
// -----------------讲师相关---------------------
|
||||||
|
|
||||||
// GetTeacherList 获取讲师列表
|
// GetTeacherList 获取讲师列表
|
||||||
|
|||||||
@@ -86,6 +86,8 @@ func RegisterTables() {
|
|||||||
user.LoginLog{},
|
user.LoginLog{},
|
||||||
app.RedeemCode{},
|
app.RedeemCode{},
|
||||||
app.CDK{},
|
app.CDK{},
|
||||||
|
app.BalanceLog{},
|
||||||
|
app.With{},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.GVA_LOG.Error("register table failed", zap.Error(err))
|
global.GVA_LOG.Error("register table failed", zap.Error(err))
|
||||||
|
|||||||
15
model/app/balance_log.go
Normal file
15
model/app/balance_log.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import "git.echol.cn/loser/lckt/global"
|
||||||
|
|
||||||
|
type BalanceLog struct {
|
||||||
|
global.GVA_MODEL
|
||||||
|
UserID uint `json:"userId" form:"userId" gorm:"comment:用户ID"`
|
||||||
|
ChangeType int `json:"changeType" form:"changeType" gorm:"comment:变动类型 1 增加 2 减少"`
|
||||||
|
ChangeValue float64 `json:"changeValue" form:"changeValue" gorm:"comment:变动值"`
|
||||||
|
Balance float64 `json:"balance" form:"balance" gorm:"comment:变动后余额"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (BalanceLog) TableName() string {
|
||||||
|
return "app_balance_log"
|
||||||
|
}
|
||||||
@@ -51,8 +51,9 @@ type GetUserListReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SetBalanceReq struct {
|
type SetBalanceReq struct {
|
||||||
Id int `json:"id" form:"id" vd:"@:len($)>0; msg:'用户ID不能为空'"`
|
Id int `json:"id" form:"id" vd:"@:len($)>0; msg:'用户ID不能为空'"`
|
||||||
Balance float32 `json:"balance" form:"balance" vd:"@:len($)>0; msg:'余额不能为空'"`
|
Balance float64 `json:"balance" form:"balance" vd:"@:len($)>0; msg:'余额不能为空'"`
|
||||||
|
ChangeType int `json:"change_type" form:"change_type" vd:"@:len($)>0; msg:'变动类型不能为空'"` // 1 增加 2 减少
|
||||||
}
|
}
|
||||||
|
|
||||||
type PwdLoginReq struct {
|
type PwdLoginReq struct {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ func (s *UserRouter) InitAppUserRouter(AppAuthGroup, PublicRouter *gin.RouterGro
|
|||||||
appUserRouter.POST("/follow", userApi.FollowTeacher) // 关注/取关讲师
|
appUserRouter.POST("/follow", userApi.FollowTeacher) // 关注/取关讲师
|
||||||
appUserRouter.GET("/followStatus", userApi.GetFollowStatus) // 获取关注状态
|
appUserRouter.GET("/followStatus", userApi.GetFollowStatus) // 获取关注状态
|
||||||
appUserRouter.GET("/vipTeachers", userApi.GetVipTeacherList) // 获取VIP讲师列表
|
appUserRouter.GET("/vipTeachers", userApi.GetVipTeacherList) // 获取VIP讲师列表
|
||||||
|
appUserRouter.GET("/balanceLog", userApi.GetBalanceLog) // 获取余额变动日志
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
publicRouter.POST("wxLogin", userApi.WechatLogin) // 微信登录
|
publicRouter.POST("wxLogin", userApi.WechatLogin) // 微信登录
|
||||||
|
|||||||
@@ -375,6 +375,7 @@ func (u *AppUserService) IsFollowTeacher(userId, teacherId uint) (bool, error) {
|
|||||||
return count > 0, nil
|
return count > 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetVipTeacherList 获取用户购买的讲师VIP列表
|
||||||
func (u *AppUserService) GetVipTeacherList(p common.PageInfo, userId uint) (list []vo.TeacherInfo, total int64, err error) {
|
func (u *AppUserService) GetVipTeacherList(p common.PageInfo, userId uint) (list []vo.TeacherInfo, total int64, err error) {
|
||||||
limit := p.PageSize
|
limit := p.PageSize
|
||||||
offset := (p.Page - 1) * p.PageSize
|
offset := (p.Page - 1) * p.PageSize
|
||||||
@@ -416,3 +417,24 @@ func (u *AppUserService) GetVipTeacherList(p common.PageInfo, userId uint) (list
|
|||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetBalanceLog 获取用户余额变动日志
|
||||||
|
func (u *AppUserService) GetBalanceLog(id uint, p common.PageInfo) (list []app.BalanceLog, total int64, err error) {
|
||||||
|
limit := p.PageSize
|
||||||
|
offset := (p.Page - 1) * p.PageSize
|
||||||
|
|
||||||
|
db := global.GVA_DB.Model(&app.BalanceLog{}).Where("user_id = ?", id)
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -93,9 +93,47 @@ func (u *UserService) GetUserList(p request.GetUserListReq) (userList []user.Use
|
|||||||
|
|
||||||
// SetBalance 设置用户余额
|
// SetBalance 设置用户余额
|
||||||
func (u *UserService) SetBalance(p request.SetBalanceReq) (err error) {
|
func (u *UserService) SetBalance(p request.SetBalanceReq) (err error) {
|
||||||
err = global.GVA_DB.Model(&user.User{}).Where("id = ?", p.Id).Update("balance", p.Balance).Error
|
// 1. 查询用户
|
||||||
|
var userInfo user.User
|
||||||
|
err = global.GVA_DB.Model(&userInfo).Where("id = ?", p.Id).First(&userInfo).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.GVA_LOG.Error("设置用户余额失败", zap.Error(err))
|
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
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@@ -165,6 +203,7 @@ func (u *UserService) SetUserStatus(id string) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetTeachers 获取教师列表
|
||||||
func (u *UserService) GetTeachers(p common.PageInfo) (list []vo.UserInfo, total int64, err error) {
|
func (u *UserService) GetTeachers(p common.PageInfo) (list []vo.UserInfo, total int64, err error) {
|
||||||
limit := p.PageSize
|
limit := p.PageSize
|
||||||
offset := p.PageSize * (p.Page - 1)
|
offset := p.PageSize * (p.Page - 1)
|
||||||
@@ -180,6 +219,7 @@ func (u *UserService) GetTeachers(p common.PageInfo) (list []vo.UserInfo, total
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetTeacherApplyList 获取教师申请列表
|
||||||
func (u *UserService) GetTeacherApplyList(p request.GetTeacherApplyListReq) (list []app.TeacherApply, total int64, err error) {
|
func (u *UserService) GetTeacherApplyList(p request.GetTeacherApplyListReq) (list []app.TeacherApply, total int64, err error) {
|
||||||
query := global.GVA_DB.Model(&app.TeacherApply{})
|
query := global.GVA_DB.Model(&app.TeacherApply{})
|
||||||
|
|
||||||
@@ -204,6 +244,7 @@ func (u *UserService) GetTeacherApplyList(p request.GetTeacherApplyListReq) (lis
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateTeacherApplyStatus 更新教师申请状态
|
||||||
func (u *UserService) UpdateTeacherApplyStatus(p app.TeacherApply) (err error) {
|
func (u *UserService) UpdateTeacherApplyStatus(p app.TeacherApply) (err error) {
|
||||||
err = global.GVA_DB.Updates(&p).Error
|
err = global.GVA_DB.Updates(&p).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -229,6 +270,7 @@ func (u *UserService) UpdateTeacherApplyStatus(p app.TeacherApply) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetUserVip 设置用户为VIP
|
||||||
func (u *UserService) SetUserVip(p request.SetUserVipReq) error {
|
func (u *UserService) SetUserVip(p request.SetUserVipReq) error {
|
||||||
var user user.User
|
var user user.User
|
||||||
err := global.GVA_DB.Model(&user).Where("id = ?", p.Id).First(&user).Error
|
err := global.GVA_DB.Model(&user).Where("id = ?", p.Id).First(&user).Error
|
||||||
@@ -249,6 +291,7 @@ func (u *UserService) SetUserVip(p request.SetUserVipReq) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLoginLog 获取登录日志
|
||||||
func (u *UserService) GetLoginLog(p request.GetUserListReq) (list []user.LoginLog, total int64, err error) {
|
func (u *UserService) GetLoginLog(p request.GetUserListReq) (list []user.LoginLog, total int64, err error) {
|
||||||
limit := p.PageSize
|
limit := p.PageSize
|
||||||
offset := (p.Page - 1) * p.PageSize
|
offset := (p.Page - 1) * p.PageSize
|
||||||
@@ -273,6 +316,7 @@ func (u *UserService) GetLoginLog(p request.GetUserListReq) (list []user.LoginLo
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveUserVip 移除用户VIP
|
||||||
func (u *UserService) RemoveUserVip(id int) error {
|
func (u *UserService) RemoveUserVip(id int) error {
|
||||||
var user user.User
|
var user user.User
|
||||||
err := global.GVA_DB.Model(&user).Where("id = ?", id).First(&user).Error
|
err := global.GVA_DB.Model(&user).Where("id = ?", id).First(&user).Error
|
||||||
@@ -293,6 +337,7 @@ func (u *UserService) RemoveUserVip(id int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetUserVipList 获取用户会员列表
|
||||||
func (u *UserService) GetUserVipList(p request.GetUserListReq) (list []vo.UserInfo, total int64, err error) {
|
func (u *UserService) GetUserVipList(p request.GetUserListReq) (list []vo.UserInfo, total int64, err error) {
|
||||||
limit := p.PageSize
|
limit := p.PageSize
|
||||||
offset := (p.Page - 1) * p.PageSize
|
offset := (p.Page - 1) * p.PageSize
|
||||||
|
|||||||
Reference in New Issue
Block a user