mirror of
https://shylinux.com/x/ContextOS
synced 2025-04-26 01:04:06 +08:00
add flow
This commit is contained in:
parent
dbf93004d5
commit
5d28777888
@ -3203,7 +3203,12 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
||||
switch value := v.(type) {
|
||||
case map[string]interface{}:
|
||||
for k, v := range value {
|
||||
m.Add("append", k, fmt.Sprintf("%v", v))
|
||||
switch value := v.(type) {
|
||||
case float64:
|
||||
m.Add("append", k, fmt.Sprintf("%d", int(value)))
|
||||
default:
|
||||
m.Add("append", k, fmt.Sprintf("%v", value))
|
||||
}
|
||||
}
|
||||
default:
|
||||
m.Add("append", "index", i)
|
||||
@ -3231,6 +3236,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
||||
msg := m.Spawn()
|
||||
m.Set("result")
|
||||
|
||||
// 筛选与解析
|
||||
nrow := len(m.Meta[m.Meta["append"][0]])
|
||||
for i := 0; i < nrow; i++ {
|
||||
if len(arg) == 0 || strings.Contains(m.Meta[arg[0]][i], arg[1]) {
|
||||
@ -3259,10 +3265,9 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
||||
}
|
||||
}
|
||||
|
||||
// 聚合
|
||||
if m.Set("append"); m.Has("group") {
|
||||
|
||||
group := m.Option("group")
|
||||
|
||||
nrow := len(msg.Meta[msg.Meta["append"][0]])
|
||||
|
||||
for i := 0; i < nrow; i++ {
|
||||
@ -3313,10 +3318,12 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
||||
m.Copy(msg, "append")
|
||||
}
|
||||
|
||||
// 排序
|
||||
if m.Has("order") {
|
||||
m.Sort(m.Meta["order"][1], m.Option("order"))
|
||||
}
|
||||
|
||||
// 分页
|
||||
offset := 0
|
||||
limit := m.Confi("page_limit")
|
||||
if m.Has("limit") {
|
||||
@ -3336,12 +3343,24 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
||||
m.Meta[k] = m.Meta[k][offset : offset+limit]
|
||||
}
|
||||
|
||||
// 值转换
|
||||
for i := 0; i < len(m.Meta["trans_map"]); i += 3 {
|
||||
trans := m.Meta["trans_map"][i:]
|
||||
for j := 0; j < len(m.Meta[trans[0]]); j++ {
|
||||
if m.Meta[trans[0]][j] == trans[1] {
|
||||
m.Meta[trans[0]][j] = trans[2]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 选择列
|
||||
if m.Option("fields") != "" {
|
||||
msg = m.Spawn()
|
||||
msg.Copy(m, "append", strings.Split(m.Option("fields"), " ")...)
|
||||
m.Set("append").Copy(msg, "append")
|
||||
}
|
||||
|
||||
// 格式化
|
||||
for i := 0; i < len(m.Meta["format"])-1; i += 2 {
|
||||
format := m.Meta["format"]
|
||||
for j, v := range m.Meta[format[i]] {
|
||||
@ -3349,6 +3368,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
||||
}
|
||||
}
|
||||
|
||||
// 变换列
|
||||
if m.Has("vertical") {
|
||||
msg := m.Spawn()
|
||||
nrow := len(m.Meta[m.Meta["append"][0]])
|
||||
@ -3366,6 +3386,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
||||
m.Set("append").Copy(msg, "append")
|
||||
}
|
||||
|
||||
// 取单值
|
||||
if len(arg) > 2 {
|
||||
if len(m.Meta[arg[2]]) > 0 {
|
||||
m.Echo(m.Meta[arg[2]][0])
|
||||
|
@ -195,7 +195,7 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
||||
}},
|
||||
"show": &ctx.Command{Name: "show table fields...",
|
||||
Help: "查询数据库, table: 表名, fields: 字段, where: 查询条件, group: 聚合字段, order: 排序字段",
|
||||
Form: map[string]int{"where": 1, "group": 1, "desc": 0, "order": 1, "limit": 1, "offset": 1, "other": -1,
|
||||
Form: map[string]int{"eq": 2, "where": 1, "group": 1, "desc": 0, "order": 1, "limit": 1, "offset": 1, "other": -1,
|
||||
"extra_field": 2, "extra_fields": 1, "extra_format": 1, "trans_field": 1, "trans_map": 2},
|
||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
if _, ok := m.Target().Server.(*MDB); m.Assert(ok) {
|
||||
@ -221,6 +221,19 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
||||
}
|
||||
field := strings.Join(fields, ",")
|
||||
|
||||
eq := []string{}
|
||||
for i := 0; i < len(m.Meta["eq"]); i += 2 {
|
||||
eq = append(eq, fmt.Sprintf(" %s='%s' ", m.Meta["eq"][i], m.Meta["eq"][i+1]))
|
||||
}
|
||||
|
||||
if len(eq) > 0 {
|
||||
if m.Options("where") {
|
||||
m.Option("where", m.Option("where")+" and "+strings.Join(eq, "and"))
|
||||
} else {
|
||||
m.Option("where", strings.Join(eq, "and"))
|
||||
}
|
||||
}
|
||||
|
||||
where := m.Confx("where", m.Option("where"), "where %s")
|
||||
group := m.Confx("group", m.Option("group"), "group by %s")
|
||||
order := m.Confx("order", m.Option("order"), "order by %s")
|
||||
@ -292,6 +305,10 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
||||
}
|
||||
}
|
||||
|
||||
ncol := len(msg.Meta["append"])
|
||||
nrow := len(msg.Meta[msg.Meta["append"][0]])
|
||||
|
||||
m.Echo("data: %dx%d ", nrow, ncol)
|
||||
m.Color(31, table).Echo(" %s %s %s %s %s %v\n", where, group, order, limit, offset, m.Meta["other"])
|
||||
|
||||
m.Table(func(maps map[string]string, lists []string, line int) bool {
|
||||
|
@ -5,7 +5,7 @@ import (
|
||||
"contexts/ctx"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/PuerkitoBio/goquery"
|
||||
// "github.com/PuerkitoBio/goquery"
|
||||
"html/template"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
@ -35,16 +35,7 @@ type WEB struct {
|
||||
*ctx.Context
|
||||
}
|
||||
|
||||
func proxy(m *ctx.Message, url string) string {
|
||||
if strings.HasPrefix(url, "//") {
|
||||
return "proxy/https:" + url
|
||||
}
|
||||
|
||||
return "proxy/" + url
|
||||
}
|
||||
func Merge(m *ctx.Message, uri string, arg ...string) string {
|
||||
uri = strings.Replace(uri, ":/", "://", -1)
|
||||
uri = strings.Replace(uri, ":///", "://", -1)
|
||||
func (web *WEB) Merge(m *ctx.Message, uri string, arg ...string) string {
|
||||
add, e := url.Parse(uri)
|
||||
m.Assert(e)
|
||||
adds := []string{m.Confx("protocol", add.Scheme, "%s://"), m.Confx("hostname", add.Host)}
|
||||
@ -86,7 +77,6 @@ func Merge(m *ctx.Message, uri string, arg ...string) string {
|
||||
|
||||
return strings.Join(adds, "")
|
||||
}
|
||||
|
||||
func (web *WEB) HandleCmd(m *ctx.Message, key string, cmd *ctx.Command) {
|
||||
web.HandleFunc(key, func(w http.ResponseWriter, r *http.Request) {
|
||||
m.TryCatch(m.Spawn(), true, func(msg *ctx.Message) {
|
||||
@ -158,6 +148,8 @@ func (web *WEB) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
if index {
|
||||
m.Log("info", "").Log("info", "%v %s %s", r.RemoteAddr, r.Method, r.URL)
|
||||
wd, _ := os.Getwd()
|
||||
m.Log("info", "wd: %s", wd)
|
||||
}
|
||||
if index && m.Confs("logheaders") {
|
||||
for k, v := range r.Header {
|
||||
@ -208,7 +200,6 @@ func (web *WEB) Start(m *ctx.Message, arg ...string) bool {
|
||||
m.Cap("directory", m.Confx("directory", arg, 0))
|
||||
|
||||
render := m.Target().Commands["/render"]
|
||||
proxy := m.Target().Commands["/proxy/"]
|
||||
|
||||
m.Travel(func(m *ctx.Message, i int) bool {
|
||||
if h, ok := m.Target().Server.(MUX); ok && m.Cap("register") == "no" {
|
||||
@ -223,9 +214,6 @@ func (web *WEB) Start(m *ctx.Message, arg ...string) bool {
|
||||
if m.Target().Commands["/render"] == nil {
|
||||
m.Target().Commands["/render"] = render
|
||||
}
|
||||
if m.Target().Commands["/proxy/"] == nil {
|
||||
m.Target().Commands["/proxy/"] = proxy
|
||||
}
|
||||
|
||||
msg := m.Target().Message()
|
||||
for k, x := range m.Target().Commands {
|
||||
@ -373,7 +361,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
}
|
||||
|
||||
method := m.Confx("method")
|
||||
uri := Merge(m, arg[0], arg[1:]...)
|
||||
uri := web.Merge(m, arg[0], arg[1:]...)
|
||||
body, _ := m.Optionv("body").(io.Reader)
|
||||
|
||||
if method == "POST" && body == nil {
|
||||
@ -414,21 +402,20 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
return
|
||||
}
|
||||
m.Assert(e)
|
||||
for k, v := range res.Header {
|
||||
m.Log("info", "%s: %v", k, v)
|
||||
}
|
||||
|
||||
for _, v := range res.Cookies() {
|
||||
m.Confv("cookie", v.Name, v)
|
||||
m.Log("info", "set-cookie %s: %v", v.Name, v.Value)
|
||||
}
|
||||
|
||||
buf, e := ioutil.ReadAll(res.Body)
|
||||
m.Assert(e)
|
||||
|
||||
var result interface{}
|
||||
ct := res.Header.Get("Content-Type")
|
||||
|
||||
switch {
|
||||
case strings.HasPrefix(ct, "application/json"):
|
||||
json.NewDecoder(res.Body).Decode(&result)
|
||||
json.Unmarshal(buf, &result)
|
||||
if m.Has("parse") {
|
||||
msg := m.Spawn()
|
||||
msg.Put("option", "response", result)
|
||||
@ -437,56 +424,9 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
m.Copy(msg, "result")
|
||||
return
|
||||
}
|
||||
case strings.HasPrefix(ct, "text/html"):
|
||||
html, e := goquery.NewDocumentFromReader(res.Body)
|
||||
m.Assert(e)
|
||||
query := html.Find("html")
|
||||
if m.Has("parse") {
|
||||
query = query.Find(m.Option("parse"))
|
||||
}
|
||||
|
||||
query.Each(func(n int, s *goquery.Selection) {
|
||||
s.Find("a").Each(func(n int, s *goquery.Selection) {
|
||||
if attr, ok := s.Attr("href"); ok {
|
||||
s.SetAttr("href", proxy(m, attr))
|
||||
}
|
||||
})
|
||||
s.Find("img").Each(func(n int, s *goquery.Selection) {
|
||||
if attr, ok := s.Attr("src"); ok {
|
||||
s.SetAttr("src", proxy(m, attr))
|
||||
}
|
||||
if attr, ok := s.Attr("r-lazyload"); ok {
|
||||
s.SetAttr("src", proxy(m, attr))
|
||||
}
|
||||
})
|
||||
s.Find("script").Each(func(n int, s *goquery.Selection) {
|
||||
if attr, ok := s.Attr("src"); ok {
|
||||
s.SetAttr("src", proxy(m, attr))
|
||||
}
|
||||
})
|
||||
if html, e := s.Html(); e == nil {
|
||||
m.Add("append", "html", html)
|
||||
}
|
||||
})
|
||||
default:
|
||||
if w, ok := m.Optionv("response").(http.ResponseWriter); ok {
|
||||
header := w.Header()
|
||||
for k, v := range res.Header {
|
||||
header.Add(k, v[0])
|
||||
}
|
||||
io.Copy(w, res.Body)
|
||||
return
|
||||
} else {
|
||||
buf, e := ioutil.ReadAll(res.Body)
|
||||
m.Assert(e)
|
||||
|
||||
m.Append("Content-Type", ct)
|
||||
result = string(buf)
|
||||
}
|
||||
|
||||
}
|
||||
m.Target().Configs[m.Confx("body_response")] = &ctx.Config{Value: result}
|
||||
m.Echo("%v", result)
|
||||
m.Echo(string(buf))
|
||||
}
|
||||
}},
|
||||
"post": &ctx.Command{Name: "post [file fieldname filename]", Help: "post请求",
|
||||
@ -501,23 +441,23 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
buf := &bytes.Buffer{}
|
||||
writer := multipart.NewWriter(buf)
|
||||
writer.SetBoundary(fmt.Sprintf("\r\n--%s--\r\n", writer.Boundary()))
|
||||
|
||||
for i := 1; i < len(arg)-1; i += 2 {
|
||||
value := arg[i+1]
|
||||
if len(arg[i+1]) > 1 {
|
||||
switch arg[i+1][0] {
|
||||
case '$':
|
||||
value = m.Cap(arg[i+1][1:])
|
||||
case '@':
|
||||
value = m.Conf(arg[i+1][1:])
|
||||
}
|
||||
}
|
||||
writer.WriteField(arg[i], value)
|
||||
}
|
||||
part, e := writer.CreateFormFile(m.Option("file"), filepath.Base(m.Meta["file"][1]))
|
||||
m.Assert(e)
|
||||
io.Copy(part, file)
|
||||
|
||||
// for i := 0; i < len(arg)-1; i += 2 {
|
||||
// value := arg[i+1]
|
||||
// if len(arg[i+1]) > 1 {
|
||||
// switch arg[i+1][0] {
|
||||
// case '$':
|
||||
// value = m.Cap(arg[i+1][1:])
|
||||
// case '@':
|
||||
// value = m.Conf(arg[i+1][1:])
|
||||
// }
|
||||
// }
|
||||
// writer.WriteField(arg[i], value)
|
||||
// }
|
||||
|
||||
writer.Close()
|
||||
msg.Optionv("body", buf)
|
||||
msg.Option("content_type", writer.FormDataContentType())
|
||||
@ -563,39 +503,6 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
m.Copy(msg, "result").Copy(msg, "append")
|
||||
}},
|
||||
"brow": &ctx.Command{Name: "brow url", Help: "浏览网页", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
if _, ok := m.Optionv("request").(*http.Request); ok {
|
||||
action := false
|
||||
m.Travel(func(m *ctx.Message, i int) bool {
|
||||
for key, v := range m.Target().Commands {
|
||||
method, url := "", ""
|
||||
if strings.HasPrefix(v.Name, "get ") {
|
||||
method, url = "get", strings.TrimPrefix(v.Name, "get ")
|
||||
} else if strings.HasPrefix(v.Name, "post ") {
|
||||
method, url = "post", strings.TrimPrefix(v.Name, "post ")
|
||||
} else {
|
||||
continue
|
||||
}
|
||||
|
||||
if len(arg) == 0 {
|
||||
m.Add("append", "method", method)
|
||||
m.Add("append", "request", url)
|
||||
} else if strings.HasPrefix(url, arg[0]) {
|
||||
msg := m.Spawn().Cmd(key, arg[1:])
|
||||
m.Copy(msg, "append").Copy(msg, "result")
|
||||
action = true
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
||||
if !action {
|
||||
msg := m.Spawn().Cmd("get", arg)
|
||||
m.Copy(msg, "append").Copy(msg, "result")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
url := m.Confx("brow_home", arg, 0)
|
||||
switch runtime.GOOS {
|
||||
case "windows":
|
||||
@ -933,11 +840,6 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
}
|
||||
}
|
||||
}},
|
||||
"/proxy/": &ctx.Command{Name: "/proxy/", Help: "服务代理", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||
m.Log("fuck", "what %v", key)
|
||||
msg := m.Spawn().Cmd("get", strings.TrimPrefix(key, "/proxy/"), arg)
|
||||
m.Copy(msg, "append").Copy(msg, "result")
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,7 @@ var code = {
|
||||
ncommand: 1,
|
||||
show_result: true,
|
||||
show_height: "30px",
|
||||
hide_height: "14px",
|
||||
scroll_x: 50,
|
||||
scroll_y: 50,
|
||||
}
|
||||
@ -45,7 +46,7 @@ function add_sort(append, field, cb) {
|
||||
sort_table(append, i, dataset["sort_asc"] == "1")
|
||||
} else if (target.tagName == "TD") {
|
||||
var tr = target.parentElement.parentElement.querySelector("tr")
|
||||
if (tr.childNodes[i].innerText == field) {
|
||||
if (tr.childNodes[i].innerText.startsWith(field)) {
|
||||
typeof cb == "function" && cb(event)
|
||||
}
|
||||
copy_to_clipboard(target.innerText)
|
||||
@ -107,8 +108,8 @@ function send_command(form, cb) {
|
||||
append.innerHTML = ""
|
||||
if (msg.append) {
|
||||
var tr = append_child(append, "tr")
|
||||
for (var i in msg.append) {
|
||||
append_child(tr, "th", msg.append[i])
|
||||
for (var i = 0; i < msg.append.length; i++) {
|
||||
append_child(tr, "th", msg.append[i]+"("+(i+1)+")")
|
||||
}
|
||||
|
||||
var ncol = msg.append.length
|
||||
@ -351,6 +352,25 @@ function onaction(event, action) {
|
||||
var result = command.querySelector("code.result pre")
|
||||
// yt
|
||||
switch (event.key) {
|
||||
case "1":
|
||||
case "2":
|
||||
case "3":
|
||||
case "4":
|
||||
case "5":
|
||||
case "6":
|
||||
case "7":
|
||||
case "8":
|
||||
case "9":
|
||||
var item = document.querySelectorAll("table.append.command"+(parseInt(option.dataset.componet_name_order)-1)+" td")
|
||||
if (event.shiftKey) {
|
||||
var item = document.querySelectorAll("table.append.command1 td")
|
||||
}
|
||||
target.value += item[parseInt(event.key)-1].innerText
|
||||
break
|
||||
case "0":
|
||||
var pre_pre = document.querySelector("code.result.command"+(parseInt(option.dataset.componet_name_order)-1)+" pre")
|
||||
target.value += pre_pre.innerText
|
||||
break
|
||||
case "a":
|
||||
case "e":
|
||||
case "b":
|
||||
@ -418,7 +438,7 @@ function onaction(event, action) {
|
||||
result.style.height = result.style.height? "": code.show_height
|
||||
break
|
||||
case "x":
|
||||
result.style.height = result.style.height? "": "1px"
|
||||
result.style.height = result.style.height? "": code.hide_height
|
||||
break
|
||||
case "s":
|
||||
copy_to_clipboard(result.innerText)
|
||||
|
Loading…
x
Reference in New Issue
Block a user