123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- 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()
- }
|