2
0

article.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. package mint
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "strconv"
  8. "time"
  9. "github.com/gin-gonic/gin"
  10. "github.com/go-pg/pg/v10"
  11. "github.com/go-redis/redis/v8"
  12. )
  13. var ctx = context.Background()
  14. type Article struct {
  15. Id int `json:"id" `
  16. Uid string `json:"uid" `
  17. ParentId int `json:"parent_id"`
  18. PrParentId int `json:"pr_parent_id" `
  19. Title string `json:"title"`
  20. Subtitle string `json:"subtitle"`
  21. Summary string `json:"summary"`
  22. Content string `json:"content"`
  23. ContentType string `json:"content_type"`
  24. Lang string `json:"lang"`
  25. Setting string `json:"setting"`
  26. Status string `json:"status"`
  27. EditorId int `json:"editor_id"`
  28. StudioId int `json:"studio_id"`
  29. CreatorId int `json:"creator_id"`
  30. Version int
  31. DeletedAt time.Time
  32. CreatedAt time.Time
  33. UpdatedAt time.Time
  34. }
  35. //查询
  36. /*
  37. parent_id=0 的文章为文章模板
  38. parent_id>0 的文章为文章实例,是模板+channel(多个)
  39. */
  40. //查询 列表
  41. func ArticlesIndex(db *pg.DB) gin.HandlerFunc {
  42. return func(c *gin.Context) {
  43. view := c.Query("view")
  44. studio := c.DefaultQuery("studio", "")
  45. status := c.DefaultQuery("status", "public")
  46. columns := "id,title,subtitle,owner_id"
  47. var articles []Article
  48. var err error
  49. if studio == "" {
  50. switch view {
  51. case "title":
  52. err = db.Model(&articles).ColumnExpr(columns).Where("title like ?", c.Query("view")+"%").Select()
  53. case "tempalet":
  54. //列出文章模板
  55. err = db.Model(&articles).ColumnExpr(columns).Where("parent_id = 0").Select()
  56. case "instance":
  57. //文章实例
  58. err = db.Model(&articles).ColumnExpr(columns).Where("parent_id = ?", c.Query("id")).Select()
  59. case "pr":
  60. //修改建议
  61. err = db.Model(&articles).ColumnExpr(columns).Where("pr_parent_id = ?", c.Query("id")).Select()
  62. default:
  63. panic("error view")
  64. }
  65. } else {
  66. if status == "all" {
  67. //TODO studio 鉴权
  68. switch view {
  69. case "title":
  70. err = db.Model(&articles).ColumnExpr(columns).Where("title like ?", c.Query("view")+"%").Select()
  71. case "tempalet":
  72. //列出文章模板
  73. err = db.Model(&articles).ColumnExpr(columns).Where("parent_id = 0").Select()
  74. case "instance":
  75. //文章实例
  76. err = db.Model(&articles).ColumnExpr(columns).Where("parent_id = ?", c.Query("id")).Select()
  77. case "pr":
  78. //修改建议
  79. err = db.Model(&articles).ColumnExpr(columns).Where("pr_parent_id = ?", c.Query("id")).Select()
  80. default:
  81. panic("error view")
  82. }
  83. } else {
  84. //TODO studio 鉴权
  85. switch view {
  86. case "title":
  87. err = db.Model(&articles).ColumnExpr(columns).Where("title like ?", c.Query("view")+"%").Where("status = ?", "public").Select()
  88. case "tempalet":
  89. //列出文章模板
  90. err = db.Model(&articles).ColumnExpr(columns).Where("parent_id = 0").Where("status = ?", "public").Select()
  91. case "instance":
  92. //文章实例
  93. err = db.Model(&articles).ColumnExpr(columns).Where("parent_id = ?", c.Query("id")).Where("status = ?", "public").Select()
  94. case "pr":
  95. //修改建议
  96. err = db.Model(&articles).ColumnExpr(columns).Where("pr_parent_id = ?", c.Query("id")).Where("status = ?", "public").Select()
  97. default:
  98. panic("error view")
  99. }
  100. }
  101. }
  102. if err != nil {
  103. panic(err)
  104. }
  105. c.JSON(http.StatusOK, gin.H{
  106. "status": "success",
  107. "data": articles,
  108. })
  109. }
  110. }
  111. //return an HTML form for creating a new Courses
  112. func ArticlesNew(db *pg.DB) gin.HandlerFunc {
  113. return func(c *gin.Context) {
  114. //TODO 业务逻辑
  115. c.HTML(http.StatusOK, "articles_new.html", gin.H{
  116. "message": "ok",
  117. })
  118. }
  119. }
  120. //新建-
  121. //create a new articles
  122. func ArticlesCreate(db *pg.DB) gin.HandlerFunc {
  123. return func(c *gin.Context) {
  124. var form Course
  125. if err := c.ShouldBindJSON(&form); err != nil {
  126. c.JSON(http.StatusBadRequest, gin.H{
  127. "ok": false,
  128. "error": err.Error(),
  129. })
  130. return
  131. }
  132. if form.Title == "" {
  133. c.JSON(http.StatusBadRequest, gin.H{
  134. "ok": false,
  135. "error": ":no-title",
  136. })
  137. return
  138. }
  139. //TODO 获取 userid
  140. form.EditorId = 1
  141. form.CreatorId = 1
  142. //TODO studio 鉴权
  143. _, err := db.Model(&form).Column("title", "status", "editor_id", "creator_id", "studio_id").Insert()
  144. if err != nil {
  145. panic(err)
  146. }
  147. //建立成功
  148. c.JSON(http.StatusOK, gin.H{
  149. "ok": true,
  150. "data": form,
  151. })
  152. }
  153. }
  154. //display a specific articles
  155. func ArticlesShow(db *pg.DB, rdb *redis.Client) gin.HandlerFunc {
  156. return func(c *gin.Context) {
  157. id, err := strconv.Atoi(c.Param("id"))
  158. if err != nil {
  159. panic(err)
  160. }
  161. rkey := "article/:id"
  162. n, err := rdb.HExists(ctx, rkey, c.Param("id")).Result()
  163. if err == nil && n {
  164. val, err := rdb.HGet(ctx, rkey, c.Param("id")).Result()
  165. if err == nil {
  166. var redisData Article
  167. json.Unmarshal([]byte(val), &redisData)
  168. c.JSON(http.StatusOK, gin.H{
  169. "ok": true,
  170. "data": redisData,
  171. })
  172. return
  173. } else {
  174. fmt.Println(err)
  175. }
  176. } else {
  177. fmt.Println(err)
  178. }
  179. article := &Article{Id: id}
  180. err = db.Model(article).Column("id", "uid", "parent_id", "title", "subtitle", "content", "content_type", "lang", "owner_id", "setting", "status", "version", "updated_at").WherePK().First()
  181. if err != nil {
  182. if err.Error() == pg.ErrNoRows.Error() {
  183. c.JSON(http.StatusOK, gin.H{
  184. "ok": true,
  185. "message": "no-rows",
  186. })
  187. } else {
  188. panic(err)
  189. }
  190. } else {
  191. c.JSON(http.StatusOK, gin.H{
  192. "ok": true,
  193. "data": article,
  194. })
  195. //写入redis
  196. jsonData, err := json.Marshal(article)
  197. if err == nil {
  198. rdb.HSet(ctx, rkey, c.Param("id"), string(jsonData))
  199. }
  200. }
  201. }
  202. }
  203. //return an HTML form for edit a Courses
  204. func ArticlesEdit(db *pg.DB) gin.HandlerFunc {
  205. return func(c *gin.Context) {
  206. //TODO 业务逻辑
  207. c.HTML(http.StatusOK, "articles/edit.html", gin.H{
  208. "message": "ok",
  209. })
  210. }
  211. }
  212. //修改
  213. //update a specific articles
  214. func ArticlesUpdate(db *pg.DB, rdb *redis.Client) gin.HandlerFunc {
  215. return func(c *gin.Context) {
  216. var form Article
  217. if err := c.ShouldBindJSON(&form); err != nil {
  218. c.JSON(http.StatusBadRequest, gin.H{
  219. "ok": true,
  220. "message": err.Error(),
  221. })
  222. return
  223. }
  224. if form.Title == "" {
  225. c.JSON(http.StatusBadRequest, gin.H{
  226. "ok": false,
  227. "error": ":no-title",
  228. })
  229. return
  230. }
  231. //TODO 鉴权
  232. _, err := db.Model(&form).Column("title", "subtitle", "summary", "status", "content").WherePK().Update()
  233. if err != nil {
  234. panic(err)
  235. }
  236. c.JSON(http.StatusOK, gin.H{
  237. "status": "sucess",
  238. "data": form,
  239. })
  240. rkey := "article/:id"
  241. rdb.Del(ctx, rkey, c.Param("id"))
  242. }
  243. }
  244. //删
  245. //delete a specific articles
  246. func ArticlesDestroy(db *pg.DB, rdb *redis.Client) gin.HandlerFunc {
  247. return func(c *gin.Context) {
  248. id, err := strconv.Atoi(c.Param("id"))
  249. if err != nil {
  250. panic(err)
  251. }
  252. article := &Article{
  253. Id: int(id),
  254. }
  255. //TODO 鉴权
  256. _, err = db.Model(article).WherePK().Where("parent_id = ?", id).Where("pr_parent_id = ?", id).Delete()
  257. if err != nil {
  258. panic(err)
  259. }
  260. rkey := "article://id"
  261. rdb.Del(ctx, rkey, c.Param("id"))
  262. //TODO 删除article_list表相关项目
  263. c.JSON(http.StatusOK, gin.H{
  264. "ok": true,
  265. "data": c.Param("id"),
  266. })
  267. }
  268. }