apiengine.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package engine
  2. import (
  3. "fmt"
  4. "time"
  5. //"github.com/gin-contrib/sessions"
  6. //"github.com/gin-contrib/sessions/memstore"
  7. //"github.com/gin-contrib/sessions/cookie"
  8. "os"
  9. "git.qianqiusoft.com/qianqiusoft/light-apiengine-client/client"
  10. "git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
  11. "git.qianqiusoft.com/qianqiusoft/light-apiengine/engine/auth"
  12. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  13. "git.qianqiusoft.com/qianqiusoft/light-apiengine/env"
  14. "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs"
  15. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  16. "github.com/gin-contrib/cors"
  17. "github.com/gin-contrib/gzip"
  18. "github.com/gin-gonic/gin"
  19. "github.com/xormplus/xorm"
  20. )
  21. var apiEngine *ApiEngine = nil
  22. type ApiEngine struct {
  23. entitys.ApiEngineInterface
  24. PlatformOrmEngine *xorm.Engine
  25. BusinessOrmEngine map[string]*xorm.Engine
  26. GinEngine *gin.Engine
  27. Listen_addr string
  28. AppModuleInitFunc map[string]entitys.AppModuleInitFunction
  29. }
  30. func (g *ApiEngine) GetBusinessDb(domain string) *xorm.Engine {
  31. return g.BusinessOrmEngine[domain]
  32. }
  33. func (g *ApiEngine) GetAllBusinessDb() map[string]*xorm.Engine {
  34. return g.BusinessOrmEngine
  35. }
  36. func Default() *ApiEngine {
  37. apiEngine = NewApiEngine("mysql", config.AppConfig.DataSource, fmt.Sprintf(":%d", config.AppConfig.HttpPort))
  38. return apiEngine
  39. }
  40. func NewApiEngine(driverName, dataSourceName string, addr string) *ApiEngine {
  41. engine := &ApiEngine{}
  42. var err error
  43. engine.AppModuleInitFunc = make(map[string]entitys.AppModuleInitFunction)
  44. engine.PlatformOrmEngine, err = xorm.NewEngine(driverName, dataSourceName)
  45. printError(err)
  46. engine.PlatformOrmEngine.SetConnMaxLifetime(10 * time.Minute)
  47. engine.PlatformOrmEngine.SetMaxIdleConns(10)
  48. engine.PlatformOrmEngine.ShowSQL(true)
  49. engine.PlatformOrmEngine.ShowExecTime(true)
  50. initOrmEngine(engine.PlatformOrmEngine, driverName)
  51. if config.AppConfig.SyncDb {
  52. initPlatformDbData(engine.PlatformOrmEngine)
  53. }
  54. engine.GinEngine = gin.Default()
  55. engine.GinEngine.Use(gzip.Gzip(gzip.DefaultCompression))
  56. // engine.GinEngine.Use(logger.LoggerMiddleware())
  57. //启动session
  58. //store := sessions.NewCookieStore([]byte("secret"))
  59. //engine.GinEngine.Use(sessions.Sessions("session", store))
  60. _, err = os.Stat("doc/api.tpl")
  61. if err == nil {
  62. fmt.Println("LoadHTMLGlob.")
  63. engine.GinEngine.LoadHTMLGlob("doc/*.md")
  64. }
  65. //cross domain
  66. config := cors.DefaultConfig()
  67. config.AllowAllOrigins = true
  68. //config.AllowOrigins = []string{"http://localhost:8090"}
  69. config.AllowCredentials = true
  70. config.AllowHeaders = []string{"Content-Type,AccessToken,X-CSRF-Token, Authorization, Token"}
  71. engine.GinEngine.Use(cors.New(config))
  72. engine.Listen_addr = addr
  73. //设置登陆过滤
  74. return engine
  75. }
  76. func (g *ApiEngine) AppModuleInit(domain string) {
  77. for _, v := range g.AppModuleInitFunc {
  78. v(domain, g)
  79. }
  80. }
  81. func (g *ApiEngine) AddAppMoudleInitFunc(module_name string, handler entitys.AppModuleInitFunction) {
  82. g.AppModuleInitFunc[module_name] = handler
  83. }
  84. func (g *ApiEngine) AddBusinessDb(domainid, login_id, domain, datasource string, sync_db bool) bool {
  85. db := g.BusinessOrmEngine[domain]
  86. if db == nil {
  87. db, _ = xorm.NewEngine("mysql", datasource)
  88. }
  89. if db != nil {
  90. g.BusinessOrmEngine[domain] = db
  91. initOrmEngine(db, "mysql")
  92. if sync_db {
  93. g.AppModuleInit(domain)
  94. initBusinessDbData(domainid, login_id, domain, db, g.PlatformOrmEngine)
  95. g.PlatformOrmEngine.SQL("update sys_domain set sync_flag=1 where id = ?", domainid).Execute()
  96. }
  97. return true
  98. }
  99. return false
  100. }
  101. func (g *ApiEngine) LoadBusinessOrm() {
  102. var domain []models.SysDomain
  103. g.PlatformOrmEngine.SQL("select * from sys_domain where del_flag = 0").Find(&domain)
  104. g.BusinessOrmEngine = make(map[string]*xorm.Engine)
  105. for _, v := range domain {
  106. g.AddBusinessDb(v.Id, v.Domain, v.Domain, v.DataSource, (v.SyncFlag == 0))
  107. }
  108. //将platformOrm添加到businessOrm中,这样平台账号登录上去也相当于使用相同的数据库配置
  109. g.BusinessOrmEngine["qianqiuiot.com"] = g.PlatformOrmEngine
  110. }
  111. func (g *ApiEngine) Run() {
  112. if config.AppConfig.RunMode != "release" {
  113. engine_path := env.Get("GOPATH", "") + "/src/git.qianqiusoft.com/qianqiusoft/light-apiengine/"
  114. _, err := os.Stat(engine_path + "/light-apiengine.xml")
  115. if err == nil {
  116. gen_clinet := client.NewEngineClient("light-apiengine", "http://ccbeetech.com:6166")
  117. gen_clinet.GenerateToPath(engine_path+"/light-apiengine.xml", engine_path)
  118. } else {
  119. logs.Error("light-engine.xml文件不存在")
  120. }
  121. }
  122. g.LoadBusinessOrm()
  123. //g.GinEngine.StaticFile("/", "web/index.html")
  124. //g.GinEngine.Static("/static", "web/static")
  125. if config.AppConfig.EnableLdapServer {
  126. ldap := auth.NewLdapAuth(g)
  127. go ldap.Init()
  128. }
  129. auth.TCPClient = auth.NewTcpClient()
  130. auth.TCPClient.Start()
  131. time.Sleep(3 * time.Second)
  132. g.GinEngine.Run(g.Listen_addr)
  133. }
  134. /**
  135. * @brief: 获取对应业务engine,主要用于无法通过参数获取db的地方,例如init中启动定时器
  136. * @param1 domain: 域名
  137. * @return1: engine
  138. */
  139. func GetBusinessDb(domain string) *xorm.Engine {
  140. return apiEngine.BusinessOrmEngine[domain]
  141. }