Files
bl/cool/controller.go
2025-06-20 17:13:51 +08:00

217 lines
6.4 KiB
Go

package cool
import (
"context"
"strings"
"github.com/cool-team-official/cool-admin-go/cool/coolconfig"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
)
type IController interface {
Add(ctx context.Context, req *AddReq) (res *BaseRes, err error)
Delete(ctx context.Context, req *DeleteReq) (res *BaseRes, err error)
Update(ctx context.Context, req *UpdateReq) (res *BaseRes, err error)
Info(ctx context.Context, req *InfoReq) (res *BaseRes, err error)
List(ctx context.Context, req *ListReq) (res *BaseRes, err error)
Page(ctx context.Context, req *PageReq) (res *BaseRes, err error)
}
type Controller struct {
Prefix string `json:"prefix"`
Api g.ArrayStr `json:"api"`
Service IService `json:"service"`
}
type AddReq struct {
g.Meta `path:"/add" method:"POST"`
}
type DeleteReq struct {
g.Meta `path:"/delete" method:"POST"`
Ids []int `json:"ids" v:"required#请选择要删除的数据"`
}
type UpdateReq struct {
g.Meta `path:"/update" method:"POST"`
}
type InfoReq struct {
g.Meta `path:"/info" method:"GET"`
Id int `json:"id" v:"integer|required#请选择要查询的数据"`
}
// type InfoRes struct {
// *BaseRes
// Data interface{} `json:"data"`
// }
type ListReq struct {
g.Meta `path:"/list" method:"POST"`
Order string `json:"order"`
Sort string `json:"sort"`
}
type PageReq struct {
g.Meta `path:"/page" method:"POST"`
Page int `d:"1" json:"page"` // 页码
Size int `d:"15" json:"size"` //每页条数
Order string `json:"order"` // 排序字段
Sort string `json:"sort"` // 排序方式 asc desc
IsExport bool `json:"isExport"` // 是否导出
MaxExportLimit int `json:"maxExportLimit"` // 最大导出条数,不传或者小于等于0则不限制
}
func (c *Controller) Add(ctx context.Context, req *AddReq) (res *BaseRes, err error) {
if garray.NewStrArrayFrom(c.Api).Contains("Add") {
err := c.Service.ModifyBefore(ctx, "Add", g.RequestFromCtx(ctx).GetMap())
if err != nil {
return nil, err
}
data, err := c.Service.ServiceAdd(ctx, req)
if err != nil {
return Fail(err.Error()), err
}
err = c.Service.ModifyAfter(ctx, "Add", g.RequestFromCtx(ctx).GetMap())
if err != nil {
return Fail(err.Error()), err
}
return Ok(data), err
}
g.RequestFromCtx(ctx).Response.Status = 404
return nil, nil
}
func (c *Controller) Delete(ctx context.Context, req *DeleteReq) (res *BaseRes, err error) {
if garray.NewStrArrayFrom(c.Api).Contains("Delete") {
err := c.Service.ModifyBefore(ctx, "Delete", g.RequestFromCtx(ctx).GetMap())
if err != nil {
return nil, err
}
data, err := c.Service.ServiceDelete(ctx, req)
if err != nil {
return Fail(err.Error()), err
}
c.Service.ModifyAfter(ctx, "Delete", g.RequestFromCtx(ctx).GetMap())
return Ok(data), err
}
g.RequestFromCtx(ctx).Response.Status = 404
return nil, nil
}
func (c *Controller) Update(ctx context.Context, req *UpdateReq) (res *BaseRes, err error) {
if garray.NewStrArrayFrom(c.Api).Contains("Update") {
err := c.Service.ModifyBefore(ctx, "Update", g.RequestFromCtx(ctx).GetMap())
if err != nil {
return nil, err
}
data, err := c.Service.ServiceUpdate(ctx, req)
if err != nil {
return Fail(err.Error()), err
}
c.Service.ModifyAfter(ctx, "Update", g.RequestFromCtx(ctx).GetMap())
return Ok(data), err
}
g.RequestFromCtx(ctx).Response.Status = 404
return nil, nil
}
func (c *Controller) Info(ctx context.Context, req *InfoReq) (res *BaseRes, err error) {
if garray.NewStrArrayFrom(c.Api).Contains("Info") {
data, err := c.Service.ServiceInfo(ctx, req)
return Ok(data), err
}
g.RequestFromCtx(ctx).Response.Status = 404
return nil, nil
}
func (c *Controller) List(ctx context.Context, req *ListReq) (res *BaseRes, err error) {
if garray.NewStrArrayFrom(c.Api).Contains("List") {
data, err := c.Service.ServiceList(ctx, req)
return Ok(data), err
}
g.RequestFromCtx(ctx).Response.Status = 404
return nil, nil
}
func (c *Controller) Page(ctx context.Context, req *PageReq) (res *BaseRes, err error) {
if garray.NewStrArrayFrom(c.Api).Contains("Page") {
data, err := c.Service.ServicePage(ctx, req)
return Ok(data), err
}
g.RequestFromCtx(ctx).Response.Status = 404
return nil, nil
}
// 注册控制器到路由
func RegisterController(c IController) {
var ctx = context.Background()
var sController = &Controller{}
gconv.Struct(c, &sController)
if coolconfig.Config.Eps {
model := sController.Service.GetModel()
columns := getModelInfo(ctx, sController.Prefix, model)
ModelInfo[sController.Prefix] = columns
}
g.Server().Group(
sController.Prefix, func(group *ghttp.RouterGroup) {
group.Middleware(MiddlewareHandlerResponse)
group.Bind(
c,
)
})
}
// ColumnInfo 表字段信息
type ColumnInfo struct {
Comment string `json:"comment"`
Length string `json:"length"`
Nullable bool `json:"nullable"`
PropertyName string `json:"propertyName"`
Type string `json:"type"`
}
// ModelInfo 路由prefix 对应的model信息
var ModelInfo = make(map[string][]*ColumnInfo)
// getModelInfo 获取模型信息
func getModelInfo(ctx g.Ctx, prefix string, model IModel) (columns []*ColumnInfo) {
fields, err := g.DB(model.GroupName()).TableFields(ctx, model.TableName())
if err != nil {
panic(err)
}
// g.Log().Info(ctx, "fields", fields)
sortedFields := garray.NewArraySize(len(fields), len(fields))
for _, field := range fields {
sortedFields.Set(field.Index, field)
}
for _, field := range sortedFields.Slice() {
if field.(*gdb.TableField).Name == "deleted_at" {
continue
}
var comment string
if field.(*gdb.TableField).Comment != "" {
comment = field.(*gdb.TableField).Comment
} else {
comment = field.(*gdb.TableField).Name
}
// 去除 type中的长度
var length string
if strings.Contains(field.(*gdb.TableField).Type, "(") {
length = field.(*gdb.TableField).Type[strings.Index(field.(*gdb.TableField).Type, "(")+1 : strings.Index(field.(*gdb.TableField).Type, ")")]
}
columnType := gstr.Replace(field.(*gdb.TableField).Type, "("+length+")", "")
column := &ColumnInfo{
Comment: comment,
Length: "",
Nullable: field.(*gdb.TableField).Null,
PropertyName: field.(*gdb.TableField).Name,
Type: columnType,
}
columns = append(columns, column)
}
return
}