Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
FLIPPED-AURORA
gin-vue-admin
提交
dac4e733
G
gin-vue-admin
项目概览
FLIPPED-AURORA
/
gin-vue-admin
大约 1 年 前同步成功
通知
332
Star
18154
Fork
5505
代码
文件
提交
分支
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,发现更多精彩内容 >>
提交
dac4e733
编写于
7月 10, 2021
作者:
S
songzhibin97
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat:回滚自动化生产代码
上级
0457a95e
变更
9
显示空白变更内容
内联
并排
Showing
9 changed file
with
177 addition
and
7 deletion
+177
-7
server/api/v1/sys_auto_code.go
server/api/v1/sys_auto_code.go
+18
-0
server/model/sys_auto_code.go
server/model/sys_auto_code.go
+5
-1
server/model/sys_autocode_history.go
server/model/sys_autocode_history.go
+13
-0
server/router/sys_auto_code.go
server/router/sys_auto_code.go
+1
-0
server/service/sys_auto_code.go
server/service/sys_auto_code.go
+38
-4
server/service/sys_autocode_history.go
server/service/sys_autocode_history.go
+58
-0
server/service/sys_initdb.go
server/service/sys_initdb.go
+1
-0
server/utils/file_operations.go
server/utils/file_operations.go
+4
-0
server/utils/injectionCode.go
server/utils/injectionCode.go
+39
-2
未找到文件。
server/api/v1/sys_auto_code.go
浏览文件 @
dac4e733
...
@@ -15,6 +15,24 @@ import (
...
@@ -15,6 +15,24 @@ import (
"go.uber.org/zap"
"go.uber.org/zap"
)
)
// @Tags AutoCode
// @Summary 回滚
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body uint true "回滚自动生成代码"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"回滚成功"}"
// @Router /autoCode/preview [post]
func
RollBack
(
c
*
gin
.
Context
)
{
var
id
model
.
AutoHistoryByID
_
=
c
.
ShouldBindJSON
(
&
id
)
if
err
:=
service
.
RollBack
(
id
.
ID
);
err
!=
nil
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
response
.
OkWithMessage
(
"回滚成功"
,
c
)
}
// @Tags AutoCode
// @Tags AutoCode
// @Summary 预览创建后的代码
// @Summary 预览创建后的代码
// @Security ApiKeyAuth
// @Security ApiKeyAuth
...
...
server/model/sys_auto_code.go
浏览文件 @
dac4e733
...
@@ -2,6 +2,10 @@ package model
...
@@ -2,6 +2,10 @@ package model
import
"errors"
import
"errors"
type
AutoHistoryByID
struct
{
ID
uint
`json:"id"`
}
// 初始版本自动化代码工具
// 初始版本自动化代码工具
type
AutoCodeStruct
struct
{
type
AutoCodeStruct
struct
{
StructName
string
`json:"structName"`
// Struct名称
StructName
string
`json:"structName"`
// Struct名称
...
...
server/model/sys_autocode_history.go
0 → 100644
浏览文件 @
dac4e733
package
model
import
"gin-vue-admin/global"
// 自动迁移代码记录,用于回滚,重放使用
type
SysAutoCodeHistory
struct
{
global
.
GVA_MODEL
TableName
string
AutoCodeMeta
string
`gorm:"type:text"`
// 其他meta信息 path;path
InjectionMeta
string
`gorm:"type:text"`
// 注入的内容 RouterPath@functionName@RouterString;
Flag
int
// 表示对应状态 0 代表创建, 1 代表回滚 ...
}
server/router/sys_auto_code.go
浏览文件 @
dac4e733
...
@@ -8,6 +8,7 @@ import (
...
@@ -8,6 +8,7 @@ import (
func
InitAutoCodeRouter
(
Router
*
gin
.
RouterGroup
)
{
func
InitAutoCodeRouter
(
Router
*
gin
.
RouterGroup
)
{
AutoCodeRouter
:=
Router
.
Group
(
"autoCode"
)
AutoCodeRouter
:=
Router
.
Group
(
"autoCode"
)
{
{
AutoCodeRouter
.
POST
(
"rollback"
,
v1
.
RollBack
)
// 回滚
AutoCodeRouter
.
POST
(
"preview"
,
v1
.
PreviewTemp
)
// 获取自动创建代码预览
AutoCodeRouter
.
POST
(
"preview"
,
v1
.
PreviewTemp
)
// 获取自动创建代码预览
AutoCodeRouter
.
POST
(
"createTemp"
,
v1
.
CreateTemp
)
// 创建自动化代码
AutoCodeRouter
.
POST
(
"createTemp"
,
v1
.
CreateTemp
)
// 创建自动化代码
AutoCodeRouter
.
GET
(
"getTables"
,
v1
.
GetTables
)
// 获取对应数据库的表
AutoCodeRouter
.
GET
(
"getTables"
,
v1
.
GetTables
)
// 获取对应数据库的表
...
...
server/service/sys_auto_code.go
浏览文件 @
dac4e733
...
@@ -2,6 +2,7 @@ package service
...
@@ -2,6 +2,7 @@ package service
import
(
import
(
"errors"
"errors"
"fmt"
"gin-vue-admin/global"
"gin-vue-admin/global"
"gin-vue-admin/model"
"gin-vue-admin/model"
"gin-vue-admin/model/request"
"gin-vue-admin/model/request"
...
@@ -143,6 +144,35 @@ func CreateTemp(autoCode model.AutoCodeStruct) (err error) {
...
@@ -143,6 +144,35 @@ func CreateTemp(autoCode model.AutoCodeStruct) (err error) {
return
err
return
err
}
}
err
=
utils
.
AutoInjectionCode
(
initializeRouterFilePath
,
"Routers"
,
"router.Init"
+
autoCode
.
StructName
+
"Router(PrivateGroup)"
)
err
=
utils
.
AutoInjectionCode
(
initializeRouterFilePath
,
"Routers"
,
"router.Init"
+
autoCode
.
StructName
+
"Router(PrivateGroup)"
)
if
err
!=
nil
{
return
err
}
injectionCodeMeta
:=
strings
.
Builder
{}
injectionCodeMeta
.
WriteString
(
fmt
.
Sprintf
(
"%s@%s@%s"
,
initializeGormFilePath
,
"MysqlTables"
,
"model."
+
autoCode
.
StructName
+
"{},"
))
injectionCodeMeta
.
WriteString
(
";"
)
injectionCodeMeta
.
WriteString
(
fmt
.
Sprintf
(
"%s@%s@%s"
,
initializeRouterFilePath
,
"Routers"
,
"router.Init"
+
autoCode
.
StructName
+
"Router(PrivateGroup)"
))
// 保存生成信息
bf
:=
strings
.
Builder
{}
for
_
,
data
:=
range
dataList
{
if
len
(
data
.
autoMoveFilePath
)
!=
0
{
bf
.
WriteString
(
data
.
autoMoveFilePath
)
bf
.
WriteString
(
";"
)
}
}
if
autoCode
.
TableName
!=
""
{
err
=
CreateAutoCodeHistory
(
bf
.
String
(),
injectionCodeMeta
.
String
(),
autoCode
.
TableName
,
)
}
else
{
err
=
CreateAutoCodeHistory
(
bf
.
String
(),
injectionCodeMeta
.
String
(),
autoCode
.
StructName
,
)
}
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -215,6 +245,10 @@ func GetColumn(tableName string, dbName string) (err error, Columns []request.Co
...
@@ -215,6 +245,10 @@ func GetColumn(tableName string, dbName string) (err error, Columns []request.Co
return
err
,
Columns
return
err
,
Columns
}
}
func
DropTable
(
tableName
string
)
error
{
return
global
.
GVA_DB
.
Exec
(
"DROP TABLE "
+
tableName
)
.
Error
}
//@author: [SliverHorn](https://github.com/SliverHorn)
//@author: [SliverHorn](https://github.com/SliverHorn)
//@author: [songzhibin97](https://github.com/songzhibin97)
//@author: [songzhibin97](https://github.com/songzhibin97)
//@function: addAutoMoveFile
//@function: addAutoMoveFile
...
@@ -361,10 +395,10 @@ func getNeedList(autoCode *model.AutoCodeStruct) (dataList []tplData, fileList [
...
@@ -361,10 +395,10 @@ func getNeedList(autoCode *model.AutoCodeStruct) (dataList []tplData, fileList [
firstDot
:=
strings
.
Index
(
origFileName
,
"."
)
firstDot
:=
strings
.
Index
(
origFileName
,
"."
)
if
firstDot
!=
-
1
{
if
firstDot
!=
-
1
{
var
fileName
string
var
fileName
string
if
origFileName
[
firstDot
:
]
!=
".go"
{
if
origFileName
[
firstDot
:
]
!=
".go"
{
fileName
=
autoCode
.
PackageName
+
origFileName
[
firstDot
:
]
fileName
=
autoCode
.
PackageName
+
origFileName
[
firstDot
:
]
}
else
{
}
else
{
fileName
=
autoCode
.
HumpPackageName
+
origFileName
[
firstDot
:
]
fileName
=
autoCode
.
HumpPackageName
+
origFileName
[
firstDot
:
]
}
}
dataList
[
index
]
.
autoCodePath
=
filepath
.
Join
(
autoPath
,
trimBase
[
:
lastSeparator
],
autoCode
.
PackageName
,
dataList
[
index
]
.
autoCodePath
=
filepath
.
Join
(
autoPath
,
trimBase
[
:
lastSeparator
],
autoCode
.
PackageName
,
...
...
server/service/sys_autocode_history.go
0 → 100644
浏览文件 @
dac4e733
package
service
import
(
"errors"
"gin-vue-admin/global"
"gin-vue-admin/model"
"gin-vue-admin/utils"
"strings"
"go.uber.org/zap"
)
// CreateAutoCodeHistory RouterPath : RouterPath@RouterString;RouterPath2@RouterString2
func
CreateAutoCodeHistory
(
autoCodeMeta
string
,
injectionMeta
string
,
tableName
string
)
error
{
return
global
.
GVA_DB
.
Create
(
&
model
.
SysAutoCodeHistory
{
AutoCodeMeta
:
autoCodeMeta
,
InjectionMeta
:
injectionMeta
,
TableName
:
tableName
,
})
.
Error
}
func
RollBack
(
id
uint
)
error
{
md
:=
model
.
SysAutoCodeHistory
{}
if
err
:=
global
.
GVA_DB
.
First
(
&
md
,
id
)
.
Error
;
err
!=
nil
{
return
err
}
// 切分数据
err
,
dbNames
:=
GetTables
(
global
.
GVA_CONFIG
.
Mysql
.
Dbname
)
if
err
!=
nil
{
return
err
}
// 删除表
for
_
,
name
:=
range
dbNames
{
if
strings
.
Contains
(
strings
.
ToUpper
(
strings
.
Replace
(
name
.
TableName
,
"_"
,
""
,
-
1
)),
strings
.
ToUpper
(
md
.
TableName
))
{
// 删除表
if
err
=
DropTable
(
name
.
TableName
);
err
!=
nil
{
global
.
GVA_LOG
.
Error
(
"ClearTag DropTable:"
,
zap
.
Error
(
err
))
}
}
}
// 删除文件
for
_
,
path
:=
range
strings
.
Split
(
md
.
AutoCodeMeta
,
";"
)
{
_
=
utils
.
DeLFile
(
path
)
}
// 清除注入
for
_
,
v
:=
range
strings
.
Split
(
md
.
InjectionMeta
,
";"
)
{
// RouterPath@functionName@RouterString
meta
:=
strings
.
Split
(
v
,
"@"
)
if
len
(
meta
)
!=
3
{
return
errors
.
New
(
"split InjectionMeta Err"
)
}
_
=
utils
.
AutoClearCode
(
meta
[
0
],
meta
[
2
])
}
md
.
Flag
=
1
return
global
.
GVA_DB
.
Save
(
&
md
)
.
Error
}
server/service/sys_initdb.go
浏览文件 @
dac4e733
...
@@ -131,6 +131,7 @@ func InitDB(conf request.InitDB) error {
...
@@ -131,6 +131,7 @@ func InitDB(conf request.InitDB) error {
model
.
ExaSimpleUploader
{},
model
.
ExaSimpleUploader
{},
model
.
ExaCustomer
{},
model
.
ExaCustomer
{},
model
.
SysOperationRecord
{},
model
.
SysOperationRecord
{},
model
.
SysAutoCodeHistory
{},
)
)
if
err
!=
nil
{
if
err
!=
nil
{
global
.
GVA_DB
=
nil
global
.
GVA_DB
=
nil
...
...
server/utils/file_operations.go
浏览文件 @
dac4e733
...
@@ -42,6 +42,10 @@ Redirect:
...
@@ -42,6 +42,10 @@ Redirect:
return
os
.
Rename
(
src
,
dst
)
return
os
.
Rename
(
src
,
dst
)
}
}
func
DeLFile
(
filePath
string
)
error
{
return
os
.
RemoveAll
(
filePath
)
}
//@author: [songzhibin97](https://github.com/songzhibin97)
//@author: [songzhibin97](https://github.com/songzhibin97)
//@function: TrimSpace
//@function: TrimSpace
//@description: 去除结构体空格
//@description: 去除结构体空格
...
...
server/utils/injectionCode.go
浏览文件 @
dac4e733
package
utils
package
utils
import
(
import
(
"errors"
"fmt"
"fmt"
"go/ast"
"go/ast"
"go/parser"
"go/parser"
...
@@ -15,9 +16,18 @@ import (
...
@@ -15,9 +16,18 @@ import (
//@param: filepath string, funcName string, codeData string
//@param: filepath string, funcName string, codeData string
//@return: error
//@return: error
const
(
startComment
=
"Code generated by gin-vue-admin Begin; DO NOT EDIT."
endComment
=
"Code generated by gin-vue-admin End; DO NOT EDIT."
)
//@author: [LeonardWang](https://github.com/WangLeonard)
//@function: AutoInjectionCode
//@description: 向文件中固定注释位置写入代码
//@param: filepath string, funcName string, codeData string
//@return: error
func
AutoInjectionCode
(
filepath
string
,
funcName
string
,
codeData
string
)
error
{
func
AutoInjectionCode
(
filepath
string
,
funcName
string
,
codeData
string
)
error
{
startComment
:=
"Code generated by gin-vue-admin Begin; DO NOT EDIT."
endComment
:=
"Code generated by gin-vue-admin End; DO NOT EDIT."
srcData
,
err
:=
ioutil
.
ReadFile
(
filepath
)
srcData
,
err
:=
ioutil
.
ReadFile
(
filepath
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
...
@@ -141,3 +151,30 @@ func checkExist(srcData *[]byte, startPos int, endPos int, blockStmt *ast.BlockS
...
@@ -141,3 +151,30 @@ func checkExist(srcData *[]byte, startPos int, endPos int, blockStmt *ast.BlockS
}
}
return
false
return
false
}
}
func
AutoClearCode
(
filepath
string
,
codeData
string
)
error
{
srcData
,
err
:=
ioutil
.
ReadFile
(
filepath
)
if
err
!=
nil
{
return
err
}
srcData
,
err
=
cleanCode
(
codeData
,
string
(
srcData
))
if
err
!=
nil
{
return
err
}
return
ioutil
.
WriteFile
(
filepath
,
srcData
,
0600
)
}
func
cleanCode
(
clearCode
string
,
srcData
string
)
([]
byte
,
error
)
{
bf
:=
make
([]
rune
,
0
,
1024
)
for
i
,
v
:=
range
srcData
{
if
v
==
'\n'
{
if
strings
.
TrimSpace
(
string
(
bf
))
==
clearCode
{
return
append
([]
byte
(
srcData
[
:
i
-
len
(
bf
)]),
[]
byte
(
srcData
[
i
+
1
:
])
...
),
nil
}
bf
=
(
bf
)[
:
0
]
continue
}
bf
=
append
(
bf
,
v
)
}
return
[]
byte
(
srcData
),
errors
.
New
(
"未找到内容"
)
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录