package initialize import ( "context" commonModel "git.echol.cn/loser/Go-Web-Template/server/model/common" sysModel "git.echol.cn/loser/Go-Web-Template/server/model/system" "git.echol.cn/loser/Go-Web-Template/server/service/system" adapter "github.com/casbin/gorm-adapter/v3" "gorm.io/gorm" ) const initOrderEnsureTables = system.InitOrderExternal - 1 type ensureTables struct{} // auto run func init() { system.RegisterInit(initOrderEnsureTables, &ensureTables{}) } func (e *ensureTables) InitializerName() string { return "ensure_tables_created" } func (e *ensureTables) InitializeData(ctx context.Context) (next context.Context, err error) { return ctx, nil } func (e *ensureTables) DataInserted(ctx context.Context) bool { return true } func (e *ensureTables) MigrateTable(ctx context.Context) (context.Context, error) { db, ok := ctx.Value("db").(*gorm.DB) if !ok { return ctx, system.ErrMissingDBContext } tables := []interface{}{ sysModel.SysApi{}, sysModel.SysUser{}, sysModel.SysBaseMenu{}, sysModel.SysAuthority{}, sysModel.JwtBlacklist{}, sysModel.SysDictionary{}, sysModel.SysOperationRecord{}, sysModel.SysDictionaryDetail{}, sysModel.SysBaseMenuParameter{}, sysModel.SysBaseMenuBtn{}, sysModel.SysAuthorityBtn{}, sysModel.SysParams{}, sysModel.SysError{}, sysModel.SysLoginLog{}, sysModel.SysApiToken{}, adapter.CasbinRule{}, commonModel.ExaFile{}, commonModel.ExaFileChunk{}, commonModel.ExaFileUploadAndDownload{}, commonModel.ExaAttachmentCategory{}, } for _, t := range tables { _ = db.AutoMigrate(&t) // 视图 authority_menu 会被当成表来创建,引发冲突错误(更新版本的gorm似乎不会) // 由于 AutoMigrate() 基本无需考虑错误,因此显式忽略 } return ctx, nil } func (e *ensureTables) TableCreated(ctx context.Context) bool { db, ok := ctx.Value("db").(*gorm.DB) if !ok { return false } tables := []interface{}{ sysModel.SysApi{}, sysModel.SysUser{}, sysModel.SysBaseMenu{}, sysModel.SysAuthority{}, sysModel.JwtBlacklist{}, sysModel.SysDictionary{}, sysModel.SysOperationRecord{}, sysModel.SysDictionaryDetail{}, sysModel.SysBaseMenuParameter{}, sysModel.SysBaseMenuBtn{}, sysModel.SysAuthorityBtn{}, adapter.CasbinRule{}, commonModel.ExaFile{}, commonModel.ExaFileChunk{}, commonModel.ExaFileUploadAndDownload{}, commonModel.ExaAttachmentCategory{}, } yes := true for _, t := range tables { yes = yes && db.Migrator().HasTable(t) } return yes }