points.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "shudao-chat-go/models"
  5. "shudao-chat-go/utils"
  6. "github.com/beego/beego/v2/server/web"
  7. )
  8. type PointsController struct {
  9. web.Controller
  10. }
  11. // GetBalance 获取用户积分余额
  12. func (c *PointsController) GetBalance() {
  13. userInfo, err := utils.GetUserInfoFromContext(c.Ctx.Input.GetData("userInfo"))
  14. if err != nil {
  15. c.Data["json"] = map[string]interface{}{
  16. "statusCode": 401,
  17. "msg": "获取用户信息失败: " + err.Error(),
  18. }
  19. c.ServeJSON()
  20. return
  21. }
  22. var userData models.UserData
  23. if err := models.DB.Where("accountID = ?", userInfo.AccountID).First(&userData).Error; err != nil {
  24. c.Data["json"] = map[string]interface{}{
  25. "statusCode": 404,
  26. "msg": "未找到用户数据",
  27. }
  28. c.ServeJSON()
  29. return
  30. }
  31. c.Data["json"] = map[string]interface{}{
  32. "statusCode": 200,
  33. "msg": "success",
  34. "data": map[string]interface{}{
  35. "points": userData.Points,
  36. },
  37. }
  38. c.ServeJSON()
  39. }
  40. // ConsumePointsRequest 消费积分请求
  41. type ConsumePointsRequest struct {
  42. FileName string `json:"file_name"`
  43. FileURL string `json:"file_url"`
  44. }
  45. // ConsumePoints 消费积分下载文件
  46. func (c *PointsController) ConsumePoints() {
  47. userInfo, err := utils.GetUserInfoFromContext(c.Ctx.Input.GetData("userInfo"))
  48. if err != nil {
  49. c.Data["json"] = map[string]interface{}{
  50. "statusCode": 401,
  51. "msg": "获取用户信息失败: " + err.Error(),
  52. }
  53. c.ServeJSON()
  54. return
  55. }
  56. var req ConsumePointsRequest
  57. if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
  58. c.Data["json"] = map[string]interface{}{
  59. "statusCode": 400,
  60. "msg": "JSON解析失败: " + err.Error(),
  61. }
  62. c.ServeJSON()
  63. return
  64. }
  65. // 查询用户数据
  66. var userData models.UserData
  67. if err := models.DB.Where("accountID = ?", userInfo.AccountID).First(&userData).Error; err != nil {
  68. c.Data["json"] = map[string]interface{}{
  69. "statusCode": 404,
  70. "msg": "未找到用户数据",
  71. }
  72. c.ServeJSON()
  73. return
  74. }
  75. // 检查积分是否足够(需要10积分)
  76. const requiredPoints = 10
  77. if userData.Points < requiredPoints {
  78. c.Data["json"] = map[string]interface{}{
  79. "statusCode": 400,
  80. "msg": "积分不足,下载需要10积分",
  81. "data": map[string]interface{}{
  82. "current_points": userData.Points,
  83. "required_points": requiredPoints,
  84. },
  85. }
  86. c.ServeJSON()
  87. return
  88. }
  89. // 开启事务
  90. tx := models.DB.Begin()
  91. // 扣减积分
  92. newBalance := userData.Points - requiredPoints
  93. if err := tx.Model(&models.UserData{}).Where("id = ?", userData.ID).Update("points", newBalance).Error; err != nil {
  94. tx.Rollback()
  95. c.Data["json"] = map[string]interface{}{
  96. "statusCode": 500,
  97. "msg": "积分扣减失败: " + err.Error(),
  98. }
  99. c.ServeJSON()
  100. return
  101. }
  102. // 创建消费记录 - 使用原始SQL避免GORM时间字段问题
  103. result := tx.Exec(
  104. "INSERT INTO points_consumption_log (user_id, file_name, file_url, points_consumed, balance_after) VALUES (?, ?, ?, ?, ?)",
  105. userInfo.AccountID, req.FileName, req.FileURL, requiredPoints, newBalance,
  106. )
  107. if result.Error != nil {
  108. tx.Rollback()
  109. c.Data["json"] = map[string]interface{}{
  110. "statusCode": 500,
  111. "msg": "创建消费记录失败: " + result.Error.Error(),
  112. }
  113. c.ServeJSON()
  114. return
  115. }
  116. tx.Commit()
  117. c.Data["json"] = map[string]interface{}{
  118. "statusCode": 200,
  119. "msg": "success",
  120. "data": map[string]interface{}{
  121. "new_balance": newBalance,
  122. "points_consumed": requiredPoints,
  123. },
  124. }
  125. c.ServeJSON()
  126. }
  127. // GetConsumptionHistory 获取消费记录
  128. func (c *PointsController) GetConsumptionHistory() {
  129. userInfo, err := utils.GetUserInfoFromContext(c.Ctx.Input.GetData("userInfo"))
  130. if err != nil {
  131. c.Data["json"] = map[string]interface{}{
  132. "statusCode": 401,
  133. "msg": "获取用户信息失败: " + err.Error(),
  134. }
  135. c.ServeJSON()
  136. return
  137. }
  138. page, _ := c.GetInt("page", 1)
  139. pageSize, _ := c.GetInt("pageSize", 10)
  140. logs, total, err := models.GetConsumptionHistory(userInfo.AccountID, page, pageSize)
  141. if err != nil {
  142. c.Data["json"] = map[string]interface{}{
  143. "statusCode": 500,
  144. "msg": "获取消费记录失败: " + err.Error(),
  145. }
  146. c.ServeJSON()
  147. return
  148. }
  149. c.Data["json"] = map[string]interface{}{
  150. "statusCode": 200,
  151. "msg": "success",
  152. "data": map[string]interface{}{
  153. "list": logs,
  154. "total": total,
  155. "page": page,
  156. "pageSize": pageSize,
  157. },
  158. }
  159. c.ServeJSON()
  160. }