Files
x_admin/server/admin/generator/tpl_utils/utils.go

324 lines
9.8 KiB
Go

package tpl_utils
import (
"strconv"
"strings"
"x_admin/config"
"x_admin/model/gen_model"
"x_admin/util"
"gorm.io/gorm"
)
var GenUtil = genUtil{}
// genUtil 代码生成工具
type genUtil struct{}
// GetDbTablesQuery 查询库中的数据表
func (gu genUtil) GetDbTablesQuery(db *gorm.DB, tableName string, tableComment string) *gorm.DB {
query := db.Table("information_schema.tables")
// whereStr := ""
query = query.Where(`table_schema = (SELECT database())
AND table_name NOT LIKE "qrtz_%"
AND table_name NOT LIKE "gen_%"
AND table_name NOT IN (select table_name from x_gen_table)`)
if tableName != "" {
query = query.Where(`lower(table_name) like lower(?)`, "%"+tableName+"%")
}
if tableComment != "" {
query = query.Where(`lower(table_comment) like lower(?)`, "%"+tableComment+"%")
}
query = query.Select("table_name, table_comment, create_time, update_time")
return query
}
// GetDbTablesQueryByNames 根据表名集查询表
func (gu genUtil) GetDbTablesQueryByNames(db *gorm.DB, tableNames []string) *gorm.DB {
query := db.Table("information_schema.tables").Where(
`table_schema = (SELECT database())
AND table_name NOT LIKE "qrtz_%"
AND table_name NOT LIKE "gen_%"
AND table_name IN ?`, tableNames).Select(
"table_name, table_comment, create_time, update_time")
return query
}
// GetDbTableColumnsQueryByName 根据表名查询列信息
func (gu genUtil) GetDbTableColumnsQueryByName(db *gorm.DB, tableName string) *gorm.DB {
query := db.Table("information_schema.columns").Where(
`table_schema = (SELECT database())
AND table_name = ?`, tableName).Order("ordinal_position").Select(
`column_name,
(CASE WHEN (is_nullable = "no" && column_key != "PRI") THEN "1" ELSE NULL END) AS is_required,
(CASE WHEN column_key = "PRI" THEN "1" ELSE "0" END) AS is_pk,
ordinal_position AS sort, column_comment,
(CASE WHEN extra = "auto_increment" THEN "1" ELSE "0" END) AS is_increment, column_type`)
return query
}
// InitTable 初始化表
func (gu genUtil) InitTable(table gen_model.GenTable) gen_model.GenTable {
return gen_model.GenTable{
TableName: table.TableName,
TableComment: table.TableComment,
AuthorName: "",
EntityName: gu.ToClassName(table.TableName),
ModuleName: gu.ToModuleName(table.TableName),
FunctionName: strings.Replace(table.TableComment, "表", "", -1),
CreateTime: util.NullTimeUtil.Now(),
UpdateTime: util.NullTimeUtil.Now(),
}
}
// InitColumn 初始化字段列
func (gu genUtil) InitColumn(tableId uint, column gen_model.GenTableColumn) gen_model.GenTableColumn {
columnType := gu.GetDbType(column.ColumnType)
columnLen := gu.GetColumnLength(column.ColumnType)
col := gen_model.GenTableColumn{
TableID: tableId,
ColumnName: column.ColumnName,
ColumnComment: column.ColumnComment,
ColumnType: columnType,
ColumnLength: columnLen,
GoField: column.ColumnName,
GoType: GoConstants.TypeString,
QueryType: GenConstants.QueryEq,
Sort: column.Sort,
IsPk: column.IsPk,
IsIncrement: column.IsIncrement,
IsRequired: column.IsRequired,
CreateTime: util.NullTimeUtil.Now(),
UpdateTime: util.NullTimeUtil.Now(),
}
if util.ToolsUtil.Contains(append(SqlConstants.ColumnTypeStr, SqlConstants.ColumnTypeText...), columnType) {
//文本域组
if columnLen >= 500 || util.ToolsUtil.Contains(SqlConstants.ColumnTypeText, columnType) {
col.HtmlType = HtmlConstants.HtmlTextarea
} else {
col.HtmlType = HtmlConstants.HtmlInput
}
} else if util.ToolsUtil.Contains(SqlConstants.ColumnTypeTime, columnType) {
//日期字段
col.GoType = GoConstants.TypeDate
col.HtmlType = HtmlConstants.HtmlDatetime
} else if util.ToolsUtil.Contains(SqlConstants.ColumnTimeName, col.ColumnName) {
//时间字段
col.GoType = GoConstants.TypeDate
col.HtmlType = HtmlConstants.HtmlDatetime
} else if util.ToolsUtil.Contains(SqlConstants.ColumnTypeInt, columnType) {
//int数字字段
col.HtmlType = HtmlConstants.HtmlInputNumber
col.GoType = GoConstants.TypeInt
} else if util.ToolsUtil.Contains(SqlConstants.ColumnTypeFloat, columnType) {
// float数字字段
col.HtmlType = HtmlConstants.HtmlInputNumber
col.GoType = GoConstants.TypeFloat
}
//非必填字段
if util.ToolsUtil.Contains(SqlConstants.ColumnNameNotEdit, col.ColumnName) {
col.IsRequired = 0
}
//需插入字段
if !util.ToolsUtil.Contains(SqlConstants.ColumnNameNotAdd, col.ColumnName) {
col.IsInsert = GenConstants.Require
}
//需编辑字段
if !util.ToolsUtil.Contains(SqlConstants.ColumnNameNotEdit, col.ColumnName) {
col.IsEdit = GenConstants.Require
col.IsRequired = GenConstants.Require
}
//需列表字段
if !util.ToolsUtil.Contains(SqlConstants.ColumnNameNotList, col.ColumnName) && col.IsPk == 0 {
col.IsList = GenConstants.Require
}
//需查询字段
if !util.ToolsUtil.Contains(SqlConstants.ColumnNameNotQuery, col.ColumnName) && col.IsPk == 0 {
col.IsQuery = GenConstants.Require
}
lowerColName := strings.ToLower(col.ColumnName)
//模糊查字段
if strings.HasSuffix(lowerColName, "name") || util.ToolsUtil.Contains([]string{"title", "mobile"}, lowerColName) {
col.QueryType = GenConstants.QueryLike
}
//根据字段设置
if strings.HasSuffix(lowerColName, "status") || util.ToolsUtil.Contains([]string{"is_show", "is_disable"}, lowerColName) {
//状态字段设置单选框
col.HtmlType = HtmlConstants.HtmlRadio
} else if strings.HasSuffix(lowerColName, "type") || strings.HasSuffix(lowerColName, "sex") {
//类型&性别字段设置下拉框
col.HtmlType = HtmlConstants.HtmlSelect
} else if strings.HasSuffix(lowerColName, "image") {
//图片字段设置图片上传
col.HtmlType = HtmlConstants.HtmlImageUpload
} else if strings.HasSuffix(lowerColName, "file") {
//文件字段设置文件上传
col.HtmlType = HtmlConstants.HtmlFileUpload
} else if strings.HasSuffix(lowerColName, "content") {
//富文本字段设置富文本编辑器
col.HtmlType = HtmlConstants.HtmlEditor
}
return col
}
// ToModuleName 表名转业务名
func (gu genUtil) ToModuleName(name string) string {
names := strings.Split(name, config.Config.DbTablePrefix)
return names[len(names)-1]
}
// ToClassName 表名转类名
func (gu genUtil) ToClassName(name string) string {
tablePrefix := config.Config.DbTablePrefix
name = strings.TrimPrefix(name, tablePrefix)
return util.StringUtil.ToCamelCase(name)
}
// GetDbType 获取数据库类型字段
func (gu genUtil) GetDbType(columnType string) string {
index := strings.IndexRune(columnType, '(')
if index < 0 {
return columnType
}
return columnType[:index]
}
// GetColumnLength 获取字段长度
func (gu genUtil) GetColumnLength(columnType string) int {
index := strings.IndexRune(columnType, '(')
if index < 0 {
return 0
}
length, err := strconv.Atoi(columnType[index+1 : strings.IndexRune(columnType, ')')])
if err != nil {
return 0
}
return length
}
// GetTablePriCol 获取主键列名称
func (gu genUtil) GetTablePriCol(columns []gen_model.GenTableColumn) (res gen_model.GenTableColumn) {
for _, col := range columns {
if col.IsPk == 1 {
res = col
return
}
}
return
}
/**
* @description: Go类型转TS类型
*/
func (gu genUtil) GoToTsType(s string) string {
if s == "int" || s == "int8" || s == "int16" || s == "int32" || s == "int64" {
return "number"
} else if s == "float" || s == "float32" || s == "float64" {
return "number"
} else if s == "string" {
return "string"
} else if s == "bool" {
return "boolean"
} else if s == "time.Time" {
return "Date"
} else if s == "[]byte" {
return "string"
} else if s == "[]string" {
return "string[]"
} else if s == "[]int" {
return "number[]"
} else if s == "[]float" {
return "number[]"
} else if s == "core.NullTime" {
return "string"
}
return "string"
}
/**
* @description: Go类型转 添加编辑 类型
*/
func (gu genUtil) GoWithAddEditType(s string) string {
if s == "int" || s == "int8" || s == "int16" || s == "int32" || s == "int64" {
return "core.NullInt"
} else if s == "float" || s == "float32" || s == "float64" {
return "core.NullFloat"
} else if s == "string" {
return "*string"
} else if s == "bool" {
return "*int"
} else if s == "time.Time" {
return "core.NullTime"
} else if s == "core.NullTime" {
return "core.NullTime"
}
return "string"
}
/**
* @description: Go类型转 添加编辑 类型
*/
func (gu genUtil) GoWithRespType(s string) string {
if s == "int" || s == "int8" || s == "int16" || s == "int32" || s == "int64" {
return "core.NullInt"
} else if s == "float" || s == "float32" || s == "float64" {
return "core.NullFloat"
} else if s == "string" {
return "string"
} else if s == "bool" {
return "int"
} else if s == "time.Time" {
return "core.NullTime"
} else if s == "core.NullTime" {
return "core.NullTime"
}
return "string"
}
/**
* @description: Go类型转为Param类型
*/
// func (gu genUtil) GoToParamType(s string) string {
// if s == "int" || s == "int8" || s == "int16" || s == "int32" || s == "int64" {
// return "int"
// } else if s == "float" || s == "float32" || s == "float64" {
// return "float"
// } else if s == "string" {
// return "string"
// } else if s == "bool" {
// return "bool"
// } else if s == "core.NullTime" {
// return "string"
// }
// return "string"
// }
// 拼接字符串
func (gu genUtil) GetPageResp(s string) string {
return `response.Response{ data=response.PageResp{ lists=[]` + s + `Resp}}`
}
// NameToPath 下划线文件路径
func (gu genUtil) NameToPath(s string) string {
return strings.ReplaceAll(s, "_", "/")
}
func (gu genUtil) PathToName(s string) string {
// 去掉前缀urlPrefix
s = strings.Replace(s, "/api/admin/", "", 1)
return strings.ReplaceAll(s, "/", "_")
}
func (gu genUtil) DeletePathPrefix(s string) string {
// 去掉前缀urlPrefix
s = strings.Replace(s, "/api/admin", "", 1)
return s
}