| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- package controllers
- import (
- "encoding/json"
- "shudao-chat-go/models"
- "shudao-chat-go/utils"
- "github.com/beego/beego/v2/server/web"
- )
- type PointsController struct {
- web.Controller
- }
- // GetBalance 获取用户积分余额
- func (c *PointsController) GetBalance() {
- userInfo, err := utils.GetUserInfoFromContext(c.Ctx.Input.GetData("userInfo"))
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "statusCode": 401,
- "msg": "获取用户信息失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- var userData models.UserData
- if err := models.DB.Where("accountID = ?", userInfo.AccountID).First(&userData).Error; err != nil {
- c.Data["json"] = map[string]interface{}{
- "statusCode": 404,
- "msg": "未找到用户数据",
- }
- c.ServeJSON()
- return
- }
- c.Data["json"] = map[string]interface{}{
- "statusCode": 200,
- "msg": "success",
- "data": map[string]interface{}{
- "points": userData.Points,
- },
- }
- c.ServeJSON()
- }
- // ConsumePointsRequest 消费积分请求
- type ConsumePointsRequest struct {
- FileName string `json:"file_name"`
- FileURL string `json:"file_url"`
- }
- // ConsumePoints 消费积分下载文件
- func (c *PointsController) ConsumePoints() {
- userInfo, err := utils.GetUserInfoFromContext(c.Ctx.Input.GetData("userInfo"))
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "statusCode": 401,
- "msg": "获取用户信息失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- var req ConsumePointsRequest
- if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
- c.Data["json"] = map[string]interface{}{
- "statusCode": 400,
- "msg": "JSON解析失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 查询用户数据
- var userData models.UserData
- if err := models.DB.Where("accountID = ?", userInfo.AccountID).First(&userData).Error; err != nil {
- c.Data["json"] = map[string]interface{}{
- "statusCode": 404,
- "msg": "未找到用户数据",
- }
- c.ServeJSON()
- return
- }
- // 检查积分是否足够(需要10积分)
- const requiredPoints = 10
- if userData.Points < requiredPoints {
- c.Data["json"] = map[string]interface{}{
- "statusCode": 400,
- "msg": "积分不足,下载需要10积分",
- "data": map[string]interface{}{
- "current_points": userData.Points,
- "required_points": requiredPoints,
- },
- }
- c.ServeJSON()
- return
- }
- // 开启事务
- tx := models.DB.Begin()
- // 扣减积分
- newBalance := userData.Points - requiredPoints
- if err := tx.Model(&models.UserData{}).Where("id = ?", userData.ID).Update("points", newBalance).Error; err != nil {
- tx.Rollback()
- c.Data["json"] = map[string]interface{}{
- "statusCode": 500,
- "msg": "积分扣减失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 创建消费记录 - 使用原始SQL避免GORM时间字段问题
- result := tx.Exec(
- "INSERT INTO points_consumption_log (user_id, file_name, file_url, points_consumed, balance_after) VALUES (?, ?, ?, ?, ?)",
- userInfo.AccountID, req.FileName, req.FileURL, requiredPoints, newBalance,
- )
- if result.Error != nil {
- tx.Rollback()
- c.Data["json"] = map[string]interface{}{
- "statusCode": 500,
- "msg": "创建消费记录失败: " + result.Error.Error(),
- }
- c.ServeJSON()
- return
- }
- tx.Commit()
- c.Data["json"] = map[string]interface{}{
- "statusCode": 200,
- "msg": "success",
- "data": map[string]interface{}{
- "new_balance": newBalance,
- "points_consumed": requiredPoints,
- },
- }
- c.ServeJSON()
- }
- // GetConsumptionHistory 获取消费记录
- func (c *PointsController) GetConsumptionHistory() {
- userInfo, err := utils.GetUserInfoFromContext(c.Ctx.Input.GetData("userInfo"))
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "statusCode": 401,
- "msg": "获取用户信息失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- page, _ := c.GetInt("page", 1)
- pageSize, _ := c.GetInt("pageSize", 10)
- logs, total, err := models.GetConsumptionHistory(userInfo.AccountID, page, pageSize)
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "statusCode": 500,
- "msg": "获取消费记录失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- c.Data["json"] = map[string]interface{}{
- "statusCode": 200,
- "msg": "success",
- "data": map[string]interface{}{
- "list": logs,
- "total": total,
- "page": page,
- "pageSize": pageSize,
- },
- }
- c.ServeJSON()
- }
|