Explorar o código

Update 优化DbKey的获取方式,前端可以在head中传值

YueYunyun %!s(int64=2) %!d(string=hai) anos
pai
achega
4a499bcff7

+ 3 - 3
SERVER/VberAdmin/app/schedule/apis/job.go

@@ -240,10 +240,10 @@ func (e SysJobApi) Start(c *gin.Context) {
 		e.Error(http.StatusUnprocessableEntity, err, "参数验证失败")
 		e.Error(http.StatusUnprocessableEntity, err, "参数验证失败")
 		return
 		return
 	}
 	}
-	s.Cron = sdk.Runtime.GetCrontabKey(c.Request.Host)
+	s.Cron = sdk.Runtime.GetCrontab(c)
 	err = s.StartJob(&v)
 	err = s.StartJob(&v)
 	if err != nil {
 	if err != nil {
-		e.Logger.Errorf("GetCrontabKey error, %s", err.Error())
+		e.Logger.Errorf("GetCrontabByKey error, %s", err.Error())
 		e.Error(500, err, err.Error())
 		e.Error(500, err, err.Error())
 		return
 		return
 	}
 	}
@@ -272,7 +272,7 @@ func (e SysJobApi) Stop(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
-	s.Cron = sdk.Runtime.GetCrontabKey(c.Request.Host)
+	s.Cron = sdk.Runtime.GetCrontab(c)
 	err = s.StopJob(&v)
 	err = s.StopJob(&v)
 	if err != nil {
 	if err != nil {
 		e.Logger.Errorf("RemoveJob error, %s", err.Error())
 		e.Logger.Errorf("RemoveJob error, %s", err.Error())

+ 4 - 2
SERVER/VberAdmin/app/schedule/service/job.go

@@ -134,8 +134,9 @@ func (e *SysJobService) StartJob(c *dto.SysJobGetReq) error {
 		j.CronExpression = data.CronExpression
 		j.CronExpression = data.CronExpression
 		j.JobId = data.JobId
 		j.JobId = data.JobId
 		j.Name = data.JobName
 		j.Name = data.JobName
+		j.Db = e.Orm
+		j.Cron = e.Cron
 		j.Logger = cJobs.GetJobLogger()
 		j.Logger = cJobs.GetJobLogger()
-		j.DbKey = "*"
 		data.EntryId, err = cJobs.AddJob(e.Cron, j)
 		data.EntryId, err = cJobs.AddJob(e.Cron, j)
 		if err != nil {
 		if err != nil {
 			e.Log.Errorf("jobs AddJob[HttpJob] error: %s", err)
 			e.Log.Errorf("jobs AddJob[HttpJob] error: %s", err)
@@ -147,8 +148,9 @@ func (e *SysJobService) StartJob(c *dto.SysJobGetReq) error {
 		j.JobId = data.JobId
 		j.JobId = data.JobId
 		j.Name = data.JobName
 		j.Name = data.JobName
 		j.Args = data.Args
 		j.Args = data.Args
+		j.Db = e.Orm
+		j.Cron = e.Cron
 		j.Logger = cJobs.GetJobLogger()
 		j.Logger = cJobs.GetJobLogger()
-		j.DbKey = "*"
 		data.EntryId, err = cJobs.AddJob(e.Cron, j)
 		data.EntryId, err = cJobs.AddJob(e.Cron, j)
 		if err != nil {
 		if err != nil {
 			e.Log.Errorf("jobs AddJob[ExecJob] error: %s", err)
 			e.Log.Errorf("jobs AddJob[ExecJob] error: %s", err)

+ 3 - 3
SERVER/VberAdmin/app/system/apis/sys_role.go

@@ -124,7 +124,7 @@ func (e SysRoleApi) Insert(c *gin.Context) {
 	if req.Status == "" {
 	if req.Status == "" {
 		req.Status = "2"
 		req.Status = "2"
 	}
 	}
-	cb := sdk.Runtime.GetCasbinKey(c.Request.Host)
+	cb := sdk.Runtime.GetCasbin(c)
 	err = s.Insert(&req, cb)
 	err = s.Insert(&req, cb)
 	if err != nil {
 	if err != nil {
 		e.Logger.Error(err)
 		e.Logger.Error(err)
@@ -163,7 +163,7 @@ func (e SysRoleApi) Update(c *gin.Context) {
 		e.Error(500, err, err.Error())
 		e.Error(500, err, err.Error())
 		return
 		return
 	}
 	}
-	cb := sdk.Runtime.GetCasbinKey(c.Request.Host)
+	cb := sdk.Runtime.GetCasbin(c)
 
 
 	req.SetUpdateBy(user.GetUserId(c))
 	req.SetUpdateBy(user.GetUserId(c))
 
 
@@ -205,7 +205,7 @@ func (e SysRoleApi) Delete(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
-	cb := sdk.Runtime.GetCasbinKey(c.Request.Host)
+	cb := sdk.Runtime.GetCasbin(c)
 	err = s.Remove(&req, cb, user.GetRoleKey(c))
 	err = s.Remove(&req, cb, user.GetRoleKey(c))
 	if err != nil {
 	if err != nil {
 		e.Logger.Error(err)
 		e.Logger.Error(err)

+ 1 - 1
SERVER/VberAdmin/app/system/models/sys_api.go

@@ -55,7 +55,7 @@ func SaveSysApi(message storage.Message) (err error) {
 		err = fmt.Errorf("json Unmarshal error, %s", err.Error())
 		err = fmt.Errorf("json Unmarshal error, %s", err.Error())
 		return err
 		return err
 	}
 	}
-	dbList := sdk.Runtime.GetDb()
+	dbList := sdk.Runtime.GetDbMap()
 	// 根据接口方法注释里的@Summary填充接口名称,适用于代码生成器
 	// 根据接口方法注释里的@Summary填充接口名称,适用于代码生成器
 	// 可在此处增加配置路径前缀的if判断,只对代码生成的自建应用进行定向的接口名称填充
 	// 可在此处增加配置路径前缀的if判断,只对代码生成的自建应用进行定向的接口名称填充
 	jsonFile, _ := os.ReadFile("docs/admin/admin_swagger.json")
 	jsonFile, _ := os.ReadFile("docs/admin/admin_swagger.json")

+ 4 - 4
SERVER/VberAdmin/common/database/initialize.go

@@ -23,11 +23,11 @@ func Setup() {
 	}
 	}
 }
 }
 
 
-func setupDatabase(host string, c *toolsCfg.Database) {
+func setupDatabase(dbKey string, c *toolsCfg.Database) {
 	if global.Driver == "" {
 	if global.Driver == "" {
 		global.Driver = c.Driver
 		global.Driver = c.Driver
 	}
 	}
-	log.Infof("%s => %s", host, pkg.Green(c.Source))
+	log.Infof("%s => %s", dbKey, pkg.Green(c.Source))
 	registers := make([]toolsDB.ResolverConfigure, len(c.Registers))
 	registers := make([]toolsDB.ResolverConfigure, len(c.Registers))
 	for i := range c.Registers {
 	for i := range c.Registers {
 		registers[i] = toolsDB.NewResolverConfigure(
 		registers[i] = toolsDB.NewResolverConfigure(
@@ -60,6 +60,6 @@ func setupDatabase(host string, c *toolsCfg.Database) {
 
 
 	e := mycasbin.Setup(db, "")
 	e := mycasbin.Setup(db, "")
 
 
-	sdk.Runtime.SetDb(host, db)
-	sdk.Runtime.SetCasbin(host, e)
+	sdk.Runtime.SetDb(dbKey, db)
+	sdk.Runtime.SetCasbin(dbKey, e)
 }
 }

+ 4 - 3
SERVER/VberAdmin/common/global/casbin.go

@@ -11,10 +11,11 @@ import (
 // LoadPolicy 加载casbin权限策略
 // LoadPolicy 加载casbin权限策略
 func LoadPolicy(c *gin.Context) (*casbin.SyncedEnforcer, error) {
 func LoadPolicy(c *gin.Context) (*casbin.SyncedEnforcer, error) {
 	log := api.GetRequestLogger(c)
 	log := api.GetRequestLogger(c)
-	if err := sdk.Runtime.GetCasbinKey(c.Request.Host).LoadPolicy(); err == nil {
-		return sdk.Runtime.GetCasbinKey(c.Request.Host), err
-	} else {
+	cb := sdk.Runtime.GetCasbin(c)
+	if err := cb.LoadPolicy(); err != nil {
 		log.Errorf("casbin rbac_model 策略初始化错误, %s ", err.Error())
 		log.Errorf("casbin rbac_model 策略初始化错误, %s ", err.Error())
 		return nil, err
 		return nil, err
 	}
 	}
+	return cb, nil
+
 }
 }

+ 7 - 4
SERVER/VberAdmin/common/jobs/call.go

@@ -2,7 +2,6 @@ package jobs
 
 
 import (
 import (
 	"VberAdmin/common/jobs/models"
 	"VberAdmin/common/jobs/models"
-	"VberAdmin/core/sdk"
 	"VberAdmin/core/tools/utils"
 	"VberAdmin/core/tools/utils"
 	"fmt"
 	"fmt"
 
 
@@ -13,9 +12,9 @@ func CallExec(e JobExec, jobCore *JobCore) error {
 	job := &models.SysJob{
 	job := &models.SysJob{
 		JobId: jobCore.JobId,
 		JobId: jobCore.JobId,
 	}
 	}
-	db := sdk.Runtime.GetDbByKey(jobCore.DbKey)
+	db := jobCore.Db
 	if db == nil {
 	if db == nil {
-		err := fmt.Errorf("【%s】 EXEC DB ERROR:%s %s", jobCore.Name, jobCore.DbKey, "db is nil")
+		err := fmt.Errorf("【%s】 EXEC DB ERROR:%s ", jobCore.Name, "db is nil")
 		return err
 		return err
 	}
 	}
 	err := job.Get(db, job)
 	err := job.Get(db, job)
@@ -31,7 +30,11 @@ func CallExec(e JobExec, jobCore *JobCore) error {
 		job.FailCount++
 		job.FailCount++
 		jobLogger.Errorf("【%s】 EXEC ERROR: %s", jobCore.Name, err.Error())
 		jobLogger.Errorf("【%s】 EXEC ERROR: %s", jobCore.Name, err.Error())
 	}
 	}
-	crontab := sdk.Runtime.GetCrontabKey(jobCore.DbKey)
+	crontab := jobCore.Cron
+	if crontab == nil {
+		err = fmt.Errorf("【%s】 EXEC CRONTAB ERROR: %s", jobCore.Name, "crontab is nil")
+		return err
+	}
 	entry := crontab.Entry(cron.EntryID(job.EntryId))
 	entry := crontab.Entry(cron.EntryID(job.EntryId))
 	job.NextExecTime = utils.Time2Long(entry.Next)
 	job.NextExecTime = utils.Time2Long(entry.Next)
 	jobLogger.Infof("【%s】 EXEC END\r\n", jobCore.Name)
 	jobLogger.Infof("【%s】 EXEC END\r\n", jobCore.Name)

+ 6 - 4
SERVER/VberAdmin/common/jobs/init.go

@@ -20,7 +20,7 @@ var (
 // InitJob 初始化job
 // InitJob 初始化job
 func InitJob() {
 func InitJob() {
 	initJobList()
 	initJobList()
-	Setup(sdk.Runtime.GetDb())
+	Setup(sdk.Runtime.GetDbMap())
 }
 }
 
 
 // 需要将定义的struct 添加到字典中;
 // 需要将定义的struct 添加到字典中;
@@ -45,7 +45,7 @@ func Setup(dbs map[string]*gorm.DB) {
 }
 }
 
 
 func setup(key string, db *gorm.DB) {
 func setup(key string, db *gorm.DB) {
-	crontab := sdk.Runtime.GetCrontabKey(key)
+	crontab := sdk.Runtime.GetCrontabByKey(key)
 	sysJob := models.SysJob{}
 	sysJob := models.SysJob{}
 	jobList := make([]models.SysJob, 0)
 	jobList := make([]models.SysJob, 0)
 	err := sysJob.GetList(db, &jobList)
 	err := sysJob.GetList(db, &jobList)
@@ -67,7 +67,8 @@ func setup(key string, db *gorm.DB) {
 			j.CronExpression = jobList[i].CronExpression
 			j.CronExpression = jobList[i].CronExpression
 			j.JobId = jobList[i].JobId
 			j.JobId = jobList[i].JobId
 			j.Name = jobList[i].JobName
 			j.Name = jobList[i].JobName
-			j.DbKey = key
+			j.Db = db
+			j.Cron = crontab
 			j.Logger = jobLogger
 			j.Logger = jobLogger
 			sysJob.EntryId, err = AddJob(crontab, j)
 			sysJob.EntryId, err = AddJob(crontab, j)
 		} else if jobList[i].JobType == 2 {
 		} else if jobList[i].JobType == 2 {
@@ -77,7 +78,8 @@ func setup(key string, db *gorm.DB) {
 			j.JobId = jobList[i].JobId
 			j.JobId = jobList[i].JobId
 			j.Name = jobList[i].JobName
 			j.Name = jobList[i].JobName
 			j.Args = jobList[i].Args
 			j.Args = jobList[i].Args
-			j.DbKey = key
+			j.Db = db
+			j.Cron = crontab
 			j.Logger = jobLogger
 			j.Logger = jobLogger
 			sysJob.EntryId, err = AddJob(crontab, j)
 			sysJob.EntryId, err = AddJob(crontab, j)
 		}
 		}

+ 3 - 1
SERVER/VberAdmin/common/jobs/type.go

@@ -2,6 +2,7 @@ package jobs
 
 
 import (
 import (
 	"github.com/robfig/cron/v3"
 	"github.com/robfig/cron/v3"
+	"gorm.io/gorm"
 )
 )
 
 
 type JobCore struct {
 type JobCore struct {
@@ -11,7 +12,8 @@ type JobCore struct {
 	EntryId        int
 	EntryId        int
 	CronExpression string
 	CronExpression string
 	Args           string
 	Args           string
-	DbKey          string
+	Cron           *cron.Cron
+	Db             *gorm.DB
 	Logger         *JobLogger
 	Logger         *JobLogger
 }
 }
 
 

+ 1 - 1
SERVER/VberAdmin/common/middleware/db.go

@@ -7,6 +7,6 @@ import (
 )
 )
 
 
 func WithContextDb(c *gin.Context) {
 func WithContextDb(c *gin.Context) {
-	c.Set("db", sdk.Runtime.GetDbByKey(c.Request.Host).WithContext(c))
+	c.Set("db", sdk.Runtime.GetDb(c).WithContext(c))
 	c.Next()
 	c.Next()
 }
 }

+ 1 - 1
SERVER/VberAdmin/common/middleware/handler/auth.go

@@ -140,7 +140,7 @@ func LoginLogToDB(c *gin.Context, status string, msg string, username string) {
 	l["username"] = username
 	l["username"] = username
 	l["msg"] = msg
 	l["msg"] = msg
 
 
-	q := sdk.Runtime.GetMemoryQueue(c.Request.Host)
+	q := sdk.Runtime.GetMemoryQueue(c)
 	message, err := sdk.Runtime.BuildStreamMessage("", global.LoginLog, l)
 	message, err := sdk.Runtime.BuildStreamMessage("", global.LoginLog, l)
 	if err != nil {
 	if err != nil {
 		log.Errorf("BuildStreamMessage error, %s", err.Error())
 		log.Errorf("BuildStreamMessage error, %s", err.Error())

+ 1 - 1
SERVER/VberAdmin/common/middleware/logger.go

@@ -126,7 +126,7 @@ func SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string
 		l["status"] = dto.OperaStatusDisable
 		l["status"] = dto.OperaStatusDisable
 	}
 	}
 
 
-	q := sdk.Runtime.GetMemoryQueue(c.Request.Host)
+	q := sdk.Runtime.GetMemoryQueue(c)
 	message, err := sdk.Runtime.BuildStreamMessage("", global.OperateLog, l)
 	message, err := sdk.Runtime.BuildStreamMessage("", global.OperateLog, l)
 	if err != nil {
 	if err != nil {
 		oLog.Errorf("BuildStreamMessage error, %s", err.Error())
 		oLog.Errorf("BuildStreamMessage error, %s", err.Error())

+ 1 - 1
SERVER/VberAdmin/common/middleware/permission.go

@@ -24,7 +24,7 @@ func AuthCheckRole() gin.HandlerFunc {
 	return func(c *gin.Context) {
 	return func(c *gin.Context) {
 		data, _ := c.Get(jwtauth.JwtPayloadKey)
 		data, _ := c.Get(jwtauth.JwtPayloadKey)
 		v := data.(jwtauth.MapClaims)
 		v := data.(jwtauth.MapClaims)
-		e := sdk.Runtime.GetCasbinKey(c.Request.Host)
+		e := sdk.Runtime.GetCasbin(c)
 		res := permission.CheckRoleApi(c, v, e)
 		res := permission.CheckRoleApi(c, v, e)
 		if res {
 		if res {
 			log.Infof("isTrue: %v role: %s method: %s path: %s", res, v["rolekey"], c.Request.Method, c.Request.URL.Path)
 			log.Infof("isTrue: %v role: %s method: %s path: %s", res, v["rolekey"], c.Request.Method, c.Request.URL.Path)

+ 2 - 1
SERVER/VberAdmin/core/sdk/config/config.go

@@ -3,6 +3,7 @@ package config
 import (
 import (
 	"VberAdmin/core/config"
 	"VberAdmin/core/config"
 	"VberAdmin/core/config/source"
 	"VberAdmin/core/config/source"
+	"VberAdmin/core/sdk"
 	"fmt"
 	"fmt"
 	"log"
 	"log"
 )
 )
@@ -55,7 +56,7 @@ func (e *Settings) init() {
 func (e *Config) setupDatabase() {
 func (e *Config) setupDatabase() {
 	if len(*e.Databases) == 0 {
 	if len(*e.Databases) == 0 {
 		*e.Databases = map[string]*Database{
 		*e.Databases = map[string]*Database{
-			"*": e.Database,
+			sdk.Runtime.GetDefaultKey(): e.Database,
 		}
 		}
 	}
 	}
 }
 }

+ 125 - 38
SERVER/VberAdmin/core/sdk/runtime/application.go

@@ -53,6 +53,23 @@ func NewConfig() *Application {
 	}
 	}
 }
 }
 
 
+// GetDefaultKey 获取默认key
+func (e *Application) GetDefaultKey() string {
+	return "*"
+}
+
+// GetKey 获取key
+func (e *Application) GetKey(c *gin.Context) string {
+	key := c.GetHeader("key")
+	if key == "" {
+		key = c.GetHeader("tenant")
+	}
+	if key == "" {
+		key = e.GetDefaultKey()
+	}
+	return key
+}
+
 // SetConfig 设置对应key的config
 // SetConfig 设置对应key的config
 func (e *Application) SetConfig(key string, value interface{}) {
 func (e *Application) SetConfig(key string, value interface{}) {
 	e.mux.Lock()
 	e.mux.Lock()
@@ -74,20 +91,32 @@ func (e *Application) SetDb(key string, db *gorm.DB) {
 	e.dbs[key] = db
 	e.dbs[key] = db
 }
 }
 
 
-// GetDb 获取所有map里的db数据
-func (e *Application) GetDb() map[string]*gorm.DB {
+// GetDbMap 获取所有map里的db数据
+func (e *Application) GetDbMap() map[string]*gorm.DB {
 	e.mux.Lock()
 	e.mux.Lock()
 	defer e.mux.Unlock()
 	defer e.mux.Unlock()
 	return e.dbs
 	return e.dbs
 }
 }
 
 
+// GetDb 获取对应key的db
+func (e *Application) GetDb(c *gin.Context) *gorm.DB {
+	key := c.GetHeader("db")
+	if key == "" {
+		key = c.GetHeader("db-key")
+	}
+	if key == "" {
+		key = e.GetKey(c)
+	}
+	return e.GetDbByKey(key)
+}
+
 // GetDbByKey 根据key获取db
 // GetDbByKey 根据key获取db
 func (e *Application) GetDbByKey(key string) *gorm.DB {
 func (e *Application) GetDbByKey(key string) *gorm.DB {
 	e.mux.Lock()
 	e.mux.Lock()
 	defer e.mux.Unlock()
 	defer e.mux.Unlock()
-	if db, ok := e.dbs["*"]; ok {
-		return db
-	}
+	//if db, ok := e.dbs["*"]; ok {
+	//	return db
+	//}
 	return e.dbs[key]
 	return e.dbs[key]
 }
 }
 
 
@@ -98,18 +127,30 @@ func (e *Application) SetCasbin(key string, enforcer *casbin.SyncedEnforcer) {
 	e.casbins[key] = enforcer
 	e.casbins[key] = enforcer
 }
 }
 
 
-// GetCasbin 获取所有map里的casbin数据
-func (e *Application) GetCasbin() map[string]*casbin.SyncedEnforcer {
+// GetCasbinMap 获取所有map里的casbin数据
+func (e *Application) GetCasbinMap() map[string]*casbin.SyncedEnforcer {
 	return e.casbins
 	return e.casbins
 }
 }
 
 
-// GetCasbinKey 根据key获取casbin
-func (e *Application) GetCasbinKey(key string) *casbin.SyncedEnforcer {
+// GetCasbin 获取对应key的casbin
+func (e *Application) GetCasbin(c *gin.Context) *casbin.SyncedEnforcer {
+	key := c.GetHeader("casbin")
+	if key == "" {
+		key = c.GetHeader("casbin-key")
+	}
+	if key == "" {
+		key = e.GetKey(c)
+	}
+	return e.GetCasbinByKey(key)
+}
+
+// GetCasbinByKey 根据key获取casbin
+func (e *Application) GetCasbinByKey(key string) *casbin.SyncedEnforcer {
 	e.mux.Lock()
 	e.mux.Lock()
 	defer e.mux.Unlock()
 	defer e.mux.Unlock()
-	if e, ok := e.casbins["*"]; ok {
-		return e
-	}
+	//if e, ok := e.casbins["*"]; ok {
+	//	return e
+	//}
 	return e.casbins[key]
 	return e.casbins[key]
 }
 }
 
 
@@ -157,20 +198,32 @@ func (e *Application) SetCrontab(key string, crontab *cron.Cron) {
 	e.crontab[key] = crontab
 	e.crontab[key] = crontab
 }
 }
 
 
-// GetCrontab 获取所有map里的crontab数据
-func (e *Application) GetCrontab() map[string]*cron.Cron {
+// GetCrontabMap 获取所有map里的crontab数据
+func (e *Application) GetCrontabMap() map[string]*cron.Cron {
 	e.mux.Lock()
 	e.mux.Lock()
 	defer e.mux.Unlock()
 	defer e.mux.Unlock()
 	return e.crontab
 	return e.crontab
 }
 }
 
 
-// GetCrontabKey 根据key获取crontab
-func (e *Application) GetCrontabKey(key string) *cron.Cron {
+// GetCrontab 获取对应key的crontab
+func (e *Application) GetCrontab(c *gin.Context) *cron.Cron {
+	key := c.GetHeader("crontab")
+	if key == "" {
+		key = c.GetHeader("crontab-key")
+	}
+	if key == "" {
+		key = e.GetKey(c)
+	}
+	return e.GetCrontabByKey(key)
+}
+
+// GetCrontabByKey 根据key获取crontab
+func (e *Application) GetCrontabByKey(key string) *cron.Cron {
 	e.mux.Lock()
 	e.mux.Lock()
 	defer e.mux.Unlock()
 	defer e.mux.Unlock()
-	if e, ok := e.crontab["*"]; ok {
-		return e
-	}
+	//if e, ok := e.crontab["*"]; ok {
+	//	return e
+	//}
 	return e.crontab[key]
 	return e.crontab[key]
 }
 }
 
 
@@ -181,13 +234,25 @@ func (e *Application) SetMiddleware(key string, middleware interface{}) {
 	e.middlewares[key] = middleware
 	e.middlewares[key] = middleware
 }
 }
 
 
-// GetMiddleware 获取所有中间件
-func (e *Application) GetMiddleware() map[string]interface{} {
+// GetMiddlewareMap 获取所有中间件
+func (e *Application) GetMiddlewareMap() map[string]interface{} {
 	return e.middlewares
 	return e.middlewares
 }
 }
 
 
-// GetMiddlewareKey 获取对应key的中间件
-func (e *Application) GetMiddlewareKey(key string) interface{} {
+// GetMiddleware 获取对应key的中间件
+func (e *Application) GetMiddleware(c *gin.Context) interface{} {
+	key := c.GetHeader("middleware")
+	if key == "" {
+		key = c.GetHeader("middleware-key")
+	}
+	if key == "" {
+		key = e.GetKey(c)
+	}
+	return e.GetMiddlewareByKey(key)
+}
+
+// GetMiddlewareByKey 获取对应key的中间件
+func (e *Application) GetMiddlewareByKey(key string) interface{} {
 	e.mux.Lock()
 	e.mux.Lock()
 	defer e.mux.Unlock()
 	defer e.mux.Unlock()
 	return e.middlewares[key]
 	return e.middlewares[key]
@@ -203,8 +268,8 @@ func (e *Application) GetCacheAdapter() storage.AdapterCache {
 	return NewCache("", e.cache, "")
 	return NewCache("", e.cache, "")
 }
 }
 
 
-// GetCachePrefix 获取带租户标记的cache
-func (e *Application) GetCachePrefix(key string) storage.AdapterCache {
+// GetCacheByKey 获取对应key的cache
+func (e *Application) GetCacheByKey(key string) storage.AdapterCache {
 	return NewCache(key, e.cache, "")
 	return NewCache(key, e.cache, "")
 }
 }
 
 
@@ -218,11 +283,26 @@ func (e *Application) GetQueueAdapter() storage.AdapterQueue {
 	return NewQueue("", e.queue)
 	return NewQueue("", e.queue)
 }
 }
 
 
-// GetQueuePrefix 获取带租户标记的queue
-func (e *Application) GetQueuePrefix(key string) storage.AdapterQueue {
+// GetQueue 获取队列
+func (e *Application) GetQueue(c *gin.Context) storage.AdapterQueue {
+	return e.GetQueueByKey(e.GetKey(c))
+}
+
+// GetQueueByKey 获取对应key的queue
+func (e *Application) GetQueueByKey(key string) storage.AdapterQueue {
 	return NewQueue(key, e.queue)
 	return NewQueue(key, e.queue)
 }
 }
 
 
+// GetMemoryQueue 获取内存队列
+func (e *Application) GetMemoryQueue(c *gin.Context) storage.AdapterQueue {
+	return e.GetMemoryQueueByKey(e.GetKey(c))
+}
+
+// GetMemoryQueueByKey 获取内存队列
+func (e *Application) GetMemoryQueueByKey(key string) storage.AdapterQueue {
+	return NewQueue(key, e.memoryQueue)
+}
+
 // SetLockerAdapter 设置分布式锁
 // SetLockerAdapter 设置分布式锁
 func (e *Application) SetLockerAdapter(c storage.AdapterLocker) {
 func (e *Application) SetLockerAdapter(c storage.AdapterLocker) {
 	e.locker = c
 	e.locker = c
@@ -233,8 +313,8 @@ func (e *Application) GetLockerAdapter() storage.AdapterLocker {
 	return NewLocker("", e.locker)
 	return NewLocker("", e.locker)
 }
 }
 
 
-// GetLockerPrefix 获取带租户标记的分布式锁
-func (e *Application) GetLockerPrefix(key string) storage.AdapterLocker {
+// GetLockerByKey 获取对应key的locker
+func (e *Application) GetLockerByKey(key string) storage.AdapterLocker {
 	return NewLocker(key, e.locker)
 	return NewLocker(key, e.locker)
 }
 }
 
 
@@ -245,15 +325,27 @@ func (e *Application) SetHandler(key string, routerGroup func(r *gin.RouterGroup
 	e.handler[key] = append(e.handler[key], routerGroup)
 	e.handler[key] = append(e.handler[key], routerGroup)
 }
 }
 
 
-// GetHandler 返回应用的路由处理器
-func (e *Application) GetHandler() map[string][]func(r *gin.RouterGroup, hand ...*gin.HandlerFunc) {
+// GetHandlerMap 返回应用的路由处理器
+func (e *Application) GetHandlerMap() map[string][]func(r *gin.RouterGroup, hand ...*gin.HandlerFunc) {
 	e.mux.Lock()
 	e.mux.Lock()
 	defer e.mux.Unlock()
 	defer e.mux.Unlock()
 	return e.handler
 	return e.handler
 }
 }
 
 
-// GetHandlerPrefix 返回指定键的路由处理器
-func (e *Application) GetHandlerPrefix(key string) []func(r *gin.RouterGroup, hand ...*gin.HandlerFunc) {
+// GetHandler 返回指定键的路由处理器
+func (e *Application) GetHandler(c *gin.Context) []func(r *gin.RouterGroup, hand ...*gin.HandlerFunc) {
+	key := c.GetHeader("handler")
+	if key == "" {
+		key = c.GetHeader("handler-key")
+	}
+	if key == "" {
+		key = e.GetKey(c)
+	}
+	return e.GetHandlerByKey(key)
+}
+
+// GetHandlerByKey 返回指定键的路由处理器
+func (e *Application) GetHandlerByKey(key string) []func(r *gin.RouterGroup, hand ...*gin.HandlerFunc) {
 	e.mux.Lock()
 	e.mux.Lock()
 	defer e.mux.Unlock()
 	defer e.mux.Unlock()
 	return e.handler[key]
 	return e.handler[key]
@@ -277,8 +369,3 @@ func (e *Application) BuildStreamMessage(id, stream string, value map[string]int
 	message.SetValues(value)
 	message.SetValues(value)
 	return message, nil
 	return message, nil
 }
 }
-
-// GetMemoryQueue 获取队列
-func (e *Application) GetMemoryQueue(prefix string) storage.AdapterQueue {
-	return NewQueue(prefix, e.memoryQueue)
-}

+ 5 - 5
SERVER/VberAdmin/core/sdk/runtime/queue.go

@@ -3,15 +3,15 @@ package runtime
 import "VberAdmin/core/storage"
 import "VberAdmin/core/storage"
 
 
 type Queue struct {
 type Queue struct {
-	prefix string
-	queue  storage.AdapterQueue
+	key   string
+	queue storage.AdapterQueue
 }
 }
 
 
 // NewQueue 创建对应上下文队列
 // NewQueue 创建对应上下文队列
 func NewQueue(prefix string, queue storage.AdapterQueue) storage.AdapterQueue {
 func NewQueue(prefix string, queue storage.AdapterQueue) storage.AdapterQueue {
 	return &Queue{
 	return &Queue{
-		prefix: prefix,
-		queue:  queue,
+		key:   prefix,
+		queue: queue,
 	}
 	}
 }
 }
 
 
@@ -30,7 +30,7 @@ func (e *Queue) Append(message storage.Message) error {
 	if values == nil {
 	if values == nil {
 		values = make(map[string]interface{})
 		values = make(map[string]interface{})
 	}
 	}
-	values[storage.PrefixKey] = e.prefix
+	values[storage.KEY] = e.key
 	return e.queue.Append(message)
 	return e.queue.Append(message)
 }
 }
 
 

+ 23 - 13
SERVER/VberAdmin/core/sdk/runtime/type.go

@@ -13,14 +13,19 @@ import (
 )
 )
 
 
 type Runtime interface {
 type Runtime interface {
+	GetDefaultKey() string
+	GetKey(c *gin.Context) string
+
 	// SetDb 多db设置,⚠️SetDbs不允许并发,可以根据自己的业务,例如app分库、host分库
 	// SetDb 多db设置,⚠️SetDbs不允许并发,可以根据自己的业务,例如app分库、host分库
 	SetDb(key string, db *gorm.DB)
 	SetDb(key string, db *gorm.DB)
-	GetDb() map[string]*gorm.DB
+	GetDbMap() map[string]*gorm.DB
+	GetDb(c *gin.Context) *gorm.DB
 	GetDbByKey(key string) *gorm.DB
 	GetDbByKey(key string) *gorm.DB
 
 
 	SetCasbin(key string, enforcer *casbin.SyncedEnforcer)
 	SetCasbin(key string, enforcer *casbin.SyncedEnforcer)
-	GetCasbin() map[string]*casbin.SyncedEnforcer
-	GetCasbinKey(key string) *casbin.SyncedEnforcer
+	GetCasbinMap() map[string]*casbin.SyncedEnforcer
+	GetCasbin(c *gin.Context) *casbin.SyncedEnforcer
+	GetCasbinByKey(key string) *casbin.SyncedEnforcer
 
 
 	// SetEngine 使用的路由
 	// SetEngine 使用的路由
 	SetEngine(engine http.Handler)
 	SetEngine(engine http.Handler)
@@ -34,31 +39,36 @@ type Runtime interface {
 
 
 	// SetCrontab crontab
 	// SetCrontab crontab
 	SetCrontab(key string, crontab *cron.Cron)
 	SetCrontab(key string, crontab *cron.Cron)
-	GetCrontab() map[string]*cron.Cron
-	GetCrontabKey(key string) *cron.Cron
+	GetCrontabMap() map[string]*cron.Cron
+	GetCrontab(c *gin.Context) *cron.Cron
+	GetCrontabByKey(key string) *cron.Cron
 
 
 	// SetMiddleware middleware
 	// SetMiddleware middleware
 	SetMiddleware(string, interface{})
 	SetMiddleware(string, interface{})
-	GetMiddleware() map[string]interface{}
-	GetMiddlewareKey(key string) interface{}
+	GetMiddlewareMap() map[string]interface{}
+	GetMiddleware(c *gin.Context) interface{}
+	GetMiddlewareByKey(key string) interface{}
 
 
 	// SetCacheAdapter cache
 	// SetCacheAdapter cache
 	SetCacheAdapter(storage.AdapterCache)
 	SetCacheAdapter(storage.AdapterCache)
 	GetCacheAdapter() storage.AdapterCache
 	GetCacheAdapter() storage.AdapterCache
-	GetCachePrefix(string) storage.AdapterCache
+	GetCacheByKey(string) storage.AdapterCache
 
 
-	GetMemoryQueue(string) storage.AdapterQueue
 	SetQueueAdapter(storage.AdapterQueue)
 	SetQueueAdapter(storage.AdapterQueue)
 	GetQueueAdapter() storage.AdapterQueue
 	GetQueueAdapter() storage.AdapterQueue
-	GetQueuePrefix(string) storage.AdapterQueue
+	GetQueue(c *gin.Context) storage.AdapterQueue
+	GetQueueByKey(string) storage.AdapterQueue
+	GetMemoryQueue(c *gin.Context) storage.AdapterQueue
+	GetMemoryQueueByKey(key string) storage.AdapterQueue
 
 
 	SetLockerAdapter(storage.AdapterLocker)
 	SetLockerAdapter(storage.AdapterLocker)
 	GetLockerAdapter() storage.AdapterLocker
 	GetLockerAdapter() storage.AdapterLocker
-	GetLockerPrefix(string) storage.AdapterLocker
+	GetLockerByKey(string) storage.AdapterLocker
 
 
 	SetHandler(key string, routerGroup func(r *gin.RouterGroup, hand ...*gin.HandlerFunc))
 	SetHandler(key string, routerGroup func(r *gin.RouterGroup, hand ...*gin.HandlerFunc))
-	GetHandler() map[string][]func(r *gin.RouterGroup, hand ...*gin.HandlerFunc)
-	GetHandlerPrefix(key string) []func(r *gin.RouterGroup, hand ...*gin.HandlerFunc)
+	GetHandler(c *gin.Context) []func(r *gin.RouterGroup, hand ...*gin.HandlerFunc)
+	GetHandlerMap() map[string][]func(r *gin.RouterGroup, hand ...*gin.HandlerFunc)
+	GetHandlerByKey(key string) []func(r *gin.RouterGroup, hand ...*gin.HandlerFunc)
 
 
 	BuildStreamMessage(id, stream string, value map[string]interface{}) (storage.Message, error)
 	BuildStreamMessage(id, stream string, value map[string]interface{}) (storage.Message, error)
 
 

+ 4 - 4
SERVER/VberAdmin/core/storage/queue/message.go

@@ -41,23 +41,23 @@ func (m *Message) SetValues(values map[string]interface{}) {
 	m.Values = values
 	m.Values = values
 }
 }
 
 
-func (m *Message) GetPrefix() (prefix string) {
+func (m *Message) GetKey() (prefix string) {
 	m.mux.Lock()
 	m.mux.Lock()
 	defer m.mux.Unlock()
 	defer m.mux.Unlock()
 	if m.Values == nil {
 	if m.Values == nil {
 		return
 		return
 	}
 	}
-	v, _ := m.Values[storage.PrefixKey]
+	v, _ := m.Values[storage.KEY]
 	prefix, _ = v.(string)
 	prefix, _ = v.(string)
 	return
 	return
 }
 }
-func (m *Message) SetPrefix(prefix string) {
+func (m *Message) SetKey(prefix string) {
 	m.mux.Lock()
 	m.mux.Lock()
 	defer m.mux.Unlock()
 	defer m.mux.Unlock()
 	if m.Values == nil {
 	if m.Values == nil {
 		m.Values = make(map[string]interface{})
 		m.Values = make(map[string]interface{})
 	}
 	}
-	m.Values[storage.PrefixKey] = prefix
+	m.Values[storage.KEY] = prefix
 }
 }
 
 
 func (m *Message) GetErrorCount() int {
 func (m *Message) GetErrorCount() int {

+ 3 - 3
SERVER/VberAdmin/core/storage/type.go

@@ -7,7 +7,7 @@ import (
 )
 )
 
 
 const (
 const (
-	PrefixKey = "__hostvb"
+	KEY = "__storage_vber"
 )
 )
 
 
 type AdapterCache interface {
 type AdapterCache interface {
@@ -42,8 +42,8 @@ type Message interface {
 	GetID() string
 	GetID() string
 	GetStream() string
 	GetStream() string
 	GetValues() map[string]interface{}
 	GetValues() map[string]interface{}
-	GetPrefix() string
-	SetPrefix(string)
+	GetKey() string
+	SetKey(string)
 	SetErrorCount(count int)
 	SetErrorCount(count int)
 	GetErrorCount() int
 	GetErrorCount() int
 }
 }

+ 8 - 8
SERVER/VberAdmin/migration/init.go

@@ -33,16 +33,16 @@ func GenFile(vbAdmin bool) error {
 	return nil
 	return nil
 }
 }
 
 
-func MigrateModel(host string) error {
-	if host == "" {
-		host = "*"
+func MigrateModel(dbKey string) error {
+	if dbKey == "" {
+		dbKey = sdk.Runtime.GetDefaultKey()
 	}
 	}
-	db := sdk.Runtime.GetDbByKey(host)
+	db := sdk.Runtime.GetDbByKey(dbKey)
 	if db == nil {
 	if db == nil {
-		if len(sdk.Runtime.GetDb()) == 1 && host == "*" {
-			for k, v := range sdk.Runtime.GetDb() {
+		if len(sdk.Runtime.GetDbMap()) == 1 && dbKey == sdk.Runtime.GetDefaultKey() {
+			for k, v := range sdk.Runtime.GetDbMap() {
 				db = v
 				db = v
-				host = k
+				dbKey = k
 				break
 				break
 			}
 			}
 		}
 		}
@@ -50,7 +50,7 @@ func MigrateModel(host string) error {
 	if db == nil {
 	if db == nil {
 		return fmt.Errorf("未找到数据库配置")
 		return fmt.Errorf("未找到数据库配置")
 	}
 	}
-	if config.DatabasesConfig[host].Driver == "mysql" {
+	if config.DatabasesConfig[dbKey].Driver == "mysql" {
 		//初始化数据库时候用
 		//初始化数据库时候用
 		db.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4")
 		db.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4")
 	}
 	}

+ 2 - 2
SERVER/VberAdmin/server/api.go

@@ -43,7 +43,7 @@ func init() {
 		storage.Setup,
 		storage.Setup,
 	)
 	)
 	//2. 注册监听函数
 	//2. 注册监听函数
-	queue := sdk.Runtime.GetMemoryQueue("")
+	queue := sdk.Runtime.GetMemoryQueueByKey("")
 	queue.Register(global.LoginLog, models.SaveLoginLog)
 	queue.Register(global.LoginLog, models.SaveLoginLog)
 	queue.Register(global.OperateLog, models.SaveOperaLog)
 	queue.Register(global.OperateLog, models.SaveOperaLog)
 	queue.Register(global.ApiCheck, models.SaveSysApi)
 	queue.Register(global.ApiCheck, models.SaveSysApi)
@@ -72,7 +72,7 @@ func Init() {
 
 
 	if *apiCheck {
 	if *apiCheck {
 		var routers = sdk.Runtime.GetRouter()
 		var routers = sdk.Runtime.GetRouter()
-		q := sdk.Runtime.GetMemoryQueue("")
+		q := sdk.Runtime.GetMemoryQueueByKey("")
 		mp := make(map[string]interface{})
 		mp := make(map[string]interface{})
 		mp["List"] = routers
 		mp["List"] = routers
 		message, err := sdk.Runtime.BuildStreamMessage("", global.ApiCheck, mp)
 		message, err := sdk.Runtime.BuildStreamMessage("", global.ApiCheck, mp)

+ 2 - 2
SERVER/VberAdmin/server/migrate.go

@@ -18,7 +18,7 @@ import (
 var (
 var (
 	generate    = pflag.BoolP("generate", "g", false, "生成迁移文件")
 	generate    = pflag.BoolP("generate", "g", false, "生成迁移文件")
 	migrateFile = pflag.BoolP("file", "f", false, "生成VberAdmin迁移文件")
 	migrateFile = pflag.BoolP("file", "f", false, "生成VberAdmin迁移文件")
-	domain      = pflag.StringP("domain", "d", "*", "选择租户域名")
+	dbKey       = pflag.StringP("dbKey", "d", "*", "选择数据库的KEY")
 )
 )
 
 
 func init() {
 func init() {
@@ -43,7 +43,7 @@ func Init() {
 	} else {
 	} else {
 		//  数据库迁移
 		//  数据库迁移
 		fmt.Println("数据库迁移开始")
 		fmt.Println("数据库迁移开始")
-		err := migration.MigrateModel(*domain)
+		err := migration.MigrateModel(*dbKey)
 		if err != nil {
 		if err != nil {
 			fmt.Println(`数据库基础数据初始化失败`, err.Error())
 			fmt.Println(`数据库基础数据初始化失败`, err.Error())
 			return
 			return

+ 2 - 0
UI/VAG.VUE/src/.d.ts/axios.d.ts

@@ -26,6 +26,8 @@ declare module "axios" {
 		successAlert?: boolean
 		successAlert?: boolean
 		errorAlert?: boolean
 		errorAlert?: boolean
 		needProcess?: boolean
 		needProcess?: boolean
+		key?: string
+		keyFun?: (header: any) => any
 	}
 	}
 	export interface AxiosInstance {
 	export interface AxiosInstance {
 		<T = any>(config: AxiosRequestConfig): Promise<T>
 		<T = any>(config: AxiosRequestConfig): Promise<T>

+ 7 - 1
UI/VAG.VUE/src/core/services/RequestService.ts

@@ -24,7 +24,8 @@ const defaultOption = {
 	contentType: "application/json",
 	contentType: "application/json",
 	successAlert: false,
 	successAlert: false,
 	errorAlert: true,
 	errorAlert: true,
-	needProcess: true
+	needProcess: true,
+	key: "*"
 }
 }
 
 
 axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"
 axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"
@@ -59,6 +60,11 @@ Rs.interceptors.request.use(
 		if (config.contentType) {
 		if (config.contentType) {
 			config.headers["Content-Type"] = config.contentType
 			config.headers["Content-Type"] = config.contentType
 		}
 		}
+		if (config.keyFun) {
+			config.headers = config.keyFun(config.headers)
+		} else if (config.key) {
+			config.headers["key"] = config.key
+		}
 		// get请求映射params参数
 		// get请求映射params参数
 		if (config.method === "get" && config.params) {
 		if (config.method === "get" && config.params) {
 			const url = config.url + "?" + tansParams(config.params).slice(0, -1)
 			const url = config.url + "?" + tansParams(config.params).slice(0, -1)