222 lines
5.5 KiB
Go
222 lines
5.5 KiB
Go
package model
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
"text/template"
|
|
|
|
"github.com/xxjwxc/public/mybigcamel"
|
|
|
|
"github.com/xxjwxc/gormt/data/config"
|
|
"github.com/xxjwxc/gormt/data/view/genfunc"
|
|
"github.com/xxjwxc/gormt/data/view/genstruct"
|
|
)
|
|
|
|
type _Model struct {
|
|
info DBInfo
|
|
}
|
|
|
|
// Generate build code string.生成代码
|
|
func Generate(info DBInfo) (out []GenOutInfo) {
|
|
m := _Model{
|
|
info: info,
|
|
}
|
|
|
|
// struct
|
|
var stt GenOutInfo
|
|
stt.FileCtx = m.generate()
|
|
stt.FileName = info.DbName + ".go"
|
|
out = append(out, stt)
|
|
// ------end
|
|
|
|
// gen function
|
|
out = append(out, m.generateFunc()...)
|
|
// -------------- end
|
|
return
|
|
}
|
|
|
|
func (m *_Model) generate() string {
|
|
var pkg genstruct.GenPackage
|
|
pkg.SetPackage(m.info.PackageName) //package name
|
|
for _, tab := range m.info.TabList {
|
|
var sct genstruct.GenStruct
|
|
sct.SetStructName(getCamelName(tab.Name)) // Big hump.大驼峰
|
|
sct.SetNotes(tab.Notes)
|
|
sct.AddElement(m.genTableElement(tab.Em)...) // build element.构造元素
|
|
sct.SetCreatTableStr(tab.SQLBuildStr)
|
|
pkg.AddStruct(sct)
|
|
}
|
|
|
|
return pkg.Generate()
|
|
}
|
|
|
|
// genTableElement Get table columns and comments.获取表列及注释
|
|
func (m *_Model) genTableElement(cols []ColumusInfo) (el []genstruct.GenElement) {
|
|
for _, v := range cols {
|
|
var tmp genstruct.GenElement
|
|
if strings.EqualFold(v.Type, "gorm.Model") { // gorm model
|
|
tmp.SetType(v.Type) //
|
|
} else {
|
|
tmp.SetName(getCamelName(v.Name))
|
|
tmp.SetNotes(v.Notes)
|
|
tmp.SetType(getTypeName(v.Type))
|
|
for _, v1 := range v.Index {
|
|
switch v1.Key {
|
|
// case ColumusKeyDefault:
|
|
case ColumusKeyPrimary: // primary key.主键
|
|
tmp.AddTag(_tagGorm, "primary_key")
|
|
case ColumusKeyUnique: // unique key.唯一索引
|
|
tmp.AddTag(_tagGorm, "unique")
|
|
case ColumusKeyIndex: // index key.复合索引
|
|
tmp.AddTag(_tagGorm, getUninStr("index", ":", v1.KeyName))
|
|
case ColumusKeyUniqueIndex: // unique index key.唯一复合索引
|
|
tmp.AddTag(_tagGorm, getUninStr("unique_index", ":", v1.KeyName))
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(v.Name) > 0 {
|
|
// not simple output
|
|
if !config.GetSimple() {
|
|
tmp.AddTag(_tagGorm, "column:"+v.Name)
|
|
tmp.AddTag(_tagGorm, "type:"+v.Type)
|
|
if !v.IsNull {
|
|
tmp.AddTag(_tagGorm, "not null")
|
|
}
|
|
}
|
|
|
|
// json tag
|
|
if config.GetIsJSONTag() {
|
|
if strings.EqualFold(v.Name, "id") {
|
|
tmp.AddTag(_tagJSON, "-")
|
|
} else {
|
|
tmp.AddTag(_tagJSON, mybigcamel.UnMarshal(v.Name))
|
|
}
|
|
}
|
|
}
|
|
|
|
el = append(el, tmp)
|
|
|
|
// ForeignKey
|
|
if config.GetIsForeignKey() && len(v.ForeignKeyList) > 0 {
|
|
fklist := m.genForeignKey(v)
|
|
el = append(el, fklist...)
|
|
}
|
|
// -----------end
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// genForeignKey Get information about foreign key of table column.获取表列外键相关信息
|
|
func (m *_Model) genForeignKey(col ColumusInfo) (fklist []genstruct.GenElement) {
|
|
for _, v := range col.ForeignKeyList {
|
|
isMulti, isFind, notes := m.getColumusKeyMulti(v.TableName, v.ColumnName)
|
|
if isFind {
|
|
var tmp genstruct.GenElement
|
|
tmp.SetNotes(notes)
|
|
if isMulti {
|
|
tmp.SetName(getCamelName(v.TableName) + "List")
|
|
tmp.SetType("[]" + getCamelName(v.TableName))
|
|
} else {
|
|
tmp.SetName(getCamelName(v.TableName))
|
|
tmp.SetType(getCamelName(v.TableName))
|
|
}
|
|
|
|
tmp.AddTag(_tagGorm, "association_foreignkey:"+col.Name)
|
|
tmp.AddTag(_tagGorm, "foreignkey:"+v.ColumnName)
|
|
|
|
// json tag
|
|
if config.GetIsJSONTag() {
|
|
tmp.AddTag(_tagJSON, mybigcamel.UnMarshal(v.TableName)+"_list")
|
|
}
|
|
|
|
fklist = append(fklist, tmp)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (m *_Model) getColumusKeyMulti(tableName, col string) (isMulti bool, isFind bool, notes string) {
|
|
var haveGomod bool
|
|
for _, v := range m.info.TabList {
|
|
if strings.EqualFold(v.Name, tableName) {
|
|
for _, v1 := range v.Em {
|
|
if strings.EqualFold(v1.Name, col) {
|
|
for _, v2 := range v1.Index {
|
|
switch v2.Key {
|
|
case ColumusKeyPrimary, ColumusKeyUnique, ColumusKeyUniqueIndex: // primary key unique key . 主键,唯一索引
|
|
{
|
|
return false, true, v.Notes
|
|
}
|
|
// case ColumusKeyIndex: // index key. 复合索引
|
|
// {
|
|
// isMulti = true
|
|
// }
|
|
}
|
|
}
|
|
return true, true, v.Notes
|
|
} else if strings.EqualFold(v1.Type, "gorm.Model") {
|
|
haveGomod = true
|
|
notes = v.Notes
|
|
}
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
// default gorm.Model
|
|
if haveGomod {
|
|
if strings.EqualFold(col, "id") {
|
|
return false, true, notes
|
|
}
|
|
|
|
if strings.EqualFold(col, "created_at") ||
|
|
strings.EqualFold(col, "updated_at") ||
|
|
strings.EqualFold(col, "deleted_at") {
|
|
return true, true, notes
|
|
}
|
|
}
|
|
|
|
return false, false, ""
|
|
// -----------------end
|
|
}
|
|
|
|
// ///////////////////////// func
|
|
func (m *_Model) generateFunc() (genOut []GenOutInfo) {
|
|
// getn base
|
|
tmpl, err := template.New("gen_base").Parse(genfunc.GetGenBaseTemp())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
var buf bytes.Buffer
|
|
tmpl.Execute(&buf, m.info)
|
|
genOut = append(genOut, GenOutInfo{
|
|
FileName: "gen.base.go",
|
|
FileCtx: buf.String(),
|
|
})
|
|
//tools.WriteFile(outDir+"gen_router.go", []string{buf.String()}, true)
|
|
// -------end------
|
|
|
|
for _, tab := range m.info.TabList {
|
|
var pkg genstruct.GenPackage
|
|
pkg.SetPackage(m.info.PackageName) //package name
|
|
|
|
// tmpl, err := template.New("gen_logic").Funcs(template.FuncMap{"GetStringList": GetStringList}).Parse(genfunc.GetGenBaseTemp())
|
|
// if err != nil {
|
|
// panic(err)
|
|
// }
|
|
// var buf bytes.Buffer
|
|
// tmpl.Execute(&buf, m.info)
|
|
|
|
genOut = append(genOut, GenOutInfo{
|
|
FileName: fmt.Sprintf("gen.%v.go", tab.Name),
|
|
FileCtx: pkg.Generate(),
|
|
})
|
|
}
|
|
|
|
return
|
|
}
|