role update row and filed of multi row

master
Han Joker 2 months ago
parent 75895204aa
commit 533290110f

@ -7,6 +7,117 @@ import (
"net/http"
)
func EditEnabled(ctx *gin.Context) {
// 1. 解析Query请求数据
query := EditEnabledQueryReq{}
if err := ctx.ShouldBindQuery(&query); err != nil {
// 记录日志
utils.Logger().Error(err.Error())
// 直接响应
ctx.JSON(http.StatusOK, gin.H{
"code": 100,
"message": err.Error(),
})
return
}
//log.Println(query)
// 2. 解析Body请求数据
body := EditEnabledBodyReq{}
if err := ctx.ShouldBind(&body); err != nil {
// 记录日志
utils.Logger().Error(err.Error())
// 直接响应
ctx.JSON(http.StatusOK, gin.H{
"code": 100,
"message": err.Error(),
})
return
}
//log.Println(body)
// 3. 更新数据
rowsNum, err := models.RoleUpdateEnabled(query.IDList, body.Enabled)
if err != nil {
// 记录日志
utils.Logger().Error(err.Error())
// 直接响应
ctx.JSON(http.StatusOK, gin.H{
"code": 100,
"message": "数据更新错误",
})
return
}
// 4. 响应
ctx.JSON(http.StatusOK, gin.H{
"code": 0,
"data": rowsNum,
})
}
func Edit(ctx *gin.Context) {
// 1. 解析URI请求数据
uri := EditUriReq{}
if err := ctx.ShouldBindUri(&uri); err != nil {
// 记录日志
utils.Logger().Error(err.Error())
// 直接响应
ctx.JSON(http.StatusOK, gin.H{
"code": 100,
"message": err.Error(),
})
return
}
//log.Println(uri)
// 2. 解析Body请求数据
body := EditBodyReq{}
if err := ctx.ShouldBind(&body); err != nil {
// 记录日志
utils.Logger().Error(err.Error())
// 直接响应
ctx.JSON(http.StatusOK, gin.H{
"code": 100,
"message": err.Error(),
})
return
}
//log.Println(body)
// 3. 更新数据
fieldMap := body.ToFieldMap()
//log.Println(fieldMap)
if err := models.RoleUpdates(fieldMap, uri.ID); err != nil {
// 记录日志
utils.Logger().Error(err.Error())
// 直接响应
ctx.JSON(http.StatusOK, gin.H{
"code": 100,
"message": err.Error(),
})
return
}
// 4. 响应
// 往往需要重新查询一边获取最新的role信息
row, err := models.RoleFetch(uri.ID, false)
if err != nil {
// 记录日志
utils.Logger().Error(err.Error())
// 直接响应
ctx.JSON(http.StatusOK, gin.H{
"code": 100,
"message": "查询错误",
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"code": 100,
"data": row,
})
}
func Restore(ctx *gin.Context) {
// 1. 解析请求数据
req := RestoreReq{}

@ -2,8 +2,67 @@ package role
import (
"ginCms/models"
"reflect"
)
// EditEnabledQueryReq 更新enabled的请求消息
// 将全部的Enabled字段设置为相同的值
type EditEnabledQueryReq struct {
IDList []uint `form:"id" binding:"gt=0"`
}
type EditEnabledBodyReq struct {
Enabled bool `json:"enabled"`
}
// 提供id和enabled的映射将某个id的enabled设置为某个值
//type EditEnabledBodyReq struct {
// Enabled map[uint]bool `json:"enabled"`
//}
// EditUriReq URI上的id参数
type EditUriReq struct {
ID uint `uri:"id" binding:"required,gt=0"` // 可以考虑加一个id存在的校验
}
// EditBodyReq 更新主体参数
type EditBodyReq struct {
Title *string `json:"title" field:"title"`
Key *string `json:"key" field:"key"`
Enabled *bool `json:"enabled" field:"enabled"`
Weight *int `json:"weight" field:"weight"`
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的字段不做自动化处理
if fieldTag == "" {
continue
}
vf := rValue.Field(i)
// 字段的值不是nil
if !vf.IsNil() {
//// 特定的字段,也不做自动化处理
//if fieldTag == "some_filed" {
// continue
//}
fieldMap[fieldTag] = vf.Elem().Interface()
}
}
return fieldMap
}
// RestoreReq 还原的请求消息
type RestoreReq struct {
IDList []uint `form:"id" binding:"gt=0"`

@ -16,4 +16,8 @@ func Router(r *gin.Engine) {
g.GET("recycle", Recycle) // GET /role/recycle?
// 回收站还原
g.PUT("restore", Restore) // PUT /role?id=22&id=33&id=44
// 更新单条
g.PUT(":id", Edit) // PUT /role/33
// 更新多条的enabled
g.PUT("/enabled", EditEnabled) // PUT /role?id=11&id=22
}

@ -12,6 +12,8 @@ type Model struct {
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
}
type FieldMap = map[string]any
// 查询范围的常量
const (
SCOPE_ALL = iota

@ -17,6 +17,34 @@ type Role struct {
Comment string `gorm:"type:text" json:"comment"`
}
// RoleUpdateEnabled 更新多个字段的Enabled值
func RoleUpdateEnabled(idList []uint, enabled bool) (int64, error) {
rowsNum := int64(0)
err := utils.DB().Transaction(func(tx *gorm.DB) error {
result := tx.Model(&Role{}).Where("`id` IN ?", idList).Update("enabled", enabled)
if result.Error != nil {
return result.Error
} else {
// 更新成功
rowsNum = result.RowsAffected
}
return nil
})
return rowsNum, err
}
// RoleUpdates 更新某个模型的部分字段
func RoleUpdates(fieldMap FieldMap, id uint) error {
return utils.DB().Transaction(func(tx *gorm.DB) error {
// 完成更新
if err := tx.Model(&Role{}).Where("`id` = ?", id).Updates(fieldMap).Error; err != nil {
return err
}
return nil
})
}
// RoleRestore 还原
func RoleRestore(idList []uint) (int64, error) {
// 还原的记录数

Loading…
Cancel
Save