From 577be27183d6450b22b84f3facb475f292ee2591 Mon Sep 17 00:00:00 2001 From: Han Joker <540090808@qq.com> Date: Tue, 30 Jul 2024 22:08:56 +0800 Subject: [PATCH] crud over --- go.mod | 1 + go.sum | 2 ++ handlers/common/mwCors.go | 16 ++++++++++++++++ handlers/init.go | 4 ++++ handlers/role/handler.go | 8 +++++--- handlers/role/message.go | 40 +++++++++++++++++++-------------------- handlers/role/router.go | 3 ++- models/base.go | 2 ++ models/role.go | 1 - 9 files changed, 52 insertions(+), 25 deletions(-) create mode 100644 handlers/common/mwCors.go diff --git a/go.mod b/go.mod index c233f8d..46c97ba 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/cloudwego/iasm v0.2.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/cors v1.7.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect diff --git a/go.sum b/go.sum index 15d5823..a68faa1 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw= +github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= diff --git a/handlers/common/mwCors.go b/handlers/common/mwCors.go new file mode 100644 index 0000000..df116c7 --- /dev/null +++ b/handlers/common/mwCors.go @@ -0,0 +1,16 @@ +package common + +import ( + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" +) + +func UseCors(engine *gin.Engine) { + // 1. 设置中间件 + cfg := cors.DefaultConfig() + cfg.AllowAllOrigins = true + cfg.AllowCredentials = true + cfg.AddAllowHeaders("Authorization") + // 2. 初始化,并使用中间件 + engine.Use(cors.New(cfg)) +} diff --git a/handlers/init.go b/handlers/init.go index b84b7d7..8f4cf30 100644 --- a/handlers/init.go +++ b/handlers/init.go @@ -1,6 +1,7 @@ package handlers import ( + "ginCms/handlers/common" "ginCms/handlers/role" "ginCms/handlers/system" "github.com/gin-gonic/gin" @@ -11,6 +12,9 @@ func InitEngine() *gin.Engine { // 1. 初始化路由引擎 r := gin.Default() + // 设置中间件 + common.UseCors(r) + // 2. 注册不同模块的路由 system.Router(r) role.Router(r) diff --git a/handlers/role/handler.go b/handlers/role/handler.go index 97b52c4..c5aadc0 100644 --- a/handlers/role/handler.go +++ b/handlers/role/handler.go @@ -4,6 +4,7 @@ import ( "ginCms/models" "ginCms/utils" "github.com/gin-gonic/gin" + "log" "net/http" ) @@ -85,21 +86,22 @@ func Edit(ctx *gin.Context) { } //log.Println(body) - // 3. 更新数据 + // 3. req to map fieldMap := body.ToFieldMap() //log.Println(fieldMap) if err := models.RoleUpdates(fieldMap, uri.ID); err != nil { // 记录日志 + log.Println(err) utils.Logger().Error(err.Error()) // 直接响应 ctx.JSON(http.StatusOK, gin.H{ "code": 100, - "message": err.Error(), + "message": "数据更新错误", }) return } - // 4. 响应 + // 3. 响应 // 往往需要重新查询一边,获取最新的role信息 row, err := models.RoleFetch(uri.ID, false) if err != nil { diff --git a/handlers/role/message.go b/handlers/role/message.go index 9c16343..6471715 100644 --- a/handlers/role/message.go +++ b/handlers/role/message.go @@ -34,33 +34,33 @@ type EditBodyReq struct { Comment *string `json:"comment" field:"comment"` } -// ToFieldMap 将请求转换为存在字段的map func (req EditBodyReq) ToFieldMap() models.FieldMap { - fieldMap := models.FieldMap{} - - // 利用reflect遍历结构体,进而判断是否为nil,进行map构建 - rType := reflect.TypeOf(req) - rValue := reflect.ValueOf(req) - for i, l := 0, rType.NumField(); i < l; i++ { - // 获取每个结构的字段类型 - tf := rType.Field(i) - fieldTag := tf.Tag.Get("field") - // 未指定field tag的字段,不做自动化处理 + // 1. 初始化map + m := models.FieldMap{} + + // 2. 利用反射来遍历req结构的全部字段 + reqType := reflect.TypeOf(req) + reqValue := reflect.ValueOf(req) + // 通过字段数量,进行遍历 + for i, nums := 0, reqType.NumField(); i < nums; i++ { + // 获取 field tag + fieldTag := reqType.Field(i).Tag.Get("field") + // 存在 field tag才自动处理 if fieldTag == "" { continue } - vf := rValue.Field(i) - // 字段的值不是nil - if !vf.IsNil() { - //// 特定的字段,也不做自动化处理 - //if fieldTag == "some_filed" { - // continue - //} - fieldMap[fieldTag] = vf.Elem().Interface() + // 判断字段是否为nil,这个值的判断 + if !reqValue.Field(i).IsNil() { + if fieldTag == "some_field" { + // 考虑特殊字段的处理情况 + } else { + // 放入map + m[fieldTag] = reqValue.Field(i).Elem().Interface() + } } } - return fieldMap + return m } // RestoreReq 还原的请求消息 diff --git a/handlers/role/router.go b/handlers/role/router.go index 53fe0f0..e3c6437 100644 --- a/handlers/role/router.go +++ b/handlers/role/router.go @@ -19,5 +19,6 @@ func Router(r *gin.Engine) { // 更新单条 g.PUT(":id", Edit) // PUT /role/33 // 更新多条的enabled - g.PUT("/enabled", EditEnabled) // PUT /role?id=11&id=22 + g.PUT("enabled", EditEnabled) // PUT /role?id=11&id=22 + } diff --git a/models/base.go b/models/base.go index 989272b..1d84380 100644 --- a/models/base.go +++ b/models/base.go @@ -12,6 +12,8 @@ type Model struct { DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` } +// key: 字段名 +// value: 字段值 type FieldMap = map[string]any // 查询范围的常量 diff --git a/models/role.go b/models/role.go index c10863b..992e66d 100644 --- a/models/role.go +++ b/models/role.go @@ -34,7 +34,6 @@ func RoleUpdateEnabled(idList []uint, enabled bool) (int64, error) { return rowsNum, err } -// RoleUpdates 更新某个模型的部分字段 func RoleUpdates(fieldMap FieldMap, id uint) error { return utils.DB().Transaction(func(tx *gorm.DB) error { // 完成更新