Files
PandaX/apps/develop/gen/gen.go
lixxxww 043327d9b4 优化生成代码
Signed-off-by: lixxxww <941403820@qq.com>
2024-01-22 05:01:50 +00:00

495 lines
15 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 gen
import (
"bytes"
"fmt"
"os"
"strconv"
"strings"
"sync"
"text/template"
"pandax/apps/develop/entity"
"pandax/apps/develop/services"
sysEntity "pandax/apps/system/entity"
sysServices "pandax/apps/system/services"
"github.com/PandaXGO/PandaKit/biz"
"github.com/PandaXGO/PandaKit/utils"
"pandax/pkg/global"
"github.com/kakuilan/kgo"
)
var ToolsGenTableColumn = toolsGenTableColumn{}
var (
ColumnTypeStr = []string{"char", "varchar", "narchar", "varchar2", "tinytext", "text", "mediumtext", "longtext"}
ColumnTypeTime = []string{"datetime", "time", "date", "timestamp", "timestamptz"}
ColumnTypeNumber = []string{"tinyint", "smallint", "mediumint", "int", "int2", "int4", "int8", "number", "integer", "numeric", "bigint", "float", "float4", "float8", "double", "decimal"}
ColumnNameNotEdit = []string{"create_by", "update_by", "create_time", "update_time", "delete_time"}
ColumnNameNotList = []string{"create_by", "update_by", "update_time", "delete_time"}
ColumnNameNotQuery = []string{"create_by", "update_by", "create_time", "update_time", "delete_time", "remark"}
)
type toolsGenTableColumn struct{}
func (s *toolsGenTableColumn) GetDbType(columnType string) string {
if strings.Index(columnType, "(") > 0 {
return columnType[0:strings.Index(columnType, "(")]
} else {
return columnType
}
}
func (s *toolsGenTableColumn) IsExistInArray(value string, array []string) bool {
return strings.Contains(strings.Join(array, ","), value)
}
func (s *toolsGenTableColumn) GetColumnLength(columnType string) int {
start := strings.LastIndex(columnType, "(")
end := strings.LastIndex(columnType, ")")
if start >= 0 && end >= 0 {
result := columnType[start+1 : end]
i, _ := strconv.Atoi(result)
return i
}
return 0
}
func (s *toolsGenTableColumn) IsStringObject(dataType string) bool {
return s.IsExistInArray(dataType, ColumnTypeStr)
}
func (s *toolsGenTableColumn) IsTimeObject(dataType string) bool {
return s.IsExistInArray(dataType, ColumnTypeTime)
}
func (s *toolsGenTableColumn) IsNumberObject(dataType string) bool {
return s.IsExistInArray(dataType, ColumnTypeNumber)
}
func (s *toolsGenTableColumn) IsNotEdit(name string) bool {
if strings.Contains(name, "id") {
return true
}
return s.IsExistInArray(name, ColumnNameNotEdit)
}
func (s *toolsGenTableColumn) IsNotList(name string) bool {
return s.IsExistInArray(name, ColumnNameNotList)
}
func (s *toolsGenTableColumn) IsNotQuery(name string) bool {
return s.IsExistInArray(name, ColumnNameNotQuery)
}
func (s *toolsGenTableColumn) CheckNameColumn(columnName string) bool {
if len(columnName) >= 4 {
if tmp := columnName[len(columnName)-4:]; tmp == "name" {
return true
}
}
return false
}
func (s *toolsGenTableColumn) CheckStatusColumn(columnName string) bool {
if len(columnName) >= 6 {
if tmp := columnName[len(columnName)-6:]; tmp == "status" {
return true
}
}
return false
}
func (s *toolsGenTableColumn) CheckTypeColumn(columnName string) bool {
if len(columnName) >= 4 {
if tmp := columnName[len(columnName)-4:]; tmp == "type" {
return true
}
}
return false
}
func (s *toolsGenTableColumn) CheckSexColumn(columnName string) bool {
if len(columnName) >= 3 {
if tmp := columnName[len(columnName)-3:]; tmp == "sex" {
return true
}
}
return false
}
func (s *toolsGenTableColumn) GenTableInit(tableName string) (entity.DevGenTable, error) {
var data entity.DevGenTable
data.TableName = tableName
tableNameList := strings.Split(tableName, "_")
for i := 0; i < len(tableNameList); i++ {
strStart := string([]byte(tableNameList[i])[:1])
strEnd := string([]byte(tableNameList[i])[1:])
data.ClassName += strings.ToUpper(strStart) + strEnd
if i >= 1 {
data.BusinessName += strings.ToLower(strStart) + strEnd
data.FunctionName = strings.ToUpper(strStart) + strEnd
}
}
data.PackageName = "system"
data.TplCategory = "crud"
data.ModuleName = strings.Replace(tableName, "_", "-", -1)
dbColumn, err := services.DevTableColumnModelDao.FindDbTableColumnList(tableName)
if err != nil {
return data, err
}
data.TableComment = data.ClassName
data.FunctionAuthor = "panda"
var wg sync.WaitGroup
for x := 0; x < len(dbColumn); x++ {
index := x
wg.Add(1)
go func(wg *sync.WaitGroup, y int) {
defer wg.Done()
var column entity.DevGenTableColumn
column.ColumnComment = dbColumn[y].ColumnComment
column.ColumnName = dbColumn[y].ColumnName
column.ColumnType = dbColumn[y].ColumnType
column.Sort = y + 1
column.IsPk = "0"
nameList := strings.Split(dbColumn[y].ColumnName, "_")
for i := 0; i < len(nameList); i++ {
strStart := string([]byte(nameList[i])[:1])
strend := string([]byte(nameList[i])[1:])
column.GoField += strings.ToUpper(strStart) + strend
if i == 0 {
column.JsonField = strings.ToLower(strStart) + strend
} else {
column.JsonField += strings.ToUpper(strStart) + strend
}
}
if column.ColumnComment == "" {
column.ColumnComment = column.GoField
}
dataType := strings.ToLower(column.ColumnType)
if s.IsStringObject(dataType) {
column.GoType = "string"
columnLength := s.GetColumnLength(column.ColumnType)
if columnLength >= 500 {
column.HtmlType = "textarea"
} else {
column.HtmlType = "input"
}
} else if s.IsTimeObject(dataType) {
column.GoType = "Time"
column.HtmlType = "datetime"
} else if s.IsNumberObject(dataType) {
column.HtmlType = "input"
t := ""
if global.Conf.Server.DbType == "postgresql" {
t = column.ColumnType
} else {
t, _ := utils.ReplaceString(`\(.+\)`, "", column.ColumnType)
t = strings.Split(strings.TrimSpace(t), " ")[0]
t = strings.ToLower(t)
}
switch t {
case "float", "float4", "float8", "double", "decimal":
column.GoType = "float64"
case "bit", "int", "int2", "int4", "tinyint", "small_int", "smallint", "medium_int", "mediumint":
if utils.Contains(column.ColumnType, "unsigned") != -1 {
column.GoType = "uint"
} else {
column.GoType = "int"
}
case "big_int", "int8", "bigint", "numeric":
if utils.Contains(column.ColumnType, "unsigned") != -1 {
column.GoType = "uint64"
} else {
column.GoType = "int64"
}
}
} else {
switch dataType {
case "bool":
column.GoType = "bool"
column.HtmlType = "switch"
}
}
if strings.Contains(dbColumn[y].ColumnKey, "PR") {
column.IsPk = "1"
data.PkColumn = dbColumn[y].ColumnName
data.PkGoField = column.GoField
data.PkGoType = column.GoType
data.PkJsonField = column.JsonField
if dbColumn[y].Extra == "auto_increment" {
column.IsIncrement = "1"
}
}
if s.IsNotEdit(column.ColumnName) {
column.IsRequired = "0"
column.IsInsert = "0"
} else {
column.IsRequired = "0"
column.IsInsert = "1"
if strings.Index(column.ColumnName, "name") >= 0 || strings.Index(column.ColumnName, "status") >= 0 {
column.IsRequired = "1"
}
}
if s.IsNotEdit(column.ColumnName) {
column.IsEdit = "0"
} else {
if column.IsPk == "1" {
column.IsEdit = "0"
} else {
column.IsEdit = "1"
}
}
if s.IsNotList(column.ColumnName) {
column.IsList = "0"
} else {
column.IsList = "1"
}
if s.IsNotQuery(column.ColumnName) {
column.IsQuery = "0"
} else {
column.IsQuery = "1"
}
if s.CheckNameColumn(column.ColumnName) {
column.QueryType = "LIKE"
} else {
column.QueryType = "EQ"
}
if s.CheckStatusColumn(column.ColumnName) {
column.HtmlType = "radio"
} else if s.CheckTypeColumn(column.ColumnName) || s.CheckSexColumn(column.ColumnName) {
column.HtmlType = "select"
}
data.Columns = append(data.Columns, column)
}(&wg, index)
}
wg.Wait()
return data, nil
}
func Preview(tableId int64) map[string]interface{} {
defer func() {
if err := recover(); err != nil {
global.Log.Error(err)
}
}()
t1, err := template.ParseFiles("resource/template/go/entity.template")
biz.ErrIsNil(err, "entity模版读取失败")
t2, err := template.ParseFiles("resource/template/go/service.template")
biz.ErrIsNil(err, "service模版读取失败")
t3, err := template.ParseFiles("resource/template/go/api.template")
biz.ErrIsNilAppendErr(err, "api模版读取失败")
t4, err := template.ParseFiles("resource/template/go/router.template")
biz.ErrIsNil(err, "router模版读取失败")
t5, err := template.ParseFiles("resource/template/js/api.template")
biz.ErrIsNil(err, "js模版读取失败")
t6, err := template.ParseFiles("resource/template/vue/list-vue.template")
biz.ErrIsNil(err, "vue列表模版读取失败")
t7, err := template.ParseFiles("resource/template/vue/edit-vue.template")
biz.ErrIsNil(err, "vue编辑模版读取失败")
tab, _ := services.DevGenTableModelDao.FindOne(entity.DevGenTable{TableId: tableId}, false)
var b1 bytes.Buffer
t1.Execute(&b1, tab)
var b2 bytes.Buffer
t2.Execute(&b2, tab)
var b3 bytes.Buffer
t3.Execute(&b3, tab)
var b4 bytes.Buffer
t4.Execute(&b4, tab)
var b5 bytes.Buffer
t5.Execute(&b5, tab)
var b6 bytes.Buffer
t6.Execute(&b6, tab)
var b7 bytes.Buffer
t7.Execute(&b7, tab)
mp := make(map[string]interface{})
mp["template/entity.template"] = b1.String()
mp["template/services.template"] = b2.String()
mp["template/api.template"] = b3.String()
mp["template/router.template"] = b4.String()
mp["template/jsApi.template"] = b5.String()
mp["template/listVue.template"] = b6.String()
mp["template/editVue.template"] = b7.String()
return mp
}
func GenCode(tableId int64) {
defer func() {
if err := recover(); err != nil {
global.Log.Error(err)
}
}()
tab, err := services.DevGenTableModelDao.FindOne(entity.DevGenTable{TableId: tableId}, false)
biz.ErrIsNil(err, "读取表信息失败!")
tab.ModuleName = strings.Replace(tab.TableName, "_", "-", -1)
t1, err := template.ParseFiles("resource/template/go/entity.template")
biz.ErrIsNil(err, "entity模版读取失败")
t2, err := template.ParseFiles("resource/template/go/services.template")
biz.ErrIsNil(err, "service模版读取失败")
t3, err := template.ParseFiles("resource/template/go/api.template")
biz.ErrIsNil(err, "api模版读取失败")
t4, err := template.ParseFiles("resource/template/go/router.template")
biz.ErrIsNil(err, "router模版读取失败")
t5, err := template.ParseFiles("resource/template/js/api.template")
biz.ErrIsNil(err, "js模版读取失败")
t6, err := template.ParseFiles("resource/template/vue/list-vue.template")
biz.ErrIsNil(err, "vue列表模版读取失败")
t7, err := template.ParseFiles("resource/template/vue/edit-vue.template")
biz.ErrIsNil(err, "vue编辑模版读取失败")
kgo.KFile.Mkdir("./apps/"+tab.PackageName+"/api/", os.ModePerm)
kgo.KFile.Mkdir("./apps/"+tab.PackageName+"/entity/", os.ModePerm)
kgo.KFile.Mkdir("./apps/"+tab.PackageName+"/router/", os.ModePerm)
kgo.KFile.Mkdir("./apps/"+tab.PackageName+"/services/", os.ModePerm)
kgo.KFile.Mkdir(global.Conf.Gen.Frontpath+"/api/"+tab.PackageName+"/", os.ModePerm)
kgo.KFile.Mkdir(global.Conf.Gen.Frontpath+"/views/"+tab.PackageName+"/"+tab.BusinessName+"/", os.ModePerm)
kgo.KFile.Mkdir(global.Conf.Gen.Frontpath+"/views/"+tab.PackageName+"/"+tab.BusinessName+"/"+"component"+"/", os.ModePerm)
var b1 bytes.Buffer
t1.Execute(&b1, tab)
var b2 bytes.Buffer
t2.Execute(&b2, tab)
var b3 bytes.Buffer
t3.Execute(&b3, tab)
var b4 bytes.Buffer
t4.Execute(&b4, tab)
var b5 bytes.Buffer
t5.Execute(&b5, tab)
var b6 bytes.Buffer
t6.Execute(&b6, tab)
var b7 bytes.Buffer
t7.Execute(&b7, tab)
kgo.KFile.WriteFile("./apps/"+tab.PackageName+"/entity/"+tab.TableName+".go", b1.Bytes())
kgo.KFile.WriteFile("./apps/"+tab.PackageName+"/services/"+tab.TableName+".go", b2.Bytes())
kgo.KFile.WriteFile("./apps/"+tab.PackageName+"/api/"+tab.TableName+".go", b3.Bytes())
kgo.KFile.WriteFile("./apps/"+tab.PackageName+"/router/"+tab.TableName+".go", b4.Bytes())
kgo.KFile.WriteFile(global.Conf.Gen.Frontpath+"/api/"+tab.PackageName+"/"+tab.BusinessName+".ts", b5.Bytes())
kgo.KFile.WriteFile(global.Conf.Gen.Frontpath+"/views/"+tab.PackageName+"/"+tab.BusinessName+"/index.vue", b6.Bytes())
kgo.KFile.WriteFile(global.Conf.Gen.Frontpath+"/views/"+tab.PackageName+"/"+tab.BusinessName+"/"+"component"+"/editModule.vue", b7.Bytes())
}
func GenConfigure(tableId, parentId int) {
tab, err := services.DevGenTableModelDao.FindOne(entity.DevGenTable{TableId: int64(tableId)}, false)
if err != nil {
return
}
component := "Layout"
if parentId != 0 {
component = fmt.Sprintf("/%s/%s/index", tab.PackageName, tab.BusinessName)
}
menu := sysEntity.SysMenu{
ParentId: int64(parentId),
MenuName: tab.TableComment,
MenuType: "C",
Sort: 1,
Icon: "elementSetting",
Path: fmt.Sprintf("/%s/%s", tab.PackageName, tab.BusinessName),
Component: component,
IsIframe: "1",
IsHide: "0",
IsKeepAlive: "1",
IsAffix: "1",
Permission: fmt.Sprintf("%s:%s:list", tab.PackageName, tab.BusinessName),
Status: "0",
CreateBy: "admin",
}
insert := sysServices.SysMenuModelDao.Insert(menu)
menuA := sysEntity.SysMenu{
ParentId: insert.MenuId,
MenuName: "新增" + tab.TableComment,
MenuType: "F",
Sort: 1,
Permission: fmt.Sprintf("%s:%s:add", tab.PackageName, tab.BusinessName),
Status: "0",
CreateBy: "admin",
}
go sysServices.SysMenuModelDao.Insert(menuA)
menuE := sysEntity.SysMenu{
ParentId: insert.MenuId,
MenuName: "修改" + tab.TableComment,
MenuType: "F",
Sort: 2,
Permission: fmt.Sprintf("%s:%s:edit", tab.PackageName, tab.BusinessName),
Status: "0",
CreateBy: "admin",
}
go sysServices.SysMenuModelDao.Insert(menuE)
menuD := sysEntity.SysMenu{
ParentId: insert.MenuId,
MenuName: "删除" + tab.TableComment,
MenuType: "F",
Sort: 3,
Permission: fmt.Sprintf("%s:%s:delete", tab.PackageName, tab.BusinessName),
Status: "0",
CreateBy: "admin",
}
go sysServices.SysMenuModelDao.Insert(menuD)
apiL := sysEntity.SysApi{
Path: fmt.Sprintf("/%s/%s/list", tab.PackageName, tab.BusinessName),
Description: fmt.Sprintf("查询%s列表分页", tab.TableComment),
ApiGroup: tab.BusinessName,
Method: "GET",
}
go sysServices.SysApiModelDao.Insert(apiL)
apiG := sysEntity.SysApi{
Path: fmt.Sprintf("/%s/%s/:%s", tab.PackageName, tab.BusinessName, tab.PkJsonField),
Description: fmt.Sprintf("获取%s信息", tab.TableComment),
ApiGroup: tab.BusinessName,
Method: "GET",
}
go sysServices.SysApiModelDao.Insert(apiG)
apiA := sysEntity.SysApi{
Path: fmt.Sprintf("/%s/%s", tab.PackageName, tab.BusinessName),
Description: fmt.Sprintf("添加%s信息", tab.TableComment),
ApiGroup: tab.BusinessName,
Method: "POST",
}
go sysServices.SysApiModelDao.Insert(apiA)
apiE := sysEntity.SysApi{
Path: fmt.Sprintf("/%s/%s", tab.PackageName, tab.BusinessName),
Description: fmt.Sprintf("修改%s信息", tab.TableComment),
ApiGroup: tab.BusinessName,
Method: "PUT",
}
go sysServices.SysApiModelDao.Insert(apiE)
apiD := sysEntity.SysApi{
Path: fmt.Sprintf("/%s/%s/:%s", tab.PackageName, tab.BusinessName, tab.PkJsonField),
Description: fmt.Sprintf("删除%s信息", tab.TableComment),
ApiGroup: tab.BusinessName,
Method: "DELETE",
}
go sysServices.SysApiModelDao.Insert(apiD)
}