1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00
This commit is contained in:
shylinux 2021-02-07 16:16:00 +08:00
parent 0d7b3c5c5f
commit d6cfbbb924
11 changed files with 191 additions and 204 deletions

View File

@ -18,23 +18,16 @@ Volcanos("base", {help: "数据类型",
}
},
Eq: function(obj, other) { var self = arguments.callee
// undefined null
// string number boolen
// object function
if (typeof obj != typeof other) {
return false
}
if (typeof obj != typeof other) { return false }
if (typeof obj == "object") {
if (obj.length != other.length) { return false }
for (var i = 0; i < obj.length; i++) {
if (!self(obj[i], other[i])) {
return false
}
if (!self(obj[i], other[i])) { return false }
}
for (var k in obj) {
if (!self(obj[k], other[k])) {
return false
}
if (!self(obj[k], other[k])) { return false }
}
return true
}

View File

@ -26,22 +26,21 @@ App({
},
Data: function(item, index) {
var text = msg[item]&&msg[item][index]||""
var list = kit.Split(text, " ", "<=/>")
var data = {_type: "text", _text: text}
if (text.indexOf("<") != 0) { return [data] }
var res = [], data = {_type: "text", _text: text}
var res = [], list = kit.Split(text, " ", "<=/>")
for (var i = 0; i < list.length; i++) {
if (list[i] == "<") { data = {}
if (list[i] == "/") { i++ } else { res.push(data) }
data._type = list[i+1]
data._text = text
if (data._type == "div") { break }
data._type = list[i+1], data._text = text, i++
continue
} else if (list[i] == ">") {
continue
}
if (list[i] == ">") {
} else if (list[i+1] == "=") {
data[list[i]] = list[i+2]
i += 2
if (list[i+1] == "=") {
data[list[i]] = list[i+2], i += 2
} else {
data[list[i]] = list[i]
}
@ -78,10 +77,6 @@ App({
}})
}}) })
},
location: function(arg) { wx.chooseLocation(arg) },
clipboard: function(cb) { wx.getClipboardData({success: function(res) {
typeof cb == "function" && cb(kit.parseJSON(res.data))
}}) },
title: function(title) { wx.setNavigationBarTitle({title: title, success: function() {}})},
modal: function(title, content, cb) { wx.showModal({title: title||"", content: content||"", success: cb})},
@ -107,6 +102,16 @@ App({
}
}})
},
clipboard: function(cb) { wx.getClipboardData({success: function(res) {
typeof cb == "function" && cb(kit.parseJSON(res.data))
}}) },
location: function(cb) { wx.chooseLocation({success: function(res) {
typeof cb == "function" && cb({
name: res.name, text: res.address,
latitude: parseInt(res.latitude * 100000),
longitude: parseInt(res.longitude * 100000),
})
}}) },
onLaunch: function() {
this.conf.sessid = wx.getStorageSync("sessid")

View File

@ -18,15 +18,51 @@
</view>
</template>
<template name="field">
<view class="output">
<view class="field" wx:for="{{list}}" wx:for-index="order" wx:for-item="field" wx:key="index">
<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">
<!-- 文本 -->
<textarea wx:if="{{item._input == 'textarea'}}" placeholder="{{item.name}}" value="{{item.value}}"
bindinput="onInput" data-index="{{index}}" data-order="{{order}}"></textarea>
<!-- 文本 -->
<input wx:elif="{{item._input == 'text'}}" placeholder="{{item.name}}" value="{{item.value}}" type="text"
bindinput="onInput" data-index="{{index}}" data-order="{{order}}"/>
<!-- 列表 -->
<picker wx:elif="{{item._input == 'select'}}" range="{{item.values}}" value="{{item.index||0}}"
bindchange="onChange" data-index="{{index}}" data-order="{{order}}">
<view>{{item.values[item.index||0]}}</view>
</picker>
<!-- 按钮 -->
<button wx:elif="{{item._input == 'button'}}" size="mini"
bindtap="onClick" data-index="{{index}}" data-order="{{order}}">{{item.value||item.name}}</button>
</view>
</view>
<view class="output"> <!-- 输出 -->
<!-- 表格 -->
<template is="table" data="{{order: order, msg: field.msg}}"></template>
<!-- 文本 -->
<view class="code"><rich-text wx:for="{{field.msg.result}}" wx:key="index" nodes="{{item}}"></rich-text></view>
</view>
</view>
</view>
</template>
<template name="table">
<table wx:if="{{msg}}">
<tr><th wx:for="{{msg.append}}" wx:key="index">{{item}}</th></tr>
<tr wx:for="{{msg._index}}" wx:key="index" wx:for-index="line">
<td bindtap="onWhich" wx:for="{{msg.append}}" wx:key="index"
data-value="{{msg[item][line]}}" data-key="{{item}}" data-index="{{line}}" data-order="{{order}}" data-input="{{msg._view[item][line]}}"
>
<view bindtap="onWhich" wx:for="{{msg._view[item][line]}}" wx:key="index">
<template bindtap="onWhich" is="input" data="{{input: item}}"></template>
<tr wx:for="{{msg._index}}" wx:key="index">
<td wx:for="{{msg.append}}" wx:for-index="i" wx:key="index">
<view class="which" bindtap="onWhich" wx:for="{{msg._view[item][index]}}" wx:for-item="input" wx:for-index="i" wx:key="i"
data-input="{{input}}" data-value="{{input._text}}" data-key="{{item}}" data-index="{{index}}" data-order="{{order}}">
<template data="{{input}}" is="input"></template>
</view>
</td>
</tr>

View File

@ -1,76 +1,66 @@
page {
color:white; background-color:#272822;
background-color:#272822; color:white;
font-size:14px; font-family:monospace;
white-space:pre;
}
view.title {
font-size:18px; font-weight:bold;
margin-top:20px; margin-bottom:10px;
}
view.action>view.item {
float:left;
}
view.output {
max-width:-webkit-fill-available;
overflow:auto;
clear:both;
}
view.output view.item {
text-align:center;
font-size:18px;
padding:10px;
border:solid 1px green;
font-size:18px; text-align:center;
padding:10px; border:solid 1px green;
}
view.output view.list view.item {
background-color:darkgray;
margin-left:20px;
}
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.output view.code {
margin-left:10px;
padding:10px;
margin-left:10px; padding:10px;
border-left:solid 2px cyan;
}
view.title {
margin-top:20px;
margin-bottom:10px;
font-weight:bold;
font-size:18px;
view.action view.item {
float:left; padding:0;
}
view.option view.item {
border:0; padding:0;
float:left; margin:2px;
}
view.option view.item.textarea {
border:solid 1px green;
width:calc(100% - 2px);
clear:both;
}
view.option view.item.select {
border:solid 1px green; padding:6px;
}
view.option view.item button {
height:29px;
}
view.option view.item input {
border:solid 1px green;
width:80px;
}
tr {
text-align:center; white-space:nowrap;
display:flex;
justify-content:space-between;
}
th {
padding:5px;
border:solid 1px red; padding:5px;
width:100%;
text-align:center;
border:solid 1px red;
}
td {
padding:5px;
border:solid 1px green; padding:5px;
width:100%;
text-align:center;
border:solid 1px green;
}
td view.which {
float:left;
}

View File

@ -10,8 +10,8 @@ Page({
},
action: {
"刷新": function(event, page) { var list = []
app.data[page.data.river+page.data.storm] = page.data.list = list, page.data.back = []
app.requests("action", {cmds: [page.data.river, page.data.storm]}, function(msg) {
app.data[[page.data.river, page.data.storm].join(".")] = page.data.list = list, page.data.back = []
app.requests(page.name, {cmds: [page.data.river, page.data.storm]}, function(msg) {
msg.Table(function(line, index) {
list.push(line), page.data.back.push([])
line.feature = kit.parseJSON(line.meta, {})
@ -66,7 +66,7 @@ Page({
run: function(event, order, cmd, cb) { var page = this, field = page.data.list[order]
var cmds = [page.data.river, page.data.storm, field.id||field.key]; if (!cmd) {
var cmd = kit.List(field.inputs, function(input) { if (input._input != "button") { return input.value } })
page.data.back[order].push(cmd)
kit.EQ(page.data.back[page.data.back.length-1], cmd) || page.data.back[order].push(cmd)
}; cmds = cmds.concat(cmd)
for (var i = cmds.length-1; i > 0; i--) { if (cmds[i] === "") { cmds.pop() } else { break } }
@ -77,40 +77,19 @@ Page({
typeof cb == "function" && cb(msg)
})
},
plugin: {
scanQRCode: function(event, order, page, cmd) { app.scans(function(res) {
page.run(event, order, kit.Simple("action", cmd, res), function(msg) {
app.toast("添加成功"), page.run(event, order)
})
return true
}) },
getClipboardData: function(event, order, page, cmd) { app.clipboard(function(res) {
page.run(event, order, kit.Simple("action", cmd, res), function() {
app.toast("添加成功"), page.run(event, order)
})
}) },
getLocation: function(event, order, page, cmd) { app.location({success: function(res) {
res.latitude = parseInt(res.latitude * 100000)
res.longitude = parseInt(res.longitude * 100000)
page.run(event, order, kit.Simple("action", cmd, res), function() {
app.toast("添加成功"), page.run(event, order)
})
}}) },
},
onInput: function(event) { var page = this, data = event.target.dataset
page.data.list[data.order].inputs[data.index].value = event.detail.value
var input = page.data.list[data.order].inputs[data.index]
input.value = event.detail.value
},
onChange: function(event) { var page = this, data = event.target.dataset
var input = page.data.list[data.order].inputs[data.index]
input.value = input.values[parseInt(event.detail.value)]
},
onClick: function(event) { var page = this, data = event.target.dataset
var field = page.data.list[data.order]
var input = field.inputs[data.index]
var field = page.data.list[data.order]; var input = field.inputs[data.index]
if (field.feature[input.name]) {
app.data.insert = {field: field, input: input, cb: function(res) {
app.data.insert = {field: field, input: input, list: field.feature[input.name], cb: function(res) {
page.run(event, data.order, kit.Simple("action", input.name, res))
}}
app.jumps("insert/insert", {river: page.data.river, storm: page.data.storm, title: field.name})
@ -123,22 +102,20 @@ Page({
kit.List(field.inputs, function(input, index) {
if (input._input != "button") { input.value = line&&line[index] || "" }
})
case "查看": // 执行命令
page.run(event, data.order)
break
case "执行": // 执行命令
case "刷新": // 执行命令
case "查看": page.run(event, data.order); break
default:
var cb = page.plugin[input.name]; if (typeof cb == "function") {
cb(event, data.order, page, input.name)
} else {
var arg = kit.List(field.inputs, function(input) { if (input._input != "button") { return input.value } })
page.run(event, data.order, ["action", input.name].concat(arg))
}
var cb = page.plugin[input.name]; typeof cb == "function"? cb(event, page, data.order, input.name):
page.run(event, data.order, ["action", input.name].concat(kit.List(field.inputs, function(input) {
if (input._input != "button") { return input.value }
})))
}
},
onWhich: function(event) { var page = this, data = event.currentTarget.dataset
var field = page.data.list[data.order]; if (!field) { return }
var input = data.input && data.input[0]; if (input && input.type == "button") { var option = {}
var input = data.input; if (input && input.type == "button") { var option = {}
kit.List(field.inputs, function(input) { input._input != "button" && (option[input.name] = input.value) })
if (field.msg.append[0] == "key" && field.msg.append[1] == "value") {
kit.List(field.msg.key, function(key, index) { option[key] = field.msg.value[index] })
@ -147,39 +124,56 @@ Page({
}
event._option = option
var cb = page.plugin[input.name]
return typeof cb == "function"? cb(event, page, data, input):
var cb = page.plugin[input.name]; typeof cb == "function"? cb(event, page, data.order, input.name):
page.run(event, data.order, ["action", input.name])
return
}
field.inputs.forEach(function(inputs, index) {
if (inputs.name == data.key) { inputs.value = data.value
field.inputs.forEach(function(input, index) {
if (input.name == data.key) { input.value = data.value
page.setData({list: page.data.list})
inputs.action == "auto" && page.run(event, data.order)
input.action == "auto" && page.run(event, data.order)
}
})
},
plugin: {
scanQRCode: function(event, page, order, cmd) { app.scans(function(res) {
page.run(event, order, kit.Simple("action", cmd, res), function(msg) {
app.toast("添加成功"), page.run(event, order)
})
return true
}) },
getClipboardData: function(event, page, order, cmd) { app.clipboard(function(res) {
page.run(event, order, kit.Simple("action", cmd, res), function() {
app.toast("添加成功"), page.run(event, order)
})
}) },
getLocation: function(event, page, order, cmd) { app.location(function(res) {
page.run(event, order, kit.Simple("action", cmd, res), function() {
app.toast("添加成功"), page.run(event, order)
})
}) },
},
onReady: function () {},
onLoad: function (options) {
console.log("page", "action", options)
console.log("page", this.name, options)
this.data.river = options.river
this.data.storm = options.storm
this.data.title = options.title
app.title(options.title)
var data = app.data[options.river+options.storm]
if (data) { return this.setData({list: this.data.list = data}) }
this.onaction({}, {name: "刷新"})
var data = app.data[[options.river, options.storm].join(".")]
data? this.setData({list: this.data.list = data}): this.onaction({}, {name: "刷新"})
},
onReady: function () {},
onShow: function () {},
onHide: function () {},
onUnload: function () {},
onReachBottom: function () {},
onPullDownRefresh: function () { this.onaction({}, {name: "刷新"}) },
onShareAppMessage: function (res) {
return { title: this.data.title,
path: "pages/action/action?river="+this.data.river+"&storm="+this.data.storm+"&title="+this.data.title,
}
return {title: this.data.title, path: kit.Args("pages/action/action", {
river: this.data.river, storm: this.data.storm, title: this.data.title,
})}
},
})

View File

@ -1,39 +1,4 @@
<import src="../../app.wxml"/>
<template is="action" data="{{action}}"></template>
<template is="field" data="{{list}}"></template>
<view class="output">
<view class="field" wx:for="{{list}}" wx:key="index" wx:for-index="order" wx:for-item="field">
<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">
<!-- 文本 -->
<textarea wx:if="{{item._input == 'textarea'}}" value="{{item.value}}" placeholder="{{item.name}}"
bindinput="onInput" data-index="{{index}}" data-order="{{order}}"></textarea>
<!-- 文本 -->
<input wx:elif="{{item._input == 'text'}}" type="text" value="{{item.value}}" placeholder="{{item.name}}"
bindinput="onInput" data-index="{{index}}" data-order="{{order}}"/>
<!-- 列表 -->
<picker wx:elif="{{item._input == 'select'}}" value="{{item.index||0}}" range="{{item.values}}"
bindchange="onChange" data-index="{{index}}" data-order="{{order}}">
<view>{{item.values[item.index||0]}}</view>
</picker>
<!-- 按钮 -->
<button wx:elif="{{item._input == 'button'}}" size="mini"
bindtap="onClick" data-index="{{index}}" data-order="{{order}}">{{item.value||item.name}}</button>
</view>
</view>
<!-- 输出 -->
<view class="output">
<!-- 表格 -->
<template is="table" data="{{msg: field.msg, order: order}}"></template>
<!-- 文本 -->
<view class="code"><rich-text wx:for="{{field.msg.result}}" wx:key="index" nodes="{{item}}"></rich-text></view>
</view>
</view>
</view>

View File

@ -1,14 +0,0 @@
view.option view.item {
padding:0;
}
view.option view.item.select {
padding:3px;
}
div.story[data-type=spark] {
background-color:#2169a9a6; color:white;
box-shadow: 4px 4px 10px 1px #626bd0;
padding:4px 10px; margin:10px 0px;
border-left:solid 4px blue;
}

View File

@ -2,9 +2,10 @@ const kit = require("../../utils/kit.js")
const app = getApp()
Page({
name: "insert",
data: {
insert: [],
action: ["扫码"],
list: [],
},
action: {
"扫码": function(event, page) { app.scans(function(res) {
@ -15,35 +16,36 @@ Page({
}) },
},
onaction: function(event, data) { data = data || event.target.dataset
console.log("action", "river", data.name)
console.log("action", this.name, data.name)
this.action[data.name](event, this)
},
onInput: function(event) { var page = this, data = event.target.dataset
app.data.insert.list[data.index].value = event.detail.value
page.data.list[data.index].value = event.detail.value
},
onChange: function(event) { var page = this, data = event.target.dataset
var input = app.data.insert[data.index]
var input = page.data.list[data.index]
input.value = input.values[parseInt(event.detail.value)]
},
onConfirm: function (event) { var page = this
kit.List(page.data.insert, function(item) {
app.data.insert.data[item.name] = item.value
})
app.data.insert.cb(app.data.insert.data)
wx.navigateBack()
var res = {}; kit.List(page.data.list, function(item) { res[item.name] = item.value })
app.data.insert.cb(res), wx.navigateBack()
},
onLoad: function (options) { app.title(options.title)
console.log("page", "insert", options)
kit.List(app.data.insert.list, function(item) {
item.value && item.value.indexOf("@") == 0 && (item.value = "")
app.data.insert.data[item.name] = item.value
item.action = item.action || item.value
onLoad: function (options) {
console.log("page", this.name, options)
app.title(options.title)
kit.List(app.data.insert.list, function(input) {
input.action = input.action || input.value
input.value == "auto" && (input.value = "")
if (input.value && input.value.indexOf("@") == 0) {
input.action = input.value.slice(1), input.value = ""
}
})
this.data.insert = app.data.insert.list
this.setData(this.data)
this.setData({list: this.data.list = app.data.insert.list})
},
onReady: function () {},
onShow: function () {},

View File

@ -2,17 +2,17 @@
<template is="action" data="{{action}}"></template>
<view class="output">
<view class="item" wx:for="{{insert}}" wx:key="index">
<view class="item" wx:for="{{list}}" wx:key="index">
<!-- 文本 -->
<textarea wx:if="{{item._input == 'textarea'}}" value="{{item.value}}" placeholder="{{item.name}}"
<textarea wx:if="{{item._input == 'textarea'}}" placeholder="{{item.name}}" value="{{item.value}}"
bindinput="onInput" data-index="{{index}}"></textarea>
<!-- 文本 -->
<input wx:elif="{{item._input == 'text'}}" type="text" value="{{item.value}}" placeholder="{{item.name}}"
<input wx:elif="{{item._input == 'text'}}" placeholder="{{item.name}}" value="{{item.value}}" type="text"
bindinput="onInput" data-index="{{index}}"/>
<!-- 列表 -->
<picker wx:elif="{{item._input == 'select'}}" value="{{item.index||0}}" range="{{item.values}}"
<picker wx:elif="{{item._input == 'select'}}" range="{{item.values}}" value="{{item.index||0}}"
bindchange="onChange" data-index="{{index}}">
<view>{{item.values[item.index||0]}}</view>
</picker>

View File

@ -44,8 +44,8 @@ Page({
app.jumps("action/action", {river: item.hash, storm: tool.hash, title: item.name+"."+tool.name})
},
onLoad: function (options) { this.onaction({}, {name: "刷新"}) },
onReady: function () {},
onLoad: function (options) { this.onaction({}, {name: "刷新"}) },
onShow: function () {},
onHide: function () {},
onUnload: function () {},

View File

@ -12,6 +12,22 @@ function shy(help, meta, list, cb) {
return cb
}; var _can_name = ""
module.exports = {
EQ: function(obj, other) {
if (typeof obj != typeof other) { return false }
if (typeof obj == "object") {
if (obj.length != other.length) { return false }
for (var i = 0; i < obj.length; i++) {
if (!this.EQ(obj[i], other[i])) { return false }
}
for (var k in obj) {
if (!this.EQ(obj[k], other[k])) { return false }
}
return true
}
return obj === other
},
Number: function(d, n) {var res = [];
while (d > 0) {res.push(d % 10); d = parseInt(d / 10); n--}
while (n > 0) {res.push("0"); n--}