Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_54624550
gin-vue-admin
提交
522744f8
G
gin-vue-admin
项目概览
weixin_54624550
/
gin-vue-admin
与 Fork 源项目一致
Fork自
FLIPPED-AURORA / gin-vue-admin
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gin-vue-admin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
522744f8
编写于
6月 01, 2020
作者:
Mr.奇淼(
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Merge branch 'gin-vue-admin_v2_dev' of G:\QMPlus with conflicts.
上级
31bade5a
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
292 addition
and
342 deletion
+292
-342
server/resource/template/te/api.go.tpl
server/resource/template/te/api.go.tpl
+17
-22
server/resource/template/te/model.go.tpl
server/resource/template/te/model.go.tpl
+4
-4
server/resource/template/te/router.go.tpl
server/resource/template/te/router.go.tpl
+7
-7
server/resource/template/te/service.go.tpl
server/resource/template/te/service.go.tpl
+6
-6
server/service/sys_auto_code.go
server/service/sys_auto_code.go
+78
-111
server/utils/directory.go
server/utils/directory.go
+1
-1
web/src/view/systemTools/autoCode/index.vue
web/src/view/systemTools/autoCode/index.vue
+179
-191
未找到文件。
server/resource/template/te/api.go.tpl
浏览文件 @
522744f8
...
...
@@ -2,15 +2,14 @@ package v1
import (
"fmt"
"gin-vue-admin/global/response"
"gin-vue-admin/model"
"gin-vue-admin/model/request"
resp "gin-vue-admin/model/response"
"gin-vue-admin/service"
"github.com/gin-gonic/gin"
"gin-vue-admin/global/response"
"gin-vue-admin/model"
"gin-vue-admin/model/request"
resp "gin-vue-admin/model/response"
"gin-vue-admin/service"
"github.com/gin-gonic/gin"
)
// @Tags {{.StructName}}
// @Summary 创建{{.StructName}}
// @Security ApiKeyAuth
...
...
@@ -30,7 +29,6 @@ func Create{{.StructName}}(c *gin.Context) {
}
}
// @Tags {{.StructName}}
// @Summary 删除{{.StructName}}
// @Security ApiKeyAuth
...
...
@@ -50,7 +48,6 @@ func Delete{{.StructName}}(c *gin.Context) {
}
}
// @Tags {{.StructName}}
// @Summary 更新{{.StructName}}
// @Security ApiKeyAuth
...
...
@@ -70,7 +67,6 @@ func Update{{.StructName}}(c *gin.Context) {
}
}
// @Tags {{.StructName}}
// @Summary 用id查询{{.StructName}}
// @Security ApiKeyAuth
...
...
@@ -82,15 +78,14 @@ func Update{{.StructName}}(c *gin.Context) {
func Find{{.StructName}}(c *gin.Context) {
var {{.Abbreviation}} model.{{.StructName}}
_ = c.ShouldBindQuery(
&
{{.Abbreviation}})
err,re{{.Abbreviation}} := service.Get{{.StructName}}({{.Abbreviation}}.ID)
err,
re{{.Abbreviation}} := service.Get{{.StructName}}({{.Abbreviation}}.ID)
if err != nil {
response.FailWithMessage(fmt.Sprintf("查询失败,%v", err), c)
response.FailWithMessage(fmt.Sprintf("查询失败,%v", err), c)
} else {
response.OkWithData(
gin.H
{
"re{{.Abbreviation}}"
:
re
{{
.
Abbreviation
}}
,
}
, c)
response.OkWithData(
gin.H
{
"re{{.Abbreviation}}"
:
re
{{
.
Abbreviation
}}
}
, c)
}
}
// @Tags {{.StructName}}
// @Summary 分页获取{{.StructName}}列表
// @Security ApiKeyAuth
...
...
@@ -104,13 +99,13 @@ func Get{{.StructName}}List(c *gin.Context) {
_ = c.ShouldBindQuery(
&
pageInfo)
err, list, total := service.Get{{.StructName}}InfoList(pageInfo)
if err != nil {
response.FailWithMessage(fmt.Sprintf("获取数据失败,%v", err), c)
response.FailWithMessage(fmt.Sprintf("获取数据失败,%v", err), c)
} else {
response.OkWithData(resp.PageResult{
List: list,
Total: total,
Page: pageInfo.Page,
PageSize: pageInfo.PageSize,
}, c)
response.OkWithData(resp.PageResult{
List: list,
Total: total,
Page: pageInfo.Page,
PageSize: pageInfo.PageSize,
}, c)
}
}
\ No newline at end of file
}
server/resource/template/te/model.go.tpl
浏览文件 @
522744f8
...
...
@@ -2,10 +2,10 @@
package model
import (
"github.com/jinzhu/gorm"
"github.com/jinzhu/gorm"
)
type {{.StructName}} struct {
gorm.Model {
{
range
.
Fields
}
}
{{.FieldName}} {{.FieldType}} `json:"{{.FieldJson}}"{
{
if
.
ColumnName
}
} gorm:"column:{{.ColumnName}}"{
{
end
}
}`{{ end }}
}
\ No newline at end of file
gorm.Model{
{
range
.
Fields
}
}
{{.FieldName}} {{.FieldType}} `json:"{{.FieldJson}}"{
{
if
.
ColumnName
}
} gorm:"column:{{.ColumnName}}"{
{
end
}
}`{{ end }}
}
server/resource/template/te/router.go.tpl
浏览文件 @
522744f8
...
...
@@ -2,17 +2,17 @@ package router
import (
"gin-vue-admin/api/v1"
"gin-vue-admin/middleware"
"github.com/gin-gonic/gin"
"gin-vue-admin/middleware"
"github.com/gin-gonic/gin"
)
func Init{{.StructName}}Router(Router *gin.RouterGroup) {
{{.StructName}}Router := Router.Group("{{.Abbreviation}}").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
{{.StructName}}Router.POST("create{{.StructName}}", v1.Create{{.StructName}})
// 新建{{.StructName}}
{{.StructName}}Router.DELETE("delete{{.StructName}}", v1.Delete{{.StructName}})
//
删除{{.StructName}}
{{.StructName}}Router.PUT("update{{.StructName}}", v1.Update{{.StructName}})
//
更新{{.StructName}}
{{.StructName}}Router.GET("find{{.StructName}}", v1.Find{{.StructName}})
// 根据ID获取{{.StructName}}
{{.StructName}}Router.GET("get{{.StructName}}List", v1.Get{{.StructName}}List)
//
获取{{.StructName}}列表
{{.StructName}}Router.POST("create{{.StructName}}", v1.Create{{.StructName}}) // 新建{{.StructName}}
{{.StructName}}Router.DELETE("delete{{.StructName}}", v1.Delete{{.StructName}})
//
删除{{.StructName}}
{{.StructName}}Router.PUT("update{{.StructName}}", v1.Update{{.StructName}})
//
更新{{.StructName}}
{{.StructName}}Router.GET("find{{.StructName}}", v1.Find{{.StructName}}) // 根据ID获取{{.StructName}}
{{.StructName}}Router.GET("get{{.StructName}}List", v1.Get{{.StructName}}List)
//
获取{{.StructName}}列表
}
}
server/resource/template/te/service.go.tpl
浏览文件 @
522744f8
...
...
@@ -59,10 +59,10 @@ func Get{{.StructName}}(id uint) (err error, {{.Abbreviation}} model.{{.StructNa
func Get{{.StructName}}InfoList(info request.PageInfo) (err error, list interface{}, total int) {
limit := info.PageSize
offset := info.PageSize * (info.Page - 1)
db := global.GVA_DB
var {{.Abbreviation}}s []model.{{.StructName}}
err = db.Find(
&
{{.Abbreviation}}s).Count(
&
total).Error
err = db.Limit(limit).Offset(offset).Find(
&
{{.Abbreviation}}s).Error
return err,
{{.Abbreviation}}s, total
offset := info.PageSize * (info.Page - 1)
db := global.GVA_DB
var {{.Abbreviation}}s []model.{{.StructName}}
err = db.Find(
&
{{.Abbreviation}}s).Count(
&
total).Error
err = db.Limit(limit).Offset(offset).Find(
&
{{.Abbreviation}}s).Error
return err,
{{.Abbreviation}}s, total
}
server/service/sys_auto_code.go
浏览文件 @
522744f8
...
...
@@ -3,10 +3,18 @@ package service
import
(
"gin-vue-admin/model"
"gin-vue-admin/utils"
"io/ioutil"
"os"
"strings"
"text/template"
)
type
tplData
struct
{
template
*
template
.
Template
locationPath
string
autoCodePath
string
}
// @title CreateTemp
// @description 函数的详细描述
// @auth (2020/04/05 20:22)
...
...
@@ -14,137 +22,96 @@ import (
// @return err error
func
CreateTemp
(
autoCode
model
.
AutoCodeStruct
)
(
err
error
)
{
basePath
:=
"./resource/template"
modelTmpl
,
err
:=
template
.
ParseFiles
(
basePath
+
"/te/model.go.tpl"
)
if
err
!=
nil
{
return
err
}
apiTmpl
,
err
:=
template
.
ParseFiles
(
basePath
+
"/te/api.go.tpl"
)
if
err
!=
nil
{
return
err
}
routerTmpl
,
err
:=
template
.
ParseFiles
(
basePath
+
"/te/router.go.tpl"
)
if
err
!=
nil
{
return
err
}
serviceTmpl
,
err
:=
template
.
ParseFiles
(
basePath
+
"/te/service.go.tpl"
)
if
err
!=
nil
{
return
err
}
feapiTmpl
,
err
:=
template
.
ParseFiles
(
basePath
+
"/fe/api.js.tpl"
)
if
err
!=
nil
{
return
err
}
feTableTmpl
,
err
:=
template
.
ParseFiles
(
basePath
+
"/fe/table.vue.tpl"
)
if
err
!=
nil
{
return
err
}
readmeTmpl
,
err
:=
template
.
ParseFiles
(
basePath
+
"/readme.txt.tpl"
)
if
err
!=
nil
{
return
err
}
// 自动化总目录
_autoCode
:=
"./autoCode/"
// 自动化后台代码目录
_te
:=
"./autoCode/te/"
_dir
:=
_te
+
autoCode
.
PackageName
_modeldir
:=
_te
+
autoCode
.
PackageName
+
"/model"
_apidir
:=
_te
+
autoCode
.
PackageName
+
"/api"
_routerdir
:=
_te
+
autoCode
.
PackageName
+
"/router"
_servicedir
:=
_te
+
autoCode
.
PackageName
+
"/service"
// 自动化前台代码目录
_fe
:=
"./autoCode/fe/"
_fe_dir
:=
_fe
+
autoCode
.
PackageName
_fe_apidir
:=
_fe
+
autoCode
.
PackageName
+
"/api"
_fe_tabledir
:=
_fe
+
autoCode
.
PackageName
+
"/table"
err
=
utils
.
CreateDir
(
_autoCode
,
_te
,
_dir
,
_modeldir
,
_apidir
,
_routerdir
,
_servicedir
,
_fe
,
_fe_dir
,
_fe_apidir
,
_fe_tabledir
)
if
err
!=
nil
{
return
err
}
model
,
err
:=
os
.
OpenFile
(
_te
+
autoCode
.
PackageName
+
"/model/"
+
autoCode
.
PackageName
+
".go"
,
os
.
O_CREATE
|
os
.
O_WRONLY
,
0755
)
if
err
!=
nil
{
return
err
}
api
,
err
:=
os
.
OpenFile
(
_te
+
autoCode
.
PackageName
+
"/api/"
+
autoCode
.
PackageName
+
".go"
,
os
.
O_CREATE
|
os
.
O_WRONLY
,
0755
)
basePath
:=
"resource/template"
// 获取 basePath 文件夹下所有tpl文件
tplFileList
,
err
:=
GetAllTplFile
(
basePath
,
nil
)
if
err
!=
nil
{
return
err
}
router
,
err
:=
os
.
OpenFile
(
_te
+
autoCode
.
PackageName
+
"/router/"
+
autoCode
.
PackageName
+
".go"
,
os
.
O_CREATE
|
os
.
O_WRONLY
,
0755
)
if
err
!=
nil
{
return
err
dataList
:=
make
([]
tplData
,
0
,
len
(
tplFileList
))
fileList
:=
make
([]
string
,
0
,
len
(
tplFileList
))
needMkdir
:=
make
([]
string
,
0
,
len
(
tplFileList
))
// 当文件夹下存在多个tpl文件时,改为map更合理
// 根据文件路径生成 tplData 结构体,待填充数据
for
_
,
value
:=
range
tplFileList
{
dataList
=
append
(
dataList
,
tplData
{
locationPath
:
value
})
}
service
,
err
:=
os
.
OpenFile
(
_te
+
autoCode
.
PackageName
+
"/service/"
+
autoCode
.
PackageName
+
".go"
,
os
.
O_CREATE
|
os
.
O_WRONLY
,
0755
)
if
err
!=
nil
{
return
err
}
feapi
,
err
:=
os
.
OpenFile
(
_fe
+
autoCode
.
PackageName
+
"/api/"
+
autoCode
.
PackageName
+
".js"
,
os
.
O_CREATE
|
os
.
O_WRONLY
,
0755
)
if
err
!=
nil
{
return
err
}
fetable
,
err
:=
os
.
OpenFile
(
_fe
+
autoCode
.
PackageName
+
"/table/"
+
autoCode
.
PackageName
+
".vue"
,
os
.
O_CREATE
|
os
.
O_WRONLY
,
0755
)
if
err
!=
nil
{
return
err
}
readme
,
err
:=
os
.
OpenFile
(
_autoCode
+
"readme.txt"
,
os
.
O_CREATE
|
os
.
O_WRONLY
,
0755
)
if
err
!=
nil
{
return
err
}
// 生成代码
{
err
=
modelTmpl
.
Execute
(
model
,
autoCode
)
if
err
!=
nil
{
return
err
}
err
=
apiTmpl
.
Execute
(
api
,
autoCode
)
// 生成 *Template, 填充 template 字段
for
index
,
value
:=
range
dataList
{
dataList
[
index
]
.
template
,
err
=
template
.
ParseFiles
(
value
.
locationPath
)
if
err
!=
nil
{
return
err
}
err
=
routerTmpl
.
Execute
(
router
,
autoCode
)
if
err
!=
nil
{
return
err
}
// 生成文件路径,填充 autoCodePath 字段,readme.txt.tpl不符合规则,需要特殊处理
// resource/template/fe/api.js.tpl -> autoCode/fe/autoCode.PackageName/api/autoCode.PackageName.js
// resource/template/readme.txt.tpl -> autoCode/readme.txt
autoPath
:=
"autoCode/"
for
index
,
value
:=
range
dataList
{
trimBase
:=
strings
.
TrimPrefix
(
value
.
locationPath
,
basePath
+
"/"
)
if
trimBase
==
"readme.txt.tpl"
{
dataList
[
index
]
.
autoCodePath
=
autoPath
+
"readme.txt"
continue
}
err
=
serviceTmpl
.
Execute
(
service
,
autoCode
)
if
err
!=
nil
{
return
err
if
lastSeparator
:=
strings
.
LastIndex
(
trimBase
,
"/"
);
lastSeparator
!=
-
1
{
origFileName
:=
strings
.
TrimSuffix
(
trimBase
[
lastSeparator
+
1
:
],
".tpl"
)
firstDot
:=
strings
.
Index
(
origFileName
,
"."
)
if
firstDot
!=
-
1
{
dataList
[
index
]
.
autoCodePath
=
autoPath
+
trimBase
[
:
lastSeparator
]
+
"/"
+
autoCode
.
PackageName
+
"/"
+
origFileName
[
:
firstDot
]
+
"/"
+
autoCode
.
PackageName
+
origFileName
[
firstDot
:
]
}
}
err
=
feapiTmpl
.
Execute
(
feapi
,
autoCode
)
if
err
!=
nil
{
return
err
if
lastSeparator
:=
strings
.
LastIndex
(
dataList
[
index
]
.
autoCodePath
,
"/"
);
lastSeparator
!=
-
1
{
needMkdir
=
append
(
needMkdir
,
dataList
[
index
]
.
autoCodePath
[
:
lastSeparator
])
}
err
=
feTableTmpl
.
Execute
(
fetable
,
autoCode
)
}
// 写入文件前,先创建文件夹
if
err
=
utils
.
CreateDir
(
needMkdir
...
);
err
!=
nil
{
return
err
}
// 生成文件
for
_
,
value
:=
range
dataList
{
fileList
=
append
(
fileList
,
value
.
autoCodePath
)
f
,
err
:=
os
.
OpenFile
(
value
.
autoCodePath
,
os
.
O_CREATE
|
os
.
O_WRONLY
,
0755
)
if
err
!=
nil
{
return
err
}
err
=
readmeTmpl
.
Execute
(
readme
,
autoCode
)
if
err
!=
nil
{
if
err
=
value
.
template
.
Execute
(
f
,
autoCode
);
err
!=
nil
{
return
err
}
_
=
f
.
Close
()
}
_
=
model
.
Close
()
_
=
api
.
Close
()
_
=
router
.
Close
()
_
=
service
.
Close
()
_
=
feapi
.
Close
()
_
=
fetable
.
Close
()
_
=
readme
.
Close
()
fileList
:=
[]
string
{
_te
+
autoCode
.
PackageName
+
"/model/"
+
autoCode
.
PackageName
+
".go"
,
_te
+
autoCode
.
PackageName
+
"/api/"
+
autoCode
.
PackageName
+
".go"
,
_te
+
autoCode
.
PackageName
+
"/router/"
+
autoCode
.
PackageName
+
".go"
,
_te
+
autoCode
.
PackageName
+
"/service/"
+
autoCode
.
PackageName
+
".go"
,
_fe
+
autoCode
.
PackageName
+
"/api/"
+
autoCode
.
PackageName
+
".js"
,
_fe
+
autoCode
.
PackageName
+
"/table/"
+
autoCode
.
PackageName
+
".vue"
,
_autoCode
+
"readme.txt"
,
}
err
=
utils
.
ZipFiles
(
"./ginvueadmin.zip"
,
fileList
,
"."
,
"."
)
if
err
!=
nil
{
// 生成压缩包
if
err
:=
utils
.
ZipFiles
(
"./ginvueadmin.zip"
,
fileList
,
"."
,
"."
);
err
!=
nil
{
return
err
}
err
=
os
.
RemoveAll
(
_autoCode
)
if
err
!=
nil
{
// 移除中间文件
if
err
:=
os
.
RemoveAll
(
autoPath
);
err
!=
nil
{
return
err
}
return
nil
}
// GetAllTplFile 用来获取 pathName 文件夹下所有 tpl 文件
func
GetAllTplFile
(
pathName
string
,
fileList
[]
string
)
([]
string
,
error
)
{
files
,
err
:=
ioutil
.
ReadDir
(
pathName
)
for
_
,
fi
:=
range
files
{
if
fi
.
IsDir
()
{
fileList
,
err
=
GetAllTplFile
(
pathName
+
"/"
+
fi
.
Name
(),
fileList
)
if
err
!=
nil
{
return
nil
,
err
}
}
else
{
if
strings
.
HasSuffix
(
fi
.
Name
(),
".tpl"
)
{
fileList
=
append
(
fileList
,
pathName
+
"/"
+
fi
.
Name
())
}
}
}
return
fileList
,
err
}
server/utils/directory.go
浏览文件 @
522744f8
...
...
@@ -40,7 +40,7 @@ func CreateDir(dirs ...string) (err error) {
}
else
{
// log.L.Info(fmt.Sprintf("no dir![%v]\n"+_dir))
// 创建文件夹
err
=
os
.
Mkdir
(
v
,
os
.
ModePerm
)
err
=
os
.
Mkdir
All
(
v
,
os
.
ModePerm
)
if
err
!=
nil
{
// log.L.Error(fmt.Sprintf("mkdir error![%v]\n",err))
}
else
{
...
...
web/src/view/systemTools/autoCode/index.vue
浏览文件 @
522744f8
<
template
>
<div>
<!-- 初始版本自动化代码工具 -->
<el-form
ref=
"autoCodeForm"
:rules=
"rules"
:model=
"form"
label-width=
"120px"
:inline=
"true"
>
<el-form-item
label=
"Struct名称"
prop=
"structName"
>
<el-input
v-model=
"form.structName"
placeholder=
"首字母自动转换大写"
></el-input>
</el-form-item>
<el-form-item
label=
"Struct简称"
prop=
"abbreviation"
>
<el-input
v-model=
"form.abbreviation"
placeholder=
"简称会作为入参对象名和路由group"
></el-input>
</el-form-item>
<el-form-item
label=
"文件名称"
prop=
"packageName"
>
<el-input
v-model=
"form.packageName"
></el-input>
</el-form-item>
<el-form-item>
<el-checkbox
v-model=
"form.autoCreateApiToSql"
>
自动创建api
</el-checkbox>
</el-form-item>
</el-form>
<!-- 组件列表 -->
<div
class=
"button-box clearflex"
>
<el-button
@
click=
"editAndAddField()"
type=
"primary"
>
新增Field
</el-button>
</div>
<el-table
:data=
"form.fields"
border
stripe
>
<el-table-column
type=
"index"
label=
"序列"
width=
"280"
>
</el-table-column>
<el-table-column
prop=
"fieldName"
label=
"Field名"
width=
"280"
>
</el-table-column>
<el-table-column
prop=
"fieldDesc"
label=
"中文名"
width=
"280"
>
</el-table-column>
<el-table-column
prop=
"fieldJson"
label=
"FieldJson"
width=
"280"
>
</el-table-column>
<el-table-column
prop=
"fieldType"
label=
"Field数据类型"
width=
"280"
>
</el-table-column>
<el-table-column
label=
"操作"
>
<template
slot-scope=
"scope"
>
<el-button
type=
"primary"
@
click=
"editAndAddField(scope.row)"
>
编辑
</el-button>
<el-popover
placement=
"top"
width=
"280"
v-model=
"scope.row.visible"
>
<p>
这是一段内容这是一段内容确定删除吗?
</p>
<div
style=
"text-align: right; margin: 0"
>
<el-button
size=
"mini"
type=
"text"
@
click=
"scope.row.visible = false"
>
取消
</el-button>
<el-button
type=
"primary"
size=
"mini"
@
click=
"deleteField(scope.$index)"
>
确定
</el-button>
</div>
<el-button
type=
"danger"
slot=
"reference"
>
删除
</el-button>
</el-popover>
</
template
>
</el-table-column>
</el-table>
<!-- 组件列表 -->
<div
class=
"button-box clearflex"
>
<el-button
@
click=
"enterForm"
type=
"primary"
>
生成代码包
</el-button>
</div>
<!-- 组件弹窗 -->
<el-dialog
title=
"组件内容"
:visible.sync=
"dialogFlag"
>
<FieldDialog
:dialogMiddle=
"dialogMiddle"
ref=
"fieldDialog"
/>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"closeDialog"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"enterDialog"
>
确 定
</el-button>
</div>
</el-dialog>
<div>
<!-- 初始版本自动化代码工具 -->
<el-form
ref=
"autoCodeForm"
:rules=
"rules"
:model=
"form"
label-width=
"120px"
:inline=
"true"
>
<el-form-item
label=
"Struct名称"
prop=
"structName"
>
<el-input
v-model=
"form.structName"
placeholder=
"首字母自动转换大写"
></el-input>
</el-form-item>
<el-form-item
label=
"Struct简称"
prop=
"abbreviation"
>
<el-input
v-model=
"form.abbreviation"
placeholder=
"简称会作为入参对象名和路由group"
></el-input>
</el-form-item>
<el-form-item
label=
"文件名称"
prop=
"packageName"
>
<el-input
v-model=
"form.packageName"
></el-input>
</el-form-item>
<el-form-item>
<el-checkbox
v-model=
"form.autoCreateApiToSql"
>
自动创建api
</el-checkbox>
</el-form-item>
</el-form>
<!-- 组件列表 -->
<div
class=
"button-box clearflex"
>
<el-button
@
click=
"editAndAddField()"
type=
"primary"
>
新增Field
</el-button>
</div>
<el-table
:data=
"form.fields"
border
stripe
>
<el-table-column
type=
"index"
label=
"序列"
width=
"100"
>
</el-table-column>
<el-table-column
prop=
"fieldName"
label=
"Field名"
>
</el-table-column>
<el-table-column
prop=
"fieldDesc"
label=
"中文名"
>
</el-table-column>
<el-table-column
prop=
"fieldJson"
label=
"FieldJson"
>
</el-table-column>
<el-table-column
prop=
"fieldType"
label=
"Field数据类型"
width=
"130"
>
</el-table-column>
<el-table-column
label=
"操作"
width=
"250"
>
<template
slot-scope=
"scope"
>
<el-button
type=
"primary"
@
click=
"editAndAddField(scope.row)"
>
编辑
</el-button>
<el-button
type=
"success"
:disabled=
"scope.$index == 0"
@
click=
"moveUpField(scope.$index)"
>
上移
</el-button>
<el-button
type=
"warning"
:disabled=
"(scope.$index + 1) == form.fields.length"
@
click=
"moveDownField(scope.$index)"
>
下移
</el-button>
<el-popover
placement=
"top"
v-model=
"scope.row.visible"
>
<p>
确定删除吗?
</p>
<div
style=
"text-align: right; margin: 0"
>
<el-button
size=
"mini"
type=
"text"
@
click=
"scope.row.visible = false"
>
取消
</el-button>
<el-button
type=
"primary"
size=
"mini"
@
click=
"deleteField(scope.$index)"
>
确定
</el-button>
</div>
<el-button
type=
"danger"
slot=
"reference"
>
删除
</el-button>
</el-popover>
</
template
>
</el-table-column>
</el-table>
<!-- 组件列表 -->
<div
class=
"button-box clearflex"
>
<el-button
@
click=
"enterForm"
type=
"primary"
>
生成代码包
</el-button>
</div>
<!-- 组件弹窗 -->
<el-dialog
title=
"组件内容"
:visible.sync=
"dialogFlag"
>
<FieldDialog
:dialogMiddle=
"dialogMiddle"
ref=
"fieldDialog"
/>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"closeDialog"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"enterDialog"
>
确 定
</el-button>
</div>
</el-dialog>
</div>
</template>
<
script
>
const
fieldTemplate
=
{
fieldName
:
""
,
fieldDesc
:
""
,
fieldType
:
""
,
fieldJson
:
""
,
columnName
:
""
,
}
const
fieldTemplate
=
{
fieldName
:
''
,
fieldDesc
:
''
,
fieldType
:
''
,
fieldJson
:
''
,
columnName
:
''
,
}
import
FieldDialog
from
"
@/view/systemTools/autoCode/component/fieldDialog.vue
"
import
{
toUpperCase
}
from
"
@/utils/stringFun.js
"
import
{
createTemp
}
from
"
@/api/autoCode.js
"
import
FieldDialog
from
'
@/view/systemTools/autoCode/component/fieldDialog.vue
'
import
{
toUpperCase
}
from
'
@/utils/stringFun.js
'
import
{
createTemp
}
from
'
@/api/autoCode.js
'
export
default
{
name
:
"
autoCode
"
,
data
(){
return
{
addFlag
:
""
,
form
:{
structName
:
""
,
packageName
:
""
,
abbreviation
:
""
,
autoCreateApiToSql
:
false
,
fields
:[]
},
rules
:{
structName
:[{
required
:
true
,
message
:
'
请输入结构体名称
'
,
trigger
:
'
blur
'
}],
abbreviation
:[{
required
:
true
,
message
:
'
请输入结构体简称
'
,
trigger
:
'
blur
'
}],
packageName
:[{
required
:
true
,
message
:
'
请输入包名称
'
,
trigger
:
'
blur
'
}]
},
dialogMiddle
:{},
bk
:{},
dialogFlag
:
false
name
:
'
autoCode
'
,
data
()
{
return
{
addFlag
:
''
,
form
:
{
structName
:
''
,
packageName
:
''
,
abbreviation
:
''
,
autoCreateApiToSql
:
false
,
fields
:
[],
},
rules
:
{
structName
:
[{
required
:
true
,
message
:
'
请输入结构体名称
'
,
trigger
:
'
blur
'
}],
abbreviation
:
[{
required
:
true
,
message
:
'
请输入结构体简称
'
,
trigger
:
'
blur
'
}],
packageName
:
[{
required
:
true
,
message
:
'
请输入包名称
'
,
trigger
:
'
blur
'
}],
},
dialogMiddle
:
{},
bk
:
{},
dialogFlag
:
false
,
}
},
components
:
{
FieldDialog
,
},
methods
:
{
editAndAddField
(
item
)
{
this
.
dialogFlag
=
true
if
(
item
)
{
this
.
addFlag
=
'
edit
'
this
.
bk
=
JSON
.
parse
(
JSON
.
stringify
(
item
))
this
.
dialogMiddle
=
item
}
else
{
this
.
addFlag
=
'
add
'
this
.
dialogMiddle
=
JSON
.
parse
(
JSON
.
stringify
(
fieldTemplate
))
}
},
moveUpField
(
index
)
{
if
(
index
==
0
)
{
return
}
const
oldUpField
=
this
.
form
.
fields
[
index
-
1
]
this
.
form
.
fields
.
splice
(
index
-
1
,
1
)
this
.
form
.
fields
.
splice
(
index
,
0
,
oldUpField
)
},
moveDownField
(
index
)
{
const
fCount
=
this
.
form
.
fields
.
length
if
(
index
==
fCount
-
1
)
{
return
}
const
oldDownField
=
this
.
form
.
fields
[
index
+
1
]
this
.
form
.
fields
.
splice
(
index
+
1
,
1
)
this
.
form
.
fields
.
splice
(
index
,
0
,
oldDownField
)
},
enterDialog
()
{
this
.
$refs
.
fieldDialog
.
$refs
.
fieldDialogFrom
.
validate
((
valid
)
=>
{
if
(
valid
)
{
this
.
dialogMiddle
.
fieldName
=
toUpperCase
(
this
.
dialogMiddle
.
fieldName
)
if
(
this
.
addFlag
==
'
add
'
)
{
this
.
form
.
fields
.
push
(
this
.
dialogMiddle
)
}
this
.
dialogFlag
=
false
}
else
{
return
false
}
})
},
components
:{
FieldDialog
closeDialog
()
{
if
(
this
.
addFlag
==
'
edit
'
)
{
this
.
dialogMiddle
=
this
.
bk
}
this
.
dialogFlag
=
false
},
methods
:{
editAndAddField
(
item
){
this
.
dialogFlag
=
true
if
(
item
){
this
.
addFlag
=
"
edit
"
this
.
bk
=
JSON
.
parse
(
JSON
.
stringify
(
item
))
this
.
dialogMiddle
=
item
}
else
{
this
.
addFlag
=
"
add
"
this
.
dialogMiddle
=
JSON
.
parse
(
JSON
.
stringify
(
fieldTemplate
))
}
},
regExp
(
ele
){
return
ele
.
replace
(
/
\s
*/g
,
""
)
},
enterDialog
(){
this
.
dialogMiddle
.
fieldName
=
this
.
regExp
(
this
.
dialogMiddle
.
fieldName
)
this
.
dialogMiddle
.
fieldDesc
=
this
.
regExp
(
this
.
dialogMiddle
.
fieldDesc
)
this
.
dialogMiddle
.
fieldJson
=
this
.
regExp
(
this
.
dialogMiddle
.
fieldJson
)
this
.
dialogMiddle
.
columnName
=
this
.
regExp
(
this
.
dialogMiddle
.
columnName
)
this
.
$refs
.
fieldDialog
.
$refs
.
fieldDialogFrom
.
validate
((
valid
)
=>
{
if
(
valid
)
{
this
.
dialogMiddle
.
fieldName
=
toUpperCase
(
this
.
dialogMiddle
.
fieldName
)
if
(
this
.
addFlag
==
"
add
"
){
this
.
form
.
fields
.
push
(
this
.
dialogMiddle
)
}
this
.
dialogFlag
=
false
}
else
{
return
false
;
deleteField
(
index
)
{
this
.
form
.
fields
.
splice
(
index
,
1
)
},
async
enterForm
()
{
if
(
this
.
form
.
fields
.
length
<=
0
)
{
this
.
$message
({
type
:
'
error
'
,
message
:
'
请填写至少一个field
'
,
})
return
false
}
this
.
$refs
.
autoCodeForm
.
validate
(
async
(
valid
)
=>
{
if
(
valid
)
{
this
.
form
.
structName
=
toUpperCase
(
this
.
form
.
structName
)
if
(
this
.
form
.
structName
==
this
.
form
.
abbreviation
)
{
this
.
$message
({
type
:
'
error
'
,
message
:
'
structName和struct简称不能相同
'
,
})
return
false
}
});
},
closeDialog
(){
if
(
this
.
addFlag
==
"
edit
"
){
this
.
dialogMiddle
=
this
.
bk
}
this
.
dialogFlag
=
false
},
deleteField
(
index
){
this
.
form
.
fields
.
splice
(
index
,
1
)
},
async
enterForm
(){
if
(
this
.
form
.
fields
.
length
<=
0
){
this
.
$message
({
type
:
"
error
"
,
message
:
"
请填写至少一个field
"
})
return
false
}
this
.
$refs
.
autoCodeForm
.
validate
(
async
(
valid
)
=>
{
if
(
valid
)
{
this
.
form
.
structName
=
this
.
regExp
(
this
.
form
.
structName
)
this
.
form
.
structName
=
toUpperCase
(
this
.
form
.
structName
)
this
.
form
.
abbreviation
=
this
.
regExp
(
this
.
form
.
abbreviation
)
this
.
form
.
packageName
=
this
.
regExp
(
this
.
form
.
packageName
)
if
(
this
.
form
.
structName
==
this
.
form
.
abbreviation
){
this
.
$message
({
type
:
"
error
"
,
message
:
"
structName和struct简称不能相同
"
})
return
false
}
const
data
=
await
createTemp
(
this
.
form
)
const
blob
=
new
Blob
([
data
])
const
fileName
=
'
ginvueadmin.zip
'
if
(
'
download
'
in
document
.
createElement
(
'
a
'
))
{
// 不是IE浏览器
let
url
=
window
.
URL
.
createObjectURL
(
blob
)
let
link
=
document
.
createElement
(
'
a
'
)
link
.
style
.
display
=
'
none
'
link
.
href
=
url
link
.
setAttribute
(
'
download
'
,
fileName
)
document
.
body
.
appendChild
(
link
)
link
.
click
()
document
.
body
.
removeChild
(
link
)
// 下载完成移除元素
window
.
URL
.
revokeObjectURL
(
url
)
// 释放掉blob对象
}
else
{
// IE 10+
window
.
navigator
.
msSaveBlob
(
blob
,
fileName
)
}
const
data
=
await
createTemp
(
this
.
form
)
const
blob
=
new
Blob
([
data
])
const
fileName
=
'
ginvueadmin.zip
'
if
(
'
download
'
in
document
.
createElement
(
'
a
'
))
{
// 不是IE浏览器
let
url
=
window
.
URL
.
createObjectURL
(
blob
)
let
link
=
document
.
createElement
(
'
a
'
)
link
.
style
.
display
=
'
none
'
link
.
href
=
url
link
.
setAttribute
(
'
download
'
,
fileName
)
document
.
body
.
appendChild
(
link
)
link
.
click
()
document
.
body
.
removeChild
(
link
)
// 下载完成移除元素
window
.
URL
.
revokeObjectURL
(
url
)
// 释放掉blob对象
}
else
{
return
false
;
// IE 10+
window
.
navigator
.
msSaveBlob
(
blob
,
fileName
)
}
});
}
else
{
return
false
}
}
})
},
},
}
</
script
>
<
style
scope
lang=
"scss"
>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录