210 lines
5.6 KiB
Go
210 lines
5.6 KiB
Go
package system
|
||
|
||
import (
|
||
"go/token"
|
||
"strings"
|
||
|
||
"kra/internal/biz/system"
|
||
"kra/pkg/response"
|
||
"kra/pkg/utils"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// Preview 预览创建后的代码
|
||
// @Tags AutoCodeTemplate
|
||
// @Summary 预览创建后的代码
|
||
// @Security ApiKeyAuth
|
||
// @accept application/json
|
||
// @Produce application/json
|
||
// @Param data body system.AutoCodeInfo true "预览创建代码"
|
||
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "预览创建后的代码"
|
||
// @Router /autoCode/preview [post]
|
||
func (a *AutoCodeTemplateApi) Preview(c *gin.Context) {
|
||
var info system.AutoCodeInfo
|
||
if err := c.ShouldBindJSON(&info); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
if err := utils.Verify(info, utils.AutoCodeVerify); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
if err := pretreatment(&info); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
info.PackageT = utils.FirstUpper(info.Package)
|
||
autoCode, err := autoCodeTemplateUsecase.Preview(c.Request.Context(), &info)
|
||
if err != nil {
|
||
response.FailWithMessage("预览失败:"+err.Error(), c)
|
||
return
|
||
}
|
||
response.OkWithDetailed(gin.H{"autoCode": autoCode}, "预览成功", c)
|
||
}
|
||
|
||
// Create 自动代码模板
|
||
// @Tags AutoCodeTemplate
|
||
// @Summary 自动代码模板
|
||
// @Security ApiKeyAuth
|
||
// @accept application/json
|
||
// @Produce application/json
|
||
// @Param data body system.AutoCodeInfo true "创建自动代码"
|
||
// @Success 200 {object} response.Response{msg=string} "创建成功"
|
||
// @Router /autoCode/createTemp [post]
|
||
func (a *AutoCodeTemplateApi) Create(c *gin.Context) {
|
||
var info system.AutoCodeInfo
|
||
if err := c.ShouldBindJSON(&info); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
if err := utils.Verify(info, utils.AutoCodeVerify); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
if err := pretreatment(&info); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
if err := autoCodeTemplateUsecase.Create(c.Request.Context(), &info); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
response.OkWithMessage("创建成功", c)
|
||
}
|
||
|
||
// AddFunc 增加方法
|
||
// @Tags AutoCodeTemplate
|
||
// @Summary 增加方法
|
||
// @Security ApiKeyAuth
|
||
// @accept application/json
|
||
// @Produce application/json
|
||
// @Param data body system.AutoFuncInfo true "增加方法"
|
||
// @Success 200 {object} response.Response{msg=string} "注入成功"
|
||
// @Router /autoCode/addFunc [post]
|
||
func (a *AutoCodeTemplateApi) AddFunc(c *gin.Context) {
|
||
var info system.AutoFuncInfo
|
||
if err := c.ShouldBindJSON(&info); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
var tempMap map[string]string
|
||
var err error
|
||
if info.IsPreview {
|
||
info.Router = "填充router"
|
||
info.FuncName = "填充funcName"
|
||
info.Method = "填充method"
|
||
info.Description = "填充description"
|
||
tempMap, err = autoCodeTemplateUsecase.GetApiAndServer(&info)
|
||
} else {
|
||
err = autoCodeTemplateUsecase.AddFunc(&info)
|
||
}
|
||
if err != nil {
|
||
response.FailWithMessage("注入失败: "+err.Error(), c)
|
||
return
|
||
}
|
||
if info.IsPreview {
|
||
response.OkWithDetailed(tempMap, "注入成功", c)
|
||
return
|
||
}
|
||
response.OkWithMessage("注入成功", c)
|
||
}
|
||
|
||
// pretreatment 预处理AutoCodeInfo
|
||
func pretreatment(r *system.AutoCodeInfo) error {
|
||
// 处理Go关键字
|
||
if token.IsKeyword(r.Abbreviation) {
|
||
r.Abbreviation = r.Abbreviation + "_"
|
||
}
|
||
// 处理test后缀
|
||
if strings.HasSuffix(r.HumpPackageName, "test") {
|
||
r.HumpPackageName = r.HumpPackageName + "_"
|
||
}
|
||
|
||
length := len(r.Fields)
|
||
dict := make(map[string]string, length)
|
||
r.DataSourceMap = make(map[string]*system.DataSource, length)
|
||
|
||
for i := 0; i < length; i++ {
|
||
if r.Fields[i].Excel {
|
||
r.HasExcel = true
|
||
}
|
||
if r.Fields[i].DictType != "" {
|
||
dict[r.Fields[i].DictType] = ""
|
||
}
|
||
if r.Fields[i].Sort {
|
||
r.NeedSort = true
|
||
}
|
||
switch r.Fields[i].FieldType {
|
||
case "file":
|
||
r.HasFile = true
|
||
r.NeedJSON = true
|
||
case "json":
|
||
r.NeedJSON = true
|
||
case "array":
|
||
r.NeedJSON = true
|
||
r.HasArray = true
|
||
case "video":
|
||
r.HasPic = true
|
||
case "richtext":
|
||
r.HasRichText = true
|
||
case "picture":
|
||
r.HasPic = true
|
||
case "pictures":
|
||
r.HasPic = true
|
||
r.NeedJSON = true
|
||
case "time.Time":
|
||
r.HasTimer = true
|
||
if r.Fields[i].FieldSearchType != "" && r.Fields[i].FieldSearchType != "BETWEEN" && r.Fields[i].FieldSearchType != "NOT BETWEEN" {
|
||
r.HasSearchTimer = true
|
||
}
|
||
}
|
||
if r.Fields[i].DataSource != nil {
|
||
if r.Fields[i].DataSource.Table != "" && r.Fields[i].DataSource.Label != "" && r.Fields[i].DataSource.Value != "" {
|
||
r.HasDataSource = true
|
||
r.Fields[i].CheckDataSource = true
|
||
r.DataSourceMap[r.Fields[i].FieldJson] = r.Fields[i].DataSource
|
||
}
|
||
}
|
||
if !r.GvaModel && r.PrimaryField == nil && r.Fields[i].PrimaryKey {
|
||
r.PrimaryField = r.Fields[i]
|
||
}
|
||
}
|
||
|
||
// 收集字典类型
|
||
for key := range dict {
|
||
r.DictTypes = append(r.DictTypes, key)
|
||
}
|
||
|
||
// 处理默认Model(GvaModel字段名保留以兼容前端API)
|
||
if r.GvaModel {
|
||
r.PrimaryField = &system.AutoCodeField{
|
||
FieldName: "ID",
|
||
FieldType: "uint",
|
||
FieldDesc: "ID",
|
||
FieldJson: "ID",
|
||
DataTypeLong: "20",
|
||
Comment: "主键ID",
|
||
ColumnName: "id",
|
||
}
|
||
}
|
||
|
||
// 新增字段模式下不关注主键
|
||
if r.IsAdd && r.PrimaryField == nil {
|
||
r.PrimaryField = new(system.AutoCodeField)
|
||
}
|
||
|
||
// Package首字母大写
|
||
if r.Package != "" {
|
||
packages := []rune(r.Package)
|
||
if len(packages) > 0 {
|
||
if packages[0] >= 97 && packages[0] <= 122 {
|
||
packages[0] = packages[0] - 32
|
||
}
|
||
r.PackageT = string(packages)
|
||
}
|
||
}
|
||
|
||
return nil
|
||
}
|