From 676fa16ae298bba63b8401e502181ab9212f4c86 Mon Sep 17 00:00:00 2001 From: Han Joker <540090808@qq.com> Date: Tue, 23 Jul 2024 16:54:55 +0800 Subject: [PATCH] role get --- handlers/common/message.go | 1 + handlers/init.go | 2 + handlers/role/handler.go | 83 ++++++++++++++++++++++++++++++++++++++ handlers/role/message.go | 29 +++++++++++++ handlers/role/router.go | 9 +++++ models/base.go | 54 +++++++++++++++++++++++++ models/role.go | 81 ++++++++++++++++++++++++++++++++++++- 7 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 handlers/common/message.go create mode 100644 handlers/role/handler.go create mode 100644 handlers/role/message.go create mode 100644 handlers/role/router.go diff --git a/handlers/common/message.go b/handlers/common/message.go new file mode 100644 index 0000000..805d0c7 --- /dev/null +++ b/handlers/common/message.go @@ -0,0 +1 @@ +package common diff --git a/handlers/init.go b/handlers/init.go index 742472c..b84b7d7 100644 --- a/handlers/init.go +++ b/handlers/init.go @@ -1,6 +1,7 @@ package handlers import ( + "ginCms/handlers/role" "ginCms/handlers/system" "github.com/gin-gonic/gin" ) @@ -12,6 +13,7 @@ func InitEngine() *gin.Engine { // 2. 注册不同模块的路由 system.Router(r) + role.Router(r) return r } diff --git a/handlers/role/handler.go b/handlers/role/handler.go new file mode 100644 index 0000000..6b306e6 --- /dev/null +++ b/handlers/role/handler.go @@ -0,0 +1,83 @@ +package role + +import ( + "ginCms/models" + "ginCms/utils" + "github.com/gin-gonic/gin" + "log" + "net/http" +) + +func GetList(ctx *gin.Context) { + // 1. 解析请求消息 + req := GetListReq{} + if err := ctx.ShouldBindQuery(&req); err != nil { + // 记录日志 + utils.Logger().Error(err.Error()) + // 直接响应 + ctx.JSON(http.StatusOK, gin.H{ + "code": 100, + "message": err.Error(), + }) + return + } + + // 2. 整理请求参数 + req.Clean() + + log.Println(*req.Keyword, *req.SortField, *req.SortMethod, *req.PageNum, *req.PageSize) + + // 3. 基于model查询 + rows, err := models.RoleFetchList(false, req.RoleFilter, req.Sorter, req.Pager) + 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": rows, + }) + +} + +func GetRow(ctx *gin.Context) { + // 1. 解析请求数据(消息) + req := GetRowReq{} + if err := ctx.ShouldBindQuery(&req); err != nil { + // 记录日志 + utils.Logger().Error(err.Error()) + // 直接响应 + ctx.JSON(http.StatusOK, gin.H{ + "code": 100, + "message": err.Error(), + }) + return + } + + // 2. 利用模型完成查询 + row, err := models.RoleFetchRow(false, "`id` = ?", req.ID) + if err != nil { + // 记录日志 + utils.Logger().Error(err.Error()) + // 直接响应 + ctx.JSON(http.StatusOK, gin.H{ + "code": 100, + "message": "查询错误", + }) + return + } + + // 3. 响应 + ctx.JSON(http.StatusOK, gin.H{ + "code": 0, + "data": row, + }) +} diff --git a/handlers/role/message.go b/handlers/role/message.go new file mode 100644 index 0000000..1718391 --- /dev/null +++ b/handlers/role/message.go @@ -0,0 +1,29 @@ +package role + +import ( + "ginCms/models" +) + +// GetRowReq GetRow接口的请求消息类型 +type GetRowReq struct { + // required, 必须的 + // gt, 数值 > 0 + ID uint `form:"id" binding:"required,gt=0"` +} + +// GetListReq GetList请求参数类型 +type GetListReq struct { + // 过滤 + models.RoleFilter + // 排序 + models.Sorter + // 翻页 + models.Pager +} + +// Clean 查询列表参数清理 +func (req *GetListReq) Clean() { + req.RoleFilter.Clean() + req.Sorter.Clean() + req.Pager.Clean() +} diff --git a/handlers/role/router.go b/handlers/role/router.go new file mode 100644 index 0000000..eee92b1 --- /dev/null +++ b/handlers/role/router.go @@ -0,0 +1,9 @@ +package role + +import "github.com/gin-gonic/gin" + +func Router(r *gin.Engine) { + g := r.Group("role") + g.GET("", GetRow) // GET /role?id=21 + g.GET("list", GetList) // GET /role/list? +} diff --git a/models/base.go b/models/base.go index 7231d50..31bc374 100644 --- a/models/base.go +++ b/models/base.go @@ -11,3 +11,57 @@ type Model struct { UpdatedAt time.Time `json:"updatedAt"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` } + +// 通用的查询列表排序类型 +type Sorter struct { + // 排序字段 + SortField *string `form:"sortField" binding:"omitempty,gt=0"` + // 排序方式 asc,desc + // oneof,多个选项之一 + SortMethod *string `form:"sortMethod" binding:"omitempty,oneof=asc desc"` +} + +// 通用的查询列表翻页类型 +type Pager struct { + // 页码索引 + PageNum *int `form:"pageNum" binding:"omitempty,gt=0"` + // 每页记录数 + PageSize *int `form:"pageSize" binding:"omitempty,gt=0"` +} + +const ( + PageNumDefault = 1 + PageSizeDefault = 10 + PageSizeMax = 100 + + SortFieldDefault = "id" + SortMethodDefault = "DESC" +) + +// Clean 整理Sorter +func (s *Sorter) Clean() { + if s.SortField == nil { + temp := SortFieldDefault + s.SortField = &temp + } + if s.SortMethod == nil { + temp := SortMethodDefault + s.SortMethod = &temp + } +} + +// Clean 整理Pager +func (p *Pager) Clean() { + if p.PageNum == nil || *p.PageNum == 0 { + temp := PageNumDefault + p.PageNum = &temp + } + if p.PageSize == nil { + temp := PageSizeDefault + p.PageSize = &temp + } + if *p.PageSize > PageSizeMax { + temp := PageSizeMax + p.PageSize = &temp + } +} diff --git a/models/role.go b/models/role.go index 33d161b..34ce210 100644 --- a/models/role.go +++ b/models/role.go @@ -1,6 +1,10 @@ package models -import "ginCms/utils" +import ( + "fmt" + "ginCms/utils" + "strings" +) // Role 角色模型 type Role struct { @@ -12,6 +16,81 @@ type Role struct { Comment string `gorm:"type:text" json:"comment"` } +// 通用的查询列表过滤类型 +type RoleFilter struct { + // 指针类型表示该字段可以不填 + // omitempty, 非零值才校验 + // gt, 字符串长度>0 + Keyword *string `form:"keyword" binding:"omitempty,gt=0"` +} + +// Clean 整理Filter +func (f *RoleFilter) Clean() { + if f.Keyword == nil { + temp := "" + f.Keyword = &temp + } +} + +// RoleFetchList 查询列表 +// @param assoc bool 是否查询关联 +// @param filter RoleFilter 过滤参数 +// @param sorter Sorter 排序参数 +// @param pager Pager 翻页参数 +// @return []*Role Role列表 +// @return error +func RoleFetchList(assoc bool, filter RoleFilter, sorter Sorter, pager Pager) ([]*Role, error) { + // 初始化query + query := utils.DB().Model(&Role{}) + + // 1. 过滤 + if *filter.Keyword != "" { + query.Where("`title` LIKE ?", "%"+*filter.Keyword+"%") + } + // 其他字段过滤 + + // 2. 排序 + query.Order(fmt.Sprintf("`%s` %s", *sorter.SortField, strings.ToUpper(*sorter.SortMethod))) + + // 3. 翻页 offset limit + // 在pagesize>0时,才进行翻页 + if *pager.PageSize > 0 { + // 偏移 ==(当前页码 - 1) 乘以 每页记录数 + offset := (*pager.PageNum - 1) * *pager.PageSize + query.Offset(offset).Limit(*pager.PageSize) + } + + // 4. 查询 + var rows []*Role + if err := query.Find(&rows).Error; err != nil { + return nil, err + } + + // 5. 关联查询 + if assoc { + } + + // 返回 + return rows, nil +} + +// RoleFetchRow 根据条件查询单条 +// assoc 是否查询管理数据 +// where, args 查询条件 +func RoleFetchRow(assoc bool, where any, args ...any) (*Role, error) { + // 查询本条 + row := &Role{} + if err := utils.DB().Where(where, args...).First(&row).Error; err != nil { + return nil, err + } + + // 关联查询 + if assoc { + } + + return row, nil +} + // 填充数据 func roleSeed() { // 构建数据