package engine import ( "fmt" //"github.com/gin-contrib/sessions" //"github.com/gin-contrib/sessions/memstore" //"github.com/gin-contrib/sessions/cookie" "os" "git.qianqiusoft.com/qianqiusoft/light-apiengine-client/client" "git.qianqiusoft.com/qianqiusoft/light-apiengine/config" "git.qianqiusoft.com/qianqiusoft/light-apiengine/models" "git.qianqiusoft.com/qianqiusoft/light-apiengine/env" "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/xormplus/xorm" "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys" "github.com/gin-contrib/gzip" ) type ApiEngine struct { entitys.ApiEngineInterface PlatformOrmEngine *xorm.Engine BusinessOrmEngine map[string]*xorm.Engine GinEngine *gin.Engine listen_addr string AppModuleInitFunc map[string]entitys.AppModuleInitFunction } func (g* ApiEngine)GetBusinessDb(domain string) *xorm.Engine{ return g.BusinessOrmEngine[domain] } func (g* ApiEngine)GetAllBusinessDb() map[string]*xorm.Engine{ return g.BusinessOrmEngine } func Default() *ApiEngine { apiengine := NewApiEngine("mysql", config.AppConfig.DataSource, fmt.Sprintf(":%d", config.AppConfig.HttpPort)) return apiengine } func NewApiEngine(driverName, dataSourceName string, addr string) *ApiEngine { engine := &ApiEngine{} var err error engine.AppModuleInitFunc = make(map[string]entitys.AppModuleInitFunction) engine.PlatformOrmEngine, err = xorm.NewEngine(driverName, dataSourceName) printError(err) initOrmEngine(engine.PlatformOrmEngine, driverName) initPlatformDbData(engine.PlatformOrmEngine) engine.GinEngine = gin.Default() engine.GinEngine.Use(gzip.Gzip(gzip.DefaultCompression)) //启动session //store := sessions.NewCookieStore([]byte("secret")) //engine.GinEngine.Use(sessions.Sessions("session", store)) _, err = os.Stat("doc/api.tpl") if err == nil { fmt.Println("LoadHTMLGlob.") engine.GinEngine.LoadHTMLGlob("doc/*") } //cross domain config := cors.DefaultConfig() config.AllowAllOrigins = true //config.AllowOrigins = []string{"http://localhost:8090"} config.AllowCredentials = true config.AllowHeaders = []string{"Content-Type,AccessToken,X-CSRF-Token, Authorization, Token"} engine.GinEngine.Use(cors.New(config)) engine.listen_addr = addr //设置登陆过滤 return engine } func (g *ApiEngine)AppModuleInit(domain string) { for _,v := range g.AppModuleInitFunc { v(domain, g) } } func (g *ApiEngine)AddAppMoudleInitFunc(module_name string, handler entitys.AppModuleInitFunction){ g.AppModuleInitFunc[module_name] = handler } func (g *ApiEngine)AddBusinessDb(domainid, login_id, domain, datasource string, sync_db bool) bool{ db := g.BusinessOrmEngine[domain] if db == nil { db, _ = xorm.NewEngine("mysql", datasource) } if db != nil { g.BusinessOrmEngine[domain] = db initOrmEngine(db, "mysql") if sync_db { g.AppModuleInit(domain) initBusinessDbData(domainid, login_id, domain, db, g.PlatformOrmEngine) g.PlatformOrmEngine.SQL("update sys_domain set sync_flag=1 where id = ?", domainid).Execute() } return true } return false } func (g *ApiEngine)LoadBusinessOrm() { var domain []models.SysDomain g.PlatformOrmEngine.SQL("select * from sys_domain where del_flag = 0").Find(&domain) g.BusinessOrmEngine = make(map[string]*xorm.Engine) for _,v := range domain { g.AddBusinessDb(v.Id, v.Domain, v.Domain, v.DataSource, (v.SyncFlag == 0)) } //将platformOrm添加到businessOrm中,这样平台账号登录上去也相当于使用相同的数据库配置 g.BusinessOrmEngine["qianqiuiot.com"] = g.PlatformOrmEngine } func (g *ApiEngine) Run() { if config.AppConfig.RunMode != "release" { engine_path := env.Get("GOPATH", "") + "/src/git.qianqiusoft.com/qianqiusoft/light-apiengine/" _,err:=os.Stat(engine_path+"/light-apiengine.xml") if err == nil{ gen_clinet := client.NewEngineClient("light-apiengine", "http://ccbeetech.com:6166") gen_clinet.GenerateToPath(engine_path+"/light-apiengine.xml", engine_path) }else{ logs.Error("light-engine.xml文件不存在") } } g.LoadBusinessOrm() g.GinEngine.StaticFile("/", "web/index.html") g.GinEngine.Static("/static", "web/static") g.GinEngine.Run(g.listen_addr) }