diff --git a/api/api.go b/api/api.go index 7f919d98..48af0afa 100644 --- a/api/api.go +++ b/api/api.go @@ -18,7 +18,7 @@ func LoadFrom(dir string, prefix string) { return } - share.Walk(dir, ".json", func(root, filename string) { + share.Walk(dir, ".http.json", func(root, filename string) { name := prefix + share.SpecName(root, filename) content := share.ReadFile(filename) gou.LoadAPI(string(content), name) diff --git a/cmd/root.go b/cmd/root.go index a17290b4..35c33946 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -30,11 +30,11 @@ var rootCmd = &cobra.Command{ func init() { rootCmd.AddCommand( versionCmd, - domainCmd, + // domainCmd, migrateCmd, inspectCmd, startCmd, - importCmd, + // importCmd, runCmd, ) rootCmd.SetHelpCommand(helpCmd) diff --git a/cmd/start.go b/cmd/start.go index 249116be..64137298 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -68,11 +68,11 @@ var startCmd = &cobra.Command{ port = "" } - fmt.Printf(color.GreenString("\n\n访问入口")) + fmt.Printf(color.GreenString("\n\n象传应用引擎")) fmt.Printf(color.WhiteString("\n---------------------------------")) - fmt.Printf(color.GreenString("\n前台界面: http://%s%s/\n", domain, port)) - fmt.Printf(color.GreenString("管理后台: http://%s%s/xiang/login\n", domain, port)) - fmt.Printf(color.GreenString("API 接口: http://%s%s/api\n", domain, port)) + fmt.Printf(color.GreenString("\n前台界面: http://%s%s/\n", "127.0.0.1", port)) + fmt.Printf(color.GreenString("管理后台: http://%s%s/xiang/login/admin\n", "127.0.0.1", port)) + fmt.Printf(color.GreenString("API 接口: http://%s%s/api\n", "127.0.0.1", port)) fmt.Printf(color.GreenString("跨域访问: %s\n\n", strings.Join(config.Conf.Service.Allow, ","))) // 调试模式 @@ -80,6 +80,16 @@ var startCmd = &cobra.Command{ service.Watch(config.Conf) } + if len(args) > 0 && args[0] == "alpha" { + // 启动 Socket 服务 (alpha) + for _, srv := range gou.Servers { + fmt.Printf(color.GreenString("%s服务", srv.Name)) + fmt.Printf(color.WhiteString("\n---------------------------------")) + fmt.Printf(color.GreenString("\nHost: %s://%s", srv.Protocol, srv.Host)) + fmt.Printf(color.GreenString("\nPort: %s\n\n", srv.Port)) + go srv.Start() + } + } service.Start() }, } diff --git a/engine/load.go b/engine/load.go index 8fbef795..a59460f9 100644 --- a/engine/load.go +++ b/engine/load.go @@ -16,6 +16,7 @@ import ( "github.com/yaoapp/xiang/page" "github.com/yaoapp/xiang/plugin" "github.com/yaoapp/xiang/query" + "github.com/yaoapp/xiang/server" "github.com/yaoapp/xiang/share" "github.com/yaoapp/xiang/table" "github.com/yaoapp/xiang/workflow" @@ -42,6 +43,7 @@ func Load(cfg config.Config) { importer.Load(cfg) // 加载数据导入 imports workflow.Load(cfg) // 加载工作流 workflow api.Load(cfg) // 加载业务接口 API + server.Load(cfg) // 加载服务 // 加密密钥函数 gou.LoadCrypt(fmt.Sprintf(`{"key":"%s"}`, cfg.Database.AESKey), "AES") diff --git a/flow/flow_test.go b/flow/flow_test.go index f60d2f18..6b09db6c 100644 --- a/flow/flow_test.go +++ b/flow/flow_test.go @@ -20,5 +20,5 @@ func check(t *testing.T) { for key := range gou.Flows { keys = append(keys, key) } - assert.Equal(t, 21, len(keys)) + assert.Equal(t, 22, len(keys)) } diff --git a/server/socket.go b/server/socket.go new file mode 100644 index 00000000..9f0bd6f0 --- /dev/null +++ b/server/socket.go @@ -0,0 +1,29 @@ +package server + +import ( + "path/filepath" + + "github.com/yaoapp/gou" + "github.com/yaoapp/xiang/config" + "github.com/yaoapp/xiang/share" +) + +// Load 加载API +func Load(cfg config.Config) { + var root = filepath.Join(cfg.RootAPI, "..", "servers") + LoadFrom(root, "") +} + +// LoadFrom 从特定目录加载 +func LoadFrom(dir string, prefix string) { + + if share.DirNotExists(dir) { + return + } + + share.Walk(dir, ".sock.json", func(root, filename string) { + name := prefix + share.SpecName(root, filename) + content := share.ReadFile(filename) + gou.LoadServer(string(content), name) + }) +} diff --git a/server/socket_test.go b/server/socket_test.go new file mode 100644 index 00000000..e32980ca --- /dev/null +++ b/server/socket_test.go @@ -0,0 +1,23 @@ +package server + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/yaoapp/gou" + "github.com/yaoapp/xiang/config" +) + +func TestLoad(t *testing.T) { + Load(config.Conf) + LoadFrom("not a path", "404.") + check(t) +} + +func check(t *testing.T) { + keys := []string{} + for key := range gou.Servers { + keys = append(keys, key) + } + assert.Equal(t, 1, len(keys)) +} diff --git a/share/const.go b/share/const.go index c450fb1d..a0b01a5c 100644 --- a/share/const.go +++ b/share/const.go @@ -1,7 +1,7 @@ package share // VERSION 版本号 -const VERSION = "0.9.2" +const VERSION = "0.9.3" // DOMAIN 许可域(废弃) const DOMAIN = "*.iqka.com" diff --git a/tests/flows/rfid/read.flow.json b/tests/flows/rfid/read.flow.json new file mode 100644 index 00000000..8c8030b8 --- /dev/null +++ b/tests/flows/rfid/read.flow.json @@ -0,0 +1,7 @@ +{ + "label": "读取RFID标签", + "version": "1.0.0", + "description": "读取RFID标签", + "nodes": [{ "script": "print" }], + "output": null +} diff --git a/tests/flows/rfid/read.print.js b/tests/flows/rfid/read.print.js new file mode 100644 index 00000000..8db5c50a --- /dev/null +++ b/tests/flows/rfid/read.print.js @@ -0,0 +1,11 @@ +function main(args, out, res) { + // 100000012021128798321101 15 2d 02 f2 96 72 1e 52 b9 cd + var idstr = args[0] || ""; + var len = idstr.length; + + if (len != 36) { + return; + } + id = BigInt("0x" + idstr.substring(8, len - 8).toUpperCase()).toString(10); + console.log(id); +} diff --git a/tests/servers/rfid.sock.json b/tests/servers/rfid.sock.json new file mode 100644 index 00000000..7f908a77 --- /dev/null +++ b/tests/servers/rfid.sock.json @@ -0,0 +1,9 @@ +{ + "name": "RFID接收器", + "description": "用来接收并处理RIFD", + "version": "0.0.1", + "protocol": "tcp", + "host": "0.0.0.0", + "port": "3019", + "process": "flows.rfid.read" +}