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() }