@@ -3,148 +3,115 @@ package service
33import (
44 "gin-vue-admin/model"
55 "gin-vue-admin/utils"
6+ "io/ioutil"
67 "os"
8+ "strings"
79 "text/template"
810)
911
12+ type tplData struct {
13+ template * template.Template
14+ locationPath string
15+ autoCodePath string
16+ }
17+
1018// @title CreateTemp
1119// @description 函数的详细描述
1220// @auth (2020/04/05 20:22)
1321// @param autoCode model.AutoCodeStruct
1422// @return err error
1523
1624func CreateTemp (autoCode model.AutoCodeStruct ) (err error ) {
17- basePath := "./resource/template"
18- modelTmpl , err := template .ParseFiles (basePath + "/te/model.go.tpl" )
19- if err != nil {
20- return err
21- }
22- apiTmpl , err := template .ParseFiles (basePath + "/te/api.go.tpl" )
23- if err != nil {
24- return err
25- }
26- routerTmpl , err := template .ParseFiles (basePath + "/te/router.go.tpl" )
27- if err != nil {
28- return err
29- }
30- serviceTmpl , err := template .ParseFiles (basePath + "/te/service.go.tpl" )
31- if err != nil {
32- return err
33- }
34- feapiTmpl , err := template .ParseFiles (basePath + "/fe/api.js.tpl" )
35- if err != nil {
36- return err
37- }
38- feTableTmpl , err := template .ParseFiles (basePath + "/fe/table.vue.tpl" )
39- if err != nil {
40- return err
41- }
42- readmeTmpl , err := template .ParseFiles (basePath + "/readme.txt.tpl" )
43- if err != nil {
44- return err
45- }
46- // 自动化总目录
47- _autoCode := "./autoCode/"
48- // 自动化后台代码目录
49- _te := "./autoCode/te/"
50- _dir := _te + autoCode .PackageName
51- _modeldir := _te + autoCode .PackageName + "/model"
52- _apidir := _te + autoCode .PackageName + "/api"
53- _routerdir := _te + autoCode .PackageName + "/router"
54- _servicedir := _te + autoCode .PackageName + "/service"
55- // 自动化前台代码目录
56- _fe := "./autoCode/fe/"
57- _fe_dir := _fe + autoCode .PackageName
58- _fe_apidir := _fe + autoCode .PackageName + "/api"
59- _fe_tabledir := _fe + autoCode .PackageName + "/table"
60- err = utils .CreateDir (_autoCode , _te , _dir , _modeldir , _apidir , _routerdir , _servicedir , _fe , _fe_dir , _fe_apidir , _fe_tabledir )
61- if err != nil {
62- return err
63- }
64- model , err := os .OpenFile (_te + autoCode .PackageName + "/model/" + autoCode .PackageName + ".go" , os .O_CREATE | os .O_WRONLY , 0755 )
65- if err != nil {
66- return err
67- }
68- api , err := os .OpenFile (_te + autoCode .PackageName + "/api/" + autoCode .PackageName + ".go" , os .O_CREATE | os .O_WRONLY , 0755 )
25+ basePath := "resource/template"
26+ // 获取 basePath 文件夹下所有tpl文件
27+ tplFileList , err := GetAllTplFile (basePath , nil )
6928 if err != nil {
7029 return err
7130 }
72- router , err := os .OpenFile (_te + autoCode .PackageName + "/router/" + autoCode .PackageName + ".go" , os .O_CREATE | os .O_WRONLY , 0755 )
73- if err != nil {
74- return err
31+ dataList := make ([]tplData , 0 , len (tplFileList ))
32+ fileList := make ([]string , 0 , len (tplFileList ))
33+ needMkdir := make ([]string , 0 , len (tplFileList )) // 当文件夹下存在多个tpl文件时,改为map更合理
34+ // 根据文件路径生成 tplData 结构体,待填充数据
35+ for _ , value := range tplFileList {
36+ dataList = append (dataList , tplData {locationPath : value })
7537 }
76- service , err := os .OpenFile (_te + autoCode .PackageName + "/service/" + autoCode .PackageName + ".go" , os .O_CREATE | os .O_WRONLY , 0755 )
77- if err != nil {
78- return err
79- }
80- feapi , err := os .OpenFile (_fe + autoCode .PackageName + "/api/" + autoCode .PackageName + ".js" , os .O_CREATE | os .O_WRONLY , 0755 )
81- if err != nil {
82- return err
83- }
84- fetable , err := os .OpenFile (_fe + autoCode .PackageName + "/table/" + autoCode .PackageName + ".vue" , os .O_CREATE | os .O_WRONLY , 0755 )
85- if err != nil {
86- return err
87- }
88-
89- readme , err := os .OpenFile (_autoCode + "readme.txt" , os .O_CREATE | os .O_WRONLY , 0755 )
90- if err != nil {
91- return err
92- }
93- // 生成代码
94- {
95- err = modelTmpl .Execute (model , autoCode )
96- if err != nil {
97- return err
98- }
99- err = apiTmpl .Execute (api , autoCode )
38+ // 生成 *Template, 填充 template 字段
39+ for index , value := range dataList {
40+ dataList [index ].template , err = template .ParseFiles (value .locationPath )
10041 if err != nil {
10142 return err
10243 }
103- err = routerTmpl .Execute (router , autoCode )
104- if err != nil {
105- return err
44+ }
45+
46+ // 生成文件路径,填充 autoCodePath 字段,readme.txt.tpl不符合规则,需要特殊处理
47+ // resource/template/fe/api.js.tpl -> autoCode/fe/autoCode.PackageName/api/autoCode.PackageName.js
48+ // resource/template/readme.txt.tpl -> autoCode/readme.txt
49+ autoPath := "autoCode/"
50+ for index , value := range dataList {
51+ trimBase := strings .TrimPrefix (value .locationPath , basePath + "/" )
52+ if trimBase == "readme.txt.tpl" {
53+ dataList [index ].autoCodePath = autoPath + "readme.txt"
54+ continue
10655 }
107- err = serviceTmpl .Execute (service , autoCode )
108- if err != nil {
109- return err
56+
57+ if lastSeparator := strings .LastIndex (trimBase , "/" ); lastSeparator != - 1 {
58+ origFileName := strings .TrimSuffix (trimBase [lastSeparator + 1 :], ".tpl" )
59+ firstDot := strings .Index (origFileName , "." )
60+ if firstDot != - 1 {
61+ dataList [index ].autoCodePath = autoPath + trimBase [:lastSeparator ] + "/" + autoCode .PackageName + "/" +
62+ origFileName [:firstDot ] + "/" + autoCode .PackageName + origFileName [firstDot :]
63+ }
11064 }
111- err = feapiTmpl . Execute ( feapi , autoCode )
112- if err != nil {
113- return err
65+
66+ if lastSeparator := strings . LastIndex ( dataList [ index ]. autoCodePath , "/" ); lastSeparator != - 1 {
67+ needMkdir = append ( needMkdir , dataList [ index ]. autoCodePath [: lastSeparator ])
11468 }
115- err = feTableTmpl .Execute (fetable , autoCode )
69+ }
70+
71+ // 写入文件前,先创建文件夹
72+ if err = utils .CreateDir (needMkdir ... ); err != nil {
73+ return err
74+ }
75+
76+ // 生成文件
77+ for _ , value := range dataList {
78+ fileList = append (fileList , value .autoCodePath )
79+ f , err := os .OpenFile (value .autoCodePath , os .O_CREATE | os .O_WRONLY , 0755 )
11680 if err != nil {
11781 return err
11882 }
119- err = readmeTmpl .Execute (readme , autoCode )
120- if err != nil {
83+ if err = value .template .Execute (f , autoCode ); err != nil {
12184 return err
12285 }
86+ _ = f .Close ()
12387 }
124- _ = model .Close ()
125- _ = api .Close ()
126- _ = router .Close ()
127- _ = service .Close ()
128- _ = feapi .Close ()
129- _ = fetable .Close ()
130- _ = readme .Close ()
131- fileList := []string {
132- _te + autoCode .PackageName + "/model/" + autoCode .PackageName + ".go" ,
133- _te + autoCode .PackageName + "/api/" + autoCode .PackageName + ".go" ,
134- _te + autoCode .PackageName + "/router/" + autoCode .PackageName + ".go" ,
135- _te + autoCode .PackageName + "/service/" + autoCode .PackageName + ".go" ,
136- _fe + autoCode .PackageName + "/api/" + autoCode .PackageName + ".js" ,
137- _fe + autoCode .PackageName + "/table/" + autoCode .PackageName + ".vue" ,
13888
139- _autoCode + "readme.txt" ,
140- }
141- err = utils .ZipFiles ("./ginvueadmin.zip" , fileList , "." , "." )
142- if err != nil {
89+ // 生成压缩包
90+ if err := utils .ZipFiles ("./ginvueadmin.zip" , fileList , "." , "." ); err != nil {
14391 return err
14492 }
145- err = os .RemoveAll (_autoCode )
146- if err != nil {
93+
94+ // 移除中间文件
95+ if err := os .RemoveAll (autoPath ); err != nil {
14796 return err
14897 }
14998 return nil
15099}
100+
101+ // GetAllTplFile 用来获取 pathName 文件夹下所有 tpl 文件
102+ func GetAllTplFile (pathName string , fileList []string ) ([]string , error ) {
103+ files , err := ioutil .ReadDir (pathName )
104+ for _ , fi := range files {
105+ if fi .IsDir () {
106+ fileList , err = GetAllTplFile (pathName + "/" + fi .Name (), fileList )
107+ if err != nil {
108+ return nil , err
109+ }
110+ } else {
111+ if strings .HasSuffix (fi .Name (), ".tpl" ) {
112+ fileList = append (fileList , pathName + "/" + fi .Name ())
113+ }
114+ }
115+ }
116+ return fileList , err
117+ }
0 commit comments