diff --git a/src/contexts/ctx/ctx.go b/src/contexts/ctx/ctx.go index 05c6bbd2..0107cb65 100644 --- a/src/contexts/ctx/ctx.go +++ b/src/contexts/ctx/ctx.go @@ -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]) diff --git a/src/contexts/mdb/mdb.go b/src/contexts/mdb/mdb.go index 2df5c687..b084d556 100644 --- a/src/contexts/mdb/mdb.go +++ b/src/contexts/mdb/mdb.go @@ -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 { diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index 5a090199..fce5e77a 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -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") - }}, }, } diff --git a/usr/librarys/code.js b/usr/librarys/code.js index 15656319..85b552c7 100644 --- a/usr/librarys/code.js +++ b/usr/librarys/code.js @@ -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)