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/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

@ -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=

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

@ -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 {

@ -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 还原的请求消息

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

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

@ -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 {
// 完成更新

Loading…
Cancel
Save