master
Han Joker 2 months ago
parent 533290110f
commit 577be27183

@ -11,6 +11,7 @@ require (
github.com/cloudwego/iasm v0.2.0 // indirect github.com/cloudwego/iasm v0.2.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // 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/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect

@ -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/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 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= 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 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 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= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=

@ -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))
}

@ -1,6 +1,7 @@
package handlers package handlers
import ( import (
"ginCms/handlers/common"
"ginCms/handlers/role" "ginCms/handlers/role"
"ginCms/handlers/system" "ginCms/handlers/system"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -11,6 +12,9 @@ func InitEngine() *gin.Engine {
// 1. 初始化路由引擎 // 1. 初始化路由引擎
r := gin.Default() r := gin.Default()
// 设置中间件
common.UseCors(r)
// 2. 注册不同模块的路由 // 2. 注册不同模块的路由
system.Router(r) system.Router(r)
role.Router(r) role.Router(r)

@ -4,6 +4,7 @@ import (
"ginCms/models" "ginCms/models"
"ginCms/utils" "ginCms/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"log"
"net/http" "net/http"
) )
@ -85,21 +86,22 @@ func Edit(ctx *gin.Context) {
} }
//log.Println(body) //log.Println(body)
// 3. 更新数据 // 3. req to map
fieldMap := body.ToFieldMap() fieldMap := body.ToFieldMap()
//log.Println(fieldMap) //log.Println(fieldMap)
if err := models.RoleUpdates(fieldMap, uri.ID); err != nil { if err := models.RoleUpdates(fieldMap, uri.ID); err != nil {
// 记录日志 // 记录日志
log.Println(err)
utils.Logger().Error(err.Error()) utils.Logger().Error(err.Error())
// 直接响应 // 直接响应
ctx.JSON(http.StatusOK, gin.H{ ctx.JSON(http.StatusOK, gin.H{
"code": 100, "code": 100,
"message": err.Error(), "message": "数据更新错误",
}) })
return return
} }
// 4. 响应 // 3. 响应
// 往往需要重新查询一边获取最新的role信息 // 往往需要重新查询一边获取最新的role信息
row, err := models.RoleFetch(uri.ID, false) row, err := models.RoleFetch(uri.ID, false)
if err != nil { if err != nil {

@ -34,33 +34,33 @@ type EditBodyReq struct {
Comment *string `json:"comment" field:"comment"` Comment *string `json:"comment" field:"comment"`
} }
// ToFieldMap 将请求转换为存在字段的map
func (req EditBodyReq) ToFieldMap() models.FieldMap { func (req EditBodyReq) ToFieldMap() models.FieldMap {
fieldMap := models.FieldMap{} // 1. 初始化map
m := models.FieldMap{}
// 利用reflect遍历结构体进而判断是否为nil进行map构建
rType := reflect.TypeOf(req) // 2. 利用反射来遍历req结构的全部字段
rValue := reflect.ValueOf(req) reqType := reflect.TypeOf(req)
for i, l := 0, rType.NumField(); i < l; i++ { reqValue := reflect.ValueOf(req)
// 获取每个结构的字段类型 // 通过字段数量,进行遍历
tf := rType.Field(i) for i, nums := 0, reqType.NumField(); i < nums; i++ {
fieldTag := tf.Tag.Get("field") // 获取 field tag
// 未指定field tag的字段不做自动化处理 fieldTag := reqType.Field(i).Tag.Get("field")
// 存在 field tag才自动处理
if fieldTag == "" { if fieldTag == "" {
continue continue
} }
vf := rValue.Field(i) // 判断字段是否为nil这个值的判断
// 字段的值不是nil if !reqValue.Field(i).IsNil() {
if !vf.IsNil() { if fieldTag == "some_field" {
//// 特定的字段,也不做自动化处理 // 考虑特殊字段的处理情况
//if fieldTag == "some_filed" { } else {
// continue // 放入map
//} m[fieldTag] = reqValue.Field(i).Elem().Interface()
fieldMap[fieldTag] = vf.Elem().Interface() }
} }
} }
return fieldMap return m
} }
// RestoreReq 还原的请求消息 // RestoreReq 还原的请求消息

@ -19,5 +19,6 @@ func Router(r *gin.Engine) {
// 更新单条 // 更新单条
g.PUT(":id", Edit) // PUT /role/33 g.PUT(":id", Edit) // PUT /role/33
// 更新多条的enabled // 更新多条的enabled
g.PUT("/enabled", EditEnabled) // PUT /role?id=11&id=22 g.PUT("enabled", EditEnabled) // PUT /role?id=11&id=22
} }

@ -12,6 +12,8 @@ type Model struct {
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
} }
// key: 字段名
// value: 字段值
type FieldMap = map[string]any type FieldMap = map[string]any
// 查询范围的常量 // 查询范围的常量

@ -34,7 +34,6 @@ func RoleUpdateEnabled(idList []uint, enabled bool) (int64, error) {
return rowsNum, err return rowsNum, err
} }
// RoleUpdates 更新某个模型的部分字段
func RoleUpdates(fieldMap FieldMap, id uint) error { func RoleUpdates(fieldMap FieldMap, id uint) error {
return utils.DB().Transaction(func(tx *gorm.DB) error { return utils.DB().Transaction(func(tx *gorm.DB) error {
// 完成更新 // 完成更新

Loading…
Cancel
Save