wbw.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package mint
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "strconv"
  7. "time"
  8. "github.com/gin-gonic/gin"
  9. "github.com/go-pg/pg/v10"
  10. "github.com/go-redis/redis/v8"
  11. )
  12. type Wbw struct {
  13. Id int `form:"id" json:"id" `
  14. PrParentId int `form:"pr_parent_id" json:"pr_parent_id" `
  15. WbwsIndexId int `form:"wbws_index_id" json:"wbws_index_id"`
  16. ChannelId int `form:"channel_id" json:"channel_id"`
  17. BookId int `form:"book_id" json:"book_id"`
  18. Paragraph int `form:"paragraph" json:"paragraph"`
  19. Sn int `form:"sn" json:"sn"`
  20. Word string `form:"word" json:"word"`
  21. Data string `form:"data" json:"data"`
  22. Lang string `form:"lang" json:"lang"`
  23. Status string `form:"status" json:"status"`
  24. EditorId int
  25. OwnerId int
  26. Version int
  27. DeletedAt time.Time
  28. CreatedAt time.Time
  29. UpdatedAt time.Time
  30. }
  31. type WbwHolder struct {
  32. Data []Wbw
  33. }
  34. func (i *WbwHolder) UnmarshalJSON(b []byte) error {
  35. return json.Unmarshal(b, &i.Data)
  36. }
  37. //display a list of all wbws
  38. func WbwsIndex(db *pg.DB) gin.HandlerFunc {
  39. return func(c *gin.Context) {
  40. active := c.Query("active")
  41. // TODO 补充业务逻辑
  42. var wbws []Wbw
  43. switch active {
  44. case "channel":
  45. //某channel
  46. channel := c.Query("channel")
  47. book := c.Query("book")
  48. paragraph := c.Query("paragraph")
  49. err := db.Model(&wbws).Column("id", "book_id", "paragraph", "sn", "data", "lang", "status").Where("channel = ?", channel).Where("book_id = ?", book).Where("paragraph = ?", paragraph).First()
  50. //errors.Is(err, gorm.ErrRecordNotFound)
  51. if err != nil {
  52. panic(err)
  53. }
  54. case "blockid":
  55. //某句子所有channel记录
  56. blockid := c.Query("blockid")
  57. err := db.Model(&wbws).Column("id", "book_id", "paragraph", "sn", "data", "lang", "status").Where("wbws_index_id = ?", blockid).Select()
  58. if err != nil {
  59. panic(err)
  60. }
  61. }
  62. c.JSON(http.StatusOK, gin.H{
  63. "status": "succes",
  64. "message": "",
  65. "data": wbws,
  66. })
  67. }
  68. }
  69. //return an HTML form for creating a new wbw
  70. func WbwsNew(db *pg.DB) gin.HandlerFunc {
  71. return func(c *gin.Context) {
  72. //TODO 业务逻辑
  73. c.HTML(http.StatusOK, "wbws_new.html", gin.H{
  74. "message": "ok",
  75. })
  76. }
  77. }
  78. //create new wbw
  79. func WbwsCreate(db *pg.DB) gin.HandlerFunc {
  80. return func(c *gin.Context) {
  81. /*
  82. cookie, err := c.Cookie("userid")
  83. if err != nil {
  84. fmt.Println("not login")
  85. c.JSON(http.StatusOK, gin.H{
  86. "status": "fail",
  87. "message": "not login",
  88. })
  89. return
  90. }
  91. fmt.Println(cookie)
  92. */
  93. iChannelId := c.Query("channel")
  94. //TODO 查询权限
  95. var form WbwHolder
  96. if err := c.ShouldBindJSON(&form); err != nil {
  97. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  98. return
  99. }
  100. tx, err := db.Begin()
  101. if err != nil {
  102. panic(err)
  103. }
  104. defer tx.Rollback()
  105. stmt, err := tx.Prepare("INSERT INTO wbws ( channel_id, book_id,paragraph,sn,word,data,lang,status,editor_id,owner_id ) VALUES( $1, $2, $3, $4, $5, $6, $7, $8, $9, $10)")
  106. if err != nil {
  107. panic(err)
  108. }
  109. defer stmt.Close()
  110. for _, value := range form.Data {
  111. _, err = stmt.Exec(iChannelId, value.BookId, value.Paragraph, value.Sn, value.Word, value.Data, "en", "public", 1, 1)
  112. if err != nil {
  113. panic(err)
  114. }
  115. }
  116. err = tx.Commit()
  117. if err != nil {
  118. panic(err)
  119. }
  120. //建立成功
  121. c.JSON(http.StatusOK, gin.H{
  122. "status": "succes",
  123. "message": "",
  124. "data": form.Data,
  125. })
  126. }
  127. }
  128. //display a specific Wbw
  129. func WbwsShow(db *pg.DB, rdb *redis.Client) gin.HandlerFunc {
  130. return func(c *gin.Context) {
  131. id, err := strconv.Atoi(c.Param("id"))
  132. if err != nil {
  133. panic(err)
  134. }
  135. fmt.Println("get wbw id=" + c.Param("id"))
  136. rkey := "wbw://id"
  137. n, err := rdb.Exists(ctx, rkey).Result()
  138. if err != nil {
  139. fmt.Println(err)
  140. } else if n == 0 {
  141. fmt.Println("redis key not exist")
  142. } else {
  143. fmt.Println("redis key exist")
  144. val, err := rdb.HGetAll(ctx, rkey).Result()
  145. if err != nil || val == nil {
  146. //有错误或者没查到
  147. fmt.Println("redis error")
  148. } else {
  149. fmt.Println("redis no error")
  150. c.JSON(http.StatusOK, gin.H{
  151. "data": val,
  152. })
  153. return
  154. }
  155. }
  156. wbw := &Wbw{Id: id}
  157. err = db.Model(wbw).Column("id", "uid", "name", "description", "description_type", "owner_id", "setting", "status", "version", "updated_at").WherePK().Select()
  158. if err != nil {
  159. panic(err)
  160. }
  161. c.JSON(http.StatusOK, gin.H{
  162. "data": wbw,
  163. })
  164. //写入redis
  165. rdb.HSet(ctx, rkey, id, wbw)
  166. }
  167. }
  168. //return an HTML form for edit a wbw
  169. func WbwsEdit(db *pg.DB) gin.HandlerFunc {
  170. return func(c *gin.Context) {
  171. //TODO 业务逻辑
  172. c.HTML(http.StatusOK, "wbws_edit.html", gin.H{
  173. "name": "ok",
  174. })
  175. }
  176. }
  177. //update a specific wbw
  178. func WbwsUpdate(db *pg.DB, rdb *redis.Client) gin.HandlerFunc {
  179. return func(c *gin.Context) {
  180. var form Wbw
  181. if err := c.ShouldBindJSON(&form); err != nil {
  182. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  183. return
  184. }
  185. //补充业务逻辑
  186. _, err := db.Model(&form).Column("name", "description", "description_type", "status", "setting").WherePK().Update()
  187. if err != nil {
  188. panic(err)
  189. }
  190. c.JSON(http.StatusOK, gin.H{
  191. "message": form,
  192. })
  193. //delete redis
  194. rkey := "wbw://id/" + strconv.Itoa(form.Id)
  195. rdb.Del(ctx, rkey)
  196. }
  197. }
  198. //delete a specific wbw
  199. func WbwsDestroy(db *pg.DB, rdb *redis.Client) gin.HandlerFunc {
  200. return func(c *gin.Context) {
  201. id, err := strconv.Atoi(c.Param("id"))
  202. if err != nil {
  203. panic(err)
  204. }
  205. wbw := &Wbw{
  206. Id: int(id),
  207. }
  208. //删之前获取 course_id
  209. _, err = db.Model(wbw).WherePK().Delete()
  210. if err != nil {
  211. panic(err)
  212. }
  213. //删除article_list表相关项目
  214. c.JSON(http.StatusOK, gin.H{
  215. "message": c.Param("id"),
  216. })
  217. rkey := "wbw://id/" + c.Param("id")
  218. rdb.Del(ctx, rkey)
  219. }
  220. }