From 29f3442ac09e5a96aecc56990ddc29e09d884f33 Mon Sep 17 00:00:00 2001 From: shaoying Date: Mon, 13 May 2019 19:01:07 +0800 Subject: [PATCH] add eachField --- src/contexts/cli/cli.go | 49 ++++-- src/contexts/ssh/ssh.go | 69 +++++--- src/examples/chat/chat.go | 7 +- usr/librarys/chat.css | 2 - usr/librarys/chat.js | 199 ++++++++--------------- usr/librarys/context.js | 7 + usr/librarys/example.js | 36 +++- usr/librarys/toolkit.js | 34 ++-- usr/wiki/自然/编程/终端工具链/context.md | 32 +++- 9 files changed, 237 insertions(+), 198 deletions(-) diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index fb46820b..9cc11336 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -99,7 +99,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", }, Configs: map[string]*ctx.Config{ "runtime": &ctx.Config{Name: "runtime", Value: map[string]interface{}{ - "init_env": []interface{}{"ctx_cas", "ctx_dev", "ctx_box", "ctx_root", "ctx_home", "USER"}, + "init_env": []interface{}{"ctx_cas", "ctx_dev", "ctx_box", "ctx_root", "ctx_home", "web_port", "ssh_port", "USER"}, "boot": map[string]interface{}{"web_port": ":9094", "ssh_port": ":9090"}, }, Help: "运行环境"}, @@ -146,20 +146,35 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", return }}, "runtime": &ctx.Command{Name: "runtime", Help: "runtime", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { - mem := &runtime.MemStats{} - runtime.ReadMemStats(mem) - m.Append("NumCPU", runtime.NumCPU()) - m.Append("NumGo", runtime.NumGoroutine()) - m.Append("NumGC", mem.NumGC) - m.Append("other", kit.FmtSize(mem.OtherSys)) - m.Append("stack", kit.FmtSize(mem.StackSys)) - m.Append("heapsys", kit.FmtSize(mem.HeapSys)) - m.Append("heapidle", kit.FmtSize(mem.HeapIdle)) - m.Append("heapinuse", kit.FmtSize(mem.HeapInuse)) - m.Append("heapalloc", kit.FmtSize(mem.HeapAlloc)) - m.Append("objects", mem.HeapObjects) - m.Append("lookups", mem.Lookups) - m.Table() + if len(arg) == 0 { + m.Cmdy("ctx.config", "runtime") + return + } + + switch arg[0] { + case "system": + mem := &runtime.MemStats{} + runtime.ReadMemStats(mem) + m.Append("NumCPU", runtime.NumCPU()) + m.Append("NumGo", runtime.NumGoroutine()) + m.Append("NumGC", mem.NumGC) + m.Append("other", kit.FmtSize(mem.OtherSys)) + m.Append("stack", kit.FmtSize(mem.StackSys)) + m.Append("heapsys", kit.FmtSize(mem.HeapSys)) + m.Append("heapidle", kit.FmtSize(mem.HeapIdle)) + m.Append("heapinuse", kit.FmtSize(mem.HeapInuse)) + m.Append("heapalloc", kit.FmtSize(mem.HeapAlloc)) + m.Append("objects", mem.HeapObjects) + m.Append("lookups", mem.Lookups) + m.Table() + default: + if len(arg) == 1 { + m.Cmdy("ctx.config", "runtime", arg[0]) + return + } + m.Conf("runtime", arg[0], arg[1]) + m.Echo(arg[1]) + } return }}, "system": &ctx.Command{Name: "system word...", Help: []string{"调用系统命令, word: 命令", @@ -664,7 +679,9 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", m.Conf("runtime", "boot.pathname", file) } m.Confm("runtime", "init_env", func(index int, key string) { - m.Conf("runtime", "boot."+key, os.Getenv(key)) + if value := os.Getenv(key); value != "" { + m.Conf("runtime", "boot."+key, kit.Select("", value, value != "-")) + } }) return }}, diff --git a/src/contexts/ssh/ssh.go b/src/contexts/ssh/ssh.go index 2ea7ac87..d0d776fb 100644 --- a/src/contexts/ssh/ssh.go +++ b/src/contexts/ssh/ssh.go @@ -49,7 +49,6 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", } m.Conf("runtime", "node.route", m.Conf("runtime", "node.name")) m.Conf("runtime", "user.name", m.Conf("runtime", "boot.USER")) - m.Conf("runtime", "work.name", m.Conf("runtime", "boot.USER")) return }}, "node": &ctx.Command{Name: "node [create|delete [name [type module]]]", Help: "节点", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { @@ -192,12 +191,27 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", switch arg[1] { case "create": // 创建证书 - if name := m.Cmdx("ssh.remote", arg[2], "check", "work", arg[3], m.Conf("runtime", "user.route"), m.Conf("runtime", "user.cert")); name != "" { - m.Conf("runtime", "work.route", arg[2]) - m.Conf("runtime", "work.name", name) - m.Echo(name) + user := m.Conf("runtime", "user.route") + if user == "" { + m.Echo("error: no user.route") + return } + name := kit.Select(m.Conf("runtime", "user.name"), arg, 2) + work := kit.Select(m.Conf("runtime", "work.route"), arg, 3) + + if n := m.Cmdx("ssh.remote", work, "check", "work", name, user); n != "" { + m.Conf("runtime", "work.route", work) + m.Conf("runtime", "work.name", n) + m.Echo(n) + } else { + m.Echo("error: %s from %s", name, work) + } + + case "search": + work := kit.Select(m.Conf("runtime", "work.route"), arg, 3) + m.Cmdy("ssh.remote", work, "check", "work", "search") + case "check": // 数字验签 if m.Option("user.route") != m.Cmdx("ssh.remote", arg[2], "check", "work", arg[3]) { m.Log("warn", "work error") @@ -227,17 +241,28 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", } } case "work": // 工作验签 - if cert := m.Confm("cert", arg[1]); len(arg) == 2 { - if cert != nil { - m.Echo("%s", cert["user"]) + switch arg[1] { + case "search": + m.Confm("cert", func(key string, value map[string]interface{}) { + m.Add("append", "key", key) + m.Add("append", "user.route", value["user"]) + m.Add("append", "create_time", value["create_time"]) + }) + m.Table() + + default: + if cert := m.Confm("cert", arg[1]); len(arg) == 2 { + if cert != nil { + m.Echo("%s", cert["user"]) + } + } else { // 工作签证 + if cert == nil { + m.Conf("cert", arg[1], map[string]interface{}{"create_time": m.Time(), "user": arg[2]}) + } else if cert["user"] != arg[2] { + return // 签证失败 + } + m.Echo(arg[1]) } - } else { // 工作签证 - if cert == nil { - m.Conf("cert", arg[1], map[string]interface{}{"create_time": m.Time(), "user": arg[2]}) - } else if cert["user"] != arg[2] { - return // 签证失败 - } - m.Echo(arg[1]) } } return @@ -364,15 +389,20 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", }) // 本机路由 - m.Conf("runtime", "node.route", node.Append("node.route")+"."+node.Result(0)) + m.Cmd("cli.runtime", "node.route", node.Append("node.route")+"."+node.Result(0)) // 用户路由 if m.Confs("runtime", "user.cert") && m.Confs("runtime", "user.key") { - m.Conf("runtime", "user.route", m.Conf("runtime", "node.route")) + m.Cmd("cli.runtime", "user.route", m.Conf("runtime", "node.route")) } else if node.Appends("user.route") && !m.Confs("runtime", "user.route") { m.Cmd("ssh.node", "share", "root", node.Append("user.route")) } + + // 工作路由 + if node.Appends("work.route") && !m.Confs("runtime", "work.route") { + m.Cmd("cli.runtime", "work.route", node.Append("work.route")) + } return nil }, "send", "add", m.Conf("runtime", "node.name"), m.Conf("runtime", "node.type"), m.Conf("runtime", "node.cert")) return nil @@ -397,9 +427,10 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", // 同步信息 m.Append("node.name", m.Conf("runtime", "node.name")) + m.Append("user.name", m.Conf("runtime", "user.name")) m.Append("node.route", m.Conf("runtime", "node.route")) m.Append("user.route", m.Conf("runtime", "user.route")) - m.Append("user.name", m.Conf("runtime", "user.name")) + m.Append("work.route", m.Conf("runtime", "work.route")) m.Echo(name).Back(m) default: @@ -464,7 +495,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", // 路由转发 for _, p := range ps { m.Find(p, true).Copy(m, "option").CallBack(sync, func(sub *ctx.Message) *ctx.Message { - return m.CopyFuck(sub, "append").CopyFuck(sub, "result").Echo("\n") + return m.CopyFuck(sub, "append").CopyFuck(sub, "result") }, "send", rest, arg) } return diff --git a/src/examples/chat/chat.go b/src/examples/chat/chat.go index 2010b946..1dd27302 100644 --- a/src/examples/chat/chat.go +++ b/src/examples/chat/chat.go @@ -113,11 +113,8 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心", "flow": &ctx.Command{Name: "flow", Help: "信息流", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { switch arg[0] { case "ocean": - m.Confm("ssh.cert", func(key string, value map[string]interface{}) { - m.Add("append", "key", key) - m.Add("append", "user", value["user"]) - }) - m.Table() + m.Cmdy("ssh.cert", "work", "search") + case "river": if len(arg) == 1 { m.Confm("flow", func(key string, value map[string]interface{}) { diff --git a/usr/librarys/chat.css b/usr/librarys/chat.css index f7291aec..be779441 100644 --- a/usr/librarys/chat.css +++ b/usr/librarys/chat.css @@ -25,8 +25,6 @@ fieldset.Target { padding:0; min-width:160px; min-height:80px; -} -fieldset.Target div.output { overflow:auto; } fieldset.Source { diff --git a/usr/librarys/chat.js b/usr/librarys/chat.js index c11d78b0..57d0ba52 100644 --- a/usr/librarys/chat.js +++ b/usr/librarys/chat.js @@ -1,168 +1,111 @@ -var pane = {} var page = Page({ - pane: pane, - initOcean: function(page, field, option, output) { + initOcean: function(page, pane, form, output) { + var table = kit.AppendChild(output, "table") + pane.Show = function() { + pane.ShowDialog() && (table.innerHTML = "", form.Run(["ocean"], function(msg) { + kit.AppendTable(table, ctx.Table(msg), ["key", "user.route"]) + })) + } return {"button": ["关闭"], "action": function(event) { - pane.ocean.showDialog() + pane.Show() }} }, - - initRiver: function(page, field, option, output) { - pane.channel = output - page.showRiver(page, option) + initRiver: function(page, pane, form, output) { + pane.Show = function() { + output.innerHTML = "", form.Runs(["river"], function(line, index, msg) { + index == 0 && page.target.Show(line.key) + kit.AppendChild(output, [{view: ["item", "div", line.name+"("+line.count+")"], click: function(event) { + page.target.Show(line.key) + }}]) + }) + } + pane.Show() return {"button": ["添加", "查找"], "action": function(value) { switch (value) { case "添加": var name = prompt("name") - if (name) { - ctx.Run(page, option.dataset, ["river", "create", name], function(msg) { - page.showRiver(page, option) - }) - } + name && form.Run(["river", "create", name], pane.Show) break case "查找": - kit.showDialog(pane.ocean) + page.ocean.Show() break } }} }, - showRiver: function(page, option) { - pane.channel.innerHTML = "" - page.getRiver(page, option, function(line, index) { - page.conf.river = page.conf.river || page.showTarget(page, option, line.key) || line.key - kit.AppendChild(pane.channel, [{view: ["item", "div", line.name+"("+line.count+")"], click: function(event) { - if (page.conf.river == line.key) { - return - } - page.conf.river = line.key - page.showTarget(page, option, line.key) - }}]) - }) - }, - getRiver: function(page, option, cb) { - ctx.Run(page, option.dataset, ["river"], function(msg) { - ctx.Table(msg, function(line, index) { - cb(line, index) + initTarget: function(page, pane, form, output) { + var river = "" + pane.Show = function(which) { + which && river != which && (river = which, output.innerHTML = "", form.Runs(["river", "wave", river], function(line, index, msg) { + kit.AppendChild(output, [{view: ["item", "div", line.text], click: function(event) {}}]) + pane.scrollBy(0,100) + })) + } + pane.Send = function(type, text, cb) { + form.Run(["river", "wave", river, type, text], function(msg) { + kit.AppendChild(output, [{"text" :[text, "div"]}]) + pane.scrollBy(0,100) + typeof cb == "function" && cb(msg) }) - }) - }, - initTarget: function(page, field, option) { - pane.output = field.querySelector("div.target.output") - ctx.Run(page, option.dataset, ["river"], function(msg) { - kit.Log(msg.result) - }) + } return [{"text": ["target"]}] }, - showTarget: function(page, option, id) { - pane.output.innerHTML = "" - page.getTarget(page, option, id, function(line, index) { - kit.AppendChild(pane.output, [{"view": ["item", "div", line.text]}]) - }) - }, - getTarget: function(page, option, id, cb) { - ctx.Run(page, option.dataset, ["river", "wave", id], function(msg) { - ctx.Table(msg, function(line, index) { - cb(line, index) - }) - }) - }, - initSource: function(page, field, option) { - var ui = kit.AppendChild(option, [{"view": ["input", "textarea"], "name": "input", "data": {"onkeyup": function(event){ - if (event.key == "Enter" && !event.shiftKey) { - var value = event.target.value - kit.AppendChild(pane.output, [{"text" :[value, "div"]}]) - pane.output.scrollBy(0,100) - // event.target.value = "" - ctx.Run(page, option.dataset, ["river", "wave", page.conf.river, "text", value], function(msg) { - kit.Log(msg.result) - }) - } + initSource: function(page, pane, form, output) { + var ui = kit.AppendChild(pane, [{"view": ["input", "textarea"], "name": "input", "data": {"onkeyup": function(event){ + event.key == "Enter" && !event.shiftKey && page.target.Send("text", event.target.value, pane.Clear) }, "onkeydown": function(event) { - if (event.key == "Enter" && !event.shiftKey) { - event.preventDefault() - } + event.key == "Enter" && !event.shiftKey && event.preventDefault() }}}]) - pane.input = ui.input - ctx.Run(page, option.dataset, ["river"], function(msg) { - msg.Table(function(index, line) { - console.log(index) - console.log(line) - }) - kit.Log(msg.result) - }) + pane.Size = function(width, height) { + pane.style.display = width==0? "none": "block" + pane.style.width = width+"px" + pane.style.height = height+"px" + ui.input.style.width = (width-7)+"px" + ui.input.style.height = (height-7)+"px" + } + + pane.Clear = function() { + ui.input = "" + } return }, - initStorm: function(page, field, option) { - ctx.Run(page, option.dataset, ["river"], function(msg) { - kit.Log(msg.result) - }) + initStorm: function(page, pane, form, output) { return [{"text": ["storm"]}] }, - initSteam: function(page, field, option) { - ctx.Run(page, option.dataset, ["river"], function(msg) { - kit.Log(msg.result) - }) + initSteam: function(page, pane, form, output) { return [{"text": ["steam"]}] }, - panes: {}, range: function(sizes) { sizes = sizes || {} var width = document.body.offsetWidth - var river_width = pane.river.offsetWidth - var storm_width = pane.storm.offsetWidth - var source_width = pane.source.offsetWidth - var source_height = pane.source.offsetHeight var height = document.body.offsetHeight-80 + sizes.left == undefined && (sizes.left = page.river.offsetWidth-page.conf.border) + sizes.right == undefined && (sizes.right = page.storm.offsetWidth-page.conf.border) + sizes.middle = width - sizes.left - sizes.right-5*page.conf.border + page.river.Size(sizes.left, height) + page.storm.Size(sizes.right, height) - pane.river.style.height = height+"px" - pane.storm.style.height = height+"px" - pane.target.style.height = (height-source_height)+"px" - if (sizes.left != undefined) { - if (sizes.left == 0) { - pane.river.style.display = "none" - } else { - pane.river.style.display = "block" - pane.river.style.width = sizes.left+"px" - } - } - if (sizes.right != undefined) { - if (sizes.right == 0) { - pane.storm.style.display = "none" - } else { - pane.storm.style.display = "block" - pane.storm.style.width = sizes.right+"px" - } - } - if (sizes.middle != undefined) { - pane.source.style.height = sizes.middle+"px" - pane.target.style.height = (height-sizes.middle-4)+"px" - pane.output.style.height = (height-sizes.middle-8)+"px" - pane.input.style.height = (sizes.middle-7)+"px" + if (sizes.top != undefined) { + sizes.bottom = height-sizes.top-page.conf.border + } else if (sizes.bottom != undefined) { + sizes.top = height-sizes.bottom-page.conf.border } else { - var source_height = pane.source.offsetHeight-10 - pane.input.style.height = source_height+"px" - pane.output.style.height = source_height+"px" + sizes.bottom = page.source.offsetHeight-page.conf.border + sizes.top = height-sizes.bottom-page.conf.border } - - var source_width = pane.source.offsetWidth-10 - pane.input.style.width = source_width+"px" - pane.output.style.width = source_width+"px" + kit.Log(sizes) + page.target.Size(sizes.middle, sizes.top) + page.source.Size(sizes.middle, sizes.bottom) }, init: function(exp) { var page = this - - document.querySelectorAll("body>fieldset").forEach(function(field) { - var option = field.querySelector("form.option") - var output = field.querySelector("div.output") - pane[option.dataset.componet_name] = field - - var init = page[field.dataset.init] + page.eachField(page, function(init, pane, form) { + var output = pane.querySelector("div.output") if (typeof init == "function") { - var conf = page[field.dataset.init](page, field, option, output) + var conf = init(page, pane, form, output) if (conf && conf["button"]) { var buttons = [] conf.button.forEach(function(value, index) { @@ -170,14 +113,14 @@ var page = Page({ typeof conf["action"] == "function" && conf["action"](value, event) }]}) }) - kit.InsertChild(field, output, "div", buttons) + kit.InsertChild(pane, output, "div", buttons) } else if (conf) { kit.AppendChild(output, conf) } } }) window.onresize = this.range - this.range({left:120, middle:60, right:120}) + this.range({left:160, bottom:60, right:160}) }, - conf: {}, + conf: {border: 4}, }) diff --git a/usr/librarys/context.js b/usr/librarys/context.js index b4fef779..65eb4d6f 100644 --- a/usr/librarys/context.js +++ b/usr/librarys/context.js @@ -23,6 +23,13 @@ ctx = context = { } this.Run(page, data, [], cb || form.ondaemon) }, + Sync: function(page, option, cmds, cb) { + this.Run(page, option.dataset, cmds, function(msg) { + ctx.Table(msg, function(line, index) { + cb(line, index) + }) + }) + }, Table: function(msg, cb) { var ret = [] if (!msg || !msg.append || !msg.append.length || !msg[msg.append[0]]) { diff --git a/usr/librarys/example.js b/usr/librarys/example.js index 2ed9ef51..763a828b 100644 --- a/usr/librarys/example.js +++ b/usr/librarys/example.js @@ -44,6 +44,37 @@ exp = example = { reload: function() { location.reload() }, + + eachField: function(page, cb) { + document.querySelectorAll("body>fieldset").forEach(function(pane) { + // pane init + pane.ShowDialog = function(width, height) { + return kit.ShowDialog(this, width, height) + } + pane.Size = function(width, height) { + pane.style.display = width==0? "none": "block" + pane.style.width = width+"px" + pane.style.height = height+"px" + } + + + // form init + var form = pane.querySelector("form.option") + form.Run = function(cmds, cb) { + ctx.Run(page, form.dataset, cmds, cb) + } + form.Runs = function(cmds, cb) { + ctx.Run(page, form.dataset, cmds, function(msg) { + ctx.Table(msg, function(line, index) { + cb(line, index, msg) + }) + }) + } + + page[form.dataset.componet_name] = pane + typeof cb == "function" && cb(page[pane.dataset.init], pane, form) + }) + }, } function Page(page) { @@ -52,8 +83,3 @@ function Page(page) { } return page } -function Pane(pane) { - pane.showDialog = function(width, height) { - kit.showDialog(this, width, height) - } -} diff --git a/usr/librarys/toolkit.js b/usr/librarys/toolkit.js index 41d2748d..27bf704b 100644 --- a/usr/librarys/toolkit.js +++ b/usr/librarys/toolkit.js @@ -1,4 +1,5 @@ kit = toolkit = { + isMobile: navigator.userAgent.indexOf("Mobile") > -1, History: {dir: [], pod: [], ctx: [], cmd: [], txt: [], key: [], add: function(type, data) { var list = this[type] || [] @@ -20,9 +21,6 @@ kit = toolkit = { console.log(arguments.length == 1? args[0]: args) return args }, - isMobile: navigator.userAgent.indexOf("Mobile") > -1, - CreateStyle: function(style) { - }, ModifyNode: function(which, html) { var node = typeof which == "string"? document.querySelector(which): which @@ -54,9 +52,15 @@ kit = toolkit = { return elm } - // include require styles style - // tree, code, text, view, click - // type, name, data, list, style + // include require styles // 加载文件 + // name + // click + // style + // button + // tree, fork, leaf // 树状结构 + // code, text, view // 普通视图 + // type, data, list // 基本结构 + var kit = this subs = subs || {} @@ -64,7 +68,7 @@ kit = toolkit = { child.data = child.data || {} child.type = child.type || "div" - if (child.style) { + if (typeof(child.style) == "object") { var str = [] for (var k in child.style) { str.push(k) @@ -163,9 +167,6 @@ kit = toolkit = { return parent.insertBefore(elm, position || parent.firstElementChild) }, - AppendStyle: function(parent, style) { - return node - }, AppendTable: function(table, data, fields, cb) { if (!data || !fields) { return @@ -187,6 +188,7 @@ kit = toolkit = { }) }) }, + RangeTable: function(table, index, sort_asc) { var list = table.querySelectorAll("tr") var new_list = [] @@ -435,6 +437,9 @@ kit = toolkit = { if (w > width) { w = width } + if (h > height) { + h = height + } args["top"] = (height-h)/2 args["left"] = (width-w)/2 @@ -467,15 +472,16 @@ kit = toolkit = { } } }, - showDialog: function(pane, width, height) { + ShowDialog: function(pane, width, height) { if (pane.style.display == "none") { pane.style.display = "block" this.setView(pane, {dialog: [width||800, height||400]}) - } else { - pane.style.display = "none" + return true } + pane.style.display = "none" + return false }, - showWindow: function(pane, width, height) { + ShowWindow: function(pane, width, height) { this.setView(pane, {window: [width||80, height||40]}) }, } diff --git a/usr/wiki/自然/编程/终端工具链/context.md b/usr/wiki/自然/编程/终端工具链/context.md index eef59dd8..62a4a42e 100644 --- a/usr/wiki/自然/编程/终端工具链/context.md +++ b/usr/wiki/自然/编程/终端工具链/context.md @@ -338,15 +338,13 @@ web模块会将所有的HTTP请求转换成context的命令调用,所以HTTP 根据code的componet下的login组件,依次调用每个接口的命令,然后将执行结果与参数一起,调用golang的template,渲染生成HTML。 所有命令都解析完成后就可以生成一个完整的网页。当然如果Accept是application/json,则会跳过模块渲染,直接返回多条命令的执行结果。 -所以componet就是接口的集合,统一提供参数配置、权限检查、命令执行、模板渲染,降低内部命令与外部应用的耦合性,但又将前后端完全融合在一起。 - +所以componet就是接口的集合,统一提供参数配置、权限检查、命令执行、模板渲染,前端展示样式,前端初始化函数,降低内部命令与外部应用的耦合性,但又将前后端完全融合在一起。 如下,是web.code模块的应用接口定义。配置componet下定义了多个组件,每个组件下定义了多个接口。 login就是登录页面,下面定义了三个接口code、login、tail, 其中code,使用模板head生成网页头,会包括一些配置,如favicon可以指定图标文件,styles指定引用模式表。 其中tail,使用模板tail生成网页尾,会包括一些配置,如scripts指定引用脚本文件。 - login就是网页组件了,生成一个网页登录的输入表单,并接收表单请求调用aaa模块的auth命令,进行用户身份的验证。 其中arguments指定了Form表单字段的列表。 ``` @@ -381,16 +379,32 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", #### 模板 usr/template 存放了网页的模板文件,context会调用golang的template接口进行后端渲染,生成html文件。 - -componet下每一个接口都会指定一个模板,web模块下的/render命令会依次渲染,从而生成一个完整的网页。 - +不同的应用模块都会有自己的模板目录,也有公共模板库。 - usr/template/common.tmpl 公共模板 - usr/template/code/ code模块的模板 -- usr/template/wiki/ wiki -- usr/template/chat/ +- usr/template/wiki/ wiki模块的模板 +- usr/template/chat/ chat模块的模板 -usr/librarys 存放了css与js +#### 样式 + +所有的css都存放usr/librarys + +- example.css +- code.css +- wiki.css +- chat.css + +#### 脚本 + +所有的js都存放usr/librarys + +- toolkit.js 工具库,主要是网页相关的操作,如AppendChild +- context.js 通信库,主要是用来与后端context进行通信 +- example.js 框架库,统一定义了网页的框架,每个应用网页都会继承 +- code.js 工具链应用的网页 +- wiki.js 知识库应用的网页 +- chat.js 信息流应用的网页 ### 小程序 ### 开发板