签入脚本

This commit is contained in:
小蚂蚁云
2026-10-20 11:37:25 +08:00
commit 7f5e8470af
909 changed files with 4045080 additions and 0 deletions
+125
View File
@@ -0,0 +1,125 @@
// Command generator 代码生成命令行
//
// 用法(仓库根目录执行):
//
// go run ./cmd/generator -tables "goframe_order|订单表,goframe_sku|商品规格" # 一键生成(文件+菜单+字典+路由)
// go run ./cmd/generator -tables "goframe_order|订单表" -preview # 仅预览渲染结果
// go run ./cmd/generator -tables "goframe_order|订单表" -batch # 批量模式逐表统计
//
// 覆盖模式由配置 generator.overwrite 统一控制(true=生成即覆盖;false/缺省=缺失补生成、存在跳过)。
// 生成后需手动执行:go build ./...
package main
import (
"flag"
"fmt"
"os"
"strings"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
_ "github.com/gogf/gf/contrib/drivers/mssql/v2"
_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
_ "github.com/gogf/gf/contrib/drivers/oracle/v2"
_ "github.com/gogf/gf/contrib/drivers/pgsql/v2"
_ "github.com/gogf/gf/contrib/drivers/sqlite/v2"
"easygoadmin/api/v1"
_ "easygoadmin/internal/logic" // 注册全部业务服务(init)
"easygoadmin/internal/service"
)
// main 代码生成命令行入口
// 解析命令行参数后,按预览、批量或一键生成模式执行代码生成
func main() {
tables := flag.String("tables", "", "表列表,格式: 表名|表注释,表名|表注释(与前端一键生成入参一致)")
preview := flag.Bool("preview", false, "仅预览渲染结果,不写文件、不建菜单/字典/路由")
batch := flag.Bool("batch", false, "批量模式(逐表统计输出)")
flag.Parse()
ctx := gctx.New()
// 解析目标表列表,为空时打印用法并退出
list := splitTables(*tables)
if len(list) == 0 {
flag.Usage()
fmt.Println("\n示例: go run ./cmd/generator -tables \"goframe_order|订单表\"")
os.Exit(2)
}
g.Log().Infof(ctx, "目标表 %d 张: %v", len(list), list)
switch {
// 预览模式:仅渲染并输出文件清单,不落盘
case *preview:
res, err := service.Generator().Preview(ctx, &v1.GeneratorPreviewReq{TableNames: list})
if err != nil {
fatal("预览失败: %v", err)
}
for _, f := range res.List {
fmt.Printf("── %s (%d bytes)\n", f.Path, len(f.Content))
}
fmt.Printf("预览完成:共 %d 个文件\n", len(res.List))
// 批量模式:逐表生成并输出各表统计结果
case *batch:
res, err := service.Generator().BatchGenerate(ctx, &v1.GeneratorBatchGenerateReq{TableNames: list})
if err != nil {
fatal("批量生成失败: %v", err)
}
for _, item := range res.List {
mark := "OK"
if !item.Success {
mark = "FAIL"
}
fmt.Printf("[%s] %s — %s | 菜单:%s | 路由:%s\n",
mark, item.Table, item.Message, item.Menu.Message, item.Route.Message)
for _, d := range item.Dict {
fmt.Printf(" 字典 %s: %s\n", d.Dict, d.Status)
}
}
// 默认模式:一键生成文件、菜单、字典与路由
default:
res, err := service.Generator().Generate(ctx, &v1.GeneratorGenerateReq{TableNames: list})
if err != nil {
fatal("生成失败: %v", err)
}
for _, p := range res.Generated {
fmt.Println(" + 生成", p)
}
for _, p := range res.Skipped {
fmt.Println(" - 跳过", p)
}
for _, p := range res.Overwritten {
fmt.Println(" * 覆盖", p)
}
for _, p := range res.Failed {
fmt.Println(" ! 失败", p)
}
fmt.Println(" 菜单:", res.Menu.Message)
for _, d := range res.Dict {
fmt.Printf(" 字典 %s: %s\n", d.Dict, d.Status)
}
fmt.Println(" 路由:", res.Route.Message)
fmt.Println("下一步: go build ./... 并重启服务")
}
}
// fatal 输出错误信息并终止进程
func fatal(format string, args ...any) {
fmt.Fprintf(os.Stderr, format+"\n", args...)
os.Exit(1)
}
// splitTables 解析表列表参数
// 按逗号分隔并去除空白项,返回有效的表列表
func splitTables(raw string) []string {
out := []string{}
for _, item := range strings.Split(raw, ",") {
if s := strings.TrimSpace(item); s != "" {
out = append(out, s)
}
}
return out
}
+95
View File
@@ -0,0 +1,95 @@
// Command migrator 整库迁移命令行
//
// 用法(仓库根目录执行):
//
// go run ./cmd/migrator \
// -src-type=mysql -src-host=127.0.0.1 -src-hostport=3306 \
// -src-database=easygoadmin.goframe.elevue -src-username=root -src-password=root \
// -dst-type=pgsql -dst-host=127.0.0.1 -dst-hostport=5432 \
// -dst-database=easygoadmin.goframe.elevue -dst-username=postgres -dst-password=123456 \
// -drop-target-first
//
// 可选:-tables "goframe_user,goframe_level"(只迁指定表)、-batch-size=1000(数据批大小)
package main
import (
"flag"
"fmt"
"os"
"strings"
"github.com/gogf/gf/v2/os/gctx"
_ "github.com/gogf/gf/contrib/drivers/mssql/v2"
_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
_ "github.com/gogf/gf/contrib/drivers/oracle/v2"
_ "github.com/gogf/gf/contrib/drivers/pgsql/v2"
_ "github.com/gogf/gf/contrib/drivers/sqlite/v2"
"easygoadmin/internal/migrate"
)
func main() {
// 源库连接要素
srcType := flag.String("src-type", "mysql", "源库类型:mysql/pgsql/sqlite/mssql/oracle")
srcHost := flag.String("src-host", "127.0.0.1", "源库地址")
srcPort := flag.String("src-hostport", "3306", "源库端口")
srcDB := flag.String("src-database", "", "源库库名(sqlite 填文件路径)")
srcUser := flag.String("src-username", "root", "源库用户名")
srcPass := flag.String("src-password", "", "源库密码")
// 目标库连接要素
dstType := flag.String("dst-type", "pgsql", "目标库类型:mysql/pgsql/sqlite/mssql/oracle")
dstHost := flag.String("dst-host", "127.0.0.1", "目标库地址")
dstPort := flag.String("dst-hostport", "5432", "目标库端口")
dstDB := flag.String("dst-database", "", "目标库库名(sqlite 填文件路径)")
dstUser := flag.String("dst-username", "postgres", "目标库用户名")
dstPass := flag.String("dst-password", "", "目标库密码")
// 迁移行为
dropFirst := flag.Bool("drop-target-first", false, "迁移前清空目标库全部表")
tables := flag.String("tables", "", "只迁指定表(逗号分隔,留空迁全部)")
batchSize := flag.Int("batch-size", 1000, "数据搬运批大小")
flag.Parse()
if *srcDB == "" || *dstDB == "" {
flag.Usage()
fmt.Fprintln(os.Stderr, "\n示例: go run ./cmd/migrator -src-database=easygoadmin -dst-database=easygoadmin -drop-target-first")
os.Exit(2)
}
ctx := gctx.New()
opt := migrate.Options{
Src: migrate.DSN{
Type: *srcType, Host: *srcHost, Port: *srcPort,
Database: *srcDB, Username: *srcUser, Password: *srcPass,
},
Dst: migrate.DSN{
Type: *dstType, Host: *dstHost, Port: *dstPort,
Database: *dstDB, Username: *dstUser, Password: *dstPass,
},
DropTargetFirst: *dropFirst,
Tables: splitList(*tables),
BatchSize: *batchSize,
}
_, err := migrate.Run(ctx, opt, func(format string, args ...any) {
fmt.Printf(format, args...)
})
if err != nil {
fmt.Fprintf(os.Stderr, "\n迁移失败: %v\n", err)
os.Exit(1)
}
}
// splitList 逗号分隔列表拆分(去空白)
func splitList(raw string) []string {
if strings.TrimSpace(raw) == "" {
return nil
}
out := make([]string, 0)
for _, item := range strings.Split(raw, ",") {
if s := strings.TrimSpace(item); s != "" {
out = append(out, s)
}
}
return out
}