217 lines
6.4 KiB
Go
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
|
||
|
|
}
|