home.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package daytask
  2. import (
  3. "app/commons/model/entity"
  4. "app/commons/services"
  5. "strings"
  6. "github.com/gin-gonic/gin"
  7. )
  8. // HomeIndex 首页数据
  9. func (s *Server) HomeIndex(c *gin.Context) {
  10. ctx := s.FromContext(c)
  11. db := s.DB()
  12. // 获取Banner列表
  13. banners := make([]*entity.DtBanner, 0)
  14. db.Model(&entity.DtBanner{}).
  15. Where("status = ? AND position = ?", 1, "home").
  16. Order("sort DESC, id DESC").
  17. Limit(5).
  18. Find(&banners)
  19. // 获取任务分类
  20. categories := make([]*entity.DtTaskCategory, 0)
  21. db.Model(&entity.DtTaskCategory{}).
  22. Where("status = ?", 1).
  23. Order("sort ASC").
  24. Find(&categories)
  25. // 获取推荐任务
  26. recommendTasks := make([]*entity.DtTask, 0)
  27. query := db.Model(&entity.DtTask{}).Where("status = ?", 1)
  28. // 尝试使用 is_recommend 字段,如果字段不存在则降级处理
  29. if err := query.Where("is_recommend = ?", 1).Order("sort DESC, id DESC").Limit(10).Find(&recommendTasks).Error; err != nil {
  30. if isColumnNotExistError(err) {
  31. // 字段不存在,使用降级查询(不筛选推荐)
  32. query.Order("sort DESC, id DESC").Limit(10).Find(&recommendTasks)
  33. }
  34. }
  35. // 获取普通任务
  36. normalTasks := make([]*entity.DtTask, 0)
  37. query = db.Model(&entity.DtTask{}).Where("status = ? AND remain_count > 0", 1)
  38. // 尝试使用 is_top 字段,如果字段不存在则降级处理
  39. if err := query.Order("is_top DESC, created_at DESC").Limit(20).Find(&normalTasks).Error; err != nil {
  40. if isColumnNotExistError(err) {
  41. // 字段不存在,使用降级查询(不按置顶排序)
  42. query.Order("created_at DESC").Limit(20).Find(&normalTasks)
  43. }
  44. }
  45. ctx.OK(gin.H{
  46. "banners": banners,
  47. "categories": categories,
  48. "recommendTasks": recommendTasks,
  49. "normalTasks": normalTasks,
  50. })
  51. }
  52. // HomeBanner Banner列表
  53. func (s *Server) HomeBanner(c *gin.Context) {
  54. ctx := s.FromContext(c)
  55. db := s.DB()
  56. position := c.DefaultQuery("position", "home")
  57. banners := make([]*entity.DtBanner, 0)
  58. db.Model(&entity.DtBanner{}).
  59. Where("status = ? AND position = ?", 1, position).
  60. Order("sort DESC, id DESC").
  61. Find(&banners)
  62. ctx.OK(banners)
  63. }
  64. // HomeHall 大厅数据
  65. func (s *Server) HomeHall(c *gin.Context) {
  66. ctx := s.FromContext(c)
  67. db := s.DB()
  68. // 平台发放收益统计
  69. var totalReward float64
  70. db.Model(&entity.DtUserTask{}).
  71. Where("status = ?", entity.UserTaskStatusCompleted).
  72. Select("COALESCE(SUM(reward_amount), 0)").
  73. Scan(&totalReward)
  74. // 已完成任务数
  75. var completedCount int64
  76. db.Model(&entity.DtUserTask{}).
  77. Where("status = ?", entity.UserTaskStatusCompleted).
  78. Count(&completedCount)
  79. // 任务列表
  80. paging := &services.Pagination{
  81. Current: ctx.QueryInt64("current", 1),
  82. Size: ctx.QueryInt64("size", 20),
  83. }
  84. tasks := make([]*entity.DtTask, 0)
  85. query := db.Model(&entity.DtTask{}).
  86. Where("status = ? AND remain_count > 0", 1)
  87. query.Count(&paging.Total)
  88. paging.Computer()
  89. // 尝试使用 is_top 和 is_recommend 字段,如果字段不存在则降级处理
  90. if err := query.Order("is_top DESC, is_recommend DESC, created_at DESC").
  91. Offset(int(paging.Start)).
  92. Limit(int(paging.Size)).
  93. Find(&tasks).Error; err != nil {
  94. if isColumnNotExistError(err) {
  95. // 字段不存在,使用降级查询(不按置顶和推荐排序)
  96. query.Order("created_at DESC").
  97. Offset(int(paging.Start)).
  98. Limit(int(paging.Size)).
  99. Find(&tasks)
  100. }
  101. }
  102. ctx.OK(gin.H{
  103. "totalReward": totalReward,
  104. "completedCount": completedCount,
  105. "tasks": tasks,
  106. "paging": paging,
  107. })
  108. }
  109. // TaskCategories 任务分类列表
  110. func (s *Server) TaskCategories(c *gin.Context) {
  111. ctx := s.FromContext(c)
  112. db := s.DB()
  113. categories := make([]*entity.DtTaskCategory, 0)
  114. db.Model(&entity.DtTaskCategory{}).
  115. Where("status = ?", 1).
  116. Order("sort ASC").
  117. Find(&categories)
  118. ctx.OK(categories)
  119. }
  120. // TaskList 任务列表
  121. func (s *Server) TaskList(c *gin.Context) {
  122. ctx := s.FromContext(c)
  123. db := s.DB()
  124. categoryId := ctx.QueryInt64("categoryId", 0)
  125. keyword := c.Query("keyword")
  126. paging := &services.Pagination{
  127. Current: ctx.QueryInt64("current", 1),
  128. Size: ctx.QueryInt64("size", 20),
  129. }
  130. query := db.Model(&entity.DtTask{}).
  131. Where("status = ? AND remain_count > 0", 1)
  132. if categoryId > 0 {
  133. query = query.Where("category_id = ?", categoryId)
  134. }
  135. if keyword != "" {
  136. query = query.Where("title LIKE ?", "%"+keyword+"%")
  137. }
  138. query.Count(&paging.Total)
  139. paging.Computer()
  140. tasks := make([]*entity.DtTask, 0)
  141. // 尝试使用 is_top 和 is_recommend 字段,如果字段不存在则降级处理
  142. if err := query.Order("is_top DESC, is_recommend DESC, created_at DESC").
  143. Offset(int(paging.Start)).
  144. Limit(int(paging.Size)).
  145. Find(&tasks).Error; err != nil {
  146. if isColumnNotExistError(err) {
  147. // 字段不存在,使用降级查询(不按置顶和推荐排序)
  148. query.Order("created_at DESC").
  149. Offset(int(paging.Start)).
  150. Limit(int(paging.Size)).
  151. Find(&tasks)
  152. }
  153. }
  154. ctx.OK(gin.H{
  155. "list": tasks,
  156. "paging": paging,
  157. })
  158. }
  159. // TaskDetail 任务详情
  160. func (s *Server) TaskDetail(c *gin.Context) {
  161. ctx := s.FromContext(c)
  162. db := s.DB()
  163. taskId := ctx.QueryInt64("id", 0)
  164. if taskId == 0 {
  165. ctx.Fail("task_id_required")
  166. return
  167. }
  168. // 获取任务
  169. task := &entity.DtTask{}
  170. if err := db.Where("id = ? AND status = ?", taskId, 1).First(task).Error; err != nil {
  171. ctx.Fail("task_not_found")
  172. return
  173. }
  174. // 获取任务分类
  175. category := &entity.DtTaskCategory{}
  176. db.Where("id = ?", task.CategoryId).First(category)
  177. // 获取任务步骤
  178. steps := make([]*entity.DtTaskStep, 0)
  179. db.Model(&entity.DtTaskStep{}).
  180. Where("task_id = ?", taskId).
  181. Order("step_no ASC, sort ASC").
  182. Find(&steps)
  183. ctx.OK(gin.H{
  184. "task": task,
  185. "category": category,
  186. "steps": steps,
  187. })
  188. }
  189. // ConfigGet 获取配置
  190. func (s *Server) ConfigGet(c *gin.Context) {
  191. ctx := s.FromContext(c)
  192. db := s.DB()
  193. key := c.Query("key")
  194. group := c.Query("group")
  195. if key != "" {
  196. // 获取单个配置
  197. config := &entity.DtConfig{}
  198. if err := db.Where("`key` = ?", key).First(config).Error; err != nil {
  199. ctx.Fail("config_not_found")
  200. return
  201. }
  202. ctx.OK(config.Value)
  203. return
  204. }
  205. if group != "" {
  206. // 获取分组配置
  207. configs := make([]*entity.DtConfig, 0)
  208. db.Where("`group` = ?", group).Order("sort ASC").Find(&configs)
  209. result := make(map[string]string)
  210. for _, cfg := range configs {
  211. result[cfg.Key] = cfg.Value
  212. }
  213. ctx.OK(result)
  214. return
  215. }
  216. ctx.Fail("key_or_group_required")
  217. }
  218. // CustomerService 客服配置
  219. func (s *Server) CustomerService(c *gin.Context) {
  220. ctx := s.FromContext(c)
  221. db := s.DB()
  222. services := make([]*entity.DtCustomerService, 0)
  223. db.Model(&entity.DtCustomerService{}).
  224. Where("status = ?", 1).
  225. Order("sort ASC").
  226. Find(&services)
  227. ctx.OK(services)
  228. }
  229. // OAuthConfig 获取OAuth配置(公开接口,只返回客户端需要的信息)
  230. func (s *Server) OAuthConfig(c *gin.Context) {
  231. ctx := s.FromContext(c)
  232. db := s.DB()
  233. result := make(map[string]string)
  234. // 获取 Google Client ID
  235. var googleConfig entity.DtConfig
  236. if err := db.Where("`key` = ?", entity.ConfigKeyGoogleClientId).First(&googleConfig).Error; err == nil {
  237. result["googleClientId"] = googleConfig.Value
  238. }
  239. // 获取 Zalo App ID
  240. var zaloConfig entity.DtConfig
  241. if err := db.Where("`key` = ?", entity.ConfigKeyZaloAppId).First(&zaloConfig).Error; err == nil {
  242. result["zaloAppId"] = zaloConfig.Value
  243. }
  244. ctx.OK(result)
  245. }
  246. // isColumnNotExistError 检查是否是列不存在的错误
  247. func isColumnNotExistError(err error) bool {
  248. if err == nil {
  249. return false
  250. }
  251. errStr := err.Error()
  252. // MySQL 错误 1054 表示列不存在
  253. return strings.Contains(errStr, "1054") || strings.Contains(errStr, "Unknown column")
  254. }