project_info.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package youngee_task_service
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/os/glog"
  5. "github.com/gogf/gf/os/gtime"
  6. "github.com/gogf/gf/util/gconv"
  7. "reflect"
  8. "strconv"
  9. "strings"
  10. "youngmini_server/app/dao"
  11. "youngmini_server/app/model"
  12. "youngmini_server/app/model/youngee_talent_model"
  13. "youngmini_server/app/utils"
  14. "github.com/gogf/gf/frame/g"
  15. "github.com/gogf/gf/net/ghttp"
  16. "github.com/wxnacy/wgo/arrays"
  17. )
  18. type projectStatus int
  19. const (
  20. projectStatusCreating = iota + 1
  21. projectStatusReviewing
  22. projectStatusReviewed
  23. projectStatusRecruiting
  24. projectStatusRecruited
  25. projectStatusPaying
  26. projectStatusPaid
  27. projectStatusInvalid
  28. projectStatusInProgress
  29. projectStatusClosed
  30. )
  31. // 获取项目信息列表service
  32. func GetProjectInfoList(r *ghttp.Request) *TalentHttpResult {
  33. fmt.Println("进入种草主页")
  34. pageIndex := r.GetQueryInt("idx", -1)
  35. cntPerPage := r.GetQueryInt("cnt", -1)
  36. platform := r.Get("platform")
  37. projectForm := r.Get("projectform")
  38. feeForm := r.Get("feeform")
  39. searchValue := r.Get("searchvalue")
  40. if pageIndex == -1 || cntPerPage == -1 || cntPerPage == 0 {
  41. return &TalentHttpResult{Code: -1, Msg: "参数错误"}
  42. }
  43. // 如果有稿费形式的过滤条件,则将过滤条件保存于taskModeList
  44. var feeFormList []interface{}
  45. if feeForm != nil {
  46. if reflect.TypeOf(feeForm).Kind() != reflect.Slice {
  47. return &TalentHttpResult{Code: -2, Msg: "搜索条件稿费形式错误"}
  48. }
  49. feeFormList = make([]interface{}, 0)
  50. feeFormList = feeForm.([]interface{})
  51. }
  52. // 如果有任务形式的过滤条件,则将过滤条件保存于taskModeList
  53. var projectFormList []interface{}
  54. if projectForm != nil {
  55. if reflect.TypeOf(projectForm).Kind() != reflect.Slice {
  56. return &TalentHttpResult{Code: -2, Msg: "搜索条件任务形式错误"}
  57. }
  58. projectFormList = make([]interface{}, 0)
  59. projectFormList = projectForm.([]interface{})
  60. }
  61. // 如果有平台的过滤条件,则将平台列表保存于platformList
  62. var platformList []interface{}
  63. if platform != nil {
  64. if reflect.TypeOf(platform).Kind() != reflect.Slice {
  65. return &TalentHttpResult{Code: -2, Msg: "搜索条件平台类型错误"}
  66. }
  67. platformList = make([]interface{}, 0)
  68. platformList = platform.([]interface{})
  69. }
  70. // 构造查询的条件
  71. startId := pageIndex * cntPerPage
  72. // whereStr := fmt.Sprintf("(project_status >= %d and project_status <> %d and project_type = 1)", projectStatusRecruiting, projectStatusInvalid)
  73. whereStr := fmt.Sprintf("(project_status >= %d and fail_reason <> 2 and project_type = 1)", projectStatusRecruiting)
  74. if platformList != nil {
  75. whereStr = whereStr + " and project_platform in ("
  76. for _, v := range platformList {
  77. whereStr += v.(string) + ", "
  78. }
  79. whereStr = whereStr[0 : len(whereStr)-2]
  80. whereStr += ")"
  81. }
  82. if projectFormList != nil {
  83. whereStr += " and project_form in ("
  84. for _, v := range projectFormList {
  85. whereStr += v.(string) + ", "
  86. }
  87. whereStr = whereStr[0 : len(whereStr)-2]
  88. whereStr += ")"
  89. }
  90. if searchValue != nil {
  91. whereStr += " and project_name like '%" + searchValue.(string) + "%'"
  92. }
  93. // 查询所有project
  94. var projectList = []model.ProjectInfo{}
  95. var projectIdList []string
  96. err := g.Model(dao.ProjectInfo.Table).Where(whereStr).Scan(&projectList)
  97. if err != nil {
  98. return &TalentHttpResult{Code: -3, Msg: "查询数据库失败"}
  99. }
  100. fmt.Println("searchValue:", searchValue)
  101. fmt.Println("feeFormList:", feeFormList)
  102. fmt.Println("projectList:", projectList)
  103. // 筛选出满足稿费形式条件的项目id列表
  104. for _, v := range projectList {
  105. string_slice := strings.Split(v.FeeForm, ",")
  106. // fmt.Println("str:", string_slice)
  107. tmp := 0
  108. for _, w := range feeFormList {
  109. i := arrays.ContainsString(string_slice, w.(string))
  110. if i < 0 {
  111. tmp = 0
  112. break
  113. }
  114. tmp = 1
  115. }
  116. if tmp == 1 {
  117. projectIdList = append(projectIdList, v.ProjectId)
  118. }
  119. }
  120. if projectIdList != nil {
  121. whereStr += " and project_id in ("
  122. for _, v := range projectIdList {
  123. whereStr += v + ", "
  124. }
  125. whereStr = whereStr[0 : len(whereStr)-2]
  126. whereStr += ")"
  127. } else if feeForm != nil {
  128. return &TalentHttpResult{Code: -4, Msg: "has no fullproject", Data: nil}
  129. }
  130. fmt.Println("whereStr: ", whereStr)
  131. // 判断请求页面是否超过最大页面
  132. c, err := g.DB().Model(dao.ProjectInfo.Table).Fields("project_id").Where(whereStr).Count()
  133. if c <= 0 {
  134. return &TalentHttpResult{Code: -4, Msg: "has no fullproject", Data: nil}
  135. }
  136. maxPage := c / cntPerPage
  137. if c%cntPerPage > 0 {
  138. maxPage += 1
  139. }
  140. if pageIndex+1 > maxPage {
  141. return &TalentHttpResult{Code: -5, Msg: "over max page"}
  142. }
  143. var projectInfoList = youngee_talent_model.ProjectInfoList{}
  144. err = g.DB().Model("project_info").WithAll().Where(whereStr).
  145. Order("project_status ASC,recruit_ddl ASC, project_id").Limit(startId, cntPerPage).Scan(&projectInfoList.ProjectInfos)
  146. if err != nil {
  147. return &TalentHttpResult{Code: -6, Msg: "查询数据库失败"}
  148. }
  149. // 查询每个商品的浏览量
  150. for i, project := range projectInfoList.ProjectInfos {
  151. projectViewKey := "project:view:" + gconv.String(project.ProjectId)
  152. //redis中取浏览量 返回的是gvar.Var类型。 不存咋则为nil。经过viewCount.Int变成0
  153. viewCount, err := g.Redis().DoVar("GET", projectViewKey)
  154. if err != nil {
  155. glog.Error(err)
  156. return &TalentHttpResult{Code: 0, Msg: "Redis error"}
  157. }
  158. projectInfoList.ProjectInfos[i].WatchedNum = viewCount.Int()
  159. }
  160. projectInfoList.MaxPage = maxPage
  161. return &TalentHttpResult{Code: 0, Msg: "success", Data: projectInfoList}
  162. }
  163. // 获取单个项目详情service
  164. func GetProjectDetail(r *ghttp.Request) *TalentHttpResult {
  165. tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
  166. pid := r.GetQueryInt("projectid", 0)
  167. // Redis key
  168. projectViewKey := "project:view:" + strconv.Itoa(pid)
  169. userViewedKey := "user:viewed:" + tid + ":" + strconv.Itoa(pid)
  170. if pid == 0 {
  171. return &TalentHttpResult{Code: -2, Msg: "parse param error"}
  172. }
  173. //在redis中增加浏览量
  174. // Check if the user has already viewed the product
  175. //DoVar方便进行类型转化
  176. viewed, err := g.Redis().DoVar("GET", userViewedKey)
  177. if err != nil {
  178. glog.Error(err)
  179. return &TalentHttpResult{Code: 0, Msg: "Redis error"}
  180. }
  181. if viewed.IsNil() {
  182. // User hasn't viewed this product yet, increase the view count
  183. _, err = g.Redis().Do("INCR", projectViewKey)
  184. if err != nil {
  185. glog.Error(err)
  186. return &TalentHttpResult{Code: 0, Msg: "Redis error"}
  187. }
  188. // Mark the product as viewed by this user
  189. _, err = g.Redis().Do("SET", userViewedKey, true)
  190. if err != nil {
  191. glog.Error(err)
  192. return &TalentHttpResult{Code: 0, Msg: "Redis error"}
  193. }
  194. }
  195. //浏览历史
  196. currentDate := gtime.Now().Format("Ymd")
  197. // 设计 Redis Key
  198. redisBrowseKey := fmt.Sprintf("browseProject:%s:%s", currentDate, tid)
  199. fmt.Println("redis浏览记录的key为——————————", redisBrowseKey)
  200. // 将 project_id 添加到 Redis 中的 SET
  201. _, err = g.Redis().Do("SADD", redisBrowseKey, pid)
  202. if err != nil {
  203. return &TalentHttpResult{Code: 0, Msg: "Redis 存浏览历史数据失败"}
  204. }
  205. // 设置 Key 的过期时间为 7 天
  206. _, err = g.Redis().Do("EXPIRE", redisBrowseKey, 7*24*60*60) // 7 天的秒数
  207. if err != nil {
  208. return &TalentHttpResult{Code: 0, Msg: "Redis 设置过期时间失败"}
  209. }
  210. var ProjectDetail *youngee_talent_model.ProjectDetail
  211. err = g.DB().Model(youngee_talent_model.ProjectDetail{}).WithAll().Where("project_id", pid).Scan(&ProjectDetail)
  212. if err != nil {
  213. return &TalentHttpResult{Code: -3, Msg: "data query failed"}
  214. }
  215. return &TalentHttpResult{Code: 0, Msg: "success", Data: ProjectDetail}
  216. }