Compare commits

...

23 Commits

Author SHA1 Message Date
shy
555b0c66ef add some 2025-07-01 18:51:01 +08:00
shy
1b7da06a28 opt some 2025-07-01 10:21:39 +08:00
shy
2cac67d90d opt some 2025-07-01 10:08:45 +08:00
shy
4259be2fc4 opt some 2025-06-30 19:43:24 +08:00
shy
05be2c3aa5 add some 2025-06-30 19:35:55 +08:00
shy
38b327496c add some 2025-06-28 00:22:28 +08:00
shy
d51a4c41ac add some 2025-06-27 20:38:15 +08:00
shy
59151c09a4 add some 2025-06-27 17:35:15 +08:00
shy
de84c2cc36 add some 2025-06-26 22:34:54 +08:00
shy
5b5ed077f6 add some 2025-06-23 21:49:14 +08:00
shy
1e699df15a add some 2025-06-23 21:48:38 +08:00
shy
b7f54a012a add some 2025-06-20 12:08:41 +08:00
shy
a5bc647822 add some 2025-06-20 09:01:29 +08:00
shy
8a2f44832a opt some 2025-06-20 08:55:21 +08:00
shy
a76be43f0b add some 2025-06-20 08:40:23 +08:00
shy
2c8db195ac add some 2025-06-20 08:39:31 +08:00
shy
94e0b93d51 add some 2025-06-19 19:19:58 +08:00
shy
a2e5d88c83 opt some 2025-06-18 08:28:34 +08:00
shy
85c63e627c add some 2025-06-18 08:24:46 +08:00
shy
adb11e18ac add some 2025-06-17 14:54:50 +08:00
shy
eaf75a1b7a add some 2025-06-17 14:54:43 +08:00
shy
c2a4a69883 add some 2025-06-16 13:39:03 +08:00
shy
477773dbee opt some 2025-06-13 09:45:22 +08:00
60 changed files with 925 additions and 1260 deletions

View File

@ -2,5 +2,5 @@
source local.shy
return
~web.chat.macos
desktop create index web.team.gonganxitong.recent name recent icon "src/gonganxitong/credit.png"
desktop create index web.team.gonganxitong.service name service icon "src/gonganxitong/setting.png"
desktop create index web.team.gonganxitong.recent score 1000 name recent text "最近访问" icon "src/gonganxitong/credit.png"
desktop create index web.team.gonganxitong.service score 1000 name service text "服务发现" icon "src/gonganxitong/setting.png"

12
go.mod
View File

@ -3,15 +3,15 @@ module shylinux.com/x/community
go 1.21
require (
shylinux.com/x/enterprise v0.0.17
shylinux.com/x/enterprise v0.0.19
shylinux.com/x/golang-story v0.0.33
shylinux.com/x/mysql-story v0.6.33
shylinux.com/x/operation v0.0.14
shylinux.com/x/mysql-story v0.6.34
shylinux.com/x/operation v0.0.16 // indirect
)
require (
shylinux.com/x/ice v1.5.75
shylinux.com/x/icebergs v1.9.77
shylinux.com/x/ice v1.5.76
shylinux.com/x/icebergs v1.9.78
shylinux.com/x/toolkits v1.0.20
)
@ -31,8 +31,6 @@ require (
)
require (
2025-dev.shylinux.com/x/20250211-service v0.0.6 // indirect
2025-dev.shylinux.com/x/20250215-cluster v0.0.7 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/emersion/go-imap v1.2.1 // indirect

30
go.sum
View File

@ -1,8 +1,3 @@
2025-dev.shylinux.com/x/20250211-service v0.0.6 h1:FOQ6Z+eHsY+3qfIoKHjblbIs6BUyHPq1xGK1wvFdfXo=
2025-dev.shylinux.com/x/20250211-service v0.0.6/go.mod h1:iHH7uHRP7WasG19pNjujlXwZFjJqzX3dS0/T1imfsj0=
2025-dev.shylinux.com/x/20250215-cluster v0.0.6/go.mod h1:4sbNfB+nBVmIpRSzVlY+uiEQv44JdPfwwBpwWzbQktw=
2025-dev.shylinux.com/x/20250215-cluster v0.0.7 h1:GhQImaF6RbliJ6467gdeB4AVzCNyz5LwmA9AeCphEvo=
2025-dev.shylinux.com/x/20250215-cluster v0.0.7/go.mod h1:rhNacwQogLrmiNkmoptqpKY9ieRXAhVHenHwZRcdBB8=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw=
@ -195,8 +190,8 @@ modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw
modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c=
modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE=
shylinux.com/x/enterprise v0.0.17 h1:29VjNHt4YiPryQGNtVTnYqiXNHxau4EnkoUDzlxgB6Y=
shylinux.com/x/enterprise v0.0.17/go.mod h1:+DmZbYMykX5U65BJ7DYOcwFubslKa2b78DyRaqUYuH4=
shylinux.com/x/enterprise v0.0.19 h1:bdSAxhq8OAjW73P7bKmG2NNlAunGvu+bWFAz0cwtKJA=
shylinux.com/x/enterprise v0.0.19/go.mod h1:IOuzDkyqcxYV4fQiMKTjXH9OY935U7kbQNq1+LFSbjI=
shylinux.com/x/go-git/v5 v5.6.7 h1:WD5QSco7m3QooPCgdvQ6/GyGIFPun8C+hex5N41LYlk=
shylinux.com/x/go-git/v5 v5.6.7/go.mod h1:Qb0lA+uIrofZg8NQerhYcJHgGWixFqvS6p3aJ/L5Nlk=
shylinux.com/x/go-qrcode v0.0.3 h1:RMo+Vidbgq3HatLBj7DDXcTbTLFUwzis5K7TqBkD38U=
@ -204,20 +199,15 @@ shylinux.com/x/go-qrcode v0.0.3/go.mod h1:KAbtU+KwiiABMZ/CJ0zh9PI2AX82Uf9rRYcQ4O
shylinux.com/x/go-sql-mysql v0.0.2/go.mod h1:lHjRMZz5Lii6U+49fhkbCWgsnL+yux54SYJYWqASN8Y=
shylinux.com/x/golang-story v0.0.33 h1:QRu21+smDBEfEf5lczmu4T6lOZynm7LA4pys3bolo9s=
shylinux.com/x/golang-story v0.0.33/go.mod h1:/QdUqQzP/O0h3UCi29LUYv1K6beSe9sll+KlgvQJK3M=
shylinux.com/x/ice v1.5.72/go.mod h1:ouTMN0stkJu1RGAQrMHrGj/BqDynyD1VV53shR9zQm4=
shylinux.com/x/ice v1.5.73/go.mod h1:uGI73gYkk+FiJt5qmy/aYhoKRJ4wobcJk3WrPGh8Waw=
shylinux.com/x/ice v1.5.75 h1:lYsJRNaO5XAC4hX/TK3xNrCG9Mxvsr1MJVBALg3p1H4=
shylinux.com/x/ice v1.5.75/go.mod h1:94PDujxSBOYfNOgT85JoUXT1phLiMXde2i1fAup6+ZM=
shylinux.com/x/icebergs v1.9.73/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
shylinux.com/x/icebergs v1.9.75/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
shylinux.com/x/icebergs v1.9.77 h1:wkgm77t0s3M/IBQMlfwhjlYcGJo9C3ZrVHuYQtTOz8w=
shylinux.com/x/icebergs v1.9.77/go.mod h1:F0sIQU0OP3YBMdd2goC6EKAQHAKzq1I08MMIfBo0yLo=
shylinux.com/x/mysql-story v0.6.33 h1:BdJf6mtKmXsKa+AasPtVU+m7EAjVKPzVqxNap0dPQj8=
shylinux.com/x/mysql-story v0.6.33/go.mod h1:pVmBXAbOUHduFvskriplrEIfbK+kCMBxStgfgc5Rxl8=
shylinux.com/x/operation v0.0.14 h1:tS8JOJwrM6ZpO6WmvQ0Fpl4vOOx0PcyC+7eq1j5aFwY=
shylinux.com/x/operation v0.0.14/go.mod h1:QYPjnjzoWh9VMpU8GJU2wL06djzBHhZzif5nhnjJMCE=
shylinux.com/x/ice v1.5.76 h1:/nVKwbVtHUxsvuHS+2cLSL8aXAdAVX6C42MdnUrixyI=
shylinux.com/x/ice v1.5.76/go.mod h1:0EHRzIgufYwmKwlZzzUo7ZU5RZ6p0EsVYnA119G2CzM=
shylinux.com/x/icebergs v1.9.78 h1:ERGMcc25WxQ4tyNGUTj7Crx8auCJEFiDEyoJQhFyRe8=
shylinux.com/x/icebergs v1.9.78/go.mod h1:F0sIQU0OP3YBMdd2goC6EKAQHAKzq1I08MMIfBo0yLo=
shylinux.com/x/mysql-story v0.6.34 h1:Hx70Ss38WBrUnaxK2qB4uygEqFXP1oxmdLX+GrV+ra0=
shylinux.com/x/mysql-story v0.6.34/go.mod h1:yw6WkQbrFq1nwqX9konCk7jBli/JneK33zd7/p7ZxFw=
shylinux.com/x/operation v0.0.16 h1:Dx2sRv0Smef6x+7cSXf9aNU5lXX/Y4KJItvERPa91O8=
shylinux.com/x/operation v0.0.16/go.mod h1:iPPSC0wTSk5Ptg7gjRJ+dJKl8ElIlO72fPHYzP6mkwk=
shylinux.com/x/toolkits v0.7.10/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/toolkits v1.0.19/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/toolkits v1.0.20 h1:uBnfyyqDsbSWYsXfXmBugZ8ZWp5QQ8sthrzRdJ6ET90=
shylinux.com/x/toolkits v1.0.20/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/websocket v0.0.4 h1:AJpwblePoOpiE6C8NrvgNYpKTotXMLrDDX2chTvx44Q=

View File

@ -1,2 +1,2 @@
body.width1 $output div.item.card div.title span.role { margin-left:auto; }
body.width1 $output div.item.card div.title div.action { top:24px; }
// body.width1 $output div.item.card div.title div.action { top:24px; }

View File

@ -23,7 +23,8 @@ func (s allow) Create(m *ice.Message, arg ...string) {
s.SendTemplate(m, "", "", m.Trans("please allow", "权限审批 请处理"))
}
func (s allow) Remove(m *ice.Message, arg ...string) {
s.Delete(m, m.OptionSimple(model.UID, model.PLACE_UID)...)
m.Cmd(apply{}, s.Delete)
s.Delete(m.Options(model.UID, m.Option(model.ALLOW_UID)))
}
func (s allow) List(m *ice.Message, arg ...string) {
s.Tables(m, s.apply).FieldsWithCreatedAT(m, s.apply,
@ -49,7 +50,7 @@ func (s allow) List(m *ice.Message, arg ...string) {
}
m.Table(func(value ice.Maps) {
if AllowStatus(kit.Int(value[model.ALLOW_STATUS])) == AllowCreate {
m.PushButton(s.Reject, s.Approve, s.Remove)
m.PushButton(s.Reject, s.Approve)
} else {
m.PushButton()
}

View File

@ -1,8 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { var USER_PLACE_ROLE = msg.Option("_user_place_role")
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.user_name, can.onimport.textView(can, value, USER_PLACE_ROLE), can.onimport.titleAction(can, value)]},
{view: html.TITLE, list: [value.user_name, can.onimport.textView(can, value, USER_PLACE_ROLE)]},
{view: html.STATUS, list: [can.onimport.uidView(can, value), can.onimport.timeView(can, value), can.onimport.textView(can, value)]},
can.onimport.titleAction(can, value),
] })
},
})

View File

@ -9,23 +9,11 @@ import (
type city struct {
Table
order string `data:"507"`
order string `data:"602"`
role string `data:"tech"`
list string `name:"list name auto"`
list string `name:"list name auto" help:"城市管理" icon:"bi bi-buildings"`
}
func (s user) Init(m *ice.Message, arg ...string) {
cmdPortal[m.PrefixKey()] = api.GONGANXITONG_PORTAL
cmdSpace[m.PrefixKey()] = "20240724-community"
}
func (s street) Init(m *ice.Message, arg ...string) {
cmdPortal[m.PrefixKey()] = api.GONGANXITONG_PORTAL
cmdSpace[m.PrefixKey()] = "20240724-community"
}
func (s city) Init(m *ice.Message, arg ...string) {
cmdPortal[m.PrefixKey()] = api.GONGANXITONG_PORTAL
cmdSpace[m.PrefixKey()] = "20240724-community"
}
func (s city) FindOrCreateByName(m *ice.Message, arg ...string) {
if msg := m.Cmd(s, s.Select, model.NAME, arg[1]); msg.Length() == 0 {
msg := m.Cmd(s, s.Insert, model.NAME, arg[1])
@ -35,7 +23,7 @@ func (s city) FindOrCreateByName(m *ice.Message, arg ...string) {
}
}
func (s city) List(m *ice.Message, arg ...string) {
if len(arg) == 0 {
if m.Display("/plugin/table.js"); len(arg) == 0 || arg[0] == m.Option(model.PLACE_UID) {
s.Select(m)
s.SelectJoinAuth(m)
m.Table(func(value ice.Maps) {

View File

@ -20,6 +20,9 @@ type clean struct {
}
func (s clean) List(m *ice.Message, arg ...string) {
if !m.IsTech() {
return
}
m.Display("/plugin/table.js")
if len(arg) == 0 {
s.Tables.Tables(m, kit.Format("left join %s on %s = %s", s.TableNames(s.UserPlace), s.Key(s.UserPlace, s.Keys(s.Place, model.UID)), s.Key(s.Place, model.UID)))

View File

@ -46,11 +46,11 @@ type Table struct {
upload string `name:"upload" role:"worker"`
list string `name:"list place_uid uid auto" role:"void"`
pushPublic string `name:"pushPublic domain_uid*:select title* content price" role:"leader"`
marketInsert string `name:"marketInsert domain_uid*:select title* content price" style:"notice" role:"leader"`
marketInsert string `name:"marketInsert domain_uid*:select title* content price" role:"leader"`
marketPlaceInfo string `name:"marketPlaceInfo" role:"void"`
messagePlaceInfo string `name:"messagePlaceInfo" role:"void"`
sendMessage string `name:"sendMessage from_user_uid*:select to_user_uid*:select title* content price" style:"notice" role:"worker"`
userInfo string `name:"userInfo" help:"用户信息" role:"void"`
userInfo string `name:"userInfo" help:"成员信息" role:"worker"`
noticeList string `name:"noticeList" role:"void"`
memberList string `name:"memberList" role:"void"`
applyCreate string `name:"applyCreate" role:"void"`
@ -69,7 +69,8 @@ func (s Table) LoadTrans(m *ice.Message, arg ...string) {
cmd := m.Target().Commands[m.CommandKey()]
cmd.Icon = m.Resource(p)
})
if path.Dir(h) != path.Dir(p) && m.CommandKey() != web.PORTAL {
// if path.Dir(h) != path.Dir(p) && m.CommandKey() != web.PORTAL {
if path.Dir(h) != path.Dir(p) {
ice.LoadTrans(m.Spawn(kit.Dict("_template", path.Join(path.Dir(h), "portal.json"))).Message, m.CommandKey(), m.GetCommand().Command)
}
}
@ -78,7 +79,14 @@ func (s Table) Init(m *ice.Message, arg ...string) {
s.Table.Init(m, arg...)
}
func (s Table) AfterInit(m *ice.Message, arg ...string) {
m.Cmd("applications", mdb.REMOVE, kit.Hashs(","+m.PrefixKey()+","))
if m.CommandKey() == "portal" {
cmd := m.GetCommand()
m.Cmd("applications", mdb.CREATE, web.SPACE, "", ctx.INDEX, m.PrefixKey(),
mdb.NAME, kit.Select("", strings.Split(m.PrefixKey(), "."), -2)+".portal",
mdb.TEXT, cmd.Help, mdb.ICON, kit.Select(ice.Info.NodeIcon, cmd.Icon), mdb.SCORE, "10000")
} else {
m.Cmd("applications", mdb.REMOVE, kit.Hashs(","+m.PrefixKey()+","))
}
}
func (s Table) AfterMigrate(m *ice.Message, arg ...string) {
kit.If(m.GetCommand().Icon, func() { Portal{}.Show(m) })
@ -184,6 +192,9 @@ func (s Table) ValueRemove(m *ice.Message, arg ...string) {
s.RecordEventWithName(m, "")
}
func (s Table) ValueList(m *ice.Message, arg []string, fields ...ice.Any) *ice.Message {
if len(arg) == 0 {
return m
}
if len(arg) > 0 {
kit.If(len(fields) == 0, func() { fields = kit.TransArgs(kit.Split(m.Config(mdb.FIELDS), ",", ",")) })
defer m.Options(db.FIELDS, fields).Set(ice.MSG_OPTION, db.FIELDS)
@ -205,6 +216,9 @@ func (s Table) Remove(m *ice.Message, arg ...string) { s.ValueRemove(
func (s Table) List(m *ice.Message, arg ...string) *ice.Message { return s.ValueList(m, arg) }
func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
m.RewriteAppend(func(value, key string, index int) string {
if kit.HasPrefix(value, "https://meeting.tencent.com/cw/", "https://meeting.tencent.com/crm/", "https://www.bilibili.com/video/") {
return kit.Format("<iframe src='%s'></iframe>", value)
}
if value != "" && kit.IsIn(key, model.BACKGROUND, model.AVATAR) {
value = m.Resource(value)
}
@ -218,6 +232,8 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
value = MemberStatus(kit.Int(value)).String()
case model.PLACE_TYPE:
value = PlaceType(kit.Int(value)).String()
case model.USER_STATUS:
value = UserStatus(kit.Int(value)).String()
case model.AUTH_TYPE:
value = AuthType(kit.Int(value)).String()
case model.AUTH_STATUS:
@ -249,6 +265,9 @@ func (s Table) SelectJoinCity(m *ice.Message, arg ...string) *ice.Message {
kit.If(len(arg) == 0, func() { arg = append(arg, model.NAME) })
return s.SelectJoin(m, city{}, arg...)
}
func (s Table) SelectJoinToUser(m *ice.Message) *ice.Message {
return s.SelectJoinBy(m, model.TO_USER_UID, model.UID, "to_user", api.GONGANXITONG_USER, model.NAME, model.AVATAR)
}
func (s Table) SelectJoinUser(m *ice.Message, arg ...string) *ice.Message {
kit.If(len(arg) == 0, func() { arg = append(arg, model.NAME, model.AVATAR) })
if kit.IndexOf(m.Appendv(ice.MSG_APPEND), model.USER_UID) == -1 && kit.IndexOf(m.Appendv(ice.KEY), model.USER_UID) == -1 {
@ -267,27 +286,29 @@ func (s Table) SelectJoinAuth(m *ice.Message, arg ...string) *ice.Message {
return s.SelectJoin(m, s.findSpaceCmd(m, api.RENZHENGSHOUQUAN_AUTH), arg...)
}
func (s Table) SelectJoinSess(m *ice.Message, arg ...string) *ice.Message {
return s.SelectJoinBy(m, model.USER_UID, model.USER_UID, "", sess{}, kit.Split("agent,system,ua,ip,location")...)
}
func (s Table) SelectJoinService(m *ice.Message, arg ...string) *ice.Message {
kit.If(len(arg) == 0, func() { arg = append(arg, model.SPACE, model.INDEX, model.NAME, model.ICON) })
return s.SelectJoin(m, service{}, arg...)
}
func (s Table) SelectJoinRecent(m *ice.Message, PLACE_UID string, arg ...string) *ice.Message {
if m.Length() == 0 {
return m
}
UID, TARGET_UID := model.USER_UID, model.USER_UID
target := sess{}
PLACE_UID = kit.Select(model.PLACE_UID, PLACE_UID)
kit.If(len(arg) == 0, func() { arg = append(arg, model.CITY_NAME, model.STREET_NAME, model.PLACE_NAME) })
list := []string{}
m.Table(func(value ice.Maps) { list = kit.AddUniq(list, value[UID]) })
m.Table(func(value ice.Maps) { kit.If(value[PLACE_UID], func(v string) { list = kit.AddUniq(list, v) }) })
msg := m.Spawn()
arg = kit.Split("agent,system,ip,location,ua")
s.Fields(msg, append(arg, TARGET_UID)).Orders(msg, s.Desc(model.CREATED_AT)).Groups(msg, TARGET_UID).Limit(msg, 3000)
data := msg.CmdMap(target, s.SelectList, TARGET_UID, list, TARGET_UID)
s.Fields(msg, kit.JoinFields("DISTINCT place_uid", kit.JoinFields(arg...)))
recents := msg.CmdMap(recent{}, s.SelectList, model.PLACE_UID, list, model.PLACE_UID)
m.Table(func(value ice.Maps) {
recent := data[value[UID]]
recent := recents[value[PLACE_UID]]
kit.For(arg, func(k string) { m.Push(k, recent[k]) })
})
return m
}
func (s Table) SelectJoinToUser(m *ice.Message) *ice.Message {
s.SelectJoinBy(m, model.TO_USER_UID, model.UID, "to_user", api.GONGANXITONG_USER, model.NAME, model.AVATAR)
return m
}
func (s Table) SelectJoinBy(m *ice.Message, UID, TARGET_UID string, prefix string, target ice.Any, arg ...string) *ice.Message {
if m.Length() == 0 {
return m
@ -306,27 +327,6 @@ func (s Table) SelectJoinBy(m *ice.Message, UID, TARGET_UID string, prefix strin
})
return m
}
func (s Table) SelectJoinService(m *ice.Message, arg ...string) *ice.Message {
kit.If(len(arg) == 0, func() { arg = append(arg, model.NODENAME, model.INDEX, model.NAME, model.ICON) })
return s.SelectJoin(m, service{}, arg...)
}
func (s Table) SelectJoinRecent(m *ice.Message, PLACE_UID string, arg ...string) *ice.Message {
if m.Length() == 0 {
return m
}
PLACE_UID = kit.Select(model.PLACE_UID, PLACE_UID)
kit.If(len(arg) == 0, func() { arg = append(arg, model.CITY_NAME, model.STREET_NAME, model.PLACE_NAME) })
list := []string{}
m.Table(func(value ice.Maps) { kit.If(value[PLACE_UID], func(v string) { list = kit.AddUniq(list, v) }) })
msg := m.Spawn()
s.Fields(msg, kit.JoinFields("DISTINCT place_uid", kit.JoinFields(arg...)))
recents := msg.CmdMap(recent{}, s.SelectList, model.PLACE_UID, list, model.PLACE_UID)
m.Table(func(value ice.Maps) {
recent := recents[value[PLACE_UID]]
kit.For(arg, func(k string) { m.Push(k, recent[k]) })
})
return m
}
func (s Table) Update(m *ice.Message, data ice.Any, arg ...string) {
if len(arg) == 0 {
arg = append(arg, model.UID, kit.Select(m.Option(model.UID), m.Option(s.Keys(m.CommandKey(), model.UID))))
@ -408,7 +408,7 @@ func (s Table) TransRole(m *ice.Message, arg ...string) string {
return kit.Format(`<span class="role %s %s">%s</span>`, value, kit.Select("", arg, 1), role)
}
func (s Table) TransPrice(m *ice.Message, arg []string, field ...string) []string {
kit.If(len(field) == 0, func() { field = append(field, "price", "amount") })
kit.If(len(field) == 0, func() { field = append(field, model.PRICE, model.AMOUNT) })
for i := 0; i < len(arg)-1; i += 2 {
if kit.IndexOf(field, arg[i]) > -1 {
arg[i+1] = kit.Format(kit.Int(kit.Float(arg[i+1]) * 100))
@ -421,17 +421,19 @@ func (s Table) Button(m *ice.Message, info string, arg ...ice.Any) *ice.Message
return m
}
func (s Table) EchoQRCodeIcon(m *ice.Message, link, icon, title string) {
m.EchoQRCode(link).Echo(title).EchoImages(icon, "32", "avatar")
m.EchoQRCode(link).Echo(title).EchoImages(icon, "32", model.AVATAR)
}
func (s Table) Link(m *ice.Message, arg ...string) string {
return m.Cmdx(s.PrefixPortal(m), s.Link, arg)
}
func (s Table) WaitWorkerCreate(m *ice.Message, help string) {
kit.If(help == "", func() { help = m.GetCommand().Help })
kit.If(!s.IsWorker(m), func() {
kit.If(m.Action().Length() == 0, func() { m.SetResult("请等待「工作人员」创建" + help) })
})
}
func (s Table) WaitLeaderCreate(m *ice.Message, help string) {
kit.If(help == "", func() { help = m.GetCommand().Help })
kit.If(!s.IsLeader(m), func() {
kit.If(m.Action().Length() == 0, func() { m.SetResult("请等待「管理人员」创建" + help) })
})

View File

@ -8,12 +8,12 @@ import (
type domain struct {
Table
order string `data:"508"`
order string `data:"603"`
role string `data:"tech"`
fields string `name:"name,order"`
create string `name:"create name* info" role:"tech"`
remove string `name:"remove" role:"tech"`
list string `name:"list place_uid domain_uid auto" role:"void"`
list string `name:"list place_uid domain_uid auto" help:"领域管理" icon:"bi bi-grid-3x2-gap" role:"void"`
}
func (s domain) Create(m *ice.Message, arg ...string) { s.Insert(m, arg...) }
@ -24,9 +24,8 @@ func (s domain) Remove(m *ice.Message, arg ...string) {
s.Delete(m.Options(model.UID, m.Option(model.DOMAIN_UID)))
}
func (s domain) List(m *ice.Message, arg ...string) {
m.Display("/plugin/table.js")
s.Fields(m, model.UID, model.NAME, "order")
if len(arg) < 2 {
if m.Display("/plugin/table.js"); len(arg) == 0 || arg[0] == m.Option(model.PLACE_UID) {
s.Select(m).RenameAppend(model.UID, model.DOMAIN_UID).Action()
m.SortInt("order")
} else {

View File

@ -8,6 +8,8 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/gonganxitong/model"
)
type grant struct {
@ -18,10 +20,18 @@ type grant struct {
}
func (s grant) List(m *ice.Message, arg ...string) {
if m.Option(ice.FROM_DAEMON) == "" {
if m.Option(ice.FROM_DAEMON) == "" || m.Option(ice.MSG_USERUID) == "" {
m.EchoQRCode(m.MergePodCmd("", m.PrefixKey(), ice.FROM_DAEMON, m.Option(ice.MSG_DAEMON)))
m.Echo("<div>请使用微信扫码授权登录</div>")
} else {
m.EchoInfoButton("请授权登录", s.Confirm)
msg := s.spaceInfo(m)
m.Option(ice.MSG_USERUA, msg.Append(aaa.UA))
m.Options(web.ParseUA(m.Message))
m.EchoInfoButton(kit.Format("请授权登录\n\n%s %s %s\n%s",
m.Option(model.AGENT), m.Option(model.SYSTEM), msg.Append(aaa.IP),
kit.Format(web.PublicIP(m.Message, m.Option(ice.MSG_USERIP))),
), s.Confirm)
m.Option("display.style", "output")
}
kit.If(m.IsTech(), func() { m.Action(s.Header) })
}
@ -40,7 +50,7 @@ func (s grant) Confirm(m *ice.Message, arg ...string) {
defer m.ProcessOpen(msg.Append(mdb.TEXT))
m.Option(ice.MSG_USERIP, msg.Append(aaa.IP))
m.Option(ice.MSG_USERUA, msg.Append(aaa.UA))
msg := m.Cmd(s.sess, s.Create)
msg := m.Cmd(s.sess, s.Create, model.USER_UID, m.Option(ice.MSG_USERUID))
m.Cmd(web.SPACE, m.Option(ice.FROM_DAEMON), ice.MSG_SESSID, msg.Option(ice.MSG_SESSID))
m.Echo(ice.SUCCESS)
}

View File

@ -23,8 +23,11 @@ type member struct {
main string `name:"main" help:"主页" role:"void"`
setCookie string `name:"setCookie" help:"切换"`
setInfo string `name:"setInfo info" help:"备注" role:"worker"`
setScore string `name:"setScore score" help:"打分" role:"leader"`
setLanguage string `name:"setLanguage language" help:"语言" role:"worker"`
sessList string `name:"sessList" role:"leader"`
userInfo string `name:"userInfo" help:"个人主页" role:"void"`
userDisable string `name:"userDisable" help:"封号" style:"danger"`
}
func (s member) Remove(m *ice.Message, arg ...string) {
@ -50,22 +53,21 @@ func (s member) Enable(m *ice.Message, arg ...string) {
func (s member) List(m *ice.Message, arg ...string) {
USER_PLACE_ROLE := s.Keys(s.UserPlace, model.ROLE)
user_uid, isLeader, isCreator := m.Option(model.USER_UID), s.IsLeader(m), s.IsCreator(m)
s.FieldsWithCreatedAT(m, s.UserPlace, s.AS(s.Key(s.UserPlace, model.STATUS), model.MEMBER_STATUS), USER_PLACE_ROLE, model.INFO, model.USER_UID).Limit(m, 3000)
s.FieldsWithCreatedAT(m, s.UserPlace, s.AS(s.Key(s.UserPlace, model.STATUS), model.MEMBER_STATUS), USER_PLACE_ROLE, model.SCORE, model.INFO, model.USER_UID).Limit(m, 3000)
if len(arg) == 1 {
m.Cmdy(s.UserPlace, s.Select, s.Keys(s.Place, model.UID), arg[0]).Action()
defer s.Place.RewriteAppend(m)
defer m.Sort(kit.Fields(model.MEMBER_STATUS, USER_PLACE_ROLE, model.AUTH_STATUS, model.CREATED_AT))
defer m.Sort(kit.Fields(model.USER_STATUS, model.MEMBER_STATUS, USER_PLACE_ROLE, model.SCORE, model.AUTH_STATUS, model.CREATED_AT), ice.INT, ice.INT, ice.INT, ice.INT_R, ice.INT, ice.STR)
} else if len(arg) == 2 {
m.FieldsSetDetail().Cmdy(s.UserPlace, s.Select, s.Keys(s.Place, model.UID), arg[0], s.Key(s.UserPlace, model.UID), arg[1]).Action()
} else {
return
}
s.SelectJoinUser(m, model.NAME, model.INFO, model.AVATAR, model.LANGUAGE, model.AUTH_UID)
if s.IsLeader(m) {
s.SelectJoinUser(m, model.NAME, model.INFO, model.STATUS, model.AVATAR, model.LANGUAGE, model.AUTH_UID)
if s.SelectJoinAuth(m); s.IsLeader(m) {
s.SelectJoinSess(m)
s.OtherListCmd(m, s.SessList)
}
s.SelectJoinAuth(m)
m.Table(func(value ice.Maps) {
if !m.FieldsIsDetail() {
if user_uid == value[model.USER_UID] {
@ -75,6 +77,7 @@ func (s member) List(m *ice.Message, arg ...string) {
}
}
button := []ice.Any{}
defer func() { m.PushButton(button...) }()
if value[model.AUTH_UID] == "" {
if value[model.USER_UID] == user_uid {
button = append(button, s.Auth)
@ -82,6 +85,9 @@ func (s member) List(m *ice.Message, arg ...string) {
} else {
button = append(button, s.Main)
}
if isLeader {
button = append(button, s.SetScore)
}
if value[model.USER_UID] == user_uid || isLeader {
button = append(button, s.SetInfo)
}
@ -91,6 +97,12 @@ func (s member) List(m *ice.Message, arg ...string) {
if value[model.USER_UID] != user_uid && m.IsTech() {
button = append(button, s.SetCookie)
}
if value[model.USER_UID] != user_uid && m.IsTech() {
if value[model.USER_STATUS] == "1" {
} else {
button = append(button, s.UserDisable)
}
}
if MemberStatus(kit.Int(value[model.MEMBER_STATUS])) == MemberNormal {
if isCreator {
switch kit.Int(value[USER_PLACE_ROLE]) {
@ -116,7 +128,6 @@ func (s member) List(m *ice.Message, arg ...string) {
}
}
}
m.PushButton(button...)
})
s.DisplayBase(m, "").DisplayCSS("")
}
@ -135,11 +146,14 @@ func (s member) Auth(m *ice.Message, arg ...string) {
func (s member) Main(m *ice.Message, arg ...string) {
m.ProcessField(api.RENZHENGSHOUQUAN_PORTAL, []string{m.Option(model.AUTH_UID)})
}
func (s member) SetScore(m *ice.Message, arg ...string) {
m.Cmdy(s.UserPlace, s.Modify, arg)
}
func (s member) SetInfo(m *ice.Message, arg ...string) {
m.Cmdy(s.UserPlace, s.Modify, arg)
}
func (s member) UserInfo(m *ice.Message, arg ...string) {
if msg := m.Cmd(api.RENZHENGSHOUQUAN_AUTH, s.Select, model.USER_UID, m.Option(model.UID)); msg.Append(model.UID) == "" {
if msg := m.Cmd(api.RENZHENGSHOUQUAN_AUTH, s.Select, model.USER_UID, m.Option(model.TO_USER_UID)); msg.Append(model.UID) == "" {
m.ProcessHold()
} else {
m.ProcessField(api.RENZHENGSHOUQUAN_PORTAL, []string{msg.Append(model.UID)}, arg...)
@ -160,6 +174,10 @@ func (s member) SetCookie(m *ice.Message, arg ...string) {
m.Cmdy(s.UserPlace, s.Select, model.UID, m.Option(model.UID))
m.ProcessCookie(ice.MSG_USERUID, m.Append(model.USER_UID))
}
func (s member) UserDisable(m *ice.Message, arg ...string) {
msg := m.Cmd(s.UserPlace, s.Select, s.Keys(s.Place, model.UID), m.Option(model.PLACE_UID), s.Key(s.UserPlace, model.UID), m.Option(model.UID))
m.Cmdy(user{}, s.UpdateField, []string{model.STATUS, "1"}, model.UID, msg.Append(model.USER_UID))
}
func init() { ice.TeamCtxCmd(member{Tables: newTables()}) }

View File

@ -4,8 +4,11 @@ Volcanos(chat.ONIMPORT, {
can.onimport.myViewTabs(can, USER_PLACE_ROLE, msg, function(value) {
value._style = [value[USER_PLACE_ROLE], value.member_status, value.who,]
return [
{view: html.TITLE, list: [value.user_name,
can.onimport.authView(can, value), can.onimport.textView(can, value, USER_PLACE_ROLE),
{view: html.TITLE, list: [value.user_name, can.onimport.authView(can, value),
can.onimport.spaceView(can, value),
can.onimport.unitView(can, value, "score", "星"),
can.onimport.textView(can, value, USER_PLACE_ROLE),
can.onimport.textView(can, value, "user_status"),
value.member_status != "normal" && can.onimport.textView(can, value, "member_status"),
]},
value.location && {view: html.STATUS, list: [value.location, value.system]},

View File

@ -23,6 +23,7 @@ const (
USER_UID = "user_uid"
USER_NAME = "user_name"
USER_INFO = "user_info"
USER_STATUS = "user_status"
USER_ROLE = "user_role"
USER_AVATAR = "user_avatar"
USER_BACKGROUND = "user_background"
@ -267,13 +268,14 @@ type Service struct {
db.ModelWithUID
Icon string `gorm:"type:varchar(128)"`
Name string `gorm:"type:varchar(32)"`
Space string `gorm:"type:varchar(64)"`
Index string `gorm:"type:varchar(64)"`
Module string `gorm:"type:varchar(32)"`
Module string `gorm:"type:varchar(64)"`
Version string `gorm:"type:varchar(32)"`
Domain string `gorm:"type:varchar(255)"`
Portal string `gorm:"type:varchar(255)"`
Nodetype string `gorm:"type:varchar(32)"`
Nodename string `gorm:"type:varchar(32)"`
Nodename string `gorm:"type:varchar(64)"`
Pathname string `gorm:"type:varchar(255)"`
Hostname string `gorm:"type:varchar(32)"`
Status uint8 `gorm:"default:0"`

View File

@ -0,0 +1,4 @@
$output table.content.detail td:first-child { display:none; }
$output table.content.detail tr.title td:last-child { font-size:18px; }
$output table.content.detail tr.action td:last-child { text-align:right !important; }
$input tr.content div.item.content textarea { height:320px; }

View File

@ -31,13 +31,15 @@ func (s notice) Remove(m *ice.Message, arg ...string) {
func (s notice) List(m *ice.Message, arg ...string) {
if len(arg) == 1 {
s.Select(m, model.PLACE_UID, arg[0])
m.RewriteAppend(func(value, key string, index int) string {
kit.If(key == model.UPDATED_AT, func() { value = kit.Select(m.Appendv(model.CREATED_AT)[index], value) })
return value
})
m.SortStrR(model.UPDATED_AT)
} else if len(arg) == 2 {
s.SelectDetail(m, model.PLACE_UID, arg[0], model.UID, arg[1])
}
m.RewriteAppend(func(value, key string, index int) string {
kit.If(key == model.UPDATED_AT, func() { value = kit.Select(m.Appendv(model.CREATED_AT)[index], value) })
return value
}).SortStrR(model.UPDATED_AT)
s.Display(m, "").DisplayCSS("")
kit.If(s.IsLeader(m), func() {
if m.PushAction(s.Modify, s.Remove); m.Length() == 0 {
s.Button(m, "")

View File

@ -0,0 +1,8 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title, can.onimport.titleAction(can, value)]}, can.onimport.metaView(can, value),
can.onimport.contentView(can, value),
] })
},
})

View File

@ -1,31 +1,36 @@
$body.dark { --plugin-bg-color:#0d1117; --output-bg-color:#171a22; }
$body.light { --plugin-bg-color:#f2f4f8; --output-bg-color:white; --notice-bg-color:#006fff; }
// $body.light { --plugin-bg-color:#f2f4f8; --output-bg-color:white; --notice-bg-color:#006fff; background-color:#dbe7fe; }
body.light fieldset.web.team.portal>div.output>div.header { background-image:linear-gradient(#dbe7fe, var(--plugin-bg-color)); }
body.dark $output>div>div.list.mynotice>span:first-child { background-color:var(--hover-bg-color); color:yellow; white-space:pre; }
$action { width:100%; position:absolute; top:0; z-index:1; display:none; }
$action div.item { margin-right:0; height:48px; }
$action div.item input[type=button] { background-color:transparent; color:var(--notice-bg-color); height:48px; min-width:20px; padding:0 10px; }
$action { width:100%; height:48px; position:absolute; top:0; z-index:1; display:none; align-items:center; }
$action div.item { margin-right:0; margin-left:0 !important; }
$action div.item input[type=button] { background-color:transparent; color:var(--notice-bg-color); min-width:20px; padding:0 10px; }
$action div.item.danger input[type=button] { color:var(--danger-bg-color); }
$action div.item.button i { display:none; }
$action div.item.button span { display:none; }
$action div.item.button input { border:none; min-width:60px; display:unset; }
$action div.item.button input { border:none; min-width:40px; display:unset; }
$action div.item.text.filter:last-child { margin-right:10px; }
$action div.item.text.filter i { padding-left:10px; }
$action div.item.text.filter span { right:5px; }
$action div.item.text.filter input { border-radius:20px; border:none; padding-left:32px; padding-right:32px; width:100%; }
$action div.item.text.filter input:focus { border:var(--box-border); }
$action div.item.user_info img { height:32px; border-radius:20px; margin-left:10px; }
$action div.item.user_info { padding:10px; }
$action div.item.user_info>div.name { display:flex; flex-direction:column; align-items:end; }
$action div.item.user_info>div.name>span.time { font-size:10px; color:var(--label-fg-color); }
$action div.item.space { flex-grow:1; background-color:transparent; cursor:default; }
body:not(.mobile) $action div.item.place input { font-weight:bold; font-style:italic; }
body:not(.mobile) $action div.item.scanQRCode { display:none; }
fieldset>div.output>div.tabs { display:flex; }
fieldset.input.key>div.output>div.tabs { display:none; }
fieldset>div.output>div.tabs>div.item { padding:5px; line-height:20px; }
// fieldset>div.output div.item.card div.title span.role { display:none; }
fieldset.input.key>div.output>div.tabs { display:none; }
$output { background-color:var(--plugin-bg-color); }
$output>div.header { background-image:linear-gradient(var(--notice-bg-color), var(--plugin-bg-color)); height:240px; width:100%; position:absolute; left:0; }
$output>div.header img { height:100%; width:100%; object-fit:cover; }
$output>div.action>div.list { margin:0 10px; }
$output>div>div.code { margin-bottom:20px; display:flex; flex-direction:column; align-items:center; }
$output>div>div.list { border-radius:10px; background-color:var(--output-bg-color); padding:10px; margin:10px; }
$output>div>div.list>div.title { font-weight:bold; border-left:var(--box-notice3); padding-left:10px; display:flex; align-items:center; }
$output>div>div.list>div.title { font-weight:bold; border-left:var(--box-notice3); padding-left:10px; margin-bottom:10px; display:flex; align-items:center; }
$output>div>div.list>div.title span:first-child { flex-grow:1; }
$output>div>div.list>div.title div.action { overflow:hidden; }
$output>div>div.list>div.title div.action div.item { margin-right:5px; }
@ -34,7 +39,7 @@ $output>div>div.list>div.title div.action div.item.filter input:focus { width:32
$output>div>div.list>div.title div.action div.item.button.icons input { display:none; }
$output>div>div.list>div.role:not(.hide) { display:flex; align-items:center; justify-content:space-around; }
$output>div>div.list>div.role span { padding:5px; cursor:pointer; white-space:pre; }
$output>div>div.list>div.role span:not(.select) { color:gray; }
$output>div>div.list>div.role span:not(.select) { color:var(--label-fg-color); }
$output>div>div.list>div.role span.select { border-bottom:var(--box-notice); }
$output>div>div.list>div.role span.creator.select { border-bottom:var(--box-danger); }
$output>div>div.list>div.role span.landlord.select { border-bottom:var(--box-danger); }
@ -48,6 +53,7 @@ $output>div>div.list>div.output>div.item.index span { font-size:12px; white-spac
$output>div>div.list div.code { text-align:center; }
$output>div>div.list div.code input { background-color:var(--notice-bg-color); color:var(--notice-fg-color); font-size:18px; margin:auto; margin-top:10px; min-width:200px; display:block; }
$output>div>div.list fieldset.story>div.output { background-color:var(--plugin-bg-color); }
$output.public>div>div.list.myplace { position:sticky; top:0; z-index:3; }
$output>div>div.list.myplace>div.output { max-height:320px; }
$output>div>div.list.myplace>div.output>div.item>div.output div.title { margin-bottom:5px; }
$output:not(.public)>div>div.list.myplace>div.output>div.item { padding:0 10px; }
@ -65,26 +71,33 @@ $output>div.action { background-color:var(--output-bg-color); }
$output div.item.card:not(:last-child) { margin-bottom:2px; }
$output div.item.card.sticky { position:sticky; top:0; z-index:2; }
$output div.item.card.loaded { position:sticky; top:0; z-index:2; }
$output div.item.card div.title { width:100%; display:flex; align-items:center; position:relative; }
// body:not(.mobile) $output div.item.card>div.action { top:24px; }
$output fieldset.story>div.output div.place_info div.item.card>div.action { top:12px; }
$output div.item.card div.title { font-size:var(--body-font-size); width:100%; display:flex; align-items:center; position:relative; }
$output div.item.card div.title span:first-child { word-break:break-all; }
body.mobile $output div.item.card div.title span:first-child { font-weight:bold; }
$output div.item.card div.title span.type { line-height:18px; }
$output div.item.card div.title span.status { line-height:18px; }
$output div.item.card div.title span.status.已封号 { color:var(--danger-bg-color); }
$output div.item.card div.title span.price { color:var(--danger-bg-color); }
body.width1 $output div.item.card div.title span.price { margin-left:auto; }
$output div.item.card div.title span.score { background-color:var(--hover-bg-color); color:var(--danger-bg-color); padding:0 5px; }
$output div.item.card div.title span.time { color:gray; font-size:12px; position:absolute; right:0; }
$output div.item.card div.title span.time { color:gray; font-size:12px; }
body.width1 $output div.item.card div.title div.space { flex-grow:1; }
$output div.item.card div.title div.action input { margin-right:0; }
$output div.item.card div.action input { padding:0 10px; margin-left:0; margin-right:0; }
body.width1 $output div.item.card>div.action { max-width:240px; display:flex; flex-wrap:wrap; justify-content:center; }
$output div.item.card div.status span { word-break:break-all; }
$output div.item.card div.status span { word-break:break-all; color:var(--label-fg-color); }
$output div.item.card div.container div.status img { height:24px; width:24px; min-width:24px; }
$output div.item.card img { border-radius:5px; padding:0; margin:0; height:48px; width:48px; min-width:48px; object-fit:cover; }
$output div.item.card div.container { flex-grow:1; }
$output div.item.card img { border-radius:5px; padding:0; margin:0; height:40px; width:40px; min-width:40px; object-fit:cover; }
$output div.item.card img:not(:last-child) { margin-right:10px; }
$output div.item.card img:last-child { margin-left:10px; }
$output div.item.card div.container img { margin-right:0; height:100%; width:100%; }
$output div.item.card div.container>div.action { position:relative; float:right; }
// $output div.item.card div.status { font-family:monospace; }
body:not(.width1) $output div.item.card div.title>div.action { display:none; }
$output div.item.card>div.output>div { width:100%; width:calc(100% - 53px); overflow:hidden; }
body.width1 $output div.item.card>div.output>div { width:100%; width:calc(100% - 53px); overflow:hidden; }
$output div.item.card.sticky>div.output { background-color:var(--plugin-bg-color); color:var(--notice-bg-color); }
$output div.output>div.code { font-size:16px; position:relative; }
$output div.output>div.code>img { display:block; margin:10px auto; }
@ -96,11 +109,13 @@ $output div.output>div.code>img.avatar {
}
$output input[type=button][name=submit] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
$output input.notice[type=button] { background-color:transparent; color:var(--notice-bg-color); }
body:not(.mobile) $output input.notice[type=button]:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body:not(.mobile) $output input.danger[type=button]:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
$output input.danger[type=button] { color:var(--danger-bg-color); }
$output span.type { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); font-size:var(--status-font-size); line-height:18px; padding:2px 8px; }
$output span.role { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); font-size:var(--status-font-size); line-height:18px; padding:2px 8px; }
$output span.level { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); font-size:var(--status-font-size); line-height:18px; padding:2px 8px; }
$output span.status { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); font-size:var(--status-font-size); line-height:18px; padding:2px 8px; }
$output span.type { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); white-space:pre; font-size:var(--status-font-size); line-height:18px; padding:2px 8px; }
$output span.role { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); white-space:pre; font-size:var(--status-font-size); line-height:18px; padding:2px 8px; }
$output span.level { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); white-space:pre; font-size:var(--status-font-size); line-height:18px; padding:2px 8px; }
$output span.status { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); white-space:pre; font-size:var(--status-font-size); line-height:18px; padding:2px 8px; }
$output span.type.danger { color:var(--danger-bg-color); }
$output span.role.danger { color:var(--danger-bg-color); }
$output span.level.danger { color:var(--danger-bg-color); }
@ -111,6 +126,8 @@ $output table.content td.action input.icons { display:unset; }
$output table.content.detail input { border:none; }
$output table.content.detail thead { display:none; }
$output table.content.detail tr.uid { display:none; }
$output table.content.detail tr.title { font-weight:bold; }
body.mobile $output table.content.detail tr.title td:last-child { font-weight:bold; }
$output table.content.detail tr.action i { display:none; }
$output table.content.detail tr.action input.icons { display:unset; }
$output table.content.detail tr.action input[type=button] { padding:0 10px; margin-right:0; }
@ -120,19 +137,48 @@ $output div.head div.item.card div.title div.item.button i { display:none; }
$output div.tabs { height:32px; display:flex; position:unset; }
$output div.tabs span { padding:5px 10px; }
$output div.tabs span.select { background-color:var(--output-bg-color); color:var(--hover-fg-color); }
$output div.item.title { border-left:var(--box-notice3); background-color:var(--plugin-bg-color); padding:10px; margin-left:10px; }
$output div.item.title { border-left:var(--box-notice3); background-color:var(--plugin-bg-color); padding:0; padding-left:10px; margin:10px; }
$output div.item.title.noteList { border-left:var(--box-danger3); }
$output div.item.title.fileList { border-left:var(--box-danger3); }
$output div.item.title.meetList { border-left:var(--box-danger3); }
$output div.item.title.dealList { border-left:var(--box-danger3); }
$output div.item.title div.action div.item.notice input { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
$output fieldset.story>div.output { background-color:var(--plugin-bg-color); }
$output fieldset.story>div.output>div.tabs { background-color:var(--plugin-bg-color); display:flex; overflow:auto; position:sticky; top:0; z-index:2; }
$output fieldset.story>div.output>div.tabs>div.item { white-space:pre; line-height:22px; padding:5px; }
$output fieldset.story>div.output>div.tabs>div.item.all { position:sticky; left:0; z-index:1; }
$output fieldset.story>div.output>div.tabs>div.item.select { border-top:var(--box-notice); background-color:var(--output-bg-color); }
$output fieldset.story>div.output>div.tabs>div.item.select { position:sticky; right:0; }
$output fieldset.story>div.output>div.tabs>div.item.danger.select { border-top:var(--box-danger); background-color:var(--output-bg-color); }
$output fieldset.story>div.output>div.tabs.multi { flex-direction:column; height:unset; }
$output fieldset.story>div.output>div.tabs { height:unset; }
$output fieldset.story>div.output>div.tabs { line-height:32px; background-color:var(--plugin-bg-color); display:flex; overflow:auto; position:sticky; top:0; z-index:2; }
$output fieldset.story>div.output>div.tabs div.tabs { height:32px; }
$output fieldset.story>div.output>div.tabs.wrap { height:unset; max-height:320px; flex-direction:column; }
$output fieldset.story>div.output>div.tabs.wrap div.tabs { border-bottom:var(--box-border); height:unset; flex-direction:column; }
$output fieldset.story>div.output>div.tabs div.item { white-space:pre; line-height:22px; padding:5px 10px; }
$output fieldset.story>div.output>div.tabs div.item:not(.select) { color:var(--label-fg-color); }
$output fieldset.story>div.output>div.tabs div.item.all { position:sticky; left:0; top:0; z-index:1; }
$output fieldset.story>div.output>div.tabs div.item.select { border-top:var(--box-notice); background-color:var(--output-bg-color); }
$output fieldset.story>div.output>div.tabs.wrap div.item.select {
border-top:none !important;
border-left: var(--box-notice);
background-color:var(--output-bg-color);
}
$output fieldset.story>div.output>div.tabs.wrap div.item.danger.select {
border-left: var(--box-danger);
}
$output fieldset.story>div.output>div.tabs div.item.select:not(.all) { position:sticky; }
$output fieldset.story>div.output>div.tabs div.item.danger.select { border-top:var(--box-danger); background-color:var(--output-bg-color); }
$output fieldset.story>div.output>div.tabs div.item.wrap { text-align:center; padding:5px 10px; position:sticky; right:0; bottom:0; }
$output fieldset.story>div.output>div.tabs div.item.wrap:not(:hover) { color:var(--notice-bg-color) !important; }
body.mobile $output fieldset.story>div.output>div.tabs div.item.select { font-weight:bold; }
body:not(.mobile) $output fieldset.story>div.output>div.tabs div.item.all:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body:not(.mobile) $output fieldset.story>div.output>div.tabs div.item.wrap:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
$output fieldset.story.otherList>div.output>div.todo { display:none; }
$output fieldset.story>div.output>div.todo { padding:5px 10px 20px; }
$output fieldset.story>div.output>div.todo>div.item { display:flex; align-items:center; justify-content:center; flex-grow:1; }
$output fieldset.story>div.output>div.todo>div.item span { display:none; }
$output fieldset.story>div.output>div.todo>div.item input { width:100%; }
body.mobile $output fieldset.story>div.output div.item.card input[name=approve] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body.mobile $output fieldset.story>div.output div.item.card input[name=process] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body.mobile $output fieldset.story>div.output div.item.card input[name=finish] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
$output fieldset.story>div.output>div.todo>div.item.notice input { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body:not(.mobile) $output fieldset.story>div.output>div.todo>div.item.notice input:hover { background-color:var(--hover-bg-color); color:var(--notice-bg-color); }
$output>fieldset.market div.tabs { display:flex; width:100%; overflow:auto; height:30px; position:sticky; top:0; z-index:1; }
$output>fieldset.market div.tabs>div.item { padding:5px 10px; float:left; white-space:pre; }
$output>fieldset.market div.tabs>div.item.select { border-top:var(--box-danger); background-color:var(--output-bg-color); color:var(--danger-bg-color); font-weight:bold; position:sticky; left:0; right:0; }
@ -154,8 +200,15 @@ $output fieldset.story>form.option { display:none; }
$output fieldset.story>div.action { display:none; }
$output fieldset.story>div.status { display:none; }
$output fieldset.story>div.output { background-color:var(--plugin-bg-color); }
$output fieldset.story>div.output>div.place_info { position:sticky; top:0; z-index:3; }
$output fieldset.story>div.output table.content td { box-shadow:none; }
$output fieldset.story>div.output table.content.detail td:last-child { text-align:left; }
$output fieldset.story>div.output table.content.detail td:first-child { background-color:unset; color:var(--label-fg-color); }
$output fieldset.story>div.output table.content.detail tr.action { background-color:var(--output-bg-color); }
body:not(.mobile) $output fieldset.story>div.output table.content.detail tr.action:hover { background-color:var(--hover-bg-color); }
$output fieldset.story>div.output table.content.detail tr.action td.action { background-color:unset; }
$output fieldset.story>div.output table.content.detail tr.action td.action { background-color:unset; }
body:not(.mobile) $output fieldset.story>div.output table.content.detail tr.action td.action input:not(:hover) { background-color:unset; }
$output fieldset.story>div.output table.content td img { max-width:100%; }
$output fieldset.story>div.output table.content tr.icon td img { max-height:128px; max-width:128px; }
$output fieldset.story>div.output table.content tr.user_avatar td img { max-height:128px; max-width:128px; }
@ -166,20 +219,22 @@ $output fieldset.story>div.output>div.code>input[type=button].danger { border:va
$output fieldset.story>div.output>div.code div.item.button { margin-top:20px; }
$output fieldset.story>div.output>div.code div.item.button input[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); font-size:18px; min-width:240px; height:36px; }
$output fieldset.story>div.output>div.code div.item.button input[type=button][name=cancel] { border:var(--box-border); background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
// $output fieldset.story.profile>div.output div.item.card div.action { top:18px; }
// body:not(.width1) $output fieldset.story>div.output div.item.card div.action { top:28px; right:10px; }
$output fieldset.story>div.output>div.code div.item.button.danger input[type=button] { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
$output fieldset.story>div.output>div.info>input[type=button] { box-shadow:var(--box-shadow); border:none; background-color:var(--notice-bg-color); color:var(--notice-fg-color); font-size:20px; height:48px; width:100%; max-width:320px; }
$output fieldset.story>div.output>div.info { padding:10px 20px; text-align:center; }
$output fieldset.story>div.output>div.info { padding:10px 20px; text-align:center; white-space:pre; }
$output>fieldset.story>div.output div.item.card>div.output { padding:10px; width:100%; }
body:not(.mobile) $output>fieldset.story>div.output div.item.card>div.output:hover { background-color:var(--hover-bg-color); }
$output>fieldset.story>div.output div.item.card>div.output div.output { padding:5px 0; white-space:pre-line; }
$output>fieldset.story>div.output div.item.card.loaded>div.output { background-color:var(--plugin-bg-color); }
$output fieldset.story.form>div.output>div.code>input[type=button] { font-size:18px; margin:10px; height:36px; }
$output>fieldset.story.web.team.credit>div.output>div.code { margin-top:64px; }
$output fieldset.story.web.team.dashboard.summary>div.output { min-height:64px; }
$output fieldset.story.web.team.dashboard.summary>div.output { min-height:64px; display:flex; }
$output fieldset.story.web.team.dashboard.summary>div.output>div.item { flex-grow:1; }
$output fieldset.story.web.team.production.coder>div.output { background-color:var(--output-bg-color); }
$output>fieldset.qrcode table.content td { text-align:center; }
$output>fieldset.market>div.output>div.list div.item.card img { height:48px; width:48px; min-width:48px; }
$output>fieldset.market>div.output>div.list div.item.card div.status>span.username {
color:#576b95; font-weight:bold; font-size:14px;
}
$output>fieldset.market>div.output>div.list div.item.card div.status>span.username { color:#576b95; font-weight:bold; font-size:14px; }
$output>fieldset.market>div.output>div.list div.item.card div.status>span.time { float:right; line-height:20px; }
$output>fieldset.market>div.output>div.list div.item.card div.output div.action { color:gray; font-size:14px; width:100%; max-width:100%; display:flex; justify-content:space-around; position:relative; }
$output>fieldset.market>div.output>div.list div.item.card div.output div.action i { margin-right:5px; }
@ -198,8 +253,11 @@ $body.width1 div.upload.float { display:none; }
body.width1 $action div.item.text.filter { flex-grow:1; }
body.width1 $output div.item.card div.container>div.title>span.price { margin-left:auto; }
body.width1 $output div.item.card div.container>div.title>span.status { margin-left:auto; }
body.width1 $output fieldset.story>div.output>div.place_info { min-height:68px; }
$output fieldset.story>div.output>div.place_info>div.item>div.output { background-color:var(--plugin-bg-color); }
body.width1 $output fieldset.story>div.output>div.place_info { min-height:50px; background-color:var(--output-bg-color); }
body.width1 $output fieldset.story>div.output>div.place_info div.item.card { background-color:var(--output-bg-color); }
body.width1 $output fieldset.story>div.output>div.place_info div.item.card div.output { background-color:var(--output-bg-color); }
$output fieldset.story>div.output>div.place_info>div.item>div.output { background-color:var(--output-bg-color); }
$output fieldset.story>div.output>div.place_info>div.item>div.output:hover { background-color:var(--hover-bg-color); }
$output fieldset.story>div.output>table.detail tr.created_at { display:none; }
$output fieldset.story>div.output>table.detail tr.updated_at { display:none; }
$output fieldset.story>div.output>table.detail tr.user_name { display:none; }

View File

@ -7,7 +7,9 @@ import (
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
@ -28,7 +30,7 @@ type Portal struct {
short string `data:"index"`
field string `data:"time,icons,name,index,order,enable,type,auth,role,view,init,portal"`
create string `name:"create index name icons"`
list string `name:"list place_uid index uid auto" role:"void"`
list string `name:"list place_uid index uid auto" help:"用户场景" role:"void"`
placeCreate string `name:"placeCreate city_name*:select street_name* place_name* place_type:select address" icon:"bi bi-plus-circle" role:"void"`
placeRemove string `name:"placeRemove" role:"void"`
}
@ -45,7 +47,7 @@ func (s Portal) Exit(m *ice.Message, arg ...string) {
func (s Portal) BeforeMigrate(m *ice.Message, arg ...string) {
}
func (s Portal) AfterMigrate(m *ice.Message, arg ...string) {
if name := kit.Select("", kit.Split(m.PrefixKey(), "."), -2); !m.Exists("src/" + name) {
if name := kit.Select("", kit.Split(m.PrefixKey(), "."), -2); !m.Exists(nfs.SRC + name) {
return
}
cmd := m.GetCommand()
@ -70,9 +72,8 @@ func (s Portal) Command(m *ice.Message, arg ...string) {
}
}
func (s Portal) Run(m *ice.Message, arg ...string) {
if m.Option("user.status") == "1" {
m.Option("display.style", "output")
m.Echo("用户已禁用")
if m.Option(ice.MSG_USERSTATUS) == "1" {
m.Echo("此用户已封号").Option("display.style", html.OUTPUT)
return
}
if m.Option(model.MESSAGE_UID) != "" {
@ -85,17 +86,18 @@ func (s Portal) Run(m *ice.Message, arg ...string) {
return
}
s.DisplayBase(m, "common.js")
m.Option(model.SERVICE_UID, ServiceUID(m))
m.Option(model.COMMAND_UID, CommandUID(m, arg[0]))
m.OptionDefault(model.TO_USER_UID, m.Option(model.USER_UID))
defer func() {
if kit.IndexOf(m.Appendv(ice.MSG_APPEND), model.TO_USER_UID) == -1 &&
kit.IndexOf(m.Appendv(ice.KEY), model.TO_USER_UID) == -1 {
if kit.IndexOf(m.Appendv(ice.MSG_APPEND), model.TO_USER_UID) == -1 && kit.IndexOf(m.Appendv(ice.KEY), model.TO_USER_UID) == -1 {
m.Optionv(model.TO_USER_UID, []string{})
}
}()
m.OptionDefault(model.TO_USER_UID, m.Option(model.USER_UID))
m.OptionDefault(model.TO_USER_UID, m.Option(ice.MSG_USERUID))
m.OptionDefault(model.FROM_USER_UID, m.Option(ice.MSG_USERUID))
m.Option(model.USER_UID, m.Option(ice.MSG_USERUID))
m.Option(model.PLACE_UID, m.Option(s.Keys(s.Place, model.UID)))
m.Option(model.COMMAND_UID, CommandUID(m, arg[0]))
m.OptionDefault(model.SERVICE_UID, ServiceUID(m))
m.Search(arg[0], func(key string, cmd *ice.Command) {
role := cmd.Role
if len(arg) > 1 && arg[1] == ctx.ACTION {
@ -117,11 +119,11 @@ func (s Portal) Run(m *ice.Message, arg ...string) {
if s.UserPlaceRole(m); kit.IsIn(role, "", aaa.VOID, aaa.TECH, aaa.ROOT) {
kit.If(!ctx.PodCmd(m.Message, arg) && aaa.Right(m.Message, arg), func() { m.Cmdy(arg) })
} else {
if kit.IsIn(role, "worker") {
if kit.IsIn(role, api.WORKER) {
if !m.WarnNotRight(!s.IsWorker(m)) {
m.Cmdy(arg)
}
} else if kit.IsIn(role, "leader") {
} else if kit.IsIn(role, api.LEADER) {
if !m.WarnNotRight(!s.IsLeader(m)) {
m.Cmdy(arg)
}
@ -132,38 +134,32 @@ func (s Portal) Run(m *ice.Message, arg ...string) {
if len(arg) > 0 && strings.HasSuffix(arg[0], ".portal") {
return
}
if kit.IndexOf(arg, mdb.INPUTS) == -1 {
defer func() {
if e := recover(); e != nil {
m.Info("what %v", m.FormatsMeta(nil))
}
}()
if kit.IndexOf(arg, mdb.INPUTS) == -1 && !strings.HasSuffix(kit.Select("", arg, 1), ".member") {
s.Place.RewriteAppend(m)
}
})
}
func (s Portal) List(m *ice.Message, arg ...string) {
if m.Option("user.status") == "1" {
m.Option("display.style", "output")
m.Echo("用户已禁用")
if m.Option(ice.MSG_USERSTATUS) == "1" {
m.Echo("此用户已封号").Option("display.style", html.OUTPUT)
return
}
m.OptionDefault(model.USER_UID, m.Option(ice.MSG_USERUID))
m.Option(model.USER_UID, m.Option(ice.MSG_USERUID))
if m.Option(mdb.VIEW) == mdb.TABLE || len(arg) > 0 && arg[0] == mdb.TABLE {
s.Hash.List(m, kit.Slice(arg, 1)...).PushAction(mdb.DETAIL, s.Hash.Remove).Action().SortInt(mdb.ORDER)
return
}
if m.Option(model.USER_UID) == "" {
if m.Option(ice.MSG_USERUID) == "" {
if msg := m.Cmd(s.user, s.Table.Select, model.OPEN_ID, m.Option(ice.MSG_USERNAME)); msg.Length() == 0 {
msg := m.Cmd(s.user, s.Table.Create, m.Option(ice.MSG_USERNAME), "", m.OptionDefault(ice.MSG_USERNICK, m.Option(ice.MSG_USERNAME)))
m.ProcessCookie(model.USER_UID, msg.Result())
m.ProcessCookie(ice.MSG_USERUID, msg.Result())
} else {
m.ProcessCookie(model.USER_UID, msg.Append(model.UID))
m.ProcessCookie(ice.MSG_USERUID, msg.Append(model.UID))
}
return
}
if m.Cmd(s.user, s.Table.Select, model.UID, m.Option(model.USER_UID)).Length() == 0 {
m.Cmd(s.user, s.Table.Insert, model.UID, m.Option(model.USER_UID), model.OPEN_ID, m.Option(ice.MSG_USERNAME), model.NAME, m.OptionDefault(ice.MSG_USERNICK, m.Option(ice.MSG_USERNAME)))
if m.Cmd(s.user, s.Table.Select, model.UID, m.Option(ice.MSG_USERUID)).Length() == 0 {
m.Cmd(s.user, s.Table.Insert, model.UID, m.Option(ice.MSG_USERUID), model.OPEN_ID, m.Option(ice.MSG_USERNAME), model.NAME, m.OptionDefault(ice.MSG_USERNICK, m.Option(ice.MSG_USERNAME)))
}
if m.Option(model.SERVICE_UID, ServiceUID(m)); len(arg) == 0 {
m.Cmdy(m.PrefixKey(), s.PlaceList, m.Option(model.USER_UID)).PushAction(s.PlaceRemove).Action(s.PlaceCreate)
@ -186,6 +182,7 @@ func (s Portal) List(m *ice.Message, arg ...string) {
p := kit.ExtChange(m.Resource(ctx.GetCmdFile(m.Message, m.PrefixKey())), "js")
defer func() { m.Option(ice.MSG_DISPLAY, p+","+m.Option(ice.MSG_DISPLAY)) }()
s.DisplayBase(m, "").DisplayCSS("")
m.Option("display.style", "portal")
}
func (s Portal) Create(m *ice.Message, arg ...string) {
@ -218,6 +215,9 @@ func (s Portal) Link(m *ice.Message, arg ...string) *ice.Message {
return m.Echo(p + "#" + h)
}
func (s Portal) PlaceUIDKey(m *ice.Message, arg ...string) {
m.Echo(s.Keys(s.Place, model.UID))
}
func (s Portal) PlaceCreate(m *ice.Message, arg ...string) {
m.OptionDefault(model.USER_UID, m.Option(ice.MSG_USERUID))
if s.city.FindOrCreateByName(m, arg...); m.IsErr() {

View File

@ -2,7 +2,17 @@ var UID = "uid", PLACE_UID = "place_uid", PLACE_NAME = "place_name", PLACE_TYPE
var USER_UID = "user_uid", USER_ROLE = "user_role", AUTH_UID = "auth_uid", AUTH_TYPE = "auth_type"
var TYPE = "type", ROLE = "role", STATUS = "status"
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.onappend.style(can, html.OUTPUT), can.onimport.myPortal(can, msg) },
_init: function(can, msg) {
if (can.isCmdMode()) {
can.onappend.style(can, html.OUTPUT)
} else {
can.onmotion.hidden(can, can._option)
can.onmotion.hidden(can, can._action)
can.onmotion.hidden(can, can._status)
}
can.onimport.myPortal(can, msg)
can.misc.Cookie(can, "user_uid", "")
},
qrcode: function(can, msg, avatar, target) { target = target||can.ui.output, can.onappend.board(can, msg, target)
can.page.Append(can, can.page.SelectOne(can, target, "div.code"), [{img: can.misc.Resource(can, avatar||can.ConfIcons()||can.user.info.favicon), className: "avatar"}])
},
@ -11,6 +21,7 @@ Volcanos(chat.ONIMPORT, {
value.auth_name||value._name, can.onimport.authView(can, value),
{text: [value.__type, "", [mdb.TYPE, value._type, value._type_style]]},
value._role != "visitor" && {text: [value.__role, "", [aaa.ROLE, value._role, value._role_style]]},
can.onimport.titleAction(can, value),
]},
can.onimport.shipView(can, {city_name: value.city_name, street_name: value._street, service_name: can.ConfHelp()+" "+(value.space_title||can.user.info.titles)}),
{view: html.STATUS, list: [value.auth_info||value._info]},
@ -28,8 +39,9 @@ Volcanos(chat.ONIMPORT, {
can.page.Appends(can, target||can.ui.list, [{view: html.TITLE, list: [{text: can.user.trans(can, name, help)}]}])
},
myPortal: function(can, msg) { can.sup.current = {}
// can.page.tagis(document.body, "body.width1") && (can.user.isMobile = true, can.sup.user.isMobile = true)
// can.onmotion.delay(can, function() { can.page.tagis(document.body, "body.width1") && (can.user.isMobile = true, can.sup.user.isMobile = true) }, 300)
// can.onappend.plugin(can, {index: "can.cookie"})
can.page.tagis(document.body, "body.width1") && (can.user.isMobile = true, can.sup.user.isMobile = true)
can.onmotion.delay(can, function() { can.page.tagis(document.body, "body.width1") && (can.user.isMobile = true, can.sup.user.isMobile = true) }, 300)
can.core.List(["_place_uid", "_place_name", "_place_type", "_user_place_role", "_street_name"], function(key) { can.Conf(key, msg.Option(key)) })
var PLACE_UID = can.Conf("_place_uid"), PLACE_NAME = can.Conf("_place_name"), PLACE_TYPE = can.Conf("_place_type")
var USER_PLACE_ROLE = can.Conf("_user_place_role"), STREET_NAME = can.Conf("_street_name")
@ -71,10 +83,15 @@ Volcanos(chat.ONIMPORT, {
}
msg.Length() > 0? can.run({}, [uid], function(msg) { showIndex(can._index_msg = msg) }): can.run({}, [uid], function(msg) { can.onimport.myOrder(can, can._index_msg = msg, can.ui.myorder) })
} else { can.onappend.style(can, "public", can._output), can.Conf(mdb.ICONS, msg.Option("portal_icon"))
var _msg = can.request({}); if (msg.Option(PLACE_NAME)) { _msg.Push(kit.Dict(UID, "", msg.OptionSimple(
var _msg = can.request({});
can.user.trans(can, {credit: "服务名片", member: "成员列表"})
if (msg.Option(PLACE_NAME)) { _msg.Push(kit.Dict(UID, "", msg.OptionSimple(
PLACE_UID, PLACE_NAME, PLACE_TYPE, USER_PLACE_ROLE, STREET_NAME, CITY_NAME,
"member_status", "auth_status", "auth_name", "auth_info", "auth_avatar", "auth_background", "dashboard_uid", "space_title",
))) } can.onimport.myPlace(can, _msg, can.ui.myplace)
))) }
// _msg.PushButton("credit", "member", "setting")
_msg.PushButton("credit", "member")
can.onimport.myPlace(can, _msg, can.ui.myplace)
if (_msg.Length() == 0) { can.onimport.myOrder(can, msg, can.ui.myorder) } else { showIndex(can._index_msg = msg) }
msg.Echo([msg.Option(CITY_NAME), msg.Option(STREET_NAME), msg.Option(PLACE_NAME)].join(" "))
can.misc.isDebug(can) && can.onimport.qrcode(can, msg, can.sup.current.auth_avatar)
@ -111,6 +128,7 @@ Volcanos(chat.ONIMPORT, {
var show = can.onmotion.toggle(can, target, !!value.dashboard_uid && (!value.member_status || value.member_status == "normal"))
if (can.onmotion.cache(can, function() { return value._uid }, target) || !show) { return } can.onimport.myTitle(can, "My Count", "我的数据", target)
can.onappend.plugin(can._root.Action, {width: can.ConfWidth()-40, space: "20240903-operation", index: "web.team.dashboard.summary", args: [value.dashboard_uid]}, function(sub) {
can._plugins = can._plugins||[], can._plugins.push(sub)
can.onmotion.toggle(can, target, value._count = true)
}, target)
},
@ -133,6 +151,7 @@ Volcanos(chat.ONIMPORT, {
if ((value.portal || value.public) && can.page.tagis(can._output, "div.output.public")) {
can.onimport.myTitle(can, value.index, value.name, can.ui.mylist), can.onmotion.toggle(can, can.ui.mylist, true)
can.onappend.plugin(can, {index: value.index, args: [can.sup.current._uid], width: can.ConfWidth()-40}, function(sub) {
can._plugins = can._plugins||[], can._plugins.push(sub)
sub.onimport._field = function(msg) { msg.Table(function(value) { can.onimport.myStory(can, value) }) }
sub.onexport.output = function(_sub, msg) {
_sub.onaction.carddetail = function(event, _sub, value) {
@ -144,7 +163,9 @@ Volcanos(chat.ONIMPORT, {
}
var cmd = value.index.split(".").pop()
return {view: [[html.ITEM, ctx.INDEX].concat(
value.type? [mdb.TYPE]: [], can.core.Split(value.type||""), value.role? [aaa.ROLE]: [], can.core.Split(value.role||""),
value.type? [mdb.TYPE]: [],
value.index,
can.core.Split(value.type||""), value.role? [aaa.ROLE]: [], can.core.Split(value.role||""),
value.auth, value.view,
)], style: {width: width}, list: [
can.onimport.imageView(can, value),
@ -179,8 +200,23 @@ Volcanos(chat.ONIMPORT, {
can.onmotion.delay(can, function() { can.onimport.layout(can) }, 300)
},
layout: function(can) {
can.ui.tabs && can.ui.list && can.page.styleHeight(can, can.ui.list, can.ConfHeight()-can.ui.tabs.offsetHeight)
var height = can.ConfHeight()
can.ui.tabs && (height -= can.ui.tabs.offsetHeight)
can.ui.todo && (height -= can.ui.todo.offsetHeight)
can.ui.list && can.page.styleHeight(can, can.ui.list, height)
if (can.ui.action && can.ui.output) { can.page.style(can, can.ui.output, html.HEIGHT, (can.ConfHeight()) - can.ui.action.offsetHeight) }
if (can._stacks_current && can.sup == can._stacks_current[0]) {
can.core.List(can._stacks_current.slice(1), function(p) {
p.onimport.size(p, can.ConfHeight()-can._action.offsetHeight, can.ConfWidth())
})
can.core.List(can._plugins, function(p) {
p.onimport.size(p, can.ConfHeight(), can.ConfWidth()-40)
})
} else if (!can._stacks_current) {
can.core.List(can._plugins, function(p) {
p.onimport.size(p, can.ConfHeight(), can.ConfWidth()-40)
})
}
},
})
Volcanos(chat.ONACTION, {
@ -189,6 +225,7 @@ Volcanos(chat.ONACTION, {
can.user.isMobile && can.page.style(can, sub._target, html.MAX_HEIGHT, can.page.height())
can.user.isMobile && can._root.Inputs && can._root.Inputs.appendChild(sub._target)
can.user.isMobile && can.page.style(can, can._root.Action._output, html.VISIBILITY, html.HIDDEN)
can.onaction._beforeInputs && can.onaction._beforeInputs(event, can, button, sub)
if (!can.misc.isDebug(can)) { return }
if (!can.user.isTechOrRoot(can)) { return }
sub.Option("city_name", "深圳市")
@ -211,11 +248,15 @@ Volcanos(chat.ONACTION, {
sub.Option("grade", "2024级")
},
afterInputs: function(event, can, button, sub) {
can.onaction._afterInputs && can.onaction._afterInputs(event, can, button, sub)
can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
can.user.isMobile && can.page.style(can, can._root.Action._output, html.VISIBILITY, "")
can.user.isMobile && can.page.style(can, can._root.Action._target, html.DISPLAY, "")
can.user.isMobile && can.onmotion.toggle(can, can._output, true)
},
credit: function(event, can, button) { can.onimport.myStory(can, {index: button, args: [can.sup.current._uid]}) },
member: function(event, can, button) { can.onimport.myStory(can, {index: button, args: [can.sup.current._uid]}) },
setting: function(event, can, button) { can.onimport.myStory(can, {index: button, args: [can.sup.current._uid]}) },
request: function(event, can) {
can.runAction(event, "request", [], function(msg) { if(msg.IsErr()) { return can.user.toastFailure(can, msg.Result()) }
WeixinJSBridge.invoke('getBrandWCPayRequest', msg.Table()[0], function(res) {
@ -233,13 +274,15 @@ Volcanos(chat.ONACTION, {
Volcanos(chat.ONEXPORT, {
place: function(can, value) { return can.onexport.session(can, PLACE_UID, value) },
value: function(can, value) { if (!value || !value._uid) { return } can.sup.current = value
can.onexport.index(can, can.sup.current)
can.onexport.index(can, can.sup.current, "", can.ui.myallow)
can.onexport.place(can, value._uid), can.onexport.hash(can, value._uid), can.onexport.title(can, value._name, can.ConfHelp())
can.onexport.place(can, value._uid),
// can.onexport.hash(can, value._uid),
can.onexport.title(can, value._name, can.ConfHelp())
can.onimport.myOption(can.sup)
can.page.Select(can, can.ui._target, "div.item.card.uid-"+value._uid, function(target) {
can.onmotion.select(can, can.ui._target, html.DIV_ITEM, target)
can.onmotion.scrollIntoView(can, target)
})
can.onexport.index(can, can.sup.current), can.onexport.index(can, can.sup.current, "", can.ui.myallow)
var status = !value.member_status || value.member_status == "normal"
can.ui.myinit && can.onimport.myInit(can, can._index_msg, value, can.ui.myinit)
can.ui.mycount && can.onimport.myCount(can, value, can.ui.mycount)
@ -247,7 +290,6 @@ Volcanos(chat.ONEXPORT, {
can.ui.myallow && can.onmotion.toggle(can, can.ui.myallow, can.user.isTechOrRoot(can) || status && (value._role == "creator" || parseInt(value._role) > 0 || can.page.Select(can, can.ui.myallow, "div.item.index.role."+value._role).length > 0))
can.ui.myindex && can.onmotion.toggle(can, can.ui.myindex, status)
if (!can.onmotion.cache(can, function() { return value._uid }, can.ui.header) && value.auth_background) {}
can.onimport.myOption(can.sup)
},
index: function(can, value, role, _target) { role = role||value._role
can.ui.role && can.onmotion.toggle(can, can.ui.role, value._role == "creator")

View File

@ -1,6 +1,6 @@
{
"portal": "用户场景", "placeCreate": "创建", "placeRemove": "删除",
"credit": "用户名片", "member": "组织成员", "setting": "服务配置",
"placeCreate": "创建", "placeRemove": "删除",
"credit": "服务名片", "member": "组织成员", "setting": "服务配置",
"qrcode": "场景码", "event": "事件流", "apply": "权限申请", "allow": "权限审批", "notice": "通知公告",
"market": "人民广场", "message": "消息待办", "recent": "最近访问", "service": "服务发现", "support": "客服支持",
"auth": "认证", "authCreate": "认证申请", "authCity": "城市认证", "authPersonal": "个人认证", "authService": "服务认证", "authCompany": "公司认证",
@ -11,7 +11,8 @@
"marketPlaceEnter": "进入系统", "messagePlaceEnter": "进入系统",
"applyCreate": "申请权限", "commentCreate": "评论", "applyQRCode": "邀请码",
"config": "配置", "code": "编程", "data": "数据", "cache": "缓存",
"clean": "数据清理", "domain": "领域分类",
"clean": "数据清理",
"sessList": "会话列表",
"icons": {
"qrcode": "bi bi-qr-code",
"apply": "bi bi-pencil-square",
@ -23,10 +24,7 @@
"recent": "bi bi-clock-history",
"service": "bi bi-box",
"support": "bi bi-opencollective",
"clean": "bi bi-recycle",
"user": "bi bi-recycle",
"city": "bi bi-recycle",
"domain": "bi bi-grid-3x2-gap"
"clean": "bi bi-recycle"
},
"style": {
"marketPlaceEnter": "notice",
@ -44,6 +42,7 @@
"My Place": "我的场景",
"user_uid": "用户",
"user_name": "用户昵称",
"user_status": "用户状态",
"user_info": "用户信息",
"user_avatar": "用户头像",
"user_background": "用户背景",

View File

@ -1,7 +1,10 @@
package gonganxitong
import (
"strings"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/gonganxitong/model"
@ -15,6 +18,9 @@ type qrcode struct {
role string `data:"leader"`
applyQRCode string `name:"applyQRCode" help:"邀请码" role:"void"`
placeQRCode string `name:"placeQRCode" help:"场景码" role:"void"`
scanQRCode string `name:"scanQRCode" help:"扫码" role:"void"`
enter string `name:"enter" help:"进入" role:"void"`
open string `name:"open" help:"打开" role:"void"`
}
func (s qrcode) ApplyQRCode(m *ice.Message, arg ...string) {
@ -25,6 +31,38 @@ func (s qrcode) PlaceQRCode(m *ice.Message, arg ...string) {
s.info(m, arg[0], "portal")
s.EchoQRCode(m, arg[0]).Echo(kit.JoinWord(m.Append(model.CITY_NAME), m.Append(s.Keys(s.Street, model.NAME)), m.Append(s.Keys(s.Place, model.NAME))))
}
func (s qrcode) ScanQRCode(m *ice.Message, arg ...string) {
m.FieldsSetDetail()
for i := 0; i < len(arg); i += 2 {
if arg[i] != "_origin" {
m.Push(arg[i], arg[i+1])
}
}
if strings.HasPrefix(m.Append("text"), "http") {
msg := m.Spawn()
web.ParseURL(msg.Message, m.Append("text"))
m.Push("space", msg.Option("pod"))
if strings.Contains(m.Append("text"), "#") {
ls := strings.Split(strings.Split(m.Append("text"), "#")[1], ":")
m.Push("index", ls[1])
m.Push("args", strings.TrimSuffix(kit.Join([]string{ls[0], kit.Select("", ls, 2)}, ","), ","))
} else {
m.Push("index", msg.Option("cmd"))
m.Push("args", m.Append(m.Cmdx(web.SPACE, msg.Option("pod"), msg.Option("cmd"), "placeUIDKey")))
}
m.PushAction(s.Enter, s.Open, "copyText")
} else {
m.PushAction("copyText")
}
m.EchoQRCode(m.Append("text")).Action(s.ApplyQRCode, s.PlaceQRCode, s.ScanQRCode)
m.Display("/plugin/table.js")
}
func (s qrcode) Enter(m *ice.Message, arg ...string) {
m.ProcessPodCmd(m.Option("space"), m.Option("index"), kit.Split(m.Option("args")), arg...)
}
func (s qrcode) Open(m *ice.Message, arg ...string) {
m.ProcessOpen(m.Option("text"))
}
func (s qrcode) List(m *ice.Message, arg ...string) {
s.PlaceQRCode(m, arg[0])
}
@ -39,6 +77,6 @@ func (s qrcode) info(m *ice.Message, place_uid, cmd string) *ice.Message {
m.Cmdy(s.Prefix(m, s.portal), s.portal.PlaceList, m.Option(model.USER_UID), place_uid)
m.Option(model.AUTH_AVATAR, m.Append(model.AUTH_AVATAR))
m.Cut(model.CITY_NAME, s.Keys(s.Street, model.NAME), s.Keys(s.Place, model.NAME))
m.Push(model.QRCODE_TYPE, cmd).Action(s.ApplyQRCode, s.PlaceQRCode)
m.Push(model.QRCODE_TYPE, cmd).Action(s.ApplyQRCode, s.PlaceQRCode, s.ScanQRCode)
return m
}

View File

@ -4,7 +4,10 @@ Volcanos(chat.ONIMPORT, {
if (can._stacks_root && can._stacks_root._stacks[[value.space,value.index, value.place_uid].join(",")]) { value._style.push("loaded") }
value.icons = can.misc.Resource(can, value.place_avatar||value.service_icon.split("?")[0], value.space)
return [
{view: html.TITLE, list: [value.place_name, can.onimport.authView(can, value), can.onimport.timeView(can, value)]},
{view: html.TITLE, list: [value.place_name, can.onimport.authView(can, value),
can.onimport.spaceView(can, value),
can.onimport.timeView(can, value),
]},
can.onimport.shipView(can, value),
]
}, function(event, value) { can.onaction._goback? can.onaction._goback(event, function() {

View File

@ -34,7 +34,7 @@ type service struct {
}
func ServiceUID(m *ice.Message) string {
return kit.Hashs(ice.Info.Hostname, ice.Info.Pwd, m.Prefix(web.PORTAL))
return kit.Hashs(ice.Info.HostName, ice.Info.Pwd, m.Prefix(web.PORTAL))
}
func (s service) Inputs(m *ice.Message, arg ...string) {
switch s.Table.Inputs(m, arg...); arg[0] {
@ -45,9 +45,9 @@ func (s service) Inputs(m *ice.Message, arg ...string) {
func (s service) Update(m *ice.Message, arg ...string) {
uid := ServiceUID(m)
if s.Select(m.Spawn(), model.UID, uid).Length() == 0 {
s.Insert(m, kit.Simple(model.UID, uid, model.INDEX, s.PrefixPortal(m), tcp.NODETYPE, ice.Info.NodeType, tcp.NODENAME, ice.Info.NodeName, nfs.PATHNAME, ice.Info.Pwd, tcp.HOSTNAME, ice.Info.Hostname)...)
s.Insert(m, kit.Simple(model.UID, uid, model.SPACE, ice.Info.NodeName, model.INDEX, s.PrefixPortal(m), tcp.NODETYPE, ice.Info.NodeType, tcp.NODENAME, ice.Info.NodeName, nfs.PATHNAME, ice.Info.Pwd, tcp.HOSTNAME, ice.Info.HostName)...)
}
s.Table.Update(m, kit.Dict(arg, m.OptionSimple(mdb.NAME, mdb.ICON), nfs.MODULE, ice.Info.Make.Module, nfs.VERSION, ice.Info.Make.Versions()), model.UID, uid)
s.Table.Update(m, kit.Dict(arg, m.OptionSimple(mdb.NAME, mdb.ICON), model.SPACE, ice.Info.NodeName, nfs.MODULE, ice.Info.Make.Module, nfs.VERSION, ice.Info.Make.Versions()), model.UID, uid)
m.Cmd(s.PrefixPortal(m), Portal{}.CommandUpdate, uid)
}
func (s service) Oauth(m *ice.Message, arg ...string) {
@ -124,7 +124,7 @@ func (s service) List(m *ice.Message, arg ...string) {
m.Action()
}
})
m.RenameAppend(model.NODENAME, model.SPACE, model.NODETYPE, model.SERVICE_TYPE, mdb.STATUS, model.SERVICE_STATUS)
m.RenameAppend(model.NODETYPE, model.SERVICE_TYPE, mdb.STATUS, model.SERVICE_STATUS)
s.DisplayBase(m, "")
}
func (s service) Open(m *ice.Message, arg ...string) {

View File

@ -12,10 +12,12 @@ import (
type sess struct {
Table
user user
order string `data:"605"`
role string `data:"tech"`
fields string `data:"user_uid,agent,system,location,ip,ua"`
create string `name:"create user_uid*"`
check string `name:"check" role:"void"`
list string `name:"list uid auto" role:"void"`
list string `name:"list uid auto" help:"会话管理" icon:"bi bi-people" role:"void"`
}
func (s sess) Create(m *ice.Message, arg ...string) {
@ -25,10 +27,10 @@ func (s sess) Create(m *ice.Message, arg ...string) {
m.ProcessCookie(ice.MSG_SESSID, m.Option(ice.MSG_SESSID, kit.JoinWord(web.SPACE, m.Option(ice.MSG_USERPOD), m.PrefixKey(), aaa.CHECK, m.Result())), "-2")
}
func (s sess) List(m *ice.Message, arg ...string) {
if len(arg) == 0 {
if m.Display("/plugin/table.js"); len(arg) == 0 || arg[0] == m.Option(model.PLACE_UID) {
if m.IsTech() {
s.Tables(m, user{}).FieldsWithCreatedAT(m, s, kit.Split("user_uid,name,info,avatar,background,agent,system,location,ip,ua")).Limit(m, 3000)
s.Select(m, arg...).PushAction(s.Remove).Action(s.Repair)
s.Select(m).PushAction(s.Remove).Action(s.Repair)
}
} else {
s.SelectDetail(m, s.Key(s, model.UID), arg[0])
@ -43,7 +45,7 @@ func (s sess) Check(m *ice.Message, arg ...string) {
kit.If(msg.Append(model.LANGUAGE), func(p string) { m.Option(ice.MSG_LANGUAGE, p) })
m.Option(ice.MSG_AVATAR, msg.Append(model.AVATAR))
m.Option(ice.MSG_USERUID, msg.Append(model.UID))
m.OptionDefault(model.USER_UID, msg.Append(model.UID))
// m.OptionDefault(model.USER_UID, msg.Append(model.UID))
m.Option("user.status", msg.Append(model.STATUS))
}
func (s sess) Repair(m *ice.Message, arg ...string) {

View File

@ -1,4 +1,6 @@
$output>div.item:not(.title) { border-radius:10px; margin:0 10px; }
$output>div.item:not(.title) {
// border-radius:10px;
margin:0 10px; }
$output>div.item { background-color:var(--output-bg-color); padding:10px; margin:10px; display:flex; align-items:center; }
$output>div.item span.name { flex-grow:1; }
$output>div.item span.outer { background-color:gray; border-radius:12px; padding:2px; height:24px; width:40px; display:inline-block; float:right; }
@ -6,5 +8,9 @@ $output>div.item span.inner { border-radius:10px; background-color:white; height
$output>div.item span.outer.on { background-color:var(--notice-bg-color); }
$output>div.item span.outer.on span.inner { float:right; }
$output>div.item.story i { width:40px; text-align:center; }
body:not(.mobile) $output>div.item:hover { background-color:var(--hover-bg-color); }
$output>div.item.title { margin-left:20px; }
$output>div.item.input input[type=text] { border:none; border-bottom:var(--box-border); text-align:right; flex-shrink:1; padding:0 20px; max-width:100px; }
$output>div.item.input input[type=text] { border:none; border-bottom:var(--box-border); text-align:right; flex-shrink:1; padding:0 20px; max-width:100px; }
$output>div.item.button { justify-content:center; margin:10px; height:48px; }
$output>div.item.button input[type=button] { width:100%; max-width:240px; }
$output>div.item.button.logout { }

View File

@ -2,6 +2,9 @@ package gonganxitong
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/core/chat/macos"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
@ -118,6 +121,14 @@ func (s setting) List(m *ice.Message, arg ...string) {
func init() { ice.TeamCtxCmd(setting{Table: newTable()}) }
func (s Table) HashSelect(m *ice.Message, arg ...string) {
s.Hash.Select(m, arg...)
}
func (s Table) DesktopInsert(m *ice.Message, arg ...string) {
macos.DeskAppend(m.Message, m.Option("icons"), s.PrefixPortal(m), ctx.ARGS, m.Option(model.PLACE_UID),
mdb.TEXT, m.Option("place_name"), mdb.SCORE, m.OptionDefault(mdb.SCORE, "20000"),
)
}
func (s Table) SettingCreate(m *ice.Message, arg ...string) {
m.Cmdy(s.PrefixSetting(m), s.Create, model.NAME, arg[0],
model.TYPE, kit.Select(SETTING_RADIO, arg, 1),
@ -128,6 +139,9 @@ func (s Table) SettingCreate(m *ice.Message, arg ...string) {
)
}
func (s Table) SettingSelect(m *ice.Message, arg ...string) {
m.Cmd(s.PrefixSetting(m), s.HashSelect).Table(func(value ice.Maps) {
m.Option(value[model.NAME], value["default"])
})
m.Cmd(s.PrefixSetting(m), s.Select, m.OptionSimple(model.PLACE_UID)).Table(func(value ice.Maps) {
if value[model.USER_UID] != "" && value[model.USER_UID] != m.Option(model.USER_UID) {
return
@ -149,4 +163,5 @@ const (
SETTING_ALLOW_AUTO = "setting_allow_auto"
SETTING_RADIO = "radio"
SETTING_STORY = "story"
SETTING_BUTTON = "button"
)

View File

@ -1,16 +1,39 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.page.Append(can, can._output, msg.Table(function(value) {
if (value.type == "title") {
return {view: [[html.ITEM, html.TITLE], "", can.user.trans(can, value.name, value.help)]}
}
return {view: [[html.ITEM, value.type, value.name]], list: [{text: [value.help||can.user.trans(can, value.name, null, "value.setting"), "", mdb.NAME]}, can.onimport[value.type](can, value)]}
if (value.type == "title") { return {view: [[html.ITEM, html.TITLE], "", can.user.trans(can, value.name, value.help)]} }
return {view: [[html.ITEM, value.type, value.name]], list: [{text: [can.user.trans(can, value.name, value.help, "value.setting"), "", mdb.NAME]}, can.onimport[value.type](can, value)]}
}))
can.user.trans(can, {
desktopInsert: "添加到桌面",
openAddress: "选择地址",
openLocation: "查看位置",
getLocation: "上报位置",
scan: "扫码",
portal: "进入官网",
logout: "退出登录",
})
can.core.List([
can.user.isTechOrRoot(can) && "desktopInsert",
can.user.isMobile && can.user.isWeiXin && "openAddress",
can.user.isMobile && can.user.isWeiXin && "openLocation",
can.user.isMobile && can.user.isWeiXin && "getLocation",
can.user.isMobile && can.user.isWeiXin && "scan",
"portal",
"logout",
], function(item) { if (!item) { return } typeof item == "string" && (item = {name: item})
item.type = item.type||html.BUTTON, item.onclick = function(event) {
var cb = can.onaction[item.name]; if (cb) { return cb(event, can, item.name) }
var cb = can.sup.onaction[item.name]; if (cb) { return cb(event, can.sup, item.name) }
can.runAction(event, item.name, [])
}, can.onappend.input(can, item, "", can._output)
})
if (!can.misc.isDebug(can)) { return }
can.user.isTechOrRoot(can) && can.onimport._plugin(can, {index: "can.cookie"})
localStorage.length && can.onimport._plugin(can, {index: "can.localStorage"})
sessionStorage.length && can.onimport._plugin(can, {index: "can.sessionStorage"})
// can.onimport._plugin(can, {index: "can.runtime"})
can.page.Append(can, can._output, [{text: "debug"}])
},
_plugin: function(can, value) { value.width = can.ConfWidth()-20
can.onappend.plugin(can, value, function(sub) {
@ -43,4 +66,25 @@ Volcanos(chat.ONIMPORT, {
}
}}
},
})
Volcanos(chat.ONACTION, {
desktopInsert: function(event, can, button) {
var icons = ""; can.core.List(can._stacks_current, function(p) { if (!p.current) { return } icons = p.current.icons||p.ConfIcons()||can.misc.Resource(can, can._stacks_current[0].Conf("icon"), can._stacks_current[0].Conf("space"))||icons })
can.runAction(can.request(event, {icons: icons, score: "20000"}), button, [])
},
scan: function(event, can, button) {
can.user.agent.scanQRCode(can, function(value) {
var data = can.misc.ParseURL(can, value.text)
can.onimport.myStory(can, {space: data.pod, index: data.cmd, opts: data})
can.page.Append(can, can._output, [{text: value.text, onclick: function(event) {
can.user.copy(event, can, value.text)
}}])
})
},
portal: function(event, can, button) {
can.user.open("/")
},
logout: function(event, can, button) {
if (can.user.confirm("请确认退出登录")) { can.misc.CookieSessid(can, ""), location.reload() }
},
})

View File

@ -9,9 +9,31 @@ import (
type street struct {
Table
list string `name:"list uid auto"`
order string `data:"601"`
role string `data:"tech"`
list string `name:"list uid auto" help:"街道管理" icon:"bi bi-buildings"`
}
func (s sess) Init(m *ice.Message, arg ...string) {
cmdPortal[m.PrefixKey()] = api.GONGANXITONG_PORTAL
cmdSpace[m.PrefixKey()] = "20240724-community"
}
func (s user) Init(m *ice.Message, arg ...string) {
cmdPortal[m.PrefixKey()] = api.GONGANXITONG_PORTAL
cmdSpace[m.PrefixKey()] = "20240724-community"
}
func (s domain) Init(m *ice.Message, arg ...string) {
cmdPortal[m.PrefixKey()] = api.GONGANXITONG_PORTAL
cmdSpace[m.PrefixKey()] = "20240724-community"
}
func (s city) Init(m *ice.Message, arg ...string) {
cmdPortal[m.PrefixKey()] = api.GONGANXITONG_PORTAL
cmdSpace[m.PrefixKey()] = "20240724-community"
}
func (s street) Init(m *ice.Message, arg ...string) {
cmdPortal[m.PrefixKey()] = api.GONGANXITONG_PORTAL
cmdSpace[m.PrefixKey()] = "20240724-community"
}
func (s street) FindOrCreateByName(m *ice.Message, arg ...string) {
if msg := m.Cmd(s, s.Select, model.CITY_UID, arg[1], model.NAME, arg[3]); msg.Length() == 0 {
msg := m.Cmd(s, s.Insert, model.CITY_UID, arg[1], model.NAME, arg[3])
@ -21,7 +43,7 @@ func (s street) FindOrCreateByName(m *ice.Message, arg ...string) {
}
}
func (s street) List(m *ice.Message, arg ...string) {
if len(arg) == 0 {
if m.Display("/plugin/table.js"); len(arg) == 0 || arg[0] == m.Option(model.PLACE_UID) {
s.Select(m).Table(func(value ice.Maps) {
if value[model.AUTH_UID] == "" && m.IsTech() {
m.PushButton(s.AuthCreate, s.Delete)

View File

@ -25,6 +25,9 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
}
func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
m.RewriteAppend(func(value, key string, index int) string {
if _, e := strconv.ParseInt(value, 10, 64); e != nil {
return value
}
switch key {
case model.USER_{{.Option "CLASS"}}_ROLE:
value = User{{.Option "Class"}}Role(kit.Int(value)).String()

View File

@ -18,13 +18,13 @@ import (
type user struct {
Table
setting setting
order string `data:"509"`
order string `data:"604"`
role string `data:"tech"`
template string `data:"zJjgEbfiVKgJ_eDLfvHB_lXEzitNuxwZk0UHeTsFRns"`
fields string `data:"auth_uid,open_id,language,name,info,avatar,background,status"`
create string `name:"create open_id* avatar usernick"`
modify string `name:"modify info" role:"void"`
list string `name:"list uid auto" role:"void"`
list string `name:"list uid auto" help:"用户管理" icon:"bi bi-people" role:"void"`
setCookie string `name:"setCookie" help:"切换"`
sendCookie string `name:"sendCookie" help:"授权" role:"void"`
authRemove string `name:"authRemove" help:"删除认证" role:"void"`
@ -51,10 +51,10 @@ func (s user) Remove(m *ice.Message, arg ...string) {
func (s user) List(m *ice.Message, arg ...string) {
s.Tables(m, "LEFT JOIN sesses ON users.uid = sesses.user_uid").Groups(m, "user_uid").Orders(m, s.Desc("sesses.created_at"))
s.FieldsWithCreatedAT(m, s, kit.Split("auth_uid,name,info,avatar,background,status,agent,system,location,ip,ua")).Limit(m, 3000)
if len(arg) == 0 {
if m.Display("/plugin/table.js"); len(arg) == 0 || arg[0] == m.Option(model.PLACE_UID) {
if m.IsTech() {
s.Limit(m, 3000)
s.Select(m, arg...)
s.Select(m)
m.EchoQRCode(m.MergePodCmd("", m.PrefixKey()+"/action/sendCookie", ice.FROM_DAEMON, m.Option(ice.MSG_DAEMON))).Echo("<br/>").Echo("请扫码授权")
m.StatusTimeCount(mdb.TOTAL, s.SelectTotal(m))
}
@ -73,14 +73,13 @@ func (s user) List(m *ice.Message, arg ...string) {
}
button = append(button, s.AuthRemove)
if m.IsTech() && value[model.UID] != m.Option(ice.MSG_USERUID) {
button = append(button, s.SetCookie, s.Remove)
}
if m.IsTech() {
button = append(button, s.SetCookie)
if value[model.STATUS] == "1" {
button = append(button, s.Enable)
} else {
button = append(button, s.Disable)
}
button = append(button, s.Remove)
}
})
}
@ -146,3 +145,10 @@ const (
UserEnabled UserStatus = iota
UserDisabled
)
var UserStatusList = map[UserStatus]string{
UserEnabled: "",
UserDisabled: "❌ 已封号",
}
func (s UserStatus) String() string { return UserStatusList[s] }

View File

@ -12,6 +12,6 @@ import (
func main() { print(ice.Run()) }
func init() {
ice.Info.CodeMain = "src/renzhengshouquan/portal.go"
ice.Info.NodeMain = "web.team.renzhengshouquan.portal"
ice.Info.CodeMain = "src/gonganxitong/portal.go"
ice.Info.NodeMain = "web.team.gonganxitong.portal"
}

View File

@ -1,8 +1,9 @@
package renzhengshouquan
import (
"shylinux.com/x/community/src/renzhengshouquan/model"
"shylinux.com/x/ice"
"shylinux.com/x/community/src/renzhengshouquan/model"
)
type account struct {
@ -11,20 +12,25 @@ type account struct {
auth string `data:"issued"`
role string `data:"leader,worker"`
fields string `data:"type,status,amount"`
createDefault string `name:"createDefault" help:"开通默认账户" role:"leader"`
create string `name:"create account_type*" role:"leader"`
createDefault string `name:"createDefault" role:"leader" help:"开通默认账户"`
remove string `name:"remove" role:"leader"`
recharge string `name:"recharge amount*" role:"leader" help:"充值"`
transfer string `name:"transfer amount* to_account_uid*:select" role:"leader" help:"转账"`
withdraw string `name:"withdraw amount*" role:"leader" help:"提现"`
recharge string `name:"recharge amount* title content" help:"充值" role:"leader"`
transfer string `name:"transfer amount* to_account_uid*:select title content" help:"转账" role:"leader"`
withdraw string `name:"withdraw amount* title content" help:"提现" role:"leader"`
}
func (s account) SelectDefault(m *ice.Message, arg ...string) {
s.Tables(m, Auth{}, "LEFT JOIN user_auths ON auths.uid = user_auths.auth_uid")
s.Fields(m, s.Key(s, model.UID), s.Key(Auth{}, model.NAME), s.Key(Auth{}, model.AVATAR), model.AUTH_STATUS, model.AUTH_TYPE)
s.Select(m, "user_auths.user_uid = ? AND (role = 1 OR role = 2)", arg[0])
s.authSort(m)
}
func (s account) CreateDefault(m *ice.Message, arg ...string) {
s.ValueCreate(m, arg...)
}
func (s account) List(m *ice.Message, arg ...string) {
s.ValueList(m, arg).Display("")
if m.Length() == 0 {
if s.ValueList(m, arg).Display(""); m.Length() == 0 {
m.SetResult().EchoInfoButton("请开通默认账户", s.CreateDefault)
} else {
m.PushAction(s.Recharge, s.Transfer, s.Withdraw)
@ -60,11 +66,13 @@ type AccountType int
const (
AccountDefault AccountType = iota
AccountBank
AccountWepay
)
var AccountTypeList = map[AccountType]string{
AccountDefault: "默认账户",
AccountBank: "银行账户",
AccountWepay: "微信支付",
}
func (s AccountType) String() string { return AccountTypeList[s] }

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,7 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.name, can.onimport.textView(can, value, "auth_type"), can.onimport.authView(can, value)]},
] })
},
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -53,7 +53,7 @@ func (s Auth) List(m *ice.Message, arg ...string) {
}
switch AuthStatus(kit.Int(value[model.AUTH_STATUS])) {
case AuthCreate:
button = append(button, s.Issue)
button = append(button, s.Issue, s.Delete)
case AuthIssued:
button = append(button, s.SetScore, s.Revoke)
case AuthRevoked:

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -27,10 +27,18 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
s.InputsList(m, AuthStatusList, arg...)
case model.ACCOUNT_TYPE:
s.InputsList(m, AccountTypeList, arg...)
case model.TRANSITION_TYPE:
s.InputsList(m, TransitionTypeList, arg...)
case model.FROM_UID:
if AuthType(kit.Int(m.Option(model.AUTH_TYPE))) == AuthRoot {
m.Push(arg[0], aaa.ROOT)
}
case model.FROM_ACCOUNT_UID:
m.Cmdy(account{}, "selectDefault", m.Option(model.FROM_USER_UID))
m.Display("account_inputs.js").Option("_input_args", model.UID, model.NAME, model.AVATAR)
case model.TO_ACCOUNT_UID:
m.Cmdy(account{}, "selectDefault", m.Option(model.TO_USER_UID))
m.Display("account_inputs.js").Option("_input_args", model.UID, model.NAME, model.AVATAR)
default:
s.Table.Inputs(m, arg...)
}
@ -51,6 +59,8 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
value = CertStatus(kit.Int(value)).String()
case model.TRANSITION_TYPE:
value = TransitionType(kit.Int(value)).String()
case model.TRANSITION_AMOUNT:
value = kit.Format("%.2f", kit.Float(value)/100)
}
return value
})

View File

@ -3,59 +3,61 @@ package model
import "shylinux.com/x/mysql-story/src/db"
const (
UID = "uid"
NAME = "name"
INFO = "info"
TYPE = "type"
ROLE = "role"
STATUS = "status"
AMOUNT = "amount"
SCORE = "score"
TITLE = "title"
CONTENT = "content"
AVATAR = "avatar"
BACKGROUND = "background"
USER_UID = "user_uid"
USER_AUTH_ROLE = "user_auth_role"
AUTH_UID = "auth_uid"
AUTH_NAME = "auth_name"
AUTH_INFO = "auth_info"
AUTH_TYPE = "auth_type"
AUTH_STATUS = "auth_status"
AUTH_AVATAR = "auth_avatar"
CERT_UID = "cert_uid"
CERT_STATUS = "cert_status"
ACCOUNT_TYPE = "account_type"
FROM_ACCOUNT_UID = "from_account_uid"
TO_ACCOUNT_UID = "to_account_uid"
TRANSITION_TYPE = "transition_type"
PLACE_NAME = "place_name"
STREET_NAME = "street_name"
COMPANY_UID = "company_uid"
COMPANY_NAME = "company_name"
CITY_UID = "city_uid"
CITY_NAME = "city_name"
FROM_UID = "from_uid"
FROM_USER_UID = "from_user_uid"
TO_USER_UID = "to_user_uid"
PLACE_UID = "place_uid"
VALUE_UID = "value_uid"
SERVICE_UID = "service_uid"
DASHBOARD_UID = "dashboard_uid"
STORAGE_UID = "storage_uid"
SPACE = "space"
INDEX = "index"
VALUE = "value"
PATH = "path"
NUMBER = "number"
BIRTH = "birth"
PERIOD = "period"
PERSON = "person"
AUTHOR = "author"
ADDRESS = "address"
MOBILE = "mobile"
VERIFY = "verify"
VENDOR = "vendor"
UID = "uid"
ICON = "icon"
NAME = "name"
INFO = "info"
TYPE = "type"
ROLE = "role"
STATUS = "status"
AMOUNT = "amount"
SCORE = "score"
TITLE = "title"
CONTENT = "content"
AVATAR = "avatar"
BACKGROUND = "background"
USER_UID = "user_uid"
USER_AUTH_ROLE = "user_auth_role"
AUTH_UID = "auth_uid"
AUTH_NAME = "auth_name"
AUTH_INFO = "auth_info"
AUTH_TYPE = "auth_type"
AUTH_STATUS = "auth_status"
AUTH_AVATAR = "auth_avatar"
CERT_UID = "cert_uid"
CERT_STATUS = "cert_status"
ACCOUNT_TYPE = "account_type"
FROM_ACCOUNT_UID = "from_account_uid"
TO_ACCOUNT_UID = "to_account_uid"
TRANSITION_TYPE = "transition_type"
TRANSITION_AMOUNT = "transition_amount"
PLACE_NAME = "place_name"
STREET_NAME = "street_name"
COMPANY_UID = "company_uid"
COMPANY_NAME = "company_name"
CITY_UID = "city_uid"
CITY_NAME = "city_name"
FROM_UID = "from_uid"
FROM_USER_UID = "from_user_uid"
TO_USER_UID = "to_user_uid"
PLACE_UID = "place_uid"
VALUE_UID = "value_uid"
SERVICE_UID = "service_uid"
DASHBOARD_UID = "dashboard_uid"
STORAGE_UID = "storage_uid"
SPACE = "space"
INDEX = "index"
VALUE = "value"
PATH = "path"
NUMBER = "number"
BIRTH = "birth"
PERIOD = "period"
PERSON = "person"
AUTHOR = "author"
ADDRESS = "address"
MOBILE = "mobile"
VERIFY = "verify"
VENDOR = "vendor"
)
type UserAuth struct {
@ -93,7 +95,7 @@ type Cert struct {
Verify string `gorm:"type:varchar(16)"`
}
type Account struct {
db.ModelWithUID
db.ModelContent
AuthUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32);index"`
Type uint8 `gorm:"default:0"`
@ -101,7 +103,7 @@ type Account struct {
Amount int `gorm:"default:0"`
}
type Transition struct {
db.ModelWithUID
db.ModelContent
AuthUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32);index"`
FromAccountUID string `gorm:"type:char(32);index"`

View File

@ -14,13 +14,14 @@ import (
type Portal struct {
guanlixitong.Portal
fields string `data:"name,info,avatar"`
list string `name:"list auth_uid index uid auto" help:"认证授权" role:"void"`
placeCreate string `name:"placeCreate auth_name* auth_info auth_type*:select from_uid*:select" role:"void"`
}
func (s Portal) List(m *ice.Message, arg ...string) {
defer Auth{}.authSort(m)
s.Portal.List(m, arg...)
kit.If(len(arg) == 0 && m.Length() > 0, func() { m.PushAction(s.PlaceRemove).Action() })
Auth{}.authSort(m)
}
func (s Portal) PlaceCreate(m *ice.Message, arg ...string) {
switch AuthType(kit.Int(m.Option(model.AUTH_TYPE))) {
@ -46,7 +47,7 @@ func (s Portal) PlaceList(m *ice.Message, arg ...string) *ice.Message {
s.Tables(m, s.Place).FieldsWithCreatedAT(m, s.UserPlace,
model.AUTH_UID, model.AUTH_NAME, model.AUTH_INFO, model.AUTH_AVATAR,
model.AUTH_TYPE, model.AUTH_STATUS, model.USER_AUTH_ROLE,
model.SCORE,
s.Key(s.Place, model.SCORE),
)
if len(arg) == 1 {
m.Cmdy(s.UserPlace, s.Table.Select, s.Key(s.UserPlace, model.USER_UID), arg[0])

View File

@ -1,22 +1,21 @@
{
"portal": "认证授权",
"cert": "上传证件", "auth": "认证授权", "profile": "用户名片", "account": "账户", "transition": "账单",
"authMain": "认证主页", "memberList": "成员列表", "certList": "证件列表",
"cityInfo": "城市信息", "streetInfo": "街道信息", "companyInfo": "公司信息", "personalInfo": "个人信息", "placeMain": "服务主页",
"placeMain": "服务主页", "authMain": "认证主页", "memberList": "成员列表", "certList": "证件列表",
"cityInfo": "城市信息", "streetInfo": "街道信息", "companyInfo": "公司信息", "personalInfo": "个人信息",
"issue": "认证", "revoke": "吊销", "setScore": "排序",
"admin": "管理后台",
"enter": "进入", "verify": "验证",
"admin": "管理后台",
"style": {
"issue": "notice",
"revoke": "danger",
"enter": "notice"
},
"icons": {
"cert": "https://img.icons8.com/officel/80/identification-documents--v2.png",
"auth": "https://img.icons8.com/officel/80/id-verified.png",
"account": "https://img.icons8.com/officel/80/id-verified.png",
"transition": "https://img.icons8.com/officel/80/id-verified.png",
"admin": "https://img.icons8.com/officel/80/structured-document-data.png",
"cert": "cert.png",
"auth": "auth.png",
"account": "account.png",
"transition": "transition.png",
"admin": "admin.png",
"profile": "profile.png"
},
"input": {
@ -26,6 +25,11 @@
"auth_name": "认证主体",
"auth_type": "认证类型",
"auth_status": "认证状态",
"account_type": "账户类型",
"transition_type": "流水类型",
"from_account_uid": "来自",
"to_account_uid": "转给",
"amount": "金额",
"mobile": "手机号",
"verify": "验证码",
"from_uid": "认证机构",
@ -49,11 +53,11 @@
"auth_type": {
"root": "平台",
"city": "城市",
"personal": "个人",
"service": "服务",
"company": "公司",
"school": "学校",
"street": "街道",
"school": "学校",
"company": "公司",
"service": "服务",
"personal": "个人",
"style": {
"root": "danger",
"city": "danger",
@ -62,11 +66,11 @@
"icons": {
"root": "https://img.icons8.com/officel/80/console.png",
"city": "https://img.icons8.com/officel/80/city-buildings.png",
"personal": "https://img.icons8.com/officel/80/identification-documents--v1.png",
"service": "https://img.icons8.com/officel/80/meeting-room.png",
"company": "https://img.icons8.com/officel/80/organization.png",
"street": "https://img.icons8.com/officel/80/building.png",
"school": "https://img.icons8.com/officel/80/school.png",
"street": "https://img.icons8.com/officel/80/building.png"
"company": "https://img.icons8.com/officel/80/organization.png",
"service": "https://img.icons8.com/officel/80/meeting-room.png",
"personal": "https://img.icons8.com/officel/80/identification-documents--v1.png"
}
},
"auth_status": {

View File

@ -1,5 +1,6 @@
$output>div>div.title { border-left:var(--box-notice3); padding:10px; margin-left:10px; }
$output>div>div.title { border-left:var(--box-notice3); padding-left:10px; margin:10px; }
$output>div.from>div.title { border-left:var(--box-danger3); }
$output>div.head { margin-bottom:0; }
$output>div.list { height:unset !important; }
body.width1 $output div.item.card div.title span.type { margin-left:auto; }
$output div.item.card div.title div.action { top:24px; }
$output>div.head { margin-bottom:0; }
body.width1 $output div.item.card div.title div.action { top:16px; }

View File

@ -11,6 +11,7 @@ import (
type profile struct {
Auth
order string `data:"3"`
role string `data:""`
modify string `name:"modify info" role:"leader"`
upload string `name:"upload" role:"leader"`
authList string `name:"authList" role:"void"`
@ -18,6 +19,7 @@ type profile struct {
serviceList string `name:"serviceList" role:"void"`
fromList string `name:"fromList" role:"void"`
authPersonal string `name:"authPersonal" role:"void"`
open string `name:"open" role:"void"`
}
func (s profile) Modify(m *ice.Message, arg ...string) {
@ -32,11 +34,11 @@ func (s profile) List(m *ice.Message, arg ...string) {
s.Select(m, model.UID, arg[0]).Action()
button := []ice.Any{}
name := m.Append(model.NAME)
button = append(button, s.Enter)
switch AuthType(kit.Int(m.Append(model.AUTH_TYPE))) {
case AuthService:
s.SelectJoinRecent(m, "")
s.SelectJoinService(m)
button = append(button, s.Enter)
name = kit.JoinWord(m.Append(model.CITY_NAME), m.Append(model.STREET_NAME), m.Append(model.PLACE_NAME))
case AuthCompany:
case AuthPersonal:
@ -53,7 +55,7 @@ func (s profile) AuthList(m *ice.Message, arg ...string) {
if value[model.PLACE_UID] == "" {
m.PushButton()
} else {
m.PushButton(s.Enter)
m.PushAction(s.Enter, s.Open)
}
})
s.SelectJoinRecent(m, "")
@ -87,7 +89,7 @@ func (s profile) ServiceList(m *ice.Message, arg ...string) {
s.SelectList(m, kit.Simple(model.PLACE_UID, kit.Sort(list))...)
s.SelectJoinRecent(m, "")
s.SelectJoinService(m)
m.PushAction(s.Enter)
m.PushAction(s.Enter, s.Open)
s.authSort(m)
}
func (s profile) FromList(m *ice.Message, arg ...string) {
@ -106,6 +108,11 @@ func (s profile) AuthPersonal(m *ice.Message, arg ...string) {
s.CreditCmdy(m, m.ActionKey(), arg)
}
func (s profile) Enter(m *ice.Message, arg ...string) {}
func (s profile) Open(m *ice.Message, arg ...string) {
s.Select(m, m.OptionSimple(model.UID)...)
s.SelectJoinService(m)
m.ProcessOpen(s.SpaceLink(m, m.Append(model.SPACE), m.Append(model.INDEX), m.Append(model.PLACE_UID)))
}
func init() { ice.TeamCtxCmd(profile{}) }

View File

@ -5,7 +5,9 @@ Volcanos(chat.ONIMPORT, {
can.onaction.updateBackground && can.onaction.updateBackground(event, can)
}}])
can.page.Append(can, can.ui.head, [can.onimport.itemcard(can, value, [
{view: html.TITLE, list: [value.name, can.onimport.authView(can, value), can.onimport.textView(can, value, AUTH_TYPE), can.onimport.titleAction(can, value)]},
{view: html.TITLE, list: [value.name, can.onimport.authView(can, value),
can.onimport.textView(can, value, AUTH_TYPE), can.onimport.titleAction(can, value),
]},
{view: html.STATUS, list: [value.city_name, value.street_name, value.service_name]},
{view: html.STATUS, list: [value.info]},
], function() {})])
@ -65,8 +67,8 @@ Volcanos(chat.ONACTION, {
can.onimport.myStory(can, {index: "web.team.renzhengshouquan.portal", args: [msg.Option(UID)]})
// can.user.open(can.misc.MergePodCmd(can, {pod: "20240724-community", cmd: "web.team.renzhengshouquan.admin", auth_uid: msg.Option("auth_uid"), view: "admin"}))
} else if (msg.Option("auth_type") == "service") {
can.onimport.myStory(can, {space: msg.Option("nodename"), index: msg.Option(ctx.INDEX), args: [msg.Option(PLACE_UID)]})
// can.onimport.myPlugin(can, {space: msg.Option("nodename"), index: msg.Option(ctx.INDEX), args: [msg.Option(PLACE_UID)]})
can.onimport.myStory(can, {space: msg.Option(web.SPACE), index: msg.Option(ctx.INDEX), args: [msg.Option(PLACE_UID)]})
// can.onimport.myPlugin(can, {space: msg.Option(web.SPACE), index: msg.Option(ctx.INDEX), args: [msg.Option(PLACE_UID)]})
} else {
can.onimport.myStory(can, {index: "web.team.renzhengshouquan.portal", args: [msg.Option(UID)||msg.Option(AUTH_UID)]})
}

View File

@ -0,0 +1,6 @@
$output div.item.card.充值 div.title span.price {
color:var(--notice-bg-color);
}
$output div.item.card.来自 div.title span.price {
color:var(--notice-bg-color);
}

View File

@ -2,35 +2,61 @@ package renzhengshouquan
import (
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/renzhengshouquan/model"
)
type transition struct {
Table
order string `data:"5"`
auth string `data:"issued"`
role string `data:"leader,worker"`
fields string `data:"transition_type,status,amount,from_account_uid,to_account_uid"`
create string `name:"create transition_type* amount* from_account_uid to_account_uid" role:"leader"`
remove string `name:"remove" role:"leader"`
testMarket string `name:"testMarket domain_uid*:select title* content price" style:"notice" role:"leader"`
testMessage string `name:"testMessage from_user_uid*:select to_user_uid*:select title* content price" style:"notice" role:"worker"`
testTemplate string `name:"testMessage from_user_uid*:select to_user_uid*:select title*" style:"notice" role:"worker"`
order string `data:"5"`
auth string `data:"issued"`
role string `data:"leader,worker"`
create string `name:"create transition_type* amount* title content from_account_uid to_account_uid" role:"leader"`
remove string `name:"remove" role:"leader"`
}
func (s transition) List(m *ice.Message, arg ...string) {
s.ValueList(m, arg).Display("")
m.PushAction(s.TestMessage, s.TestMarket, s.TestTemplate)
}
func (s transition) TestMarket(m *ice.Message, arg ...string) {
s.MarketInsert(m, arg...)
}
func (s transition) TestMessage(m *ice.Message, arg ...string) {
s.SendMessage(m, m.Option(model.FROM_USER_UID), m.Option(model.TO_USER_UID), arg...)
}
func (s transition) TestTemplate(m *ice.Message, arg ...string) {
s.SendTemplate(m, "", m.Option(model.TO_USER_UID), m.Option(model.TITLE))
s.Tables(m,
"LEFT JOIN accounts AS to_accounts ON to_account_uid = to_accounts.uid",
"LEFT JOIN auths AS to_auths ON to_accounts.auth_uid = to_auths.uid",
"LEFT JOIN accounts AS from_accounts ON from_account_uid = from_accounts.uid",
"LEFT JOIN auths AS from_auths ON from_accounts.auth_uid = from_auths.uid",
).FieldsWithCreatedAT(m, s,
"transition_type", "transition_status", s.Key(s, model.AMOUNT), s.Key(s, model.USER_UID),
"from_account_uid", "from_auths.uid AS from_auth_uid", "from_auth_name", "from_auth_type", "from_auth_avatar",
"to_account_uid", "to_auths.uid AS to_auth_uid", "to_auth_name", "to_auth_type", "to_auth_avatar",
)
if len(arg) == 1 {
if !s.IsWorker(m) {
return
}
s.Select(m, "to_auths.uid = ? OR from_auths.uid = ?", arg[0], arg[0])
} else {
s.Select(m, "transitions.uid = ? AND (to_auths.uid = ? OR from_auths.uid = ?)", arg[1], arg[0], arg[0])
}
m.Table(func(value ice.Maps) {
switch TransitionType(kit.Int(value["transition_type"])) {
case TransitionRecharge:
m.Push(model.NAME, value["to_auth_name"])
m.Push(model.AUTH_TYPE, value["to_auth_type"])
m.Push(model.ICON, value["to_auth_avatar"])
case TransitionTransfer:
if value["from_auth_uid"] == arg[0] {
m.Push(model.NAME, value["to_auth_name"])
m.Push(model.AUTH_TYPE, value["to_auth_type"])
m.Push(model.ICON, value["to_auth_avatar"])
} else {
m.Push(model.NAME, value["from_auth_name"])
m.Push(model.AUTH_TYPE, value["from_auth_type"])
m.Push(model.ICON, value["from_auth_avatar"])
}
case TransitionWithdraw:
m.Push(model.NAME, value["from_auth_name"])
m.Push(model.AUTH_TYPE, value["from_auth_type"])
m.Push(model.ICON, value["from_auth_avatar"])
}
}).Action().Display("").DisplayCSS("")
}
func init() { ice.TeamCtxCmd(transition{}) }

View File

@ -1,9 +1,13 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title||value.name||value.user_name, value.transition_type, value.amount, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.OUTPUT, list: [value.content||value.info]},
can.onimport.myView(can, msg, function(value) { value._style = [value.transition_type, value.transition_type == "转账"? value.from_auth_uid == can.Option("auth_uid")? "转给": "来自": ""]; return [
{view: html.TITLE, list: [value.title, value.transition_type,
value.transition_type == "转账"? value.from_auth_uid == can.Option("auth_uid")? "转给": "来自": "",
can.onimport.textView(can, value, "auth_type"),
value.transition_type == "转账"? value.name: "",
can.onimport.moneyView(can, value),
]}, can.onimport.metaView(can, value),
{view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value),
] })
},
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -1,50 +1,93 @@
{
"153c93456004ec2ca692d3bac2223167": {
"23a6afbec0ebd2ba9b0a17d2750164b8": {
"meta": {
"icon": "src/gonganxitong/setting.png",
"index": "web.team.gonganxitong.service",
"name": "service",
"time": "2025-06-12 19:25:36.343"
"icon": "src/main.jpg",
"index": "web.team.gonganxitong.portal",
"name": "gonganxitong.portal",
"score": "10000",
"text": "用户场景",
"time": "2025-06-30 12:30:46.253"
}
},
"3a5880f6ddd07eb9fe27b3cb3afb3f7e": {
"meta": {
"icon": "usr/icons/Calendar.png",
"index": "web.team.plan",
"name": "Calendar",
"time": "2024-07-28 09:35:48.803"
}
},
"adf694a4d378bcc855218c464fecb7d9": {
"meta": {
"icon": "usr/icons/Messages.png",
"index": "web.chat.message",
"name": "Messages",
"time": "2024-07-28 09:35:48.803"
}
},
"be08ca65be90feca325df128a06e440f": {
"244a33eb77dd5d13ee80be012b38246f": {
"meta": {
"icon": "src/gonganxitong/credit.png",
"index": "web.team.gonganxitong.recent",
"name": "recent",
"time": "2025-06-12 19:25:36.343"
"score": "1000",
"text": "最近访问",
"time": "2025-06-30 19:39:19.956"
}
},
"c6365efa0c8373fcf2bc8d44618ad782": {
"meta": {
"icon": "usr/icons/Books.png",
"index": "web.wiki.word",
"name": "Books",
"time": "2024-07-28 09:35:48.803"
}
},
"dc16860f819eb7f8ab85aee004508337": {
"27eb7c9991a133da605bb766447cb3ea": {
"meta": {
"icon": "usr/icons/Photos.png",
"index": "web.wiki.feel",
"name": "Photos",
"time": "2024-07-28 09:35:48.803"
"score": "3",
"text": "相册",
"time": "2025-06-30 12:26:19.373"
}
},
"2ffb4261b1ff8cc41155000ed76556f8": {
"meta": {
"icon": "src/main.jpg",
"index": "web.team.renzhengshouquan.portal",
"name": "renzhengshouquan.portal",
"score": "10000",
"text": "认证授权",
"time": "2025-06-30 12:30:48.293"
}
},
"3b1b88442481cd8978be81a83b60e01c": {
"meta": {
"icon": "usr/icons/Messages.png",
"index": "web.chat.message",
"name": "Messages",
"score": "1",
"text": "消息",
"time": "2025-06-30 12:26:19.373"
}
},
"5aa5dd75035a98b79d5c05686588903c": {
"meta": {
"icon": "usr/icons/Calendar.png",
"index": "web.team.plan",
"name": "Calendar",
"score": "2",
"text": "日历",
"time": "2025-06-30 12:26:19.373"
}
},
"61a108fa6c7e7ddb336754e2b6175249": {
"meta": {
"args": "f86ffb81cfd4d9c47f8d353ec1cdf558",
"icon": "/p/usr/avatar/b46d6716b37761dc6bddedba723b858e.jpeg?pod=20240724-community",
"index": "web.team.renzhengshouquan.portal",
"name": "portal",
"score": "20000",
"text": "云轩领航",
"time": "2025-06-30 12:42:53.300"
}
},
"b46472e8729819949e021546bd3a939e": {
"meta": {
"icon": "usr/icons/Books.png",
"index": "web.wiki.word",
"name": "Books",
"score": "4",
"text": "文档",
"time": "2025-06-30 12:26:19.373"
}
},
"b7757d41d2c386611ace3f2ef5299e07": {
"meta": {
"icon": "src/gonganxitong/setting.png",
"index": "web.team.gonganxitong.service",
"name": "service",
"score": "1000",
"text": "服务发现",
"time": "2025-06-30 19:39:19.956"
}
}
}

View File

@ -4,7 +4,8 @@
"icon": "usr/icons/Safari.png",
"index": "web.chat.iframe",
"name": "Safari",
"time": "2024-07-28 09:35:48.805"
"score": "2",
"time": "2025-06-30 12:26:19.374"
}
},
"514d8a494f087c0d549b9536c2ef3bd9": {
@ -12,7 +13,8 @@
"icon": "usr/icons/Terminal.png",
"index": "web.code.xterm",
"name": "Terminal",
"time": "2024-07-28 09:35:48.805"
"score": "5",
"time": "2025-06-30 12:26:19.375"
}
},
"a5255f07d36fc90fe78a719b0bdb943b": {
@ -20,7 +22,8 @@
"icon": "usr/icons/vimer.png",
"index": "web.code.vimer",
"name": "vimer",
"time": "2024-07-28 09:35:48.805"
"score": "3",
"time": "2025-06-30 12:26:19.374"
}
},
"ba9f11ecc3497d9993b933fdc2bd61e5": {
@ -28,7 +31,8 @@
"icon": "usr/icons/git.png",
"index": "web.code.git.status",
"name": "git",
"time": "2024-07-28 09:35:48.805"
"score": "4",
"time": "2025-06-30 12:26:19.375"
}
},
"d151508da8d36994e1635f7875594424": {
@ -36,7 +40,8 @@
"icon": "usr/icons/Finder.png",
"index": "web.chat.macos.finder",
"name": "Finder",
"time": "2024-07-28 09:35:48.804"
"score": "1",
"time": "2025-06-30 12:26:19.374"
}
}
}

View File

@ -1,4 +1,15 @@
{
"1367cc05871bb372b2c91c6463f143e7": {
"meta": {
"name": "应用平台",
"river": "3",
"scene": "main",
"storm": "6",
"text": "https://web.shylinux.com/",
"time": "2025-06-27 14:53:15.305",
"type": "view"
}
},
"150c49a58040c7943099ff6e68d56b7b": {
"meta": {
"args": "?story_uid=7d3880d3f70acec5337d5f832ef71103#:web.team.production.support",
@ -14,13 +25,13 @@
},
"1acab83a5952361da7a970ce996e9a5b": {
"meta": {
"index": "web.team.jiaowuxitong.portal",
"name": "教务系统",
"index": "web.team.gonganxitong.portal",
"name": "用户场景",
"river": "2",
"scene": "main",
"space": "20240724-education",
"space": "20240724-community",
"storm": "2",
"time": "2024-08-27 22:18:56.908",
"time": "2025-06-27 15:02:52.949",
"type": "view"
}
},
@ -37,18 +48,6 @@
"type": "view"
}
},
"69eab73272862fc0b0202533c8ea58a0": {
"meta": {
"index": "web.team.renzhengshouquan.portal",
"name": "认证授权",
"river": "2",
"scene": "main",
"space": "20240724-community",
"storm": "3",
"time": "2025-06-05 15:47:36.059",
"type": "view"
}
},
"6c428f2a2570bcb73784536c11cb90a1": {
"meta": {
"name": "云系统",
@ -74,13 +73,13 @@
},
"7ea8d32a7a9cfe236d406e43392b0ddd": {
"meta": {
"index": "web.team.huodongzuzhi.portal",
"name": "活动组织",
"index": "web.team.renzhengshouquan.portal",
"name": "认证授权",
"river": "2",
"scene": "main",
"space": "20240724-community",
"storm": "4",
"time": "2025-06-07 07:52:31.550",
"storm": "3",
"time": "2025-06-27 14:59:54.559",
"type": "view"
}
},
@ -91,7 +90,7 @@
"river": "3",
"scene": "main",
"space": "20240903-operation",
"storm": "4",
"storm": "5",
"time": "2025-06-05 15:49:14.189",
"type": "view"
}
@ -113,20 +112,20 @@
"river": "3",
"scene": "main",
"space": "20240724-enterprise",
"storm": "3",
"storm": "4",
"time": "2024-08-16 12:46:29.399",
"type": "view"
}
},
"b736946fef122e25ade814a489b891f4": {
"meta": {
"index": "web.team.gonganxitong.portal",
"name": "用户场景",
"index": "web.team.huodongzuzhi.portal",
"name": "活动组织",
"river": "2",
"scene": "main",
"space": "20240724-community",
"storm": "2",
"time": "2025-06-05 15:50:05.074",
"storm": "5",
"time": "2025-06-27 15:01:08.022",
"type": "view"
}
},
@ -138,7 +137,7 @@
"river": "3",
"scene": "main",
"space": "20240724-community",
"storm": "5",
"storm": "2",
"time": "2025-06-05 16:37:44.541",
"type": "view"
}
@ -150,7 +149,7 @@
"river": "2",
"scene": "main",
"space": "20240724-community",
"storm": "5",
"storm": "4",
"time": "2025-06-07 07:53:24.100",
"type": "view"
}
@ -162,7 +161,7 @@
"river": "3",
"scene": "main",
"space": "20240724-enterprise",
"storm": "2",
"storm": "3",
"time": "2025-06-07 07:56:07.357",
"type": "view"
}

View File

@ -5,8 +5,8 @@
"index": "web.team.gonganxitong.setting",
"name": "服务配置",
"order": "103",
"role": "landlord,tenant",
"time": "2024-09-20 22:25:38.166"
"role": "leader,worker,server",
"time": "2025-06-14 18:43:46.327"
}
},
"153c93456004ec2ca692d3bac2223167": {
@ -15,18 +15,17 @@
"index": "web.team.gonganxitong.service",
"name": "服务发现",
"order": "904",
"time": "2025-06-03 12:37:47.975"
"time": "2025-06-14 18:43:46.329"
}
},
"22574299a657140d473f0216b8d83710": {
"1cfd36a7b8906ba77781b4f85d0a6190": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.gonganxitong.document",
"name": "在线文档",
"order": "94",
"role": "landlord,tenant,admin",
"time": "2024-11-25 15:33:24.095"
"icons": "bi bi-people",
"index": "web.team.gonganxitong.sess",
"name": "会话管理",
"order": "605",
"role": "tech",
"time": "2025-06-16 07:06:32.762"
}
},
"27c6988eeb07c78cbb49aa15c577cfa4": {
@ -36,7 +35,7 @@
"name": "权限申请",
"order": "502",
"role": "leader",
"time": "2025-06-03 12:37:48.033"
"time": "2025-06-14 18:43:46.296"
}
},
"29466aca8adfa4b2556bda225c01267a": {
@ -46,19 +45,7 @@
"name": "数据清理",
"order": "506",
"role": "tech",
"time": "2025-06-04 13:20:29.448"
}
},
"2f80f1821b55a90555f630def20387be": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.gonganxitong.contract",
"name": "在线合同",
"order": "95",
"role": "landlord,tenant",
"time": "2024-11-24 09:19:03.732"
"time": "2025-06-14 18:43:46.328"
}
},
"3971882ea4f32c86386ad04b39d3e3d4": {
@ -67,29 +54,7 @@
"index": "web.team.gonganxitong.market",
"name": "人民广场",
"order": "901",
"time": "2025-06-03 12:35:46.315"
}
},
"55ff6002f602327674ed6d4616023184": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.gonganxitong.goodslist",
"name": "在线商城",
"order": "91",
"role": "landlord,tenant",
"time": "2024-12-04 16:39:42.225"
}
},
"882a999b4a72a9866d9e4eef110d335a": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.gonganxitong.photo",
"name": "在线相册",
"order": "96",
"role": "landlord,tenant,admin",
"time": "2024-11-25 16:22:57.607"
"time": "2025-06-14 18:43:46.326"
}
},
"8ce4dfb877e04e3be5144253fdd5d8ff": {
@ -99,16 +64,16 @@
"name": "权限审批",
"order": "503",
"role": "leader",
"time": "2025-06-03 12:37:48.038"
"time": "2025-06-14 18:43:46.295"
}
},
"a53e36dcca735ef90b649fec546f520e": {
"meta": {
"icons": "/p/src/gonganxitong/credit.png",
"index": "web.team.gonganxitong.credit",
"name": "用户名片",
"name": "服务名片",
"order": "101",
"time": "2024-09-29 08:58:20.076"
"time": "2025-06-14 18:43:46.294"
}
},
"a89a7c09e326295aaa7e7ea3d66fb28a": {
@ -117,23 +82,27 @@
"index": "web.team.gonganxitong.support",
"name": "客服支持",
"order": "905",
"time": "2025-06-03 12:37:47.974"
"time": "2025-06-14 18:43:46.328"
}
},
"b07b1f652f5b2557c0b20e813fcf99d2": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "bi bi-buildings",
"index": "web.team.gonganxitong.street",
"name": "街道信息",
"time": "2024-09-24 20:44:05.455"
"name": "街道管理",
"order": "601",
"role": "tech",
"time": "2025-06-16 07:06:32.831"
}
},
"ba00879066bbcea83e30cda292d28a91": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "bi bi-people",
"index": "web.team.gonganxitong.user",
"name": "用户信息",
"time": "2024-09-24 20:44:05.458"
"name": "用户管理",
"order": "604",
"role": "tech",
"time": "2025-06-16 06:53:21.322"
}
},
"bdec92d5849b2a60a8811cff494f2391": {
@ -143,7 +112,7 @@
"name": "事件流",
"order": "504",
"role": "leader",
"time": "2025-06-03 12:37:48.038"
"time": "2025-06-14 18:43:46.297"
}
},
"be08ca65be90feca325df128a06e440f": {
@ -152,7 +121,7 @@
"index": "web.team.gonganxitong.recent",
"name": "最近访问",
"order": "903",
"time": "2025-06-03 12:37:48.033"
"time": "2025-06-14 18:43:46.329"
}
},
"c1526ecd405021d6d47798c066bf70c0": {
@ -162,36 +131,27 @@
"name": "通知公告",
"order": "505",
"role": "leader",
"time": "2025-06-03 12:37:47.974"
}
},
"cbfda09ef49108ad9addf5117bcb54ce": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.gonganxitong.paymentlist",
"name": "在线支付",
"order": "92",
"role": "landlord,tenant",
"time": "2024-11-22 11:37:54.098"
"time": "2025-06-14 18:43:46.330"
}
},
"d8443c1034bfe5917c52126a3306c328": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"icons": "bi bi-buildings",
"index": "web.team.gonganxitong.city",
"name": "城市信息",
"time": "2024-09-24 20:44:05.449"
"name": "城市管理",
"order": "602",
"role": "tech",
"time": "2025-06-16 06:49:36.169"
}
},
"d86e4e63183c8fae4ceb50498b0bcfde": {
"meta": {
"icons": "bi bi-grid-3x2-gap",
"index": "web.team.gonganxitong.domain",
"name": "领域分类",
"order": "508",
"name": "领域管理",
"order": "603",
"role": "tech",
"time": "2025-06-04 13:33:25.446"
"time": "2025-06-14 18:43:46.326"
}
},
"e2117b53c036a72fe7e4885449488a6f": {
@ -201,18 +161,7 @@
"name": "场景码",
"order": "501",
"role": "leader",
"time": "2025-06-03 12:37:47.975"
}
},
"f24b53f61852f58734f9ef8488705026": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.gonganxitong.meeting",
"name": "在线会议",
"order": "93",
"role": "landlord,tenant,admin",
"time": "2024-11-19 15:35:47.453"
"time": "2025-06-14 18:43:46.330"
}
},
"f28c03b5bdbbe92ebc89dabca5e7d4de": {
@ -221,8 +170,8 @@
"index": "web.team.gonganxitong.member",
"name": "组织成员",
"order": "102",
"role": "landlord,tenant",
"time": "2024-09-02 16:56:59.039"
"role": "leader,worker,server",
"time": "2025-06-14 18:43:46.327"
}
},
"fd1884bbeb1f1a83f4e12f857bfe5b15": {
@ -231,17 +180,7 @@
"index": "web.team.gonganxitong.message",
"name": "消息待办",
"order": "902",
"time": "2025-06-03 12:35:46.287"
}
},
"fd86aad80a667152781bb188fb1249a2": {
"meta": {
"enable": "false",
"icons": "https://img.icons8.com/officel/80/reading-confirmation.png",
"index": "web.team.gonganxitong.email",
"name": "邮箱配置",
"order": "2",
"time": "2024-12-05 21:10:27.441"
"time": "2025-06-14 18:43:46.294"
}
}
}

View File

@ -63,7 +63,7 @@
"meta": {
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.guanlixitong.credit",
"name": "用户名片",
"name": "服务名片",
"order": "102",
"time": "2024-09-29 08:58:19.976"
}

View File

@ -1,22 +1,4 @@
{
"1e158e9083bfe07ac5a35353fdcdf62e": {
"meta": {
"icons": "/p/src/huodongzuzhi/src/gonganxitong/spendlist.png",
"index": "web.team.huodongzuzhi.spendlist",
"time": "2025-04-19 08:28:11.641"
}
},
"2c5f42d846b438a22e62b19617ebf511": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.huodongzuzhi.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-04 16:43:56.566"
}
},
"3229a1bc7aa326822c4f4f267e038185": {
"meta": {
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
@ -24,36 +6,7 @@
"name": "组织成员",
"order": "102",
"role": "leader,worker,server",
"time": "2025-06-04 14:05:39.363"
}
},
"3745803fab1393312d3e1d2e589e1e9f": {
"meta": {
"icons": "/p/src/huodongzuzhi/src/gonganxitong/quotalist.png",
"index": "web.team.huodongzuzhi.quotalist",
"time": "2025-04-19 08:28:11.635"
}
},
"3e9e80db9ae3768b7a44774c7afa5f65": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.huodongzuzhi.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-25 18:11:44.294"
}
},
"49432b349d456f4108dcfa7d28435bac": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.huodongzuzhi.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-25 18:19:23.750"
"time": "2025-06-14 18:45:05.583"
}
},
"595eb34d7ebe62e160c02ed5b127d637": {
@ -62,7 +15,7 @@
"index": "web.team.huodongzuzhi.message",
"name": "消息待办",
"order": "902",
"time": "2025-06-04 14:05:39.327"
"time": "2025-06-14 18:45:05.589"
}
},
"7292825aff6839f7a8cecf9e920c25f6": {
@ -72,7 +25,7 @@
"name": "数据清理",
"order": "506",
"role": "tech",
"time": "2025-06-04 14:05:39.360"
"time": "2025-06-14 18:45:05.646"
}
},
"780939d4c095806dba8711d8753cbdf7": {
@ -81,16 +34,16 @@
"index": "web.team.huodongzuzhi.support",
"name": "客服支持",
"order": "905",
"time": "2025-06-04 14:05:39.325"
"time": "2025-06-14 18:45:05.588"
}
},
"7a02092e26efa3eb324259a5d28bc8f3": {
"meta": {
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.huodongzuzhi.credit",
"name": "用户名片",
"name": "服务名片",
"order": "101",
"time": "2025-06-04 14:05:39.328"
"time": "2025-06-14 18:45:05.587"
}
},
"7a7da5c5e42a9aa1d88109fa8620d465": {
@ -100,7 +53,7 @@
"name": "事件流",
"order": "504",
"role": "leader",
"time": "2025-06-04 14:05:39.326"
"time": "2025-06-14 18:45:05.585"
}
},
"94996b048561b144e2a47ff6cc2a9e5c": {
@ -109,7 +62,7 @@
"index": "web.team.huodongzuzhi.service",
"name": "服务发现",
"order": "904",
"time": "2025-06-04 14:05:39.362"
"time": "2025-06-14 18:45:05.585"
}
},
"a59f36877482d1aef49c1dfb61516602": {
@ -117,7 +70,7 @@
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.huodongzuzhi.activity",
"name": "活动安排",
"time": "2025-06-04 14:05:39.362"
"time": "2025-06-14 18:45:05.589"
}
},
"aa74e6bf51d1d1abab57fdb03b08c5c2": {
@ -126,7 +79,7 @@
"index": "web.team.huodongzuzhi.market",
"name": "人民广场",
"order": "901",
"time": "2025-06-04 14:05:39.325"
"time": "2025-06-14 18:45:05.586"
}
},
"baec1db59218f2da9d560fa719c6a12f": {
@ -136,7 +89,7 @@
"name": "权限申请",
"order": "502",
"role": "leader",
"time": "2025-06-04 14:05:39.361"
"time": "2025-06-14 18:45:05.584"
}
},
"c3fbb2049e914eda48f3f7d32c207679": {
@ -146,7 +99,7 @@
"name": "场景码",
"order": "501",
"role": "leader",
"time": "2025-06-04 14:05:39.364"
"time": "2025-06-14 18:45:05.592"
}
},
"dae66500cd381d400f15cd4c9efc05b1": {
@ -156,40 +109,7 @@
"name": "权限审批",
"order": "503",
"role": "leader",
"time": "2025-06-04 14:05:39.329"
}
},
"dc71c0eee278a0f9eb9bbb9ee3d9d6f0": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.huodongzuzhi.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-19 15:35:47.287"
}
},
"e5ce14fa8331355abad8cc68c25c74a4": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.huodongzuzhi.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-25 18:11:44.292"
}
},
"ed9cb73417ae9e3e63526f1c459e9c7b": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.huodongzuzhi.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2024-11-22 17:42:50.775"
"time": "2025-06-14 18:45:05.591"
}
},
"ee364ed77eb0383868d48260f8b5aeb2": {
@ -199,7 +119,7 @@
"name": "通知公告",
"order": "505",
"role": "leader",
"time": "2025-06-04 14:05:39.364"
"time": "2025-06-14 18:45:05.590"
}
},
"f77a8f8d7dfe49f8e82ecd8d0b99f233": {
@ -208,7 +128,7 @@
"index": "web.team.huodongzuzhi.recent",
"name": "最近访问",
"order": "903",
"time": "2025-06-04 14:05:39.327"
"time": "2025-06-14 18:45:05.591"
}
},
"f78dbbb843f056f5db196c342f1184bc": {
@ -218,7 +138,7 @@
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2025-06-04 14:05:39.329"
"time": "2025-06-14 18:45:05.590"
}
}
}

View File

@ -1,253 +0,0 @@
{
"03acc6ed03fa47e9639f1e5c459c3b50": {
"meta": {
"icons": "/p/usr/local/work/20240903-operation/src/operation/activity-grid.png",
"index": "web.team.operation.template",
"name": "云模板",
"order": "2",
"time": "2025-05-27 11:18:39.761"
}
},
"03f7f410d292fb30026cbcd99290e943": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.operation.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.747"
}
},
"2511b9e18bf167ae0171c740e8f0513c": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.operation.contract",
"name": "在线合同",
"order": "95",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.760"
}
},
"3b0ced2e41179097e594b91c3c36536b": {
"meta": {
"icons": "/p/src/gonganxitong/member.png?pod=20240724-community",
"index": "web.team.operation.member",
"name": "组织成员",
"order": "80",
"role": "leader,worker,server",
"time": "2024-09-03 00:35:31.252"
}
},
"42ad60fa36e1aff927ef3d77be659566": {
"meta": {
"icons": "bi bi-recycle",
"index": "web.team.operation.clean",
"name": "数据清理",
"order": "506",
"role": "tech",
"time": "2025-06-04 13:20:29.328"
}
},
"53b0f8b9867485bb8864f2205e31897e": {
"meta": {
"icons": "bi bi-box",
"index": "web.team.operation.service",
"name": "服务发现",
"order": "102",
"time": "2024-09-03 00:35:30.169"
}
},
"64be90144c205e73b1fc216962d7ad25": {
"meta": {
"icons": "/p/usr/local/work/20240903-operation/src/operation/activity-grid.png",
"index": "web.team.operation.product",
"name": "云服务",
"order": "5",
"time": "2025-05-27 11:18:39.748"
}
},
"65c0459a8b23e672deebedb5c1c76fe5": {
"meta": {
"index": "web.team.operation.publish",
"time": "2024-09-03 00:35:30.166"
}
},
"6ca4f1fc571350c2498bc5c1d7ac3563": {
"meta": {
"icons": "bi bi-qr-code",
"index": "web.team.operation.qrcode",
"name": "场景码",
"order": "90",
"role": "creator",
"time": "2024-09-03 00:35:31.256"
}
},
"700c65f09a19cb53ee5c2dfbb98a5a0b": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.operation.meeting",
"name": "在线会议",
"order": "93",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.755"
}
},
"7abb3b3760a9b686457938511c0ee7df": {
"meta": {
"icons": "/p/usr/local/work/20240903-operation/src/operation/activity-grid.png",
"index": "web.team.operation.project",
"name": "云项目",
"order": "4",
"time": "2025-05-27 11:18:39.745"
}
},
"85c8678d4af08bb0c3e9560155b7c98f": {
"meta": {
"icons": "bi bi-calendar4-week",
"index": "web.team.operation.event",
"name": "事件流",
"order": "93",
"role": "creator",
"time": "2024-09-03 00:35:30.167"
}
},
"91b0ca086b5b8aa00e84737c4395a19f": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.operation.photo",
"name": "在线相册",
"order": "96",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.759"
}
},
"aa58390a9fac9f8210eca564d1ad82ff": {
"meta": {
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.operation.credit",
"name": "用户名片",
"order": "101",
"time": "2025-05-27 11:18:39.758"
}
},
"b2d8434f3ab5340408f71c4bf087e3d9": {
"meta": {
"icons": "bi bi-clock-history",
"index": "web.team.operation.recent",
"name": "最近访问",
"order": "101",
"time": "2024-09-03 00:35:30.170"
}
},
"c8159ab932f400dbafa08fb995e16355": {
"meta": {
"icons": "/p/usr/local/work/20240903-operation/src/operation/activity-grid.png",
"index": "web.team.operation.cluster",
"name": "云集群",
"order": "1",
"time": "2025-05-27 11:18:39.756"
}
},
"ca74fb83cfd850b1ca03fe18976c253a": {
"meta": {
"icons": "bi bi-card-checklist",
"index": "web.team.operation.message",
"name": "消息待办",
"order": "100",
"time": "2024-09-03 00:35:30.174"
}
},
"d2c6f264302bdd5d46beb921f389efda": {
"meta": {
"icons": "bi bi-megaphone",
"index": "web.team.operation.notice",
"name": "通知公告",
"order": "505",
"role": "leader",
"time": "2025-05-27 11:18:39.749"
}
},
"d47d5d11064235734413113c7440af7f": {
"meta": {
"icons": "bi bi-clipboard-check",
"index": "web.team.operation.allow",
"name": "权限审批",
"order": "92",
"role": "creator",
"time": "2024-09-03 00:35:30.172"
}
},
"d8f6d139d6a5f9b5aa504702e7777eb3": {
"meta": {
"icons": "/p/usr/local/work/20240903-operation/src/operation/activity-grid.png",
"index": "web.team.operation.gateway",
"name": "云主机",
"order": "3",
"time": "2025-05-27 11:18:39.747"
}
},
"d953e8b2c9159b1f4d32ff1c15793314": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.operation.document",
"name": "在线文档",
"order": "94",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.769"
}
},
"dad14d38feac6ebfb61953f8aae393bb": {
"meta": {
"icons": "bi bi-ubuntu",
"index": "web.team.operation.market",
"name": "人民广场",
"order": "901",
"time": "2025-05-27 11:18:39.749"
}
},
"e0b69dbd47a289ed57d970877000fa40": {
"meta": {
"icons": "/p/src/gonganxitong/setting.png?pod=20240724-community",
"index": "web.team.operation.setting",
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2025-05-27 11:18:39.754"
}
},
"e9150ed09fcdb4da60f1e9f0d5fe54ea": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.operation.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.746"
}
},
"ec25b5c62a4d26688fe114d9b25f7a56": {
"meta": {
"icons": "bi bi-opencollective",
"index": "web.team.operation.support",
"name": "客服支持",
"order": "103",
"time": "2024-09-03 00:35:30.176"
}
},
"f7484dd174d63a6800f84d1fb5fbb584": {
"meta": {
"icons": "bi bi-pencil-square",
"index": "web.team.operation.apply",
"name": "权限申请",
"order": "91",
"role": "creator",
"time": "2024-09-03 00:35:30.178"
}
}
}

View File

@ -6,7 +6,7 @@
"name": "新人帮助",
"order": "6",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.724"
"time": "2025-06-17 20:04:22.489"
}
},
"1b5f923af5910ea22c451559e7d6a640": {
@ -15,7 +15,7 @@
"index": "web.team.production.plan",
"name": "迭代计划",
"order": "1",
"time": "2025-05-27 11:18:39.741"
"time": "2025-06-17 20:04:22.475"
}
},
"23769af348b5bf39fce16d2257889544": {
@ -25,7 +25,7 @@
"name": "支付记录",
"order": "11",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.732"
"time": "2025-06-17 20:04:22.493"
}
},
"247b484fb13394452bc978e5ecad33ff": {
@ -35,7 +35,7 @@
"name": "权限申请",
"order": "502",
"role": "leader",
"time": "2025-05-27 11:18:39.726"
"time": "2025-06-17 20:04:22.487"
}
},
"28ddd19d35163befea91e9fcfaa2f8c2": {
@ -45,18 +45,7 @@
"name": "项目统计",
"order": "8",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.721"
}
},
"2cc2b9d11344506a6b0bbb0dbdde2d43": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.production.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.740"
"time": "2025-06-17 20:04:22.472"
}
},
"2cf321f56f8ace96e561bf54f664f276": {
@ -66,18 +55,7 @@
"name": "产品需求",
"order": "2",
"portal": "true",
"time": "2025-05-27 11:18:39.743"
}
},
"2f55a878524db4227e7476307269db05": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.production.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.730"
"time": "2025-06-17 20:04:22.485"
}
},
"3be1265611cf96a9d61bd4c2c879db70": {
@ -87,7 +65,7 @@
"name": "会议安排",
"order": "10",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.723"
"time": "2025-06-17 20:04:22.466"
}
},
"4d71c41fee0876455b396dc4772e1ee6": {
@ -97,7 +75,7 @@
"name": "数据清理",
"order": "506",
"role": "tech",
"time": "2025-06-04 13:20:29.307"
"time": "2025-06-17 20:04:22.469"
}
},
"50dd2633fafc2efb90760b602f1500ea": {
@ -107,7 +85,7 @@
"name": "通知公告",
"order": "505",
"role": "leader",
"time": "2025-05-27 11:18:39.722"
"time": "2025-06-17 20:04:22.486"
}
},
"53d92f96ed804b0981073cd6fa7121d7": {
@ -116,7 +94,7 @@
"index": "web.team.production.market",
"name": "人民广场",
"order": "901",
"time": "2025-05-27 11:18:39.712"
"time": "2025-06-17 20:04:22.487"
}
},
"5dacdcf76ab7821078437442f2b98f0f": {
@ -126,7 +104,7 @@
"name": "项目接单",
"order": "7",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.724"
"time": "2025-06-17 20:04:22.483"
}
},
"684ebb2576bd4d7024a04693de6aaeab": {
@ -135,7 +113,7 @@
"index": "web.team.production.recent",
"name": "最近访问",
"order": "903",
"time": "2025-05-27 11:18:39.728"
"time": "2025-06-17 20:04:22.468"
}
},
"6871a5c44a6021f7edaf46cf356266e3": {
@ -145,7 +123,7 @@
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2025-05-27 11:18:39.717"
"time": "2025-06-17 20:04:22.482"
}
},
"6d06c21df099b1bc6b85fa6ff59ae6d1": {
@ -155,7 +133,7 @@
"name": "权限审批",
"order": "503",
"role": "leader",
"time": "2025-05-27 11:18:39.733"
"time": "2025-06-17 20:04:22.473"
}
},
"73b81840f26d2885c065d19e08e923f1": {
@ -165,18 +143,7 @@
"name": "界面设计",
"order": "3",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.720"
}
},
"7cf76afacb83fabb3d6a6ffaf48b6066": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.production.document",
"name": "在线文档",
"order": "94",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.719"
"time": "2025-06-17 20:04:22.492"
}
},
"8efc6b4f9d0d59713215fb5843f8f037": {
@ -185,7 +152,7 @@
"index": "web.team.production.support",
"name": "客服支持",
"order": "905",
"time": "2025-05-27 11:18:39.722"
"time": "2025-06-17 20:04:22.480"
}
},
"9a1b27391021fe202075fdec5e55011d": {
@ -195,7 +162,7 @@
"name": "测试用例",
"order": "5",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.712"
"time": "2025-06-17 20:04:22.489"
}
},
"9c8310df39f8423ff77f19652b471a35": {
@ -205,18 +172,7 @@
"name": "场景码",
"order": "501",
"role": "leader",
"time": "2025-05-27 11:18:39.713"
}
},
"a9b5b213c868653f1a060c3231d57e8f": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.production.contract",
"name": "在线合同",
"order": "95",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.744"
"time": "2025-06-17 20:04:22.491"
}
},
"aaddfdcbc047893eabccc44b8cc790aa": {
@ -226,16 +182,16 @@
"name": "会议预约",
"order": "9",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.731"
"time": "2025-06-17 20:04:22.490"
}
},
"af401082a04bff4314523e5ebb69abff": {
"meta": {
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.production.credit",
"name": "用户名片",
"name": "服务名片",
"order": "101",
"time": "2025-05-27 11:18:39.720"
"time": "2025-06-17 20:04:22.482"
}
},
"b7772dfc47e42e8c7e1c07fc1657546a": {
@ -244,7 +200,7 @@
"index": "web.team.production.message",
"name": "消息待办",
"order": "902",
"time": "2025-05-27 11:18:39.732"
"time": "2025-06-17 20:04:22.470"
}
},
"c27f5383bb62fe30347da4fbac3ff0a8": {
@ -254,18 +210,7 @@
"name": "事件流",
"order": "504",
"role": "leader",
"time": "2025-05-27 11:18:39.743"
}
},
"c9559beab992f8b46b9cfa4a196e61e8": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.production.photo",
"name": "在线相册",
"order": "96",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.726"
"time": "2025-06-17 20:04:22.474"
}
},
"c96881ba1b560e55d4d589e7c52033ca": {
@ -275,18 +220,7 @@
"name": "开发任务",
"order": "4",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.721"
}
},
"cea1324e3dca123f6560dee5c559a587": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.production.meeting",
"name": "在线会议",
"order": "93",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.718"
"time": "2025-06-17 20:04:22.479"
}
},
"d7a6aba1bb09e15de71688e2e6e56807": {
@ -296,7 +230,7 @@
"name": "文件附件",
"order": "11",
"role": "leader,worker",
"time": "2025-05-27 11:18:39.727"
"time": "2025-06-17 20:04:22.467"
}
},
"e10cc3b27f6a9f02fbf22bc58551d862": {
@ -305,7 +239,7 @@
"index": "web.team.production.service",
"name": "服务发现",
"order": "904",
"time": "2025-05-27 11:18:39.719"
"time": "2025-06-17 20:04:22.481"
}
},
"e4bdcf2bcde46db180cad771406987b5": {
@ -315,7 +249,7 @@
"name": "项目成员",
"order": "102",
"role": "leader,worker,server",
"time": "2025-05-27 11:18:39.729"
"time": "2025-06-17 20:04:22.471"
}
}
}

View File

@ -1,16 +1,4 @@
{
"015b4784c16b63975824abbb3ff4ec9f": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.renzhengshouquan.photo",
"name": "在线相册",
"order": "96",
"role": "leader,worker",
"time": "2024-11-25 18:11:44.117"
}
},
"0d7f068029dbf7f9f0d307070cc3a79b": {
"meta": {
"icons": "bi bi-clipboard-check",
@ -18,78 +6,30 @@
"name": "权限审批",
"order": "503",
"role": "leader",
"time": "2025-06-04 14:05:39.240"
}
},
"1c4fee90e6a7bdb8ab6f1ccb23f3273f": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.renzhengshouquan.document",
"name": "在线文档",
"order": "95",
"role": "leader,worker",
"time": "2024-11-25 18:19:23.561"
}
},
"1d15ae175ffe375630da1466417d2d5d": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.renzhengshouquan.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-25 18:11:44.121"
}
},
"1d5fb457d3223d26afd076c38d7daf66": {
"meta": {
"icons": "/p/src/renzhengshouquan/src/gonganxitong/quotalist.png",
"index": "web.team.renzhengshouquan.quotalist",
"time": "2025-04-19 08:28:11.519"
}
},
"1d7c44014bc23b3db4551534359c95c4": {
"meta": {
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.renzhengshouquan.external.tencentmeeting.tencentmeeting",
"name": "腾讯会议",
"order": "12",
"role": "leader,worker",
"time": "2024-11-19 11:33:13.771",
"type": "company,school,street"
}
},
"21887f37ce8dabe4c52648ea096f8e4d": {
"meta": {
"icons": "/p/src/renzhengshouquan/src/gonganxitong/spendlist.png",
"index": "web.team.renzhengshouquan.spendlist",
"time": "2025-04-19 08:28:11.518"
"time": "2025-06-14 18:42:22.627"
}
},
"26c6b80577a23afcd2c10fcfea0c0f63": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/id-verified.png",
"icons": "src/renzhengshouquan/transition.png",
"index": "web.team.renzhengshouquan.transition",
"name": "账单",
"order": "5",
"role": "leader,worker",
"time": "2025-06-04 14:05:39.238"
"time": "2025-06-14 18:42:22.624"
}
},
"2a065e0a48b909ae79fbb3dd750e1eb5": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/id-verified.png",
"icons": "src/renzhengshouquan/auth.png",
"index": "web.team.renzhengshouquan.auth",
"name": "认证授权",
"order": "2",
"time": "2025-06-04 14:05:39.283",
"type": "root,city,company"
"role": "leader,worker",
"time": "2025-06-14 18:42:22.662",
"type": "root,city,street,school,company"
}
},
"456d3a031a140d43f54690ea7203628d": {
@ -99,18 +39,7 @@
"name": "事件流",
"order": "504",
"role": "leader",
"time": "2025-06-04 14:05:39.277"
}
},
"46e7154975448d8835e3ab1ff48ea89a": {
"meta": {
"icons": "https://img.icons8.com/officel/80/stack-of-photos.png",
"index": "web.team.renzhengshouquan.external.tencentcloud.smh.smh",
"name": "智能媒资托管",
"order": "16",
"role": "leader,worker",
"time": "2024-11-29 11:19:22.807",
"type": "company,school,street"
"time": "2025-06-14 18:42:22.631"
}
},
"4cac9ca99ccb8db395f703434647f5f3": {
@ -120,19 +49,7 @@
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2025-06-04 14:05:39.240"
}
},
"4f39828c162621991f20cce2454cb5e3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/weixing.png",
"index": "web.team.renzhengshouquan.external.weixinpayment.weixinpayment",
"name": "微信支付",
"order": "11",
"role": "leader,worker",
"time": "2024-11-22 10:58:05.763",
"type": "root",
"view": "tech"
"time": "2025-06-14 18:42:22.627"
}
},
"52fb3a7d85d879b638cc246850b236f6": {
@ -142,32 +59,7 @@
"name": "场景码",
"order": "501",
"role": "leader",
"time": "2025-06-04 14:05:39.237"
}
},
"6806548eeea33ee2118c520a60bc7e4b": {
"meta": {
"auth": "issued",
"enable": "true",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.renzhengshouquan.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-04 16:43:56.540",
"type": "company,school,street,service"
}
},
"692895230d60d29c2a56531f81927efb": {
"meta": {
"icons": "https://img.icons8.com/officel/80/cloud.png",
"index": "web.team.renzhengshouquan.external.tencentcloud.tencentcloud",
"name": "腾讯云",
"order": "15",
"role": "leader,worker",
"time": "2024-11-25 20:45:31.111",
"type": "root",
"view": "tech"
"time": "2025-06-14 18:42:22.661"
}
},
"732373815fa26c85ad04dd57ca57db39": {
@ -177,7 +69,7 @@
"name": "权限申请",
"order": "502",
"role": "leader",
"time": "2025-06-04 14:05:39.241"
"time": "2025-06-14 18:42:22.665"
}
},
"74d4c52796911c114fb27ea8086acf8d": {
@ -187,33 +79,20 @@
"name": "数据清理",
"order": "506",
"role": "tech",
"time": "2025-06-04 14:05:39.236"
"time": "2025-06-14 18:42:22.659"
}
},
"79283d05c3eb6007da9adcdc9751f68d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/structured-document-data.png",
"icons": "src/renzhengshouquan/admin.png",
"index": "web.team.renzhengshouquan.admin",
"name": "管理后台",
"order": "51",
"role": "leader,worker",
"time": "2025-06-04 14:05:39.278",
"time": "2025-06-14 18:42:22.625",
"type": "company"
}
},
"7a3a6cdf6eebd575950694ee28a8452e": {
"meta": {
"auth": "issued",
"enable": "true",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.renzhengshouquan.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2024-11-22 17:42:50.659",
"type": "company,school,street,service"
}
},
"83f5f7ed321eeee6827add7a03947102": {
"meta": {
"auth": "issued",
@ -221,30 +100,18 @@
"index": "web.team.renzhengshouquan.profile",
"name": "用户名片",
"order": "3",
"time": "2025-06-04 14:05:39.275"
}
},
"8780d5d1b9b5608cef9098e9393c0cb4": {
"meta": {
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.renzhengshouquan.external.tencentcloud.realname.realname",
"name": "实名验证",
"order": "18",
"role": "leader,worker",
"time": "2024-11-26 14:42:04.095",
"type": "root",
"view": "tech"
"time": "2025-06-14 18:42:22.663"
}
},
"89cf6f6cc69c13b7d541a0d61eae66e1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/identification-documents--v2.png",
"icons": "src/renzhengshouquan/cert.png",
"index": "web.team.renzhengshouquan.cert",
"name": "上传证件",
"order": "1",
"role": "leader,worker",
"time": "2025-06-04 14:05:39.235",
"type": "personal,company"
"time": "2025-06-14 18:42:22.665",
"type": "company,personal"
}
},
"9e52a4f0a1a8d35c14b40d14b0d9cff1": {
@ -253,7 +120,7 @@
"index": "web.team.renzhengshouquan.message",
"name": "消息待办",
"order": "902",
"time": "2025-06-04 14:05:39.239"
"time": "2025-06-14 18:42:22.666"
}
},
"a040dfa713a6fa9533b3184244dbbb74": {
@ -262,48 +129,18 @@
"index": "web.team.renzhengshouquan.support",
"name": "客服支持",
"order": "905",
"time": "2025-06-04 14:05:39.280"
"time": "2025-06-14 18:42:22.660"
}
},
"ab4f65f30762aeef9edb568315551be9": {
"meta": {
"auth": "issued",
"enable": "true",
"icons": "https://img.icons8.com/officel/80/id-verified.png",
"icons": "src/renzhengshouquan/account.png",
"index": "web.team.renzhengshouquan.account",
"name": "账户",
"order": "4",
"role": "leader,worker",
"time": "2025-06-04 14:05:39.279"
}
},
"b0a322b1aeb3772b09477be3e47c8e89": {
"meta": {
"index": "web.team.renzhengshouquan.domain",
"time": "2024-09-07 08:23:04.033"
}
},
"b8ed900b12de88d7bc186649bef1108b": {
"meta": {
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.renzhengshouquan.external.tencentdocument.tencentdocument",
"name": "腾讯文档",
"order": "13",
"role": "leader,worker",
"time": "2024-12-01 21:29:51.770",
"type": "company,school,street"
}
},
"bdf8a62a495ddba04e61bc457ed5fc25": {
"meta": {
"icons": "https://img.icons8.com/officel/80/sms.png",
"index": "web.team.renzhengshouquan.external.tencentcloud.sms.sms",
"name": "发送短信",
"order": "17",
"role": "leader,worker",
"time": "2024-11-26 20:23:46.898",
"type": "root",
"view": "tech"
"time": "2025-06-14 18:42:22.662"
}
},
"bfecb55b11fe68186270fe1b4b8de8cf": {
@ -313,19 +150,7 @@
"name": "组织成员",
"order": "102",
"role": "leader,worker,server",
"time": "2025-06-04 14:05:39.234"
}
},
"c9eeca8509b5b055149a5593312436cd": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.renzhengshouquan.meeting",
"name": "在线会议",
"order": "93",
"role": "leader,worker",
"time": "2024-11-19 15:35:47.185"
"time": "2025-06-14 18:42:22.664"
}
},
"d9f55b517f4b2579693523ed3b5bd088": {
@ -334,19 +159,7 @@
"index": "web.team.renzhengshouquan.market",
"name": "人民广场",
"order": "901",
"time": "2025-06-04 14:05:39.281"
}
},
"dcdc0894036f440763b00cad63e6d649": {
"meta": {
"icons": "https://img.icons8.com/officel/80/stack-of-photos.png",
"index": "web.team.renzhengshouquan.external.tencentcloud.tke.tke",
"name": "容器服务",
"order": "17",
"role": "leader,worker",
"time": "2025-02-24 14:42:58.192",
"type": "root",
"view": "tech"
"time": "2025-06-14 18:42:22.663"
}
},
"e038450591f3c8e7babc0c21b1c6fa6d": {
@ -355,7 +168,7 @@
"index": "web.team.renzhengshouquan.recent",
"name": "最近访问",
"order": "903",
"time": "2025-06-04 14:05:39.276"
"time": "2025-06-14 18:42:22.626"
}
},
"ecfb11fad5b4bdf21384e2e1ff571598": {
@ -365,7 +178,7 @@
"name": "通知公告",
"order": "505",
"role": "leader",
"time": "2025-06-04 14:05:39.282"
"time": "2025-06-14 18:42:22.664"
}
},
"f669e15e1c1c9da2bd3ea0c58abc0bd3": {
@ -373,9 +186,9 @@
"enable": "false",
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.renzhengshouquan.credit",
"name": "用户名片",
"name": "服务名片",
"order": "101",
"time": "2025-06-04 14:05:39.236"
"time": "2025-06-14 18:42:22.661"
}
},
"f6b093d122ff3cec363b00093e0a6f19": {
@ -384,7 +197,7 @@
"index": "web.team.renzhengshouquan.service",
"name": "服务发现",
"order": "904",
"time": "2025-06-04 14:05:39.238"
"time": "2025-06-14 18:42:22.660"
}
}
}

View File

@ -4,18 +4,7 @@
"icons": "https://img.icons8.com/officel/80/receipt.png",
"index": "web.team.yuehaoxitong.take",
"name": "取号",
"time": "2025-06-04 14:04:37.901"
}
},
"182e191dda10c617c12a7c9147737dc6": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.yuehaoxitong.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-25 18:11:44.106"
"time": "2025-06-14 18:45:05.346"
}
},
"1931ecf1d36391b72df54d374a91c8ed": {
@ -23,7 +12,7 @@
"icons": "https://img.icons8.com/officel/80/meeting-room.png",
"index": "web.team.yuehaoxitong.reception",
"name": "服务场所",
"time": "2025-06-04 14:04:37.842"
"time": "2025-06-14 18:45:05.350"
}
},
"2ed70cba7eb6d3cf5fbe712c63da87a7": {
@ -32,27 +21,16 @@
"index": "web.team.yuehaoxitong.market",
"name": "人民广场",
"order": "901",
"time": "2025-06-04 14:04:37.899"
"time": "2025-06-14 18:45:05.349"
}
},
"2f55ab55e536839d2f400ed50832bfb9": {
"meta": {
"icons": "/p/src/gonganxitong/credit.png?pod=20240724-community",
"index": "web.team.yuehaoxitong.credit",
"name": "用户名片",
"name": "服务名片",
"order": "101",
"time": "2025-06-04 14:04:37.902"
}
},
"30440192e9e1730d1d899dcc16bd5cab": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.yuehaoxitong.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-19 15:35:47.179"
"time": "2025-06-14 18:45:05.351"
}
},
"377f3c0dae9dbf423a8e188bfd245b7a": {
@ -61,7 +39,7 @@
"index": "web.team.yuehaoxitong.recent",
"name": "最近访问",
"order": "903",
"time": "2025-06-04 14:04:37.845"
"time": "2025-06-14 18:45:05.354"
}
},
"3b6da44aaf19fdb06c84fe352569359f": {
@ -71,7 +49,7 @@
"name": "场景码",
"order": "501",
"role": "leader",
"time": "2025-06-04 14:04:37.850"
"time": "2025-06-14 18:45:05.459"
}
},
"46f2ba39a0620f04aab46a999c359a2b": {
@ -81,7 +59,7 @@
"name": "权限审批",
"order": "503",
"role": "leader",
"time": "2025-06-04 14:04:37.848"
"time": "2025-06-14 18:45:05.458"
}
},
"55ef7eaaa62b19b296b633c1c550f756": {
@ -91,18 +69,7 @@
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2025-06-04 14:04:37.899"
}
},
"59c5421cb9edd56bf243924daf55d891": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.yuehaoxitong.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-04 16:43:56.282"
"time": "2025-06-14 18:45:05.351"
}
},
"75c5c1863c1bdaf0bcbd3065b661528d": {
@ -110,7 +77,7 @@
"icons": "https://img.icons8.com/officel/80/calling.png",
"index": "web.team.yuehaoxitong.call",
"name": "叫号",
"time": "2025-06-04 14:04:37.900"
"time": "2025-06-14 18:45:05.350"
}
},
"7792f1a5145ab9d894a1681f13729778": {
@ -118,25 +85,7 @@
"icons": "https://img.icons8.com/officel/80/List-of-parts.png",
"index": "web.team.yuehaoxitong.schedule",
"name": "订单数据",
"time": "2025-06-04 14:04:37.844"
}
},
"79934714b27083087d2ea771e19192d3": {
"meta": {
"icons": "/p/src/yuehaoxitong/src/gonganxitong/spendlist.png",
"index": "web.team.yuehaoxitong.spendlist",
"time": "2025-04-19 08:28:11.381"
}
},
"8d3a66184c4da374081216d6c4d491b5": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.yuehaoxitong.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2024-11-22 17:42:50.642"
"time": "2025-06-14 18:45:05.353"
}
},
"98d6d53a44113b33a82c4e914cb23489": {
@ -145,18 +94,7 @@
"index": "web.team.yuehaoxitong.message",
"name": "消息待办",
"order": "902",
"time": "2025-06-04 14:04:37.847"
}
},
"a3d526b8fc09121a7186775cca6d9026": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.yuehaoxitong.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-25 18:11:44.112"
"time": "2025-06-14 18:45:05.348"
}
},
"a4ec355ea73596847448805be1610cb4": {
@ -166,7 +104,7 @@
"name": "数据清理",
"order": "506",
"role": "tech",
"time": "2025-06-04 14:04:37.897"
"time": "2025-06-14 18:45:05.347"
}
},
"a56cb18131ff45616849e4555e29d35d": {
@ -176,7 +114,7 @@
"name": "权限申请",
"order": "502",
"role": "leader",
"time": "2025-06-04 14:04:37.849"
"time": "2025-06-14 18:45:05.354"
}
},
"a947b7294674c071e22eac02d14508bc": {
@ -184,7 +122,7 @@
"icons": "https://img.icons8.com/officel/80/combo-chart.png",
"index": "web.team.yuehaoxitong.volume",
"name": "服务计划",
"time": "2025-06-04 14:04:37.842"
"time": "2025-06-14 18:45:05.353"
}
},
"b66f57a7a84d982b1b3a74ac3bdc045c": {
@ -194,7 +132,7 @@
"name": "通知公告",
"order": "505",
"role": "leader",
"time": "2025-06-04 14:04:37.843"
"time": "2025-06-14 18:45:05.352"
}
},
"b811b4ed8b1b372958bbb4bb1b2709b8": {
@ -203,7 +141,7 @@
"index": "web.team.yuehaoxitong.support",
"name": "客服支持",
"order": "905",
"time": "2025-06-04 14:04:37.898"
"time": "2025-06-14 18:45:05.347"
}
},
"ba468c870a9645a8a162c31c4d860fbd": {
@ -211,7 +149,7 @@
"icons": "https://img.icons8.com/officel/80/open-sign.png",
"index": "web.team.yuehaoxitong.open",
"name": "放号",
"time": "2025-06-04 14:04:37.846"
"time": "2025-06-14 18:45:05.348"
}
},
"bb1119fef63479943de59398943c3580": {
@ -219,7 +157,7 @@
"icons": "https://img.icons8.com/officel/80/order-history.png",
"index": "web.team.yuehaoxitong.history",
"name": "我的订单",
"time": "2025-06-04 14:04:37.844"
"time": "2025-06-14 18:45:05.458"
}
},
"c14a5a400c933fe799ed10b069990865": {
@ -229,25 +167,7 @@
"name": "组织成员",
"order": "102",
"role": "leader,worker,server",
"time": "2025-06-04 14:04:37.896"
}
},
"ca139b34295fc6d13d97430764cf3334": {
"meta": {
"icons": "/p/src/yuehaoxitong/src/gonganxitong/quotalist.png",
"index": "web.team.yuehaoxitong.quotalist",
"time": "2025-04-19 08:28:11.483"
}
},
"cb5d53223069ec8d9914ec30ca84ec4a": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.yuehaoxitong.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-25 18:19:23.441"
"time": "2025-06-14 18:45:05.352"
}
},
"d1e03d214890c9a4b9557d3f6a36c7e9": {
@ -256,7 +176,7 @@
"index": "web.team.yuehaoxitong.service",
"name": "服务发现",
"order": "904",
"time": "2025-06-04 14:04:37.903"
"time": "2025-06-14 18:45:05.349"
}
},
"de85331c7182b286624303d7aca70618": {
@ -264,7 +184,7 @@
"icons": "https://img.icons8.com/officel/80/calendar-plus.png",
"index": "web.team.yuehaoxitong.plan",
"name": "约号",
"time": "2025-06-04 14:04:37.895"
"time": "2025-06-14 18:45:05.457"
}
},
"fa4365d6c914365e4b047c9266e9a02f": {
@ -274,7 +194,7 @@
"name": "事件流",
"order": "504",
"role": "leader",
"time": "2025-06-04 14:04:37.841"
"time": "2025-06-14 18:45:05.355"
}
}
}