diff --git a/base/cli/cli.go b/base/cli/cli.go index fb47c5c2..ce964257 100644 --- a/base/cli/cli.go +++ b/base/cli/cli.go @@ -92,7 +92,7 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", m.Save(RUNTIME, SYSTEM) }}, - RUNTIME: {Name: "runtime", Help: "运行环境", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + RUNTIME: {Name: "runtime name auto", Help: "运行环境", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch kit.Select("", arg, 0) { case "hostinfo": case "hostname": diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 7a71d378..bb0f2e6a 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -65,11 +65,20 @@ func _hash_import(m *ice.Message, prefix, key, file string) { } count := 0 - for _, data := range list { - // 导入数据 - m.Rich(prefix, key, data) - count++ + if m.Conf(prefix, kit.Keys(key, kit.MDB_META, kit.MDB_SHORT)) == "" { + for k, data := range list { + // 导入数据 + m.Conf(prefix, kit.Keys(key, kit.MDB_HASH, k), data) + count++ + } + } else { + for _, data := range list { + // 导入数据 + m.Rich(prefix, key, data) + count++ + } } + m.Log_IMPORT(kit.MDB_KEY, kit.Keys(prefix, key), kit.MDB_COUNT, count) m.Echo(kit.Keys(file, JSON)) } diff --git a/base/web/serve.go b/base/web/serve.go index 336d3c11..c94a8cb9 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -70,11 +70,13 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon msg.Option(v.Name, v.Value) } + // 请求 msg.Option(ice.MSG_OUTPUT, "") if u, e := url.Parse(r.Header.Get("Referer")); e == nil { for k, v := range u.Query() { - msg.Logs("refer", k, v) - msg.Option(k, v) + if msg.Logs("refer", k, v); k != "name" { + msg.Option(k, v) + } } } diff --git a/base/web/share.go b/base/web/share.go index fb32aaea..7a066a38 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -91,7 +91,12 @@ func _share_create(m *ice.Message, kind, name, text string, arg ...string) strin h := m.Rich(SHARE, nil, kit.Dict( kit.MDB_TIME, m.Time(m.Conf(SHARE, "meta.expire")), kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text, - kit.MDB_EXTRA, kit.Dict(aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), arg), + kit.MDB_EXTRA, kit.Dict( + aaa.USERROLE, m.Option(ice.MSG_USERROLE), + aaa.USERNAME, m.Option(ice.MSG_USERNAME), + "river", m.Option(ice.MSG_RIVER), + "storm", m.Option(ice.MSG_STORM), + arg), )) // 创建列表 @@ -150,6 +155,8 @@ func _share_action(m *ice.Message, value map[string]interface{}, arg ...string) func _share_action_redirect(m *ice.Message, value map[string]interface{}, share string) bool { tool := kit.Value(value, "extra.tool.0").(map[string]interface{}) m.Render("redirect", "/share", "share", share, "title", kit.Format(value["name"]), + "river", kit.Format(kit.Value(value, "extra.river")), + "storm", kit.Format(kit.Value(value, "extra.storm")), "pod", kit.Format(tool["pod"]), kit.UnMarshal(kit.Format(tool["val"])), ) return true diff --git a/core/chat/chat.go b/core/chat/chat.go index 7084147a..3373afc1 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -119,11 +119,15 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", } case "/action": if len(arg) > 0 { - m.Option(ice.MSG_RIVER, arg[0]) + if arg[0] != "" { + m.Option(ice.MSG_RIVER, arg[0]) + } arg = arg[1:] } if len(arg) > 0 { - m.Option(ice.MSG_STORM, arg[0]) + if arg[0] != "" { + m.Option(ice.MSG_STORM, arg[0]) + } arg = arg[1:] } } @@ -142,6 +146,21 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", }) }) == nil { + if m.Option("share") != "" { + m.Richs(web.SHARE, "", m.Option("share"), func(key string, value map[string]interface{}) { + if m.Option(ice.MSG_RIVER) == kit.Value(value, "extra.river") && m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), kit.Value(value, "extra.username"), nil) != nil { + return + } + + // m.Option(ice.MSG_USERNAME, kit.Value(value, "extra.username")) + // m.Option(ice.MSG_USERROLE, kit.Value(value, "extra.userrole")) + // m.Log_AUTH(web.SHARE, key, "username", m.Option(ice.MSG_USERNAME)) + m.Render(web.STATUS, 403, "not join") + m.Option(ice.MSG_USERURL, "") + return + }) + return + } m.Render(web.STATUS, 403, "not join") m.Option(ice.MSG_USERURL, "") return @@ -155,6 +174,7 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", if m.Right(m.Option(ice.MSG_USERURL), m.Optionv(ice.MSG_CMDS)) { return } + // 登录检查 if m.Warn(!m.Options(ice.MSG_USERNAME), "not login") { if m.Option("share") == "" { @@ -171,23 +191,13 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", m.Option(ice.MSG_USERURL, "") return } + }}, "tool": {Name: "tool", Help: "应用", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }}, "node": {Name: "node", Help: "设备", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }}, - "user": {Name: "user", Help: "用户", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { - m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - value = value[kit.MDB_META].(map[string]interface{}) - m.Push(key, value, []string{kit.MDB_TIME}) - m.Push(aaa.USERZONE, aaa.UserZone(m, value[aaa.USERNAME])) - m.Push(aaa.USERNICK, aaa.UserNick(m, value[aaa.USERNAME])) - m.Push(key, value, []string{aaa.USERNAME}) - }) - }) - }}, "/ocean": {Name: "/ocean", Help: "大海洋", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { diff --git a/core/chat/meet.go b/core/chat/meet.go index 9d21b66f..4c2c27d8 100644 --- a/core/chat/meet.go +++ b/core/chat/meet.go @@ -89,6 +89,10 @@ func init() { if m.Option(ice.MSG_USERUA) == "" { continue } + if value["照片"] == "" { + m.Push("照片", "") + continue + } m.Push("照片", m.Cmdx(mdb.RENDER, web.RENDER.IMG, path.Join("/share/local", value["照片"]))) } else { m.Push(k, value[k]) diff --git a/core/chat/river.go b/core/chat/river.go index 5ff862bf..322c4f00 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -97,6 +97,8 @@ func init() { "base", kit.Dict( "admin", []interface{}{ "web.chat.user", + "web.chat.tool", + "web.chat.info", }, ), ), @@ -116,7 +118,106 @@ func init() { )}, }, Commands: map[string]*ice.Command{ - "/" + RIVER: {Name: "/river", Help: "小河流", + "info": {Name: "info auto 导出:button", Help: "信息", Action: map[string]*ice.Action{ + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + arg[0] = kit.Keys(kit.MDB_META, arg[0]) + m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { + m.Log_MODIFY(RIVER, m.Option(ice.MSG_RIVER), arg[0], arg[1], "old", kit.Format(kit.Value(value, arg[0]))) + kit.Value(value, arg[0], arg[1]) + }) + }}, + mdb.EXPORT: {Name: "export file", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.EXPORT, m.Prefix(RIVER), "", mdb.HASH) + }}, + mdb.IMPORT: {Name: "import file", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(RIVER), "", mdb.HASH) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { + m.Push("detail", value[kit.MDB_META]) + }) + }}, + + "user": {Name: "user auto", Help: "用户", Action: map[string]*ice.Action{ + mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + if m.Option(aaa.USERNAME) == cli.UserName { + return + } + if m.Option(aaa.USERNAME) == m.Option(ice.MSG_USERNAME) { + return + } + m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { + m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), m.Option(aaa.USERNAME), func(key string, value map[string]interface{}) { + m.Conf(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER, kit.MDB_HASH, key), "") + m.Log_DELETE(RIVER, m.Option(ice.MSG_RIVER), USER, m.Option(aaa.USERNAME)) + }) + }) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { + m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + value = value[kit.MDB_META].(map[string]interface{}) + m.Push(key, value, []string{kit.MDB_TIME}) + m.Push(aaa.USERZONE, aaa.UserZone(m, value[aaa.USERNAME])) + m.Push(aaa.USERNICK, aaa.UserNick(m, value[aaa.USERNAME])) + m.Push(key, value, []string{aaa.USERNAME}) + }) + }) + m.PushAction("删除") + }}, + "tool": {Name: "tool storm=auto id=auto auto", Help: "工具", Action: map[string]*ice.Action{ + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { + m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), m.Option("storm"), func(key string, value map[string]interface{}) { + switch arg[0] { + case kit.MDB_TIME, kit.MDB_ID: + return + } + if m.Option(kit.MDB_ID) == "" { + m.Log_MODIFY(RIVER, m.Option(ice.MSG_RIVER), arg[0], arg[1], "old", kit.Value(value, kit.Keys(kit.MDB_META, arg[0]))) + kit.Value(value, kit.Keys(kit.MDB_META, arg[0]), arg[1]) + return + } + m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, key), kit.MDB_ID, m.Option(kit.MDB_ID), func(index int, value map[string]interface{}) { + m.Log_MODIFY(RIVER, m.Option(ice.MSG_RIVER), arg[0], arg[1], "old", kit.Value(value, kit.Keys(kit.MDB_META, arg[0]))) + kit.Value(value, kit.Keys(kit.MDB_META, arg[0]), arg[1]) + }) + }) + }) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) == 0 { + m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { + m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + value = value[kit.MDB_META].(map[string]interface{}) + m.Push("time", value[kit.MDB_TIME]) + m.Push("storm", key) + m.Push("name", value[kit.MDB_NAME]) + m.Push("count", value[kit.MDB_COUNT]) + }) + }) + return + } + + m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { + if len(arg) == 1 { + m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), "", "", func(index int, value map[string]interface{}) { + value = value[kit.MDB_META].(map[string]interface{}) + m.Push("time", value[kit.MDB_TIME]) + m.Push("id", value[kit.MDB_ID]) + m.Push("ctx", value["ctx"]) + m.Push("cmd", value["cmd"]) + }) + return + } + m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), kit.MDB_ID, arg[1], func(index int, value map[string]interface{}) { + value = value[kit.MDB_META].(map[string]interface{}) + m.Push("detail", value) + }) + }) + }}, + + "/river": {Name: "/river", Help: "小河流", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create type name text arg...", Help: "创建", Hand: func(m *ice.Message, arg ...string) { _river_create(m, arg[0], arg[1], arg[2], arg[3:]...) diff --git a/core/mall/mall.go b/core/mall/mall.go index c6461abb..9f43bb80 100644 --- a/core/mall/mall.go +++ b/core/mall/mall.go @@ -9,7 +9,6 @@ import ( "encoding/csv" "os" "path" - "strconv" "strings" ) @@ -248,22 +247,9 @@ var Index = &ice.Context{Name: "mall", Help: "贸易中心", }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save(ASSET) }}, - ASSET: {Name: "asset account=auto id=auto auto 支出:button 转账:button 收入:button 导出:button 导入:button", Help: "资产", Meta: kit.Dict( - "支出", _input_spend, "转账", _input_trans, "收入", _input_bonus, + ASSET: {Name: "asset account=auto id=auto auto 添加:button 导出:button 导入:button", Help: "资产", Meta: kit.Dict( + "添加", _input_spend, ), Action: map[string]*ice.Action{ - "spend": {Name: "insert [key value]...", Help: "支出", Hand: func(m *ice.Message, arg ...string) { - _asset_create(m, arg[1]) - _asset_insert(m, arg[1], arg[2:]...) - }}, - "trans": {Name: "insert [key value]...", Help: "转账", Hand: func(m *ice.Message, arg ...string) { - _asset_create(m, arg[1]) - _asset_insert(m, arg[1], arg[2:]...) - }}, - "bonus": {Name: "insert [key value]...", Help: "收入", Hand: func(m *ice.Message, arg ...string) { - _asset_create(m, arg[1]) - _asset_insert(m, arg[1], arg[2:]...) - }}, - mdb.INSERT: {Name: "insert [key value]...", Help: "添加", Hand: func(m *ice.Message, arg ...string) { _asset_create(m, arg[1]) _asset_insert(m, arg[1], arg[2:]...) @@ -284,191 +270,15 @@ var Index = &ice.Context{Name: "mall", Help: "贸易中心", }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if _asset_list(m, kit.Select("", arg, 0), kit.Select("", arg, 1)); len(arg) < 2 { m.Table(func(index int, value map[string]string, head []string) { - }) - } else { - m.Table(func(index int, value map[string]string, head []string) { - if value["key"] == "status" { - m.Push("key", "action") - m.Push("value", _asset_action(m, value["value"])) - } - }) - } - return - if m.Option("_action") == "保存" { - arg = []string{"action", "save"} - } - if len(arg) > 0 && arg[0] == "action" { - switch arg[1] { - case "modify": - // 修改数据 - m.Richs(cmd, nil, m.Option("account"), func(key string, account map[string]interface{}) { - m.Grows(cmd, kit.Keys("hash", key), "id", arg[5], func(index int, current map[string]interface{}) { - m.Log(ice.LOG_MODIFY, "%s: %d %s: %s->%s", key, index, kit.Value(current, arg[2]), arg[2], arg[3]) - kit.Value(current, arg[2], arg[3]) - }) - }) - case "save": - // 保存数据 - m.Option("cache.limit", -2) - if f, p, e := kit.Create(kit.Select("usr/local/asset.csv", arg, 2)); m.Assert(e) { - defer f.Close() - - w := csv.NewWriter(f) - defer w.Flush() - - w.Write([]string{"时间", "收支类型", "账目分类", "备注", "金额", "账户"}) - m.Richs(cmd, nil, kit.Select("*", arg, 3), func(key string, account map[string]interface{}) { - if kit.Format(kit.Value(account, "meta.account")) == "流水" { - return - } - m.Grows(cmd, kit.Keys("hash", key), kit.Select("", arg, 4), kit.Select("", arg, 5), func(index int, current map[string]interface{}) { - w.Write([]string{ - kit.Format(current["time"]), - kit.Format(current["type"]), - kit.Format(current["name"]), - kit.Format(current["text"]), - kit.Format(current["value"]), - kit.Format(kit.Value(account, "meta.account")), - }) - }) - }) - m.Log(ice.LOG_EXPORT, "%s", p) - m.Cmdy(web.STORY, "catch", "csv", p) - } - - case "load": - // 加载数据 - m.CSV(m.Cmdx("nfs.cat", arg[2])).Table(func(index int, data map[string]string, head []string) { - v, _ := strconv.ParseFloat(data["金额"], 64) - for _, account := range []string{kit.Select(data["账户"], arg, 3), "流水"} { - // amount := kit.Int(v * 100) - item := kit.Dict( - "type", data["收支类型"], "name", data["账目分类"], "text", data["备注"], "value", kit.Int(v), - "time", data["时间"], "extra", kit.UnMarshal(data["extra"]), - ) - - if m.Richs(cmd, nil, account, nil) == nil { - // 添加账户 - m.Log(ice.LOG_CREATE, "account: %s", account) - m.Rich(cmd, nil, kit.Data("account", account, "amount", "0", "bonus", "0", "spend", "0")) - } - - m.Richs(cmd, nil, account, func(key string, value map[string]interface{}) { - // 账户流水 - m.Grow(cmd, kit.Keys("hash", key), item) - - // 账户结余 - amount := kit.Int(kit.Value(value, "meta.amount")) + kit.Int(v) - m.Log(ice.LOG_INSERT, "%s: %v", key, amount) - kit.Value(value, "meta.amount", amount) - - switch data["收支类型"] { - case "收入": - bonus := kit.Int(kit.Value(value, "meta.bonus")) + kit.Int(v) - kit.Value(value, "meta.bonus", bonus) - case "支出": - spend := kit.Int(kit.Value(value, "meta.spend")) + kit.Int(v) - kit.Value(value, "meta.spend", spend) - } - }) - } - }) - } - return - } - - if len(arg) == 0 { - // 账户列表 - m.Richs(cmd, nil, "*", func(key string, value map[string]interface{}) { - m.Push(key, value["meta"], []string{"account", "count", "amount", "bonus", "spend"}) }) m.Sort("amount", "int_r") return } - - if len(arg) > 5 && m.Richs(cmd, nil, arg[0], nil) == nil { - // 添加账户 - m.Rich(cmd, nil, kit.Data("account", arg[0], "amount", "0", "bonus", "0", "spend", "0")) - m.Log(ice.LOG_CREATE, "account: %s", arg[0]) - } - - field := []string{"time", "id", "value", "type", "name", "text"} - m.Richs(cmd, nil, arg[0], func(key string, value map[string]interface{}) { - if len(arg) == 1 { - // 消费流水 - m.Grows(cmd, kit.Keys("hash", key), "", "", func(index int, value map[string]interface{}) { - m.Push("", value, field) - }) - m.Sort("id", "int_r") - return - } - if len(arg) == 2 { - // 消费详情 - m.Grows(cmd, kit.Keys("hash", key), "id", arg[1], func(index int, value map[string]interface{}) { - m.Push("detail", value) - }) - return - } - if len(arg) < 6 { - // 消费查询 - name, value := "type", arg[2] - switch len(arg) { - case 3: - // 消费分类 - name, value = "type", arg[2] - case 4: - // 消费对象 - name, value = "name", arg[3] - case 5: - // 消费备注 - name, value = "text", arg[4] - } - m.Grows(cmd, kit.Keys("hash", key), name, value, func(index int, value map[string]interface{}) { - m.Push("", value, field) - }) - m.Sort("id", "int_r") - return - } - - // 词汇统计 - web.Count(m, cmd, "meta.word.type", arg[2]) - web.Count(m, cmd, "meta.word.name", arg[3]) - web.Count(m, cmd, "meta.word.text", arg[4]) - web.Count(m, cmd, "meta.word.value", strings.TrimPrefix(arg[5], "-")) - - // 数据结构 - amount := kit.Int(arg[5]) - extra := kit.Dict() - data := kit.Dict( - kit.MDB_TYPE, arg[2], kit.MDB_NAME, arg[3], kit.MDB_TEXT, arg[4], - "value", amount, "extra", extra, - ) - for i := 6; i < len(arg)-1; i += 2 { - switch arg[i] { - case kit.MDB_TIME: - kit.Value(data, arg[i], arg[i+1]) - default: - kit.Value(extra, arg[i], arg[i+1]) - } - } - // 添加流水 - n := m.Grow(cmd, kit.Keys(kit.MDB_HASH, key), data) - - // 账户结余 - total := kit.Int(kit.Value(value, "meta.amount")) + amount - m.Log(ice.LOG_INSERT, "account: %s total: %v", arg[0], total) - kit.Value(value, "meta.amount", total) - m.Echo("%s: %d %d\n", arg[0], n, total) - - // 收支统计 - switch data["type"] { - case "收入": - bonus := kit.Int(kit.Value(value, "meta.bonus")) + amount - kit.Value(value, "meta.bonus", bonus) - case "支出": - spend := kit.Int(kit.Value(value, "meta.spend")) + amount - kit.Value(value, "meta.spend", spend) + m.Table(func(index int, value map[string]string, head []string) { + if value["key"] == "status" { + m.Push("key", "action") + m.Push("value", _asset_action(m, value["value"])) } }) }},