Compare commits

...

68 Commits

Author SHA1 Message Date
shy
29d61783d2 opt some 2025-03-22 12:57:45 +08:00
shy
f55256dee2 opt some 2025-03-15 20:46:34 +08:00
shy
2a2f9e7b3e add some 2025-03-15 20:27:02 +08:00
shy
f1ab27b595 add some 2025-03-15 13:16:15 +08:00
shy
1308ebda7b opt some 2025-03-10 19:01:49 +08:00
shy
5376decbf0 add some 2025-03-10 18:38:44 +08:00
shy
a7aa40ad65 opt some 2025-03-08 08:39:38 +08:00
shy
4f5556781d opt some 2025-03-08 08:39:25 +08:00
shy
9941c35ce4 opt some 2025-03-06 09:06:33 +08:00
shy
2d2774c7f2 opt some 2025-03-05 23:33:36 +08:00
shy
832fe1fc15 opt some 2025-03-03 19:50:14 +08:00
shy
088a2089c1 add some 2025-03-03 07:52:51 +08:00
shy
19ca86b7dc opt some 2025-02-28 21:29:40 +08:00
shy
d18f4fe4b6 opt some 2025-02-28 14:28:02 +08:00
shy
9eb70a7223 add some 2025-02-27 18:30:14 +08:00
shy
a80316a9b8 add some 2025-02-27 18:28:38 +08:00
shy
792498076a add some 2025-02-27 16:27:31 +08:00
shy
c7075c93d5 add some 2025-02-27 14:37:53 +08:00
shy
35d0d9ac31 opt some 2025-02-26 22:19:27 +08:00
shy
0985dc1d7f add some 2025-02-25 09:59:33 +08:00
shy
af29281507 add some 2025-02-23 08:03:35 +08:00
shy
b9a4ee596e add some 2025-02-16 08:36:11 +08:00
shy
ce240c802e add some 2025-02-14 16:15:48 +08:00
shy
54107ef29b add some 2025-02-12 23:51:34 +08:00
shy
ad73f75781 add some 2025-02-12 23:49:40 +08:00
shy
bb06a72e52 add some 2025-01-05 16:00:55 +08:00
shy
ff0f5a6db8 add some 2025-01-05 15:59:34 +08:00
shy
013cff1b88 add some 2025-01-05 15:57:02 +08:00
shy
ecf60e6bfa opt some 2024-12-29 19:33:09 +08:00
shy
99a0808a2e opt some 2024-12-17 15:37:51 +08:00
shy
a53bebe50f add some 2024-12-17 15:37:19 +08:00
shy
7ce1c751aa add some 2024-12-16 15:17:20 +08:00
shy
15a1b424b0 opt some 2024-12-15 09:28:32 +08:00
shy
a05a435956 add some 2024-12-14 18:35:32 +08:00
shy
165c5356ca add some 2024-12-08 22:27:28 +08:00
shy
3d470a09c8 add some 2024-12-05 09:54:30 +08:00
shy
5eeef3daf9 add some 2024-12-04 20:15:32 +08:00
root
6cdb89dcfd add some 2024-11-27 14:56:39 +08:00
shy
30ffc4c02b add some 2024-11-25 10:05:10 +08:00
root
3095cdc9e0 add some 2024-11-12 13:12:31 +08:00
root
02edfda6a3 add some 2024-11-12 13:11:46 +08:00
root
7a3d9cc335 add some 2024-10-25 17:49:19 +08:00
root
bbdf9f7c0f add some 2024-10-20 22:55:53 +08:00
root
7605248c1e add some 2024-10-20 18:46:27 +08:00
root
ca2e986e05 add some 2024-10-17 23:46:30 +08:00
root
a23c4db37d add some 2024-10-16 14:04:53 +08:00
root
c7df3dfba3 add some 2024-10-16 14:00:25 +08:00
root
ab6c92053a add some 2024-10-15 18:25:25 +08:00
shy
d0907841b7 opt some 2024-10-09 15:07:19 +08:00
shy
6811a392d4 add some 2024-10-06 23:24:17 +08:00
shy
ae99747748 add some 2024-10-06 22:18:42 +08:00
jingganjiaoyu
2eed8c96c5 add some 2024-10-05 22:55:15 +08:00
jingganjiaoyu
5118c259e4 add some 2024-10-05 19:05:03 +08:00
jingganjiaoyu
d439ec9fcd add some 2024-10-05 19:04:12 +08:00
jingganjiaoyu
a3daf64d13 add some 2024-10-05 19:03:33 +08:00
jingganjiaoyu
ac7fab72e6 add some 2024-10-05 19:02:57 +08:00
jingganjiaoyu
0dced97b0f add some 2024-10-05 19:02:20 +08:00
shy
484edfe48d add some 2024-10-04 18:43:40 +08:00
shy
8f1ac6b896 add some 2024-10-04 18:43:06 +08:00
shy
71cfb398c8 add some 2024-10-03 19:18:36 +08:00
shy
56513baa92 add some 2024-10-03 07:13:49 +08:00
shy
b892fc5d0c opt some 2024-10-01 08:24:31 +08:00
shy
e0fec3da0e add some 2024-10-01 08:08:06 +08:00
shy
4c7f12443d add some 2024-09-26 13:00:36 +08:00
shy
b194c8c3e1 add some 2024-09-25 17:17:07 +08:00
shy
6cfb932100 add some 2024-09-25 17:16:19 +08:00
shy
8c64167832 add some 2024-09-24 13:10:53 +08:00
shy
046db80c71 add some 2024-09-20 20:53:35 +08:00
71 changed files with 2340 additions and 418 deletions

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2020 shylinux Copyright (c) 2017-2025 shylinux
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@ -1,11 +1,11 @@
# Contexts # ContextOS
Contexts 通过模块化、集群化、自动化的方式,只用一个 20M 大小的程序文件,就可以在各种设备上,一键启动完整的云计算服务与云研发环境。 ContextOS 通过集群化、模块化、自动化的方式,只用一个 20M 大小的程序文件,就可以在各种设备上,一键启动完整的云计算服务与云研发环境。
## 源码安装 ## 安装系统
### 克隆编译 ### 下载编译
```sh ```sh
git clone https://shylinux.com/x/contexts git clone https://shylinux.com/x/ContextOS
cd contexts; source etc/miss.sh cd ContextOS; source etc/miss.sh
``` ```
### 启动服务 ### 启动服务
@ -13,7 +13,5 @@ cd contexts; source etc/miss.sh
ish_miss_serve ish_miss_serve
``` ```
### 访问网页 ### 管理后台
```sh 打开管理后台 [http://localhost:9020](http://localhost:9020)
open http://localhost:9020
```

54
go.mod
View File

@ -1,14 +1,50 @@
module shylinux.com/x/operation module shylinux.com/x/operation
go 1.13 go 1.21
require ( require (
gorm.io/driver/mysql v1.5.7 2025-dev.shylinux.com/x/20250211-service v0.0.6
gorm.io/gorm v1.25.11 2025-dev.shylinux.com/x/20250215-cluster v0.0.7
shylinux.com/x/community v0.0.7 shylinux.com/x/community v0.0.28
shylinux.com/x/enterprise v0.0.5 shylinux.com/x/enterprise v0.0.17
shylinux.com/x/ice v1.5.45 shylinux.com/x/golang-story v0.0.32 // indirect
shylinux.com/x/icebergs v1.9.45 shylinux.com/x/mysql-story v0.6.32
shylinux.com/x/mysql-story v0.6.19 )
shylinux.com/x/toolkits v1.0.15
require (
shylinux.com/x/ice v1.5.74
shylinux.com/x/icebergs v1.9.76
shylinux.com/x/toolkits v1.0.19
)
require (
shylinux.com/x/go-git/v5 v5.6.7 // indirect
shylinux.com/x/go-qrcode v0.0.3 // indirect
shylinux.com/x/websocket v0.0.4 // indirect
)
require (
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
github.com/emersion/go-message v0.15.0 // indirect
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 // indirect
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 // indirect
github.com/glebarez/go-sqlite v1.21.2 // indirect
github.com/glebarez/sqlite v1.11.0 // indirect
github.com/go-sql-driver/mysql v1.9.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/mattn/go-isatty v0.0.17 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/wechatpay-apiv3/wechatpay-go v0.2.20 // indirect
golang.org/x/sys v0.21.0 // indirect
golang.org/x/text v0.22.0 // indirect
gorm.io/driver/mysql v1.5.7 // indirect
gorm.io/gorm v1.25.12 // indirect
modernc.org/libc v1.22.5 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.5.0 // indirect
modernc.org/sqlite v1.23.1 // indirect
) )

243
go.sum
View File

@ -1,13 +1,21 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 2025-dev.shylinux.com/x/20250211-service v0.0.6 h1:FOQ6Z+eHsY+3qfIoKHjblbIs6BUyHPq1xGK1wvFdfXo=
github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY= 2025-dev.shylinux.com/x/20250211-service v0.0.6/go.mod h1:iHH7uHRP7WasG19pNjujlXwZFjJqzX3dS0/T1imfsj0=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= 2025-dev.shylinux.com/x/20250215-cluster v0.0.6/go.mod h1:4sbNfB+nBVmIpRSzVlY+uiEQv44JdPfwwBpwWzbQktw=
github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE= 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=
github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw=
github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=
github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=
github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dhowden/itl v0.0.0-20170329215456-9fbe21093131/go.mod h1:eVWQJVQ67aMvYhpkDwaH2Goy2vo6v8JCMfGXfQ9sPtw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dhowden/plist v0.0.0-20141002110153-5db6e0d9931a/go.mod h1:sLjdR6uwx3L6/Py8F+QgAfeiuY87xuYGwCDqRFrvCzw= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8/go.mod h1:apkPC/CR3s48O2D7Y++n1XWEpgPNNCjXYga3PPbJe2E= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA= github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA=
github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY= github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY=
github.com/emersion/go-message v0.15.0 h1:urgKGqt2JAc9NFJcgncQcohHdiYb803YTH9OQwHBHIY= github.com/emersion/go-message v0.15.0 h1:urgKGqt2JAc9NFJcgncQcohHdiYb803YTH9OQwHBHIY=
@ -16,218 +24,187 @@ github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 h1:OJyUGMJTzHTd1X
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY= github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY=
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U= github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo=
github.com/glerchundi/subcommands v0.0.0-20181212083838-923a6ccb11f8/go.mod h1:r0g3O7Y5lrWXgDfcFBRgnAKzjmPgTzwoMC2ieB345FY= github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k=
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
github.com/hajimehoshi/go-jisx0208 v1.0.0/go.mod h1:yYxEStHL7lt9uL+AbdWgW9gBumwieDoZCiB1f/0X0as= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/peterbourgon/ff/v3 v3.1.2/go.mod h1:XNJLY8EIl6MjMVjBS4F0+G0LYoAqs0DTa4rmHHukKDE=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sago35/go-bdf v0.0.0-20200313142241-6c17821c91c4/go.mod h1:rOebXGuMLsXhZAC6mF/TjxONsm45498ZyzVhel++6KM= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/saltosystems/winrt-go v0.0.0-20240509164145-4f7860a3bd2b/go.mod h1:CIltaIm7qaANUIvzr0Vmz71lmQMAIbGJ7cvgzX7FMfA= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/soypat/cyw43439 v0.0.0-20240609122733-da9153086796/go.mod h1:1Otjk6PRhfzfcVHeWMEeku/VntFqWghUwuSQyivb2vE=
github.com/soypat/natiu-mqtt v0.5.1/go.mod h1:xEta+cwop9izVCW7xOx2W+ct9PRMqr0gNVkvBPnQTc4=
github.com/soypat/saleae v0.0.0-20230402180913-3584b7515dae/go.mod h1:9SV+w6E9YK/BePxdxYGXthkrRztHJCQlojWOjAxW3M4=
github.com/soypat/seqs v0.0.0-20240527012110-1201bab640ef/go.mod h1:oCVCNGCHMKoBj97Zp9znLbQ1nHxpkmOY9X+UAGzOxc8=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tdakkota/win32metadata v0.1.0/go.mod h1:77e6YvX0LIVW+O81fhWLnXAxxcyu/wdZdG7iwed7Fyk= github.com/wechatpay-apiv3/wechatpay-go v0.2.20 h1:gS8oFn1bHGnyapR2Zb4aqTV6l4kJWgbtqjCq6k1L9DQ=
github.com/tinygo-org/cbgo v0.0.4/go.mod h1:7+HgWIHd4nbAz0ESjGlJ1/v9LDU1Ox8MGzP9mah/fLk= github.com/wechatpay-apiv3/wechatpay-go v0.2.20/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q=
github.com/tinygo-org/pio v0.0.0-20231216154340-cd888eb58899/go.mod h1:LU7Dw00NJ+N86QkeTGjMLNkYcEYMor6wTDpTCu0EaH8= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=
github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.5.5/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
golang.org/x/image v0.0.0-20220617043117-41969df76e82/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
gorm.io/driver/sqlite v1.5.6/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg= gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
shylinux.com/x/community v0.0.3/go.mod h1:f/FIWPGaDLvnrpdpG5c9Ttj0hZzV51RtOOnW5IYk3IA= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
shylinux.com/x/community v0.0.4/go.mod h1:JDPG8S21VOKn5hoa2YdCp87MMpYv+6777ut8dHopww0= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
shylinux.com/x/community v0.0.6/go.mod h1:LHW7uwm+t5j2UVUuIkaUXNQ9u6z7i32a1intAl4Iuxg= modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20=
shylinux.com/x/community v0.0.7 h1:oC0de9JQHG2g0vE1Qo0FIctHrkB6zipjXIX94nx3gdg= modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0=
shylinux.com/x/community v0.0.7/go.mod h1:1DDT5gvsVi9Wgz2D+Gh8jvKkH1Np1Yq+XLgE6gXL0oY= modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI=
shylinux.com/x/enterprise v0.0.1/go.mod h1:AHfHtTtR5AmSrCQqDh5gCU57h40V2UyA00nC1yEMsns= modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g=
shylinux.com/x/enterprise v0.0.3/go.mod h1:lo9wM4971wjrjrvuTD+KKzje6N7k3LV2+5c2DLuOXNM= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY=
shylinux.com/x/enterprise v0.0.4/go.mod h1:sBLCMzaz612zlLlTFB93e302dYOy4aS856xaXqyBNJg= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
shylinux.com/x/enterprise v0.0.5 h1:rb2XxDC6Cfgnx1IC3CQ0z+cIX3jUsCuQvQrG9eLA6ZE= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
shylinux.com/x/enterprise v0.0.5/go.mod h1:DiTiXP00MFDUR2trnsy5/qJ/w+JOOQC36YWloTGCZHs= modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA=
modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0=
modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI=
modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE=
modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY=
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds=
modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM=
modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=
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/community v0.0.28 h1:/h7gthD8X6lVh1dDg3W3sBX4dpotbddfdGdR/BqBV4c=
shylinux.com/x/community v0.0.28/go.mod h1:MamBZhpO3+c5YISRJt4xnxa5VDBBstUR+9FnPQrhZMU=
shylinux.com/x/enterprise v0.0.17 h1:29VjNHt4YiPryQGNtVTnYqiXNHxau4EnkoUDzlxgB6Y=
shylinux.com/x/enterprise v0.0.17/go.mod h1:+DmZbYMykX5U65BJ7DYOcwFubslKa2b78DyRaqUYuH4=
shylinux.com/x/go-git/v5 v5.6.7 h1:WD5QSco7m3QooPCgdvQ6/GyGIFPun8C+hex5N41LYlk= 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-git/v5 v5.6.7/go.mod h1:Qb0lA+uIrofZg8NQerhYcJHgGWixFqvS6p3aJ/L5Nlk=
shylinux.com/x/go-qrcode v0.0.3 h1:RMo+Vidbgq3HatLBj7DDXcTbTLFUwzis5K7TqBkD38U= shylinux.com/x/go-qrcode v0.0.3 h1:RMo+Vidbgq3HatLBj7DDXcTbTLFUwzis5K7TqBkD38U=
shylinux.com/x/go-qrcode v0.0.3/go.mod h1:KAbtU+KwiiABMZ/CJ0zh9PI2AX82Uf9rRYcQ4ODm4po= shylinux.com/x/go-qrcode v0.0.3/go.mod h1:KAbtU+KwiiABMZ/CJ0zh9PI2AX82Uf9rRYcQ4ODm4po=
shylinux.com/x/go-sql-mysql v0.0.2/go.mod h1:lHjRMZz5Lii6U+49fhkbCWgsnL+yux54SYJYWqASN8Y= shylinux.com/x/go-sql-mysql v0.0.2/go.mod h1:lHjRMZz5Lii6U+49fhkbCWgsnL+yux54SYJYWqASN8Y=
shylinux.com/x/golang-story v0.0.24/go.mod h1:G0WEOJ0gCYR2tOs1ggyMBBrUMqJEgJjyvdFjN3VpNoM= shylinux.com/x/golang-story v0.0.32 h1:7xu28iREL2cuZzf80luJwI9BWptow+ME00L1lgyjmDI=
shylinux.com/x/golang-story v0.0.25 h1:3d+wiWqKddS3OwLrKfCt+PNdOx2GlT8RUSKOO/ngIjg= shylinux.com/x/golang-story v0.0.32/go.mod h1:NsI5fULu3q7o2b+VzZ5tiJ3+0pUTjE9DdQxa870htmw=
shylinux.com/x/golang-story v0.0.25/go.mod h1:X1ed1h9FojVVCB48z32GiCWObDkF5DCWlDB6cibvEnQ= shylinux.com/x/ice v1.5.72/go.mod h1:ouTMN0stkJu1RGAQrMHrGj/BqDynyD1VV53shR9zQm4=
shylinux.com/x/ice v1.5.41/go.mod h1:hMhVMhUlsimwFcsPIH+J/tO8O8I0WEqg1NYyqdhULxE= shylinux.com/x/ice v1.5.73/go.mod h1:uGI73gYkk+FiJt5qmy/aYhoKRJ4wobcJk3WrPGh8Waw=
shylinux.com/x/ice v1.5.43/go.mod h1:m5PPsVula2aqFHp5kZX3talhwZ4u4zsLqqU0X3cesc0= shylinux.com/x/ice v1.5.74 h1:5hTPmchO79b1d2+/DwBDLiG2WkTL65G/hOEAcGJVeB8=
shylinux.com/x/ice v1.5.44/go.mod h1:/ze8UI3sUpdx8S/Qadr8xYRvLIri4P93Mkwi4b9EmEk= shylinux.com/x/ice v1.5.74/go.mod h1:/XAib8Ha+z6jzLRs2Pig+qxDx4C8dT8Vfaq2InJ/lkU=
shylinux.com/x/ice v1.5.45 h1:g1zT2LLicOTtGU4fUIqkfXYDERWJ6n20dz4zeOXS+iY= shylinux.com/x/icebergs v1.9.73/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
shylinux.com/x/ice v1.5.45/go.mod h1:zQ6azXiRPHq1QE/buftQ1dRwfzgkPzZptXW083VfE40= shylinux.com/x/icebergs v1.9.75/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
shylinux.com/x/icebergs v1.9.39/go.mod h1:rUqDj1pzd6uPj7+klEn+doqXiWlb/24/batRyBB5ppo= shylinux.com/x/icebergs v1.9.76 h1:SHOTbiO+jh09GEFzoo8t8kmR1BCu+zkNCpdfxPCLeu0=
shylinux.com/x/icebergs v1.9.41/go.mod h1:/BcFEB/6Dd70Owmb3wsA9NYShHQwmSH74xn9pNudRMg= shylinux.com/x/icebergs v1.9.76/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
shylinux.com/x/icebergs v1.9.44/go.mod h1:/BcFEB/6Dd70Owmb3wsA9NYShHQwmSH74xn9pNudRMg= shylinux.com/x/mysql-story v0.6.32 h1:Q274WFJ09ocnf8nhlQnKr02FMMdPYBLWqu2IjTVqGiM=
shylinux.com/x/icebergs v1.9.45 h1:DexhbO/qvIdR1Gxuq60ZIUNVpmXcfmNEqEq8SxSQXmw= shylinux.com/x/mysql-story v0.6.32/go.mod h1:8HCeDUV6ghaIeJD1IEhSeSOfVC9wEI93y2G9QBLtJJY=
shylinux.com/x/icebergs v1.9.45/go.mod h1:wM3PkomBSeASTekVjxuOP8Y28HYq84MxUZ3d5BZEN74=
shylinux.com/x/mysql-story v0.6.14/go.mod h1:AvzKCyuN/zYMYRky3YjCsX1RLwCZFAL4zuQ5jzZidsM=
shylinux.com/x/mysql-story v0.6.16/go.mod h1:GTvoeL4r0PYEtZomPQgnndxSxHIZzPdrWkbQmplmn5o=
shylinux.com/x/mysql-story v0.6.18/go.mod h1:Am+fx/T9pEeUepoX0eoSM53Qu0xVcQKpLGdBNC+x43A=
shylinux.com/x/mysql-story v0.6.19 h1:U5u8qAA4Rq8CEP3QBtbxRz6WPVsV5vb/SZXn22W27sw=
shylinux.com/x/mysql-story v0.6.19/go.mod h1:1YCZtwNUgg26vlhecjnFiPWfUq5i7YfHC6nxy+waGuQ=
shylinux.com/x/toolkits v0.7.10/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q= shylinux.com/x/toolkits v0.7.10/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/toolkits v1.0.13/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q= shylinux.com/x/toolkits v1.0.19 h1:Nrx0xYRc5ph1WS66EZ1hJUCe+2FdSWQ4QP6tBlguikQ=
shylinux.com/x/toolkits v1.0.14/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q= shylinux.com/x/toolkits v1.0.19/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/toolkits v1.0.15 h1:E8+tCRfAe7L5z3EfyHA3Zf+0czxjHfOw40q3158Rsw4=
shylinux.com/x/toolkits v1.0.15/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/websocket v0.0.4 h1:AJpwblePoOpiE6C8NrvgNYpKTotXMLrDDX2chTvx44Q= shylinux.com/x/websocket v0.0.4 h1:AJpwblePoOpiE6C8NrvgNYpKTotXMLrDDX2chTvx44Q=
shylinux.com/x/websocket v0.0.4/go.mod h1:3UGWkjTu3ie5NAZen7J+uLPBrO7DFeKloj6Jxo13Oiw= shylinux.com/x/websocket v0.0.4/go.mod h1:3UGWkjTu3ie5NAZen7J+uLPBrO7DFeKloj6Jxo13Oiw=
tinygo.org/x/bluetooth v0.10.0/go.mod h1:t/Vm2a/rslsBoqFQKCBsWQw/cmRicQq+8Tl3tj5RCRI=
tinygo.org/x/drivers v0.14.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
tinygo.org/x/drivers v0.16.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI=
tinygo.org/x/drivers v0.19.0/go.mod h1:uJD/l1qWzxzLx+vcxaW0eY464N5RAgFi1zTVzASFdqI=
tinygo.org/x/drivers v0.25.0/go.mod h1:v+mXaA4cgpz/YZJ3ZPm/86bYQJAXTaYtMkHlVwbodbw=
tinygo.org/x/drivers v0.26.1-0.20230922160320-ed51435c2ef6/go.mod h1:X7utcg3yfFUFuKLOMTZD56eztXMjpkcf8OHldfTBsjw=
tinygo.org/x/tinyfont v0.2.1/go.mod h1:eLqnYSrFRjt5STxWaMeOWJTzrKhXqpWw7nU3bPfKOAM=
tinygo.org/x/tinyfont v0.3.0/go.mod h1:+TV5q0KpwSGRWnN+ITijsIhrWYJkoUCp9MYELjKpAXk=
tinygo.org/x/tinyfont v0.4.0/go.mod h1:7nVj3j3geqBoPDzpFukAhF1C8AP9YocMsZy0HSAcGCA=
tinygo.org/x/tinyfs v0.1.0/go.mod h1:ysc8Y92iHfhTXeyEM9+c7zviUQ4fN9UCFgSOFfMWv20=
tinygo.org/x/tinyterm v0.1.0/go.mod h1:/DDhNnGwNF2/tNgHywvyZuCGnbH3ov49Z/6e8LPLRR4=
tinygo.org/x/tinyterm v0.3.0/go.mod h1:F1pQjxEwNZQIc5czeJSBtk57ucEvbR4u7vHaLhWhHtg=

35
src/dashboard/cleanup.go Normal file
View File

@ -0,0 +1,35 @@
package dashboard
import (
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
"shylinux.com/x/operation/src/dashboard/model"
)
type cleanup struct {
Tables
portal Portal
order string `data:"3"`
role string `data:"leader"`
placeTrash string `name:"placeTrash" help:"清理"`
}
func (s cleanup) PlaceTrash(m *ice.Message, arg ...string) {
m.Cmd("").Table(func(value ice.Maps) {
if value[model.AUTH_UID] != "" {
s.AutoCmd(m, api.RENZHENGSHOUQUAN_PORTAL, s.portal.PlaceTrash, kit.Dict(model.UID, value[model.AUTH_UID]))
}
s.AutoCmd(m, value[model.INDEX], s.portal.PlaceTrash, value)
})
}
func (s cleanup) List(m *ice.Message, arg ...string) {
m.Cmd("service").Table(func(value ice.Maps) {
s.AutoCmdy(m, value[model.INDEX], s.portal.PlaceCheck)
})
m.Action(s.PlaceTrash)
m.DisplayTable()
}
func init() { ice.TeamCtxCmd(cleanup{}) }

View File

@ -18,12 +18,7 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
case model.USER_DASHBOARD_ROLE: case model.USER_DASHBOARD_ROLE:
s.InputsListRole(m, UserDashboardRoleList, arg...) s.InputsListRole(m, UserDashboardRoleList, arg...)
case model.DASHBOARD_TYPE: case model.DASHBOARD_TYPE:
for v, k := range DashboardTypeList { s.InputsListSkip(m, DashboardTypeList, kit.Select("0", "-1", m.IsTech()), arg...)
if m.IsTech() || v > 0 {
m.Push(arg[0], v).Push(model.NAME, k)
}
}
m.SortInt(arg[0]).DisplayInputKeyNameIconTitle()
default: default:
s.Table.Inputs(m, arg...) s.Table.Inputs(m, arg...)
} }

View File

@ -1,28 +1,36 @@
package dashboard package dashboard
import ( import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/mysql-story/src/db" "shylinux.com/x/mysql-story/src/db/mysql"
"shylinux.com/x/operation/src/dashboard/model" "shylinux.com/x/operation/src/dashboard/model"
) )
type dashboard struct { type dashboard struct {
Table Table
order string `data:"1"` order string `data:"1"`
role string `data:"leader"`
fields string `data:"dashboard_type,host,port,username,database"` fields string `data:"dashboard_type,host,port,username,database"`
config string `name:"config host* port* username* password* database*" role:"leader"` config string `name:"config host* port* username* password* database*" role:"leader"`
} }
func (s dashboard) Config(m *ice.Message, arg ...string) {
s.Update(m, kit.Dict(arg), model.UID, m.Option(model.DASHBOARD_UID))
s.UserPlaceInit(m)
}
func (s dashboard) Schema(m *ice.Message, arg ...string) {
s.Show(m, s.Open(m).Raw(`
select TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH from information_schema.TABLES
where TABLE_SCHEMA != 'mysql' AND TABLE_SCHEMA != 'information_schema' AND TABLE_SCHEMA != 'performance_schema'
order by DATA_LENGTH desc
`))
m.DisplayTable()
}
func (s dashboard) List(m *ice.Message, arg ...string) { func (s dashboard) List(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
return return
@ -31,61 +39,39 @@ func (s dashboard) List(m *ice.Message, arg ...string) {
if DashboardType(kit.Int(m.Append(model.DASHBOARD_TYPE))) == DashboardPlace { if DashboardType(kit.Int(m.Append(model.DASHBOARD_TYPE))) == DashboardPlace {
if s.IsLeader(m) { if s.IsLeader(m) {
m.Action(s.Schema) m.Action(s.Schema)
s.UserPlaceInit(m)
} }
s.UserPlaceInit(m)
} else if m.Append(model.USERNAME) == "" { } else if m.Append(model.USERNAME) == "" {
m.SetAppend().EchoInfoButton("", s.Config) m.SetAppend().EchoInfoButton("", s.Config)
} else { } else {
if s.IsLeader(m) { if s.IsLeader(m) {
m.PushAction(s.Config).Action(s.Config, s.Schema) m.PushAction(s.Config).Action(s.Config)
s.UserPlaceInit(m) s.UserPlaceInit(m)
} else {
m.Action()
} }
} }
} }
func (s dashboard) Config(m *ice.Message, arg ...string) {
s.Update(m, kit.Dict(arg), model.UID, m.Option(model.DASHBOARD_UID))
s.UserPlaceInit(m)
}
func (s dashboard) Schema(m *ice.Message, arg ...string) {
db := m.Configv(db.DB).(*gorm.DB)
s.Show(m, db.Raw(`
select TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH from information_schema.TABLES
where TABLE_SCHEMA != 'mysql' AND TABLE_SCHEMA != 'information_schema' AND TABLE_SCHEMA != 'performance_schema'
order by DATA_LENGTH desc
`))
m.Display("/plugin/table.js")
}
func init() { ice.TeamCtxCmd(dashboard{}) } func init() { ice.TeamCtxCmd(dashboard{}) }
func (s dashboard) Open(msg *ice.Message, cb func(*gorm.DB)) { func (s dashboard) scan(m *ice.Message, dashboard_uid string, cb func(*ice.Message, ice.Maps)) {
dsn := kit.Format("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True",
msg.Append(model.USERNAME), msg.Append(model.PASSWORD), msg.Append(model.HOST), msg.Append(model.PORT), msg.Append(model.DATABASE))
if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)}); !msg.Warn(err) {
cb(db)
}
}
func (s dashboard) Scan(m *ice.Message, dashboard_uid string, cb func(*ice.Message, ice.Maps)) {
msg := m.Cmd(s, s.Select, model.UID, dashboard_uid) msg := m.Cmd(s, s.Select, model.UID, dashboard_uid)
switch DashboardType(kit.Int(msg.Append(model.TYPE))) { switch DashboardType(kit.Int(msg.Append(model.TYPE))) {
case DashboardPlace: case DashboardPlace:
m.Table(func(value ice.Maps) { m.Table(func(value ice.Maps) {
msg := s.SpaceCmd(m, value[web.SPACE], value[ctx.INDEX], mdb.SELECT, kit.Simple(kit.UnMarshal(value[model.QUERY])), kit.Dict( msg := s.AutoCmd(m, value[ctx.INDEX], mdb.SELECT, kit.Simple(kit.UnMarshal(value[model.QUERY])), kit.Dict(
mdb.SELECT, kit.Select("count(*)", value[mdb.FIELD]), ice.MSG_USERROLE, aaa.TECH, mdb.SELECT, kit.Select("count(*)", value[mdb.FIELD]), ice.MSG_USERROLE, aaa.TECH,
)) ))
cb(msg, value) cb(msg, value)
}) })
case DashboardMySQL: case DashboardMySQL:
s.Open(m, func(db *gorm.DB) { if db, err := mysql.Open(msg); !msg.Warn(err) {
m.Table(func(value ice.Maps) { m.Table(func(value ice.Maps) {
db = db.Table(s.TableName(kit.Join(kit.Slice(kit.Split(value[ctx.INDEX], "."), -2), "."))) db = db.Table(s.TableName(kit.Join(kit.Slice(kit.Split(value[ctx.INDEX], "."), -2), ".")))
kit.If(value[model.QUERY], func(p string) { s.Where(m, db, kit.Simple(kit.UnMarshal(p))...) }) kit.If(value[model.QUERY], func(p string) { s.Where(m, db, kit.Simple(kit.UnMarshal(p))...) })
msg := s.Rows(m.Spawn(), db.Select(kit.Select("count(*)", value[mdb.FIELD]))) msg := s.Rows(m.Spawn(), db.Select(kit.Select("count(*)", value[mdb.FIELD])))
cb(msg, value) cb(msg, value)
}) })
}) }
case DashboardRedis: case DashboardRedis:
} }
} }

View File

@ -3,31 +3,32 @@ package model
import "shylinux.com/x/mysql-story/src/db" import "shylinux.com/x/mysql-story/src/db"
const ( const (
UID = "uid" UID = "uid"
NAME = "name" NAME = "name"
TYPE = "type" INFO = "info"
ROLE = "role" TYPE = "type"
TITLE = "title" TITLE = "title"
CONTENT = "content" CONTENT = "content"
CREATED_AT = "created_at" CREATED_AT = "created_at"
USER_UID = "user_uid" DELETED_AT = "deleted_at"
USER_UID = "user_uid"
USER_DASHBOARD_ROLE = "user_dashboard_role" USER_DASHBOARD_ROLE = "user_dashboard_role"
AUTH_UID = "auth_uid"
DASHBOARD_UID = "dashboard_uid" DASHBOARD_UID = "dashboard_uid"
DASHBOARD_NAME = "dashboard_name" DASHBOARD_NAME = "dashboard_name"
DASHBOARD_TYPE = "dashboard_type" DASHBOARD_TYPE = "dashboard_type"
SUMMARY_UID = "summary_uid" SUMMARY_UID = "summary_uid"
COMPANY_UID = "company_uid" COMPANY_UID = "company_uid"
CITY_UID = "city_uid" CITY_UID = "city_uid"
HOST = "host" HOST = "host"
PORT = "port" PORT = "port"
USERNAME = "username" USERNAME = "username"
PASSWORD = "password" PASSWORD = "password"
DATABASE = "database" DATABASE = "database"
TABLES = "tables" QUERY = "query"
FIELDS = "fields" VALUE = "value"
QUERY = "query" SCORE = "score"
VALUE = "value" INDEX = "index"
SCORE = "score"
) )
type UserDashboard struct { type UserDashboard struct {
@ -46,12 +47,13 @@ type Dashboard struct {
type Summary struct { type Summary struct {
db.ModelContent db.ModelContent
DashboardUID string `gorm:"type:char(32);index"` DashboardUID string `gorm:"type:char(32);index"`
Space string `gorm:"type:varchar(64)"` Space string `gorm:"type:varchar(64)"`
Index string `gorm:"type:varchar(128)"` Index string `gorm:"type:varchar(128)"`
Query string `gorm:"type:varchar(255)"` Query string `gorm:"type:varchar(255)"`
Field string `gorm:"type:varchar(255)"` Field string `gorm:"type:varchar(255)"`
Value float32 `gorm:"default:0"` Value float32 `gorm:"default:0"`
Score float32 `gorm:"default:0"` Score float32 `gorm:"default:0"`
Unit string `gorm:"type:varchar(16)"`
} }
func init() { db.CmdModels("", &UserDashboard{}, &Dashboard{}, &Summary{}) } func init() { db.CmdModels("", &UserDashboard{}, &Dashboard{}, &Summary{}) }

View File

@ -7,7 +7,7 @@ import (
type Portal struct { type Portal struct {
operation.Portal operation.Portal
placeCreate string `name:"placeCreate city_name* company_name* dashboard_name* dashboard_type*:select" role:"void"` placeCreate string `name:"placeCreate city_name* company_name* dashboard_name* dashboard_type:select" role:"void"`
} }
func init() { func init() {

View File

@ -1,10 +1,11 @@
{ {
"portal": "数据分析", "portal": "数据分析",
"dashboard": "连接配置", "summary": "数据汇总", "dashboard": "连接配置", "summary": "数据汇总", "cleanup": "数据清理",
"config": "配置", "schema": "概况", "config": "配置", "schema": "概况",
"icons": { "icons": {
"dashboard": "https://img.icons8.com/officel/80/data-configuration.png", "dashboard": "https://img.icons8.com/officel/80/data-configuration.png",
"summary": "https://img.icons8.com/officel/80/statistics.png" "summary": "https://img.icons8.com/officel/80/statistics.png",
"cleanup": "https://img.icons8.com/officel/80/data-configuration.png"
}, },
"input": { "input": {
"My Dashboard": "我的数据", "My Dashboard": "我的数据",

View File

@ -1,3 +1,4 @@
$output>div.item { text-align:center; padding:10px; float:left; } $output>div.item { text-align:center; padding:10px; float:left; }
$output>div.item div.value { font-size:24px; } $output>div.item div.value { font-size:24px; white-space:pre; }
$output>div.item div.value span.unit { font-size:12px; }
$output>div.item div.title { font-size:12px; } $output>div.item div.title { font-size:12px; }

View File

@ -10,36 +10,24 @@ import (
type summary struct { type summary struct {
Table Table
dashboard dashboard dashboard dashboard
order string `data:"2"` order string `data:"2"`
create string `name:"create space* index* query field title score" role:"leader"` role string `data:"leader,worker"`
modify string `name:"modify space* index* query field title score" role:"leader"` create string `name:"create space* index* query field title score unit" role:"leader"`
remove string `name:"remove" role:"leader"` modify string `name:"modify space* index* query field title score unit" role:"leader"`
scan string `name:"scan" role:"leader"` remove string `name:"remove" role:"leader"`
scan string `name:"scan" role:"leader"`
} }
func (s summary) Scan(m *ice.Message, arg ...string) { func (s summary) Scan(m *ice.Message, arg ...string) {
dashboard_uid := kit.Select(m.Option(model.DASHBOARD_UID), arg, 0) dashboard_uid := kit.Select(m.Option(model.DASHBOARD_UID), arg, 0)
s.dashboard.Scan(s.List(m, dashboard_uid), dashboard_uid, func(msg *ice.Message, value ice.Maps) { s.dashboard.scan(s.List(m, dashboard_uid), dashboard_uid, func(msg *ice.Message, value ice.Maps) {
s.Update(m, kit.Dict(model.VALUE, msg.Append(msg.Append(ice.MSG_APPEND))), model.UID, value[model.UID]) s.Update(m, kit.Dict(model.VALUE, msg.Append(msg.Append(ice.MSG_APPEND))), model.UID, value[model.UID])
}) })
} }
func (s summary) List(m *ice.Message, arg ...string) *ice.Message {
if len(arg) == 0 {
return m
}
s.Orders(m, model.SCORE, s.Desc(model.CREATED_AT))
s.Select(m, model.DASHBOARD_UID, arg[0])
if s.IsLeader(m) {
m.PushAction(s.Modify, s.Remove).Action(s.Create, s.Scan, s.Schema)
} else {
m.Action()
}
return s.Button(m, "").Display("").DisplayCSS("")
}
func (s summary) Schema(m *ice.Message, arg ...string) { func (s summary) Schema(m *ice.Message, arg ...string) {
databases := map[string]bool{}
tables := map[string]bool{}
stats := map[string]int{} stats := map[string]int{}
tables := map[string]bool{}
databases := map[string]bool{}
m.Cmd(s.dashboard, s.Schema).Table(func(value ice.Maps) { m.Cmd(s.dashboard, s.Schema).Table(func(value ice.Maps) {
if !databases[value["TABLE_SCHEMA"]] { if !databases[value["TABLE_SCHEMA"]] {
databases[value["TABLE_SCHEMA"]] = true databases[value["TABLE_SCHEMA"]] = true
@ -59,4 +47,19 @@ func (s summary) Schema(m *ice.Message, arg ...string) {
m.Display("").DisplayCSS("") m.Display("").DisplayCSS("")
} }
func (s summary) List(m *ice.Message, arg ...string) *ice.Message {
if len(arg) == 0 {
return m
}
s.Orders(m, model.SCORE, s.Desc(model.CREATED_AT))
s.Select(m, model.DASHBOARD_UID, arg[0])
if s.IsLeader(m) {
m.PushAction(s.Modify, s.Remove).Action(s.Create, s.Scan, s.Schema)
s.Button(m, "")
} else {
m.Action()
}
return m.Display("").DisplayCSS("")
}
func init() { ice.TeamCtxCmd(summary{}) } func init() { ice.TeamCtxCmd(summary{}) }

View File

@ -1,13 +1,22 @@
Volcanos(chat.ONIMPORT, { Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { var width = can.onimport.width(can, 80, msg.Length()) _init: function(can, msg) { var width = can.onimport.width(can, 80, msg.Length())
can.page.Append(can, can._output, msg.Table(function(value) { can.page.Append(can, can._output, msg.Table(function(value) {
var cb = can.onimport[value.unit]||can.onimport.unit
return {view: html.ITEM, style: {width: width}, list: [ return {view: html.ITEM, style: {width: width}, list: [
{view: [html.VALUE, "", can.base.trimSuffix(can.base.Size(value.value), "B")]}, {view: [html.TITLE, "", value.title||value.index.split(".").pop()]}, {view: html.VALUE, list: cb(can, value.value, value.unit||"")},
], oncontextmenu: function(event) { {view: html.TITLE, list: [{text: value.title||value.index.split(".").pop()}]},
can.onkeymap.prevent(event), can.user.carteItem(event, can, value) ]}
}}
})) }))
}, },
money: function(can, value) { return can.onimport.unit(can, value, "元") },
order: function(can, value) { return can.onimport.unit(can, value, "单") },
stock: function(can, value) { return can.onimport.unit(can, value, "件") },
size: function(can, value) { return [{text: can.base.Size(value)}] },
unit: function(can, value, unit) { var v = parseFloat(value)
if (v > 100000000) { return [{text: (v/100000000).toFixed(2)}, {text: ["亿"+unit, "", "unit"]}] }
if (v > 10000) { return [{text: (v/10000).toFixed(2)}, {text: ["万"+unit, "", "unit"]}] }
return [{text: value}, {text: [unit, "", "unit"]}]
},
width: function(can, min, length) { width: function(can, min, length) {
var count = (parseInt(can.ConfWidth()/min)); if (length < count) { count = length } var count = (parseInt(can.ConfWidth()/min)); if (length < count) { count = length }
return can.ConfWidth()/(count||1) return can.ConfWidth()/(count||1)

View File

@ -2,6 +2,10 @@ package development
import ( import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/operation/src/development/model" "shylinux.com/x/operation/src/development/model"
@ -13,12 +17,34 @@ type Table struct {
list string `name:"list repos_uid uid auto" role:"void"` list string `name:"list repos_uid uid auto" role:"void"`
} }
func (s Table) BeforeAction(m *ice.Message, arg ...string) {
if len(arg) == 0 {
return
}
kit.If(len(arg) == 1 || arg[0] != ctx.ACTION, func() { m.Option(model.REPOS_UID, arg[0]) })
msg := m.Cmd(repos{}, s.Select, model.UID, m.Option(model.REPOS_UID), ice.Maps{mdb.TABLE: ""})
m.Options(model.REPOS_NAME, msg.Append(model.NAME), model.REPOS_TYPE, msg.Append(model.TYPE))
}
func (s Table) Inputs(m *ice.Message, arg ...string) { func (s Table) Inputs(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case model.USER_REPOS_ROLE: case model.USER_REPOS_ROLE:
s.InputsListRole(m, UserReposRoleList, arg...) s.InputsListRole(m, UserReposRoleList, arg...)
case model.REPOS_TYPE: case model.REPOS_TYPE:
s.InputsList(m, ReposTypeList, arg...) s.InputsList(m, ReposTypeList, arg...)
case model.REPOS_NAME:
switch ReposType(kit.Int(m.Option(model.REPOS_TYPE))) {
case ReposSystem:
s.SpaceOpsCmdy(m, web.DREAM).CutTo(mdb.NAME, arg[0])
case ReposLibrary:
m.Cmdy(web.CODE_GIT_REPOS).CutTo(nfs.REPOS, arg[0])
}
case model.REPOS_LINK:
switch ReposType(kit.Int(m.Option(model.REPOS_TYPE))) {
case ReposSystem:
s.SpaceOpsCmdy(m, web.DREAM).CutTo(nfs.REPOS, arg[0])
case ReposLibrary:
m.Cmdy(web.CODE_GIT_REPOS).CutTo(web.ORIGIN, arg[0])
}
default: default:
s.Table.Inputs(m, arg...) s.Table.Inputs(m, arg...)
} }

View File

@ -0,0 +1,32 @@
package development
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/operation/src/development/model"
)
type history struct {
Tables
repos repos
order string `data:"12"`
list string `name:"list repos_uid commit auto" role:"void"`
}
func (s history) List(m *ice.Message, arg ...string) {
switch ReposType(kit.Int(m.Option(model.REPOS_TYPE))) {
case ReposSystem:
s.SpaceOpsCmdy(m, web.CODE_GIT_REPOS, m.Option(model.REPOS_NAME), "master", arg[1:])
case ReposLibrary:
m.Cmdy(web.CODE_GIT_REPOS, m.Option(model.REPOS_NAME), "master", arg[1:])
}
if len(arg) == 1 {
m.Display("")
} else {
m.DisplayTable()
}
}
func init() { ice.TeamCtxCmd(history{}) }

View File

@ -0,0 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.text]},
{view: html.STATUS, list: [value.commit.slice(0, 6), can.onimport.timeView(can, value), value.username]},
{view: html.STATUS, list: [can.onimport.unitView(can, value, "files"), can.onimport.unitView(can, value, "adds"), can.onimport.unitView(can, value, "dels")]},
] })
},
})

View File

@ -5,18 +5,17 @@ import "shylinux.com/x/mysql-story/src/db"
const ( const (
UID = "uid" UID = "uid"
NAME = "name" NAME = "name"
INFO = "info"
TYPE = "type" TYPE = "type"
ROLE = "role"
TITLE = "title" TITLE = "title"
CONTENT = "content" CONTENT = "content"
USER_UID = "user_uid" USER_UID = "user_uid"
USER_REPOS_ROLE = "user_repos_role" USER_REPOS_ROLE = "user_repos_role"
REPOS_UID = "repos_uid" REPOS_UID = "repos_uid"
REPOS_NAME = "repos_name" REPOS_NAME = "repos_name"
REPOS_LINK = "repos_link"
REPOS_TYPE = "repos_type" REPOS_TYPE = "repos_type"
VERSION_UID = "version_uid" VERSION_UID = "version_uid"
COMPANY_UID = "company_uid"
CITY_UID = "city_uid"
) )
type UserRepos struct { type UserRepos struct {
@ -26,6 +25,7 @@ type UserRepos struct {
type Repos struct { type Repos struct {
db.ModelPlace db.ModelPlace
CompanyUID string `gorm:"type:char(32);index"` CompanyUID string `gorm:"type:char(32);index"`
Link string `gorm:"type:varchar(255)"`
} }
type Version struct { type Version struct {
db.ModelContent db.ModelContent

View File

@ -1,13 +1,30 @@
package development package development
import ( import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/gonganxitong" "shylinux.com/x/community/src/gonganxitong"
"shylinux.com/x/operation/src/development/model"
"shylinux.com/x/operation/src/operation" "shylinux.com/x/operation/src/operation"
) )
type Portal struct { type Portal struct {
operation.Portal operation.Portal
placeCreate string `name:"placeCreate city_name* company_name* repos_name* repos_type*:select" role:"void"` placeCreate string `name:"placeCreate city_name* company_name* repos_type*:select repos_name* repos_link" role:"void"`
}
func (s Portal) PlaceCreate(m *ice.Message, arg ...string) {
switch ReposType(kit.Int(m.Option(model.REPOS_TYPE))) {
case ReposSystem:
msg := s.SpaceOpsCmd(m, web.DREAM, mdb.CREATE, m.Option(model.REPOS_NAME), m.Option(model.REPOS_LINK))
arg = append(arg, model.NAME, msg.Option(model.NAME))
case ReposLibrary:
case ReposGithub:
}
s.Portal.PlaceCreate(m, arg...)
} }
func init() { gonganxitong.PortalCmd(Portal{Portal: operation.NewPortal(userRepos{}, repos{})}) } func init() { gonganxitong.PortalCmd(Portal{Portal: operation.NewPortal(userRepos{}, repos{})}) }

View File

@ -1,14 +1,21 @@
{ {
"portal": "软件开发", "portal": "软件开发",
"version": "版本", "serve": "服务模块",
"history": "提交记录",
"imports": "注入依赖库",
"icons": { "icons": {
"version": "https://img.icons8.com/officel/80/activity-grid.png" "serve": "https://img.icons8.com/officel/80/activity-grid.png"
},
"style": {
"open": "notice"
}, },
"input": { "input": {
"My Repos": "我的源码", "My Repos": "我的源码",
"user_repos_role": "用户角色", "user_repos_role": "用户角色",
"repos_uid": "源码",
"repos_name": "源码名称", "repos_name": "源码名称",
"repos_type": "源码类型" "repos_type": "源码类型",
"repos_link": "源码地址"
}, },
"value": { "value": {
"user_repos_role": { "user_repos_role": {
@ -23,8 +30,9 @@
} }
}, },
"repos_type": { "repos_type": {
"local": "本地库", "system": "系统库",
"remote": "远程库" "library": "依赖库",
"github": "Github"
} }
} }
} }

View File

@ -9,13 +9,15 @@ func init() { ice.TeamCtxCmd(repos{}) }
type ReposType int type ReposType int
const ( const (
ReposLocal ReposType = iota ReposSystem ReposType = iota
ReposRemote ReposLibrary
ReposGithub
) )
var ReposTypeList = map[ReposType]string{ var ReposTypeList = map[ReposType]string{
ReposLocal: "local", ReposSystem: "system",
ReposRemote: "remote", ReposLibrary: "library",
ReposGithub: "github",
} }
func (s ReposType) String() string { return ReposTypeList[s] } func (s ReposType) String() string { return ReposTypeList[s] }

118
src/development/serve.go Normal file
View File

@ -0,0 +1,118 @@
package development
import (
"path"
"strings"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"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/core/code"
"shylinux.com/x/icebergs/misc/git"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
"shylinux.com/x/operation/src/development/model"
)
type serve struct {
Tables
repos repos
order string `data:"1"`
imports string `name:"imports" role:"leader,worker"`
autogen string `name:"autogen name* help* class* table*" icon:"bi bi-plus-square-dotted" role:"leader,worker"`
}
func (s serve) Imports(m *ice.Message, arg ...string) {
s.spaceCmdy(m, web.CODE_GIT_REPOS, code.INIT, kit.MergeURL2(m.Option(ice.MSG_USERHOST), web.X(m.Option(model.REPOS_NAME))))
s.spaceImport(m, "gonganxitong", "shylinux.com/x/community")
s.spaceImport(m, "db/mysql", "shylinux.com/x/mysql-story")
s.spaceCompile(m)
}
func (s serve) Autogen(m *ice.Message, arg ...string) {
defer s.SpaceOpsCmdy(m.SpawnSilent(), web.CODE_GIT_REPOS, mdb.CREATE, path.Join(nfs.USR_LOCAL_WORK, m.Option(model.REPOS_NAME)))
s.SpaceOpsCmdy(m.SpawnSilent(), web.CODE_COMPILE, code.DEVPACK)
s.spaceCmdy(m, api.GONGANXITONG_SERVICE, code.AUTOGEN, arg)
s.spaceRepos(m, git.ADD, nfs.SRC)
s.spaceRepos(m, git.COMMIT, "-am", "add "+m.Option(model.NAME))
s.spaceRepos(m, git.PUSH)
s.spaceCompile(m)
}
func (s serve) List(m *ice.Message, arg ...string) {
if len(arg) == 0 {
return
}
switch ReposType(kit.Int(m.Option(model.REPOS_TYPE))) {
case ReposSystem:
if s.spaceCmd(m, ctx.COMMAND, api.GONGANXITONG_SERVICE).Length() == 0 {
if m.IsTech() {
s.Button(m, "请注入依赖库", s.Imports)
} else {
m.Echo("系统未安化")
}
return
}
s.spaceCmdy(m, nfs.DIR, nfs.SRC, nfs.PATH, nfs.SIZE, mdb.TIME, kit.Dict(
nfs.DIR_DEEP, ice.TRUE, nfs.DIR_TYPE, nfs.TYPE_CAT, nfs.DIR_REG, nfs.PORTAL_JSON,
)).Table(func(value ice.Maps) {
m.Push(model.NAME, strings.Split(value[nfs.PATH], "/")[1])
}).SortStrR(mdb.TIME)
if m.IsTech() {
m.PushAction(s.Open, s.Conf, s.Code, s.Data).Action(s.Autogen).Display("")
s.Button(m, "请创建服务模块", s.Autogen)
} else {
m.Action()
}
}
}
func (s serve) Open(m *ice.Message, arg ...string) {
m.ProcessOpen(s.spaceLink(m, model.REPOS_UID, m.Option(model.REPOS_UID)))
}
func (s serve) Conf(m *ice.Message, arg ...string) {
m.ProcessOpen(s.spaceLink(m, mdb.VIEW, mdb.TABLE))
}
func (s serve) Code(m *ice.Message, arg ...string) {
m.ProcessOpen(kit.MergeURL(web.S(m.Option(model.REPOS_NAME))+web.C(code.VIMER), nfs.PATH, nfs.SRC, nfs.FILE, m.Option(model.NAME)+"/"+nfs.PORTAL_GO))
}
func (s serve) Data(m *ice.Message, arg ...string) {
m.ProcessOpen(kit.MergeURL(web.S(m.Option(model.REPOS_NAME))+web.C("web.code.mysql.query"), aaa.SESS, "mysql", mdb.DATABASE, m.Option(model.NAME)))
}
func init() { ice.TeamCtxCmd(serve{}) }
func (s serve) spaceLink(m *ice.Message, arg ...ice.Any) string {
return kit.MergeURL(web.S(m.Option(model.REPOS_NAME))+web.C("web.team."+m.Option(model.NAME)+".portal"), arg...)
}
func (s serve) spaceRepos(m *ice.Message, arg ...string) serve {
s.spaceCmdy(m, cli.SYSTEM, cli.GIT, arg)
return s
}
func (s serve) spaceImport(m *ice.Message, arg ...string) {
s.spaceCmdy(m, web.CODE_AUTOGEN, code.IMPORT, arg)
}
func (s serve) spaceCompile(m *ice.Message) {
if s.spaceCmdy(m, web.CODE_VIMER, code.COMPILE); m.IsErr() {
return
}
m.WaitEvent(web.OPS_SERVER_OPEN, func(msg *ice.Message, arg ...string) bool {
return msg.Option(mdb.NAME) == m.Option(model.REPOS_NAME)
})
}
func (s serve) spaceCmdy(m *ice.Message, arg ...ice.Any) *ice.Message {
if m.IsErr() {
return m
}
m.SetAppend().SetResult()
return s.SpaceCmdy(m, m.Option(model.REPOS_NAME), arg...)
}
func (s serve) spaceCmd(m *ice.Message, arg ...ice.Any) *ice.Message {
if m.IsErr() {
return m
}
m.SetAppend().SetResult()
return s.SpaceCmd(m, m.Option(model.REPOS_NAME), arg...)
}

8
src/development/serve.js Normal file
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.name, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [can.onimport.timeView(can, value)]},
] })
},
})

View File

@ -4,6 +4,7 @@ import "shylinux.com/x/ice"
type version struct { type version struct {
Table Table
order string `data:"11"`
fields string `data:"title,content,user_uid"` fields string `data:"title,content,user_uid"`
create string `name:"create title* content*" role:"leader"` create string `name:"create title* content*" role:"leader"`
remove string `name:"remove" role:"leader"` remove string `name:"remove" role:"leader"`

8
src/document/content.shy Normal file
View File

@ -0,0 +1,8 @@
spark project "云时代的新型操作系统,既要完全自给自足,又要任意互联互通" `
<b>产品迭代:</b>
<b>软件开发:</b>
<b>系统运维:</b>
<b>文件存储:</b>
<b>数据分析:</b>
`
spark product

11
src/document/index.shy Normal file
View File

@ -0,0 +1,11 @@
navmenu `
"{{ .Title }}" /
_
"下 载" download/
"文 档" started/
"开 发" development/
_
"应 用" "https://web.shylinux.com/s/20240903-operation"
"源 码" "https://git.shylinux.com/web/operation"
"社 区" "https://bbs.shylinux.com"
`

View File

@ -12,4 +12,7 @@ import (
func main() { print(ice.Run()) } func main() { print(ice.Run()) }
func init() { ice.Info.Titles = "云研发" } func init() {
ice.Info.CodeMain = "src/operation/portal.go"
ice.Info.NodeMain = "web.team.operation.portal"
}

View File

@ -1 +1,8 @@
title "云研发" title "云研发"
refer `
官网 https://web.shylinux.com
源码 https://git.shylinux.com/web/operation
应用 https://web.shylinux.com/s/20240903-operation
`
field web.code.mysql.client
field web.code.mysql.query args `mysql operation`

View File

@ -10,14 +10,12 @@ type CloudType int
const ( const (
CloudSystem CloudType = iota CloudSystem CloudType = iota
CloudLocal
CloudAliyun CloudAliyun
CloudTencent CloudTencent
) )
var CloudTypeList = map[CloudType]string{ var CloudTypeList = map[CloudType]string{
CloudSystem: "system", CloudSystem: "system",
CloudLocal: "local",
CloudAliyun: "aliyun", CloudAliyun: "aliyun",
CloudTencent: "tencent", CloudTencent: "tencent",
} }

103
src/operation/cluster.go Normal file
View File

@ -0,0 +1,103 @@
package operation
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"2025-dev.shylinux.com/x/20250215-cluster/src/travel"
"shylinux.com/x/operation/src/operation/model"
)
type Cluster struct {
Table
travel travel.Travel
order string `data:"1"`
fields string `data:"title,content,space,total,stock,price,cluster_status"`
payfor string `name:"payfor" help:"购买" style:"notice" role:"leader"`
modify string `name:"modify title content price" style:"danger"`
}
func (s Cluster) Scan(m *ice.Message, arg ...string) {
m.Cmd(s.travel, s.travel.Concurrent, ice.GetTypeMod(s.travel), ice.GetTypeKey(s.travel)).Table(func(value ice.Maps) {
s.InsertIfNeed(m, web.SPACE, value[web.SPACE])
})
m.Cmd("").Table(func(value ice.Maps) { s.ScanService(m.Options(value)) })
m.ProcessRefresh()
}
func (s Cluster) List(m *ice.Message, arg ...string) {
if len(arg) < 2 {
if m.IsTech() {
s.Select(m)
} else {
s.Select(m, model.STATUS, kit.Format(ClusterOnline))
}
} else {
s.SelectDetail(m, model.UID, arg[1])
}
if m.Length() == 0 {
if m.IsTech() {
m.EchoInfoButton("请扫描集群", s.Scan)
} else {
m.Echo("请联系「平台管理员」部署集群").Action()
}
} else {
if m.Display(""); m.IsTech() {
m.Table(func(value ice.Maps) {
if ClusterStatus(kit.Int(value[model.CLUSTER_STATUS])) == ClusterOnline && kit.Int(value[model.STOCK]) > 0 {
m.PushButton(s.Payfor, s.ScanService, s.Offline, s.Modify)
} else {
m.PushButton(s.ScanService, s.Online, s.Modify)
}
}).Action(s.Scan)
} else if s.IsLeader(m) {
m.Table(func(value ice.Maps) {
if ClusterStatus(kit.Int(value[model.CLUSTER_STATUS])) == ClusterOnline && kit.Int(value[model.STOCK]) > 0 {
m.PushButton(s.Payfor)
} else {
m.PushButton()
}
}).Action()
} else {
m.PushAction().Action()
}
}
if len(arg) == 2 && m.IsTech() {
m.EchoIFrame(web.S(m.Append(web.SPACE)))
}
}
func (s Cluster) Payfor(m *ice.Message, arg ...string) {
m.Cmdy(Gateway{}, s.Payfor, arg, kit.Dict(model.CLUSTER_UID, m.Option(model.UID)))
}
func (s Cluster) ScanService(m *ice.Message, arg ...string) {
m.Cmdy(Gateway{}, s.Scan, arg, kit.Dict(model.CLUSTER_UID, m.Option(model.UID))).ProcessRefresh()
s.Update(m, m.AppendSimple(model.TOTAL, model.STOCK), m.OptionSimple(model.UID)...)
}
func (s Cluster) Offline(m *ice.Message, arg ...string) {
s.Update(m, []string{model.STATUS, kit.Format(ClusterOffline)})
s.RecordEventWithName(m, "")
}
func (s Cluster) Online(m *ice.Message, arg ...string) {
s.Update(m, []string{model.STATUS, kit.Format(ClusterOnline)})
s.RecordEventWithName(m, "")
}
func (s Cluster) Modify(m *ice.Message, arg ...string) {
s.Update(m, s.TransPrice(m, arg))
s.RecordEventWithName(m, "")
}
func init() { ice.TeamCtxCmd(Cluster{}) }
type ClusterStatus int
const (
ClusterOffline ClusterStatus = iota
ClusterOnline
)
var ClusterStatusList = map[ClusterStatus]string{
ClusterOffline: "offline",
ClusterOnline: "online",
}
func (s ClusterStatus) String() string { return ClusterStatusList[s] }

9
src/operation/cluster.js Normal file
View File

@ -0,0 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title||value.space, value.price+" 元/月", can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value)]},
{view: html.OUTPUT, list: [value.content]},
] })
},
})

View File

@ -20,6 +20,10 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
s.InputsListRole(m, UserCloudRoleList, arg...) s.InputsListRole(m, UserCloudRoleList, arg...)
case model.CLOUD_TYPE: case model.CLOUD_TYPE:
s.InputsList(m, CloudTypeList, arg...) s.InputsList(m, CloudTypeList, arg...)
case model.GATEWAY_UID:
m.Cmdy(Gateway{}, m.Option(model.CLOUD_UID)).Cut(model.UID, model.TITLE)
m.RenameAppend(model.UID, arg[0], model.TITLE, model.NAME)
m.DisplayInputKeyNameIconTitle()
default: default:
s.Table.Inputs(m, arg...) s.Table.Inputs(m, arg...)
} }
@ -31,16 +35,20 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
value = UserCloudRole(kit.Int(value)).String() value = UserCloudRole(kit.Int(value)).String()
case model.CLOUD_TYPE: case model.CLOUD_TYPE:
value = CloudType(kit.Int(value)).String() value = CloudType(kit.Int(value)).String()
case model.CLUSTER_STATUS:
value = ClusterStatus(kit.Int(value)).String()
case model.TEMPLATE_STATUS:
value = TemplateStatus(kit.Int(value)).String()
case model.PRICE:
value = kit.Format("%.2f", kit.Float(value)/100)
} }
return value return value
}) })
return s.Table.RewriteAppend(m) return s.Table.RewriteAppend(m)
} }
func (s Table) CheckRole(m *ice.Message, arg ...string) *ice.Message { func (s Table) CheckRole(m *ice.Message, arg ...string) {
role := UserCloudRole(s.UserPlaceRole(m)) role := UserCloudRole(s.UserPlaceRole(m))
m.WarnNotRight(!kit.IsIn(role.String(), append(arg, UserCloudCreator.String())...), role.String()) m.WarnNotRight(!kit.IsIn(role.String(), append(arg, UserCloudCreator.String())...), role.String())
m.Option(model.USER_ROLE, kit.Format(role))
return m
} }
type Tables struct{ Table } type Tables struct{ Table }

89
src/operation/gateway.go Normal file
View File

@ -0,0 +1,89 @@
package operation
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"2025-dev.shylinux.com/x/20250211-service/src/gateway"
"2025-dev.shylinux.com/x/20250215-cluster/src/travel"
"shylinux.com/x/operation/src/operation/model"
)
type Gateway struct {
Table
cluster Cluster
travel travel.Travel
gateway gateway.Gateway
order string `data:"3"`
fields string `data:"title,content,space,cluster_uid,user_uid"`
payfor string `name:"payfor" help:"购买" style:"notice" role:"leader"`
createProject string `name:"createProject name* repos binary" help:"创建" style:"notice" role:"worker"`
scanProject string `name:"scanProject" help:"扫描" role:"worker"`
open string `name:"open" role:"leader"`
modify string `name:"modify title content" style:"danger" role:"leader"`
}
func (s Gateway) List(m *ice.Message, arg ...string) {
if s.ValueList(m, arg); s.IsLeader(m) {
m.PushAction(s.CreateProject, s.ScanProject, s.Open, s.Modify)
} else {
m.PushAction()
}
if m.Action(); m.Length() == 0 {
if m.SetResult(); s.IsLeader(m) {
m.Echo("请到「云集群」购买主机")
} else if s.IsWorker(m) {
m.Echo("请联系「管理员」购买主机")
} else {
m.Echo("请等待「管理员」购买主机")
}
} else {
s.Fields(m, model.UID, s.KeyAS(s.cluster, model.SPACE)).SelectJoin(m, s.cluster, s.Keys(s.cluster, model.SPACE)).Display("")
}
if len(arg) == 2 && s.IsLeader(m) {
m.EchoIFrame(web.S(s.space(m.Spawn().Options(model.CLOUD_UID, arg[0], model.UID, arg[1]))))
}
}
func (s Gateway) CreateProject(m *ice.Message, arg ...string) {
m.Cmdy(project{}, s.Create, arg, model.GATEWAY_UID, m.Option(model.UID), kit.Dict(web.SPACE, s.space(m.Spawn()))).ProcessRefresh()
}
func (s Gateway) ScanProject(m *ice.Message, arg ...string) {
m.Cmdy(project{}, s.Scan, kit.Dict(model.GATEWAY_UID, m.Option(model.UID), web.SPACE, s.space(m.Spawn()))).ProcessRefresh()
}
func (s Gateway) Open(m *ice.Message, arg ...string) {
m.ProcessOpen(m.Options(ice.MSG_USERPOD, "").MergePodCmd(s.space(m.Spawn()), web.ADMIN))
}
func (s Gateway) Modify(m *ice.Message, arg ...string) {
s.Update(m, arg, m.OptionSimple(model.CLOUD_UID, model.UID)...)
s.RecordEventWithName(m, "")
}
func init() { ice.TeamCtxCmd(Gateway{}) }
func (s Gateway) Payfor(m *ice.Message, arg ...string) {
s.Transaction(m, func() {
msg := m.Spawn()
if msg = s.Orders(msg, mdb.ID).Limit(msg, 1).SelectForUpdate(msg, "cluster_uid = ? AND (cloud_uid IS NULL OR cloud_uid = '')", m.Option(model.CLUSTER_UID)); msg.Length() == 0 {
m.Echo("主机不够用啦!请等待平台管理员添加。")
} else {
m.Option(model.TITLE, "我的云主机")
s.Update(m, m.OptionSimple(model.CLOUD_UID, model.USER_UID, model.TITLE), msg.AppendSimple(model.UID)...)
s.RecordEventWithName(m.Options(model.UID, msg.Append(model.UID)), "")
s.SendMessage(s.GetCommandUID(m), "", "")
}
})
}
func (s Gateway) Scan(m *ice.Message, arg ...string) {
m.Cmd(web.SPACE, m.Option(web.SPACE), s.travel, s.travel.Concurrent, ice.GetTypeMod(s.gateway), ice.GetTypeKey(s.gateway)).Table(func(value ice.Maps) {
s.InsertIfNeed(m, web.SPACE, value[web.SPACE], model.CLUSTER_UID, m.Option(model.CLUSTER_UID))
})
s.Fields(m, "count(*) AS total").Select(m, model.CLUSTER_UID, m.Option(model.CLUSTER_UID))
s.Fields(m, "count(*) AS stock").Select(m, "cluster_uid = ? AND (cloud_uid IS NULL OR cloud_uid = '')", m.Option(model.CLUSTER_UID))
}
func (s Gateway) space(m *ice.Message, arg ...string) string {
s.Tables(m, s.cluster).Fields(m, s.Key(s, web.SPACE), s.KeyAS(s.cluster, web.SPACE))
s.Select(m, kit.Simple(m.OptionSimple(model.CLOUD_UID), s.Key(s, model.UID), m.Option(model.UID))...)
return kit.Keys(m.Append(model.CLUSTER_SPACE), m.Append(web.SPACE))
}

View File

@ -1,7 +1,7 @@
Volcanos(chat.ONIMPORT, { Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { _init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [ can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title]}, {view: html.TITLE, list: [value.title||value.space, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]}, {view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.OUTPUT, list: [value.content]}, {view: html.OUTPUT, list: [value.content]},
] }) ] })

View File

@ -5,19 +5,28 @@ import "shylinux.com/x/mysql-story/src/db"
const ( const (
UID = "uid" UID = "uid"
NAME = "name" NAME = "name"
INFO = "info"
TYPE = "type" TYPE = "type"
ROLE = "role" ROLE = "role"
STATUS = "status"
TOTAL = "total"
STOCK = "stock"
PRICE = "price"
SPACE = "space"
TITLE = "title" TITLE = "title"
CONTENT = "content" CONTENT = "content"
USER_UID = "user_uid" USER_UID = "user_uid"
USER_ROLE = "user_role"
USER_CLOUD_ROLE = "user_cloud_role" USER_CLOUD_ROLE = "user_cloud_role"
CLOUD_UID = "cloud_uid" CLOUD_UID = "cloud_uid"
CLOUD_NAME = "cloud_name"
CLOUD_TYPE = "cloud_type" CLOUD_TYPE = "cloud_type"
RELEASE_UID = "release_uid" CLUSTER_UID = "cluster_uid"
COMPANY_UID = "company_uid" CLUSTER_SPACE = "cluster_space"
CITY_UID = "city_uid" CLUSTER_STATUS = "cluster_status"
TEMPLATE_STATUS = "template_status"
GATEWAY_UID = "gateway_uid"
GATEWAY_SPACE = "gateway_space"
PROJECT_UID = "project_uid"
PROJECT_NAME = "project_name"
) )
type UserCloud struct { type UserCloud struct {
@ -28,9 +37,44 @@ type Cloud struct {
db.ModelPlace db.ModelPlace
CompanyUID string `gorm:"type:char(32);index"` CompanyUID string `gorm:"type:char(32);index"`
} }
type Release struct { type Cluster struct {
db.ModelContent db.ModelContent
CloudUID string `gorm:"type:char(32);index"` Space string `gorm:"type:varchar(64);index"`
Total int `gorm:"default:0"`
Stock int `gorm:"default:0"`
Price int `gorm:"default:0"`
Status uint8 `gorm:"default:0"`
}
type Template struct {
db.ModelNameInfo
Title string `gorm:"type:varchar(64)"`
Icons string `gorm:"type:varchar(255)"`
Repos string `gorm:"type:varchar(255)"`
Binary string `gorm:"type:varchar(255)"`
Status uint8 `gorm:"default:0"`
}
type Gateway struct {
db.ModelContent
Space string `gorm:"type:varchar(64)"`
CloudUID string `gorm:"type:char(32);index"`
ClusterUID string `gorm:"type:char(32);index"`
}
type Project struct {
db.ModelNameInfo
Icons string `gorm:"type:varchar(255)"`
Repos string `gorm:"type:varchar(255)"`
Binary string `gorm:"type:varchar(255)"`
CloudUID string `gorm:"type:char(32);index"`
GatewayUID string `gorm:"type:char(32);index"`
}
type Product struct {
db.ModelNameInfo
Icon string `gorm:"type:varchar(255)"`
Index string `gorm:"type:varchar(128)"`
CloudUID string `gorm:"type:char(32);index"`
ProjectUID string `gorm:"type:char(32);index"`
} }
func init() { db.CmdModels("", &UserCloud{}, &Cloud{}, &Release{}) } func init() {
db.CmdModels("", &UserCloud{}, &Cloud{}, &Cluster{}, &Gateway{}, &Template{}, &Project{}, &Product{})
}

View File

@ -7,7 +7,7 @@ import (
type Portal struct { type Portal struct {
guanlixitong.Portal guanlixitong.Portal
placeCreate string `name:"placeCreate city_name* company_name* cloud_name* cloud_type*:select" role:"void"` placeCreate string `name:"placeCreate city_name* company_name* cloud_name* cloud_type:select" role:"void"`
} }
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userCloud{}, cloud{})}) } func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userCloud{}, cloud{})}) }

View File

@ -1,14 +1,31 @@
{ {
"portal": "系统运维", "portal": "系统运维",
"release": "发布", "cluster": "云集群", "gateway": "云主机", "template": "云模板", "project": "云项目", "product": "云服务",
"scanService": "扫描", "offline": "下架", "online": "上架",
"style": {
"offline": "danger"
},
"icons": { "icons": {
"release": "https://img.icons8.com/officel/80/activity-grid.png" "cluster": "activity-grid.png",
"gateway": "activity-grid.png",
"template": "activity-grid.png",
"project": "activity-grid.png",
"product": "activity-grid.png"
}, },
"input": { "input": {
"My Cloud": "我的系统", "My Cloud": "我的系统",
"user_cloud_role": "用户角色", "user_cloud_role": "用户角色",
"cloud_name": "系统名称", "cloud_name": "系统名称",
"cloud_type": "系统类型" "cloud_type": "系统类型",
"cloud_space": "集群空间",
"cluster_status": "集群状态",
"cluster_space": "集群空间",
"template_status": "模板状态",
"gateway_uid": "云主机",
"gateway_title": "云主机",
"gateway_space": "主机空间",
"project_name": "项目名称",
"stock": "库存"
}, },
"value": { "value": {
"user_cloud_role": { "user_cloud_role": {
@ -24,7 +41,6 @@
}, },
"cloud_type": { "cloud_type": {
"system": "系统云", "system": "系统云",
"local": "本地云",
"aliyun": "阿里云", "aliyun": "阿里云",
"tencent": "腾讯云" "tencent": "腾讯云"
} }

59
src/operation/product.go Normal file
View File

@ -0,0 +1,59 @@
package operation
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
"shylinux.com/x/operation/src/operation/model"
)
type product struct {
Table
cluster Cluster
gateway Gateway
project project
order string `data:"5"`
fields string `data:"name,icon,index,project_uid"`
open string `name:"open" style:"notice" role:"void"`
}
func (s product) Scan(m *ice.Message, arg ...string) {
m.Cmd(web.SPACE, m.Option(web.SPACE), api.GONGANXITONG_PORTAL)
m.Cmd(web.SPACE, m.Option(web.SPACE), api.GONGANXITONG_SERVICE).Table(func(value ice.Maps) {
s.InsertIfNeed(m.Options(ctx.INDEX, value[ctx.INDEX]), m.OptionSimple(model.CLOUD_UID, model.PROJECT_UID, ctx.INDEX)...)
s.Update(m, kit.Dict(mdb.NAME, value[mdb.NAME], mdb.ICON, value[mdb.ICON]), m.OptionSimple(model.CLOUD_UID, model.PROJECT_UID, ctx.INDEX)...)
})
}
func (s product) List(m *ice.Message, arg ...string) {
if s.ValueList(m, arg); s.IsLeader(m) {
m.PushAction(s.Open, s.Remove)
} else {
m.PushAction(s.Open)
}
if m.Length() == 0 {
m.SetResult().Echo("请到「云项目」扫描服务")
} else {
m.Display("")
}
s.Fields(m, model.UID, s.Keys(s.gateway, model.UID), s.KeyAS(s.project, mdb.NAME)).SelectJoin(m, s.project, s.Keys(s.project, mdb.NAME), s.Keys(s.gateway, model.UID))
s.Fields(m, model.UID, s.Keys(s.cluster, model.UID), s.KeyAS(s.gateway, model.TITLE), s.KeyAS(s.gateway, model.SPACE)).SelectJoin(m, s.gateway, s.Keys(s.cluster, model.UID), s.Keys(s.gateway, model.SPACE), s.Keys(s.gateway, model.TITLE))
s.Fields(m, model.UID, s.KeyAS(s.cluster, model.SPACE)).SelectJoin(m, s.cluster, s.Keys(s.cluster, model.SPACE))
if len(arg) == 2 {
m.EchoIFrame(web.S(kit.Keys(m.Append(model.CLUSTER_SPACE), m.Append(model.GATEWAY_SPACE), m.Append(model.PROJECT_NAME))))
}
}
func (s product) Open(m *ice.Message, arg ...string) {
m.ProcessOpen(m.Options(ice.MSG_USERPOD, "").MergePodCmd(s.space(m.Spawn()), m.Option(ctx.INDEX)))
}
func init() { ice.TeamCtxCmd(product{}) }
func (s product) space(m *ice.Message, arg ...string) string {
s.Tables(m, s.project, s.gateway, s.cluster).Fields(m, s.Key(s.project, mdb.NAME), s.KeyAS(s.gateway, web.SPACE), s.KeyAS(s.cluster, web.SPACE))
s.Select(m, kit.Simple(s.Key(s, model.CLOUD_UID), m.Option(model.CLOUD_UID), s.Key(s, model.UID), m.Option(model.UID))...)
return kit.Keys(m.Append(model.CLUSTER_SPACE), m.Append(model.GATEWAY_SPACE), m.Append(mdb.NAME))
}

12
src/operation/product.js Normal file
View File

@ -0,0 +1,12 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) {
value.icon = can.misc.ResourceIcons(can, value.icon, can.core.Keys(value.cluster_space, value.gateway_space, value.project_name))
return [
{view: html.TITLE, list: [value.name, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.gateway_title]},
{view: html.OUTPUT, list: [value.info]},
]
})
},
})

75
src/operation/project.go Normal file
View File

@ -0,0 +1,75 @@
package operation
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/operation/src/operation/model"
)
type project struct {
Table
cluster Cluster
gateway Gateway
order string `data:"4"`
fields string `data:"name,icons,repos,binary,gateway_uid"`
create string `name:"create name* icons repos binary" style:"notice" role:"worker"`
scanProduct string `name:"scanProduct" help:"扫描" role:"worker"`
open string `name:"open" role:"worker"`
}
func (s project) Create(m *ice.Message, arg ...string) {
if s.Select(m.Spawn(), m.OptionSimple(model.CLOUD_UID, model.GATEWAY_UID, mdb.NAME)...).Length() > 0 {
return
}
msg := m.Cmd(web.SPACE, m.Option(web.SPACE), web.DREAM, mdb.CREATE, arg, kit.Dict(ice.MSG_USERROLE, aaa.TECH))
s.Insert(m, kit.Simple(arg, msg.OptionSimple(model.CLOUD_UID, model.GATEWAY_UID, mdb.NAME))...)
s.SendMessage(s.GetCommandUID(m), "", "", m.Option(model.CLOUD_UID), m.Result())
s.RecordEventWithName(m, "")
}
func (s project) Scan(m *ice.Message, arg ...string) {
m.Cmd(web.SPACE, m.Option(web.SPACE), web.DREAM).Table(func(value ice.Maps) {
if m.Option(mdb.NAME, value[mdb.NAME]); value[mdb.TYPE] == web.WORKER {
s.InsertIfNeed(m, m.OptionSimple(model.CLOUD_UID, model.GATEWAY_UID, mdb.NAME)...)
}
s.Update(m, kit.Dict(nfs.REPOS, value[nfs.REPOS], nfs.BINARY, value[nfs.BINARY]), m.OptionSimple(model.CLOUD_UID, model.GATEWAY_UID, mdb.NAME)...)
})
}
func (s project) List(m *ice.Message, arg ...string) {
if s.ValueList(m, arg); s.IsLeader(m) {
m.PushAction(s.ScanProduct, s.Open, s.Remove)
} else if s.IsWorker(m) {
m.PushAction(s.ScanProduct, s.Open)
} else {
m.PushAction()
}
if m.Action(); m.Length() == 0 {
m.SetResult().Echo("请到「云主机」创建项目")
} else {
s.Fields(m, model.UID, s.KeyAS(s.gateway, model.TITLE), s.KeyAS(s.gateway, model.SPACE), s.Keys(s.cluster, model.UID))
s.SelectJoin(m, s.gateway, s.Keys(s.gateway, model.TITLE), s.Keys(s.gateway, model.SPACE), s.Keys(s.cluster, model.UID))
s.Fields(m, model.UID, s.KeyAS(s.cluster, model.SPACE)).SelectJoin(m, s.cluster, s.Keys(s.cluster, model.SPACE))
m.Display("")
}
if len(arg) == 2 && s.IsWorker(m) {
m.EchoIFrame(web.S(s.space(m.Spawn().Options(model.CLOUD_UID, arg[0], model.UID, arg[1]))))
}
}
func (s project) ScanProduct(m *ice.Message, arg ...string) {
m.Cmdy(product{}, s.Scan, kit.Dict(model.PROJECT_UID, m.Option(model.UID), web.SPACE, s.space(m))).ProcessRefresh()
}
func (s project) Open(m *ice.Message, arg ...string) {
m.ProcessOpen(m.Options(ice.MSG_USERPOD, "").MergePodCmd(s.space(m), web.ADMIN))
}
func init() { ice.TeamCtxCmd(project{}) }
func (s project) space(m *ice.Message, arg ...string) string {
s.Tables(m, s.gateway, s.cluster).Fields(m, s.Key(s, mdb.NAME), s.KeyAS(s.gateway, web.SPACE), s.KeyAS(s.cluster, web.SPACE))
s.Select(m, kit.Simple(s.Key(s, model.CLOUD_UID), m.Option(model.CLOUD_UID), s.Key(s, model.UID), m.Option(model.UID))...)
return kit.Keys(m.Append(model.CLUSTER_SPACE), m.Append(model.GATEWAY_SPACE), m.Append(mdb.NAME))
}

9
src/operation/project.js Normal file
View File

@ -0,0 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.name, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.gateway_title]},
{view: html.OUTPUT, list: [value.binary||value.repos]},
] })
},
})

View File

@ -1,14 +0,0 @@
package operation
import "shylinux.com/x/ice"
type release struct {
Table
fields string `data:"title,content,user_uid"`
create string `name:"create title* content*" role:"leader"`
remove string `name:"remove" role:"leader"`
}
func (s release) List(m *ice.Message, arg ...string) { s.ValueList(m, arg).Display("") }
func init() { ice.TeamCtxCmd(release{}) }

56
src/operation/studio.go Normal file
View File

@ -0,0 +1,56 @@
package operation
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/operation/src/operation/model"
)
type studio struct {
Tables
cluster Cluster
list string `name:"list list"`
gateway string `name:"gateway" role:"void"`
project string `name:"project" role:"void"`
product string `name:"product" role:"void"`
}
func (s studio) List(m *ice.Message, arg ...string) {
m.Cmdy(s.PrefixPortal(m)).Action().Display("").DisplayCSS("")
}
func (s studio) Gateway(m *ice.Message, arg ...string) {
if len(arg) < 3 {
m.Cmdy(m.Prefix(m.ActionKey()), arg[0])
} else {
m.Cmdy(web.SPACE, s.space(m, arg, model.CLUSTER_SPACE, model.SPACE), arg[2:])
}
}
func (s studio) Project(m *ice.Message, arg ...string) {
if len(arg) < 3 {
m.Cmdy(m.Prefix(m.ActionKey()), s.Select, model.CLOUD_UID, arg[0], model.GATEWAY_UID, arg[1])
} else {
m.Cmdy(web.SPACE, s.space(m, arg, model.CLUSTER_SPACE, model.GATEWAY_SPACE, model.NAME), arg[2:])
}
}
func (s studio) Product(m *ice.Message, arg ...string) {
if len(arg) < 3 {
m.Cmdy(m.Prefix(m.ActionKey()), s.Select, model.CLOUD_UID, arg[0], model.PROJECT_UID, arg[1])
} else {
m.Cmdy(web.SPACE, s.space(m, arg, model.CLUSTER_SPACE, model.GATEWAY_SPACE, model.PROJECT_NAME), arg[2:])
}
}
func init() { ice.TeamCtxCmd(studio{}) }
func (s studio) space(m *ice.Message, arg []string, args ...string) string {
if s.UserPlaceRole(m); s.IsWorker(m) {
m.Option(ice.MSG_USERROLE, aaa.TECH)
}
space := []ice.Any{}
msg := m.Cmd(m.Prefix(m.ActionKey()), arg[0], arg[1])
kit.For(args, func(key string) { space = append(space, msg.Append(key)) })
return m.Option(ice.MSG_USERPOD, kit.Keys(space...))
}

98
src/operation/studio.js Normal file
View File

@ -0,0 +1,98 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.onmotion.hidden(can, can._status)
can.ui = can.onappend.layout(can), can.onimport.place(can, msg)
},
place: function(can, msg) {
msg.Table(function(value) {
can.onimport.item(can, {icon: "bi bi-phone", name: value.cloud_name, _hash: [value.cloud_uid.slice(0, 12)]}, function(event, item, show, target) { can.db.cloud_uid = value.cloud_uid
show === undefined && can.runAction(event, "gateway", [value.cloud_uid], function(msg) {
can.onimport.gateway(can, msg, target, value.cloud_uid)
})
return true
}, function(event, item, target) {
return {meta: {
open: function() { can.user.open("/s/"+can.misc.Search(can, ice.POD)+"/c/"+"web.team.operation.portal"+"?cloud_uid="+value.cloud_uid) },
}}
})
})
},
gateway: function(can, msg, target, cloud_uid) {
can.onimport.itemlist(can, msg.Table(function(value) {
return {icon: "bi bi-window-desktop", name: value.title, _hash: target._item._hash.concat([value.space.slice(0, 12)]), action: "gateway", cloud_uid: cloud_uid, uid: value.uid, space: can.core.Keys(value.cluster_space, value.space)}
}), function(event, item, show, target) { can.db.gateway_uid = item.uid
show === undefined && can.runAction(event, "project", [cloud_uid, item.uid], function(msg) {
if (msg.Length() == 0) {
can.onimport.plugin(can, item, target)
} else {
can.onimport.project(can, msg, target, cloud_uid)
}
})
return true
}, function(event, item, target) {
return can.onimport.contexts(can, item, target)
}, target)
},
project: function(can, msg, target, cloud_uid) {
can.onimport.itemlist(can, msg.Table(function(value) {
return {icon: "bi bi-window-sidebar", name: value.name, _hash: target._item._hash.concat([value.name]), action: "project", cloud_uid: cloud_uid, uid: value.uid, space: can.core.Keys(target._item.space, value.name)}
}), function(event, item, show, target) { can.db.project_uid = item.uid
show === undefined && can.runAction(event, "product", [cloud_uid, item.uid], function(msg) {
if (msg.Length() == 0) {
can.onimport.plugin(can, item, target)
} else {
can.onimport.product(can, msg, target, cloud_uid)
}
})
return true
}, function(event, item, target) {
return can.onimport.contexts(can, item, target)
}, target)
},
product: function(can, msg, target, cloud_uid) {
can.onimport.itemlist(can, msg.Table(function(value) {
return {icon: "bi bi-phone", name: value.name, _hash: target._item._hash.concat([value.index]), action: "product", cloud_uid: cloud_uid, uid: value.uid, space: target._item.space, index: value.index}
}), function(event, item, show, target) { can.db.product_uid = item.uid
can.onimport.plugin(can, item, target)
}, function(event, item, target) {
return {meta: {
open: function() { can.user.open("/s/"+item.space+"/c/"+item.index) },
}}
}, target)
},
contexts: function(can, item, target) {
return {meta: {
portal: function() { can.onappend.plugin(can._root.Action, {index: web.CHAT_IFRAME, args: "/s/"+item.space+"/c/portal", style: html.FLOAT, title: item.name}) },
desktop: function() { can.onimport.plugin(can, item, target, web.DESKTOP) },
admin: function() { can.onappend.plugin(can._root.Action, {index: web.CHAT_IFRAME, args: "/s/"+item.space+"/c/admin", style: html.FLOAT, title: item.name}) },
word: function() { can.onimport.plugin(can, item, target, web.WORD) },
vimer: function() { can.onimport.plugin(can, item, target, web.VIMER) },
runtime: function() { can.onimport.plugin(can, item, target, cli.RUNTIME) },
xterm: function() { can.onimport.plugin(can, item, target, cli.XTERM) },
open: function() { can.user.open("/s/"+item.space) },
}}
},
plugin: function(can, item, target, index) {
if (!index && !item.index) {
for (var i = 0; i < item._hash.length; i++) { if (item._hash[i] != can.db.hash[i]) { break } }
if (i == item._hash.length) { index = can.db.hash[i] }
} if (index) { can.onexport.hash(can, item._hash.concat([index])) }
index = index||item.index||web.DESKTOP, item.plugin = item.plugin||{}
can.onimport.tabsCache(can, item.plugin[index] = item.plugin[index]||{name: item.name+(index == web.DESKTOP || item.index? "": "."+index), _hash: can.core.Keys(item._hash, index)}, target, function() {
// can.onappend.plugin(can._root.Action, {space: item.space, index: index, height: can.ConfHeight(), width: can.ConfWidth()-can.ui.project.offsetWidth}, function() {}, can.ui.content)
can.onappend.plugin(can._root.Action, {space: item.space, index: index, args: index == cli.XTERM? ["sh"]: [],
height: can.ConfHeight(), width: can.ConfWidth()-can.ui.project.offsetWidth, style: can.base.isIn(index, cli.XTERM, web.DESKTOP)? html.OUTPUT: "",
title: index == web.DESKTOP? item.name: "",
}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event); delete(msg.pod)
can.runAction(event, item.action, [item.cloud_uid, item.uid, index].concat(cmds), cb)
}
can._plugins = (can._plugins||[]).concat(sub)
}, can.ui.content)
})
},
layout: function(can) {
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, height, width) })
})
},
})

83
src/operation/template.go Normal file
View File

@ -0,0 +1,83 @@
package operation
import (
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/operation/src/operation/model"
)
type template struct {
Table
order string `data:"2"`
fields string `data:"name,info,title,icons,repos,binary,template_status"`
create string `name:"create name* info title icons repos* binary*"`
modify string `name:"modify name* info title icons repos* binary*" style:"danger"`
install string `name:"install name* gateway_uid*" style:"notice" role:"worker"`
}
func (s template) Create(m *ice.Message, arg ...string) {
s.Insert(m, arg...)
}
func (s template) List(m *ice.Message, arg ...string) {
if m.IsTech() {
if len(arg) < 2 {
s.Select(m)
} else {
s.SelectDetail(m, model.UID, arg[1])
}
m.Table(func(value ice.Maps) {
if TemplateStatus(kit.Int(value[model.TEMPLATE_STATUS])) == TemplateOffline {
m.PushButton(s.Online, s.Modify)
} else {
m.PushButton(s.Install, s.Offline, s.Modify)
}
})
if m.Length() == 0 {
s.Button(m, "")
}
} else {
if len(arg) < 2 {
s.Select(m, model.STATUS, kit.Format(TemplateOnline))
} else {
s.SelectDetail(m, model.UID, arg[1])
}
if m.PushAction(s.Install).Action(); m.Length() == 0 {
m.Echo("请等待「平台管理员」创建模板")
}
}
m.Display("")
}
func (s template) Install(m *ice.Message, arg ...string) {
msg := m.Cmd(Gateway{}, m.Option(model.CLOUD_UID), m.Option(model.GATEWAY_UID))
m.Option(model.SPACE, kit.Keys(msg.Append(model.CLUSTER_SPACE), msg.Append(model.SPACE)))
m.Cmdy(project{}, s.Create, m.OptionSimple("name,icons,repos,binary"))
}
func (s template) Offline(m *ice.Message, arg ...string) {
s.Update(m, []string{model.STATUS, kit.Format(TemplateOffline)})
s.RecordEventWithName(m, "")
}
func (s template) Online(m *ice.Message, arg ...string) {
s.Update(m, []string{model.STATUS, kit.Format(TemplateOnline)})
s.RecordEventWithName(m, "")
}
func (s template) Modify(m *ice.Message, arg ...string) {
s.Update(m, arg)
s.RecordEventWithName(m, "")
}
func init() { ice.TeamCtxCmd(template{}) }
type TemplateStatus int
const (
TemplateOffline TemplateStatus = iota
TemplateOnline
)
var TemplateStatusList = map[TemplateStatus]string{
TemplateOffline: "offline",
TemplateOnline: "online",
}
func (s TemplateStatus) String() string { return TemplateStatusList[s] }

View File

@ -0,0 +1,9 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title||value.name, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value)]},
{view: html.OUTPUT, list: [value.info||value.binary||value.repos]},
] })
},
})

View File

@ -1,5 +1,6 @@
package main package main
import ( import (
_ "shylinux.com/x/mysql-story/src/db/mysql" _ "shylinux.com/x/ice/devops"
_ "shylinux.com/x/ice/portal"
) )

View File

@ -9,7 +9,7 @@ import (
type Case struct { type Case struct {
Table Table
order string `data:"3"` order string `data:"4"`
fields string `data:"title,content,case_status,process_time,finish_time,plan_uid,user_uid"` fields string `data:"title,content,case_status,process_time,finish_time,plan_uid,user_uid"`
create string `name:"create title* content*" role:"leader,worker"` create string `name:"create title* content*" role:"leader,worker"`
modify string `name:"modify title* content*" role:"leader,worker"` modify string `name:"modify title* content*" role:"leader,worker"`

View File

@ -3,10 +3,7 @@ Volcanos(chat.ONIMPORT, {
can.onimport.myView(can, msg, function(value) { return [ can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value), can.onimport.titleAction(can, value)]}, {view: html.TITLE, list: [value.title, can.onimport.textView(can, value), can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]}, {view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.STATUS, list: [ {view: html.STATUS, list: [can.base.TimeTrim(value.process_time), "~", can.base.TimeTrim(value.finish_time), "计划:", value.plan_title]},
can.base.TimeTrim(value.process_time), "~", can.base.TimeTrim(value.finish_time),
"计划:", value.plan_title,
]},
{view: html.OUTPUT, list: [value.content]}, {view: html.OUTPUT, list: [value.content]},
] }) ] })
}, },

View File

@ -5,8 +5,8 @@ import "shylinux.com/x/mysql-story/src/db"
const ( const (
UID = "uid" UID = "uid"
NAME = "name" NAME = "name"
INFO = "info"
TYPE = "type" TYPE = "type"
ROLE = "role"
LEVEL = "level" LEVEL = "level"
STATUS = "status" STATUS = "status"
TITLE = "title" TITLE = "title"
@ -28,8 +28,6 @@ const (
TASK_UID = "task_uid" TASK_UID = "task_uid"
TASK_STATUS = "task_status" TASK_STATUS = "task_status"
CASE_STATUS = "case_status" CASE_STATUS = "case_status"
COMPANY_UID = "company_uid"
CITY_UID = "city_uid"
MARKET_UID = "market_uid" MARKET_UID = "market_uid"
BEGIN_TIME = "begin_time" BEGIN_TIME = "begin_time"
END_TIME = "end_time" END_TIME = "end_time"

View File

@ -10,15 +10,15 @@ import (
type Portal struct { type Portal struct {
guanlixitong.Portal guanlixitong.Portal
placeCreate string `name:"placeCreate city_name* company_name* story_name* story_type*:select" role:"void"` placeCreate string `name:"placeCreate city_name* company_name* story_name* story_type:select" role:"void"`
} }
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) { func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
defer s.DashboardCreate(m, "")() defer s.DashboardCreate(m, "")()
s.DashboardInsert(m, "1", "需求总量", issue{}, "") s.DashboardInsert(m, 1, "需求总量", "个", issue{}, "")
s.DashboardInsert(m, "2", "需求待办", issue{}, "", "story_uid = ? AND status != ? AND status != ?", m.Option(model.STORY_UID), IssueRejected, IssueFinish) s.DashboardInsert(m, 2, "需求待办", "个", issue{}, "", "story_uid = ? AND status != ? AND status != ?", m.Option(model.STORY_UID), IssueRejected, IssueFinish)
s.DashboardInsert(m, "3", "任务总量", task{}, "") s.DashboardInsert(m, 3, "任务总量", "个", task{}, "")
s.DashboardInsert(m, "4", "任务待办", task{}, "", "story_uid = ? AND status != ?", m.Option(model.STORY_UID), TaskFinish) s.DashboardInsert(m, 4, "任务待办", "个", task{}, "", "story_uid = ? AND status != ?", m.Option(model.STORY_UID), TaskFinish)
} }
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStory{}, story{})}) } func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStory{}, story{})}) }

View File

@ -1,6 +1,6 @@
{ {
"portal": "产品迭代", "member": "项目成员", "portal": "产品迭代", "member": "项目成员",
"plan": "迭代计划", "issue": "产品需求", "task": "开发任务", "case": "测试用例", "plan": "迭代计划", "issue": "产品需求", "design": "界面设计", "task": "开发任务", "case": "测试用例",
"planBind": "绑定计划", "process": "开始", "planBind": "绑定计划", "process": "开始",
"issueCreate": "创建需求", "taskCreate": "创建任务", "caseCreate": "创建用例", "issueCreate": "创建需求", "taskCreate": "创建任务", "caseCreate": "创建用例",
"style": { "style": {
@ -13,6 +13,7 @@
"icons": { "icons": {
"plan": "https://img.icons8.com/officel/80/timeline-week.png", "plan": "https://img.icons8.com/officel/80/timeline-week.png",
"issue": "https://img.icons8.com/officel/80/communication.png", "issue": "https://img.icons8.com/officel/80/communication.png",
"design": "https://img.icons8.com/officel/80/web-design.png",
"task": "https://img.icons8.com/officel/80/tasks.png", "task": "https://img.icons8.com/officel/80/tasks.png",
"case": "https://img.icons8.com/officel/80/faq.png" "case": "https://img.icons8.com/officel/80/faq.png"
}, },

View File

@ -10,7 +10,7 @@ import (
type task struct { type task struct {
Table Table
Case Case Case Case
order string `data:"3"` order string `data:"4"`
fields string `data:"title,content,task_status,case_count,begin_time,end_time,process_time,finish_time,issue_uid,plan_uid,user_uid"` fields string `data:"title,content,task_status,case_count,begin_time,end_time,process_time,finish_time,issue_uid,plan_uid,user_uid"`
create string `name:"create title* content* begin_time:select@date end_time:select@date" role:"leader,worker"` create string `name:"create title* content* begin_time:select@date end_time:select@date" role:"leader,worker"`
modify string `name:"modify title* content* begin_time*:select@date end_time*:select@date" role:"leader,worker"` modify string `name:"modify title* content* begin_time*:select@date end_time*:select@date" role:"leader,worker"`

View File

@ -3,10 +3,7 @@ Volcanos(chat.ONIMPORT, {
can.onimport.myView(can, msg, function(value) { return [ can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title, can.onimport.textView(can, value), can.onimport.titleAction(can, value)]}, {view: html.TITLE, list: [value.title, can.onimport.textView(can, value), can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]}, {view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.STATUS, list: [ {view: html.STATUS, list: [can.base.TimeTrim(value.process_time), "~", can.base.TimeTrim(value.finish_time), "计划:", value.plan_title, "用例:", value.case_count+" 个"]},
can.base.TimeTrim(value.process_time), "~", can.base.TimeTrim(value.finish_time),
"计划:", value.plan_title, "用例:", value.case_count+" 个",
]},
{view: html.OUTPUT, list: [value.content]}, {view: html.OUTPUT, list: [value.content]},
] }) ] })
}, },

View File

@ -12,6 +12,4 @@ func init() { ice.TeamCtxCmd(userStory{}) }
type UserStoryRole = operation.UserCloudRole type UserStoryRole = operation.UserCloudRole
var UserStoryCreator = operation.UserCloudCreator
var UserStoryLeader = operation.UserCloudLeader
var UserStoryRoleList = operation.UserCloudRoleList var UserStoryRoleList = operation.UserCloudRoleList

View File

@ -5,7 +5,6 @@ import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/operation/src/storage/model" "shylinux.com/x/operation/src/storage/model"
@ -24,12 +23,11 @@ type file struct {
func (s file) Upload(m *ice.Message, arg ...string) { func (s file) Upload(m *ice.Message, arg ...string) {
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
p := s.path(m, m.Option(model.STORAGE_UID), up[1]) p := s.path(m, m.Option(model.STORAGE_UID), up[1])
m.Cmdy(web.CACHE, web.WATCH, up[0], p) s.ValueCreate(m, model.TITLE, m.UploadSave(p), model.CONTENT, "", model.TYPE, kit.Format(FilePath), model.SIZE, up[2])
s.ValueCreate(m, model.TITLE, up[1], model.CONTENT, "", model.TYPE, kit.Format(FilePath), model.SIZE, up[2])
s.DashboardUpdate(m) s.DashboardUpdate(m)
} }
func (s file) Right(m *ice.Message, arg ...string) { func (s file) Right(m *ice.Message, arg ...string) {
msg := m.Cmd(s.Prefix(m, Portal{}), Portal{}.PlaceList, m.Option(model.USER_UID), arg[0]) msg := m.Cmd(s.PrefixPortal(m), Portal{}.PlaceList, m.Option(model.USER_UID), arg[0])
m.WarnNotRight(kit.Int(msg.Append(model.USER_STORAGE_ROLE)) == 0) m.WarnNotRight(kit.Int(msg.Append(model.USER_STORAGE_ROLE)) == 0)
} }
func (s file) List(m *ice.Message, arg ...string) { func (s file) List(m *ice.Message, arg ...string) {

View File

@ -5,8 +5,8 @@ import "shylinux.com/x/mysql-story/src/db"
const ( const (
UID = "uid" UID = "uid"
NAME = "name" NAME = "name"
INFO = "info"
TYPE = "type" TYPE = "type"
ROLE = "role"
TITLE = "title" TITLE = "title"
CONTENT = "content" CONTENT = "content"
USER_UID = "user_uid" USER_UID = "user_uid"
@ -16,8 +16,6 @@ const (
STORAGE_TYPE = "storage_type" STORAGE_TYPE = "storage_type"
FILE_UID = "file_uid" FILE_UID = "file_uid"
FILE_TYPE = "file_type" FILE_TYPE = "file_type"
COMPANY_UID = "company_uid"
CITY_UID = "city_uid"
SIZE = "size" SIZE = "size"
) )

View File

@ -9,13 +9,13 @@ import (
type Portal struct { type Portal struct {
guanlixitong.Portal guanlixitong.Portal
placeCreate string `name:"placeCreate city_name* company_name* storage_name* storage_type*:select" role:"void"` placeCreate string `name:"placeCreate city_name* company_name* storage_name* storage_type:select" role:"void"`
} }
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) { func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {
defer s.DashboardCreate(m, "")() defer s.DashboardCreate(m, "")()
s.DashboardInsert(m, "1", "文件数量", file{}, "") s.DashboardInsert(m, 1, "文件数量", "个", file{}, "")
s.DashboardInsert(m, "2", "文件大小", file{}, "SUM(size)") s.DashboardInsert(m, 2, "文件大小", "size", file{}, "SUM(size)")
} }
func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStorage{}, storage{})}) } func init() { gonganxitong.PortalCmd(Portal{Portal: guanlixitong.NewPortal(userStorage{}, storage{})}) }

View File

@ -25,7 +25,6 @@
}, },
"storage_type": { "storage_type": {
"system": "系统文件", "system": "系统文件",
"local": "本地文件",
"baidu": "百度网盘", "baidu": "百度网盘",
"aliyun": "阿里云盘" "aliyun": "阿里云盘"
} }

View File

@ -10,14 +10,12 @@ type StorageType int
const ( const (
StorageSystem StorageType = iota StorageSystem StorageType = iota
StorageLocal
StorageBaidu StorageBaidu
StorageAliyun StorageAliyun
) )
var StorageTypeList = map[StorageType]string{ var StorageTypeList = map[StorageType]string{
StorageSystem: "system", StorageSystem: "system",
StorageLocal: "local",
StorageBaidu: "baidu", StorageBaidu: "baidu",
StorageAliyun: "aliyun", StorageAliyun: "aliyun",
} }

View File

@ -1,16 +1,16 @@
package gonganxitong package {{.Option "zone"}}
import "shylinux.com/x/ice" import "shylinux.com/x/ice"
type {{.Option "name"}} struct { type {{.Option "name"}} struct {
Table Tables
fields string `data:"title,content"` fields string `data:"title,content"`
create string `name:"create title* content*" role:"leader"` create string `name:"create title* content*" role:"leader"`
remove string `name:"remove" role:"leader"` remove string `name:"remove" role:"leader"`
} }
func (s {{.Option "name"}}) Create(m *ice.Message, arg ...string) { s.ValueCreate(m, arg...) } func (s {{.Option "name"}}) List(m *ice.Message, arg ...string) {
func (s {{.Option "name"}}) Remove(m *ice.Message, arg ...string) { s.ValueRemove(m, arg...) } // s.ValueList(m, arg).Display("")
func (s {{.Option "name"}}) List(m *ice.Message, arg ...string) { s.ValueList(m, arg).Display("") } }
func init() { ice.TeamCtxCmd({{.Option "name"}}{}) } func init() { ice.TeamCtxCmd({{.Option "name"}}{}) }

View File

@ -1,7 +1,7 @@
Volcanos(chat.ONIMPORT, { Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { _init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [ can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title||value.name||value.user_name]}, {view: html.TITLE, list: [value.title||value.name||value.user_name, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]}, {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]}, {view: html.OUTPUT, list: [value.content||value.info]},
] }) ] })

View File

@ -6,6 +6,13 @@
"type": "hash" "type": "hash"
} }
}, },
"255b118ee6cd55156c2d9c9621ca7541": {
"meta": {
"index": "web.team.h18.portal",
"time": "2024-10-05 22:55:19.177",
"type": "hash"
}
},
"2f91065050f787e1e3b8aa5338ddd16b": { "2f91065050f787e1e3b8aa5338ddd16b": {
"meta": { "meta": {
"index": "web.chat.email.client", "index": "web.chat.email.client",
@ -20,6 +27,13 @@
"type": "hash" "type": "hash"
} }
}, },
"4835fa3efc154c875d4c2038c4734df7": {
"meta": {
"index": "web.team.base.portal",
"time": "2024-10-05 19:05:06.830",
"type": "hash"
}
},
"4b1e97b62a44419c00caf65e297abd18": { "4b1e97b62a44419c00caf65e297abd18": {
"meta": { "meta": {
"index": "web.team.guanlixitong.portal", "index": "web.team.guanlixitong.portal",
@ -48,6 +62,13 @@
"type": "hash" "type": "hash"
} }
}, },
"741793f8494943edd95c5c9dae13458f": {
"meta": {
"index": "web.team.h2.portal",
"time": "2024-10-05 19:03:01.418",
"type": "hash"
}
},
"91846a6751800ea3e45d73a43aad29d0": { "91846a6751800ea3e45d73a43aad29d0": {
"meta": { "meta": {
"index": "ssh.relay", "index": "ssh.relay",
@ -62,6 +83,27 @@
"type": "hash" "type": "hash"
} }
}, },
"a532764a72e827135759c49816c17606": {
"meta": {
"index": "web.team.h5.portal",
"time": "2024-10-05 19:04:16.866",
"type": "hash"
}
},
"ae10a051342a01926761a84f477b66ec": {
"meta": {
"index": "web.team.h1.portal",
"time": "2024-10-05 19:02:24.393",
"type": "hash"
}
},
"aebfef525e0ba7d237afd94e5c118d11": {
"meta": {
"index": "web.team.h3.portal",
"time": "2024-10-05 19:03:37.710",
"type": "hash"
}
},
"bb5d4d821ab5b4dc53816410bfb975b3": { "bb5d4d821ab5b4dc53816410bfb975b3": {
"meta": { "meta": {
"index": "web.team.operation.portal", "index": "web.team.operation.portal",
@ -69,6 +111,13 @@
"type": "hash" "type": "hash"
} }
}, },
"c14bbc5551aa7569bdfdd98235dcf3ee": {
"meta": {
"index": "web.team.renzhengshouquan.portal",
"time": "2024-09-25 08:30:18.181",
"type": "hash"
}
},
"caf2ff30fce9825f81ea59f9f675187d": { "caf2ff30fce9825f81ea59f9f675187d": {
"meta": { "meta": {
"index": "web.team.production.portal", "index": "web.team.production.portal",

View File

@ -8,6 +8,17 @@
"time": "2024-09-03 10:34:55.194" "time": "2024-09-03 10:34:55.194"
} }
}, },
"1b65a1e29a6fbafcfc923377c17e0786": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.dashboard.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.910"
}
},
"2bda2c05c188eefba31832c7a12fe046": { "2bda2c05c188eefba31832c7a12fe046": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png", "icons": "https://img.icons8.com/officel/80/qr-code.png",
@ -22,8 +33,8 @@
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png", "icons": "https://img.icons8.com/officel/80/person-at-home.png",
"index": "web.team.dashboard.member", "index": "web.team.dashboard.member",
"name": "场景成员", "name": "组织成员",
"order": "101", "order": "102",
"role": "leader,worker,server", "role": "leader,worker,server",
"time": "2024-09-03 10:34:55.933" "time": "2024-09-03 10:34:55.933"
} }
@ -47,6 +58,59 @@
"time": "2024-09-03 10:34:55.202" "time": "2024-09-03 10:34:55.202"
} }
}, },
"540ddf077c3c36f74bff3cd7bfca960c": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.dashboard.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2024-11-23 17:07:01.339"
}
},
"61e32fdb1693caabfd9d9a116bdcefad": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"index": "web.team.dashboard.setting",
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2024-09-21 08:58:33.696"
}
},
"6bed6f6b60d01503a6060b8e3e7fae96": {
"meta": {
"icons": "https://img.icons8.com/officel/80/data-configuration.png",
"index": "web.team.dashboard.cleanup",
"name": "数据清理",
"order": "3",
"role": "leader",
"time": "2024-12-09 16:37:31.617"
}
},
"7c976e2b537da5ed93131b1f4a1833d8": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.dashboard.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-20 22:03:43.766"
}
},
"85e9ad5c568cceaa0aa273431f2cfcc2": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.dashboard.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.987"
}
},
"9b9207dcf4b99c9bd85f2dbb98cce04d": { "9b9207dcf4b99c9bd85f2dbb98cce04d": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png", "icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
@ -83,7 +147,19 @@
"name": "连接配置", "name": "连接配置",
"order": "1", "order": "1",
"role": "leader", "role": "leader",
"time": "2024-09-18 10:11:37.406" "time": "2024-09-18 10:11:37.406",
"type": "mysql"
}
},
"d13cf7ba94dbc15ff9fd04603a2ecfc8": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.dashboard.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-05 08:12:26.762"
} }
}, },
"e2e828ce2e60c2d48b3d3eceb0cb33d3": { "e2e828ce2e60c2d48b3d3eceb0cb33d3": {
@ -93,10 +169,30 @@
"init": "2", "init": "2",
"name": "数据汇总", "name": "数据汇总",
"order": "2", "order": "2",
"role": "leader,worker,server", "role": "leader,worker",
"time": "2024-09-03 10:34:55.200" "time": "2024-09-03 10:34:55.200"
} }
}, },
"e3b889de9ace6b7f42008f8e0732effc": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.dashboard.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.977"
}
},
"e4039b1993b663907a2f2aa12a4fd104": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.dashboard.credit",
"name": "用户名片",
"order": "101",
"time": "2024-09-30 08:38:42.598"
}
},
"e96c0373ddfbf817f5fd8970a6c69206": { "e96c0373ddfbf817f5fd8970a6c69206": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png", "icons": "https://img.icons8.com/officel/80/commercial.png",

View File

@ -1,60 +0,0 @@
{
"535a365079a04575a3ebcc8335ee6e14": {
"meta": {
"index": "web.team.database.event",
"order": "93",
"role": "creator",
"time": "2024-09-03 10:27:06.386"
}
},
"719a6d97576235e241f0d6809a434ada": {
"meta": {
"index": "web.team.database.support",
"order": "103",
"time": "2024-09-03 10:27:06.390"
}
},
"b7894c3c001669f5ec1ac8f50c0d41de": {
"meta": {
"index": "web.team.database.recent",
"order": "101",
"time": "2024-09-03 10:27:06.385"
}
},
"c8e039a1aab9e850fe37cff5195ecdef": {
"meta": {
"index": "web.team.database.service",
"order": "102",
"time": "2024-09-03 10:27:06.384"
}
},
"da2601053bd94ff5d90afa3634b6f1ff": {
"meta": {
"index": "web.team.database.summary",
"time": "2024-09-03 10:27:06.382"
}
},
"dc5a31212f039dac07ae246b90a313aa": {
"meta": {
"index": "web.team.database.message",
"order": "100",
"time": "2024-09-03 10:27:06.381"
}
},
"e20005fb113060582cc3b37df321e859": {
"meta": {
"index": "web.team.database.allow",
"order": "92",
"role": "creator",
"time": "2024-09-03 10:27:06.388"
}
},
"f2f1ca7870c34140fe5625e45fb95ead": {
"meta": {
"index": "web.team.database.apply",
"order": "91",
"role": "creator",
"time": "2024-09-03 10:27:06.389"
}
}
}

View File

@ -9,6 +9,17 @@
"time": "2024-09-03 10:22:15.300" "time": "2024-09-03 10:22:15.300"
} }
}, },
"149aeb9426d25387396b3f60ea618df7": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.development.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-20 22:03:43.762"
}
},
"2dde4851ba7e250e914790995d78f408": { "2dde4851ba7e250e914790995d78f408": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png", "icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
@ -18,6 +29,15 @@
"time": "2024-09-03 10:22:15.302" "time": "2024-09-03 10:22:15.302"
} }
}, },
"3a84c93f797bf549e296841c33e78fae": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.development.credit",
"name": "用户名片",
"order": "101",
"time": "2024-09-30 08:38:42.588"
}
},
"4fedc06280d241291c9e826e57532333": { "4fedc06280d241291c9e826e57532333": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png", "icons": "https://img.icons8.com/officel/80/activity-grid.png",
@ -27,6 +47,25 @@
"time": "2024-09-03 10:22:15.306" "time": "2024-09-03 10:22:15.306"
} }
}, },
"52f27fd80193ec5e6bf32a67903c254e": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.development.history",
"name": "提交记录",
"order": "12",
"time": "2024-10-04 21:52:11.754"
}
},
"65bbf43dd9dd847f2c85f827030ea8ca": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"index": "web.team.development.setting",
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2024-09-21 08:58:33.611"
}
},
"6c38b2d75cf77d3f3be03d4755650660": { "6c38b2d75cf77d3f3be03d4755650660": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png", "icons": "https://img.icons8.com/officel/80/customer-support.png",
@ -36,6 +75,28 @@
"time": "2024-09-03 10:22:15.299" "time": "2024-09-03 10:22:15.299"
} }
}, },
"7f4fd414f77915febeb469732ae4b5fc": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.development.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-05 08:12:26.583"
}
},
"8922cdd711b3060411b079fa8f39ba72": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.development.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.896"
}
},
"90f891576bd575758a3bde4514e86e9c": { "90f891576bd575758a3bde4514e86e9c": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png", "icons": "https://img.icons8.com/officel/80/qr-code.png",
@ -58,10 +119,11 @@
}, },
"9f566fcd64df47d32969157a9e70bb9d": { "9f566fcd64df47d32969157a9e70bb9d": {
"meta": { "meta": {
"enable": "false",
"icons": "https://img.icons8.com/officel/80/activity-grid.png", "icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.development.version", "index": "web.team.development.version",
"name": "版本", "name": "版本",
"order": "1", "order": "11",
"time": "2024-09-03 10:22:15.301" "time": "2024-09-03 10:22:15.301"
} }
}, },
@ -69,8 +131,8 @@
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png", "icons": "https://img.icons8.com/officel/80/person-at-home.png",
"index": "web.team.development.member", "index": "web.team.development.member",
"name": "场景成员", "name": "组织成员",
"order": "101", "order": "102",
"role": "leader,worker,server", "role": "leader,worker,server",
"time": "2024-09-03 10:22:16.002" "time": "2024-09-03 10:22:16.002"
} }
@ -104,6 +166,28 @@
"time": "2024-09-03 10:22:15.303" "time": "2024-09-03 10:22:15.303"
} }
}, },
"e3412424662fc4735c37f7a7bda7558a": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.development.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2024-11-23 17:07:01.203"
}
},
"e347aded50c684b8e3118ba359a56039": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.development.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.815"
}
},
"e97ee926a1428c894e9d3e7d086b1e9c": { "e97ee926a1428c894e9d3e7d086b1e9c": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/square.png", "icons": "https://img.icons8.com/officel/80/square.png",
@ -112,5 +196,26 @@
"order": "901", "order": "901",
"time": "2024-09-09 08:51:35.231" "time": "2024-09-09 08:51:35.231"
} }
},
"eaf46f03ee68a1dd734f0c74083c37c9": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.development.serve",
"name": "服务模块",
"order": "1",
"public": "true",
"time": "2024-10-04 22:31:10.447"
}
},
"f842095ef49f8ab1a3e11b26b1f7391d": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.development.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.817"
}
} }
} }

View File

@ -1,4 +1,14 @@
{ {
"1246961a1d880252ead389142acd037b": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"index": "web.team.gonganxitong.setting",
"name": "服务配置",
"order": "102",
"role": "leader,worker,server",
"time": "2024-09-21 08:58:33.597"
}
},
"153c93456004ec2ca692d3bac2223167": { "153c93456004ec2ca692d3bac2223167": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png", "icons": "https://img.icons8.com/officel/80/activity-grid.png",
@ -8,6 +18,17 @@
"time": "2024-09-03 10:12:53.614" "time": "2024-09-03 10:12:53.614"
} }
}, },
"22574299a657140d473f0216b8d83710": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.gonganxitong.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.809"
}
},
"27c6988eeb07c78cbb49aa15c577cfa4": { "27c6988eeb07c78cbb49aa15c577cfa4": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png", "icons": "https://img.icons8.com/officel/80/edit-property.png",
@ -18,6 +39,17 @@
"time": "2024-09-03 10:12:53.617" "time": "2024-09-03 10:12:53.617"
} }
}, },
"2f80f1821b55a90555f630def20387be": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.gonganxitong.contract",
"name": "在线合同",
"order": "93",
"role": "leader,worker",
"time": "2024-11-25 15:19:53.242"
}
},
"3971882ea4f32c86386ad04b39d3e3d4": { "3971882ea4f32c86386ad04b39d3e3d4": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/square.png", "icons": "https://img.icons8.com/officel/80/square.png",
@ -27,6 +59,28 @@
"time": "2024-09-09 08:51:35.219" "time": "2024-09-09 08:51:35.219"
} }
}, },
"55ff6002f602327674ed6d4616023184": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.gonganxitong.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-05 08:12:26.566"
}
},
"882a999b4a72a9866d9e4eef110d335a": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.gonganxitong.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.799"
}
},
"8ce4dfb877e04e3be5144253fdd5d8ff": { "8ce4dfb877e04e3be5144253fdd5d8ff": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png", "icons": "https://img.icons8.com/officel/80/receipt-approved.png",
@ -37,6 +91,15 @@
"time": "2024-09-03 10:12:53.625" "time": "2024-09-03 10:12:53.625"
} }
}, },
"a53e36dcca735ef90b649fec546f520e": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.gonganxitong.credit",
"name": "用户名片",
"order": "102",
"time": "2024-09-30 08:38:42.512"
}
},
"a89a7c09e326295aaa7e7ea3d66fb28a": { "a89a7c09e326295aaa7e7ea3d66fb28a": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png", "icons": "https://img.icons8.com/officel/80/customer-support.png",
@ -46,6 +109,22 @@
"time": "2024-09-03 10:12:53.619" "time": "2024-09-03 10:12:53.619"
} }
}, },
"b07b1f652f5b2557c0b20e813fcf99d2": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"index": "web.team.gonganxitong.street",
"name": "街道信息",
"time": "2024-09-24 20:49:14.657"
}
},
"ba00879066bbcea83e30cda292d28a91": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"index": "web.team.gonganxitong.user",
"name": "用户信息",
"time": "2024-09-24 20:49:14.658"
}
},
"bdec92d5849b2a60a8811cff494f2391": { "bdec92d5849b2a60a8811cff494f2391": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png", "icons": "https://img.icons8.com/officel/80/property-with-timer.png",
@ -71,9 +150,21 @@
"index": "web.team.gonganxitong.notice", "index": "web.team.gonganxitong.notice",
"name": "通知公告", "name": "通知公告",
"order": "94", "order": "94",
"role": "leader",
"time": "2024-09-09 08:51:35.222" "time": "2024-09-09 08:51:35.222"
} }
}, },
"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": "leader,worker",
"time": "2024-11-23 17:07:01.193"
}
},
"d86e4e63183c8fae4ceb50498b0bcfde": { "d86e4e63183c8fae4ceb50498b0bcfde": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/categorize.png", "icons": "https://img.icons8.com/officel/80/categorize.png",
@ -92,12 +183,24 @@
"time": "2024-09-03 10:12:53.668" "time": "2024-09-03 10:12:53.668"
} }
}, },
"f24b53f61852f58734f9ef8488705026": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.gonganxitong.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-20 22:03:43.676"
}
},
"f28c03b5bdbbe92ebc89dabca5e7d4de": { "f28c03b5bdbbe92ebc89dabca5e7d4de": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png", "icons": "https://img.icons8.com/officel/80/person-at-home.png",
"index": "web.team.gonganxitong.member", "index": "web.team.gonganxitong.member",
"name": "场景成员", "name": "组织成员",
"order": "80", "order": "80",
"role": "leader,worker,server",
"time": "2024-09-03 10:12:53.666" "time": "2024-09-03 10:12:53.666"
} }
}, },

View File

@ -1,4 +1,12 @@
{ {
"003dd6be7f666b93d80cf0f758880d84": {
"meta": {
"icons": "https://img.icons8.com/officel/80/purchase-order.png",
"index": "web.team.guanlixitong.procurement",
"name": "采购清单",
"time": "2024-11-10 11:04:10.504"
}
},
"030e2a53ca3561a0d0d123c133a88b59": { "030e2a53ca3561a0d0d123c133a88b59": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png", "icons": "https://img.icons8.com/officel/80/qr-code.png",
@ -15,6 +23,16 @@
"time": "2024-09-09 08:51:35.194" "time": "2024-09-09 08:51:35.194"
} }
}, },
"0521e637b051a0e175a6070eded1bcef": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"index": "web.team.guanlixitong.setting",
"name": "服务配置",
"order": "102",
"role": "leader,worker,server",
"time": "2024-09-21 08:58:33.584"
}
},
"057616b7366e1930ef4e4a921fe45f1f": { "057616b7366e1930ef4e4a921fe45f1f": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png", "icons": "https://img.icons8.com/officel/80/activity-grid.png",
@ -24,6 +42,31 @@
"time": "2024-09-03 10:22:15.279" "time": "2024-09-03 10:22:15.279"
} }
}, },
"0721f4589e2e5f0a50b9088471e141a4": {
"meta": {
"icons": "https://img.icons8.com/officel/80/about-us-male--v2.png",
"index": "web.team.guanlixitong.employee",
"name": "员工信息",
"time": "2024-11-10 11:04:10.490"
}
},
"0d1831178568952bdf4f5c6b1587742b": {
"meta": {
"icons": "https://img.icons8.com/officel/80/parse-from-clipboard.png",
"index": "web.team.guanlixitong.resume",
"name": "应聘简历",
"time": "2024-11-10 11:04:10.497"
}
},
"2fd80c581b69c9f67420e793804dbd9f": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.guanlixitong.credit",
"name": "用户名片",
"order": "102",
"time": "2024-09-30 08:38:42.501"
}
},
"30bfa47cab4cd689901fd2e1b87eb235": { "30bfa47cab4cd689901fd2e1b87eb235": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png", "icons": "https://img.icons8.com/officel/80/receipt-approved.png",
@ -34,12 +77,21 @@
"time": "2024-09-03 10:22:15.271" "time": "2024-09-03 10:22:15.271"
} }
}, },
"31e2929e94058b015eadf6e874f956a8": {
"meta": {
"icons": "https://img.icons8.com/officel/80/set-as-resume.png",
"index": "web.team.guanlixitong.recruitment",
"name": "招聘需求",
"time": "2024-11-10 11:04:10.496"
}
},
"5695d50b28872804a01d7c923ee91cd1": { "5695d50b28872804a01d7c923ee91cd1": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png", "icons": "https://img.icons8.com/officel/80/person-at-home.png",
"index": "web.team.guanlixitong.member", "index": "web.team.guanlixitong.member",
"name": "团队成员", "name": "团队成员",
"order": "80", "order": "80",
"role": "leader,worker,server",
"time": "2024-09-03 10:22:15.843" "time": "2024-09-03 10:22:15.843"
} }
}, },
@ -52,15 +104,38 @@
"time": "2024-09-09 08:51:35.192" "time": "2024-09-09 08:51:35.192"
} }
}, },
"7c0eda0a842c79270ebf4917a0a07b9e": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.guanlixitong.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-05 08:12:26.542"
}
},
"809b63c1819fc3ac1452e3b71889aec5": { "809b63c1819fc3ac1452e3b71889aec5": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png", "icons": "https://img.icons8.com/officel/80/commercial.png",
"index": "web.team.guanlixitong.notice", "index": "web.team.guanlixitong.notice",
"name": "通知公告", "name": "通知公告",
"order": "94", "order": "94",
"role": "leader",
"time": "2024-09-09 08:51:35.195" "time": "2024-09-09 08:51:35.195"
} }
}, },
"8548d5ce3faee7bd508d2fb53d57f35b": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.guanlixitong.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.776"
}
},
"9c18032c5bc252f2986e1b20e7e77db7": { "9c18032c5bc252f2986e1b20e7e77db7": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png", "icons": "https://img.icons8.com/officel/80/property-with-timer.png",
@ -80,6 +155,30 @@
"time": "2024-09-03 10:22:15.280" "time": "2024-09-03 10:22:15.280"
} }
}, },
"ace6350cd663c693ddf47e81625c8a7a": {
"meta": {
"icons": "https://img.icons8.com/officel/80/meeting.png",
"index": "web.team.guanlixitong.interview",
"name": "招聘面试",
"time": "2024-11-10 11:04:10.499"
}
},
"ad9a805bfef319f0704842021bfc17b0": {
"meta": {
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.guanlixitong.conference",
"name": "在线会议",
"time": "2024-11-10 11:04:10.492"
}
},
"af39f30945dafa855548057f4dab3be4": {
"meta": {
"icons": "https://img.icons8.com/officel/80/warehouse.png",
"index": "web.team.guanlixitong.inventory",
"name": "库存物资",
"time": "2024-11-10 11:04:10.493"
}
},
"c27ad1df8aa9059d6018fb5add5ee546": { "c27ad1df8aa9059d6018fb5add5ee546": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png", "icons": "https://img.icons8.com/officel/80/customer-support.png",
@ -89,6 +188,14 @@
"time": "2024-09-03 10:22:15.273" "time": "2024-09-03 10:22:15.273"
} }
}, },
"c2fcc269f958a7b4b3bf0e37a2641ed8": {
"meta": {
"icons": "https://img.icons8.com/officel/80/office.png",
"index": "web.team.guanlixitong.equipment",
"name": "办公用品",
"time": "2024-11-10 11:04:10.500"
}
},
"c36d47e2611b0d1e7a14088bc3293d04": { "c36d47e2611b0d1e7a14088bc3293d04": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png", "icons": "https://img.icons8.com/officel/80/edit-property.png",
@ -99,6 +206,17 @@
"time": "2024-09-03 10:22:15.275" "time": "2024-09-03 10:22:15.275"
} }
}, },
"cb1692a3c6b2d0d7da022787e411843b": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.guanlixitong.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2024-11-23 17:07:01.173"
}
},
"d25f3f88261ead2a0079415a26aa6853": { "d25f3f88261ead2a0079415a26aa6853": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png", "icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
@ -108,6 +226,39 @@
"time": "2024-09-03 10:22:15.274" "time": "2024-09-03 10:22:15.274"
} }
}, },
"e2ade31e19fd70911169780be6757fa3": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.guanlixitong.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.769"
}
},
"e595a0bbefbcfaa89f45dd875cc6fe0b": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.guanlixitong.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-10 11:04:10.491"
}
},
"f10df497cdaa6ec48de612ae8cde4c9a": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.guanlixitong.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-20 22:03:43.639"
}
},
"fa5ff99e330772f88b929de7762a36f1": { "fa5ff99e330772f88b929de7762a36f1": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/goal--v1.png", "icons": "https://img.icons8.com/officel/80/goal--v1.png",

View File

@ -1,10 +1,45 @@
{ {
"03acc6ed03fa47e9639f1e5c459c3b50": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.operation.template",
"name": "云模板",
"order": "2",
"role": "leader,worker",
"time": "2025-03-14 20:51:15.546"
}
},
"03f7f410d292fb30026cbcd99290e943": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.operation.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-05 08:12:26.520"
}
},
"2511b9e18bf167ae0171c740e8f0513c": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.operation.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.756"
}
},
"3b0ced2e41179097e594b91c3c36536b": { "3b0ced2e41179097e594b91c3c36536b": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png", "icons": "https://img.icons8.com/officel/80/person-at-home.png",
"index": "web.team.operation.member", "index": "web.team.operation.member",
"name": "场景成员", "name": "组织成员",
"order": "101", "order": "102",
"role": "leader,worker,server", "role": "leader,worker,server",
"time": "2024-09-03 10:22:15.741" "time": "2024-09-03 10:22:15.741"
} }
@ -18,6 +53,16 @@
"time": "2024-09-03 10:22:15.258" "time": "2024-09-03 10:22:15.258"
} }
}, },
"64be90144c205e73b1fc216962d7ad25": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.operation.product",
"name": "云服务",
"order": "5",
"time": "2025-03-05 10:40:39.748"
}
},
"6ca4f1fc571350c2498bc5c1d7ac3563": { "6ca4f1fc571350c2498bc5c1d7ac3563": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png", "icons": "https://img.icons8.com/officel/80/qr-code.png",
@ -28,13 +73,27 @@
"time": "2024-09-03 10:22:15.841" "time": "2024-09-03 10:22:15.841"
} }
}, },
"7633ddfc1c6052b7dd2f00096248e1f7": { "700c65f09a19cb53ee5c2dfbb98a5a0b": {
"meta": { "meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.operation.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-20 22:03:43.566"
}
},
"7abb3b3760a9b686457938511c0ee7df": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png", "icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.operation.release", "index": "web.team.operation.project",
"name": "发布", "name": "云项目",
"order": "1", "order": "4",
"time": "2024-09-03 10:22:15.265" "role": "leader,worker",
"time": "2025-03-05 10:40:39.740"
} }
}, },
"85c8678d4af08bb0c3e9560155b7c98f": { "85c8678d4af08bb0c3e9560155b7c98f": {
@ -47,6 +106,27 @@
"time": "2024-09-03 10:22:15.264" "time": "2024-09-03 10:22:15.264"
} }
}, },
"91b0ca086b5b8aa00e84737c4395a19f": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.operation.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.766"
}
},
"aa58390a9fac9f8210eca564d1ad82ff": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.operation.credit",
"name": "用户名片",
"order": "101",
"time": "2024-09-30 08:38:42.411"
}
},
"b2d8434f3ab5340408f71c4bf087e3d9": { "b2d8434f3ab5340408f71c4bf087e3d9": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png", "icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
@ -56,6 +136,17 @@
"time": "2024-09-03 10:22:15.259" "time": "2024-09-03 10:22:15.259"
} }
}, },
"c8159ab932f400dbafa08fb995e16355": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.operation.cluster",
"name": "云集群",
"order": "1",
"role": "leader",
"time": "2025-03-05 10:40:39.838"
}
},
"ca74fb83cfd850b1ca03fe18976c253a": { "ca74fb83cfd850b1ca03fe18976c253a": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png", "icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
@ -85,6 +176,29 @@
"time": "2024-09-03 10:22:15.260" "time": "2024-09-03 10:22:15.260"
} }
}, },
"d8f6d139d6a5f9b5aa504702e7777eb3": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.operation.gateway",
"name": "云主机",
"order": "3",
"portal": "true",
"time": "2025-03-05 12:13:06.405"
}
},
"d953e8b2c9159b1f4d32ff1c15793314": {
"meta": {
"auth": "issued",
"enable": "false",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.operation.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.761"
}
},
"dad14d38feac6ebfb61953f8aae393bb": { "dad14d38feac6ebfb61953f8aae393bb": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/square.png", "icons": "https://img.icons8.com/officel/80/square.png",
@ -94,6 +208,28 @@
"time": "2024-09-09 08:51:35.179" "time": "2024-09-09 08:51:35.179"
} }
}, },
"e0b69dbd47a289ed57d970877000fa40": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"index": "web.team.operation.setting",
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2024-09-21 08:58:33.495"
}
},
"e9150ed09fcdb4da60f1e9f0d5fe54ea": {
"meta": {
"auth": "issued",
"enable": "false",
"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": "2024-11-23 17:07:01.092"
}
},
"ec25b5c62a4d26688fe114d9b25f7a56": { "ec25b5c62a4d26688fe114d9b25f7a56": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png", "icons": "https://img.icons8.com/officel/80/customer-support.png",

View File

@ -18,16 +18,38 @@
"time": "2024-09-03 15:44:28.515" "time": "2024-09-03 15:44:28.515"
} }
}, },
"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": "2024-12-05 08:12:26.425"
}
},
"2cf321f56f8ace96e561bf54f664f276": { "2cf321f56f8ace96e561bf54f664f276": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/communication.png", "icons": "https://img.icons8.com/officel/80/communication.png",
"index": "web.team.production.issue", "index": "web.team.production.issue",
"name": "产品需求", "name": "产品需求",
"order": "2", "order": "2",
"role": "leader,worker,server", "role": "leader,worker",
"time": "2024-09-03 15:44:28.509" "time": "2024-09-03 15:44:28.509"
} }
}, },
"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": "2024-11-23 17:07:01.083"
}
},
"50dd2633fafc2efb90760b602f1500ea": { "50dd2633fafc2efb90760b602f1500ea": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png", "icons": "https://img.icons8.com/officel/80/commercial.png",
@ -56,6 +78,16 @@
"time": "2024-09-03 15:44:28.505" "time": "2024-09-03 15:44:28.505"
} }
}, },
"6871a5c44a6021f7edaf46cf356266e3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"index": "web.team.production.setting",
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2024-09-21 08:58:33.492"
}
},
"6d06c21df099b1bc6b85fa6ff59ae6d1": { "6d06c21df099b1bc6b85fa6ff59ae6d1": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png", "icons": "https://img.icons8.com/officel/80/receipt-approved.png",
@ -66,6 +98,26 @@
"time": "2024-09-03 15:44:28.507" "time": "2024-09-03 15:44:28.507"
} }
}, },
"73b81840f26d2885c065d19e08e923f1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/web-design.png",
"index": "web.team.production.design",
"name": "界面设计",
"order": "3",
"time": "2025-03-21 08:49:22.166"
}
},
"7cf76afacb83fabb3d6a6ffaf48b6066": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.production.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.589"
}
},
"8efc6b4f9d0d59713215fb5843f8f037": { "8efc6b4f9d0d59713215fb5843f8f037": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png", "icons": "https://img.icons8.com/officel/80/customer-support.png",
@ -81,7 +133,7 @@
"index": "web.team.production.case", "index": "web.team.production.case",
"name": "测试用例", "name": "测试用例",
"order": "4", "order": "4",
"role": "leader,worker,server", "role": "leader,worker",
"time": "2024-09-12 20:43:01.630" "time": "2024-09-12 20:43:01.630"
} }
}, },
@ -95,6 +147,26 @@
"time": "2024-09-03 15:44:29.253" "time": "2024-09-03 15:44:29.253"
} }
}, },
"a9b5b213c868653f1a060c3231d57e8f": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.production.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.689"
}
},
"af401082a04bff4314523e5ebb69abff": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.production.credit",
"name": "用户名片",
"order": "101",
"time": "2024-09-30 08:38:42.318"
}
},
"b7772dfc47e42e8c7e1c07fc1657546a": { "b7772dfc47e42e8c7e1c07fc1657546a": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png", "icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
@ -114,16 +186,40 @@
"time": "2024-09-03 15:44:28.512" "time": "2024-09-03 15:44:28.512"
} }
}, },
"c9559beab992f8b46b9cfa4a196e61e8": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.production.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.691"
}
},
"c96881ba1b560e55d4d589e7c52033ca": { "c96881ba1b560e55d4d589e7c52033ca": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/tasks.png", "icons": "https://img.icons8.com/officel/80/tasks.png",
"index": "web.team.production.task", "index": "web.team.production.task",
"name": "开发任务", "name": "开发任务",
"order": "3", "order": "3",
"role": "leader,worker,server", "portal": "true",
"public": "true",
"role": "leader,worker",
"time": "2024-09-12 20:43:01.633" "time": "2024-09-12 20:43:01.633"
} }
}, },
"cea1324e3dca123f6560dee5c559a587": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.production.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-20 22:03:43.484"
}
},
"e10cc3b27f6a9f02fbf22bc58551d862": { "e10cc3b27f6a9f02fbf22bc58551d862": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png", "icons": "https://img.icons8.com/officel/80/activity-grid.png",
@ -138,7 +234,7 @@
"icons": "https://img.icons8.com/officel/80/person-at-home.png", "icons": "https://img.icons8.com/officel/80/person-at-home.png",
"index": "web.team.production.member", "index": "web.team.production.member",
"name": "项目成员", "name": "项目成员",
"order": "101", "order": "102",
"role": "leader,worker,server", "role": "leader,worker,server",
"time": "2024-09-03 15:44:29.251" "time": "2024-09-03 15:44:29.251"
} }

View File

@ -0,0 +1,229 @@
{
"015b4784c16b63975824abbb3ff4ec9f": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.renzhengshouquan.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-29 21:33:29.660"
}
},
"0d7f068029dbf7f9f0d307070cc3a79b": {
"meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png",
"index": "web.team.renzhengshouquan.allow",
"name": "权限审批",
"order": "503",
"role": "creator",
"time": "2024-09-25 08:30:28.774"
}
},
"1c4fee90e6a7bdb8ab6f1ccb23f3273f": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.renzhengshouquan.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-29 21:33:29.663"
}
},
"1d15ae175ffe375630da1466417d2d5d": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.renzhengshouquan.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-29 21:33:29.662"
}
},
"2a065e0a48b909ae79fbb3dd750e1eb5": {
"meta": {
"icons": "https://img.icons8.com/officel/80/id-verified.png",
"index": "web.team.renzhengshouquan.auth",
"name": "认证授权",
"order": "2",
"time": "2024-09-25 08:30:28.775"
}
},
"456d3a031a140d43f54690ea7203628d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/property-with-timer.png",
"index": "web.team.renzhengshouquan.event",
"name": "事件流",
"order": "504",
"role": "creator",
"time": "2024-09-25 08:30:28.770"
}
},
"4cac9ca99ccb8db395f703434647f5f3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"index": "web.team.renzhengshouquan.setting",
"name": "服务配置",
"order": "102",
"role": "leader,worker,server",
"time": "2024-09-25 08:30:28.769"
}
},
"52fb3a7d85d879b638cc246850b236f6": {
"meta": {
"icons": "https://img.icons8.com/officel/80/qr-code.png",
"index": "web.team.renzhengshouquan.qrcode",
"name": "场景码",
"order": "501",
"role": "creator",
"time": "2024-09-25 08:30:28.772"
}
},
"6806548eeea33ee2118c520a60bc7e4b": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.renzhengshouquan.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-05 08:12:26.339"
}
},
"732373815fa26c85ad04dd57ca57db39": {
"meta": {
"icons": "https://img.icons8.com/officel/80/edit-property.png",
"index": "web.team.renzhengshouquan.apply",
"name": "权限申请",
"order": "502",
"role": "creator",
"time": "2024-09-25 08:30:28.779"
}
},
"79283d05c3eb6007da9adcdc9751f68d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/structured-document-data.png",
"index": "web.team.renzhengshouquan.admin",
"name": "管理后台",
"order": "4",
"role": "leader,worker",
"time": "2024-11-19 16:06:52.858"
}
},
"7a3a6cdf6eebd575950694ee28a8452e": {
"meta": {
"auth": "issued",
"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-23 17:07:00.996"
}
},
"83f5f7ed321eeee6827add7a03947102": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.renzhengshouquan.profile",
"name": "用户名片",
"order": "3",
"time": "2024-09-25 08:30:28.777"
}
},
"89cf6f6cc69c13b7d541a0d61eae66e1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/identification-documents--v2.png",
"index": "web.team.renzhengshouquan.cert",
"name": "上传证件",
"order": "1",
"time": "2024-09-25 08:30:28.774"
}
},
"9e52a4f0a1a8d35c14b40d14b0d9cff1": {
"meta": {
"icons": "https://img.icons8.com/officel/80/test-partial-passed.png",
"index": "web.team.renzhengshouquan.message",
"name": "消息待办",
"order": "902",
"time": "2024-09-25 08:30:28.769"
}
},
"a040dfa713a6fa9533b3184244dbbb74": {
"meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png",
"index": "web.team.renzhengshouquan.support",
"name": "客服支持",
"order": "905",
"time": "2024-09-25 08:30:28.776"
}
},
"bfecb55b11fe68186270fe1b4b8de8cf": {
"meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png",
"index": "web.team.renzhengshouquan.member",
"name": "组织成员",
"order": "101",
"role": "leader,worker,server",
"time": "2024-09-25 08:30:28.772"
}
},
"c9eeca8509b5b055149a5593312436cd": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.renzhengshouquan.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-20 22:03:43.481"
}
},
"d9f55b517f4b2579693523ed3b5bd088": {
"meta": {
"icons": "https://img.icons8.com/officel/80/square.png",
"index": "web.team.renzhengshouquan.market",
"name": "人民广场",
"order": "901",
"time": "2024-09-25 08:30:28.771"
}
},
"e038450591f3c8e7babc0c21b1c6fa6d": {
"meta": {
"icons": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"index": "web.team.renzhengshouquan.recent",
"name": "最近访问",
"order": "903",
"time": "2024-09-25 08:30:28.778"
}
},
"ecfb11fad5b4bdf21384e2e1ff571598": {
"meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png",
"index": "web.team.renzhengshouquan.notice",
"name": "通知公告",
"order": "505",
"role": "leader",
"time": "2024-09-25 08:30:28.773"
}
},
"f669e15e1c1c9da2bd3ea0c58abc0bd3": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.renzhengshouquan.credit",
"name": "用户名片",
"order": "102",
"time": "2024-09-30 08:38:42.312"
}
},
"f6b093d122ff3cec363b00093e0a6f19": {
"meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png",
"index": "web.team.renzhengshouquan.service",
"name": "服务发现",
"order": "904",
"time": "2024-09-25 08:30:28.777"
}
}
}

View File

@ -37,16 +37,38 @@
"time": "2024-09-17 21:19:56.161" "time": "2024-09-17 21:19:56.161"
} }
}, },
"3c55e6938bedf9904dbd8a6b3a551824": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/video-conference.png",
"index": "web.team.storage.meeting",
"name": "在线会议",
"order": "91",
"role": "leader,worker",
"time": "2024-11-20 22:03:43.464"
}
},
"44e0cc566504640e376a20a3eb26e6d6": { "44e0cc566504640e376a20a3eb26e6d6": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/person-at-home.png", "icons": "https://img.icons8.com/officel/80/person-at-home.png",
"index": "web.team.storage.member", "index": "web.team.storage.member",
"name": "网盘成员", "name": "网盘成员",
"order": "101", "order": "102",
"role": "leader,worker,server", "role": "leader,worker,server",
"time": "2024-09-17 21:19:56.263" "time": "2024-09-17 21:19:56.263"
} }
}, },
"4b2a240e9f7321535b5acd39fa889b7e": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-store.png",
"index": "web.team.storage.goodslist",
"name": "在线商城",
"order": "91",
"role": "leader,worker",
"time": "2024-12-05 08:12:26.237"
}
},
"4c837d128ab03d59c8479b695276828c": { "4c837d128ab03d59c8479b695276828c": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/customer-support.png", "icons": "https://img.icons8.com/officel/80/customer-support.png",
@ -56,6 +78,16 @@
"time": "2024-09-17 21:19:56.160" "time": "2024-09-17 21:19:56.160"
} }
}, },
"5bfbd386cce531816ef93117ce33ff51": {
"meta": {
"icons": "https://img.icons8.com/officel/80/settings--v1.png",
"index": "web.team.storage.setting",
"name": "服务配置",
"order": "103",
"role": "leader,worker,server",
"time": "2024-09-21 08:58:33.294"
}
},
"618ea5c219d7eb5e194b6eea12853281": { "618ea5c219d7eb5e194b6eea12853281": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/receipt-approved.png", "icons": "https://img.icons8.com/officel/80/receipt-approved.png",
@ -94,6 +126,37 @@
"time": "2024-09-17 21:19:56.163" "time": "2024-09-17 21:19:56.163"
} }
}, },
"ceaca87cf0d112aec124ad24298e189e": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/ios-photos.png",
"index": "web.team.storage.photo",
"name": "在线相册",
"order": "95",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.564"
}
},
"d4929122bd93a197e2b912b93c951646": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/agreement.png",
"index": "web.team.storage.contract",
"name": "在线合同",
"order": "94",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.485"
}
},
"d9bdb3105dda162dd303f87e5d7bb301": {
"meta": {
"icons": "https://img.icons8.com/officel/80/passport.png",
"index": "web.team.storage.credit",
"name": "用户名片",
"order": "101",
"time": "2024-09-30 08:38:42.222"
}
},
"de46b4a43370c18fc02cb039592ece22": { "de46b4a43370c18fc02cb039592ece22": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/activity-grid.png", "icons": "https://img.icons8.com/officel/80/activity-grid.png",
@ -103,6 +166,17 @@
"time": "2024-09-17 21:19:56.262" "time": "2024-09-17 21:19:56.262"
} }
}, },
"f005721298281995921aab3079f9f7e5": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"index": "web.team.storage.paymentlist",
"name": "在线支付",
"order": "92",
"role": "leader,worker",
"time": "2024-11-23 17:07:00.983"
}
},
"f55ae08834fc5fe3a334f35ee0bc8572": { "f55ae08834fc5fe3a334f35ee0bc8572": {
"meta": { "meta": {
"icons": "https://img.icons8.com/officel/80/commercial.png", "icons": "https://img.icons8.com/officel/80/commercial.png",
@ -112,5 +186,16 @@
"role": "leader", "role": "leader",
"time": "2024-09-17 21:19:56.160" "time": "2024-09-17 21:19:56.160"
} }
},
"f6f77c7a5e247a742c2699564c4507a1": {
"meta": {
"auth": "issued",
"icons": "https://img.icons8.com/officel/80/documents.png",
"index": "web.team.storage.document",
"name": "在线文档",
"order": "93",
"role": "leader,worker",
"time": "2024-11-28 17:54:45.486"
}
} }
} }