1
0
forked from x/ContextOS

tce add cli.time.monday

This commit is contained in:
shaoying 2018-07-08 21:21:06 +08:00
parent 9f95a85249
commit 53abac7812
5 changed files with 169 additions and 81 deletions

View File

@ -307,7 +307,8 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
}}, }},
}, },
Configs: map[string]*ctx.Config{ Configs: map[string]*ctx.Config{
"time_format": &ctx.Config{Name: "time_format", Value: "2006-01-02 15:04:05", Help: "时间格式"}, "time_format": &ctx.Config{Name: "time_format", Value: "2006-01-02 15:04:05", Help: "时间格式"},
"time_interval": &ctx.Config{Name: "time_interval(open/close)", Value: "open", Help: "时间区间"},
}, },
Commands: map[string]*ctx.Command{ Commands: map[string]*ctx.Command{
"alias": &ctx.Command{Name: "alias [short [long]]|[delete short]", Help: "查看、定义或删除命令别名, short: 命令别名, long: 命令原名, delete: 删除别名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "alias": &ctx.Command{Name: "alias [short [long]]|[delete short]", Help: "查看、定义或删除命令别名, short: 命令别名, long: 命令原名, delete: 删除别名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
@ -339,22 +340,75 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
} }
} // }}} } // }}}
}}, }},
"time": &ctx.Command{Name: "time [parse when] [time_format format] when", "time": &ctx.Command{Name: "time [time_format format] [parse when] when [begin|end|yestoday|tommorow|monday|sunday|first|last|origin|last]",
Form: map[string]int{"parse": 1, "time_format": 1}, Form: map[string]int{"parse": 1, "time_format": 1, "time_interval": 1},
Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
t := time.Now() // {{{ t := time.Now() // {{{
f := m.Confx("time_format") f := m.Confx("time_format")
if len(arg) > 0 {
if i, e := strconv.Atoi(arg[0]); e == nil {
t = time.Unix(int64(i), 0)
}
}
if m.Options("parse") { if m.Options("parse") {
n, e := time.ParseInLocation(f, m.Option("parse"), time.Local) n, e := time.ParseInLocation(f, m.Option("parse"), time.Local)
m.Assert(e) m.Assert(e)
t = n t = n
} }
if len(arg) > 0 {
if i, e := strconv.Atoi(arg[0]); e == nil {
t = time.Unix(int64(i/1000), 0)
arg = arg[1:]
}
}
if len(arg) > 0 {
switch arg[0] {
case "begin":
// t.Add(-((time.Second)t.Second() + (time.Minute)t.Minute() + (time.Hour)t.Hour()))
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t = t.Add(-d)
case "end":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds%dns", t.Hour(), t.Minute(), t.Second(), t.Nanosecond()))
m.Assert(e)
t = t.Add(time.Duration(24*time.Hour) - d)
if m.Confx("time_interval") == "close" {
t = t.Add(-time.Second)
}
case "yestoday":
t = t.Add(-time.Duration(24 * time.Hour))
case "tomorrow":
t = t.Add(time.Duration(24 * time.Hour))
case "monday":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", int((t.Weekday()-time.Monday+7)%7)*24+t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t = t.Add(-d)
case "sunday":
d, e := time.ParseDuration(fmt.Sprintf("%dh%dm%ds", int((t.Weekday()-time.Monday+7)%7)*24+t.Hour(), t.Minute(), t.Second()))
m.Assert(e)
t = t.Add(time.Duration(7*24*time.Hour) - d)
if m.Confx("time_interval") == "close" {
t = t.Add(-time.Second)
}
case "first":
t = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.Local)
case "last":
month, year := t.Month()+1, t.Year()
if month >= 13 {
month, year = 1, year+1
}
t = time.Date(year, month, 1, 0, 0, 0, 0, time.Local)
if m.Confx("time_interval") == "close" {
t = t.Add(-time.Second)
}
case "origin":
t = time.Date(t.Year(), 1, 1, 0, 0, 0, 0, time.Local)
case "final":
t = time.Date(t.Year()+1, 1, 1, 0, 0, 0, 0, time.Local)
if m.Confx("time_interval") == "close" {
t = t.Add(-time.Second)
}
}
}
if m.Options("parse") || !m.Options("time_format") { if m.Options("parse") || !m.Options("time_format") {
m.Echo("%d000", t.Unix()) m.Echo("%d000", t.Unix())
} else { } else {

View File

@ -1124,7 +1124,10 @@ func (m *Message) Echo(str string, arg ...interface{}) *Message { // {{{
// }}} // }}}
func (m *Message) Color(color int, str string, arg ...interface{}) *Message { // {{{ func (m *Message) Color(color int, str string, arg ...interface{}) *Message { // {{{
return m.Add("result", fmt.Sprintf("\033[%dm%s\033[0m", color, fmt.Sprintf(str, arg...))) if str = fmt.Sprintf(str, arg...); m.Options("terminal_color") {
str = fmt.Sprintf("\033[%dm%s\033[0m", color, str)
}
return m.Add("result", str)
} }
// }}} // }}}
@ -2393,8 +2396,16 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
return return
} }
sub := msg.Spawn().Cmd(arg) switch arg[0] {
m.Copy(sub, "result").Copy(sub, "append") case "message":
for msg := m; msg != nil; msg = msg.message {
m.Echo("%d: %s\n", msg.code, msg.Format())
}
default:
sub := msg.Spawn().Cmd(arg)
m.Copy(sub, "result").Copy(sub, "append")
}
// }}} // }}}
}}, }},
"detail": &Command{Name: "detail [index] [value...]", Help: "查看或添加参数", Hand: func(m *Message, c *Context, key string, arg ...string) { "detail": &Command{Name: "detail [index] [value...]", Help: "查看或添加参数", Hand: func(m *Message, c *Context, key string, arg ...string) {
@ -2657,7 +2668,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
if len(arg) > 1 { if len(arg) > 1 {
which = arg[1] which = arg[1]
} }
m.Log("fuck", nil, "what %s", which)
switch which { switch which {
case "cache": case "cache":
for k, v := range msg.target.Caches { for k, v := range msg.target.Caches {
@ -3306,6 +3316,7 @@ func Start(args ...string) {
} }
Pulse.Options("log", true) Pulse.Options("log", true)
Pulse.Options("terminal_color", true)
Pulse.Sesss("log", "log").Conf("bench.log", Pulse.Conf("bench.log")) Pulse.Sesss("log", "log").Conf("bench.log", Pulse.Conf("bench.log"))
for _, m := range Pulse.Search(Pulse.Conf("start")) { for _, m := range Pulse.Search(Pulse.Conf("start")) {

View File

@ -259,11 +259,23 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
where := m.Confx("where", m.Option("where"), "where %s") where := m.Confx("where", m.Option("where"), "where %s")
group := m.Confx("group", m.Option("group"), "group by %s") group := m.Confx("group", m.Option("group"), "group by %s")
order := m.Confx("order", m.Option("order"), "order by %s") order := m.Confx("order", m.Option("orders"), "order by %s")
limit := m.Confx("limit", m.Option("limit"), "limit %s") limit := m.Confx("limit", m.Option("limit"), "limit %s")
offset := m.Confx("offset", m.Option("offset"), "offset %s") offset := m.Confx("offset", m.Option("offset"), "offset %s")
msg := m.Spawn().Cmd("query", fmt.Sprintf("select %s from %s %s %s %s %s %s", field, table, where, group, order, limit, offset), m.Meta["other"]) other := m.Meta["other"]
for i, v := range other {
if len(v) > 1 {
switch v[0] {
case '$':
other[i] = m.Cap(v[1:])
case '@':
other[i] = m.Conf(v[1:])
}
}
}
msg := m.Spawn().Cmd("query", fmt.Sprintf("select %s from %s %s %s %s %s %s", field, table, where, group, order, limit, offset), other)
if m.Optioni("query", msg.Code()); !m.Options("save") { if m.Optioni("query", msg.Code()); !m.Options("save") {
m.Color(31, table).Echo(" %s %s %s %s %s %v\n", where, group, order, limit, offset, m.Meta["other"]) m.Color(31, table).Echo(" %s %s %s %s %s %v\n", where, group, order, limit, offset, m.Meta["other"])
} }

View File

@ -91,6 +91,7 @@ func (web *WEB) Merge(m *ctx.Message, uri string, arg ...string) string { // {{{
func (web *WEB) Trans(m *ctx.Message, key string, hand func(*ctx.Message, *ctx.Context, string, ...string)) { // {{{ func (web *WEB) Trans(m *ctx.Message, key string, hand func(*ctx.Message, *ctx.Context, string, ...string)) { // {{{
web.HandleFunc(key, func(w http.ResponseWriter, r *http.Request) { web.HandleFunc(key, func(w http.ResponseWriter, r *http.Request) {
msg := m.Spawn().Set("detail", key) msg := m.Spawn().Set("detail", key)
msg.Option("terminal_color", false)
msg.Option("method", r.Method) msg.Option("method", r.Method)
msg.Option("referer", r.Header.Get("Referer")) msg.Option("referer", r.Header.Get("Referer"))
@ -506,12 +507,18 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
// }}} // }}}
}}, }},
"/travel": &ctx.Command{Name: "/travel", Help: "文件上传", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "/travel": &ctx.Command{Name: "/travel", Help: "文件上传", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
if !m.Options("module") { //{{{ // r := m.Optionv("request").(*http.Request) // {{{
// w := m.Optionv("response").(http.ResponseWriter)
if !m.Options("module") {
m.Option("module", "ctx") m.Option("module", "ctx")
} }
r := m.Data["request"].(*http.Request) check := m.Spawn().Cmd("/share", "/travel", "module", m.Option("module"))
w := m.Data["response"].(http.ResponseWriter) if !check.Results(0) {
m.Copy(check, "append")
return
}
// 权限检查 // 权限检查
if m.Option("method") == "POST" { if m.Option("method") == "POST" {
@ -560,11 +567,8 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
} }
// 解析模板 // 解析模板
render := m.Spawn(m.Target()).Put("option", "request", r).Put("option", "response", w) m.Set("append", "tmpl", "userinfo", "share")
defer render.Cmd(m.Conf("travel_main"), m.Conf("travel_tmpl"))
if msg := m.Find(m.Option("module"), true); msg != nil { if msg := m.Find(m.Option("module"), true); msg != nil {
m.Option("tmpl", "")
for _, v := range []string{"cache", "config", "command", "module", "domain"} { for _, v := range []string{"cache", "config", "command", "module", "domain"} {
if m.Options("domain") { if m.Options("domain") {
msg = m.Find("ssh", true) msg = m.Find("ssh", true)
@ -574,17 +578,19 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
return nil return nil
}) })
} else { } else {
msg = msg.Spawn(msg.Target()) msg = msg.Spawn()
msg.Cmd("context", "find", m.Option("module"), v) msg.Cmd("context", "find", msg.Cap("module"), "list", v)
} }
if len(msg.Meta["append"]) > 0 { if len(msg.Meta["append"]) > 0 {
render.Option("current_module", m.Option("module")) msg.Option("current_module", m.Option("module"))
render.Option("current_domain", m.Option("domain")) msg.Option("current_domain", m.Option("domain"))
render.Sesss(v, msg).Add("option", "tmpl", v) m.Add("option", "tmpl", v)
m.Sesss(v, msg)
} }
} }
} }
m.Append("template", m.Conf("travel_main"), m.Conf("travel_tmpl"))
// }}} // }}}
}}, }},
"/upload": &ctx.Command{Name: "/upload", Help: "文件上传", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "/upload": &ctx.Command{Name: "/upload", Help: "文件上传", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
@ -595,7 +601,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
m.Option("dir", m.Cap("directory")) m.Option("dir", m.Cap("directory"))
} }
check := m.Spawn().Cmd("/share") check := m.Spawn().Cmd("/share", "/upload", "dir", m.Option("dir"))
if !check.Results(0) { if !check.Results(0) {
m.Copy(check, "append") m.Copy(check, "append")
return return
@ -753,7 +759,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
// }}} // }}}
}}, }},
"/share": &ctx.Command{Name: "/share", Help: "资源共享", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "/share": &ctx.Command{Name: "/share", Help: "资源共享", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
check := m.Spawn().Cmd("/check", "command", "/share", "dir", m.Option("dir")) // {{{ check := m.Spawn().Cmd("/check", "command", arg[0], arg[1], arg[2]) // {{{
if !check.Results(0) { if !check.Results(0) {
m.Copy(check, "append") m.Copy(check, "append")
return return
@ -761,10 +767,10 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
msg := check.Appendv("aaa").(*ctx.Message).Spawn(m.Target()) msg := check.Appendv("aaa").(*ctx.Message).Spawn(m.Target())
if m.Options("shareto") { if m.Options("shareto") {
msg.Cmd("right", "add", m.Option("shareto"), "command", "/share", "dir", m.Option("dir")) msg.Cmd("right", "add", m.Option("shareto"), "command", arg[0], arg[1], arg[2])
} }
if m.Options("notshareto") { if m.Options("notshareto") {
msg.Cmd("right", "del", m.Option("notshareto"), "command", "/share", "dir", m.Option("dir")) msg.Cmd("right", "del", m.Option("notshareto"), "command", arg[0], arg[1], arg[2])
} }
m.Echo("ok") m.Echo("ok")
// }}} // }}}

View File

@ -90,6 +90,14 @@
{{end}} {{end}}
</table> </table>
</fieldset> </fieldset>
<script>
function Config(event, name) {
if (event.keyCode == 13) {
ctx.Conf(name, event.currentTarget.value, function(msg) {ctx.Refresh()});
}
}
</script>
{{end}} {{end}}
{{define "command"}} {{define "command"}}
@ -119,9 +127,48 @@
</table> </table>
</fieldset> </fieldset>
<fieldset><legend><input id="direct" type="text" onkeydown="return Command(event)"></legend> <fieldset><legend><input id="direct" type="text" onkeydown="return Command(event)"></legend>
<pre class="result"><code id="result"> <pre class="result"><code id="result"></code></pre>
</code></pre> <table id="append"></table>
</fieldset> </fieldset>
<script>
function Result(msg) {
var result = document.getElementById("result");
result.innerHTML = msg.result.join("");
var append = document.getElementById("append");
var tr = document.createElement("tr");
append.appendChild(tr)
for (var k in msg.append) {
var th = document.createElement("th");
th.innerHTML = k;
}
}
function Command(event, name) {
if (event.keyCode == 13) {
var direct = document.getElementById("direct");
if (name) {
direct.value = name;
ctx.Cmd(name, event.currentTarget.value, Result);
} else {
ctx.Cmd(event.currentTarget.value, "", Result);
}
}
}
function Direct(event, name, value) {
console.log(event)
if (!name) {
name = event.currentTarget.value;
}
var direct = document.getElementById("direct");
direct.value = name;
ctx.Cmd(name, value, Result);
return false;
}
</script>
{{end}} {{end}}
{{define "module"}} {{define "module"}}
@ -183,51 +230,6 @@
{{define "tail"}} {{define "tail"}}
<script src="library/context.js"></script> <script src="library/context.js"></script>
<script> <script>
function Refresh() {
location.assign(location.href);
}
function Config(event, name) {
if (event.keyCode == 13) {
ctx.Conf(name, event.currentTarget.value, function(msg) {Refresh()});
}
}
function Result(msg) {
var result = document.getElementById("result");
result.innerHTML = msg.result.join("");
}
function Command(event, name) {
if (event.keyCode == 13) {
var direct = document.getElementById("direct");
if (name) {
direct.value = name;
ctx.Cmd(name, event.currentTarget.value, Result);
} else {
ctx.Cmd(event.currentTarget.value, "", Result);
}
}
}
function Direct(event, name, value) {
console.log(event)
if (!name) {
name = event.currentTarget.value;
}
var direct = document.getElementById("direct");
direct.value = name;
ctx.Cmd(name, value, Result);
return false;
}
function Input(event, cb, key) {
if (event.keyCode == 13) {
cb(key, event.target.value);
}
}
function Change(event, key) { function Change(event, key) {
if (event.keyCode == 13) { if (event.keyCode == 13) {
ctx.Search(key, event.target.value); ctx.Search(key, event.target.value);
@ -239,9 +241,6 @@
ctx.Cookie("order", ctx.Cookie("order")*1 + 1); ctx.Cookie("order", ctx.Cookie("order")*1 + 1);
location.assign(location.href); location.assign(location.href);
} }
function show(name) {
ctx.Cap(name, function(msg) {console.log(msg)});
}
</script> </script>
</body> </body>
{{end}} {{end}}
@ -251,7 +250,13 @@
{{$meta := .Meta}} {{$meta := .Meta}}
{{$sess := $msg.Sessions}} {{$sess := $msg.Sessions}}
{{range .Meta.tmpl}} {{range .Meta.tmpl}}
{{if eq . "cache"}} {{if eq . "login"}}
{{template "login" $meta}}
{{else if eq . "userinfo"}}
{{template "userinfo" $msg}}
{{else if eq . "share"}}
{{template "share" $sess.share}}
{{else if eq . "cache"}}
{{template "cache" $sess.cache.Meta}} {{template "cache" $sess.cache.Meta}}
{{else if eq . "config"}} {{else if eq . "config"}}
{{template "config" $sess.config.Meta}} {{template "config" $sess.config.Meta}}