1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00
This commit is contained in:
harveyshao 2021-04-21 18:53:33 +08:00
parent 660d594e8e
commit b01ebf5c2f
12 changed files with 197 additions and 203 deletions

View File

@ -6,21 +6,6 @@ import (
kit "github.com/shylinux/toolkits"
)
const (
ErrNotAuth = "not auth: "
)
const (
IP = "ip"
UA = "ua"
USERROLE = "userrole"
USERNAME = "username"
PASSWORD = "password"
USERNICK = "usernick"
USERZONE = "userzone"
SESSID = "sessid"
)
const AAA = "aaa"
var Index = &ice.Context{Name: AAA, Help: "认证模块", Commands: map[string]*ice.Command{
@ -28,7 +13,7 @@ var Index = &ice.Context{Name: AAA, Help: "认证模块", Commands: map[string]*
m.Rich(ROLE, nil, kit.Dict(kit.MDB_NAME, VOID, WHITE, kit.Dict(), BLACK, kit.Dict()))
m.Rich(ROLE, nil, kit.Dict(kit.MDB_NAME, TECH, BLACK, kit.Dict(), WHITE, kit.Dict()))
m.Load()
m.Cmd(mdb.SEARCH, mdb.CREATE, USER, USER, AAA)
m.Cmd(mdb.SEARCH, mdb.CREATE, USER, m.Prefix(USER))
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Save()

View File

@ -1,27 +1,20 @@
package aaa
import (
"strings"
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
"strings"
)
const ( // 用户角色
ROOT = "root"
TECH = "tech"
VOID = "void"
)
const ( // 角色操作
WHITE = "white"
BLACK = "black"
RIGHT = "right"
)
const ( // 返回结果
OK = "ok"
)
func _role_user(m *ice.Message, userrole string, username ...string) {
m.Richs(ROLE, nil, userrole, func(key string, value map[string]interface{}) {
for _, user := range username {
kit.Value(value, kit.Keys(USER, user), true)
}
})
}
func _role_list(m *ice.Message, userrole string) {
m.Richs(ROLE, nil, kit.Select(kit.MDB_FOREACH, userrole), func(key string, value map[string]interface{}) {
for k := range value[WHITE].(map[string]interface{}) {
@ -36,50 +29,6 @@ func _role_list(m *ice.Message, userrole string) {
}
})
}
func _role_user(m *ice.Message, userrole string, username ...string) {
m.Richs(ROLE, nil, userrole, func(key string, value map[string]interface{}) {
for _, user := range username {
kit.Value(value, kit.Keys(USER, user), true)
}
})
}
func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) {
if userrole == ROOT {
// 超级用户
return true
}
m.Richs(ROLE, nil, kit.Select(VOID, userrole), func(key string, value map[string]interface{}) {
ok = true
list := value[BLACK].(map[string]interface{})
for i := 0; i < len(keys); i++ {
if v, o := list[kit.Join(keys[:i+1], ".")]; o && v == true {
ok = false
}
}
if m.Warn(!ok, "%s black right %s", userrole, keys) {
return
}
if userrole == TECH {
// 管理用户
return
}
ok = false
list = value[WHITE].(map[string]interface{})
for i := 0; i < len(keys); i++ {
if v, o := list[kit.Join(keys[:i+1], ".")]; o && v == true {
ok = true
}
}
if m.Warn(!ok, ErrNotAuth, userrole, " of ", keys) {
return
}
// 普通用户
})
return ok
}
func _role_black(m *ice.Message, userrole, chain string, status bool) {
m.Richs(ROLE, nil, userrole, func(key string, value map[string]interface{}) {
m.Log_MODIFY(ROLE, userrole, BLACK, chain)
@ -94,11 +43,58 @@ func _role_white(m *ice.Message, userrole, chain string, status bool) {
list[chain] = status
})
}
func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) {
if userrole == ROOT {
return true // 超级用户
}
m.Richs(ROLE, nil, kit.Select(VOID, userrole), func(key string, value map[string]interface{}) {
ok = true
list := value[BLACK].(map[string]interface{})
for i := 0; i < len(keys); i++ {
if v, o := list[kit.Join(keys[:i+1], ".")]; o && v == true {
ok = false
}
}
if m.Warn(!ok, ice.ErrNotRight, userrole, " of ", keys) {
return
}
if userrole == TECH {
return // 管理用户
}
ok = false
list = value[WHITE].(map[string]interface{})
for i := 0; i < len(keys); i++ {
if v, o := list[kit.Join(keys[:i+1], ".")]; o && v == true {
ok = true
}
}
if m.Warn(!ok, ice.ErrNotRight, userrole, " of ", keys) {
return
}
// 普通用户
})
return ok
}
func RoleRight(m *ice.Message, userrole string, keys ...string) bool {
return _role_right(m, userrole, kit.Split(kit.Keys(keys), ".")...)
}
const ( // 用户角色
ROOT = "root"
TECH = "tech"
VOID = "void"
)
const ( // 角色操作
BLACK = "black"
WHITE = "white"
RIGHT = "right"
)
const ROLE = "role"
func init() {
@ -108,18 +104,19 @@ func init() {
},
Commands: map[string]*ice.Command{
ROLE: {Name: "role role auto create", Help: "角色", Action: map[string]*ice.Action{
WHITE: {Name: "white role chain...", Help: "白名单", Hand: func(m *ice.Message, arg ...string) {
_role_white(m, arg[0], strings.ReplaceAll(kit.Keys(arg[1:]), "/", "."), true)
}},
BLACK: {Name: "black role chain...", Help: "黑名单", Hand: func(m *ice.Message, arg ...string) {
_role_black(m, arg[0], strings.ReplaceAll(kit.Keys(arg[1:]), "/", "."), true)
}},
WHITE: {Name: "white role chain...", Help: "白名单", Hand: func(m *ice.Message, arg ...string) {
_role_white(m, arg[0], strings.ReplaceAll(kit.Keys(arg[1:]), "/", "."), true)
}},
RIGHT: {Name: "right role chain...", Help: "查看权限", Hand: func(m *ice.Message, arg ...string) {
if _role_right(m, arg[0], kit.Split(strings.ReplaceAll(kit.Keys(arg[1:]), "/", "."), ".")...) {
m.Echo(OK)
m.Echo(ice.OK)
}
}},
mdb.CREATE: {Name: "create zone=white,black role=void@key key=", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
mdb.CREATE: {Name: "create role=void,tech zone=white,black key=", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Richs(ROLE, nil, m.Option(ROLE), func(key string, value map[string]interface{}) {
list := value[m.Option(kit.MDB_ZONE)].(map[string]interface{})
m.Log_CREATE(ROLE, m.Option(ROLE), list[m.Option(kit.MDB_KEY)])
@ -134,12 +131,13 @@ func init() {
})
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 1 {
_role_user(m, arg[0], arg[1:]...)
if len(arg) < 2 {
_role_list(m, kit.Select("", arg, 0))
m.PushAction(mdb.REMOVE)
return
}
_role_list(m, kit.Select("", arg, 0))
m.PushAction(mdb.REMOVE)
_role_user(m, arg[0], arg[1:]...)
}},
},
})

View File

@ -6,34 +6,14 @@ import (
kit "github.com/shylinux/toolkits"
)
func _sess_auth(m *ice.Message, sessid string, username string, userrole string) {
m.Richs(SESS, nil, sessid, func(value map[string]interface{}) {
if value = kit.GetMeta(value); m.Option(ice.MSG_USERROLE) == ROOT {
value[USERROLE] = userrole
} else if m.Option(ice.MSG_USERROLE) == TECH && userrole != ROOT {
value[USERROLE] = userrole
} else {
return
}
m.Log_AUTH(SESSID, sessid, USERNAME, username, USERROLE, userrole)
value[USERNAME] = username
})
}
func _sess_check(m *ice.Message, sessid string) {
m.Richs(SESS, nil, sessid, func(value map[string]interface{}) {
value = kit.GetMeta(value)
m.Richs(USER, nil, value[USERNAME], func(value map[string]interface{}) {
value = kit.GetMeta(value)
if m.Option(ice.MSG_USERNICK, value[USERNICK]) == "" {
if name := kit.Format(value[USERNAME]); len(name) > 10 {
m.Option(ice.MSG_USERNICK, name[:10])
} else {
m.Option(ice.MSG_USERNICK, value[USERNAME])
}
}
m.Log_AUTH(
USERROLE, m.Option(ice.MSG_USERROLE, kit.Select(UserRole(m, value[USERNAME]))),
USERROLE, m.Option(ice.MSG_USERROLE, UserRole(m, value[USERNAME])),
USERNICK, m.Option(ice.MSG_USERNICK, value[USERNICK]),
USERNAME, m.Option(ice.MSG_USERNAME, value[USERNAME]),
)
@ -42,51 +22,50 @@ func _sess_check(m *ice.Message, sessid string) {
}
func _sess_create(m *ice.Message, username string) string {
if m.Richs(USER, nil, username, nil) == nil {
_user_create(m, username, "")
_user_create(m, username, kit.Hashs())
}
m.Cmdy(mdb.INSERT, SESS, "", mdb.HASH,
USERNAME, username, "from", m.Option(ice.MSG_SESSID),
kit.MDB_TIME, m.Time(m.Conf(SESS, "meta.expire")),
"agent", m.Option(ice.MSG_USERUA),
"ip", m.Option(ice.MSG_USERIP),
h := m.Cmdx(mdb.INSERT, SESS, "", mdb.HASH,
USERNAME, username, USERROLE, UserRole(m, username),
kit.MDB_TIME, m.Time(m.Conf(SESS, kit.Keym(kit.MDB_EXPIRE))),
IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA),
)
return m.Result()
m.Log_CREATE(SESS_CREATE, username, kit.MDB_HASH, h)
m.Event(SESS_CREATE, username)
return h
}
func SessCheck(m *ice.Message, sessid string) *ice.Message {
func SessCheck(m *ice.Message, sessid string) {
_sess_check(m, sessid)
return m
}
func SessCreate(m *ice.Message, username, userrole string) string {
m.Set(ice.MSG_RESULT)
_sess_auth(m, _sess_create(m, username), username, userrole)
return m.Result()
func SessCreate(m *ice.Message, username string) string {
return m.Option(ice.MSG_SESSID, _sess_create(m, username))
}
const (
IP = "ip"
UA = "ua"
SESSID = "sessid"
)
const (
SESS_CREATE = "sess.create"
)
const SESS = "sess"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
SESS: {Name: SESS, Help: "会话", Value: kit.Data(
kit.MDB_SHORT, "uniq", "expire", "720h",
)},
SESS: {Name: SESS, Help: "会话", Value: kit.Data(kit.MDB_SHORT, "uniq", kit.MDB_EXPIRE, "720h")},
},
Commands: map[string]*ice.Command{
SESS: {Name: "sess hash auto", Help: "会话", Action: map[string]*ice.Action{
"auth": {Name: "auth sessid username [userrole]", Help: "授权", Hand: func(m *ice.Message, arg ...string) {
_sess_auth(m, arg[0], arg[1], kit.Select("", arg, 2))
}},
"check": {Name: "check sessid", Help: "校验", Hand: func(m *ice.Message, arg ...string) {
_sess_check(m, arg[0])
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, SESS, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, kit.Select("time,hash,username,userrole", mdb.DETAIL, len(arg) > 0))
m.Fields(len(arg) == 0, "time,hash,username,userrole")
m.Cmdy(mdb.SELECT, SESS, "", mdb.HASH, kit.MDB_HASH, arg)
m.PushAction(mdb.REMOVE)
}},

View File

@ -10,13 +10,11 @@ import (
func _user_login(m *ice.Message, name, word string) (ok bool) {
if m.Richs(USER, nil, name, nil) == nil {
_user_create(m, name, "")
_user_create(m, name, word)
}
m.Richs(USER, nil, name, func(key string, value map[string]interface{}) {
if kit.Format(value[PASSWORD]) == "" {
ok, value[PASSWORD] = true, word
} else if value[PASSWORD] == word {
if value[PASSWORD] == word {
ok = true
}
})
@ -27,26 +25,31 @@ func _user_create(m *ice.Message, name, word string) {
USERNAME, name, PASSWORD, word,
USERNICK, name, USERZONE, m.Option(ice.MSG_USERZONE),
))
m.Log_CREATE(USERNAME, name, kit.MDB_HASH, h)
m.Log_CREATE(USER_CREATE, name, kit.MDB_HASH, h)
m.Event(USER_CREATE, name)
}
func _user_search(m *ice.Message, kind, name, text string, arg ...string) {
if kind != USER {
return
}
m.Richs(USER, nil, kit.MDB_FOREACH, func(key string, val map[string]interface{}) {
if name != "" && name != val[USERNAME] {
func _user_remove(m *ice.Message, name string) {
m.Cmdy(mdb.DELETE, USER, "", mdb.HASH, USERNAME, name)
m.Log_REMOVE(USER_REMOVE, name, kit.MDB_HASH, kit.Hashs(name))
m.Event(USER_REMOVE, name)
}
func _user_search(m *ice.Message, kind, name, text string) {
m.Richs(USER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
value = kit.GetMeta(value)
if name != "" && name != value[USERNAME] {
return
}
m.PushSearch(kit.SSH_CMD, USER, kit.MDB_TYPE, kit.Format(UserRole(m, val[USERNAME])),
kit.MDB_NAME, kit.Format(val[USERNICK]), kit.MDB_TEXT, kit.Format(val[USERNAME]), val)
m.PushSearch(kit.SSH_CMD, USER, kit.MDB_TYPE, kit.Format(UserRole(m, value[USERNAME])),
kit.MDB_NAME, kit.Format(value[USERNICK]), kit.MDB_TEXT, kit.Format(value[USERNAME]), value)
})
}
func UserRoot(m *ice.Message) {
ice.Info.PassWord = kit.Hashs("uniq")
ice.Info.PassWord = ice.Info.UserName
_user_create(m, ice.Info.UserName, ice.Info.PassWord)
func UserZone(m *ice.Message, username interface{}) (zone string) {
m.Richs(USER, nil, kit.Format(username), func(key string, value map[string]interface{}) {
value = kit.GetMeta(value)
zone = kit.Format(value[USERZONE])
})
return
}
func UserNick(m *ice.Message, username interface{}) (nick string) {
m.Richs(USER, nil, kit.Format(username), func(key string, value map[string]interface{}) {
@ -55,36 +58,38 @@ func UserNick(m *ice.Message, username interface{}) (nick string) {
})
return
}
func UserZone(m *ice.Message, username interface{}) (zone string) {
m.Richs(USER, nil, kit.Format(username), func(key string, value map[string]interface{}) {
value = kit.GetMeta(value)
zone = kit.Format(value[USERZONE])
})
return
}
func UserRole(m *ice.Message, username interface{}) (role string) {
if role = VOID; username == ice.Info.UserName {
return ROOT
}
m.Richs(ROLE, nil, TECH, func(key string, value map[string]interface{}) {
value = kit.GetMeta(value)
if kit.Value(value, kit.Keys(USER, username)) == true {
if kit.Value(kit.GetMeta(value), kit.Keys(USER, username)) == true {
role = TECH
}
})
return
}
func UserRoot(m *ice.Message) {
ice.Info.PassWord = kit.Hashs("uniq")
ice.Info.PassWord = ice.Info.UserName
_user_create(m, ice.Info.UserName, ice.Info.PassWord)
}
func UserLogin(m *ice.Message, username, password string) bool {
if _user_login(m, username, password) {
m.Option(ice.MSG_USERNAME, username)
m.Option(ice.MSG_USERNICK, UserNick(m, username))
m.Option(ice.MSG_USERROLE, UserRole(m, username))
m.Log_AUTH(USERROLE, m.Option(ice.MSG_USERROLE), USERNICK, m.Option(ice.MSG_USERNICK), USERNAME, m.Option(ice.MSG_USERNAME), PASSWORD, strings.Repeat("*", len(password)))
m.Log_AUTH(
USERNICK, m.Option(ice.MSG_USERNICK, UserNick(m, username)),
USERROLE, m.Option(ice.MSG_USERROLE, UserRole(m, username)),
USERNAME, m.Option(ice.MSG_USERNAME, username),
PASSWORD, strings.Repeat("*", len(password)),
)
return true
}
return false
}
const (
INVITE = "invite"
)
const (
AVATAR = "avatar"
GENDER = "gender"
@ -95,13 +100,18 @@ const (
COUNTRY = "country"
PROVINCE = "province"
LANGUAGE = "language"
USER_CREATE = "user.create"
)
const (
INVITE = "invite"
USERZONE = "userzone"
USERNICK = "usernick"
USERROLE = "userrole"
USERNAME = "username"
PASSWORD = "password"
)
const (
USER_CREATE = "user.create"
USER_REMOVE = "user.remove"
)
const USER = "user"
func init() {
@ -110,20 +120,32 @@ func init() {
USER: {Name: USER, Help: "用户", Value: kit.Data(kit.MDB_SHORT, USERNAME)},
},
Commands: map[string]*ice.Command{
USER: {Name: "user username auto", Help: "用户", Action: map[string]*ice.Action{
USER: {Name: "user username auto create", Help: "用户", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create userrole=void,tech username password", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_user_create(m, m.Option(USERNAME), m.Option(PASSWORD))
_role_user(m, m.Option(USERROLE), m.Option(USERNAME))
}},
ROLE: {Name: "role userrole=void,tech", Help: "角色", Hand: func(m *ice.Message, arg ...string) {
_role_user(m, m.Option(USERROLE), m.Option(USERNAME))
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, USER, "", mdb.HASH, USERNAME, m.Option(USERNAME), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, USER, "", mdb.HASH, USERNAME, m.Option(USERNAME))
_user_remove(m, m.Option(USERNAME))
}},
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
_user_search(m, arg[0], arg[1], kit.Select("", arg, 2))
if arg[0] == USER {
_user_search(m, arg[0], arg[1], kit.Select("", arg, 2))
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, kit.Select(kit.Select("time,userzone,usernick,username", mdb.DETAIL, len(arg) > 0), m.Option(mdb.FIELDS)))
m.Fields(len(arg) == 0, "time,username,userzone,usernick")
m.Cmdy(mdb.SELECT, USER, "", mdb.HASH, USERNAME, arg)
m.PushAction(mdb.REMOVE)
m.Table(func(index int, value map[string]string, head []string) {
m.Push(USERROLE, UserRole(m, value[USERNAME]))
})
m.PushAction(ROLE, mdb.REMOVE)
}},
},
})

View File

@ -10,10 +10,6 @@ import (
)
func _command_search(m *ice.Message, kind, name, text string) {
if !(kind == COMMAND || kind == kit.MDB_FOREACH && name != "") {
return
}
ice.Pulse.Travel(func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
if strings.HasPrefix(key, "_") || strings.HasPrefix(key, "/") {
return
@ -67,7 +63,9 @@ func init() {
Commands: map[string]*ice.Command{
COMMAND: {Name: "command key auto", Help: "命令", Action: map[string]*ice.Action{
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
_command_search(m, arg[0], arg[1], arg[2])
if arg[0] == COMMAND {
_command_search(m, arg[0], arg[1], arg[2])
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
_command_list(m, strings.Join(arg, "."))

View File

@ -193,6 +193,8 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt
const (
WEB_LOGIN = "_login"
SSO = "sso"
)
const SERVE = "serve"

View File

@ -9,10 +9,23 @@ import (
kit "github.com/shylinux/toolkits"
)
func _header_check(m *ice.Message) {
if m.Option(web.SHARE) != "" {
switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) {
case web.LOGIN:
if m.Option(ice.MSG_SESSID) == "" {
web.Render(m, web.COOKIE, aaa.SessCreate(m, msg.Append(aaa.USERNAME)))
}
}
}
m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO)))
}
const (
TITLE = "title"
LOGIN = "login"
CHECK = "check"
TITLE = "title"
AGENT = "agent"
BACKGROUND = "background"
)
@ -28,45 +41,34 @@ func init() {
P_HEADER: {Name: "/header", Help: "标题栏", Action: map[string]*ice.Action{
LOGIN: {Name: "login", Help: "用户登录", Hand: func(m *ice.Message, arg ...string) {
if aaa.UserLogin(m, arg[0], arg[1]) {
m.Option(ice.MSG_SESSID, aaa.SessCreate(m, m.Option(ice.MSG_USERNAME), m.Option(ice.MSG_USERROLE)))
web.Render(m, web.COOKIE, m.Option(ice.MSG_SESSID))
web.Render(m, web.COOKIE, aaa.SessCreate(m, arg[0]))
}
m.Echo(m.Option(ice.MSG_USERNAME))
}},
CHECK: {Name: "check", Help: "登录检查", Hand: func(m *ice.Message, arg ...string) {
if m.Option(web.SHARE) != "" {
switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) {
case web.LOGIN:
if m.Option(ice.MSG_SESSID) == "" {
m.Option(ice.MSG_SESSID, aaa.SessCreate(m, msg.Append(aaa.USERNAME), msg.Append(aaa.USERROLE)))
web.Render(m, web.COOKIE, m.Option(ice.MSG_SESSID))
}
}
}
m.Option("sso", m.Conf(web.SERVE, "meta.sso"))
_header_check(m)
m.Echo(m.Option(ice.MSG_USERNAME))
}},
BACKGROUND: {Name: "background", Help: "背景图片", Hand: func(m *ice.Message, arg ...string) {
m.Option(BACKGROUND, m.Conf(HEADER, kit.Keym(BACKGROUND), arg[0]))
}},
AGENT: {Name: "agent", Help: "宿主机", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.chat.wx.access", "config")
}},
aaa.USERROLE: {Name: "userrole", Help: "用户角色", Hand: func(m *ice.Message, arg ...string) {
m.Echo(aaa.UserRole(m, m.Option("who")))
code.WEBPACK: {Name: "webpack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.WEBPACK, mdb.CREATE)
}},
aaa.USERNICK: {Name: "usernick", Help: "用户昵称", Hand: func(m *ice.Message, arg ...string) {
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
m.Cmdy("aaa.user", kit.MDB_ACTION, mdb.MODIFY, aaa.USERNICK, arg[0])
}},
BACKGROUND: {Name: "background", Help: "背景图片", Hand: func(m *ice.Message, arg ...string) {
m.Option(BACKGROUND, m.Conf(HEADER, BACKGROUND, arg[0]))
}},
code.WEBPACK: {Name: "webpack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.WEBPACK, mdb.CREATE)
}},
"wx": {Name: "wx", Help: "微信", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.chat.wx.access", "config")
aaa.USERROLE: {Name: "userrole", Help: "用户角色", Hand: func(m *ice.Message, arg ...string) {
m.Echo(aaa.UserRole(m, m.Option("who")))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(BACKGROUND, m.Conf(HEADER, BACKGROUND))
m.Echo(m.Conf(HEADER, TITLE))
m.Option(BACKGROUND, m.Conf(HEADER, kit.Keym(BACKGROUND)))
m.Echo(m.Conf(HEADER, kit.Keym(TITLE)))
}},
},
})

View File

@ -33,7 +33,7 @@ func init() {
m.Option(nfs.DIR_TYPE, nfs.CAT)
m.Option(nfs.DIR_DEEP, true)
for _, k := range []string{"lib", "pane", "plugin"} {
for _, k := range []string{"lib", "panel", "plugin"} {
m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) {
if strings.HasSuffix(value[kit.MDB_PATH], ".css") {
js.WriteString(`Volcanos.meta.cache["` + path.Join("/", value[kit.MDB_PATH]) + "\"] = []\n")

View File

@ -8,6 +8,7 @@ import (
"strings"
)
var OK = "ok"
var ErrWarn = "warn: "
var ErrNotLogin = "not login: "
var ErrNotRight = "not right: "

View File

@ -186,6 +186,9 @@ func (m *Message) PushAnchor(arg ...interface{}) { // [name] link
m.Push(kit.MDB_LINK, _render(m, RENDER_ANCHOR, arg...))
}
func (m *Message) PushButton(arg ...string) {
if m.Option(MSG_USERUA) == "" || strings.Contains(m.Option(MSG_USERUA), "curl") {
return
}
m.Push(kit.MDB_ACTION, _render(m, RENDER_BUTTON, strings.Join(arg, ",")))
}
func (m *Message) PushScript(arg ...string) *Message { // [type] text...
@ -243,3 +246,7 @@ func (m *Message) RenameAppend(from, to string) {
}
}
}
func (m *Message) Fields(condition bool, fields string) string {
return m.Option("fields", kit.Select(kit.Select("detail", fields, condition), m.Option("fields")))
}

View File

@ -444,7 +444,7 @@ var Index = &ice.Context{Name: LARK, Help: "机器人",
m.Option(aaa.USERZONE, LARK)
user := msg.Append("data.open_id")
web.RenderCookie(m, aaa.SessCreate(m, user, aaa.UserRole(m, user)))
web.RenderCookie(m, aaa.SessCreate(m, user))
m.Render("redirect", m.Conf(web.SHARE, "meta.domain"))
msg = m.Cmd(EMPLOYEE, m.Option(aaa.USERNAME, user))

View File

@ -50,7 +50,7 @@ var Index = &ice.Context{Name: MP, Help: "小程序",
// 用户登录
m.Option(ice.MSG_USERZONE, MP)
m.Echo(aaa.SessCreate(msg, msg.Append(OPENID), aaa.UserRole(msg, msg.Append(OPENID))))
m.Echo(aaa.SessCreate(msg, msg.Append(OPENID)))
}},
aaa.USER: {Name: "user", Help: "用户", Hand: func(m *ice.Message, arg ...string) {
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))