package admin import ( "fmt" "github.com/druidcaesa/gotool" "html/template" "io/ioutil" "log" "os" "path" "strings" "ulink-admin/frame" "ulink-admin/modules/system/models/dto" req "ulink-admin/modules/system/models/req" "ulink-admin/modules/system/service" "ulink-admin/pkg/file" "ulink-admin/pkg/page" "ulink-admin/utils" "ulink-admin/utils/dataType" ) // CodeApi 代码生成操作api type CodeApi struct { CodeService *service.CodeService `inject:""` MenuService *service.MenuService `inject:""` } // Find 查询数据库表信息列表 func (ctr *CodeApi) FindTable(c *frame.Context) { query := req.TableQuery{} c.ValidteError(c.BindQuery(&query), query) list, i := ctr.CodeService.FindTable(query) c.Ok(page.Page{ Size: query.PageSize, Total: i, List: list, }) } // Find 查询数据库表信息列表 func (ctr *CodeApi) FindOne(c *frame.Context) { query := req.TableQuery{} c.ValidteError(c.BindQuery(&query), query) list, _ := ctr.CodeService.FindTable(query) c.Ok(list[0]) } // Find 查询数据库表信息列表 func (ctr *CodeApi) FindColumn(c *frame.Context) { query := req.ColnumQuery{} c.ValidteError(c.BindQuery(&query), query) list, i := ctr.CodeService.FindColumn(query) c.Ok(page.Page{ Size: query.PageSize, Total: i, List: list, }) } // Generate 生成代码 func (ctr *CodeApi) Generate(c *frame.Context) { codeBody := &req.CodeBody{} c.ValidteError(c.ShouldBindJSON(codeBody), codeBody) //进行数据处理 codeBody.ClassNameUpper = utils.Ucfirst(codeBody.ClassName) codeBody.ClassName = codeBody.ClassNameUpper codeBody.ClassNameLower = strings.ToLower(codeBody.ClassName) codeBody.ClassNameCamel = utils.Lcfirst(codeBody.ClassName) codeBody.Width = 50 + (codeBody.Cols-1)*10 codeBody.IsHaveTree = "0" colors := []string{"#F5F5F5", "#6495ED", " #43CD80", "#FF4040"} //codeBody.PrimaryKey= for index, value := range codeBody.Columns { if codeBody.Columns[index].HtmlType == "treeSelect" { codeBody.IsHaveTree = "1" } if codeBody.Columns[index].HtmlType == "imageUpload" { codeBody.IsHaveImage = "1" } if codeBody.Columns[index].HtmlType == "fileUpload" { codeBody.IsHaveFile = "1" } codeBody.Columns[index].ColumnNameUpper = utils.Ucfirst(utils.Case2Camel(value.ColumnName)) codeBody.Columns[index].ColumnNameLower = utils.Lcfirst(utils.Case2Camel(value.ColumnName)) codeBody.Columns[index].GoType = dataType.TypeConvert(value.DataType) if gotool.StrUtils.HasNotEmpty(codeBody.Columns[index].DictType) { codeBody.Columns[index].Source = "1" } if gotool.StrUtils.HasNotEmpty(codeBody.Columns[index].Menu) { codeBody.Columns[index].Source = "2" //查询引用的父级模块 menu := ctr.MenuService.GetMenuByCon(&req.MenuQuery{Path: codeBody.Columns[index].Menu}) if menu != nil { menu := ctr.MenuService.GetMenuByMenuId(menu.ParentId) if menu.Id > 0 { codeBody.Columns[index].Module = menu.Path } } } keys := "" if gotool.StrUtils.HasNotEmpty(codeBody.Columns[index].Input) { codeBody.Columns[index].Source = "3" ary := strings.Split(codeBody.Columns[index].Input, ",") sourceData := []req.SourceData{} for i, s := range ary { keys = keys + strings.Split(s, "=")[0] + " " code := strings.Split(s, "=")[0] label := strings.Split(s, "=")[1] var color string if i < 4 { color = colors[i] } else { color = colors[1] } sourceData = append(sourceData, req.SourceData{code, label, color}) } codeBody.Columns[index].Keys = keys codeBody.Columns[index].Data = sourceData } } for index, value := range codeBody.SubColumns { codeBody.SubColumns[index].ColumnNameUpper = utils.Ucfirst(utils.Case2Camel(value.ColumnName)) codeBody.SubColumns[index].ColumnNameLower = utils.Lcfirst(utils.Case2Camel(value.ColumnName)) codeBody.SubColumns[index].GoType = dataType.TypeConvert(value.DataType) if gotool.StrUtils.HasNotEmpty(codeBody.SubColumns[index].DictType) { codeBody.SubColumns[index].Source = "1" } if gotool.StrUtils.HasNotEmpty(codeBody.SubColumns[index].Menu) { codeBody.SubColumns[index].Source = "2" } if gotool.StrUtils.HasNotEmpty(codeBody.SubColumns[index].Input) { codeBody.SubColumns[index].Source = "3" ary := strings.Split(codeBody.SubColumns[index].Input, ",") sourceData := []req.SourceData{} for i, s := range ary { code := strings.Split(s, "=")[0] label := strings.Split(s, "=")[1] var color string if i < 4 { color = colors[i] } else { color = colors[1] } sourceData = append(sourceData, req.SourceData{code, label, color}) } codeBody.SubColumns[index].Data = sourceData } } codeBody.Controls = []string{} if codeBody.IsHaveTree == "1" { codeBody.Controls = append(codeBody.Controls, "Treeselect") } if codeBody.IsHaveImage == "1" { codeBody.Controls = append(codeBody.Controls, "ImageUpload") } if codeBody.IsHaveFile == "1" { codeBody.Controls = append(codeBody.Controls, "FileUpload") } //清除目录 dir, _ := ioutil.ReadDir("./temporary/code") for _, d := range dir { os.RemoveAll(path.Join([]string{"./temporary/code", d.Name()}...)) } //生成后端 tpls := [7]dto.TemplateInfo{ dto.TemplateInfo{"model.tpl", "modules/" + codeBody.ModuleName + "/models/model/", utils.Camel2Case(codeBody.ClassNameCamel) + ".go"}, dto.TemplateInfo{"req.tpl", "modules/" + codeBody.ModuleName + "/models/req/", utils.Camel2Case(codeBody.ClassNameCamel) + "_request.go"}, dto.TemplateInfo{"resp.tpl", "modules/" + codeBody.ModuleName + "/models/response/", utils.Camel2Case(codeBody.ClassNameCamel) + "_response.go"}, dto.TemplateInfo{"dao.tpl", "modules/" + codeBody.ModuleName + "/dao/", utils.Camel2Case(codeBody.ClassNameCamel) + "_dao.go"}, dto.TemplateInfo{"service.tpl", "modules/" + codeBody.ModuleName + "/service/", utils.Camel2Case(codeBody.ClassNameCamel) + "_service.go"}, dto.TemplateInfo{"api.tpl", "modules/" + codeBody.ModuleName + "/api/v1/admin/", utils.Camel2Case(codeBody.ClassNameCamel) + "_api.go"}, dto.TemplateInfo{"router.tpl", "modules/" + codeBody.ModuleName + "/router/admin/" + codeBody.ModuleName + "/", utils.Camel2Case(codeBody.ClassNameCamel) + "_router.go"}} genDir := "./temporary/code/go/" tplDir := "./resources/template/code/go/" for _, value := range tpls { t, err := template.New(value.Name).Funcs(template.FuncMap{ "htmlSafe": func(html string) template.HTML { return template.HTML(html) }, "toLower": func(html string) string { return strings.ToLower(html) }, "toUpper": func(html string) string { return utils.Ucfirst(html) }, "isLast": func(i, size int) bool { return i == size-1 }, }).ParseFiles(tplDir + value.Name) if err != nil { fmt.Println("create template failed, err:", err) return } t.Execute(os.Stdout, codeBody) if _, err := os.Stat(genDir + value.Dir); os.IsNotExist(err) { // mkdir 创建目录,mkdirAll 可创建多层级目录 os.MkdirAll(genDir+value.Dir, os.ModePerm) } f, err := os.Create(genDir + value.Dir + value.GenName) if err != nil { log.Println("create file: ", err) return } err = t.Execute(f, codeBody) if err != nil { log.Print("execute: ", err) return } f.Close() } //生成前端 viwTpls := [3]dto.TemplateInfo{ dto.TemplateInfo{"index.tpl", path.Join([]string{"src/views", codeBody.ModuleName, utils.Camel2Middle(codeBody.ClassNameCamel)}...), "index.vue"}, dto.TemplateInfo{"edit.tpl", path.Join([]string{"src/views", codeBody.ModuleName, utils.Camel2Middle(codeBody.ClassNameCamel)}...), codeBody.ClassNameUpper + "Form.vue"}, dto.TemplateInfo{"js.tpl", path.Join([]string{"src/api", codeBody.ModuleName, utils.Camel2Middle(codeBody.ClassNameCamel)}...), "index.ts"}} genDir = "./temporary/code/view/" tplDir = "./resources/template/code/vue3/" for _, value := range viwTpls { //t, err := template.New("index.tpl").Delims("{[", "]}").ParseFiles(tplDir + value.Name) t, err := template.New(value.Name).Delims("{[", "]}").Funcs(template.FuncMap{ "htmlSafe": func(html string) template.HTML { return template.HTML(html) }, "toLower": func(html string) string { return strings.ToLower(html) }, "toMiddle": func(html string) string { return utils.Camel2Middle(html) }, "toUpper": func(html string) string { return utils.Ucfirst(html) }, "isLast": func(i, size int) bool { return i == size-1 }, }).ParseFiles(tplDir + value.Name) if err != nil { fmt.Println("create template failed, err:", err) return } t.Execute(os.Stdout, codeBody) if _, err := os.Stat(genDir + value.Dir); os.IsNotExist(err) { // mkdir 创建目录,mkdirAll 可创建多层级目录 os.MkdirAll(genDir+value.Dir, os.ModePerm) } f, err := os.Create(path.Join([]string{genDir, value.Dir, value.GenName}...)) if err != nil { log.Println("create file: ", err) return } err = t.ExecuteTemplate(f, value.Name, codeBody) if err != nil { log.Print("execute: ", err) return } f.Close() } if codeBody.GenType == 1 { file.Copy(genDir, "yudao-ui/") file.Copy("./temporary/code/go/", "./") file.SearchAndWriteInfConst("./router/admin/router.go", "//初始化"+codeBody.FunctionName+"路由", "a."+utils.Ucfirst(codeBody.ModuleName)+".InitRouter(v1Router)", "//初始化路由结束") } c.Ok() }