diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 66fe11ec..165d3bb0 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -71,6 +71,7 @@ const ( DIR = "dir" ENV = "env" CMD = "cmd" + API = "api" ARG = "arg" RUN = "run" RES = "res" @@ -80,6 +81,7 @@ const ( ERROR = "error" BUILD = "build" SPAWN = "spawn" + CHECK = "check" BENCH = "bench" PPROF = "pprof" diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index a43ec894..8aa19353 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -352,7 +352,7 @@ func _zone_import(m *ice.Message, prefix, chain, file string) { count := 0 list := map[string]string{} - zkey := m.Option(FIELDS) + zkey := kit.Select(head[0], m.Option(FIELDS)) for { line, e := r.Read() diff --git a/base/web/render.go b/base/web/render.go index 31cb6102..390780c9 100644 --- a/base/web/render.go +++ b/base/web/render.go @@ -59,7 +59,8 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) { default: for _, k := range []string{ "_option", "_handle", "_output", "", - "sessid", "domain", "river", "storm", "cmds", "fields", + "cmds", "fields", "sessid", "domain", + "river", "storm", } { msg.Set(k) } diff --git a/base/web/spide.go b/base/web/spide.go index 2fccf440..0750090a 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -128,6 +128,9 @@ func _spide_body(m *ice.Message, method string, arg ...string) (io.Reader, map[s body, head[ContentType] = _spide_part(m, arg...) case SPIDE_DATA: + if len(arg) == 1 { + arg = append(arg, "{}") + } body, arg = bytes.NewBufferString(arg[1]), arg[2:] case SPIDE_FILE: diff --git a/conf.go b/conf.go index 0d5275d8..2fde5935 100644 --- a/conf.go +++ b/conf.go @@ -91,6 +91,7 @@ const ( // MSG MSG_PROCESS = "_process" MSG_CMDS = "cmds" + MSG_FIELDS = "fields" MSG_SESSID = "sessid" MSG_DOMAIN = "domain" MSG_OPTS = "_option" diff --git a/core/chat/study.go b/core/chat/study.go index af58f43b..5c655136 100644 --- a/core/chat/study.go +++ b/core/chat/study.go @@ -53,7 +53,7 @@ func init() { m.Cmdy(mdb.INPUTS, m.Prefix(TARGET), "", mdb.HASH, arg) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option("fields", "time,hash,type,name,text") + m.Fields(len(arg) == 0, "time,hash,type,name,text") m.Cmdy(mdb.SELECT, m.Prefix(TARGET), "", mdb.HASH, "", kit.Select(kit.MDB_FOREACH, arg, 0)) if len(arg) == 0 { m.PushAction("备课", "学习", "测试", "删除") diff --git a/meta.go b/meta.go index 34109d44..b9bfa4fc 100644 --- a/meta.go +++ b/meta.go @@ -114,7 +114,7 @@ func (m *Message) Push(key string, value interface{}, arg ...interface{}) *Messa } default: - if m.Option("fields") == "detail" || (len(m.meta[MSG_APPEND]) == 2 && m.meta[MSG_APPEND][0] == kit.MDB_KEY && m.meta[MSG_APPEND][1] == kit.MDB_VALUE) { + if m.Option(MSG_FIELDS) == "detail" || (len(m.meta[MSG_APPEND]) == 2 && m.meta[MSG_APPEND][0] == kit.MDB_KEY && m.meta[MSG_APPEND][1] == kit.MDB_VALUE) { if key != kit.MDB_KEY || key != kit.MDB_VALUE { m.Add(MSG_APPEND, kit.MDB_KEY, key) m.Add(MSG_APPEND, kit.MDB_VALUE, kit.Format(value)) @@ -184,6 +184,9 @@ func (m *Message) Copy(msg *Message, arg ...string) *Message { return m } func (m *Message) Sort(key string, arg ...string) *Message { + if m.Option(MSG_FIELDS) == "detail" { + return m + } // 排序方法 cmp := "str" if len(arg) > 0 && arg[0] != "" { @@ -465,7 +468,7 @@ func (m *Message) Optionv(key string, arg ...interface{}) interface{} { default: m.data[key] = str } - if key == "fields" { + if key == MSG_FIELDS { for _, k := range kit.Split(strings.Join(m.meta[key], ",")) { delete(m.meta, k) } diff --git a/misc.go b/misc.go index 806c32b3..b8d9fb74 100644 --- a/misc.go +++ b/misc.go @@ -15,6 +15,9 @@ import ( func (m *Message) Prefix(arg ...string) string { return kit.Keys(m.Cap(CTX_FOLLOW), arg) } +func (m *Message) PrefixKey(arg ...string) string { + return kit.Keys(m.Cap(CTX_FOLLOW), m._key, arg) +} func (m *Message) Save(arg ...string) *Message { if len(arg) == 0 { for k := range m.target.Configs { @@ -85,7 +88,7 @@ func (m *Message) PushPodCmd(cmd string, arg ...string) { } func (m *Message) PushSearch(args ...interface{}) { data := kit.Dict(args...) - for _, k := range kit.Split(m.Option("fields")) { + for _, k := range kit.Split(m.Option(MSG_FIELDS)) { switch k { case kit.SSH_POD: // m.Push(k, kit.Select(m.Option(MSG_USERPOD), data[kit.SSH_POD])) @@ -102,7 +105,7 @@ func (m *Message) PushSearch(args ...interface{}) { } func (m *Message) PushSearchWeb(cmd string, name string) { msg := m.Spawn() - msg.Option("fields", "type,name,text") + msg.Option(MSG_FIELDS, "type,name,text") msg.Cmd("mdb.select", m.Prefix(cmd), "", kit.MDB_HASH).Table(func(index int, value map[string]string, head []string) { text := kit.MergeURL(value[kit.MDB_TEXT], value[kit.MDB_NAME], name) if value[kit.MDB_NAME] == "" { @@ -264,7 +267,7 @@ type Option struct { Value interface{} } -func OptionFields(str string) Option { return Option{"fields", str} } +func OptionFields(str string) Option { return Option{MSG_FIELDS, str} } func OptionHash(str string) Option { return Option{kit.MDB_HASH, str} } type Sort struct { @@ -302,7 +305,7 @@ func (m *Message) GoToast(title string, cb func(toast func(string, int, int))) { } func (m *Message) Fields(condition bool, fields string) string { - return m.Option("fields", kit.Select(kit.Select("detail", fields, condition), m.Option("fields"))) + return m.Option(MSG_FIELDS, kit.Select(kit.Select("detail", fields, condition), m.Option(MSG_FIELDS))) } func (m *Message) Action(arg ...string) { m.Option(MSG_ACTION, kit.Format(arg)) @@ -362,7 +365,7 @@ func (m *Message) Upload(dir string) { } } -func (m *Message) OptionFields(str string) { m.Option("fields", str) } +func (m *Message) OptionFields(str string) { m.Option(MSG_FIELDS, str) } func (m *Message) OptionLoad(file string) *Message { if f, e := os.Open(file); e == nil { defer f.Close() diff --git a/type.go b/type.go index 88e08bb3..f54a7f4f 100644 --- a/type.go +++ b/type.go @@ -111,7 +111,7 @@ func (c *Context) _hand(m *Message, cmd *Command, key string, k string, h *Actio return m } func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Message { - if m._cmd = cmd; cmd == nil { + if m._key, m._cmd = key, cmd; cmd == nil { return m } @@ -182,7 +182,7 @@ func (c *Context) Merge(s *Context) *Context { c.Commands[k] = v if v.List == nil { - v.List = c._split(v.Name) + v.List = c._split(k, v, v.Name) } if v.Meta == nil { v.Meta = kit.Dict() @@ -203,7 +203,7 @@ func (c *Context) Merge(s *Context) *Context { continue } if a.List == nil { - a.List = c._split(a.Name) + a.List = c._split(k, nil, a.Name) } if len(a.List) > 0 { v.Meta[k] = a.List @@ -226,17 +226,17 @@ func (c *Context) Merge(s *Context) *Context { } return c } -func (c *Context) _split(name string) []interface{} { +func (c *Context) _split(key string, cmd *Command, name string) []interface{} { button, list := false, []interface{}{} for _, v := range kit.Split(kit.Select("key", name), " ", " ")[1:] { - if v == "page" { + switch v { + case "page": list = append(list, kit.List(kit.MDB_INPUT, "text", "name", "limit")...) list = append(list, kit.List(kit.MDB_INPUT, "text", "name", "offend")...) list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "prev")...) list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "next")...) continue - } - if v == "auto" { + case "auto": list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "查看", "value", "auto")...) list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "返回")...) button = true @@ -342,6 +342,7 @@ type Message struct { time time.Time code int Hand bool + wait chan bool meta map[string][]string data map[string]interface{} @@ -352,13 +353,13 @@ type Message struct { source *Context target *Context _cmd *Command + _key string - cb func(*Message) *Message - W http.ResponseWriter - R *http.Request - O io.Writer - I io.Reader - wait chan bool + cb func(*Message) *Message + W http.ResponseWriter + R *http.Request + O io.Writer + I io.Reader } func (m *Message) Time(args ...interface{}) string { @@ -684,6 +685,11 @@ func (m *Message) cmd(arg ...interface{}) *Message { case func(int, map[string]string, []string): defer func() { m.Table(val) }() + case map[string]string: + for k, v := range val { + opts[k] = v + } + case *Option: opts[val.Name] = val.Value case Option: