package tmpl import ( "bufio" "fmt" "os" "strings" "text/template" "xorm.io/xorm" ) type MTable struct { Name string //数据库表名 GreatHump string //大驼峰名称 LittleHump string //小驼峰 Comment string //注释 ExistId bool //是否存在id MColumns []MColumn //字段 } type MColumn struct { Name string //数据库名称 GreatHump string //大驼峰名称 LittleHump string //小驼峰 Comment string //注释 SqlTypeName string //数据库类型 TypeName string //go 类型 VueTypeName string //vue对应类型 Length int64 //长度 Length2 int64 //小数点长度 IsKey bool //主键 } // LoadStructTemplate 加载结构体生成模板 func LoadStructTemplate(url string) { os.Truncate(url, 0) file, _ := os.OpenFile(url, os.O_CREATE|os.O_RDWR, 0666) defer file.Close() //os.Stdout writer := bufio.NewWriter(file) t, err := template.ParseFiles("./tmpl/struct.go.template") if err != nil { panic(err) } err = t.Execute(writer, MTables) if err != nil { panic(err) } } // LoadDaoTemplate 加载Dao生成模板 func LoadDaoTemplate(url string) { os.Truncate(url, 0) file, _ := os.OpenFile(url, os.O_CREATE|os.O_RDWR, 0666) defer file.Close() writer := bufio.NewWriterSize(file, 1<<31) t, err := template.ParseFiles("./tmpl/dao.go.template") if err != nil { panic(err) } err = t.Execute(writer, MTables) if err != nil { panic(err) } } func (receiver MTable) String() string { return fmt.Sprintf("Name:%s,Comment:%s,MColumns:%s\n\n\n", receiver.Name, receiver.Comment, receiver.MColumns) } func (receiver MColumn) String() string { return fmt.Sprintf("Name:%s,AaBbName:%s,aaBbName:%s,Comment:%s,SqlTypeName:%s,TypeName:%s,Length:%d,Length2:%d\n", receiver.Name, receiver.GreatHump, receiver.LittleHump, receiver.Comment, receiver.SqlTypeName, receiver.TypeName, receiver.Length, receiver.Length2) } var MTables = make([]MTable, 0) // InitMTableArray 初始化加载数据库结构并存储 func InitMTableArray(engine *xorm.Engine) { if len(MTables) > 0 { return } metas, err := engine.DBMetas() if err != nil { fmt.Println(err) } for _, meta := range metas { var mTable MTable mTable.Name = meta.Name mTable.GreatHump, mTable.LittleHump = formatName(meta.Name) mTable.Comment = meta.Comment var cols = meta.Columns() for i := range cols { var mColumn MColumn mColumn.Name = cols[i].Name mColumn.GreatHump, mColumn.LittleHump = formatName(cols[i].Name) mColumn.IsKey = cols[i].IsPrimaryKey if cols[i].IsPrimaryKey && cols[i].IsAutoIncrement { mTable.ExistId = true } mColumn.Comment = cols[i].Comment mColumn.SqlTypeName = cols[i].SQLType.Name mColumn.TypeName = formatSqlType(mColumn.SqlTypeName) mColumn.VueTypeName = formatSqlToVueType(mColumn.SqlTypeName) mColumn.Length = cols[i].Length mColumn.Length2 = cols[i].Length2 mTable.MColumns = append(mTable.MColumns, mColumn) } MTables = append(MTables, mTable) } } // 将名字修改成大驼峰和小驼峰的格式进行返回 func formatName(name string) (string, string) { split := strings.Split(strings.ToLower(name), "_") if len(split) == 1 { return strings.ToUpper(split[0][0:1]) + split[0][1:], split[0] } else { AaBb := "" aaBb := "" for j := range split { AaBb += strings.ToUpper(split[j][0:1]) + split[j][1:] if j == 0 { aaBb += split[j] } else { aaBb += strings.ToUpper(split[j][0:1]) + split[j][1:] } } return AaBb, aaBb } } func formatSqlToVueType(str string) string { str = strings.ToLower(str) switch str { case "varchar": return "string" case "int": return "number" case "decimal": return "number" case "datetime": return "string" case "longblob": return "string" case "char": return "string" default: panic("未定义的类型:" + str) } } func formatSqlType(str string) string { str = strings.ToLower(str) switch str { case "varchar": return "string" case "int": return "int64" case "decimal": return "float64" case "datetime": return "time.Time" case "longblob": return "string" case "char": return "string" default: panic("未定义的类型:" + str) } }