优化载入逻辑: Step 3/5

This commit is contained in:
Max 2021-10-18 23:42:28 +08:00
parent 1d5f1d110f
commit 9cffe860d8
8 changed files with 170 additions and 32 deletions

View file

@ -13,18 +13,22 @@ import (
"github.com/yaoapp/xiang/app"
"github.com/yaoapp/xiang/config"
"github.com/yaoapp/xiang/flow"
"github.com/yaoapp/xiang/model"
"github.com/yaoapp/xiang/share"
"github.com/yaoapp/xiang/table"
"github.com/yaoapp/xun/capsule"
)
// Load 根据配置加载 API, FLow, Model, Plugin
func Load(cfg config.Config) {
share.DBConnect(cfg.Database) // 创建数据库连接
app.Load(cfg) // 加载应用信息
DBConnect(cfg.Database)
LoadEngine(cfg.Path)
api.Load(cfg) // 加载API
flow.Load(cfg) // 加载Flow
model.Load(cfg) // 加载数据模型
api.Load(cfg) // 加载API
flow.Load(cfg) // 加载Flow
LoadApp(share.AppRoot{
APIs: cfg.RootAPI,
Flows: cfg.RootFLow,
@ -50,22 +54,22 @@ func Reload(cfg config.Config) {
Load(cfg)
}
// DBConnect 建立数据库连接
func DBConnect(dbconfig config.DatabaseConfig) {
// // DBConnect 建立数据库连接
// func DBConnect(dbconfig config.DatabaseConfig) {
// 连接主库
for i, dsn := range dbconfig.Primary {
db := capsule.AddConn("primary", dbconfig.Driver, dsn)
if i == 0 {
db.SetAsGlobal()
}
}
// // 连接主库
// for i, dsn := range dbconfig.Primary {
// db := capsule.AddConn("primary", dbconfig.Driver, dsn)
// if i == 0 {
// db.SetAsGlobal()
// }
// }
// 连接从库
for _, dsn := range dbconfig.Secondary {
capsule.AddReadConn("secondary", dbconfig.Driver, dsn)
}
}
// // 连接从库
// for _, dsn := range dbconfig.Secondary {
// capsule.AddReadConn("secondary", dbconfig.Driver, dsn)
// }
// }
// LoadEngine 加载引擎的 API, Flow, Model 配置
func LoadEngine(from string) {
@ -155,14 +159,14 @@ func LoadApp(app share.AppRoot) {
// }
// }
// 加载Model
if strings.HasPrefix(app.Models, "fs://") || !strings.Contains(app.Models, "://") {
root := strings.TrimPrefix(app.Models, "fs://")
scripts := share.GetAppFilesFS(root, ".json")
for _, script := range scripts {
gou.LoadModel(string(script.Content), script.Name)
}
}
// // 加载Model
// if strings.HasPrefix(app.Models, "fs://") || !strings.Contains(app.Models, "://") {
// root := strings.TrimPrefix(app.Models, "fs://")
// scripts := share.GetAppFilesFS(root, ".json")
// for _, script := range scripts {
// gou.LoadModel(string(script.Content), script.Name)
// }
// }
// 加载Plugin
if strings.HasPrefix(app.Plugins, "fs://") || !strings.Contains(app.Plugins, "://") {

View file

@ -1,16 +1,13 @@
package flow
import (
"fmt"
"github.com/yaoapp/gou"
"github.com/yaoapp/xiang/config"
"github.com/yaoapp/xiang/share"
)
// Load 加载API
// Load 加载业务逻辑编排
func Load(cfg config.Config) {
fmt.Println(cfg.RootFLow)
LoadFrom(cfg.RootFLow, "")
}

View file

@ -3,7 +3,7 @@ package flow
import (
"testing"
"github.com/go-playground/assert/v2"
"github.com/stretchr/testify/assert"
"github.com/yaoapp/gou"
"github.com/yaoapp/xiang/config"
)

22
model/init_test.go Normal file
View file

@ -0,0 +1,22 @@
package model
import (
"os"
"testing"
"github.com/yaoapp/gou"
"github.com/yaoapp/xiang/config"
)
var cfg config.Config
func TestMain(m *testing.M) {
// Run test suites
exitVal := m.Run()
// we can do clean up code here
gou.KillPlugins()
os.Exit(exitVal)
}

View file

@ -1,4 +1,26 @@
package model
import (
"github.com/yaoapp/gou"
"github.com/yaoapp/xiang/config"
"github.com/yaoapp/xiang/share"
)
// Load 加载数据模型
func Load(filepath string) {}
func Load(cfg config.Config) {
LoadFrom(cfg.RootModel, "")
}
// LoadFrom 从特定目录加载
func LoadFrom(dir string, prefix string) {
if share.DirNotExists(dir) {
return
}
share.Walk(dir, ".json", func(root, filename string) {
name := share.SpecName(root, filename)
content := share.ReadFile(filename)
gou.LoadModel(string(content), prefix+name)
})
}

27
model/model_test.go Normal file
View file

@ -0,0 +1,27 @@
package model
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/yaoapp/gou"
"github.com/yaoapp/xiang/config"
"github.com/yaoapp/xiang/share"
)
func TestLoad(t *testing.T) {
share.DBConnect(config.Conf.Database)
gou.Models = make(map[string]*gou.Model)
Load(config.Conf)
LoadFrom("not a path", "404.")
check(t)
}
func check(t *testing.T) {
keys := []string{}
for key := range gou.Models {
keys = append(keys, key)
}
assert.Equal(t, 9, len(keys))
}

23
share/db.go Normal file
View file

@ -0,0 +1,23 @@
package share
import (
"github.com/yaoapp/xiang/config"
"github.com/yaoapp/xun/capsule"
)
// DBConnect 建立数据库连接
func DBConnect(dbconfig config.DatabaseConfig) {
// 连接主库
for i, dsn := range dbconfig.Primary {
db := capsule.AddConn("primary", dbconfig.Driver, dsn)
if i == 0 {
db.SetAsGlobal()
}
}
// 连接从库
for _, dsn := range dbconfig.Secondary {
capsule.AddReadConn("secondary", dbconfig.Driver, dsn)
}
}

View file

@ -0,0 +1,43 @@
{
"name": "用户角色",
"table": {
"name": "foo_bar",
"comment": "用户角色关系表",
"engine": "InnoDB"
},
"columns": [
{ "name": "id", "type": "ID" },
{
"label": "用户ID",
"name": "user_id",
"type": "bigInteger",
"comment": "所属用户",
"index": true
},
{
"label": "角色ID",
"name": "role_id",
"type": "bigInteger",
"comment": "角色ID",
"index": true
},
{
"label": "状态",
"name": "status",
"type": "enum",
"default": "enabled",
"option": ["enabled", "disabled"],
"comment": "状态 enabled 开启, disabled 关闭",
"index": true
}
],
"relations": {},
"option": { "timestamps": true, "soft_deletes": true },
"values": [
{ "user_id": 1, "role_id": 1 },
{ "user_id": 1, "role_id": 2 },
{ "user_id": 2, "role_id": 3 },
{ "user_id": 2, "role_id": 4 },
{ "user_id": 3, "role_id": 1 }
]
}