1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00
This commit is contained in:
shaoying 2020-02-23 06:36:55 +08:00
parent 5f4992e41a
commit 59a513ae2c
12 changed files with 324 additions and 231 deletions

View File

@ -1,8 +1,7 @@
const utils = require("utils/util.js")
App({
data: {},
conf: {serve: "https://shylinux.com/chat"},
data: {}, conf: {serve: "https://shylinux.com/chat"},
request: function(cmd, data, cb) {var app = this; data.sessid = app.conf.sessid
wx.request({method: "POST", url: app.conf.serve+"/"+cmd, data: data, success(res) {var msg = res.data
console.log("POST", cmd, msg)
@ -11,9 +10,9 @@ App({
return
}
msg.__proto__ = {
nRow() {return msg.append && msg.append[0] && msg[msg.append[0]].length || 0},
Result() {return msg.result && msg.result.length > 0 && msg.result.join("") || ""},
Table(cb) {var row = 0
nRow: function() {return msg.append && msg.append[0] && msg[msg.append[0]].length || 0},
Result: function() {return msg.result && msg.result.length > 0 && msg.result.join("") || ""},
Table: function(cb) {var row = 0
for (var i = 0; i < msg.append.length; i++) {
row = msg[msg.append[i]].length > row? msg[msg.append[i]].length: row
}
@ -41,12 +40,10 @@ App({
}})
},
download: function(cmd, data, cb) {var app = this; data.sessid = app.conf.sessid
wx.downloadFile({url: app.conf.serve+"/"+cmd, data: data, success(res) {
typeof cb == "function" && cb(res)
}})
wx.downloadFile({url: app.conf.serve+"/"+cmd, data: data, success: cb})
},
usercode: function(cb) {var app = this
wx.login({success(res) {app.request("mp/login/code", {code: res.code}, function(msg) {
wx.login({success: function(res) {app.request("mp/login/code", {code: res.code}, function(msg) {
wx.setStorage({key: "sessid", data: msg.Result()})
app.conf.sessid = msg.Result(), typeof cb == "function" && cb()
})}})
@ -54,15 +51,39 @@ App({
userinfo: function(cb) {var app = this
if (app.conf.userInfo) {return typeof cb == "function" && cb(app.conf.userInfo)}
app.usercode(function() {
wx.getSetting({success(res) {res.authSetting['scope.userInfo'] && wx.getUserInfo({success(res) {
app.request("mp/login/info", res.userInfo, function(msg) {app.conf.userInfo = res.userInfo, typeof cb == "function" && cb(res.userInfo)})
wx.getSetting({success: function(res) {res.authSetting['scope.userInfo'] && wx.getUserInfo({success: function(res) {
app.request("mp/login/info", res.userInfo, function(msg) {app.conf.userInfo = res.userInfo
typeof cb == "function" && cb(res.userInfo)
})
}})}})
})
},
modal: function(title, cb) {wx.showModal({title: title, success: cb})},
toast: function(title) {wx.showToast({title: title})},
jumps: function(url, args, cb) {
wx.navigateTo({url: "/pages/"+utils.Args(url, args), success: cb})
},
toast: function(title) {wx.showToast({title: title})},
scans: function(cb) {var app = this
wx.scanCode({success(res) {
try {
var value = JSON.parse(res.result)
switch (value.type) {
case "active":
app.userinfo(function(userInfo) {
app.modal("授权登录", function(res) {
res.confirm && app.request("mp/login/auth", {auth: value.name})
})
})
default:
typeof cb == "function" && cb(res)
}
} catch(e) {
typeof cb == "function" && cb(res)
}
}})
},
onLaunch: function() {
this.conf.sessid = wx.getStorageSync("sessid")
console.log("load", "sessid", this.conf.sessid)

View File

@ -1,5 +1,13 @@
<template name="list-name">
<table wx:if="{{msg.append && msg.append[0]}}">
<tr wx:for="{{msg[msg.append[0]]}}" wx:key="name" bindtap="onClick" data-index="{{index}}"><td class="item">{{msg.name[index]}}</td></tr>
</table>
<template name="action">
<view class="action">
<view class="item" wx:for="{{action}}" wx:key="name">
<button size="mini" bindtap="onaction" data-name="{{item}}">{{item}}</button>
</view>
</view>
</template>
<template name="list-name">
<view class="output" wx:if="{{msg.name}}">
<view class="item" wx:for="{{msg.name}}" wx:key="name" bindtap="ondetail" data-name="{{item}}" data-index="{{index}}">{{item}}</view>
</view>
</template>

View File

@ -1,41 +1,75 @@
.display {
page {
color:white;
font-size:14px;
font-family:monospace;
background-color:#272822;
position:absolute;
white-space:pre;
height:100%;
width:100%;
}
view.action>view.item {
float:left;
}
view.option>view.item {
padding:0;
border: 0;
float:left;
}
view.option input {
width:80px;
margin:2px;
padding:2px;
border:solid 1px green;
}
view.option view.textarea {
clear:both;
width:calc(100% - 2px);
border:solid 1px green;
}
view.option view.select {
border:solid 1px green;
float:left;
/* width:40px; */
padding:6px;
}
view.option view.select picker {
}
view.option view.select picker view {
}
view.output {
clear:both;
}
view.output>view.item {
text-align:center;
font-size:18px;
padding:10px;
border:solid 1px green;
}
view.title {
margin-top:20px;
margin-bottom:10px;
font-weight:bold;
font-size:18px;
}
view.field {
}
table {
width:100%;
background-color:#272822;
}
tr {
background-color:#272822;
width:100%;
display:flex;
justify-content:space-between;
}
th {
background-color:#272822;
padding:5px;
width:100%;
text-align:center;
border:solid 1px red;
}
td {
background-color:#272822;
padding:5px;
width:100%;
text-align:center;
border:solid 1px green;
}
td.item {
font-size:18px;
padding:10px;
}
.output {
border:solid 2px red;
}

View File

@ -1,163 +1,166 @@
const utils = require("../../utils/util.js")
const kit = require("../../utils/kit.js")
const app = getApp()
Page({
data: {
button: [
{name: "串行", bind: "action"},
{name: "并行", bind: "action"},
{name: "清屏", bind: "refresh"},
{name: "清空", bind: "refresh"},
{name: "共享", bind: "refresh"},
{name: "扫码", bind: "action"},
],
res: [],
his: {},
inputs: {},
action: ["扫码", "清屏", "刷新", "串行", "并行", "共享"],
res: [], his: {}, inputs: {},
river: "", storm: "",
},
run: function(order, cmd, cb) {var page = this, field = page.data.res[order]
// var his = page.data.his[order] || []
var arg = []
field.inputs.forEach(function(input) {
if (input._input == "text") {
arg.push(input.value||"")
action: {
"扫码": function(event, page, data, name) {
// app.jumps("scans/scans")
app.scans(function(res) {
page.onaction(event, res, res.name)
})
},
"刷新": function(event, page, data, name) {
var list = []; app.data[page.data.river+page.data.storm] = page.data.res = list
app.request("action", {cmds: [page.data.river, page.data.storm]}, function(msg) {
msg.Table(function(line, index) {
page.data.his[index] = []
line.inputs = JSON.parse(line.inputs)
line.feature = JSON.parse(line.feature)
if (!line.inputs || line.inputs.length === 0) {
line.inputs = [{_input: "text"}, {_input: "button", value: "执行"}]
}
list.push(line), line.inputs.forEach(function(input) {
input._input == "button" && input.action == "auto" && page.run(event, index)
})
})
page.setData({res: list})
})
},
"串行": function(event, page, data, name) {
function cb(i) {
page.run(event, i, null, function() {i < page.data.res.length - 1&& cb(i+1)})
}
if (input._input == "textarea") {
arg.push(input.value||"")
}
})
// his.push(arg)
// page.data.his[order] = his
cb(0)
},
"并行": function(event, page, data, name) {
kit.List(page.data.res, function(field, index) {
page.run(event, index)
})
},
"清屏": function(event, page, data, name) {
kit.List(page.data.res, function(field, index) {
delete(field.msg)
})
page.setData({res: page.data.res})
},
"共享": function(event, page, data, name) {
},
},
onaction: function(event, data, name) {
data = data || event.target.dataset, name = name || data.name
console.log("action", "river", name)
this.action[name](event, this, data)
},
onfigure: {
key: {click: function(event, page, data, cmd, field) {
page.run(event, data.order, ["action", "input", data.item.name, data.item.value])
}},
location: {click: function(event, page, data, cmd, field) {
wx.chooseLocation({success: function(res) {
field.inputs[data.index].value = res.name
page.setData({res: page.data.res})
page.run(event, data.order, ["action", "location", res.name, res.address, res.latitude*100000, res.longitude*100000])
}})
}}
},
run: function(event, order, cmd, cb) {var page = this, field = page.data.res[order]
var cmds = [page.data.river, page.data.storm, order]
cmds = cmds.concat(cmd||arg||[])
cmds = cmds.concat(cmd||kit.List(field.inputs, function(input) {
if (["text", "textarea", "select"].indexOf(input._input) > -1) {
return input.value || ""
}
}))
for (var i = cmds.length-1; i > 0; i--) {
if (cmds[i] === "") {cmds.pop()} else {break}
}
app.request("action", {cmds: cmds}, function(msg) {
page.data.res[order].msg = msg
page.setData({res: page.data.res})
console.log("update-----", page.data.res[order])
typeof cb == "function" && cb(msg)
})
},
action: function(event) {var page = this, name = event.target.dataset.name
switch (name) {
case "扫码":
app.jumps("scans/scans")
break
case "串行":
function cb(i) {
page.run(i, null, function() {i < page.data.res.length && cb(i+1)})
}
cb(0)
break
case "并行":
for (var i = 0; i < page.data.res.length; i++) {page.run(i)}
break
}
},
refresh: function() {var page = this, data = []; page.data.his = {}
app.data[page.data.river+page.data.storm] = page.data.res = data
app.request("action", {cmds: [page.data.river, page.data.storm]}, function(msg) {
msg.Table(function(line, index) {
line.feature = JSON.parse(line.feature)
line.inputs = JSON.parse(line.inputs)
if (!line.inputs || line.inputs.length === 0) {
line.inputs = [{_input: "text"}, {_input: "button", value: "执行"}]
}
data.push(line), line.inputs.forEach(function(input) {
input._input == "button" && input.action == "auto" && page.run(index)
})
})
page.setData({res: data})
})
},
onBlur: function(event) {var page = this, data = event.target.dataset
page.data.res[data.order].inputs[data.index].value = event.detail.value
},
onFocus: function(event) {},
onInput: function(event) {},
onInput: function(event) {var page = this, data = event.target.dataset
page.data.res[data.order].inputs[data.index].value = event.detail.value
page.setData({res: page.data.res})
},
onChange: function(event) {var page = this, data = event.target.dataset
page.data.res[data.order].inputs[data.index].index = parseInt(event.detail.value)
page.data.res[data.order].inputs[data.index].value = data.input.values[parseInt(event.detail.value)]
page.setData({res: page.data.res})
},
onEnter: function(event) {var page = this, data = event.target.dataset
page.data.res[data.order].inputs[data.index].value = event.detail.value
},
onfigure: {
key: {
click: function(event, page, data, cmd, field) {
page.run(data.order, ["action", "input", data.item.name, data.item.value], function(msg) {
console.log("onkey-----", page.data.res[data.order])
})
},
},
location: {
click: function(event, page, data, cmd, field) {
wx.chooseLocation({success: function(res) {
field.inputs[data.index].value = res.name
page.setData({res: page.data.res})
page.run(data.order, ["action", "location", res.name, res.address, res.latitude*100000, res.longitude*100000])
}})
},
}
},
onClick: function(event) {var page = this, data = event.target.dataset
var field = page.data.res[data.order]
if (data && data.item && data.item._input == "text") {
// 输入补全
var figure = page.onfigure[data.item.cb||data.item.figure||data.item.name]
figure && figure.click(event, page, data, "what", field)
return
}
switch (data.input.cb) {
case "Last":
break
var his = page.data.his[data.order] || []
his.pop()
var arg = his.pop()
if (arg) {
field.inputs.forEach(function(input, i) {
if (input._input == "text") {
input.value = arg[i] || ""
}
})
}
page.data.his[data.order] = his
// 恢复命令
page.data.his[data.order].pop()
var line = page.data.his[data.order].pop()
kit.List(field.inputs, function(input, index) {
input.value = line && line[index] || ""
})
default:
this.run(event.target.dataset.order)
// 执行命令
page.data.his[data.order].push(kit.List(field.inputs, function(input) {
return input.value
})) && page.run(event, data.order)
}
},
onWhich: function(event) {var page = this, data = event.target.dataset
page.data.res[data.order].inputs.forEach(function(input) {
var field = page.data.res[data.order]
field.inputs.forEach(function(input, index) {
if (input.name == data.field) {
input.value = data.value
// 导入参数
page.data.res[data.order].inputs[index].value = data.value
page.setData({res: page.data.res})
page.data.inputs[data.order] = page.data.res[data.order].inputs
if (input.action == "auto") {
page.run(data.order, null, function(msg) {
console.log("onwhich-----", page.data.res[data.order])
})
}
// 执行命令
input.action == "auto" && page.data.his[data.order].push(kit.List(field.inputs, function(input) {
return input.value
})) && page.run(event, data.order)
}
})
},
onLoad: function (options) {var page = this
onLoad: function (options) {
console.log("page", "action", options)
app.conf.sessid = app.conf.sessid || options.sessid
page.data.river = options.river
page.data.storm = options.storm
app.conf.sessid = options.sessid || app.conf.sessid
this.data.river = options.river
this.data.storm = options.storm
var data = app.data[options.river+options.storm]
if (data) {return page.setData({res: page.data.res = data})}
this.refresh()
if (data) {return this.setData({res: this.data.res = data})}
this.onaction({}, {}, "刷新")
},
onReady: function () {},
onShow: function () {},
onHide: function () {},
onUnload: function () {},
onPullDownRefresh: function () {this.refresh()},
onPullDownRefresh: function () {
this.onaction({}, {}, "刷新")
},
onReachBottom: function () {},
onShareAppMessage: function () {}
})

View File

@ -1,33 +1,44 @@
<view class="display">
<view class="action">
<view wx:for="{{button}}" wx:key="name">
<button size="mini" bindtap="{{item.bind}}" data-name="{{item.name}}">{{item.name}}</button>
</view>
</view>
<import src="../../app.wxml"/>
<template is="action" data="{{action}}"></template>
<view class="output">
<view class="field" wx:for="{{res}}" wx:key="name" wx:for-index="order" wx:for-item="field">
<view class="detail">
<view><text class="title">{{field.name}}({{field.help}})</text></view>
<view wx:for="{{field.inputs}}" wx:key="name" class="inputs">
<view wx:if="{{item._input == 'text'}}">
<input type="text" value="{{item.value}}" placeholder="{{item.name}}"
bindtap="onClick" bindblur="onBlur" bindconfirm="onEnter" data-order="{{order}}" data-index="{{index}}" data-item="{{item}}"/>
</view>
<view wx:elif="{{item._input == 'textarea'}}" class="textarea">
<textarea value="{{item.value||item.name}}" placeholder="{{item.name}}"
bindtap="onClick" bindblur="onBlur" data-order="{{order}}" data-field="{{field}}" data-index="{{index}}" data-input="{{item}}"></textarea>
</view>
<view wx:elif="{{item._input == 'button'}}" class="button">
<button size="mini" bindtap="onClick" data-order="{{order}}" data-field="{{field}}" data-index="{{index}}" data-input="{{item}}">{{item.value||item.name}}</button>
</view>
<view class="title"><text>{{field.name}}({{field.help}})</text></view>
<!-- 参数 -->
<view class="option">
<view class="item {{item._input}}" wx:for="{{field.inputs}}" wx:key="name">
<!-- 文本 -->
<input wx:if="{{item._input == 'text'}}" type="text" value="{{item.value}}" placeholder="{{item.name}}"
bindtap="onClick" bindinput="onInput" bindconfirm="onEnter" data-order="{{order}}" data-index="{{index}}" data-item="{{item}}"/>
<!-- 文本 -->
<textarea wx:elif="{{item._input == 'textarea'}}" value="{{item.value}}" placeholder="{{item.name}}"
bindtap="onClick" bindinput="onInput" data-field="{{field}}" data-order="{{order}}" data-index="{{index}}" data-input="{{item}}"></textarea>
<picker wx:elif="{{item._input == 'select'}}" bindchange="onChange" value="{{item.index||0}}" range="{{item.values}}"
data-field="{{field}}" data-order="{{order}}" data-index="{{index}}" data-input="{{item}}">
<view>{{item.values[item.index||0]}}</view>
</picker>
<!-- 按钮 -->
<button wx:elif="{{item._input == 'button'}}" size="mini" bindtap="onClick" data-field="{{field}}" data-order="{{order}}" data-index="{{index}}" data-input="{{item}}">{{item.value||item.name}}</button>
</view>
</view>
<table wx:if="{{field.msg}}">
<tr><th wx:for="{{field.msg.append}}" wx:key="name">{{item}}</th></tr>
<tr wx:for="{{field.msg._index}}" wx:key="name" wx:for-index="line"><td wx:for="{{field.msg.append}}" bindtap="onWhich" data-value="{{field.msg[item][line]}}" data-index="{{line}}" data-field="{{item}}" data-order="{{order}}">{{field.msg[item][line]}}</td></tr>
</table>
<view class="output" wx:if="{{field.msg.result && field.feature && field.feature.display == 'inner'}}"><rich-text wx:for="{{field.msg.result}}" wx:key="name" nodes="{{item}}"></rich-text></view>
<view class="output" wx:elif="{{field.msg.result}}"><text wx:for="{{field.msg.result}}" wx:key="name">{{item}}</text></view>
<!-- 输出 -->
<view class="output">
<!-- 表格 -->
<table wx:if="{{field.msg}}">
<tr><th wx:for="{{field.msg.append}}" wx:key="name">{{item}}</th></tr>
<tr wx:for="{{field.msg._index}}" wx:key="name" wx:for-index="line">
<td wx:for="{{field.msg.append}}" bindtap="onWhich" data-value="{{field.msg[item][line]}}" data-index="{{line}}" data-field="{{item}}" data-order="{{order}}">{{field.msg[item][line]}}</td>
</tr>
</table>
<!-- 文本 -->
<view class="output" wx:if="{{field.msg.result && field.feature && field.feature.display == 'inner'}}"><rich-text wx:for="{{field.msg.result}}" wx:key="name" nodes="{{item}}"></rich-text></view>
<view class="output" wx:elif="{{field.msg.result}}"><text wx:for="{{field.msg.result}}" wx:key="name">{{item}}</text></view>
</view>
</view>
</view>

View File

@ -1,29 +0,0 @@
view.action view {
float:left;
}
view.detail {
margin-top:10px;
clear:both;
}
view.detail text.title {
font-weight:bold;
font-size:18px;
}
view.detail view.inputs>view {
float:left;
}
view.detail input {
width:80px;
margin:2px;
padding:2px;
border:solid 1px green;
}
view.detail view.textarea {
clear:both;
width:calc(100% - 2px);
border:solid 1px green;
}
view.output {
background-color:#272822;
}

View File

@ -3,31 +3,49 @@ const app = getApp()
Page({
data: {
action: ["扫码", "刷新", "登录"],
msg: {append: ["key", "name"]},
},
refresh: function() {var page = this
app.request("river", {}, function(msg) {page.setData({msg: msg})
msg.nRow() == 1 && page.toStorm(0)
})
action: {
"扫码": function(event, page, data, name) {
app.scans(function(res) {
page.onaction(event, res, res.name)
})
},
"刷新": function(event, page, data, name) {
app.request("river", {}, function(msg) {
page.setData({msg: msg}), msg.nRow() == 1 && page.ondetail(event, data, 0)
})
},
"登录": function(event, page, data, name) {
app.conf.sessid = "", app.usercode(function() {
page.onaction(event, data, "刷新")
})
},
},
onaction: function(event, data, name) {
data = data || event.target.dataset, name = name || data.name
console.log("action", "river", name)
this.action[name](event, this, data)
},
ondetail: function(event, data, index) {
data = data || event.target.dataset, index = index||data.index||0
console.log("detail", "river", index)
app.jumps("storm/storm", {river: this.data.msg.key[index]})
},
toStorm: function(index) {app.jumps("storm/storm", {river: this.data.msg.key[index]})},
onFocus: function(event) {},
onInput: function(event) {},
onEnter: function(event) {},
onClick: function(event) {this.toStorm(event.currentTarget.dataset.index)},
onLoad: function (options) {
console.log("page", "river", options)
app.conf.sessid = app.conf.sessid || options.sessid
this.refresh()
app.conf.sessid = options.sessid || app.conf.sessid
this.onaction({}, options, "刷新")
},
onReady: function () {},
onShow: function () {},
onHide: function () {},
onUnload: function () {},
onPullDownRefresh: function () {this.refresh()},
onPullDownRefresh: function () {
this.onaction({}, {}, "刷新")
},
onReachBottom: function () {},
onShareAppMessage: function () {}
})

View File

@ -1,5 +1,4 @@
<import src="../../app.wxml"/>
<view class="display">
<template is="list-name" data="{{msg}}"></template>
</view>
<template is="action" data="{{action}}"></template>
<template is="list-name" data="{{msg}}"></template>

View File

@ -3,30 +3,51 @@ const app = getApp()
Page({
data: {
river: "", msg: {append: ["key", "name"]},
action: ["扫码", "刷新", "登录"],
msg: {append: ["key", "name"]},
river: "",
},
refresh: function() {var page = this
app.request("storm", {cmds: [page.data.river]}, function(msg) {
page.setData({msg: msg}), msg.nRow() == 1 && page.toAction(0)
})
action: {
"扫码": function(event, page, data, name) {
app.scans(function(res) {
})
},
"刷新": function(event, page, data, name) {
app.request("storm", {cmds: [data.river||page.data.river]}, function(msg) {
page.setData({msg: msg}), msg.nRow() == 1 && page.ondetail(event, data, 0)
})
},
"登录": function(event, page, data, name) {
app.conf.sessid = "", app.usercode(function() {
page.onaction(event, data, "刷新")
})
},
},
onaction: function(event, data, name) {
data = data || event.target.dataset, name = name || data.name
console.log("action", "storm", name)
this.action[name](event, this, data)
},
ondetail: function(event, data, index) {
data = data || event.target.dataset, index = index||data.index||0
console.log("detail", "storm", index)
app.jumps("action/action", {river: data.river||this.data.river, storm: this.data.msg.key[index]})
},
toAction: function(index) {app.jumps("action/action", {river: this.data.river, storm: this.data.msg.key[index]})},
onFocus: function(event) {},
onInput: function(event) {},
onEnter: function(event) {},
onClick: function(event) {this.toAction(event.currentTarget.dataset.index)},
onLoad: function (options) {
console.log("page", "storm", options)
app.conf.sessid = app.conf.sessid || options.sessid
this.data.river = options.river, this.refresh()
app.conf.sessid = options.sessid || app.conf.sessid
this.data.river = options.river
this.onaction({}, options, "刷新")
},
onReady: function () {},
onShow: function (args) {},
onHide: function () {},
onUnload: function () {},
onPullDownRefresh: function () {this.refresh()},
onPullDownRefresh: function () {
this.onaction({}, {}, "刷新")
},
onReachBottom: function () {},
onShareAppMessage: function () {}
})

View File

@ -1,5 +1,4 @@
<import src="../../app.wxml"/>
<view class="display">
<template is="list-name" data="{{msg}}"></template>
</view>
<template is="action" data="{{action}}"></template>
<template is="list-name" data="{{msg}}"></template>

View File

@ -57,9 +57,9 @@
},
{
"id": 1,
"name": "pages/storm/storm",
"pathName": "pages/storm/storm",
"query": "river=c796cd&storm=9092d5",
"name": "action",
"pathName": "pages/action/action",
"query": "river=d022b3&storm= c22d21",
"scene": null
},
{

View File

@ -40,4 +40,12 @@ module.exports = {
formatTime: formatTime,
Time: Time,
Args: Args,
List: function(list, cb) {
var res = [], val;
for (var i = 0; i < list.length; i++) {
typeof cb == "function"? (val = cb(list[i], i, list)) != undefined && res.push(val): res.push(list[i])
}
return res
},
}