apimain.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package main
  2. import (
  3. "Gwen/config"
  4. "Gwen/global"
  5. "Gwen/http"
  6. "Gwen/lib/cache"
  7. "Gwen/lib/lock"
  8. "Gwen/lib/logger"
  9. "Gwen/lib/orm"
  10. "Gwen/lib/upload"
  11. "Gwen/model"
  12. "Gwen/service"
  13. "fmt"
  14. "github.com/go-redis/redis/v8"
  15. "github.com/nicksnyder/go-i18n/v2/i18n"
  16. )
  17. // @title 管理系统API
  18. // @version 1.0
  19. // @description 接口
  20. // @basePath /api
  21. // @securityDefinitions.apikey token
  22. // @in header
  23. // @name api-token
  24. // @securitydefinitions.apikey BearerAuth
  25. // @in header
  26. // @name Authorization
  27. func main() {
  28. //配置解析
  29. global.Viper = config.Init(&global.Config)
  30. //日志
  31. global.Logger = logger.New(&logger.Config{
  32. Path: global.Config.Logger.Path,
  33. Level: global.Config.Logger.Level,
  34. ReportCaller: global.Config.Logger.ReportCaller,
  35. })
  36. global.InitI18n()
  37. //redis
  38. global.Redis = redis.NewClient(&redis.Options{
  39. Addr: global.Config.Redis.Addr,
  40. Password: global.Config.Redis.Password,
  41. DB: global.Config.Redis.Db,
  42. })
  43. //cache
  44. if global.Config.Cache.Type == cache.TypeFile {
  45. fc := cache.NewFileCache()
  46. fc.SetDir(global.Config.Cache.FileDir)
  47. global.Cache = fc
  48. } else if global.Config.Cache.Type == cache.TypeRedis {
  49. global.Cache = cache.NewRedis(&redis.Options{
  50. Addr: global.Config.Cache.RedisAddr,
  51. Password: global.Config.Cache.RedisPwd,
  52. DB: global.Config.Cache.RedisDb,
  53. })
  54. }
  55. //gorm
  56. if global.Config.Gorm.Type == config.TypeMysql {
  57. dns := global.Config.Mysql.Username + ":" + global.Config.Mysql.Password + "@(" + global.Config.Mysql.Addr + ")/" + global.Config.Mysql.Dbname + "?charset=utf8mb4&parseTime=True&loc=Local"
  58. global.DB = orm.NewMysql(&orm.MysqlConfig{
  59. Dns: dns,
  60. MaxIdleConns: global.Config.Gorm.MaxIdleConns,
  61. MaxOpenConns: global.Config.Gorm.MaxOpenConns,
  62. })
  63. } else {
  64. //sqlite
  65. global.DB = orm.NewSqlite(&orm.SqliteConfig{
  66. MaxIdleConns: global.Config.Gorm.MaxIdleConns,
  67. MaxOpenConns: global.Config.Gorm.MaxOpenConns,
  68. })
  69. }
  70. DatabaseAutoUpdate()
  71. //validator
  72. global.ApiInitValidator()
  73. //oss
  74. global.Oss = &upload.Oss{
  75. AccessKeyId: global.Config.Oss.AccessKeyId,
  76. AccessKeySecret: global.Config.Oss.AccessKeySecret,
  77. Host: global.Config.Oss.Host,
  78. CallbackUrl: global.Config.Oss.CallbackUrl,
  79. ExpireTime: global.Config.Oss.ExpireTime,
  80. MaxByte: global.Config.Oss.MaxByte,
  81. }
  82. //jwt
  83. //fmt.Println(global.Config.Jwt.PrivateKey)
  84. //global.Jwt = jwt.NewJwt(global.Config.Jwt.PrivateKey, global.Config.Jwt.ExpireDuration*time.Second)
  85. //locker
  86. global.Lock = lock.NewLocal()
  87. //gin
  88. http.ApiInit()
  89. }
  90. func DatabaseAutoUpdate() {
  91. version := 245
  92. db := global.DB
  93. if global.Config.Gorm.Type == config.TypeMysql {
  94. //检查存不存在数据库,不存在则创建
  95. dbName := db.Migrator().CurrentDatabase()
  96. fmt.Println("dbName", dbName)
  97. if dbName == "" {
  98. dbName = global.Config.Mysql.Dbname
  99. // 移除 DSN 中的数据库名称,以便初始连接时不指定数据库
  100. dsnWithoutDB := global.Config.Mysql.Username + ":" + global.Config.Mysql.Password + "@(" + global.Config.Mysql.Addr + ")/?charset=utf8mb4&parseTime=True&loc=Local"
  101. //新链接
  102. dbWithoutDB := orm.NewMysql(&orm.MysqlConfig{
  103. Dns: dsnWithoutDB,
  104. })
  105. // 获取底层的 *sql.DB 对象,并确保在程序退出时关闭连接
  106. sqlDBWithoutDB, err := dbWithoutDB.DB()
  107. if err != nil {
  108. fmt.Printf("获取底层 *sql.DB 对象失败: %v\n", err)
  109. return
  110. }
  111. defer func() {
  112. if err := sqlDBWithoutDB.Close(); err != nil {
  113. fmt.Printf("关闭连接失败: %v\n", err)
  114. }
  115. }()
  116. err = dbWithoutDB.Exec("CREATE DATABASE IF NOT EXISTS " + dbName + " DEFAULT CHARSET utf8mb4").Error
  117. if err != nil {
  118. fmt.Println(err)
  119. return
  120. }
  121. }
  122. }
  123. if !db.Migrator().HasTable(&model.Version{}) {
  124. Migrate(uint(version))
  125. } else {
  126. //查找最后一个version
  127. var v model.Version
  128. db.Last(&v)
  129. if v.Version < uint(version) {
  130. Migrate(uint(version))
  131. }
  132. // 245迁移
  133. if v.Version < 245 {
  134. //oauths 表的 oauth_type 字段设置为 op同样的值
  135. db.Exec("update oauths set oauth_type = op")
  136. db.Exec("update oauths set issuer = 'https://accounts.google.com' where op = 'google'")
  137. db.Exec("update user_thirds set oauth_type = third_type, op = third_type")
  138. //通过email迁移旧的google授权
  139. uts := make([]model.UserThird, 0)
  140. db.Where("oauth_type = ?", "google").Find(&uts)
  141. for _, ut := range uts {
  142. if ut.UserId > 0 {
  143. db.Model(&model.User{}).Where("id = ?", ut.UserId).Update("email", ut.OpenId)
  144. }
  145. }
  146. }
  147. if v.Version < 246 {
  148. db.Exec("update oauths set issuer = 'https://accounts.google.com' where op = 'google' and issuer is null")
  149. }
  150. }
  151. }
  152. func Migrate(version uint) {
  153. fmt.Println("migrating....", version)
  154. err := global.DB.AutoMigrate(
  155. &model.Version{},
  156. &model.User{},
  157. &model.UserToken{},
  158. &model.Tag{},
  159. &model.AddressBook{},
  160. &model.Peer{},
  161. &model.Group{},
  162. &model.UserThird{},
  163. &model.Oauth{},
  164. &model.LoginLog{},
  165. &model.ShareRecord{},
  166. &model.AuditConn{},
  167. &model.AuditFile{},
  168. &model.AddressBookCollection{},
  169. &model.AddressBookCollectionRule{},
  170. )
  171. if err != nil {
  172. fmt.Println("migrate err :=>", err)
  173. }
  174. global.DB.Create(&model.Version{Version: version})
  175. //如果是初次则创建一个默认用户
  176. var vc int64
  177. global.DB.Model(&model.Version{}).Count(&vc)
  178. if vc == 1 {
  179. localizer := global.Localizer("")
  180. defaultGroup, _ := localizer.LocalizeMessage(&i18n.Message{
  181. ID: "DefaultGroup",
  182. })
  183. group := &model.Group{
  184. Name: defaultGroup,
  185. Type: model.GroupTypeDefault,
  186. }
  187. service.AllService.GroupService.Create(group)
  188. shareGroup, _ := localizer.LocalizeMessage(&i18n.Message{
  189. ID: "ShareGroup",
  190. })
  191. groupShare := &model.Group{
  192. Name: shareGroup,
  193. Type: model.GroupTypeShare,
  194. }
  195. service.AllService.GroupService.Create(groupShare)
  196. //是true
  197. is_admin := true
  198. admin := &model.User{
  199. Username: "admin",
  200. Nickname: "Admin",
  201. Status: model.COMMON_STATUS_ENABLE,
  202. IsAdmin: &is_admin,
  203. GroupId: 1,
  204. }
  205. admin.Password = service.AllService.UserService.EncryptPassword("admin")
  206. global.DB.Create(admin)
  207. }
  208. }