| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- 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/entitys"
- "git.qianqiusoft.com/qianqiusoft/light-apiengine/env"
- "git.qianqiusoft.com/qianqiusoft/light-apiengine/logs"
- "git.qianqiusoft.com/qianqiusoft/light-apiengine/middleware/logger"
- "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
- "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils/auth"
- "github.com/gin-contrib/cors"
- "github.com/gin-contrib/gzip"
- "github.com/gin-gonic/gin"
- "github.com/xormplus/xorm"
- )
- 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)
- if config.AppConfig.SyncDb {
- initPlatformDbData(engine.PlatformOrmEngine)
- }
- engine.GinEngine = gin.Default()
- engine.GinEngine.Use(gzip.Gzip(gzip.DefaultCompression))
- engine.GinEngine.Use(logger.LoggerMiddleware())
- //启动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")
- if config.AppConfig.EnableLdapServer {
- ldap := auth.NewLdapAuth(g)
- go ldap.Init()
- }
- g.GinEngine.Run(g.Listen_addr)
- }
|