From 5230c6f2429b397fc6d1fec5b2c8d5011a0359ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E5=B0=8F=E5=86=9B?= <346944475@qq.com> Date: Tue, 21 Jan 2020 22:31:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ui=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/config/MyIni.go | 4 + data/dlg/common.go | 38 +++++++- data/dlg/cui.go | 141 +++++++++++++++++++++++---- data/dlg/def.go | 7 ++ data/dlg/i18n.go | 17 ++-- data/view/genstruct/common.go | 46 +++++++++ data/view/gtools/commont.go | 12 --- data/view/gtools/gtools.go | 7 +- data/view/model/def.go | 4 +- data/view/model/genmysql/common.go | 13 ++- data/view/model/genmysql/genmysql.go | 8 +- data/view/model/model.go | 43 +++++--- 12 files changed, 277 insertions(+), 63 deletions(-) delete mode 100644 data/view/gtools/commont.go diff --git a/data/config/MyIni.go b/data/config/MyIni.go index f95b17c..80bd871 100644 --- a/data/config/MyIni.go +++ b/data/config/MyIni.go @@ -60,6 +60,10 @@ func SetOutDir(outDir string) { // GetOutDir Get Output Directory.获取输出目录 func GetOutDir() string { + if len(_map.OutDir) == 0 { + _map.OutDir = "./model" + } + return _map.OutDir } diff --git a/data/dlg/common.go b/data/dlg/common.go index 7ebc1e7..c8ed5be 100644 --- a/data/dlg/common.go +++ b/data/dlg/common.go @@ -1,6 +1,16 @@ package dlg -import "github.com/jroimartin/gocui" +import ( + "os/exec" + + "github.com/jroimartin/gocui" + "github.com/xxjwxc/gormt/data/view/model" + "github.com/xxjwxc/gormt/data/view/model/genmysql" + + "github.com/xxjwxc/gormt/data/config" + + "github.com/xxjwxc/public/tools" +) func division(a int, b float32) int { r := float32(a) / b @@ -60,3 +70,29 @@ func getBool(bstr string) bool { return false } + +func generate(g *gocui.Gui, v *gocui.View) { + modeldb := genmysql.GetMysqlModel() + pkg := modeldb.GenModel() + // just for test + // out, _ := json.Marshal(pkg) + // tools.WriteFile("test.txt", []string{string(out)}, true) + + list, mo := model.Generate(pkg) + + addlog(g, "\n \033[32;7m 开 始 : begin \033[0m\n") + + for _, v := range list { + path := config.GetOutDir() + "/" + v.FileName + tools.WriteFile(path, []string{v.FileCtx}, true) + + addlog(g, " formatting differs from goimport's:") + cmd, _ := exec.Command("goimports", "-l", "-w", path).Output() + addlog(g, " "+string(cmd)) + } + + addlog(g, "\033[32;7m 所 有 已 完 成 : ALL completed!! \033[0m\n") + // build item + gPkg = mo.GetPackage() + buildList(g, v) +} diff --git a/data/dlg/cui.go b/data/dlg/cui.go index db2bc3d..1595869 100644 --- a/data/dlg/cui.go +++ b/data/dlg/cui.go @@ -17,10 +17,6 @@ func nextView(g *gocui.Gui, v *gocui.View) error { nextIndex := (mainIndex + 1) % len(mainViewArr) name := mainViewArr[nextIndex] - err := setlog(g, "Going from view "+v.Name()+" to "+name) - if err != nil { - return err - } if _, err := g.SetCurrentView(name); err != nil { // 设置选中 return err } @@ -29,14 +25,14 @@ func nextView(g *gocui.Gui, v *gocui.View) error { switch name { case _menuDefine: - g.Cursor = false // 光标 + //g.Cursor = false // 光标 // g.FgColor = gocui.ColorGreen menuDlg.btnList[menuDlg.active].Focus() case _listDefine: - g.Cursor = false + //g.Cursor = false menuDlg.btnList[menuDlg.active].UnFocus() case _viewDefine: - g.Cursor = true + //g.Cursor = true menuDlg.btnList[menuDlg.active].UnFocus() } @@ -71,11 +67,14 @@ func mainLayout(g *gocui.Gui) error { return err } v.Title = SLocalize(_listDefine) - v.Wrap = true - v.Autoscroll = true - if _, err := g.SetCurrentView(_menuDefine); err != nil { - return err - } + // v.Wrap = true + // v.Autoscroll = true + v.Highlight = true + v.SelBgColor = gocui.ColorGreen + v.SelFgColor = gocui.ColorBlack + // if _, err := g.SetCurrentView(_menuDefine); err != nil { + // return err + // } } if v, err := g.SetView(_viewDefine, division(maxX, uiPart[0]), 1, maxX-1, maxY-1); err != nil { @@ -115,15 +114,28 @@ func keybindings(g *gocui.Gui) { if err := g.SetKeybinding("", gocui.KeyTab, gocui.ModNone, nextView); err != nil { // tab next事件 log.Panicln(err) } + if err := g.SetKeybinding("", gocui.KeyEsc, gocui.ModNone, buttonCancel); err != nil { + log.Panicln(err) + } + if err := g.SetKeybinding("", gocui.KeyCtrlQ, gocui.ModNone, buttonCancel); err != nil { + log.Panicln(err) + } if err := g.SetKeybinding("main_title", gocui.MouseLeft, gocui.ModNone, about); err != nil { log.Panicln(err) } - // if err := g.SetKeybinding(_run, gocui.MouseLeft, gocui.ModNone, about); err != nil { - // log.Panicln(err) - // } - // if err := g.SetKeybinding(_set, gocui.MouseLeft, gocui.ModNone, about); err != nil { - // log.Panicln(err) - // } + if err := g.SetKeybinding(_listDefine, gocui.KeyArrowDown, gocui.ModNone, listDown); err != nil { + log.Panicln(err) + } + if err := g.SetKeybinding(_listDefine, gocui.KeyArrowUp, gocui.ModNone, listUp); err != nil { + log.Panicln(err) + } + if err := g.SetKeybinding(_listDefine, gocui.KeyEnter, gocui.ModNone, showStruct); err != nil { + log.Panicln(err) + } + if err := g.SetKeybinding(_listDefine, gocui.MouseLeft, gocui.ModNone, showStruct); err != nil { + log.Panicln(err) + } + } ///////////////////signal slot /////////// @@ -142,8 +154,18 @@ func setlog(g *gocui.Gui, str string) error { return err } +func addlog(g *gocui.Gui, str string) error { + logView, err := g.View(_viewDefine) + if err == nil { + fmt.Fprintln(logView, str) + } + + return err +} + func enterRun(g *gocui.Gui, v *gocui.View) error { setlog(g, "run .... ing") + generate(g, v) return nil } @@ -181,6 +203,8 @@ func enterSet(g *gocui.Gui, v *gocui.View) error { AddOptions(SLocalize("true"), SLocalize("false")).SetSelected(SLocalize(tools.AsString(config.GetIsOutFunc()))) form.AddSelect("is_foreign_key", SLocalize("is_foreign_key"), formPart[0], formPart[2]). AddOptions(SLocalize("true"), SLocalize("false")).SetSelected(SLocalize(tools.AsString(config.GetIsForeignKey()))) + form.AddSelect("is_gui", SLocalize("is_gui"), formPart[0], formPart[2]). + AddOptions(SLocalize("true"), SLocalize("false")).SetSelected(SLocalize(tools.AsString(config.GetIsGUI()))) form.AddSelect("url_tag", SLocalize("url_tag"), formPart[0], formPart[2]). AddOptions("json", "url").SetSelected(tools.AsString(config.GetURLTag())) form.AddSelect("db_tag", SLocalize("db_tag"), formPart[0], formPart[2]). @@ -209,7 +233,7 @@ func buttonCancel(g *gocui.Gui, v *gocui.View) error { } func buttonSave(g *gocui.Gui, v *gocui.View) error { - + maxX, _ := g.Size() mp := form.GetFieldTexts() config.SetOutDir(mp["out_dir"]) @@ -217,7 +241,8 @@ func buttonSave(g *gocui.Gui, v *gocui.View) error { dbInfo.Host = mp["db_host"] port, err := strconv.Atoi(mp["db_port"]) if err != nil { - modal := mycui.NewModal(g, 0, 0, 30).SetText("port error") + modal := mycui.NewModal(g, division(maxX, uiPart[0])+5, 10, division(maxX, uiPart[0])+35).SetTextColor(gocui.ColorRed).SetText("port error") + // modal.SetBgColor(gocui.ColorRed) modal.AddButton("ok", "OK", gocui.KeyEnter, func(g *gocui.Gui, v *gocui.View) error { modal.Close() form.SetCurrentItem(form.GetCurrentItem()) @@ -241,12 +266,86 @@ func buttonSave(g *gocui.Gui, v *gocui.View) error { config.SetIsOutSQL(getBool(mp["is_out_sql"])) config.SetIsOutFunc(getBool(mp["is_out_func"])) config.SetForeignKey(getBool(mp["is_foreign_key"])) + config.SetIsGUI(getBool(mp["is_gui"])) config.SetURLTag(mp["url_tag"]) config.SetDBTag(mp["db_tag"]) config.SetLG(mp["language"]) config.SaveToFile() - buttonCancel(g, v) + modal := mycui.NewModal(g, division(maxX, uiPart[0])+5, 10, division(maxX, uiPart[0])+35).SetText("save success") + modal.AddButton("ok", "OK", gocui.KeyEnter, func(g *gocui.Gui, v *gocui.View) error { + modal.Close() + buttonCancel(g, v) + return nil + }) + modal.Draw() + + return nil +} + +func buildList(g *gocui.Gui, v *gocui.View) error { + listView, err := g.View(_listDefine) + if err != nil { + panic(err) + } + + listView.Clear() + for _, info := range gPkg.Structs { + fmt.Fprintln(listView, info.Name) + } + + return nil +} + +func showStruct(g *gocui.Gui, v *gocui.View) error { + var l string + var err error + + _, cy := v.Cursor() + if l, err = v.Line(cy); err != nil { + l = "" + } + + var out []string + for _, v := range gPkg.Structs { + if v.Name == l { + out = v.GeneratesColor() + break + } + } + + setlog(g, "") + for _, v := range out { + addlog(g, v) + } + return nil +} + +func listDown(g *gocui.Gui, v *gocui.View) error { + if v != nil { + cx, cy := v.Cursor() + if cy < len(gPkg.Structs)-1 { + if err := v.SetCursor(cx, cy+1); err != nil { + ox, oy := v.Origin() + if err := v.SetOrigin(ox, oy+1); err != nil { + return err + } + } + } + } + return nil +} + +func listUp(g *gocui.Gui, v *gocui.View) error { + if v != nil { + ox, oy := v.Origin() + cx, cy := v.Cursor() + if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 { + if err := v.SetOrigin(ox, oy-1); err != nil { + return err + } + } + } return nil } diff --git a/data/dlg/def.go b/data/dlg/def.go index 1a76ef2..9329e87 100644 --- a/data/dlg/def.go +++ b/data/dlg/def.go @@ -1,6 +1,7 @@ package dlg import ( + "github.com/xxjwxc/gormt/data/view/genstruct" "github.com/xxjwxc/public/mycui" ) @@ -27,5 +28,11 @@ type menuDetails struct { btnList []*mycui.Button } +type listDetails struct { + active int + btnList []*mycui.Button +} + var menuDlg *menuDetails var form *mycui.Form +var gPkg genstruct.GenPackage diff --git a/data/dlg/i18n.go b/data/dlg/i18n.go index e65e70e..4d534d7 100644 --- a/data/dlg/i18n.go +++ b/data/dlg/i18n.go @@ -19,9 +19,6 @@ func init() { func getLG() string { tag := config.GetLG() - // if len(tag) == 0 { - // return tools.GetLocalSystemLang(true) - // } if tag == "English" { return "en" } @@ -86,6 +83,9 @@ func addChinese() error { }, &i18n.Message{ ID: "is_foreign_key", Other: " 导 出 外 键 :", + }, &i18n.Message{ + ID: "is_gui", + Other: " 界 面 模 式 :", }, &i18n.Message{ ID: "url_tag", Other: " web 标 签:", @@ -112,10 +112,10 @@ func addChinese() error { Other: " 关 于 作 者", }, &i18n.Message{ ID: "log_run", - Other: " Enter : 执 行 \n ↑ ↓: 本 视 图 选 择 \n Tab : 多 视 图 切 换 \n 支 持 鼠 标 操 作 方 式 \n \n \033[33;7m 输 入 Enter 直 接 执 行 \033[0m\n ", + Other: " Enter : 执 行 \n ↑ ↓: 本 视 图 选 择 \n Tab : 多 视 图 切 换 \n Ctrl+C : 退 出 应 用 \n Ctrl+Q : 退 出 对 话 框 \n 支 持 鼠 标 操 作 方 式 \n \n \033[33;7m 输 入 Enter 直 接 执 行 \033[0m\n ", }, &i18n.Message{ ID: "log_set", - Other: " Enter : 执 行 \n ↑ ↓: 本 视 图 选 择 \n Tab : 多 视 图 切 换 \n 支 持 鼠 标 操 作 方 式 \n \n \033[33;7m 输 入 Enter 打 开 设 置 窗 口 \033[0m\n ", + Other: " Enter : 执 行 \n ↑ ↓: 本 视 图 选 择 \n Tab : 多 视 图 切 换\n Ctrl+C : 退 出 应 用 \n Ctrl+Q : 退 出 对 话 框 \n 支 持 鼠 标 操 作 方 式 \n \n \033[33;7m 输 入 Enter 打 开 设 置 窗 口 \033[0m\n ", }) } @@ -171,6 +171,9 @@ func addEnglish() error { }, &i18n.Message{ ID: "is_foreign_key", Other: "is foreign key:", + }, &i18n.Message{ + ID: "is_gui", + Other: "is show gui:", }, &i18n.Message{ ID: "url_tag", Other: "url tag:", @@ -197,9 +200,9 @@ func addEnglish() error { Other: "About", }, &i18n.Message{ ID: "log_run", - Other: " Enter : run \n ↑ ↓: Selection of this view \n Tab : Multi view switching \n Mouse operation supported \n \n \033[33;7m Enter to execute \033[0m", + Other: " Enter : run \n ↑ ↓: Selection of this view \n Tab : Multi view switching \n Ctrl+C : quit; \n Ctrl+Q : backup \n Mouse operation supported \n \n \033[33;7m Enter to execute \033[0m", }, &i18n.Message{ ID: "log_set", - Other: " Enter : run \n ↑ ↓: Selection of this view \n Tab : Multi view switching \n Mouse operation supported \n \n \033[33;7m Enter enter to open the settings window \033[0m", + Other: " Enter : run \n ↑ ↓: Selection of this view \n Tab : Multi view switching \n Ctrl+C : quit \n Ctrl+Q : backup \n Mouse operation supported \n \n \033[33;7m Enter enter to open the settings window \033[0m", }) } diff --git a/data/view/genstruct/common.go b/data/view/genstruct/common.go index a655c41..e62c77b 100644 --- a/data/view/genstruct/common.go +++ b/data/view/genstruct/common.go @@ -60,6 +60,33 @@ func (e *GenElement) Generate() string { return p.Generates()[0] } +// GenerateColor Get the result data.获取结果数据 +func (e *GenElement) GenerateColor() string { + tag := "" + if e.Tags != nil { + var ks []string + for k := range e.Tags { + ks = append(ks, k) + } + sort.Strings(ks) + + var tags []string + for _, v := range ks { + tags = append(tags, fmt.Sprintf(`%v:"%v"`, v, strings.Join(e.Tags[v], ";"))) + } + tag = fmt.Sprintf("`%v`", strings.Join(tags, " ")) + } + + var p generate.PrintAtom + if len(e.Notes) > 0 { + p.Add(e.Name, "\033[32;1m "+e.Type+" \033[0m", "\033[31;1m "+tag+" \033[0m", "\033[32;1m // "+e.Notes+" \033[0m") + } else { + p.Add(e.Name, "\033[32;1m "+e.Type+" \033[0m", "\033[31;1m "+tag+" \033[0m") + } + + return p.Generates()[0] +} + ////////////////////////////////////////////////////////////////////////////// // struct ////////////////////////////////////////////////////////////////////////////// @@ -116,6 +143,25 @@ func (s *GenStruct) Generates() []string { return p.Generates() } +// \033[3%d;%dm -%d;%d-colors!\033[0m\n +// GeneratesColor Get the result data on color.获取结果数据 带颜色 +func (s *GenStruct) GeneratesColor() []string { + var p generate.PrintAtom + if config.GetIsOutSQL() { + p.Add("\033[32;1m /******sql******\033[0m") + p.Add(s.SQLBuildStr) + p.Add("\033[32;1m ******sql******/ \033[0m") + } + p.Add("\033[32;1m " + s.Notes + " \033[0m") + p.Add("\033[34;1m type \033[0m", s.Name, "\033[34;1m struct \033[0m {") + for _, v := range s.Em { + p.Add(" \t\t" + v.GenerateColor()) + } + p.Add(" }") + + return p.Generates() +} + ////////////////////////////////////////////////////////////////////////////// // package ////////////////////////////////////////////////////////////////////////////// diff --git a/data/view/gtools/commont.go b/data/view/gtools/commont.go deleted file mode 100644 index ab1e2d9..0000000 --- a/data/view/gtools/commont.go +++ /dev/null @@ -1,12 +0,0 @@ -package gtools - -import ( - "github.com/xxjwxc/gormt/data/view/model" - "github.com/xxjwxc/gormt/data/view/model/genmysql" -) - -// GetMysqlModel get model interface. 获取model接口 -func GetMysqlModel() model.IModel { - //now just support mysql - return &genmysql.MySQLModel -} diff --git a/data/view/gtools/gtools.go b/data/view/gtools/gtools.go index 5906d0b..f516c79 100644 --- a/data/view/gtools/gtools.go +++ b/data/view/gtools/gtools.go @@ -9,6 +9,7 @@ import ( "github.com/xxjwxc/gormt/data/config" + "github.com/xxjwxc/gormt/data/view/model/genmysql" "github.com/xxjwxc/public/tools" ) @@ -19,7 +20,6 @@ func Execute() { } else { showCmd() } - } func showCmd() { @@ -27,14 +27,13 @@ func showCmd() { // tt.Nickname = "ticket_001" // orm.Where("nickname = ?", "ticket_001").Find(&tt) // fmt.Println(tt) - - modeldb := GetMysqlModel() + modeldb := genmysql.GetMysqlModel() pkg := modeldb.GenModel() // just for test // out, _ := json.Marshal(pkg) // tools.WriteFile("test.txt", []string{string(out)}, true) - list := model.Generate(pkg) + list, _ := model.Generate(pkg) for _, v := range list { path := config.GetOutDir() + "/" + v.FileName diff --git a/data/view/model/def.go b/data/view/model/def.go index 9cab006..bec383b 100644 --- a/data/view/model/def.go +++ b/data/view/model/def.go @@ -1,8 +1,8 @@ package model const ( - _tagGorm = "gorm" - _tagJSON = "json" +// _tagGorm = "gorm" +// _tagJSON = "json" ) // ColumusKey Columus type elem. 类型枚举 diff --git a/data/view/model/genmysql/common.go b/data/view/model/genmysql/common.go index a15a62a..965c9af 100644 --- a/data/view/model/genmysql/common.go +++ b/data/view/model/genmysql/common.go @@ -3,13 +3,18 @@ package genmysql import ( "strings" + "github.com/xxjwxc/gormt/data/config" + "github.com/xxjwxc/gormt/data/view/model" ) // filterModel filter.过滤 gorm.Model func filterModel(list *[]genColumns) bool { - var _temp []genColumns + if config.GetDBTag() != "gorm" { + return false + } + var _temp []genColumns num := 0 for _, v := range *list { if strings.EqualFold(v.Field, "id") || @@ -41,3 +46,9 @@ func fixForeignKey(list []genForeignKey, columuName string, result *[]model.Fore } } } + +// GetMysqlModel get model interface. 获取model接口 +func GetMysqlModel() model.IModel { + //now just support mysql + return &MySQLModel +} diff --git a/data/view/model/genmysql/genmysql.go b/data/view/model/genmysql/genmysql.go index 513c396..af06019 100644 --- a/data/view/model/genmysql/genmysql.go +++ b/data/view/model/genmysql/genmysql.go @@ -169,7 +169,9 @@ func getTables(orm *mysqldb.MySqlDB) map[string]string { rows, err := orm.Raw("show tables").Rows() if err != nil { - fmt.Println(err) + if !config.GetIsGUI() { + fmt.Println(err) + } return tbDesc } @@ -184,7 +186,9 @@ func getTables(orm *mysqldb.MySqlDB) map[string]string { // Get table annotations.获取表注释 rows1, err := orm.Raw("SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES WHERE table_schema= '" + config.GetMysqlDbInfo().Database + "'").Rows() if err != nil { - fmt.Println(err) + if !config.GetIsGUI() { + fmt.Println(err) + } return tbDesc } diff --git a/data/view/model/model.go b/data/view/model/model.go index 638c4ba..4feb843 100644 --- a/data/view/model/model.go +++ b/data/view/model/model.go @@ -17,11 +17,12 @@ import ( type _Model struct { info DBInfo + pkg *genstruct.GenPackage } // Generate build code string.生成代码 -func Generate(info DBInfo) (out []GenOutInfo) { - m := _Model{ +func Generate(info DBInfo) (out []GenOutInfo, m _Model) { + m = _Model{ info: info, } @@ -40,23 +41,36 @@ func Generate(info DBInfo) (out []GenOutInfo) { 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) +// GetPackage gen sturct on table +func (m *_Model) GetPackage() genstruct.GenPackage { + if m.pkg == nil { + 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) + } + m.pkg = &pkg } - return pkg.Generate() + return *m.pkg +} + +func (m *_Model) generate() string { + m.pkg = nil + m.GetPackage() + return m.pkg.Generate() } // genTableElement Get table columns and comments.获取表列及注释 func (m *_Model) genTableElement(cols []ColumusInfo) (el []genstruct.GenElement) { + _tagGorm := config.GetDBTag() + _tagJSON := config.GetURLTag() + for _, v := range cols { var tmp genstruct.GenElement if strings.EqualFold(v.Type, "gorm.Model") { // gorm model @@ -115,6 +129,9 @@ func (m *_Model) genTableElement(cols []ColumusInfo) (el []genstruct.GenElement) // genForeignKey Get information about foreign key of table column.获取表列外键相关信息 func (m *_Model) genForeignKey(col ColumusInfo) (fklist []genstruct.GenElement) { + _tagGorm := config.GetDBTag() + _tagJSON := config.GetURLTag() + for _, v := range col.ForeignKeyList { isMulti, isFind, notes := m.getColumusKeyMulti(v.TableName, v.ColumnName) if isFind {