apiengine.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package engine
  2. import (
  3. "fmt"
  4. //"github.com/gin-contrib/sessions"
  5. //"github.com/gin-contrib/sessions/memstore"
  6. //"github.com/gin-contrib/sessions/cookie"
  7. "os"
  8. "git.qianqiusoft.com/qianqiusoft/light-apiengine-client/client"
  9. "git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
  10. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  11. "git.qianqiusoft.com/qianqiusoft/light-apiengine/env"
  12. "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs"
  13. "github.com/gin-contrib/cors"
  14. "github.com/gin-gonic/gin"
  15. "github.com/xormplus/xorm"
  16. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  17. )
  18. type ApiEngine struct {
  19. entitys.ApiEngineInterface
  20. PlatformOrmEngine *xorm.Engine
  21. BusinessOrmEngine map[string]*xorm.Engine
  22. GinEngine *gin.Engine
  23. listen_addr string
  24. AppModuleInitFunc map[string]entitys.AppModuleInitFunction
  25. }
  26. func (g* ApiEngine)GetBusinessDb(domain string) *xorm.Engine{
  27. return g.BusinessOrmEngine[domain]
  28. }
  29. func (g* ApiEngine)GetAllBusinessDb() map[string]*xorm.Engine{
  30. return g.BusinessOrmEngine
  31. }
  32. func Default() *ApiEngine {
  33. apiengine := NewApiEngine("mysql", config.AppConfig.DataSource, fmt.Sprintf(":%d", config.AppConfig.HttpPort))
  34. return apiengine
  35. }
  36. func NewApiEngine(driverName, dataSourceName string, addr string) *ApiEngine {
  37. engine := &ApiEngine{}
  38. var err error
  39. engine.AppModuleInitFunc = make(map[string]entitys.AppModuleInitFunction)
  40. engine.PlatformOrmEngine, err = xorm.NewEngine(driverName, dataSourceName)
  41. printError(err)
  42. initOrmEngine(engine.PlatformOrmEngine, driverName)
  43. initPlatformDbData(engine.PlatformOrmEngine)
  44. engine.LoadBusinessOrm()
  45. engine.GinEngine = gin.Default()
  46. //启动session
  47. //store := sessions.NewCookieStore([]byte("secret"))
  48. //engine.GinEngine.Use(sessions.Sessions("session", store))
  49. _, err = os.Stat("doc/api.tpl")
  50. if err == nil {
  51. fmt.Println("LoadHTMLGlob.")
  52. engine.GinEngine.LoadHTMLGlob("doc/*")
  53. }
  54. //cross domain
  55. config := cors.DefaultConfig()
  56. config.AllowAllOrigins = true
  57. //config.AllowOrigins = []string{"http://localhost:8090"}
  58. config.AllowCredentials = true
  59. config.AllowHeaders = []string{"Content-Type,AccessToken,X-CSRF-Token, Authorization, Token"}
  60. engine.GinEngine.Use(cors.New(config))
  61. engine.listen_addr = addr
  62. //设置登陆过滤
  63. return engine
  64. }
  65. func (g *ApiEngine)AppModuleInit() {
  66. for _,v := range g.AppModuleInitFunc {
  67. v(g)
  68. }
  69. }
  70. func (g *ApiEngine)AddAppMoudleInitFunc(module_name string, handler entitys.AppModuleInitFunction){
  71. g.AppModuleInitFunc[module_name] = handler
  72. }
  73. func (g *ApiEngine)AddBusinessDb(domainid, login_id, domain, datasource string) bool{
  74. db,err := xorm.NewEngine("mysql", datasource)
  75. if err == nil {
  76. g.BusinessOrmEngine[domain] = db
  77. initOrmEngine(db, "mysql")
  78. initBusinessDbData(domainid, login_id, domain, db, g.PlatformOrmEngine)
  79. return true
  80. }
  81. return false
  82. }
  83. func (g *ApiEngine)LoadBusinessOrm() {
  84. var domain []models.SysDomain
  85. g.PlatformOrmEngine.SQL("select * from sys_domain where del_flag = 0").Find(&domain)
  86. g.BusinessOrmEngine = make(map[string]*xorm.Engine)
  87. for _,v := range domain {
  88. g.AddBusinessDb(v.Id, v.Domain, v.Domain, v.DataSource)
  89. }
  90. //将platformOrm添加到businessOrm中,这样平台账号登录上去也相当于使用相同的数据库配置
  91. g.BusinessOrmEngine["qianqiusoft.com"] = g.PlatformOrmEngine
  92. }
  93. func (g *ApiEngine) Run() {
  94. if config.AppConfig.RunMode != "release" {
  95. engine_path := env.Get("GOPATH", "") + "/src/git.qianqiusoft.com/qianqiusoft/light-apiengine/"
  96. _,err:=os.Stat(engine_path+"/light-apiengine.xml")
  97. if err == nil{
  98. gen_clinet := client.NewEngineClient("light-apiengine", "http://ccbeetech.com:6166")
  99. gen_clinet.GenerateToPath(engine_path+"/light-apiengine.xml", engine_path)
  100. }else{
  101. logs.Error("light-engine.xml文件不存在")
  102. }
  103. }
  104. g.AppModuleInit()
  105. g.GinEngine.StaticFile("/", "web/index.html")
  106. g.GinEngine.Static("/static", "web/static")
  107. g.GinEngine.Run(g.listen_addr)
  108. }