query_handle_base.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package base
  2. import (
  3. "encoding/json"
  4. "github.com/gin-gonic/gin"
  5. "go_server/model/common/response"
  6. "gorm.io/gorm"
  7. )
  8. // gin 封装模型curd处理
  9. // 使用范型 较为鸡肋 不建议使用
  10. type ModelBaseHandler[T any] struct {
  11. }
  12. func NewBaseHandler[T any](t *T) *ModelBaseHandler[T] {
  13. return &ModelBaseHandler[T]{}
  14. }
  15. func (*ModelBaseHandler[T]) DeleteOne(c *gin.Context, db *gorm.DB) {
  16. req := new(BaseRequest)
  17. if err := c.BindQuery(req); err != nil {
  18. response.Resp(c, err.Error())
  19. return
  20. }
  21. if req.Id == 0 {
  22. response.Resp(c, "id is zero")
  23. return
  24. }
  25. tempInfo := new(T)
  26. // 先通过Id获取记录'
  27. if err := db.First(&tempInfo, req.Id).Error; err != nil {
  28. response.Resp(c, err.Error())
  29. return
  30. }
  31. exCmd := db.Model(&tempInfo).Delete(&tempInfo)
  32. if exCmd.RowsAffected != 1 {
  33. response.Resp(c, "delete fail")
  34. return
  35. }
  36. if exCmd.Error != nil {
  37. response.Resp(c, exCmd.Error.Error())
  38. return
  39. }
  40. response.Resp(c)
  41. return
  42. }
  43. func (*ModelBaseHandler[T]) UpdateOne(c *gin.Context, db *gorm.DB) {
  44. req := new(BaseRequest)
  45. if err := c.BindJSON(req); err != nil {
  46. response.Resp(c, err.Error())
  47. return
  48. }
  49. if req.Id == 0 {
  50. response.Resp(c, "id is zero")
  51. return
  52. }
  53. tempInfo := new(T)
  54. // 先通过Id获取记录'
  55. if err := db.First(&tempInfo, req.Id).Error; err != nil {
  56. response.Resp(c, err.Error())
  57. return
  58. }
  59. // 将 req.Data 转换为结构体,以便 GORM 能正确映射 json tag 到数据库列名
  60. updateData := new(T)
  61. body, _ := json.Marshal(req.Data)
  62. if err := json.Unmarshal(body, updateData); err != nil {
  63. response.Resp(c, err.Error())
  64. return
  65. }
  66. dbEx := db.Model(&tempInfo).Where("id", req.Id).
  67. Updates(updateData)
  68. if dbEx.Error != nil {
  69. response.Resp(c, dbEx.Error.Error())
  70. return
  71. }
  72. if dbEx.RowsAffected == 0 {
  73. response.Resp(c, "update fail")
  74. return
  75. }
  76. if err := db.First(&tempInfo, req.Id).Error; err != nil {
  77. response.Resp(c, err.Error())
  78. return
  79. }
  80. response.Resp(c, map[string]any{
  81. "info": tempInfo,
  82. "rowsAffected": dbEx.RowsAffected,
  83. })
  84. return
  85. }
  86. func (*ModelBaseHandler[T]) Get(c *gin.Context, db *gorm.DB) {
  87. req := new(BaseRequest)
  88. if err := c.BindQuery(req); err != nil {
  89. response.Resp(c, err.Error())
  90. return
  91. }
  92. if req.Id == 0 {
  93. response.Resp(c, "id is zero")
  94. return
  95. }
  96. tempInfo := new(T)
  97. // 先通过Id获取记录'
  98. if err := db.First(&tempInfo, req.Id).Error; err != nil {
  99. response.Resp(c, err.Error())
  100. return
  101. }
  102. response.Resp(c, map[string]any{
  103. "info": tempInfo,
  104. })
  105. return
  106. }
  107. func (*ModelBaseHandler[T]) Create(c *gin.Context, db *gorm.DB) {
  108. req := new(BaseRequest)
  109. if err := c.BindJSON(req); err != nil {
  110. response.Resp(c, err.Error())
  111. return
  112. }
  113. info := new(T)
  114. body, _ := json.Marshal(req.Data)
  115. if err := json.Unmarshal(body, info); err != nil {
  116. response.Resp(c, err.Error())
  117. return
  118. }
  119. if err := db.Create(info).Error; err != nil {
  120. response.Resp(c, err.Error())
  121. return
  122. }
  123. response.Resp(c, map[string]any{
  124. "info": info,
  125. })
  126. }
  127. func (*ModelBaseHandler[T]) List(c *gin.Context, db *gorm.DB) {
  128. req := NewListRequest[T]()
  129. if err := c.BindQuery(req); err != nil {
  130. response.Resp(c, err.Error())
  131. return
  132. }
  133. resp, err := req.Query(db)
  134. if err != nil {
  135. response.Resp(c, err.Error())
  136. return
  137. }
  138. response.Resp(c, resp)
  139. return
  140. }