sys_initdb.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package service
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "gin-vue-admin/global"
  6. "gin-vue-admin/model"
  7. "gin-vue-admin/model/request"
  8. "gin-vue-admin/source"
  9. "github.com/spf13/viper"
  10. "gorm.io/driver/mysql"
  11. "gorm.io/gorm"
  12. "path/filepath"
  13. )
  14. //@author: [songzhibin97](https://github.com/songzhibin97)
  15. //@function: writeConfig
  16. //@description: 回写配置
  17. //@param:
  18. //@return: error
  19. func writeConfig(viper *viper.Viper, conf map[string]interface{}) error {
  20. for k, v := range conf {
  21. viper.Set(k, v)
  22. }
  23. return viper.WriteConfig()
  24. }
  25. //@author: [songzhibin97](https://github.com/songzhibin97)
  26. //@function: createTable
  27. //@description: 创建数据库(mysql)
  28. //@param: dsn string, driver string, createSql
  29. //@return: error
  30. func createTable(dsn string, driver string, createSql string) error {
  31. db, err := sql.Open(driver, dsn)
  32. if err != nil {
  33. return err
  34. }
  35. defer db.Close()
  36. if err = db.Ping(); err != nil {
  37. return err
  38. }
  39. _, err = db.Exec(createSql)
  40. return err
  41. }
  42. func initDB(InitDBFunctions ...model.InitDBFunc) (err error) {
  43. for _, v := range InitDBFunctions {
  44. err = v.Init()
  45. if err != nil {
  46. return err
  47. }
  48. }
  49. return nil
  50. }
  51. //@author: [songzhibin97](https://github.com/songzhibin97)
  52. //@function: InitDB
  53. //@description: 创建数据库并初始化
  54. //@param: authorityId string
  55. //@return: err error, treeMap map[string][]model.SysMenu
  56. func InitDB(conf request.InitDB) error {
  57. baseSetting := map[string]interface{}{
  58. "mysql.path": "",
  59. "mysql.db-name": "",
  60. "mysql.username": "",
  61. "mysql.password": "",
  62. "mysql.config": "charset=utf8mb4&parseTime=True&loc=Local",
  63. }
  64. if conf.Host == "" {
  65. conf.Host = "127.0.0.1"
  66. }
  67. if conf.Port == "" {
  68. conf.Port = "3306"
  69. }
  70. dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/", conf.UserName, conf.Password, conf.Host, conf.Port)
  71. fmt.Println(dsn)
  72. createSql := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;", conf.DBName)
  73. if err := createTable(dsn, "mysql", createSql); err != nil {
  74. return err
  75. }
  76. setting := map[string]interface{}{
  77. "mysql.path": fmt.Sprintf("%s:%s", conf.Host, conf.Port),
  78. "mysql.db-name": conf.DBName,
  79. "mysql.username": conf.UserName,
  80. "mysql.password": conf.Password,
  81. "mysql.config": "charset=utf8mb4&parseTime=True&loc=Local",
  82. }
  83. if err := writeConfig(global.GVA_VP, setting); err != nil {
  84. return err
  85. }
  86. m := global.GVA_CONFIG.Mysql
  87. if m.Dbname == "" {
  88. return nil
  89. }
  90. linkDns := m.Username + ":" + m.Password + "@tcp(" + m.Path + ")/" + m.Dbname + "?" + m.Config
  91. mysqlConfig := mysql.Config{
  92. DSN: linkDns, // DSN data source name
  93. DefaultStringSize: 191, // string 类型字段的默认长度
  94. DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
  95. DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
  96. DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
  97. SkipInitializeWithVersion: false, // 根据版本自动配置
  98. }
  99. if db, err := gorm.Open(mysql.New(mysqlConfig), &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}); err != nil {
  100. //global.GVA_LOG.Error("MySQL启动异常", zap.Any("err", err))
  101. //os.Exit(0)
  102. //return nil
  103. return nil
  104. } else {
  105. sqlDB, _ := db.DB()
  106. sqlDB.SetMaxIdleConns(m.MaxIdleConns)
  107. sqlDB.SetMaxOpenConns(m.MaxOpenConns)
  108. global.GVA_DB = db
  109. }
  110. err := global.GVA_DB.AutoMigrate(
  111. model.SysUser{},
  112. model.SysAuthority{},
  113. model.SysApi{},
  114. model.SysBaseMenu{},
  115. model.SysBaseMenuParameter{},
  116. model.JwtBlacklist{},
  117. model.SysDictionary{},
  118. model.SysDictionaryDetail{},
  119. model.ExaFileUploadAndDownload{},
  120. model.ExaFile{},
  121. model.ExaFileChunk{},
  122. model.ExaSimpleUploader{},
  123. model.ExaCustomer{},
  124. model.SysOperationRecord{},
  125. )
  126. if err != nil {
  127. return err
  128. }
  129. err = initDB(
  130. source.Admin,
  131. source.Api,
  132. source.AuthorityMenu,
  133. source.Authority,
  134. source.AuthoritiesMenus,
  135. source.Casbin,
  136. source.DataAuthorities,
  137. source.Dictionary,
  138. source.DictionaryDetail,
  139. source.File,
  140. source.BaseMenu)
  141. if err != nil {
  142. _ = writeConfig(global.GVA_VP, baseSetting)
  143. return err
  144. }
  145. global.GVA_CONFIG.AutoCode.Root, _ = filepath.Abs("..")
  146. return nil
  147. }