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