diff --git a/index.css b/index.css index 2e112acf..f050d066 100644 --- a/index.css +++ b/index.css @@ -320,6 +320,7 @@ div.output>div.project:not(.toggle) { border-right:var(--box-border); width:var( body.mobile div.project:not(.toggle) { border-right:var(--box-border); width:120px; flex:0 0 120px; } div.profile:not(.toggle) { border-left:var(--box-border); width:50%; } div.display:not(.toggle) { border-top:var(--box-border); } +div.output div.code input[type=button][name=login] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } /* table card */ div.output.card>div.item.stop { color:var(--disable-fg-color); } div.output.card>div.item { background:var(--plugin-bg-color); padding:10px; border:var(--box-border); border-radius:var(--plugin-radius); margin:10px; width:320px; float:left; box-shadow:var(--box-shadow); } diff --git a/plugin/state.js b/plugin/state.js index 9a7a0085..72252d29 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -31,8 +31,9 @@ Volcanos(chat.ONIMPORT, { }).length == 0) { can.onappend.table(can, msg) } }, _grow: function(can, msg, arg) { var sub = can.sub if (sub && sub.onimport && sub.onimport.grow) { return sub.onimport.grow(sub, msg, arg) } - arg = can.page.Color(arg); if (can.page.Select(can, can._output, html.DIV_CODE, function(div) { - return can.page.style(can, div, html.MAX_HEIGHT, can.onexport.outputHeight(can)), can.page.Append(can, div, [{text: arg}]), can._output.scrollTop = div.offsetTop, div.scrollBy(0, 10000), true + arg = can.page.Color(arg); if (can.page.SelectOne(can, can._output, html.DIV_CODE, function(div) { + return can.page.style(can, div, html.MAX_HEIGHT, can.onexport.outputHeight(can)), + can.page.Append(can, div, [{text: arg}]), can._output.scrollTop = div.offsetTop, div.scrollBy(0, 10000), true }).length == 0) { can.onappend.board(can, arg) } }, _open: function(can, msg, arg) { can.user.opens(arg), can.Update() }, diff --git a/plugin/story/stats.js b/plugin/story/stats.js index 65172e4c..45cb648a 100644 --- a/plugin/story/stats.js +++ b/plugin/story/stats.js @@ -1,7 +1,8 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg) { can.onappend.style(can, "stats", can._output) - var units = {}, stats = {}; msg.Table(function(value) { units[value.name] = value.units + var stats = {}, units = {}, index = {}; msg.Table(function(value) { units[value.name] = value.units stats[value.name] = parseFloat(stats[value.name]||"0") + parseFloat(value.value) + index[value.name] = value.index }) function fmts(value) { var ls = [] while (value > 0) { ls.push(value%1000) @@ -12,6 +13,8 @@ Volcanos(chat.ONIMPORT, { can.core.Item(stats, function(name, value) { can.page.Append(can, can._output, [{view: [[html.ITEM, name]], list: [ {view: mdb.VALUE, list: [{text: can.base.trimSuffix(fmts(parseFloat(value).toFixed(2))+"", ".00")}, {text: [units[name], "", "units"]}]}, {view: [mdb.NAME, "", can.user.trans(can, name, null, html.INPUT)]}, - ]}]) }), can.isCmdMode() && can.onappend.table(can, msg) + ], onclick: function() { + can.onappend.plugin(can, {index: index[name], style: html.FLOAT}) + }}]) }), can.isCmdMode() && can.onappend.table(can, msg) }, }) diff --git a/publish/client/mp/app.js b/publish/client/mp/app.js index 22e3676e..4199ee9a 100644 --- a/publish/client/mp/app.js +++ b/publish/client/mp/app.js @@ -5,7 +5,8 @@ const page = require("utils/lib/page.js") const user = require("utils/lib/user.js") App({ - data: {}, conf: {serve: "https://2021.shylinux.com", appid: "wxf4e5104d83476ed6"}, + data: {}, conf: {serve: "https://2021.shylinux.com", appid: "wxf4e5104d83476ed6", + module: "shylinux.com/x/volcanos", version: "v0.2.1"}, base: base, core: core, misc: misc, page: page, user: user, onLaunch: function() { console.log("app load", this.conf) }, }) diff --git a/publish/client/mp/pages/river/river.js b/publish/client/mp/pages/river/river.js index 0bc31afd..cb1d2644 100644 --- a/publish/client/mp/pages/river/river.js +++ b/publish/client/mp/pages/river/river.js @@ -6,13 +6,16 @@ Volcanos(chat.ONIMPORT, { msg.Dump(can), can.user.toast(can, "加载成功") }, }) -Volcanos("onaction", {list: ["刷新", "扫码", "登录"], +Volcanos("onaction", {list: ["刷新", "扫码", "登录", "网络"], "刷新": function(event, can) { can.onaction.refresh(event, can) }, "扫码": function(event, can) { can.user.agent.scanQRCode(can) }, "登录": function(event, can) { can.user.info = {}, can.misc.localStorage(can, ice.MSG_SESSID, can.conf.sessid = "") can.user.userinfo(can, function() { can.onaction.refresh(event, can) }) }, + "网络": function(event, can) { + can.user.agent.connectWifi(can, "CMCC-UQJ7", "RZGR9FGF") + }, refresh: function(event, can) { can.run(event, [], function(msg) { can.onimport._init(can, msg) }) }, onaction: function(event, can, button, data) { var name = data.name; (can.onaction[name]||function(event) { can.run(event, [ctx.ACTION, name]) })(event, can) diff --git a/publish/client/mp/project.private.config.json b/publish/client/mp/project.private.config.json index 6df9e13c..a682b23b 100644 --- a/publish/client/mp/project.private.config.json +++ b/publish/client/mp/project.private.config.json @@ -7,16 +7,17 @@ "miniprogram": { "list": [ { - "name": "", + "name": "cli.runtime", "pathName": "pages/action/action", - "query": "cmd=web.code.h2.h2", + "query": "index=cli.runtime&serve=http%3A%2F%2F192.168.10.12%3A9020&debug=true", "launchMode": "default", "scene": null }, { - "name": "pages/action/action", + "name": "web.dream", "pathName": "pages/action/action", - "query": "river= e0a1eb&storm=c23ae3&title=hi.scan", + "query": "index=web.dream&serve=http%3A%2F%2F192.168.10.12%3A9020&debug=true", + "launchMode": "default", "scene": 1001 } ] diff --git a/publish/client/mp/utils/const.js b/publish/client/mp/utils/const.js index 352c53a1..92b34d18 100644 --- a/publish/client/mp/utils/const.js +++ b/publish/client/mp/utils/const.js @@ -11,6 +11,8 @@ var kit = {proto: function(sub, sup) { return sub.__proto__ = sup, sub }, } var ice = { TB: "\t", SP: " ", DF: ":", EQ: "=", AT: "@", QS: "?", PS: "/", PT: ".", FS: ",", NL: "\n", LT: "<", GT: ">", + OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", FAILURE: "failure", PROCESS: "process", + HTTP: "http", HELP: "help", MAIN: "main", AUTO: "auto", LIST: "list", BACK: "back", diff --git a/publish/client/mp/utils/lib/misc.js b/publish/client/mp/utils/lib/misc.js index 12e468df..bcd074c9 100644 --- a/publish/client/mp/utils/lib/misc.js +++ b/publish/client/mp/utils/lib/misc.js @@ -57,6 +57,24 @@ Volcanos("misc", { for (var i = 1; i < ls.length; i += 2) { if (can.base.isIn(ls[i], [ice.POD, ice.CMD])) { args[ls[i]] = ls[i+1] } } return args }, + WSS: function(can) { + var url = can.base.MergeURL(can.db.serve.replace("http", "ws")+"/space/", mdb.TYPE, "weixin", mdb.NAME, "weixin", mdb.TEXT, can.base.MergeURL(nfs.PS+can.ui.route, can.db), can.conf) + var socket = wx.connectSocket({url: url, header:{"content-type": "application/json"}}) + console.log("wss connect", url, socket) + socket.onOpen(function(res) { console.log("wss open", res) }) + socket.onClose(function(res) { console.log("wss close", res) + if (can._socket) { can._socket = socket = can.misc.WSS(can) } + }) + socket.onMessage(function(res) { + var msg = can.request(), data = can.base.Obj(res.data); msg.Copy(data), msg.detail = data.detail, console.log("wss recv", msg) + switch (msg.detail[0]) { + case "pwd": can._daemon = msg.detail[1]; break + } + msg.Echo("hello world") + delete(msg._hand), console.log("wss send", msg), socket.sendSocketMessage({data: JSON.stringify(msg)}) + }) + return socket + }, requests: function(can, msg, cmd, data, cb) { can.misc.request(can, msg, cmd, data, function(msg) { cb && cb(msg) }) }, diff --git a/publish/client/mp/utils/lib/user.js b/publish/client/mp/utils/lib/user.js index d37bffd3..691ea4bb 100644 --- a/publish/client/mp/utils/lib/user.js +++ b/publish/client/mp/utils/lib/user.js @@ -20,19 +20,32 @@ Volcanos("user", { scanQRCode: function(can, cb) { wx.scanCode({success: function(res) { var data = can.base.ParseJSON(res.result) if (data.type == web.LINK && data._origin) { can.base.Copy(data, can.misc.ParseURL(can, res.result)) } + console.log("scan", data) if (cb && cb(data)) { return } if (data.type == web.LINK && data._origin) { delete(data.type), delete(data.name), delete(data.text) - var serve = /(https?:\/\/[^/]+)([^?#])*/.exec(data._origin)[1]; data.serve = serve, delete(data._origin) + var ls = new RegExp("(https?://[^/]+)([^?#]*)([^#]*)(.*)").exec(data._origin); delete(data._origin) + data.serve = ls[1]; if (ls[2].indexOf("/pages/") == 0) { data.pages = ls[2] } } if (data.cmd||data.index||data.share) { - can.user.jumps(can.base.MergeURL(chat.PAGES_ACTION, data)) + can.user.jumps(can.base.MergeURL(data.pages||chat.PAGES_ACTION, data)) } else if (data.pod||data.space||data.serve) { - can.user.jumps(can.base.MergeURL(chat.PAGES_RIVER, data)) + can.user.jumps(can.base.MergeURL(data.pages||chat.PAGES_RIVER, data)) } else { can.misc.request(can, can.request(), chat.WX_LOGIN_SCAN, data) } }}) }, + connectWifi: function(can, ssid, password, cb, cbs) { wx.showLoading() + wx.startWifi({success: function(res) { + wx.connectWifi({SSID: ssid, password: password, success: function(res) { wx.hideLoading() + console.log("wifi", res), cb && cb(res) + }, fail: function(res) { + console.log("wifi", res), cbs && cbs(res) + }}) + }, fail: function(res) { + console.log("wifi", res), cbs && cbs(res) + }}) + }, }, info: {}, jumps: function(url, cb) { wx.navigateTo({url: url, success: cb}) }, title: function(text, cb) { text && wx.setNavigationBarTitle({title: text, success: cb}) }, diff --git a/publish/client/mp/utils/proto.js b/publish/client/mp/utils/proto.js index 29953064..a6ecf9f0 100644 --- a/publish/client/mp/utils/proto.js +++ b/publish/client/mp/utils/proto.js @@ -1,16 +1,13 @@ -const {ctx, nfs, code, chat} = require("const.js") - +const {ice, ctx, mdb, nfs, code, chat} = require("const.js") function shy(help, meta, list, cb) { var arg = arguments, i = 0; function next(type) { if (type == code.OBJECT) { if (typeof arg[i] == code.OBJECT && arg[i].length == undefined) { return arg[i++] } } else if (type == code.ARRAY) { if (typeof arg[i] == code.OBJECT && arg[i].length != undefined) { return arg[i++] } } else if (i < arg.length && (!type || type == typeof arg[i])) { return arg[i++] } } return cb = typeof arg[arg.length-1] == code.FUNCTION? arg[arg.length-1]: function() {}, cb.help = next(code.STRING)||"", cb.meta = next(code.OBJECT)||{}, cb.list = next(code.ARRAY)||[], cb } - function Volcanos(name, list) { if (Volcanos._page) { Volcanos._page[name] = list } return list } - Volcanos._init = function() { var can = {__proto__: Volcanos._page, request: function(event) { event = event||{}, event = event._event||event @@ -34,13 +31,19 @@ Volcanos._init = function() { onLoad: function(options) { can.ui = this, can.db = options, can.db.serve = can.db.serve||can.conf.serve can.core.Item(can.db, function(key, value) { can.db[key] = decodeURIComponent(value) }) can.user.title(can.db.title||can.db.pod||can.db.space||(can.db.serve||can.conf.serve).split("://")[1]) - console.log("app show", can.ui.route, options), can.ui.setData({conf: can.db}) - can.user.login(can, function() { can.onaction.refresh({}, can) }) + console.log("app show", can.ui.route, options) + if (can.db.ssid && can.db.password != "******") { + can.user.agent.connectWifi(can, can.db.ssid, can.db.password||"", function() { can.db.password = "******" + can.ui.setData({conf: can.db}), can.user.login(can, function() { can.onaction.refresh({}, can) }) + }) + } else { + can.ui.setData({conf: can.db}), can.user.login(can, function() { can.onaction.refresh({}, can) }) + } }, - onShow: function() {}, + onShow: function() { can.misc.WSS(can) }, onReady: function() {}, - onHide: function() {}, - onUnload: function() {}, + onHide: function() { can._socket && can._socket.close(), delete(can._socket) }, + onUnload: function() { can._socket && can._socket.close(), delete(can._socket) }, onReachBottom: function() {}, onPullDownRefresh: function() { this.onLoad(can.db) }, onShareAppMessage: function() {} @@ -49,5 +52,4 @@ Volcanos._init = function() { can.core.CallFunc(cb, [event, can, key, event.target.dataset]) } }), Page(page) } - module.exports = {shy, Volcanos}