master
Han Joker 2 months ago
parent ef50e63c10
commit 676fa16ae2

@ -0,0 +1 @@
package common

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

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

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

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

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

@ -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() {
// 构建数据

Loading…
Cancel
Save