| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- package util
- import (
- "bufio"
- "fmt"
- "os"
- "strings"
- "xorm.io/xorm"
- )
- // const base_url = "E:\\project\\kkc\\kkc-go\\"
- const base_url = "D:\\project\\study\\kkc\\kkc-go\\"
- type MTable struct {
- Name string
- AaBbName string
- aaBbName string
- Comment string
- existId bool
- MColumns []MColumn
- }
- type MColumn struct {
- Name string //aa_bb
- AaBbName string
- aaBbName string
- Comment string
- SqlTypeName string
- TypeName string
- Length int64
- Length2 int64
- IsKey bool
- }
- 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.AaBbName, receiver.aaBbName, receiver.Comment, receiver.SqlTypeName, receiver.TypeName, receiver.Length, receiver.Length2)
- }
- var MTables = make([]MTable, 0)
- // InitMTableArray 初始化加载数据库结构并存储
- func InitMTableArray(engine *xorm.Engine) {
- metas, err := engine.DBMetas()
- if err != nil {
- fmt.Println(err)
- }
- for _, meta := range metas {
- var mTable MTable
- mTable.Name = meta.Name
- mTable.AaBbName, mTable.aaBbName = formatName(meta.Name)
- mTable.Comment = meta.Comment
- var cols = meta.Columns()
- for i := range cols {
- var mColumn MColumn
- mColumn.Name = cols[i].Name
- mColumn.AaBbName, mColumn.aaBbName = 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.Length = cols[i].Length
- mColumn.Length2 = cols[i].Length2
- mTable.MColumns = append(mTable.MColumns, mColumn)
- }
- MTables = append(MTables, mTable)
- fmt.Println(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
- }
- }
- // 修改mysql数据库对应的go类型
- func formatSqlType(str string) string {
- str = strings.ToLower(str)
- switch str {
- case "varchar":
- return "string"
- case "int":
- return "int"
- case "decimal":
- return "float64"
- case "datetime":
- return "time.Time"
- case "longblob":
- return "string"
- default:
- panic("未定义的类型:" + str)
- }
- }
- //----------------------------------------------------------
- // MysqlToStruct 根据mysql 生成对应的struct及String函数
- func MysqlToStruct(engine *xorm.Engine) {
- InitMTableArray(engine)
- var structString = ""
- for _, mtable := range MTables {
- structString += fmt.Sprint("//", mtable.AaBbName, " ", mtable.Comment, "\n",
- "type ", mtable.AaBbName, " struct {\n")
- cols := mtable.MColumns
- var toString = ""
- for i := range cols {
- if cols[i].aaBbName == "id" && cols[i].IsKey {
- structString += fmt.Sprint(" ", cols[i].AaBbName, " ", cols[i].TypeName, " `json:\"", cols[i].aaBbName, "\"`",
- "// ", cols[i].Length, " ", cols[i].Length2, " 注释:", cols[i].Comment, "\n")
- toString += fmt.Sprint(cols[i].AaBbName, ":\", receiver.", cols[i].AaBbName, ", \",")
- } else {
- structString += fmt.Sprint(" ", cols[i].AaBbName, " ", cols[i].TypeName, " `xorm:\"", cols[i].Name, "\" json:\"", cols[i].aaBbName, "\"`",
- "// ", cols[i].Length, " ", cols[i].Length2, " 注释:", cols[i].Comment, "\n")
- toString += fmt.Sprint(cols[i].AaBbName, ":\", receiver.", cols[i].AaBbName, ", \",")
- }
- }
- structString += "}\n\n"
- structString += fmt.Sprint("func (receiver ", mtable.AaBbName, ") String() string {\n")
- structString += fmt.Sprint(" return fmt.Sprint(\"", mtable.AaBbName, "{", toString[0:len(toString)-1], "}\")\n}\n\n")
- fmt.Println(structString)
- }
- fileUrl := base_url + "\\data\\domain\\DoMain.go"
- //清空文件
- os.Truncate(fileUrl, 0)
- file, _ := os.OpenFile(fileUrl, os.O_CREATE|os.O_RDWR, 0666)
- defer file.Close()
- writer := bufio.NewWriter(file)
- writer.WriteString("package domain\n\nimport (\n \"fmt\"\n \"time\"\n)\n\n")
- writer.WriteString(structString)
- writer.Flush()
- //file.Write([]byte("package domain\n\nimport \"time\"\n"))
- //file.Write([]byte(structString))
- }
- // MysqlToDao 生成简单的CRUD dao层
- func MysqlToDao(engine *xorm.Engine) {
- InitMTableArray(engine)
- var baseUrl = base_url + "data\\dao\\manage\\"
- tables := MTables
- for _, table := range tables {
- var dao = ""
- fileName := table.AaBbName + "Dao.go"
- dao += "package manage\n\nimport (\n\t\"demo/configs\"\n\t\"demo/data/domain\"\n\t\"demo/data/domain/vo\"\n)\n"
- //get
- if table.Name == "role_authority" {
- fmt.Println(table.existId, "====================>")
- }
- var idColumn MColumn
- for _, column := range table.MColumns {
- if column.IsKey {
- idColumn = column
- break
- }
- }
- //没有id的不适用
- if table.existId {
- dao += "func GetById" + table.AaBbName + "(id int) (domain." + table.AaBbName + ", error) {" +
- "\n\tvar " + table.aaBbName + " domain." + table.AaBbName + "" +
- "\n\t_, err := configs.Engine.Where(\"id = ?\", id).Get(&" + table.aaBbName + ")" +
- "\n\tif err != nil {" +
- "\n\t\treturn " + table.aaBbName + ", err" +
- "\n\t}" +
- "\n\treturn " + table.aaBbName + ", nil" +
- "\n}\n\n"
- }
- dao += "func GetInIdList" + table.AaBbName + "(ids []int) ([]domain." + table.AaBbName + ", error) {" +
- "\n\trows, err := configs.Engine.In(\"id\", ids).Rows(&domain." + table.AaBbName + "{})" +
- "\n\tif err != nil {" +
- "\n\t\treturn make([]domain." + table.AaBbName + ", 0), err" +
- "\n\t}" +
- "\n\tdefer rows.Close()" +
- "\n\tvar list []domain." + table.AaBbName + "" +
- "\n\tfor rows.Next() {" +
- "\n\t\tvar u domain." + table.AaBbName + "" +
- "\n\t\tlist = append(list, u)" +
- "\n\t}" +
- "\n\treturn list, nil" +
- "\n}\n\n"
- //list
- dao += "func GetList" + table.AaBbName + "(" + table.aaBbName + " domain." + table.AaBbName + ", pageNum, pageSize int) (vo.BaseListVo, error) {" +
- "\n\tvar arr []domain." + table.AaBbName +
- "\n\tCount, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc(\"id\").FindAndCount(&arr, &" + table.aaBbName + ")" +
- "\n\tvar vo vo.BaseListVo" +
- "\n\tif err != nil {" +
- "\n\t\treturn vo, err" +
- "\n\t}" +
- "\n\tif err != nil {" +
- "\n\t\treturn vo, err" +
- "\n\t}" +
- "\n\tvo.PageNum = pageNum" +
- "\n\tvo.PageSize = pageSize" +
- "\n\tvo.List = make([]any, len(arr))" +
- "\n\tfor i, v := range arr {" +
- "\n\t\tvo.List[i] = v" +
- "\n\t}" +
- "\n\tvo.Total = int(Count)" +
- "\n\treturn vo, nil" +
- "\n}\n\n"
- dao += "func Save" + table.AaBbName + "(" + table.aaBbName + " *domain." + table.AaBbName + ") (domain." + table.AaBbName + ", error) {" +
- "\n\t_, err := configs.Engine.Insert(&" + table.aaBbName + ")" +
- "\n\tif err != nil {" +
- "\n\t\treturn *" + table.aaBbName + ", err" +
- "\n\t}" +
- "\n\treturn *" + table.aaBbName + ", nil" +
- "\n}\n\n"
- dao += "func Set" + table.AaBbName + "(" + table.aaBbName + "Map map[string]interface{}, id int) (domain." + table.AaBbName + ", bool, error) {" +
- "\n\tvar " + table.aaBbName + " domain." + table.AaBbName + "" +
- "\n\t_, err := configs.Engine.Table(\"" + table.Name + "\").Where(\"" + idColumn.Name + " = ?\", id).Update(" + table.aaBbName + "Map)" +
- "\n\tif err != nil {" +
- "\n\t\treturn " + table.aaBbName + ", false, err" +
- "\n\t}" +
- "\n\treturn " + table.aaBbName + ", true, nil" +
- "\n}\n\n"
- if table.existId {
- dao += "func Delete" + table.AaBbName + "(" + table.aaBbName + " domain." + table.AaBbName + ") bool {" +
- "\n\ti, err := configs.Engine.Where(\"id = ?\", " + table.aaBbName + ".Id).Delete(&" + table.aaBbName + ")" +
- "\n\tif err != nil {" +
- "\n\t\treturn false" +
- "\n\t}" +
- "\n\treturn i > 0" +
- "\n}"
- }
- //创建文件
- url := baseUrl + fileName
- os.Truncate(url, 0)
- file, _ := os.OpenFile(url, os.O_CREATE|os.O_RDWR, 0666)
- writer := bufio.NewWriter(file)
- writer.WriteString(dao)
- writer.Flush()
- file.Close()
- }
- }
|