From 533290110f34a688b5b48a85a3d39304e3d904cd Mon Sep 17 00:00:00 2001 From: Han Joker <540090808@qq.com> Date: Tue, 30 Jul 2024 19:12:38 +0800 Subject: [PATCH] role update row and filed of multi row --- handlers/role/handler.go | 111 +++++++++++++++++++++++++++++++++++++++ handlers/role/message.go | 59 +++++++++++++++++++++ handlers/role/router.go | 4 ++ models/base.go | 2 + models/role.go | 28 ++++++++++ 5 files changed, 204 insertions(+) diff --git a/handlers/role/handler.go b/handlers/role/handler.go index 749e5ea..97b52c4 100644 --- a/handlers/role/handler.go +++ b/handlers/role/handler.go @@ -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{} diff --git a/handlers/role/message.go b/handlers/role/message.go index 3a6c0cc..9c16343 100644 --- a/handlers/role/message.go +++ b/handlers/role/message.go @@ -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"` diff --git a/handlers/role/router.go b/handlers/role/router.go index 414f0c1..53fe0f0 100644 --- a/handlers/role/router.go +++ b/handlers/role/router.go @@ -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 } diff --git a/models/base.go b/models/base.go index 23df732..989272b 100644 --- a/models/base.go +++ b/models/base.go @@ -12,6 +12,8 @@ type Model struct { DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` } +type FieldMap = map[string]any + // 查询范围的常量 const ( SCOPE_ALL = iota diff --git a/models/role.go b/models/role.go index b1c5645..c10863b 100644 --- a/models/role.go +++ b/models/role.go @@ -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) { // 还原的记录数