kra/internal/server/handler/system/sys_auto_code_template.go

210 lines
5.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
// 处理默认ModelGvaModel字段名保留以兼容前端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
}