master
parent
d292f0c23d
commit
6df063ffcc
21 changed files with 453 additions and 61 deletions
@ -0,0 +1 @@ |
|||||||
|
package core |
@ -0,0 +1,35 @@ |
|||||||
|
package core |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"git.diulo.com/mogfee/kit/mysql/ddl" |
||||||
|
"git.diulo.com/mogfee/kit/stringx" |
||||||
|
"html/template" |
||||||
|
"io" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
func SaveFile(w io.Writer, templateContent string, table *ddl.Table) error { |
||||||
|
tmp, err := template.New("").Funcs(map[string]any{ |
||||||
|
"UpperType": func(str string) string { |
||||||
|
return stringx.Ucfirst(ddl.GoName(str)) |
||||||
|
}, |
||||||
|
"LowerType": func(str string) string { |
||||||
|
if str == "type" { |
||||||
|
str = "vtype" |
||||||
|
} |
||||||
|
return stringx.Lcfirst(ddl.GoName(str)) |
||||||
|
}, |
||||||
|
"UpdateColumn": func(columns []*ddl.TableColumn) string { |
||||||
|
arr := []string{} |
||||||
|
for _, v := range columns { |
||||||
|
arr = append(arr, fmt.Sprintf("%s=?", v.Name)) |
||||||
|
} |
||||||
|
return strings.Join(arr, " and ") |
||||||
|
}, |
||||||
|
}).Parse(templateContent) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
return tmp.Execute(w, table) |
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package core |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"os" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
func VarsFile(savePath string) error { |
||||||
|
saveFileName := fmt.Sprintf("%s/vars.go", strings.TrimRight(savePath, "/")) |
||||||
|
return os.WriteFile(saveFileName, []byte(` |
||||||
|
package model |
||||||
|
|
||||||
|
import ( |
||||||
|
"git.diulo.com/mogfee/kit/errors" |
||||||
|
"gorm.io/gorm" |
||||||
|
) |
||||||
|
|
||||||
|
var ErrNotFound = errors.BadRequest("DB_NOT_FOUND", "数据不存在") |
||||||
|
var ErrIdRequest = errors.BadRequest("DB_ID_REQUIRED", "id不能为空") |
||||||
|
|
||||||
|
func IsErrNotFound(err error) bool { |
||||||
|
return errors.Reason(err) == "DB_NOT_FOUND" |
||||||
|
} |
||||||
|
|
||||||
|
func IsErrIdRequest(err error) bool { |
||||||
|
return errors.Reason(err) == "DB_ID_REQUIRED" |
||||||
|
} |
||||||
|
func findResultWithError[T any](data T, err error) (T, error) { |
||||||
|
switch err { |
||||||
|
case nil: |
||||||
|
return data, nil |
||||||
|
case gorm.ErrRecordNotFound: |
||||||
|
return data, ErrNotFound |
||||||
|
default: |
||||||
|
return data, err |
||||||
|
} |
||||||
|
} |
||||||
|
func GetPage(page int32, size int32) (offset int, pageSize int) { |
||||||
|
if page <= 1 { |
||||||
|
page = 1 |
||||||
|
} |
||||||
|
offset = int((page - 1) * size) |
||||||
|
return offset, int(size) |
||||||
|
} |
||||||
|
|
||||||
|
`), os.ModePerm) |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package model |
||||||
|
|
||||||
|
import "gorm.io/gorm" |
||||||
|
|
||||||
|
type ( |
||||||
|
{{$.Name|UpperType}}Model interface { |
||||||
|
{{$.Name|LowerType}}Model |
||||||
|
} |
||||||
|
custom{{$.Name|UpperType}}Model struct { |
||||||
|
*default{{$.Name|UpperType}}Model |
||||||
|
} |
||||||
|
) |
||||||
|
|
||||||
|
func New{{$.Name|UpperType}}Model(db *gorm.DB) {{$.Name|UpperType}}Model { |
||||||
|
return &custom{{$.Name|UpperType}}Model{ |
||||||
|
default{{$.Name|UpperType}}Model: new{{$.Name|UpperType}}DAO(db), |
||||||
|
} |
||||||
|
} |
@ -1,7 +0,0 @@ |
|||||||
package errors |
|
||||||
|
|
||||||
import ( |
|
||||||
"gorm.io/gorm" |
|
||||||
) |
|
||||||
|
|
||||||
var ErrNotFound = gorm.ErrRecordNotFound |
|
@ -0,0 +1,47 @@ |
|||||||
|
package builder |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"git.diulo.com/mogfee/kit/stringx" |
||||||
|
"reflect" |
||||||
|
"strings" |
||||||
|
) |
||||||
|
|
||||||
|
const dbTag = "db" |
||||||
|
|
||||||
|
func RawFieldNames(in any) []string { |
||||||
|
out := make([]string, 0) |
||||||
|
v := reflect.ValueOf(in) |
||||||
|
if v.Kind() == reflect.Ptr { |
||||||
|
v = v.Elem() |
||||||
|
} |
||||||
|
if v.Kind() != reflect.Struct { |
||||||
|
panic(fmt.Errorf("ToMap only accepts structs; got %T", v)) |
||||||
|
} |
||||||
|
typ := v.Type() |
||||||
|
for i := 0; i < v.NumField(); i++ { |
||||||
|
fi := typ.Field(i) |
||||||
|
if !stringx.IsFirstUpper(fi.Name) { |
||||||
|
continue |
||||||
|
} |
||||||
|
tagv := fi.Tag.Get(dbTag) |
||||||
|
switch tagv { |
||||||
|
case "-": |
||||||
|
continue |
||||||
|
case "": |
||||||
|
out = append(out, fmt.Sprintf("`%s`", fi.Name)) |
||||||
|
default: |
||||||
|
if strings.Contains(tagv, ",") { |
||||||
|
tagv = strings.TrimSpace(strings.Split(tagv, ",")[0]) |
||||||
|
} |
||||||
|
if tagv == "-" { |
||||||
|
continue |
||||||
|
} |
||||||
|
if len(tagv) == 0 { |
||||||
|
tagv = fi.Name |
||||||
|
} |
||||||
|
out = append(out, fmt.Sprintf("`%s`", tagv)) |
||||||
|
} |
||||||
|
} |
||||||
|
return out |
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package builder |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
type AdminUser struct { |
||||||
|
updates map[string]any |
||||||
|
Id int64 `db:"id"` |
||||||
|
CreatedAt time.Time `db:"created_at"` |
||||||
|
UpdatedAt time.Time `db:"updated_at"` |
||||||
|
Status int32 `db:"status"` |
||||||
|
Username string `db:"username"` |
||||||
|
Password string `db:"password"` |
||||||
|
RoleId int64 `db:"role_id"` |
||||||
|
AliasId int32 `db:"alias_id"` |
||||||
|
} |
||||||
|
|
||||||
|
func TestBuild(t *testing.T) { |
||||||
|
fmt.Println(RawFieldNames(AdminUser{})) |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package pathx |
||||||
|
|
||||||
|
import ( |
||||||
|
"os" |
||||||
|
) |
||||||
|
|
||||||
|
func Exists(file string) bool { |
||||||
|
_, err := os.Stat(file) |
||||||
|
if os.IsNotExist(err) { |
||||||
|
return false |
||||||
|
} |
||||||
|
return true |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
package pathx |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
func TestExists(t *testing.T) { |
||||||
|
fmt.Println(Exists("./a.txt")) |
||||||
|
fmt.Println(Exists("./a1.txt")) |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
package stringx |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
func TestIsFirstUpper(t *testing.T) { |
||||||
|
fmt.Println(IsFirstUpper("abc")) |
||||||
|
fmt.Println(IsFirstUpper("Abc")) |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"github.com/spf13/cobra" |
||||||
|
) |
||||||
|
|
||||||
|
func main() { |
||||||
|
Cmd := &cobra.Command{ |
||||||
|
Use: "model", |
||||||
|
} |
||||||
|
mysqlCmd := &cobra.Command{ |
||||||
|
Use: "mysql", |
||||||
|
RunE: func(cmd *cobra.Command, args []string) error { |
||||||
|
fmt.Println("aaa") |
||||||
|
return nil |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
Cmd.AddCommand(mysqlCmd) |
||||||
|
Cmd.Execute() |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
package command |
@ -0,0 +1,11 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import "git.diulo.com/mogfee/kit/tools/model/sql/gen" |
||||||
|
|
||||||
|
func main() { |
||||||
|
filenmae := "/Users/mogfee/web/sendmail_server_new/sendmail.sch.sql" |
||||||
|
err := gen.NewGenerator().StartFromDDL(filenmae, false, true, "sendmail") |
||||||
|
if err != nil { |
||||||
|
panic(err) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package gen |
||||||
|
|
||||||
|
import "git.diulo.com/mogfee/kit/mysql/ddl" |
||||||
|
|
||||||
|
type ( |
||||||
|
defaultGenerator struct { |
||||||
|
dir string |
||||||
|
pkg string |
||||||
|
ignoreColumns []string |
||||||
|
} |
||||||
|
code struct { |
||||||
|
importsCode string |
||||||
|
varsCode string |
||||||
|
typesCode string |
||||||
|
newCode string |
||||||
|
insertCode string |
||||||
|
findCode string |
||||||
|
updateCode string |
||||||
|
deleteCode string |
||||||
|
cacheExtra string |
||||||
|
tableName string |
||||||
|
} |
||||||
|
codeTuple struct { |
||||||
|
modelCode string |
||||||
|
modelCustomCode string |
||||||
|
} |
||||||
|
) |
||||||
|
|
||||||
|
func NewGenerator() *defaultGenerator { |
||||||
|
return &defaultGenerator{} |
||||||
|
} |
||||||
|
|
||||||
|
func (g *defaultGenerator) StartFromDDL(filename string, withCache, strict bool, database string) error { |
||||||
|
modelList, err := g.genFromDDL(filename, withCache, strict, database) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
return g.createFile(modelList) |
||||||
|
} |
||||||
|
|
||||||
|
func (g *defaultGenerator) genFromDDL(filename string, cache bool, strict bool, database string) ( |
||||||
|
map[string]*codeTuple, error) { |
||||||
|
m := make(map[string]*codeTuple) |
||||||
|
err := ddl.Parser(filename, func(table *ddl.Table) error { |
||||||
|
code, err := g.genModel(e, cache) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
}) |
||||||
|
return m, err |
||||||
|
} |
@ -0,0 +1,71 @@ |
|||||||
|
package parser |
||||||
|
|
||||||
|
import ( |
||||||
|
"git.diulo.com/mogfee/kit/mysql/ddl" |
||||||
|
) |
||||||
|
|
||||||
|
const timeImport = "time.Time" |
||||||
|
|
||||||
|
type ( |
||||||
|
Table struct { |
||||||
|
Name string |
||||||
|
Db string |
||||||
|
PrimaryKey Primary |
||||||
|
UniqueIndex map[string][]*Field |
||||||
|
Fields []*Field |
||||||
|
} |
||||||
|
Primary struct { |
||||||
|
Field |
||||||
|
AutoIncrement bool |
||||||
|
} |
||||||
|
Field struct { |
||||||
|
NameOriginal string |
||||||
|
Name string |
||||||
|
DateType string |
||||||
|
Comment string |
||||||
|
SeqInIndex int |
||||||
|
OrdinalPosition int |
||||||
|
ContainsPQ bool |
||||||
|
} |
||||||
|
KeyType int |
||||||
|
) |
||||||
|
|
||||||
|
func parseNameOriginal(ts []*ddl.Table) (nameOriginals [][]string) { |
||||||
|
var columns []string |
||||||
|
for _, t := range ts { |
||||||
|
columns = []string{} |
||||||
|
for _, c := range t.Columns { |
||||||
|
columns = append(columns, c.Name) |
||||||
|
} |
||||||
|
nameOriginals = append(nameOriginals, columns) |
||||||
|
} |
||||||
|
return nameOriginals |
||||||
|
} |
||||||
|
|
||||||
|
func Parse(filename, database string, strict bool) ([]*Table, error) { |
||||||
|
list := make([]*Table, 0) |
||||||
|
err := ddl.Parser(filename, func(table *ddl.Table) error { |
||||||
|
|
||||||
|
list = append(list, &Table{ |
||||||
|
Name: table.Name, |
||||||
|
Db: "", |
||||||
|
PrimaryKey: Primary{ |
||||||
|
Field: Field{ |
||||||
|
NameOriginal: "", |
||||||
|
Name: "", |
||||||
|
DateType: "", |
||||||
|
Comment: "", |
||||||
|
SeqInIndex: 0, |
||||||
|
OrdinalPosition: 0, |
||||||
|
ContainsPQ: false, |
||||||
|
}, |
||||||
|
AutoIncrement: false, |
||||||
|
}, |
||||||
|
UniqueIndex: nil, |
||||||
|
Fields: nil, |
||||||
|
}) |
||||||
|
|
||||||
|
return nil |
||||||
|
}) |
||||||
|
return list, err |
||||||
|
} |
Loading…
Reference in new issue