mirror of
https://gitee.com/xiangheng/x_admin.git
synced 2025-09-27 04:26:24 +08:00
324 lines
9.8 KiB
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
|
|
}
|