diff --git a/.gitignore b/.gitignore index 9ee84eb0..9d01d915 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ config/settings.dev.b.yml temp/logs config/settings.dev.yml.log config/settings.b.dev.yml +cmd/migrate/migration/version-local/* diff --git a/cmd/migrate/migration/init.go b/cmd/migrate/migration/init.go new file mode 100644 index 00000000..635dd43d --- /dev/null +++ b/cmd/migrate/migration/init.go @@ -0,0 +1,54 @@ +package migration + +import ( + "gorm.io/gorm" + "log" + "sort" +) + +var Migrate = &Migration{ + version: make(map[string]func(db *gorm.DB, version string) error), +} + +type Migration struct { + db *gorm.DB + version map[string]func(db *gorm.DB, version string) error +} + +func (e *Migration) GetDb() *gorm.DB { + return e.db +} + +func (e *Migration) SetDb(db *gorm.DB) { + e.db = db +} + +func (e *Migration) SetVersion(k string, f func(db *gorm.DB, version string) error) { + e.version[k] = f +} + +func (e *Migration) Migrate() { + versions := make([]string, 0) + for k := range e.version { + versions = append(versions, k) + } + sort.StringsAreSorted(versions) + log.Println(versions) + var err error + var count int64 + for _, v := range versions { + err = e.db.Table("sys_migration").Where("version = ?", v).Count(&count).Error + if err != nil { + log.Fatalln(err) + } + if count > 0 { + log.Println(count) + count = 0 + continue + } + err = (e.version[v])(e.db, v) + if err != nil { + log.Fatalln(err) + } + } +} diff --git a/cmd/migrate/migration/version/1599190683659_tables.go b/cmd/migrate/migration/version/1599190683659_tables.go new file mode 100644 index 00000000..d7a34c64 --- /dev/null +++ b/cmd/migrate/migration/version/1599190683659_tables.go @@ -0,0 +1,52 @@ +package version + +import ( + "go-admin/app/admin/models" + "go-admin/app/admin/models/tools" + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" + "gorm.io/gorm" + "path/filepath" + "runtime" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + fileName = filepath.Base(fileName) + fileName = fileName[:len(fileName)-3] + migration.Migrate.SetVersion(fileName, _1599190683659Tables) +} + +func _1599190683659Tables(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + // + err := tx.Migrator().AutoMigrate( + new(models.CasbinRule), + new(models.SysDept), + new(models.SysConfig), + new(tools.SysTables), + new(tools.SysColumns), + new(models.Menu), + new(models.LoginLog), + new(models.SysOperLog), + new(models.RoleMenu), + new(models.SysRoleDept), + new(models.SysUser), + new(models.SysRole), + new(models.Post), + new(models.DictData), + new(models.DictType), + new(models.SysJob), + new(models.SysConfig), + new(models.SysSetting), + new(models.SysFileDir), + new(models.SysCategory), + new(models.SysContent)) + if err != nil { + return err + } + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/migration/version/1599190683660_migrate.go b/cmd/migrate/migration/version/1599190683660_migrate.go new file mode 100644 index 00000000..683c0c8a --- /dev/null +++ b/cmd/migrate/migration/version/1599190683660_migrate.go @@ -0,0 +1,108 @@ +package version + +import ( + "go-admin/app/admin/models" + "go-admin/cmd/migrate/migration" + common "go-admin/common/models" + "gorm.io/gorm" + "path/filepath" + "runtime" +) + +func init() { + _, fileName, _, _ := runtime.Caller(0) + fileName = filepath.Base(fileName) + fileName = fileName[:len(fileName)-3] + migration.Migrate.SetVersion(fileName, _1599190683660Test) +} + +func _1599190683660Test(db *gorm.DB, version string) error { + return db.Transaction(func(tx *gorm.DB) error { + var err error + + list := []models.CasbinRule{ + {"p", "admin", "/api/v1/menulist", "GET", "", "", ""}, + {"p", "admin", "/api/v1/menu", "POST", "", "", ""}, + {"p", "admin", "/api/v1/dict/databytype/", "GET", "", "", ""}, + {"p", "admin", "/api/v1/menu", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/menu/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/sysUserList", "GET", "", "", ""}, + {"p", "admin", "/api/v1/sysUser/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/sysUser/", "GET", "", "", ""}, + {"p", "admin", "/api/v1/sysUser", "POST", "", "", ""}, + {"p", "admin", "/api/v1/sysUser", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/sysUser/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/user/profile", "GET", "", "", ""}, + {"p", "admin", "/api/v1/rolelist", "GET", "", "", ""}, + {"p", "admin", "/api/v1/role/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/role", "POST", "", "", ""}, + {"p", "admin", "/api/v1/role", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/role/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/configList", "GET", "", "", ""}, + {"p", "admin", "/api/v1/config/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/config", "POST", "", "", ""}, + {"p", "admin", "/api/v1/config", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/config/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/menurole", "GET", "", "", ""}, + {"p", "admin", "/api/v1/roleMenuTreeselect/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/menuTreeselect", "GET", "", "", ""}, + {"p", "admin", "/api/v1/rolemenu", "GET", "", "", ""}, + {"p", "admin", "/api/v1/rolemenu", "POST", "", "", ""}, + {"p", "admin", "/api/v1/rolemenu/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/deptList", "GET", "", "", ""}, + {"p", "admin", "/api/v1/dept/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/dept", "POST", "", "", ""}, + {"p", "admin", "/api/v1/dept", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/dept/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/dict/datalist", "GET", "", "", ""}, + {"p", "admin", "/api/v1/dict/data/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/dict/databytype/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/dict/data", "POST", "", "", ""}, + {"p", "admin", "/api/v1/dict/data/", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/dict/data/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/dict/typelist", "GET", "", "", ""}, + {"p", "admin", "/api/v1/dict/type/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/dict/type", "POST", "", "", ""}, + {"p", "admin", "/api/v1/dict/type", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/dict/type/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/postlist", "GET", "", "", ""}, + {"p", "admin", "/api/v1/post/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/post", "POST", "", "", ""}, + {"p", "admin", "/api/v1/post", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/post/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/menu/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/menuids", "GET", "", "", ""}, + {"p", "admin", "/api/v1/loginloglist", "GET", "", "", ""}, + {"p", "admin", "/api/v1/loginlog/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/operloglist", "GET", "", "", ""}, + {"p", "admin", "/api/v1/getinfo", "GET", "", "", ""}, + {"p", "admin", "/api/v1/roledatascope", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/roleDeptTreeselect/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/deptTree", "GET", "", "", ""}, + {"p", "admin", "/api/v1/configKey/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/logout", "POST", "", "", ""}, + {"p", "admin", "/api/v1/user/avatar", "POST", "", "", ""}, + {"p", "admin", "/api/v1/user/pwd", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/dict/typeoptionselect", "GET", "", "", ""}, + {"p", "admin", "/api/v1/sysjobList", "GET", "", "", ""}, + {"p", "admin", "/api/v1/sysjob/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/sysjob", "POST", "", "", ""}, + {"p", "admin", "/api/v1/sysjob", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/sysjob/:id", "DELETE", "", "", ""}, + {"p", "admin", "/api/v1/syssettingList", "GET", "", "", ""}, + {"p", "admin", "/api/v1/syssetting/:id", "GET", "", "", ""}, + {"p", "admin", "/api/v1/syssetting", "POST", "", "", ""}, + {"p", "admin", "/api/v1/syssetting", "PUT", "", "", ""}, + {"p", "admin", "/api/v1/syssetting/:id", "DELETE", "", "", ""}, + } + + err = db.Create(list).Error + if err != nil { + return err + } + + return tx.Create(&common.Migration{ + Version: version, + }).Error + }) +} diff --git a/cmd/migrate/server.go b/cmd/migrate/server.go index a935bb3c..c2135f9d 100644 --- a/cmd/migrate/server.go +++ b/cmd/migrate/server.go @@ -2,13 +2,12 @@ package migrate import ( "fmt" - "github.com/spf13/cobra" - - "go-admin/app/admin/models" - "go-admin/app/admin/models/gorm" + "go-admin/cmd/migrate/migration" + _ "go-admin/cmd/migrate/migration/version" "go-admin/common/database" "go-admin/common/global" + "go-admin/common/models" "go-admin/pkg/logger" "go-admin/tools/config" ) @@ -41,12 +40,13 @@ func run() { //3. 初始化数据库链接 database.Setup(config.DatabaseConfig.Driver) //4. 数据库迁移 + fmt.Println("数据库迁移开始") _ = migrateModel() - fmt.Println("数据库结构初始化成功!") + //fmt.Println("数据库结构初始化成功!") //5. 数据初始化完成 - if err := models.InitDb(); err != nil { - global.Logger.Fatalf("数据库基础数据初始化失败!error: %v ", err) - } + //if err := models.InitDb(); err != nil { + // global.Logger.Fatalf("数据库基础数据初始化失败!error: %v ", err) + //} usage = `数据库基础数据初始化成功` fmt.Println(usage) } @@ -55,7 +55,11 @@ func migrateModel() error { if config.DatabaseConfig.Driver == "mysql" { global.Eloquent.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4") } - err := gorm.AutoMigrate(global.Eloquent) - //gorm.InitData(global.Eloquent) + err := global.Eloquent.Debug().AutoMigrate(&models.Migration{}) + if err != nil { + return err + } + migration.Migrate.SetDb(global.Eloquent.Debug()) + migration.Migrate.Migrate() return err } diff --git a/common/models/migrate.go b/common/models/migrate.go new file mode 100644 index 00000000..0a70d042 --- /dev/null +++ b/common/models/migrate.go @@ -0,0 +1,12 @@ +package models + +import "time" + +type Migration struct { + Version string `gorm:"primary_key"` + ApplyTime time.Time `gorm:"autoCreateTime"` +} + +func (Migration) TableName() string { + return "sys_migration" +}