1. form

  1. package forms
  2. type BannerForm struct {
  3. Image string `form:"image" json:"image" binding:"url"`
  4. Index int `form:"index" json:"index" binding:"required"`
  5. Url string `form:"url" json:"url" binding:"url"`
  6. }

2. handler

  1. package banners
  2. import (
  3. "context"
  4. "github.com/gin-gonic/gin"
  5. "github.com/go-playground/validator/v10"
  6. "github.com/golang/protobuf/ptypes/empty"
  7. "google.golang.org/grpc/codes"
  8. "google.golang.org/grpc/status"
  9. "mxshop-api/goods-web/forms"
  10. "mxshop-api/goods-web/global"
  11. "mxshop-api/goods-web/proto"
  12. "net/http"
  13. "strconv"
  14. "strings"
  15. )
  16. func removeTopStruct(fields map[string]string) map[string]string{
  17. rsp := map[string]string{}
  18. for field, err := range fields {
  19. rsp[field[strings.Index(field, ".")+1:]] = err
  20. }
  21. return rsp
  22. }
  23. func HandleGrpcErrorToHttp(err error, c *gin.Context) {
  24. //将grpc的code转换成http的状态码
  25. if err != nil {
  26. if e, ok := status.FromError(err); ok {
  27. switch e.Code() {
  28. case codes.NotFound:
  29. c.JSON(http.StatusNotFound, gin.H{
  30. "msg": e.Message(),
  31. })
  32. case codes.Internal:
  33. c.JSON(http.StatusInternalServerError, gin.H{
  34. "msg:": "内部错误",
  35. })
  36. case codes.InvalidArgument:
  37. c.JSON(http.StatusBadRequest, gin.H{
  38. "msg": "参数错误",
  39. })
  40. case codes.Unavailable:
  41. c.JSON(http.StatusInternalServerError, gin.H{
  42. "msg": "用户服务不可用",
  43. })
  44. default:
  45. c.JSON(http.StatusInternalServerError, gin.H{
  46. "msg": e.Code(),
  47. })
  48. }
  49. return
  50. }
  51. }
  52. }
  53. func HandleValidatorError(c *gin.Context, err error){
  54. errs, ok := err.(validator.ValidationErrors)
  55. if !ok {
  56. c.JSON(http.StatusOK, gin.H{
  57. "msg":err.Error(),
  58. })
  59. }
  60. c.JSON(http.StatusBadRequest, gin.H{
  61. "error": removeTopStruct(errs.Translate(global.Trans)),
  62. })
  63. return
  64. }
  65. func BannerList(ctx *gin.Context) {
  66. rsp, err := global.GoodsSrvClient.BannerList(context.Background(), &empty.Empty{})
  67. if err != nil {
  68. HandleGrpcErrorToHttp(err, ctx)
  69. return
  70. }
  71. result := make([]interface{}, 0)
  72. for _, value := range rsp.Data {
  73. reMap := make(map[string]interface{})
  74. reMap["id"] = value.Id
  75. reMap["index"] = value.Index
  76. reMap["image"] = value.Image
  77. reMap["url"] = value.Url
  78. result = append(result, reMap)
  79. }
  80. ctx.JSON(http.StatusOK, result)
  81. }
  82. func NewBanner(ctx *gin.Context) {
  83. bannerForm := forms.BannerForm{}
  84. if err := ctx.ShouldBindJSON(&bannerForm); err != nil {
  85. HandleValidatorError(ctx, err)
  86. return
  87. }
  88. rsp, err := global.GoodsSrvClient.CreateBanner(context.Background(), &proto.BannerRequest{
  89. Index: int32(bannerForm.Index),
  90. Url: bannerForm.Url,
  91. Image: bannerForm.Image,
  92. })
  93. if err != nil {
  94. HandleGrpcErrorToHttp(err, ctx)
  95. return
  96. }
  97. response := make(map[string]interface{})
  98. response["id"] = rsp.Id
  99. response["index"] = rsp.Index
  100. response["url"] = rsp.Url
  101. response["image"] = rsp.Image
  102. ctx.JSON(http.StatusOK, response)
  103. }
  104. func UpdateBanner(ctx *gin.Context) {
  105. bannerForm := forms.BannerForm{}
  106. if err := ctx.ShouldBindJSON(&bannerForm); err != nil {
  107. HandleValidatorError(ctx, err)
  108. return
  109. }
  110. id := ctx.Param("id")
  111. i, err := strconv.ParseInt(id, 10, 32)
  112. if err != nil {
  113. ctx.Status(http.StatusNotFound)
  114. return
  115. }
  116. _, err = global.GoodsSrvClient.UpdateBanner(context.Background(), &proto.BannerRequest{
  117. Id: int32(i),
  118. Index: int32(bannerForm.Index),
  119. Url: bannerForm.Url,
  120. })
  121. if err != nil {
  122. HandleGrpcErrorToHttp(err, ctx)
  123. return
  124. }
  125. ctx.Status(http.StatusOK)
  126. }
  127. func DeleteBanner(ctx *gin.Context) {
  128. id := ctx.Param("id")
  129. i, err := strconv.ParseInt(id, 10, 32)
  130. if err != nil {
  131. ctx.Status(http.StatusNotFound)
  132. return
  133. }
  134. _, err = global.GoodsSrvClient.DeleteBanner(context.Background(), &proto.BannerRequest{Id: int32(i)})
  135. if err != nil {
  136. HandleGrpcErrorToHttp(err, ctx)
  137. return
  138. }
  139. ctx.JSON(http.StatusOK, "")
  140. }

3. router

  1. package router
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "mxshop-api/goods-web/api/banners"
  5. "mxshop-api/goods-web/middlewares"
  6. )
  7. func InitBannerRouter(Router *gin.RouterGroup) {
  8. BannerRouter := Router.Group("banners")
  9. {
  10. BannerRouter.GET("", banners.BannerList) // 轮播图列表页
  11. BannerRouter.DELETE("/:id", middlewares.JWTAuth(), middlewares.IsAdminAuth(), banners.DeleteBanner) // 删除轮播图
  12. BannerRouter.POST("", middlewares.JWTAuth(), middlewares.IsAdminAuth(), banners.NewBanner) //新建轮播图
  13. BannerRouter.PUT("/:id", middlewares.JWTAuth(), middlewares.IsAdminAuth(), banners.UpdateBanner) //修改轮播图信息
  14. }
  15. }

3. 在初始化中调用router