This commit is contained in:
2025-07-07 20:11:59 +08:00
parent ab0fdbc447
commit 06e3aa2eb3
2009 changed files with 193082 additions and 0 deletions

View File

@ -0,0 +1,369 @@
/*
* @desc:代码生成字段处理
* @company:云南奇讯科技有限公司
* @Author: yixiaohu<yxh669@qq.com>
* @Date: 2022/10/28 10:10
*/
package toolsGenTableColumn
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
"github.com/tiger1103/gfast/v3/internal/app/system/dao"
"github.com/tiger1103/gfast/v3/internal/app/system/model"
"github.com/tiger1103/gfast/v3/internal/app/system/model/entity"
"github.com/tiger1103/gfast/v3/internal/app/system/service"
"github.com/tiger1103/gfast/v3/library/liberr"
"strings"
)
func init() {
service.RegisterToolsGenTableColumn(New())
}
func New() *sToolsGenTableColumn {
return &sToolsGenTableColumn{
ColumnTypeStr: []string{"char", "varchar", "narchar", "varchar2", "tinytext", "text", "mediumtext", "longtext"},
ColumnTypeTime: []string{"datetime", "time", "date", "timestamp"},
ColumnTypeNumber: []string{"tinyint", "smallint", "mediumint", "int", "number", "integer", "bigint", "float", "float", "double", "decimal"},
ColumnNameNotEdit: []string{"created_by", "created_at", "updated_by", "updated_at", "deleted_at"},
ColumnNameNotList: []string{"updated_by", "updated_at", "deleted_at"},
ColumnNameNotDetail: []string{"updated_at", "deleted_at"},
ColumnNameNotQuery: []string{"updated_by", "updated_at", "deleted_at", "remark"},
}
}
type sToolsGenTableColumn struct {
ColumnTypeStr []string //数据库字符串类型
ColumnTypeTime []string //数据库时间类型
ColumnTypeNumber []string //数据库数字类型
ColumnNameNotEdit []string //页面不需要编辑字段
ColumnNameNotList []string //页面不需要显示的列表字段
ColumnNameNotDetail []string //页面不需要显示的详情字段
ColumnNameNotQuery []string //页面不需要查询字段
}
// SelectDbTableColumnsByName 根据表名称查询列信息
func (s *sToolsGenTableColumn) SelectDbTableColumnsByName(ctx context.Context, tableName string) ([]*entity.ToolsGenTableColumn, error) {
var res []*entity.ToolsGenTableColumn
err := g.Try(ctx, func(ctx context.Context) {
db := g.DB()
sql := " select column_name, (case when (is_nullable = 'YES' || is_nullable = 'NO' && column_default is not null) then '0' else '1' end) as is_required, " +
"(case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort_order_edit, column_comment," +
" (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type from information_schema.columns" +
" where table_schema = (select database()) "
sql += " and " + gdb.FormatSqlWithArgs(" table_name=? ", []interface{}{tableName}) + " order by ordinal_position ASC "
err := db.GetScan(ctx, &res, sql)
liberr.ErrIsNil(ctx, err, "查询列信息失败")
})
return res, err
}
// InitColumnField 初始化列属性字段
func (s *sToolsGenTableColumn) InitColumnField(column *entity.ToolsGenTableColumn, table *entity.ToolsGenTable) {
dataType := s.GetDbType(column.ColumnType)
columnName := column.ColumnName
column.TableId = table.TableId
//设置字段名
column.GoField = gstr.CaseCamel(columnName)
column.HtmlField = gstr.CaseCamelLower(columnName)
if s.IsStringObject(dataType) {
//字段为字符串类型
column.GoType = "string"
column.TsType = "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.TsType = "string"
column.HtmlType = "datetime"
} else if s.IsNumberObject(dataType) {
//字段为数字类型
column.HtmlType = "input"
t, _ := gregex.ReplaceString(`\(.+\)`, "", column.ColumnType)
t = gstr.Split(gstr.Trim(t), " ")[0]
t = gstr.ToLower(t)
// 如果是浮点型
switch t {
case "float", "double", "decimal":
column.GoType = "float64"
case "bit", "int", "tinyint", "small_int", "smallint", "medium_int", "mediumint":
if gstr.ContainsI(column.ColumnType, "unsigned") {
column.GoType = "uint"
} else {
column.GoType = "int"
}
case "big_int", "bigint":
if gstr.ContainsI(column.ColumnType, "unsigned") {
column.GoType = "uint64"
} else {
column.GoType = "int64"
}
}
column.TsType = "number"
} else if dataType == "bit" {
column.GoType = "bool"
column.TsType = "boolean"
}
//新增字段
if s.IsNotEdit(columnName) {
column.IsInsert = false
} else if column.IsIncrement {
column.IsInsert = false
} else {
column.IsInsert = true
}
// 编辑字段
if s.IsNotEdit(columnName) {
column.IsEdit = false
} else if column.IsPk {
column.IsEdit = false
} else {
column.IsEdit = true
}
// 列表字段
if s.IsNotList(columnName) {
column.IsList = false
} else {
column.IsList = true
}
// 详情字段
if s.IsNotDetail(columnName) {
column.IsDetail = false
} else {
column.IsDetail = true
} // 查询字段
if s.IsNotQuery(columnName) {
column.IsQuery = false
} else {
column.IsQuery = true
}
// 查询字段类型
if s.CheckNameColumn(columnName) {
column.QueryType = "LIKE"
} else {
column.QueryType = "EQ"
}
// todo 最好不要用字段名来推断是否必填
if strings.Index(columnName, "name") >= 0 || strings.Index(columnName, "status") >= 0 {
column.IsRequired = true
}
// 状态字段设置单选框
if s.CheckStatusColumn(columnName) {
column.HtmlType = "radio"
//column.IsStatus = true
} else if s.CheckTypeColumn(columnName) || s.CheckSexColumn(columnName) {
// 类型&性别字段设置下拉框
column.HtmlType = "select"
}
column.SortOrderList = column.SortOrderEdit
column.SortOrderDetail = column.SortOrderEdit
column.SortOrderQuery = column.SortOrderEdit
column.ColSpan = 12
column.RowSpan = 1
column.IsRowStart = false
column.MinWidth = 100
column.IsFixed = false
column.IsOverflowTooltip = false
column.IsCascade = false
column.ParentColumnName = ""
column.CascadeColumnName = ""
}
// GetDbType 获取数据库类型字段
func (s *sToolsGenTableColumn) GetDbType(columnType string) string {
if strings.Index(columnType, "(") > 0 {
return columnType[0:strings.Index(columnType, "(")]
} else if strings.Index(columnType, " ") > 0 { // 类似 int unsigned 即 int 类型后面并没有标注长度
return columnType[0:strings.Index(columnType, " ")]
} else {
return columnType
}
}
// IsExistInArray 判断 value 是否存在在切片array中
func (s *sToolsGenTableColumn) IsExistInArray(value string, array []string) bool {
for _, v := range array {
if v == value {
return true
}
}
return false
}
// IsStringObject 判断是否是数据库字符串类型
func (s *sToolsGenTableColumn) IsStringObject(dataType string) bool {
return s.IsExistInArray(dataType, s.ColumnTypeStr)
}
// IsTimeObject 判断是否是数据库时间类型
func (s *sToolsGenTableColumn) IsTimeObject(dataType string) bool {
return s.IsExistInArray(dataType, s.ColumnTypeTime)
}
// IsNumberObject 是否数字类型
func (s *sToolsGenTableColumn) IsNumberObject(dataType string) bool {
return s.IsExistInArray(dataType, s.ColumnTypeNumber)
}
// IsNotEdit 是否不可编辑
func (s *sToolsGenTableColumn) IsNotEdit(name string) bool {
return s.IsExistInArray(name, s.ColumnNameNotEdit)
}
// IsNotList 不在列表显示
func (s *sToolsGenTableColumn) IsNotList(name string) bool {
return s.IsExistInArray(name, s.ColumnNameNotList)
}
// IsNotDetail 不在详情显示
func (s *sToolsGenTableColumn) IsNotDetail(name string) bool {
return s.IsExistInArray(name, s.ColumnNameNotDetail)
}
// IsNotQuery 不可用于查询
func (s *sToolsGenTableColumn) IsNotQuery(name string) bool {
return s.IsExistInArray(name, s.ColumnNameNotQuery)
}
// CheckNameColumn 检查字段名后4位是否是name
func (s *sToolsGenTableColumn) CheckNameColumn(columnName string) bool {
if len(columnName) >= 4 {
end := len(columnName)
start := end - 4
if start <= 0 {
start = 0
}
tmp := columnName[start:end]
if tmp == "name" {
return true
}
}
return false
}
// CheckStatusColumn 检查字段名后6位是否是status
func (s *sToolsGenTableColumn) CheckStatusColumn(columnName string) bool {
if len(columnName) >= 6 {
end := len(columnName)
start := end - 6
if start <= 0 {
start = 0
}
tmp := columnName[start:end]
if tmp == "status" {
return true
}
}
return false
}
// CheckTypeColumn 检查字段名后4位是否是type
func (s *sToolsGenTableColumn) CheckTypeColumn(columnName string) bool {
if len(columnName) >= 4 {
end := len(columnName)
start := end - 4
if start <= 0 {
start = 0
}
if columnName[start:end] == "type" {
return true
}
}
return false
}
// CheckSexColumn 检查字段名后3位是否是sex
func (s *sToolsGenTableColumn) CheckSexColumn(columnName string) bool {
if len(columnName) >= 3 {
end := len(columnName)
start := end - 3
if start <= 0 {
start = 0
}
if columnName[start:end] == "sex" {
return true
}
}
return false
}
// SelectGenTableColumnListByTableId 查询业务字段列表
func (s *sToolsGenTableColumn) SelectGenTableColumnListByTableId(ctx context.Context, tableId int64) (list []*entity.ToolsGenTableColumn, err error) {
err = g.Try(ctx, func(ctx context.Context) {
err = dao.ToolsGenTableColumn.Ctx(ctx).
Where(dao.ToolsGenTableColumn.Columns().TableId, tableId).
Order(dao.ToolsGenTableColumn.Columns().SortOrderEdit + " asc, " +
dao.ToolsGenTableColumn.Columns().ColumnId + " asc").Scan(&list)
liberr.ErrIsNil(ctx, err, "获取字段信息出错")
})
return list, nil
}
// GetAllTableColumns 获取所有字段信息
func (s *sToolsGenTableColumn) GetAllTableColumns(ctx context.Context) (list []*entity.ToolsGenTableColumn, err error) {
err = g.Try(ctx, func(ctx context.Context) {
err = dao.ToolsGenTableColumn.Ctx(ctx).
Order(dao.ToolsGenTableColumn.Columns().SortOrderEdit + " asc, " +
dao.ToolsGenTableColumn.Columns().ColumnId + " asc").Scan(&list)
liberr.ErrIsNil(ctx, err, "获取字段信息出错")
})
return
}
func (s *sToolsGenTableColumn) SetPkColumn(table *model.ToolsGenTableEx, columns []*model.ToolsGenTableColumnEx) {
for _, column := range columns {
if column.IsPk {
table.PkColumn = column
break
}
}
if table.PkColumn == nil {
table.PkColumn = columns[0]
}
}
// GetColumnLength 获取字段长度
func (s *sToolsGenTableColumn) GetColumnLength(columnType string) int {
start := strings.Index(columnType, "(")
end := strings.Index(columnType, ")")
result := ""
if start >= 0 && end >= 0 {
result = columnType[start+1 : end-1]
}
return gconv.Int(result)
}
func (s *sToolsGenTableColumn) SelectDbTableColumnMapByName(ctx context.Context, tableName string) (res map[string]*entity.ToolsGenTableColumn, err error) {
err = g.Try(ctx, func(ctx context.Context) {
list, err := s.SelectDbTableColumnsByName(ctx, tableName)
liberr.ErrIsNil(ctx, err)
res = make(map[string]*entity.ToolsGenTableColumn, len(list))
for _, item := range list {
res[item.ColumnName] = item
}
})
return res, nil
}