gin框架实践[Go-Gin_Api]2.0 工具篇

1,995 阅读3分钟

Hello,我是Rocket

这是我参与更文挑战的第1天,活动详情查看:2021最后一次更文挑战

引言

  • 新增了cmd工具,能支持生成读取mysql表生成Model、以及初始化表和表数据,源码就在项目里
  • github传送门
  • 喜欢的铁子们给点个star

1、make:model 支持读取mysql生成Model

代码在项目cmd/make-model.go

package main

import (
	"go-api/core"
	"go-api/global"
	"go-api/initialize"
	"go-api/tool"

	cmd "github.com/18211167516/go-cmd"
)

// versionCmd represents the version command
var structCmd = &cmd.Command{
	Use:   "make:model",
	Short: "mysqlstruct",
	Long:  `读取mysql的表结构转成Model文件`,
	Run: func(Command *cmd.Command, args []string) {

		table, _ := Command.Flags().GetString("table")
		prefix, _ := Command.Flags().GetString("prefix")
		file, _ := Command.Flags().GetString("file")
		global.VP = core.Viper("../static/config/app.toml") //初始化配置
		dsn := initialize.GetMasterDsn()

		vip := core.Viper("./config/cmd.toml")
		config := &tool.T2tConfig{
			StructNameRtrims: vip.GetBool("StructNameRtrims"),//默认去除表名尾部s字符
			UcFirstOnly:      vip.GetBool("UcFirstOnly"),//
			SavePath:         vip.GetString("SavePath"),保存目录名
		}
		grom := tool.NewTable2Struct(config)
		grom.
			Table(table).
			Prefix(prefix).
			SavePath(file).
			Dsn(dsn).
			Run()
	},
}

func init() {
	cmd.RootCmd.AddCommand(structCmd)
	structCmd.Flags().StringP("table", "t", "", "指定的表名,如果未指定则全部导出")
	structCmd.Flags().StringP("prefix", "p", "", "表前缀")
	structCmd.Flags().StringP("file", "f", "", "生成的目录")//如果不传默认会走配置文件SavePath
}

主要调用tool下table2struct.go

//1、校验mysql链接
//2、检测文件夹是否存在,不存在就创建目录
//3、获取表信息
//4、循环执行生成model

我们做了一个比较有意思的处理;

type SysRule struct {
	ID        int            `gorm:"primary_key" json:"id" uri:"id"`
	CreatedAt XTime          `json:"created_at" gorm:"autoCreateTime"`
	UpdatedAt XTime          `json:"updated_at" gorm:"autoUpdateTime" `
	DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index"`
	Role_name string `desc:"角色名称" json:"role_name" form:"role_name" gorm:"comment:角色名称;not null"`
	Role_desc string `desc:"角色描述" json:"role_desc" form:"role_desc" gorm:"comment:角色描述;not null"`
	Status    *int   `desc:"角色状态" json:"status" form:"status" gorm:"type:tinyint;size:1;default:1;comment:角色状态;"`
}

如果包含id,created_at,updated_at,deleted_at会合并成下边的model

type SysRule struct {
	Model
	Role_name string `desc:"角色名称" json:"role_name" form:"role_name" gorm:"comment:角色名称;not null"`
	Role_desc string `desc:"角色描述" json:"role_desc" form:"role_desc" gorm:"comment:角色描述;not null"`
	Status    *int   `desc:"角色状态" json:"status" form:"status" gorm:"type:tinyint;size:1;default:1;comment:角色状态;"`
}

2、initdb 初始化表和表数据

代码在项目cmd/initdb.go

//初始化表结构
//初始化默认数据
//具体代码请看源码

3、make:mysql 通过识别model生成mysql数据表

代码在项目cmd/make-mysql.go

1、在app/models/mysql.go 新增map用户存储实例化model的方法

var AutoMigratFunc = make(map[string]func() interface{})

2、参考app/models/test.go 主要靠init方法注册


type Test struct {
	Model
	Name string `desc:"菜单name" json:"name" form:"name" gorm:"comment:名称;not null"`
	Sort int    `desc:"菜单排序值" json:"sort" form:"sort" gorm:"type:int;size:10;default:1;comment:排序标记;not null"`
}

func init() {
	AutoMigratFunc["test"] = func() interface{} {
		return Test{}
	}
}

3、具体生成方法 cmd/initdata/init.go AutoMigrate方法

func AutoMigrate(db *gorm.DB, table string) {

	if db.Migrator().HasTable(table) {
		log.Printf("[make:mysql]-->数据表【%s】已存在\n", table)
		os.Exit(0)
	}

	if value, ok := models.AutoMigratFunc[table]; !ok {
		log.Printf("make:mysql-->数据表【%s】没有定义model层init方法初始化struct\n", table)
		os.Exit(0)
	} else {
		if err := db.AutoMigrate(value()); err != nil {
			log.Printf("[make:mysql]-->生成数据表【%s】失败,err: %v\n", table, err)
			os.Exit(0)
		}
	}

	log.Println("[make:mysql]-->生成数据表【%s】成功", table)

}

4、后续计划

计划支持支持生成controller、service、view

5. 系列文章