
* beta:2.7.8-a 增加自动化创建树形结构 (#1941) * feat: 支持创建树形结构 --------- Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com> * 优化user store部分写法 * Update user.js * feat: 升级版本号 * Dev 278 beta2 (#1954) * 在关闭详情弹窗后 detailFrom为空对象,arr为undefined 使用slice控制台会报错 * 查询不重置pageSize * 优化主题模式相关内容 * 优化弹窗手机端显示 * bugfix:PostgreSQL initdb (#1953) * bugfix:postgresql增加显示指定template --------- Co-authored-by: PiexlMax(奇淼 <165128580+pixelmaxQm@users.noreply.github.com> --------- Co-authored-by: zayn <972858472@qq.com> Co-authored-by: Azir <2075125282@qq.com> Co-authored-by: Qing Liang <106448173+xue-ding-e@users.noreply.github.com> * docs:调整部分代码注释以及代码格式 * feat: 自动化代码字典支持多选 * fix:调整值接收器和指针接收器 * feat: 支持导出表格复制,优化增加方法页面。 * chore:初始化代码规范化。 --------- Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com> Co-authored-by: Azir <2075125282@qq.com> Co-authored-by: zayn <972858472@qq.com> Co-authored-by: Qing Liang <106448173+xue-ding-e@users.noreply.github.com> Co-authored-by: cjb <75364055@qq.com>
167 lines
3.6 KiB
Go
167 lines
3.6 KiB
Go
package ast
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"go/ast"
|
|
"go/parser"
|
|
"go/printer"
|
|
"go/token"
|
|
"os"
|
|
)
|
|
|
|
// AddRegisterTablesAst 自动为 gorm.go 注册一个自动迁移
|
|
func AddRegisterTablesAst(path, funcName, pk, varName, dbName, model string) {
|
|
modelPk := fmt.Sprintf("github.com/flipped-aurora/gin-vue-admin/server/model/%s", pk)
|
|
src, err := os.ReadFile(path)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
fileSet := token.NewFileSet()
|
|
astFile, err := parser.ParseFile(fileSet, "", src, 0)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
AddImport(astFile, modelPk)
|
|
FuncNode := FindFunction(astFile, funcName)
|
|
if FuncNode != nil {
|
|
ast.Print(fileSet, FuncNode)
|
|
}
|
|
addDBVar(FuncNode.Body, varName, dbName)
|
|
addAutoMigrate(FuncNode.Body, varName, pk, model)
|
|
var out []byte
|
|
bf := bytes.NewBuffer(out)
|
|
printer.Fprint(bf, fileSet, astFile)
|
|
|
|
os.WriteFile(path, bf.Bytes(), 0666)
|
|
}
|
|
|
|
// 增加一个 db库变量
|
|
func addDBVar(astBody *ast.BlockStmt, varName, dbName string) {
|
|
if dbName == "" {
|
|
return
|
|
}
|
|
dbStr := fmt.Sprintf("\"%s\"", dbName)
|
|
|
|
for i := range astBody.List {
|
|
if assignStmt, ok := astBody.List[i].(*ast.AssignStmt); ok {
|
|
if ident, ok := assignStmt.Lhs[0].(*ast.Ident); ok {
|
|
if ident.Name == varName {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
assignNode := &ast.AssignStmt{
|
|
Lhs: []ast.Expr{
|
|
&ast.Ident{
|
|
Name: varName,
|
|
},
|
|
},
|
|
Tok: token.DEFINE,
|
|
Rhs: []ast.Expr{
|
|
&ast.CallExpr{
|
|
Fun: &ast.SelectorExpr{
|
|
X: &ast.Ident{
|
|
Name: "global",
|
|
},
|
|
Sel: &ast.Ident{
|
|
Name: "GetGlobalDBByDBName",
|
|
},
|
|
},
|
|
Args: []ast.Expr{
|
|
&ast.BasicLit{
|
|
Kind: token.STRING,
|
|
Value: dbStr,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
astBody.List = append([]ast.Stmt{assignNode}, astBody.List...)
|
|
}
|
|
|
|
// 为db库变量增加 AutoMigrate 方法
|
|
func addAutoMigrate(astBody *ast.BlockStmt, dbname string, pk string, model string) {
|
|
if dbname == "" {
|
|
dbname = "db"
|
|
}
|
|
flag := true
|
|
ast.Inspect(astBody, func(node ast.Node) bool {
|
|
// 首先判断需要加入的方法调用语句是否存在 不存在则直接走到下方逻辑
|
|
switch n := node.(type) {
|
|
case *ast.CallExpr:
|
|
// 判断是否找到了AutoMigrate语句
|
|
if s, ok := n.Fun.(*ast.SelectorExpr); ok {
|
|
if x, ok := s.X.(*ast.Ident); ok {
|
|
if s.Sel.Name == "AutoMigrate" && x.Name == dbname {
|
|
flag = false
|
|
if !NeedAppendModel(n, pk, model) {
|
|
return false
|
|
}
|
|
// 判断已经找到了AutoMigrate语句
|
|
n.Args = append(n.Args, &ast.CompositeLit{
|
|
Type: &ast.SelectorExpr{
|
|
X: &ast.Ident{
|
|
Name: pk,
|
|
},
|
|
Sel: &ast.Ident{
|
|
Name: model,
|
|
},
|
|
},
|
|
})
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
//然后判断 pk.model是否存在 如果存在直接跳出 如果不存在 则向已经找到的方法调用语句的node里面push一条
|
|
})
|
|
|
|
if flag {
|
|
exprStmt := &ast.ExprStmt{
|
|
X: &ast.CallExpr{
|
|
Fun: &ast.SelectorExpr{
|
|
X: &ast.Ident{
|
|
Name: dbname,
|
|
},
|
|
Sel: &ast.Ident{
|
|
Name: "AutoMigrate",
|
|
},
|
|
},
|
|
Args: []ast.Expr{
|
|
&ast.CompositeLit{
|
|
Type: &ast.SelectorExpr{
|
|
X: &ast.Ident{
|
|
Name: pk,
|
|
},
|
|
Sel: &ast.Ident{
|
|
Name: model,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}}
|
|
astBody.List = append(astBody.List, exprStmt)
|
|
}
|
|
}
|
|
|
|
// NeedAppendModel 为automigrate增加实参
|
|
func NeedAppendModel(callNode ast.Node, pk string, model string) bool {
|
|
flag := true
|
|
ast.Inspect(callNode, func(node ast.Node) bool {
|
|
switch n := node.(type) {
|
|
case *ast.SelectorExpr:
|
|
if x, ok := n.X.(*ast.Ident); ok {
|
|
if n.Sel.Name == model && x.Name == pk {
|
|
flag = false
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
})
|
|
return flag
|
|
}
|