1
0
forked from x/ContextOS

add qrcode

This commit is contained in:
shylinux 2019-06-10 09:47:45 +08:00
parent 7c8a44edd7
commit 9c887c773e
11 changed files with 272 additions and 79 deletions

View File

@ -6,9 +6,10 @@
config load tmp/cert.json work flow trust config load tmp/cert.json work flow trust
~wiki ~wiki
config load tmp/wiki.json wiki_visit config load tmp/wiki.json wiki_visit
source etc/common.shy source etc/common.shy
~ssh ~ssh
remote auto remote auto
~cli
plugin sort.go sort
source local.shy source local.shy

View File

@ -46,28 +46,35 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
"timer": &ctx.Config{Name: "timer", Value: map[string]interface{}{"interval": "10s", "timer": ""}, Help: "断线重连"}, "timer": &ctx.Config{Name: "timer", Value: map[string]interface{}{"interval": "10s", "timer": ""}, Help: "断线重连"},
"componet": &ctx.Config{Name: "componet", Value: map[string]interface{}{ "componet": &ctx.Config{Name: "componet", Value: map[string]interface{}{
"index": []interface{}{ "index": []interface{}{
map[string]interface{}{"componet_name": "salary", "componet_help": "salary", "componet_tmpl": "componet", map[string]interface{}{"componet_name": "salary", "componet_help": "计算工资",
"componet_type": "public", "componet_tmpl": "componet", "componet_view": "Salary", "componet_init": "",
"componet_view": "Salary", "componet_init": "", "componet_type": "public", "componet_ctx": "web.chat", "componet_cmd": "salary",
"componet_ctx": "web.chat", "componet_cmd": "salary", "componet_args": []interface{}{"@text", "@total"}, "inputs": []interface{}{ "componet_args": []interface{}{}, "inputs": []interface{}{
map[string]interface{}{"label": "total", "type": "text", "name": "text"}, map[string]interface{}{"label": "total", "type": "text", "name": "text"},
map[string]interface{}{"label": "base", "type": "text", "name": "total"}, map[string]interface{}{"label": "base", "type": "text", "name": "total"},
}, },
}, },
map[string]interface{}{"componet_name": "pwd", "componet_help": "pwd", "componet_tmpl": "componet", map[string]interface{}{"componet_name": "qrcode", "componet_help": "生成二维码",
"componet_type": "protected", "componet_tmpl": "componet", "componet_view": "QRCode", "componet_init": "initQRCode.js",
"componet_view": "FlashList", "componet_init": "initFlashList.js", "componet_type": "public", "componet_ctx": "web.chat", "componet_cmd": "login",
"componet_ctx": "nfs", "componet_cmd": "pwd", "componet_args": []interface{}{"@text"}, "inputs": []interface{}{ "componet_args": []interface{}{"qrcode"}, "inputs": []interface{}{
map[string]interface{}{"label": "content", "type": "text", "name": "content"},
},
},
map[string]interface{}{"componet_name": "pwd", "componet_help": "pwd",
"componet_tmpl": "componet", "componet_view": "FlashList", "componet_init": "initFlashList.js",
"componet_type": "protected", "componet_ctx": "nfs", "componet_cmd": "pwd",
"componet_args": []interface{}{}, "inputs": []interface{}{
map[string]interface{}{"type": "button", "value": "当前", "click": "show"}, map[string]interface{}{"type": "button", "value": "当前", "click": "show"},
map[string]interface{}{"type": "button", "value": "所有", "click": "show"}, map[string]interface{}{"type": "button", "value": "所有", "click": "show"},
map[string]interface{}{"type": "text", "name": "text"}, map[string]interface{}{"type": "text", "name": "text"},
}, },
"display_result": "", "display_append": "", "display_result": "", "display_append": "",
}, },
map[string]interface{}{"componet_name": "dir", "componet_help": "dir", "componet_tmpl": "componet", map[string]interface{}{"componet_name": "dir", "componet_help": "dir",
"componet_type": "private", "componet_tmpl": "componet", "componet_view": "FlashList", "componet_init": "initFlashList.js",
"componet_view": "FlashList", "componet_init": "initFlashList.js", "componet_type": "private", "componet_ctx": "nfs", "componet_cmd": "dir",
"componet_ctx": "nfs", "componet_cmd": "dir", "componet_args": []interface{}{"@text"}, "inputs": []interface{}{ "componet_args": []interface{}{}, "inputs": []interface{}{
map[string]interface{}{"type": "text", "name": "text"}, map[string]interface{}{"type": "text", "name": "text"},
}, },
"display_result": "", "display_append": "", "display_result": "", "display_append": "",
@ -134,6 +141,11 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
return return
} }
switch arg[0] { switch arg[0] {
case "init": // 创建用户
if m.Confs("runtime", "user.cert") && m.Confs("runtime", "user.key") {
break
}
fallthrough
case "create": // 创建用户 case "create": // 创建用户
m.Cmd("aaa.auth", "username", m.Conf("runtime", "user.name"), "delete", "node") m.Cmd("aaa.auth", "username", m.Conf("runtime", "user.name"), "delete", "node")
if len(arg) == 1 { if len(arg) == 1 {
@ -231,8 +243,14 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
m.Echo("private componet of %s", m.Conf("runtime", "work.name")) m.Echo("private componet of %s", m.Conf("runtime", "work.name"))
break break
} }
msg := m.Find(kit.Format(tool["componet_ctx"])) msg := m.Find(kit.Format(tool["componet_ctx"]))
msg.Cmd(tool["componet_cmd"], arg[4:]).CopyTo(m)
args := []string{}
for _, v := range kit.Trans(tool["componet_args"]) {
args = append(args, msg.Parse(v))
}
msg.Cmd(tool["componet_cmd"], args, arg[4:]).CopyTo(m)
default: default:
m.Confm("componet", arg[0:], func(value map[string]interface{}) { m.Confm("componet", arg[0:], func(value map[string]interface{}) {

View File

@ -5,6 +5,7 @@ import (
"contexts/ctx" "contexts/ctx"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/skip2/go-qrcode"
// "github.com/PuerkitoBio/goquery" // "github.com/PuerkitoBio/goquery"
"github.com/go-cas/cas" "github.com/go-cas/cas"
"html/template" "html/template"
@ -136,6 +137,10 @@ func (web *WEB) Login(msg *ctx.Message, w http.ResponseWriter, r *http.Request)
if msg.Options("sessid") { if msg.Options("sessid") {
msg.Log("info", "sessid: %s", msg.Option("sessid")) msg.Log("info", "sessid: %s", msg.Option("sessid"))
msg.Log("info", "username: %s", msg.Option("username", msg.Cmd("aaa.sess", "user").Append("meta"))) msg.Log("info", "username: %s", msg.Option("username", msg.Cmd("aaa.sess", "user").Append("meta")))
msg.Log("info", "nickname: %s", msg.Option("nickname", msg.Cmdx("aaa.auth", "username", msg.Option("username"), "data", "nickname")))
if !msg.Options("nickname") {
msg.Option("nickname", msg.Option("username"))
}
} }
if !msg.Options("username") && msg.Options("relay") { if !msg.Options("username") && msg.Options("relay") {
@ -167,8 +172,10 @@ func (web *WEB) HandleCmd(m *ctx.Message, key string, cmd *ctx.Command) {
// 请求环境 // 请求环境
msg.Option("dir_root", msg.Cap("directory")) msg.Option("dir_root", msg.Cap("directory"))
for _, v := range r.Cookies() { for _, v := range r.Cookies() {
if v.Value != "" {
msg.Option(v.Name, v.Value) msg.Option(v.Name, v.Value)
} }
}
// 请求参数 // 请求参数
r.ParseMultipartForm(int64(msg.Confi("serve", "form_size"))) r.ParseMultipartForm(int64(msg.Confi("serve", "form_size")))
@ -223,10 +230,19 @@ func (web *WEB) HandleCmd(m *ctx.Message, key string, cmd *ctx.Command) {
switch { switch {
case msg.Has("redirect"): case msg.Has("redirect"):
http.Redirect(w, r, msg.Append("redirect"), http.StatusTemporaryRedirect) http.Redirect(w, r, msg.Append("redirect"), http.StatusTemporaryRedirect)
case msg.Has("directory"): case msg.Has("directory"):
http.ServeFile(w, r, msg.Append("directory")) http.ServeFile(w, r, msg.Append("directory"))
case msg.Has("componet"): case msg.Has("componet"):
msg.Spawn().Add("option", "componet_group", msg.Meta["componet"]).Cmd("/render") msg.Spawn().Add("option", "componet_group", msg.Meta["componet"]).Cmd("/render")
case msg.Has("qrcode"):
w.Header().Set("Content-Type", "image/png")
qr, e := qrcode.New(msg.Append("qrcode"), qrcode.Medium)
m.Assert(e)
m.Assert(qr.Write(256, w))
case msg.Has("append"): case msg.Has("append"):
meta := map[string]interface{}{} meta := map[string]interface{}{}
if len(msg.Meta["result"]) > 0 { if len(msg.Meta["result"]) > 0 {
@ -915,7 +931,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
accept_json := strings.HasPrefix(m.Option("accept"), "application/json") accept_json := strings.HasPrefix(m.Option("accept"), "application/json")
w := m.Optionv("response").(http.ResponseWriter) w := m.Optionv("response").(http.ResponseWriter)
if accept_json { if accept_json {
w.Header().Add("Content-Type", "application/json") // w.Header().Add("Content-Type", "application/json")
} else { } else {
w.Header().Add("Content-Type", "text/html") w.Header().Add("Content-Type", "text/html")
} }
@ -1022,7 +1038,9 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
// 添加响应 // 添加响应
if msg.Appends("directory") { if msg.Appends("qrcode") {
m.Append("qrcode", msg.Append("qrcode"))
} else if msg.Appends("directory") {
m.Append("download_file", fmt.Sprintf("/download/%s", msg.Append("directory"))) m.Append("download_file", fmt.Sprintf("/download/%s", msg.Append("directory")))
return return
} else if accept_json { } else if accept_json {

View File

@ -9,6 +9,7 @@ import (
"encoding/xml" "encoding/xml"
"fmt" "fmt"
"net/http" "net/http"
"net/url"
"sort" "sort"
"strings" "strings"
"time" "time"
@ -117,6 +118,7 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
"chat": &ctx.Config{Name: "chat", Value: map[string]interface{}{ "chat": &ctx.Config{Name: "chat", Value: map[string]interface{}{
"appid": "", "appmm": "", "token": "", "site": "https://shylinux.com", "appid": "", "appmm": "", "token": "", "site": "https://shylinux.com",
"auth": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STATE#wechat_redirect",
"access": map[string]interface{}{"token": "", "expire": 0, "url": "/cgi-bin/token?grant_type=client_credential"}, "access": map[string]interface{}{"token": "", "expire": 0, "url": "/cgi-bin/token?grant_type=client_credential"},
"ticket": map[string]interface{}{"value": "", "expire": 0, "url": "/cgi-bin/ticket/getticket?type=jsapi"}, "ticket": map[string]interface{}{"value": "", "expire": 0, "url": "/cgi-bin/ticket/getticket?type=jsapi"},
}, Help: "聊天记录"}, }, Help: "聊天记录"},
@ -128,21 +130,46 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
}, Help: "聊天记录"}, }, Help: "聊天记录"},
}, },
Commands: map[string]*ctx.Command{ Commands: map[string]*ctx.Command{
"/qrcode": &ctx.Command{Name: "qrcode text", Help: "登录", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
m.Append("qrcode", m.Option("text"))
return
}},
"login": &ctx.Command{Name: "login [username password]", Help: "登录", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "login": &ctx.Command{Name: "login [username password]", Help: "登录", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if len(arg) > 1 { if len(arg) > 0 { // 非登录态
switch arg[0] {
case "weixin":
m.Cmdy(".js_token")
case "qrcode":
m.Append("qrcode", arg[1])
case "rename":
default:
if m.Cmds("ssh.work", "share", arg[0]) { if m.Cmds("ssh.work", "share", arg[0]) {
if m.Cmds("aaa.auth", "username", arg[0], "password", arg[1]) { if m.Cmds("aaa.auth", "username", arg[0], "password", arg[1]) {
m.Option("username", arg[0]) m.Option("username", arg[0])
m.Copy(m.Cmd("aaa.user", "session", "select"), "result") m.Copy(m.Cmd("aaa.user", "session", "select"), "result")
m.Option("sessid", m.Result(0)) m.Option("sessid", m.Result(0))
if !m.Cmds("aaa.auth", "username", arg[0], "data", "chat.default") && m.Option("username") != m.Conf("runtime", "work.name") { if !m.Cmds("aaa.auth", "username", arg[0], "data", "chat.default") && m.Option("username") != m.Conf("runtime", "work.name") {
m.Cmds("aaa.auth", "username", arg[0], "data", "chat.default", m.Spawn().Cmd(".ocean", "spawn", "", m.Option("username")+"@"+m.Conf("runtime", "work.name"))) m.Cmds("aaa.auth", "username", arg[0], "data", "chat.default", m.Spawn().Cmdx(".ocean", "spawn", "", m.Option("username")+"@"+m.Conf("runtime", "work.name")))
} }
} }
} }
} else if m.Options("sessid") { }
}
// 登录检查
if !m.Options("sessid") && !m.Options("username") {
return
}
if len(arg) > 0 {
switch arg[0] {
case "rename":
m.Cmd("aaa.auth", "username", m.Option("username"), "data", "nickname", arg[1])
}
}
m.Append("remote_ip", m.Option("remote_ip"))
m.Append("nickname", m.Option("nickname"))
m.Echo(m.Option("username")) m.Echo(m.Option("username"))
}
return return
}}, }},
"ocean": &ctx.Command{Name: "ocean", Help: "海洋", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "ocean": &ctx.Command{Name: "ocean", Help: "海洋", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
@ -172,6 +199,7 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
"conf": map[string]interface{}{ "conf": map[string]interface{}{
"create_user": m.Option("username"), "create_user": m.Option("username"),
"create_time": m.Time(), "create_time": m.Time(),
"update_time": m.Time(),
"name": kit.Select("what", arg, 2), "name": kit.Select("what", arg, 2),
"route": kit.Select(m.Conf("runtime", "node.route"), m.Option("node.route"), arg[1] != ""), "route": kit.Select(m.Conf("runtime", "node.route"), m.Option("node.route"), arg[1] != ""),
}, },
@ -194,6 +222,14 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
if !m.Options("sessid") || !m.Options("username") { if !m.Options("sessid") || !m.Options("username") {
return return
} }
if m.Options("river") {
if m.Confs("flow", m.Option("river")) && !m.Confs("flow", []string{m.Option("river"), "user", m.Option("username")}) {
u := m.Cmdx("ssh._route", m.Conf("runtime", "work.route"), "_check", "work", m.Option("username"))
m.Conf("flow", []string{m.Option("river"), "user", m.Option("username"), "user"}, u)
}
}
if len(arg) == 0 { if len(arg) == 0 {
m.Confm("flow", func(key string, value map[string]interface{}) { m.Confm("flow", func(key string, value map[string]interface{}) {
if kit.Chain(value, []string{"user", m.Option("username")}) == nil { if kit.Chain(value, []string{"user", m.Option("username")}) == nil {
@ -204,6 +240,7 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
m.Add("append", "name", kit.Chains(value, "conf.name")) m.Add("append", "name", kit.Chains(value, "conf.name"))
m.Add("append", "create_user", kit.Chains(value, "conf.create_user")) m.Add("append", "create_user", kit.Chains(value, "conf.create_user"))
m.Add("append", "create_time", kit.Chains(value, "conf.create_time")) m.Add("append", "create_time", kit.Chains(value, "conf.create_time"))
m.Add("append", "update_time", kit.Chains(value, "conf.update_time"))
if list, ok := kit.Chain(value, "text.list").([]interface{}); ok { if list, ok := kit.Chain(value, "text.list").([]interface{}); ok {
m.Add("append", "count", len(list)) m.Add("append", "count", len(list))
@ -211,7 +248,7 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
m.Add("append", "count", 0) m.Add("append", "count", 0)
} }
}) })
m.Table() m.Sort("name").Sort("update_time", "time_r").Table()
return return
} }
@ -224,6 +261,7 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
m.Add("append", "text", value["text"]) m.Add("append", "text", value["text"])
m.Add("append", "create_time", value["create_time"]) m.Add("append", "create_time", value["create_time"])
m.Add("append", "create_user", value["create_user"]) m.Add("append", "create_user", value["create_user"])
m.Add("append", "create_nick", value["create_nick"])
}) })
m.Table() m.Table()
return return
@ -238,11 +276,14 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
m.Conf("flow", []string{arg[1], "text.list.-2"}, map[string]interface{}{ m.Conf("flow", []string{arg[1], "text.list.-2"}, map[string]interface{}{
"create_user": m.Option("username"), "create_user": m.Option("username"),
"create_nick": m.Option("nickname"),
"create_time": m.Time(), "create_time": m.Time(),
"type": arg[2], "type": arg[2],
"text": arg[3], "text": arg[3],
}) })
m.Conf("flow", []string{arg[1], "conf.update_time"}, m.Time())
count := m.Confi("flow", []string{arg[1], "text.count"}) + 1 count := m.Confi("flow", []string{arg[1], "text.count"}) + 1
m.Confi("flow", []string{arg[1], "text.count"}, count) m.Confi("flow", []string{arg[1], "text.count"}, count)
m.Append("create_user", m.Option("username")) m.Append("create_user", m.Option("username"))
@ -266,7 +307,7 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
m.Add("append", "key", key) m.Add("append", "key", key)
m.Add("append", "count", kit.Len(value["list"])) m.Add("append", "count", kit.Len(value["list"]))
}) })
m.Table() m.Sort("key").Table()
return return
} }
if len(arg) == 2 { if len(arg) == 2 {
@ -380,18 +421,22 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
m.Option("selfname", data.ToUserName) m.Option("selfname", data.ToUserName)
// 创建会话 // 创建会话
if m.Option("sessid", m.Cmd("aaa.user", m.Option("username", data.FromUserName), "chat").Append("key")) == "" { m.Option("sessid", m.Cmdx("aaa.user", "session", "select"))
m.Cmd("aaa.sess", m.Option("sessid", m.Cmdx("aaa.sess", "chat", "ip", "what")), m.Option("username"), "ppid", "what") m.Option("bench", m.Cmdx("aaa.sess", "bench", "select"))
}
// 创建空间
if m.Option("bench", m.Cmd("aaa.sess", m.Option("sessid"), "bench").Append("key")) == "" {
m.Option("bench", m.Cmdx("aaa.work", m.Option("sessid"), "chat"))
}
m.Option("current_ctx", kit.Select("chat", m.Magic("bench", "current_ctx"))) m.Option("current_ctx", kit.Select("chat", m.Magic("bench", "current_ctx")))
switch data.MsgType { switch data.MsgType {
case "text": case "text":
m.Echo(web.Merge(m, map[string]interface{}{"path": "chat"}, m.Conf("chat", "site"), "sessid", m.Option("sessid")))
if !m.Cmds("aaa.auth", "username", m.Option("usernmae"), "data", "chat.default") && m.Option("username") != m.Conf("runtime", "work.name") {
if m.Cmds("ssh.work", "share", m.Option("username")) {
m.Cmd("aaa.auth", "username", m.Option("username"), "data", "nickname", "someone")
m.Cmds("aaa.auth", "username", m.Option("username"), "data", "chat.default", m.Spawn().Cmdx(".ocean", "spawn", "", m.Option("username")+"@"+m.Conf("runtime", "work.name")))
}
}
Marshal(m, "text")
return
// 执行命令 // 执行命令
cmd := strings.Split(data.Content, " ") cmd := strings.Split(data.Content, " ")
if !m.Cmds("aaa.work", m.Option("bench"), "right", data.FromUserName, "chat", cmd[0]) { if !m.Cmds("aaa.work", m.Option("bench"), "right", data.FromUserName, "chat", cmd[0]) {
@ -440,6 +485,9 @@ var Index = &ctx.Context{Name: "chat", Help: "会议中心",
m.Append("signature", hex.EncodeToString(h[:])) m.Append("signature", hex.EncodeToString(h[:]))
m.Append("appid", m.Conf("chat", "appid")) m.Append("appid", m.Conf("chat", "appid"))
m.Append("remote_ip", m.Option("remote_ip"))
m.Append("auth2.0", fmt.Sprintf(m.Conf("chat", "auth"), m.Conf("chat", "appid"),
url.QueryEscape(fmt.Sprintf("%s%s", m.Conf("chat", "site"), m.Option("index_url"))), kit.Select("snsapi_base", m.Option("scope"))))
return return
}}, }},
"share": &ctx.Command{Name: "share", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "share": &ctx.Command{Name: "share", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {

View File

@ -1,3 +1,14 @@
fieldset.Login {
font-size:28px;
}
fieldset.Login input {
font-size:18px;
height:28px;
}
fieldset.Login button {
font-size:18px;
height:28px;
}
fieldset.Ocean div.create pre:hover { fieldset.Ocean div.create pre:hover {
background-color:red; background-color:red;
} }

View File

@ -80,23 +80,77 @@ var page = Page({
{label: "username"}, {input: ["username"]}, {type: "br"}, {label: "username"}, {input: ["username"]}, {type: "br"},
{label: "password"}, {password: ["password"]}, {type: "br"}, {label: "password"}, {password: ["password"]}, {type: "br"},
{button: ["login", function(event) { {button: ["login", function(event) {
if (!ui.username.value) {
ui.username.focus()
return
}
if (!ui.password.value) {
ui.password.focus()
return
}
form.Run([ui.username.value, ui.password.value], function(msg) { form.Run([ui.username.value, ui.password.value], function(msg) {
if (msg.result && msg.result[0]) { if (msg.result && msg.result[0]) {
pane.ShowDialog(1, 1) pane.ShowDialog(1, 1)
ctx.Cookie("sessid", msg.result[0]) ctx.Cookie("sessid", msg.result[0])
page.header.State("user", ui.username.value) location.reload()
page.river.Show()
return return
} }
page.alert("用户或密码错误") page.alert("用户或密码错误")
}) })
}]} }]},
{button: ["scan", function(event) {
scan(event, function(text) {
alert(text)
})
}]},
{type: "br"},
{type: "img", data: {"src": "/chat/qrcode?text=hi"}}
]) ])
if (true||kit.isWeiXin) {
pane.Run(["weixin"], function(msg) {
// if (!ctx.Search("state")) {
// location.href = msg["auth2.0"][0]
// }
// return
kit.AppendChild(document.body, [{include: ["https://res.wx.qq.com/open/js/jweixin-1.4.0.js", function(event) {
kit.AppendChild(document.body, [{include: ["/static/librarys/weixin.js", function(event) {
wx.error(function(res){
})
wx.ready(function(){
wx.getNetworkType({success: function (res) {
}})
return
wx.getLocation({
success: function (res) {
page.footer.State("site", parseInt(res.latitude*10000)+","+parseInt(res.longitude*10000))
},
})
})
wx.config({
appId: msg.appid[0],
timestamp: msg.timestamp[0],
nonceStr: msg.nonce[0],
signature: msg.signature[0],
jsApiList: [
"scanQRCode",
"chooseImage",
"closeWindow",
"openAddress",
"getNetworkType",
"getLocation",
]
})
}]}])
}]}])
})
}
form.Run([], function(msg) { form.Run([], function(msg) {
if (msg.result && msg.result[0]) { if (msg.result && msg.result[0]) {
page.header.State("user", msg.result[0]) page.header.State("user", msg.nickname[0])
page.river.Show() page.river.Show()
page.footer.State("ip", msg.remote_ip[0])
return return
} }
pane.ShowDialog(1, 1) pane.ShowDialog(1, 1)
@ -193,7 +247,7 @@ var page = Page({
}, },
initRiver: function(page, pane, form, output) { initRiver: function(page, pane, form, output) {
pane.Show = function() { pane.Show = function() {
output.Update([], "text", ["name", "count"], "key", true) output.Update([], "text", ["name", "count"], "key", ctx.Search("river")||true, function(line, index, event) {})
} }
pane.Action = { pane.Action = {
"创建": function(event) { "创建": function(event) {
@ -213,9 +267,10 @@ var page = Page({
pane.Show = function() { pane.Show = function() {
var cmds = ["brow", river, 0] var cmds = ["brow", river, 0]
output.innerHTML = "", pane.Times(100, cmds, function(line, index, msg) { output.innerHTML = "", pane.Times(1000, cmds, function(line, index, msg) {
output.Append("", line, ["text"], "index", fun) output.Append("", line, ["text"], "index", fun)
cmds[2] = parseInt(line.index)+1 cmds[2] = parseInt(line.index)+1
page.footer.State("text", cmds[2])
}) })
} }
@ -293,7 +348,7 @@ var page = Page({
output.Update([river, storm], "plugin", ["node", "name"], "index", false, function(line, index, event, args, cbs) { output.Update([river, storm], "plugin", ["node", "name"], "index", false, function(line, index, event, args, cbs) {
event.shiftKey? page.target.Send("field", JSON.stringify({ event.shiftKey? page.target.Send("field", JSON.stringify({
name: line.name, view: line.view, init: line.init, name: line.name, help: line.help, view: line.view, init: line.init,
node: line.node, group: line.group, index: line.index, node: line.node, group: line.group, index: line.index,
inputs: line.inputs, args: args, inputs: line.inputs, args: args,
})): form.Run([river, storm, index].concat(args), function(msg) { })): form.Run([river, storm, index].concat(args), function(msg) {
@ -343,7 +398,7 @@ var page = Page({
}, },
} }
pane.Show = function() { pane.Show = function() {
output.Update([river], "text", ["key", "count"], "key", true) output.Update([river], "text", ["key", "count"], "key", ctx.Search("storm")||true)
} }
pane.Next = function() { pane.Next = function() {
var next = output.querySelector("div.item.select").nextSibling var next = output.querySelector("div.item.select").nextSibling
@ -490,13 +545,17 @@ var page = Page({
output.Select(index), pane.which.set(line[which]) output.Select(index), pane.which.set(line[which])
typeof cb == "function" && cb(line, index, event, cmds, cbs) typeof cb == "function" && cb(line, index, event, cmds, cbs)
}) })
list.push(ui.last), pane.scrollBy(0, pane.scrollHeight) list.push(ui.last), pane.scrollBy(0, pane.scrollHeight+100)
return ui return ui
} }
output.Update = function(cmds, type, key, which, first, cb) { output.Update = function(cmds, type, key, which, first, cb) {
output.Clear(), form.Runs(cmds, function(line, index, msg) { output.Clear(), form.Runs(cmds, function(line, index, msg) {
var ui = output.Append(type, line, key, which, cb) var ui = output.Append(type, line, key, which, cb)
if (typeof first == "string") {
(line.key == first || line.name == first) && ui.first.click()
} else {
first && index == 0 && ui.first.click() first && index == 0 && ui.first.click()
}
}) })
} }
@ -519,9 +578,27 @@ var page = Page({
}) })
page.onlayout(null, page.conf.layout) page.onlayout(null, page.conf.layout)
page.footer.Order({"action": "", "text": ""}, ["action", "text"]) kit.isMobile && page.action.Action["最宽"]()
page.header.Order({"user": ""}, ["user"], function(event, item, value) {
page.confirm("logout?") && page.login.Exit() page.footer.Order({"text": "", "ip": ""}, ["ip", "text"])
kit.isMobile && page.footer.Order({"text": "", "site": "", "ip": ""}, ["ip", "text", "site"])
page.header.Order({"user": "", "logout": "logout"}, ["logout", "user"], function(event, item, value) {
switch (item) {
case "title":
ctx.Search({"river": page.river.which.get(), "storm": page.storm.which.get()})
break
case "user":
var name = page.prompt("new name")
name && page.login.Run(["rename", name], function(msg) {
page.header.State("user", name)
}) })
break
case "logout":
page.confirm("logout?") && page.login.Exit()
break
default:
}
})
}, },
}) })

View File

@ -55,7 +55,9 @@ function Page(page) {
var text = line var text = line
switch (type) { switch (type) {
case "icon": case "icon":
result = [{view: ["item", "div"], list: [{type: "img", data: {src: line[key[0]]}}, {}]}] result = [{view: ["item", "div"], list: [{img: [line[key[0]], function(event) {
event.target.scrollIntoView()
}]}]}]
break break
case "text": case "text":
@ -81,29 +83,32 @@ function Page(page) {
case "plugin": case "plugin":
var id = "plugin"+page.ID() var id = "plugin"+page.ID()
result = [{view: [text.view, "fieldset"], data: {id: id}, list: [ result = [{name: "field", view: [text.view, "fieldset"], data: {id: id}, list: [
{text: [text.name, "legend"]}, {text: [text.name+"("+text.help+")", "legend"]},
{name: "option", view: ["option", "form"], data: {Run: cb}, list: [{type: "input", style: {"display": "none"}}]}, {name: "option", view: ["option", "form"], data: {Run: cb}, list: [{type: "input", style: {"display": "none"}}]},
{name: "output", view: ["output", "div"]}, {name: "output", view: ["output", "div"]},
{script: "Plugin("+id+","+text.inputs+","+"["+(text.args||"")+"]"+","+(text.init||"")+")"}, {script: "Plugin("+id+","+text.inputs+","+"[\""+(text.args||[]).join("\",\"")+"\"]"+","+(text.init||"")+")"},
]}] ]}]
break break
} }
if (parent.DisplayUser) { if (parent.DisplayUser) {
ui = kit.AppendChild(parent, [{view: ["item"], list:[ ui = kit.AppendChild(parent, [{view: ["item"], list:[
{view: ["user", "div", line.create_user]}, {view: ["user", "div", line.create_nick]},
{view: ["text"], list:result} {view: ["text"], list:result}
]}]) ]}])
} else { } else {
ui = kit.AppendChild(parent, [{view: ["item"], list:result}]) ui = kit.AppendChild(parent, [{view: ["item"], list:result}])
} }
ui.last.Meta = line ui.field && (ui.field.Meta = text)
return ui return ui
}, },
alert: function(text) { alert: function(text) {
alert(text) alert(text)
}, },
prompt: function(text) {
return prompt(text)
},
confirm: function(text) { confirm: function(text) {
return confirm(text) return confirm(text)
}, },
@ -225,7 +230,9 @@ function Page(page) {
} }
pane.Show = function() { pane.Show = function() {
output.innerHTML = "", kit.AppendChild(output, [ output.innerHTML = "", kit.AppendChild(output, [
{"view": ["title", "div", "shycontext"]}, {"view": ["title", "div", "shycontext"], click: function(event) {
cb(event, "title", "shycontext")
}},
{"view": ["state"], list: list.map(function(item) {return {text: [state[item], "div"], click: function(event) { {"view": ["state"], list: list.map(function(item) {return {text: [state[item], "div"], click: function(event) {
cb(event, item, state[item]) cb(event, item, state[item])
}}})}, }}})},
@ -342,7 +349,7 @@ function Page(page) {
}) })
timer = setTimeout(loop, time) timer = setTimeout(loop, time)
} }
timer = setTimeout(loop, time) time && (timer = setTimeout(loop, time))
} }
form.onsubmit = function(event) { form.onsubmit = function(event) {
event.preventDefault() event.preventDefault()
@ -377,7 +384,7 @@ function Plugin(field, inputs, args, plugin) {
var option = field.querySelector("form.option") var option = field.querySelector("form.option")
var output = field.querySelector("div.output") var output = field.querySelector("div.output")
function run(event) { option.Runs = function(event) {
var args = [] var args = []
option.querySelectorAll("input").forEach(function(item, index){ option.querySelectorAll("input").forEach(function(item, index){
item.type == "text" && args.push(item.value) item.type == "text" && args.push(item.value)
@ -390,14 +397,14 @@ function Plugin(field, inputs, args, plugin) {
})(msg) })(msg)
}) })
} }
field.onclick = function(event) { field.onclick = function(event) {
page.plugin = field page.plugin = field
page.footer.State("action", field.id)
} }
var ui = kit.AppendChild(option, inputs.map(function(item, index, inputs) { var ui = kit.AppendChild(option, inputs.map(function(item, index, inputs) {
item.type == "button"? item.onclick = function(event) { item.type == "button"? item.onclick = function(event) {
plugin[item.click]? plugin[item.click](event, item, option, field): run(event) plugin[item.click]? plugin[item.click](event, item, option, field): option.Runs(event)
}: (item.onkeyup = function(event) { }: (item.onkeyup = function(event) {
page.oninput(event, function(event) { page.oninput(event, function(event) {
@ -430,7 +437,7 @@ function Plugin(field, inputs, args, plugin) {
} }
return true return true
}) })
event.key == "Enter" && (index == inputs.length-1? run(event): event.target.parentNode.nextSibling.childNodes[1].focus()) event.key == "Enter" && (index == inputs.length-1? option.Runs(event): event.target.parentNode.nextSibling.childNodes[1].focus())
}, field.Select = function() { }, field.Select = function() {
ui.last.childNodes[1].focus() ui.last.childNodes[1].focus()
}) })
@ -442,6 +449,6 @@ function Plugin(field, inputs, args, plugin) {
show: function() {}, show: function() {},
init: function() {}, init: function() {},
} }
plugin.init(page, page.action, field, option, output) plugin.init(page, page.action, field, option, output, ui)
page[field.id] = plugin page[field.id] = plugin
} }

View File

@ -0,0 +1,9 @@
{
init: function(page, pane, plug, form, output, ui) {
form.Runs = function(event) {
var url = "/chat/?componet_group=index&componet_name=login&cmds=qrcode&cmds="+ui.content.value
output.innerHTML = "", kit.AppendChild(output, [{img: [url]}])
event.ctrlKey? page.target.Send("icon", url): form.Run(event, [ui.content.value])
}
},
}

View File

@ -1,5 +1,8 @@
kit = toolkit = { kit = toolkit = {
isMobile: navigator.userAgent.indexOf("Mobile") > -1, isMobile: navigator.userAgent.indexOf("Mobile") > -1,
isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1,
isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1,
isIPhone: navigator.userAgent.indexOf("iPhone") > -1,
isSpace: function(c) { isSpace: function(c) {
return c == " " || c == "Enter" return c == " " || c == "Enter"
}, },
@ -156,19 +159,16 @@ kit = toolkit = {
return elm return elm
} }
// name // 基本属性: name value inner style
// value
// inner
// style
// dataset
// click
// //
// button input label // dataset click
// 树状结构: tree, fork, leaf // button input label img
// 普通视图: view, text, code //
// 树状结构: tree fork leaf
// 普通视图: view text code
// 加载文件: include require styles // 加载文件: include require styles
// //
// 基本结构: type, data, list // 基本结构: type data list
var kit = this var kit = this
@ -229,6 +229,11 @@ kit = toolkit = {
child.type = "label" child.type = "label"
child.data["innerText"] = child.label child.data["innerText"] = child.label
} else if (child.img) {
child.type = "img"
child.data["src"] = child.img[0]
child.img.length > 1 && (child.data["onload"] = child.img[1])
} else if (child.tree) { } else if (child.tree) {
child.type = "ul" child.type = "ul"
child.list = child.tree child.list = child.tree

View File

@ -1,11 +1,10 @@
function scan(event) { function scan(event, cb) {
alert("begin scan")
wx.scanQRCode({ wx.scanQRCode({
needResult: 0, needResult: 1,
scanType: ["qrCode", "barCode"], scanType: ["qrCode", "barCode"],
desc: "what", desc: "what",
success: function(res) { success: function(res) {
alert(res.resultStr) cb(res.resultStr)
}, },
fail: function(res) { fail: function(res) {
alert(res.errMsg) alert(res.errMsg)