test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package api
  2. import (
  3. "errors"
  4. "fmt"
  5. "oilseal-train/db/model"
  6. "oilseal-train/db/repo"
  7. "strconv"
  8. "time"
  9. "github.com/gin-gonic/gin"
  10. "go.mongodb.org/mongo-driver/bson"
  11. "go.mongodb.org/mongo-driver/bson/primitive"
  12. )
  13. func Test(r *GinRouter) {
  14. r.POSTJWT("/test/create", TestAdd)
  15. r.GETJWT("/test/list", TestList)
  16. r.POSTJWT("/test/update", TestEdit)
  17. r.POSTJWT("/test/delete/:id", TestDelete)
  18. r.GETJWT("/test/randList", TestRandList)
  19. }
  20. // 新增
  21. func TestAdd(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  22. err := IsAdmin(apictx)
  23. if err != nil {
  24. return nil, err
  25. }
  26. var form model.Test
  27. err = c.ShouldBindJSON(&form)
  28. if err != nil {
  29. fmt.Println(err)
  30. return nil, errors.New("参数错误")
  31. }
  32. if len(form.BankId) != 12 {
  33. return nil, errors.New("题库Id不正确")
  34. }
  35. if form.Question == "" {
  36. return nil, errors.New("题目不能为空")
  37. }
  38. if len(form.Answer) < 1 {
  39. return nil, errors.New("答案不能为空")
  40. }
  41. if form.State == 0 {
  42. form.State = 1
  43. }
  44. form.CreateTime = time.Now()
  45. form.UpdateTime = time.Now()
  46. return repo.RepoAddDoc(apictx.CreateRepoCtx(), repo.CollectionTest, &form)
  47. }
  48. // 列表
  49. func TestList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  50. // err := IsAdmin(apictx)
  51. // if err != nil {
  52. // return nil, err
  53. // }
  54. page, size, query := UtilQueryPageSize(c)
  55. if _question, ok := query["question"]; ok {
  56. query["question"] = bson.M{"$regex": _question.(string)}
  57. }
  58. if _bankId, ok := query["bankId"]; ok {
  59. query["bankId"], _ = primitive.ObjectIDFromHex(_bankId.(string))
  60. }
  61. result, err := repo.RepoPageSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  62. CollectName: repo.CollectionTest,
  63. Page: page,
  64. Size: size,
  65. Query: query,
  66. })
  67. if len(result.List) == 0 {
  68. return result, err
  69. }
  70. // 获取bank信息
  71. ctx := apictx.CreateRepoCtx()
  72. for _, list := range result.List {
  73. bankId := list["bankId"].(primitive.ObjectID)
  74. bank := model.Bank{}
  75. repo.RepoSeachDoc(ctx, &repo.DocSearchOptions{
  76. CollectName: repo.CollectionBank,
  77. Query: repo.Map{"_id": bankId},
  78. }, &bank)
  79. list["bank"] = bank
  80. }
  81. return result, err
  82. }
  83. // 获取随机试题
  84. func TestRandList(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  85. // bankId number type map
  86. _bankId := c.Query("bankId")
  87. _number := c.Query("number")
  88. _type := c.Query("type")
  89. bankId, err := primitive.ObjectIDFromHex(_bankId)
  90. if err != nil {
  91. return nil, errors.New("bankId错误")
  92. }
  93. number, err := strconv.Atoi(_number)
  94. // number 不存在时默认为10
  95. if err != nil {
  96. number = 10
  97. }
  98. fmt.Println(number)
  99. tsType, err := strconv.Atoi(_type)
  100. if err != nil {
  101. return nil, errors.New("题型错误")
  102. }
  103. tests := []*model.Test{}
  104. repo.RepoDocsSearch(apictx.CreateRepoCtx(), &repo.PageSearchOptions{
  105. CollectName: repo.CollectionTest,
  106. Query: repo.Map{"bankId": bankId, "type": tsType, "state": 1},
  107. }, &tests)
  108. if len(tests) <= number {
  109. return tests, nil
  110. }
  111. // 放入map中,利用map特性随机得到试题
  112. sets := make(map[primitive.ObjectID]*model.Test)
  113. for _, ts := range tests {
  114. sets[ts.Id] = ts
  115. }
  116. list := []*model.Test{}
  117. for _, ts := range sets {
  118. if len(list) < number {
  119. list = append(list, ts)
  120. } else {
  121. break
  122. }
  123. }
  124. return list, nil
  125. }
  126. // 更新
  127. func TestEdit(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  128. // 操作用户为admin
  129. err := IsAdmin(apictx)
  130. if err != nil {
  131. return nil, err
  132. }
  133. var form model.Test
  134. err = c.ShouldBindJSON(&form)
  135. if err != nil {
  136. return nil, errors.New("参数错误")
  137. }
  138. if len(form.Id) != 12 {
  139. return nil, errors.New("id不正确")
  140. }
  141. return repo.RepoUpdateSetDoc(apictx.CreateRepoCtx(), repo.CollectionTest, form.Id.Hex(), &form)
  142. }
  143. // 删除
  144. func TestDelete(c *gin.Context, apictx *ApiSession) (interface{}, error) {
  145. // 操作用户为admin
  146. err := IsAdmin(apictx)
  147. if err != nil {
  148. return nil, err
  149. }
  150. _id := c.Param("id")
  151. _, err = primitive.ObjectIDFromHex(_id)
  152. if err != nil {
  153. return nil, errors.New("id错误")
  154. }
  155. return repo.RepoDeleteDoc(apictx.CreateRepoCtx(), repo.CollectionTest, _id)
  156. }