Skip to content

Commit a7141fe

Browse files
committed
重构CreateTemp
1 parent 9bfb5eb commit a7141fe

File tree

6 files changed

+113
-151
lines changed

6 files changed

+113
-151
lines changed

server/resource/template/te/api.go.tpl

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@ package v1
22

33
import (
44
"fmt"
5-
"gin-vue-admin/global/response"
6-
"gin-vue-admin/model"
7-
"gin-vue-admin/model/request"
8-
resp "gin-vue-admin/model/response"
9-
"gin-vue-admin/service"
10-
"github.com/gin-gonic/gin"
5+
"gin-vue-admin/global/response"
6+
"gin-vue-admin/model"
7+
"gin-vue-admin/model/request"
8+
resp "gin-vue-admin/model/response"
9+
"gin-vue-admin/service"
10+
"github.com/gin-gonic/gin"
1111
)
1212

13-
1413
// @Tags {{.StructName}}
1514
// @Summary 创建{{.StructName}}
1615
// @Security ApiKeyAuth
@@ -30,7 +29,6 @@ func Create{{.StructName}}(c *gin.Context) {
3029
}
3130
}
3231

33-
3432
// @Tags {{.StructName}}
3533
// @Summary 删除{{.StructName}}
3634
// @Security ApiKeyAuth
@@ -50,7 +48,6 @@ func Delete{{.StructName}}(c *gin.Context) {
5048
}
5149
}
5250

53-
5451
// @Tags {{.StructName}}
5552
// @Summary 更新{{.StructName}}
5653
// @Security ApiKeyAuth
@@ -70,7 +67,6 @@ func Update{{.StructName}}(c *gin.Context) {
7067
}
7168
}
7269

73-
7470
// @Tags {{.StructName}}
7571
// @Summary 用id查询{{.StructName}}
7672
// @Security ApiKeyAuth
@@ -82,15 +78,14 @@ func Update{{.StructName}}(c *gin.Context) {
8278
func Find{{.StructName}}(c *gin.Context) {
8379
var {{.Abbreviation}} model.{{.StructName}}
8480
_ = c.ShouldBindQuery(&{{.Abbreviation}})
85-
err,re{{.Abbreviation}} := service.Get{{.StructName}}({{.Abbreviation}}.ID)
81+
err, re{{.Abbreviation}} := service.Get{{.StructName}}({{.Abbreviation}}.ID)
8682
if err != nil {
87-
response.FailWithMessage(fmt.Sprintf("查询失败,%v", err), c)
83+
response.FailWithMessage(fmt.Sprintf("查询失败,%v", err), c)
8884
} else {
89-
response.OkWithData( gin.H{"re{{.Abbreviation}}":re{{.Abbreviation}},}, c)
85+
response.OkWithData(gin.H{"re{{.Abbreviation}}": re{{.Abbreviation}}}, c)
9086
}
9187
}
9288

93-
9489
// @Tags {{.StructName}}
9590
// @Summary 分页获取{{.StructName}}列表
9691
// @Security ApiKeyAuth
@@ -104,13 +99,13 @@ func Get{{.StructName}}List(c *gin.Context) {
10499
_ = c.ShouldBindQuery(&pageInfo)
105100
err, list, total := service.Get{{.StructName}}InfoList(pageInfo)
106101
if err != nil {
107-
response.FailWithMessage(fmt.Sprintf("获取数据失败,%v", err), c)
102+
response.FailWithMessage(fmt.Sprintf("获取数据失败,%v", err), c)
108103
} else {
109-
response.OkWithData(resp.PageResult{
110-
List: list,
111-
Total: total,
112-
Page: pageInfo.Page,
113-
PageSize: pageInfo.PageSize,
114-
}, c)
104+
response.OkWithData(resp.PageResult{
105+
List: list,
106+
Total: total,
107+
Page: pageInfo.Page,
108+
PageSize: pageInfo.PageSize,
109+
}, c)
115110
}
116-
}
111+
}

server/resource/template/te/model.go.tpl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
package model
33

44
import (
5-
"github.com/jinzhu/gorm"
5+
"github.com/jinzhu/gorm"
66
)
77

88
type {{.StructName}} struct {
9-
gorm.Model {{range .Fields}}
10-
{{.FieldName}} {{.FieldType}} `json:"{{.FieldJson}}"{{if .ColumnName}} gorm:"column:{{.ColumnName}}"{{end}}`{{ end }}
11-
}
9+
gorm.Model{{range .Fields}}
10+
{{.FieldName}} {{.FieldType}} `json:"{{.FieldJson}}"{{if .ColumnName}} gorm:"column:{{.ColumnName}}"{{end}}`{{ end }}
11+
}

server/resource/template/te/router.go.tpl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ package router
22

33
import (
44
"gin-vue-admin/api/v1"
5-
"gin-vue-admin/middleware"
6-
"github.com/gin-gonic/gin"
5+
"gin-vue-admin/middleware"
6+
"github.com/gin-gonic/gin"
77
)
88

99
func Init{{.StructName}}Router(Router *gin.RouterGroup) {
1010
{{.StructName}}Router := Router.Group("{{.Abbreviation}}").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
1111
{
12-
{{.StructName}}Router.POST("create{{.StructName}}", v1.Create{{.StructName}}) // 新建{{.StructName}}
13-
{{.StructName}}Router.DELETE("delete{{.StructName}}", v1.Delete{{.StructName}}) //删除{{.StructName}}
14-
{{.StructName}}Router.PUT("update{{.StructName}}", v1.Update{{.StructName}}) //更新{{.StructName}}
15-
{{.StructName}}Router.GET("find{{.StructName}}", v1.Find{{.StructName}}) // 根据ID获取{{.StructName}}
16-
{{.StructName}}Router.GET("get{{.StructName}}List", v1.Get{{.StructName}}List) //获取{{.StructName}}列表
12+
{{.StructName}}Router.POST("create{{.StructName}}", v1.Create{{.StructName}}) // 新建{{.StructName}}
13+
{{.StructName}}Router.DELETE("delete{{.StructName}}", v1.Delete{{.StructName}}) // 删除{{.StructName}}
14+
{{.StructName}}Router.PUT("update{{.StructName}}", v1.Update{{.StructName}}) // 更新{{.StructName}}
15+
{{.StructName}}Router.GET("find{{.StructName}}", v1.Find{{.StructName}}) // 根据ID获取{{.StructName}}
16+
{{.StructName}}Router.GET("get{{.StructName}}List", v1.Get{{.StructName}}List) // 获取{{.StructName}}列表
1717
}
1818
}

server/resource/template/te/service.go.tpl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ func Get{{.StructName}}(id uint) (err error, {{.Abbreviation}} model.{{.StructNa
5959

6060
func Get{{.StructName}}InfoList(info request.PageInfo) (err error, list interface{}, total int) {
6161
limit := info.PageSize
62-
offset := info.PageSize * (info.Page - 1)
63-
db := global.GVA_DB
64-
var {{.Abbreviation}}s []model.{{.StructName}}
65-
err = db.Find(&{{.Abbreviation}}s).Count(&total).Error
66-
err = db.Limit(limit).Offset(offset).Find(&{{.Abbreviation}}s).Error
67-
return err,{{.Abbreviation}}s, total
62+
offset := info.PageSize * (info.Page - 1)
63+
db := global.GVA_DB
64+
var {{.Abbreviation}}s []model.{{.StructName}}
65+
err = db.Find(&{{.Abbreviation}}s).Count(&total).Error
66+
err = db.Limit(limit).Offset(offset).Find(&{{.Abbreviation}}s).Error
67+
return err, {{.Abbreviation}}s, total
6868
}

server/service/sys_auto_code.go

Lines changed: 78 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -3,148 +3,115 @@ package service
33
import (
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

1624
func 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+
}

server/utils/directory.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func CreateDir(dirs ...string) (err error) {
4040
} else {
4141
// log.L.Info(fmt.Sprintf("no dir![%v]\n"+_dir))
4242
// 创建文件夹
43-
err = os.Mkdir(v, os.ModePerm)
43+
err = os.MkdirAll(v, os.ModePerm)
4444
if err != nil {
4545
// log.L.Error(fmt.Sprintf("mkdir error![%v]\n",err))
4646
} else {

0 commit comments

Comments
 (0)