Compare commits

...

93 Commits

Author SHA1 Message Date
shy
e707c4e3ca add some 2025-05-05 14:15:24 +08:00
shy
2c2060c8a8 add some 2025-05-04 08:49:40 +08:00
shy
3a382468f7 add some 2025-05-04 08:48:49 +08:00
shy
592013abfd add some 2025-05-02 01:36:32 +08:00
shy
388b648a7a opt some 2025-04-29 00:56:49 +08:00
shy
2662b68051 opt some 2025-03-22 12:55:41 +08:00
shy
9e8c340277 opt some 2025-03-15 20:41:24 +08:00
shy
3de26dcb69 add some 2025-03-15 20:26:58 +08:00
shy
b1345a0313 add some 2025-03-15 13:16:13 +08:00
shy
b62ec45b1d opt some 2025-03-10 18:51:50 +08:00
shy
e5cc156f7e add some 2025-03-10 18:38:47 +08:00
shy
1f02345f88 add some 2025-03-08 08:38:28 +08:00
shy
f8eca1a0a1 opt some 2025-03-05 17:48:10 +08:00
shy
12d4b0e24f opt some 2025-03-03 19:49:49 +08:00
shy
8671bbd6f2 add some 2025-03-03 07:52:47 +08:00
shy
b39d8aa887 opt some 2025-02-28 21:27:37 +08:00
shy
78dac8b525 opt some 2025-02-28 14:23:34 +08:00
shy
54359bf597 add some 2025-02-27 18:32:49 +08:00
shy
9b6f6cbb6e add some 2025-02-27 18:17:48 +08:00
shy
5d99b3884c add some 2025-02-27 18:06:08 +08:00
shy
b546493b39 add some 2025-02-27 16:27:25 +08:00
shy
f02e0b56e8 add some 2025-02-27 14:37:47 +08:00
shy
8f5e2cf1f6 opt some 2025-02-26 22:24:48 +08:00
shy
8ab9bd6bc4 opt some 2025-02-26 22:04:31 +08:00
shy
d6536290e2 add some 2025-02-25 22:51:39 +08:00
shy
b00f4dbaf6 opt some 2025-02-25 22:13:45 +08:00
shy
21caa186cc opt some 2025-02-25 22:10:18 +08:00
shy
4f75ab2750 add some 2025-02-25 21:54:54 +08:00
shy
ed3efbef06 add some 2025-02-25 12:14:43 +08:00
root
8f6f539100 add some 2025-02-25 07:32:34 +08:00
shy
5f7e9e2140 add some 2025-02-23 09:58:33 +08:00
shy
9c66ee628e opt some 2025-02-14 16:52:40 +08:00
shy
b5601d7a58 add some 2025-02-14 16:15:42 +08:00
shy
fd4f3a4195 add some 2025-02-10 23:06:45 +08:00
shy
f9138c8588 add some 2025-02-03 22:15:49 +08:00
shy
a2b51f8ea0 opt some 2025-01-05 16:59:20 +08:00
shy
ac1b9929ed add some 2025-01-05 15:56:16 +08:00
shy
906d1c6f6f add some 2025-01-05 12:45:34 +08:00
shy
197da3ed93 opt some 2024-12-29 19:31:11 +08:00
shy
af07d2c1c3 opt some 2024-12-29 19:22:26 +08:00
shy
1c30ff4d40 opt some 2024-12-17 15:38:46 +08:00
shy
74b73cf64d add some 2024-12-16 15:17:17 +08:00
shy
758128292e opt some 2024-12-15 09:26:39 +08:00
shy
90f0d55532 opt some 2024-12-15 09:21:39 +08:00
shy
15bc07af13 add some 2024-12-14 18:35:27 +08:00
shy
0979482309 add some 2024-12-09 12:24:45 +08:00
shy
884e7ee2b5 add some 2024-12-08 22:45:12 +08:00
shy
9697188dc2 add some 2024-12-08 22:27:18 +08:00
shy
8518a5d9bc add some 2024-12-06 18:14:00 +08:00
shy
d73ed5b838 add some 2024-12-06 09:00:24 +08:00
shy
629d18fce5 add some 2024-12-05 09:54:59 +08:00
shy
f0c3ed433a add some 2024-12-05 09:47:38 +08:00
shy
2b6779c889 add some 2024-12-04 20:15:05 +08:00
shy
f03118a8e6 add some 2024-12-04 18:18:50 +08:00
shy
a118f29d5d add some 2024-12-04 14:39:53 +08:00
shy
261e445908 add some 2024-12-04 09:40:37 +08:00
shy
973c7c024c add smh 2024-12-03 22:44:37 +08:00
shy
36c8e4e36e add some 2024-12-02 09:39:15 +08:00
shy
7629063746 add some 2024-11-28 17:45:48 +08:00
shy
ca60df1722 add some 2024-11-28 17:34:30 +08:00
shy
5de7c6a3a2 add some 2024-11-28 12:31:59 +08:00
shy
8cda9be1b6 add some 2024-11-27 14:25:47 +08:00
shy
409aa0aed9 opt some 2024-11-26 23:12:41 +08:00
shy
096798dabf add some 2024-11-26 09:11:01 +08:00
shy
3f3d9dc654 add some 2024-11-25 19:39:26 +08:00
shy
1942402b2d add some 2024-11-25 10:06:32 +08:00
shy
79e7e6e7fd add some 2024-11-25 10:02:10 +08:00
shy
eb1934436e add some 2024-11-24 07:46:50 +08:00
shy
dd0c095c17 add some 2024-11-23 16:51:26 +08:00
shy
d7a8be98ae add some 2024-11-23 10:06:51 +08:00
shy
fe9ffe1fdc add some 2024-11-21 23:12:28 +08:00
shy
7f012927ca add some 2024-11-20 22:49:49 +08:00
shy
88f7e6f13c add some 2024-11-19 09:32:14 +08:00
root
a7ad71a768 add some 2024-11-18 09:11:46 +08:00
root
eac96e037e add some 2024-11-15 10:09:22 +08:00
root
cee52be44d add some 2024-11-12 13:11:39 +08:00
root
96214b439b add some 2024-11-10 13:07:36 +08:00
root
b87867d700 add some 2024-11-10 09:06:46 +08:00
root
852142316b add some 2024-11-09 11:35:27 +08:00
root
d457bf5a6c add some 2024-10-22 07:35:59 +08:00
root
74ebe817a4 add some 2024-10-20 22:55:38 +08:00
shy
220a4316c9 opt some 2024-10-20 18:44:54 +08:00
root
841c3d0948 add some 2024-10-20 08:16:58 +08:00
root
3275b534a3 add some 2024-10-17 23:46:08 +08:00
root
8b82794772 add some 2024-10-17 12:13:53 +08:00
root
3369e963b0 add some 2024-10-16 14:16:31 +08:00
root
fd4636e26f add some 2024-10-16 14:00:13 +08:00
root
2cf0c321a2 add some 2024-10-16 13:51:34 +08:00
root
60ce45c9df add some 2024-10-16 10:43:15 +08:00
root
f629639aa4 add some 2024-10-16 10:31:00 +08:00
root
3ae374e164 add some 2024-10-15 18:25:07 +08:00
root
5c395fbdbd add some 2024-10-12 11:10:20 +08:00
shy
e7f7c9d07d opt some 2024-10-09 15:03:24 +08:00
144 changed files with 4322 additions and 788 deletions

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020 shylinux
Copyright (c) 2017-2025 shylinux
Permission is hereby granted, free of charge, to any person obtaining a copy
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
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
SOFTWARE.
SOFTWARE.

View File

@ -1,12 +1,11 @@
binarys = bin/ice.bin
version = src/version.go
binpack = src/binpack.go
option = src/option.go
flags = -ldflags "-w -s" -v
all: def
@date +"%Y-%m-%d %H:%M:%S"
go build ${flags} -o ${binarys} src/main.go ${option} ${version} ${binpack} && ./${binarys} forever restart &>/dev/null
go build ${flags} -o ${binarys} src/main.go src/option.go ${version} ${binpack} && ./${binarys} forever restart &>/dev/null
def:
@[ -f ${version} ] || echo "package main">${version}

View File

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

44
go.mod
View File

@ -1,14 +1,17 @@
module shylinux.com/x/community
go 1.20
go 1.21
require (
shylinux.com/x/enterprise v0.0.6
shylinux.com/x/golang-story v0.0.25
shylinux.com/x/ice v1.5.46
shylinux.com/x/icebergs v1.9.46
shylinux.com/x/mysql-story v0.6.21
shylinux.com/x/toolkits v1.0.15
shylinux.com/x/enterprise v0.0.14
shylinux.com/x/golang-story v0.0.32
shylinux.com/x/mysql-story v0.6.32
)
require (
shylinux.com/x/ice v1.5.74
shylinux.com/x/icebergs v1.9.76
shylinux.com/x/toolkits v1.0.19
)
require (
@ -18,14 +21,35 @@ require (
)
require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1095
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ocr v1.0.1046
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/smh v1.0.1051
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1047
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke v1.0.1095
github.com/wechatpay-apiv3/wechatpay-go v0.2.20
)
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/go-sql-driver/mysql v1.7.0 // 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
golang.org/x/text v0.16.0 // indirect
github.com/mattn/go-isatty v0.0.17 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // 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.11 // 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
)

229
go.sum
View File

@ -1,13 +1,16 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE=
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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
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/dhowden/plist v0.0.0-20141002110153-5db6e0d9931a/go.mod h1:sLjdR6uwx3L6/Py8F+QgAfeiuY87xuYGwCDqRFrvCzw=
github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8/go.mod h1:apkPC/CR3s48O2D7Y++n1XWEpgPNNCjXYga3PPbJe2E=
github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
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-message v0.15.0 h1:urgKGqt2JAc9NFJcgncQcohHdiYb803YTH9OQwHBHIY=
@ -16,200 +19,196 @@ 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-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/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s=
github.com/glerchundi/subcommands v0.0.0-20181212083838-923a6ccb11f8/go.mod h1:r0g3O7Y5lrWXgDfcFBRgnAKzjmPgTzwoMC2ieB345FY=
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
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/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo=
github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k=
github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw=
github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ=
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/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo=
github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw=
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/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/hajimehoshi/go-jisx0208 v1.0.0/go.mod h1:yYxEStHL7lt9uL+AbdWgW9gBumwieDoZCiB1f/0X0as=
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
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/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
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/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys=
github.com/peterbourgon/ff/v3 v3.1.2/go.mod h1:XNJLY8EIl6MjMVjBS4F0+G0LYoAqs0DTa4rmHHukKDE=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
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/saltosystems/winrt-go v0.0.0-20240509164145-4f7860a3bd2b/go.mod h1:CIltaIm7qaANUIvzr0Vmz71lmQMAIbGJ7cvgzX7FMfA=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
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/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
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.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.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.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/tdakkota/win32metadata v0.1.0/go.mod h1:77e6YvX0LIVW+O81fhWLnXAxxcyu/wdZdG7iwed7Fyk=
github.com/tinygo-org/cbgo v0.0.4/go.mod h1:7+HgWIHd4nbAz0ESjGlJ1/v9LDU1Ox8MGzP9mah/fLk=
github.com/tinygo-org/pio v0.0.0-20231216154340-cd888eb58899/go.mod h1:LU7Dw00NJ+N86QkeTGjMLNkYcEYMor6wTDpTCu0EaH8=
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/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1046/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1047/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1051/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1095 h1:chwhz7qiknR6hz/gVpQszRSL2Bw/jXNz9dHmY0tWelE=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1095/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ocr v1.0.1046 h1:P8TrTPEWu4GjnEMyNgdYmV5jXigGtDMn+sVTLJJvW0c=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ocr v1.0.1046/go.mod h1:ifVagKrjnvy/ibrvLZjsELEh5WdRtchM8xyUlF88BNg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/smh v1.0.1051 h1:P7q/ROrOi/M/VzM4ADMeALj94zJaW/zIGvJ6xe5BBkw=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/smh v1.0.1051/go.mod h1:dVFt5mYSzAtQ2uLOBavl9G4KHrjJJOCLqtrzvW+h0tg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1047 h1:FF8uERgTL9NKxgUHrKHbVefETVL3J6DeL9t6qvIT5yI=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1047/go.mod h1:3tgFFSlybx6XyhvLWpnSjWYFMedTyQC9oyh8CH1Ak28=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke v1.0.1095 h1:l7SQnVkft1vPdfE/gv/ee2wBj54+hacPzchjs4gnGgw=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke v1.0.1095/go.mod h1:7V6/Y6tPk0jL21YAevsuDSBSN3nU5XFRBR6CFsTLhJE=
github.com/wechatpay-apiv3/wechatpay-go v0.2.20 h1:gS8oFn1bHGnyapR2Zb4aqTV6l4kJWgbtqjCq6k1L9DQ=
github.com/wechatpay-apiv3/wechatpay-go v0.2.20/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
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-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.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.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.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
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.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
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.11.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.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-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-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.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.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.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
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.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-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.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.6.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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-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-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-20220624220833-87e55d714810/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-20220704084225-05e143d24a9e/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.7.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.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.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/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-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.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
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.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
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.3/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.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.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.14.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.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-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.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.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
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-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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
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/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.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg=
gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
shylinux.com/x/enterprise v0.0.6 h1:C36u6ZC+R+GGfulS3nd2akkuub0stfjECc/ovgf2HuY=
shylinux.com/x/enterprise v0.0.6/go.mod h1:YzUviyeUIFPd2BIvNkUGpmx6qRFbCvGSA6muxKQzbOM=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20=
modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0=
modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI=
modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g=
modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY=
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
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/enterprise v0.0.14 h1:gxxAtMt4sLy8+HN10jJipZ6xa0it/rllZZGKwWILJ2Q=
shylinux.com/x/enterprise v0.0.14/go.mod h1:RR4LfgQMgy8ckZuga6pEvEl9TxF3gbfHN+Mh3Jhk1GI=
shylinux.com/x/go-git/v5 v5.6.7 h1:WD5QSco7m3QooPCgdvQ6/GyGIFPun8C+hex5N41LYlk=
shylinux.com/x/go-git/v5 v5.6.7/go.mod h1:Qb0lA+uIrofZg8NQerhYcJHgGWixFqvS6p3aJ/L5Nlk=
shylinux.com/x/go-qrcode v0.0.3 h1:RMo+Vidbgq3HatLBj7DDXcTbTLFUwzis5K7TqBkD38U=
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/golang-story v0.0.25 h1:3d+wiWqKddS3OwLrKfCt+PNdOx2GlT8RUSKOO/ngIjg=
shylinux.com/x/golang-story v0.0.25/go.mod h1:X1ed1h9FojVVCB48z32GiCWObDkF5DCWlDB6cibvEnQ=
shylinux.com/x/ice v1.5.45/go.mod h1:zQ6azXiRPHq1QE/buftQ1dRwfzgkPzZptXW083VfE40=
shylinux.com/x/ice v1.5.46 h1:T3ikgBk882+fzFDcZDI0sUKwtK8DZ2TWdVDZCjVTUE4=
shylinux.com/x/ice v1.5.46/go.mod h1:l9ejEyDlVTeE6Dnj0sND9a7JixBkn9TdbZTkAdVUyTQ=
shylinux.com/x/icebergs v1.9.45/go.mod h1:wM3PkomBSeASTekVjxuOP8Y28HYq84MxUZ3d5BZEN74=
shylinux.com/x/icebergs v1.9.46 h1:630KuhtKTwit5eMwhJm/2iVXW+w1GcchyI2U/QeUtFk=
shylinux.com/x/icebergs v1.9.46/go.mod h1:wM3PkomBSeASTekVjxuOP8Y28HYq84MxUZ3d5BZEN74=
shylinux.com/x/mysql-story v0.6.21 h1:h6AuGTr7VL79h/t2JzT5SExz1nfvG3uJCx/qMkbHFUs=
shylinux.com/x/mysql-story v0.6.21/go.mod h1:HSWqYyKfvv2mctpEOfAf9zs81O+Z/swV000TN/GSgSY=
shylinux.com/x/golang-story v0.0.32 h1:7xu28iREL2cuZzf80luJwI9BWptow+ME00L1lgyjmDI=
shylinux.com/x/golang-story v0.0.32/go.mod h1:NsI5fULu3q7o2b+VzZ5tiJ3+0pUTjE9DdQxa870htmw=
shylinux.com/x/ice v1.5.73/go.mod h1:uGI73gYkk+FiJt5qmy/aYhoKRJ4wobcJk3WrPGh8Waw=
shylinux.com/x/ice v1.5.74 h1:5hTPmchO79b1d2+/DwBDLiG2WkTL65G/hOEAcGJVeB8=
shylinux.com/x/ice v1.5.74/go.mod h1:/XAib8Ha+z6jzLRs2Pig+qxDx4C8dT8Vfaq2InJ/lkU=
shylinux.com/x/icebergs v1.9.75/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
shylinux.com/x/icebergs v1.9.76 h1:SHOTbiO+jh09GEFzoo8t8kmR1BCu+zkNCpdfxPCLeu0=
shylinux.com/x/icebergs v1.9.76/go.mod h1:3Bdp3tjzw+hUKJF+kR8pfsrbjAf72DVZmCaE8/MPFtk=
shylinux.com/x/mysql-story v0.6.32 h1:Q274WFJ09ocnf8nhlQnKr02FMMdPYBLWqu2IjTVqGiM=
shylinux.com/x/mysql-story v0.6.32/go.mod h1:8HCeDUV6ghaIeJD1IEhSeSOfVC9wEI93y2G9QBLtJJY=
shylinux.com/x/toolkits v0.7.10/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/toolkits v1.0.19 h1:Nrx0xYRc5ph1WS66EZ1hJUCe+2FdSWQ4QP6tBlguikQ=
shylinux.com/x/toolkits v1.0.19/go.mod h1:CHDJarGlDkg60kVsvMLYL/a5hAnRLEOShiEsMOuEp0Q=
shylinux.com/x/websocket v0.0.4 h1:AJpwblePoOpiE6C8NrvgNYpKTotXMLrDDX2chTvx44Q=
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=

View File

@ -3,43 +3,73 @@ package api
const GONGANXITONG_PORTAL = "web.team.gonganxitong.portal"
const GONGANXITONG_ALLOW = "web.team.gonganxitong.allow"
const GONGANXITONG_APPLY = "web.team.gonganxitong.apply"
const GONGANXITONG_CITY = "web.team.gonganxitong.city"
const GONGANXITONG_CONTRACT = "web.team.gonganxitong.contract"
const GONGANXITONG_CREDIT = "web.team.gonganxitong.credit"
const GONGANXITONG_DOCUMENT = "web.team.gonganxitong.document"
const GONGANXITONG_DOMAIN = "web.team.gonganxitong.domain"
const GONGANXITONG_EMAIL = "web.team.gonganxitong.email"
const GONGANXITONG_EVENT = "web.team.gonganxitong.event"
const GONGANXITONG_MARKET = "web.team.gonganxitong.market"
const GONGANXITONG_MEETING = "web.team.gonganxitong.meeting"
const GONGANXITONG_MEMBER = "web.team.gonganxitong.member"
const GONGANXITONG_MESSAGE = "web.team.gonganxitong.message"
const GONGANXITONG_NOTICE = "web.team.gonganxitong.notice"
const GONGANXITONG_PAYMENTLIST = "web.team.gonganxitong.paymentlist"
const GONGANXITONG_PHOTO = "web.team.gonganxitong.photo"
const GONGANXITONG_QRCODE = "web.team.gonganxitong.qrcode"
const GONGANXITONG_RECENT = "web.team.gonganxitong.recent"
const GONGANXITONG_SERVICE = "web.team.gonganxitong.service"
const GONGANXITONG_SETTING = "web.team.gonganxitong.setting"
const GONGANXITONG_STREET = "web.team.gonganxitong.street"
const GONGANXITONG_SUPPORT = "web.team.gonganxitong.support"
const GONGANXITONG_USER = "web.team.gonganxitong.user"
const HUODONGZUZHI_ACTIVITY = "web.team.huodongzuzhi.activity"
const HUODONGZUZHI_PORTAL = "web.team.huodongzuzhi.portal"
const HUODONGZUZHI_ALLOW = "web.team.huodongzuzhi.allow"
const HUODONGZUZHI_APPLY = "web.team.huodongzuzhi.apply"
const HUODONGZUZHI_CONTRACT = "web.team.huodongzuzhi.contract"
const HUODONGZUZHI_CREDIT = "web.team.huodongzuzhi.credit"
const HUODONGZUZHI_DOCUMENT = "web.team.huodongzuzhi.document"
const HUODONGZUZHI_EVENT = "web.team.huodongzuzhi.event"
const HUODONGZUZHI_MARKET = "web.team.huodongzuzhi.market"
const HUODONGZUZHI_MEETING = "web.team.huodongzuzhi.meeting"
const HUODONGZUZHI_MEMBER = "web.team.huodongzuzhi.member"
const HUODONGZUZHI_MESSAGE = "web.team.huodongzuzhi.message"
const HUODONGZUZHI_NOTICE = "web.team.huodongzuzhi.notice"
const HUODONGZUZHI_PAYMENTLIST = "web.team.huodongzuzhi.paymentlist"
const HUODONGZUZHI_PHOTO = "web.team.huodongzuzhi.photo"
const HUODONGZUZHI_QRCODE = "web.team.huodongzuzhi.qrcode"
const HUODONGZUZHI_RECENT = "web.team.huodongzuzhi.recent"
const HUODONGZUZHI_SERVICE = "web.team.huodongzuzhi.service"
const HUODONGZUZHI_SETTING = "web.team.huodongzuzhi.setting"
const HUODONGZUZHI_SUPPORT = "web.team.huodongzuzhi.support"
const RENZHENGSHOUQUAN_ADMIN = "web.team.renzhengshouquan.admin"
const RENZHENGSHOUQUAN_PORTAL = "web.team.renzhengshouquan.portal"
const RENZHENGSHOUQUAN_ALLOW = "web.team.renzhengshouquan.allow"
const RENZHENGSHOUQUAN_APPLY = "web.team.renzhengshouquan.apply"
const RENZHENGSHOUQUAN_AUTH = "web.team.renzhengshouquan.auth"
const RENZHENGSHOUQUAN_CERT = "web.team.renzhengshouquan.cert"
const RENZHENGSHOUQUAN_CONTRACT = "web.team.renzhengshouquan.contract"
const RENZHENGSHOUQUAN_CREDIT = "web.team.renzhengshouquan.credit"
const RENZHENGSHOUQUAN_DOCUMENT = "web.team.renzhengshouquan.document"
const RENZHENGSHOUQUAN_DOMAIN = "web.team.renzhengshouquan.domain"
const RENZHENGSHOUQUAN_EVENT = "web.team.renzhengshouquan.event"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENT_MEETING = "web.team.renzhengshouquan.external.tencent.meeting"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENTCLOUD_REALNAME_REALNAM = "web.team.renzhengshouquan.external.tencentcloud.realname.realnam"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENTCLOUD_SMH_SMH = "web.team.renzhengshouquan.external.tencentcloud.smh.smh"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENTCLOUD_SMS_SMS = "web.team.renzhengshouquan.external.tencentcloud.sms.sms"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENTCLOUD_TENCENTCLOUD = "web.team.renzhengshouquan.external.tencentcloud.tencentcloud"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENTDOCUMENT_TENCENTDOCUME = "web.team.renzhengshouquan.external.tencentdocument.tencentdocume"
const RENZHENGSHOUQUAN_EXTERNAL_TENCENTMEETING_TENCENTMEETING = "web.team.renzhengshouquan.external.tencentmeeting.tencentmeeting"
const RENZHENGSHOUQUAN_EXTERNAL_WEIXINPAYMENT_WEIXINPAYMENT = "web.team.renzhengshouquan.external.weixinpayment.weixinpayment"
const RENZHENGSHOUQUAN_MARKET = "web.team.renzhengshouquan.market"
const RENZHENGSHOUQUAN_MEETING = "web.team.renzhengshouquan.meeting"
const RENZHENGSHOUQUAN_MEMBER = "web.team.renzhengshouquan.member"
const RENZHENGSHOUQUAN_MESSAGE = "web.team.renzhengshouquan.message"
const RENZHENGSHOUQUAN_NOTICE = "web.team.renzhengshouquan.notice"
const RENZHENGSHOUQUAN_PAYMENTLIST = "web.team.renzhengshouquan.paymentlist"
const RENZHENGSHOUQUAN_PHOTO = "web.team.renzhengshouquan.photo"
const RENZHENGSHOUQUAN_PROFILE = "web.team.renzhengshouquan.profile"
const RENZHENGSHOUQUAN_QRCODE = "web.team.renzhengshouquan.qrcode"
const RENZHENGSHOUQUAN_RECENT = "web.team.renzhengshouquan.recent"
@ -50,13 +80,19 @@ const YUEHAOXITONG_PORTAL = "web.team.yuehaoxitong.portal"
const YUEHAOXITONG_ALLOW = "web.team.yuehaoxitong.allow"
const YUEHAOXITONG_APPLY = "web.team.yuehaoxitong.apply"
const YUEHAOXITONG_CALL = "web.team.yuehaoxitong.call"
const YUEHAOXITONG_CONTRACT = "web.team.yuehaoxitong.contract"
const YUEHAOXITONG_CREDIT = "web.team.yuehaoxitong.credit"
const YUEHAOXITONG_DOCUMENT = "web.team.yuehaoxitong.document"
const YUEHAOXITONG_EVENT = "web.team.yuehaoxitong.event"
const YUEHAOXITONG_HISTORY = "web.team.yuehaoxitong.history"
const YUEHAOXITONG_MARKET = "web.team.yuehaoxitong.market"
const YUEHAOXITONG_MEETING = "web.team.yuehaoxitong.meeting"
const YUEHAOXITONG_MEMBER = "web.team.yuehaoxitong.member"
const YUEHAOXITONG_MESSAGE = "web.team.yuehaoxitong.message"
const YUEHAOXITONG_NOTICE = "web.team.yuehaoxitong.notice"
const YUEHAOXITONG_OPEN = "web.team.yuehaoxitong.open"
const YUEHAOXITONG_PAYMENTLIST = "web.team.yuehaoxitong.paymentlist"
const YUEHAOXITONG_PHOTO = "web.team.yuehaoxitong.photo"
const YUEHAOXITONG_PLAN = "web.team.yuehaoxitong.plan"
const YUEHAOXITONG_QRCODE = "web.team.yuehaoxitong.qrcode"
const YUEHAOXITONG_RECENT = "web.team.yuehaoxitong.recent"

View File

@ -3,13 +3,18 @@ package api
const JIAOCAIZILIAO_PORTAL = "web.team.jiaocaiziliao.portal"
const JIAOCAIZILIAO_ALLOW = "web.team.jiaocaiziliao.allow"
const JIAOCAIZILIAO_APPLY = "web.team.jiaocaiziliao.apply"
const JIAOCAIZILIAO_CONTRACT = "web.team.jiaocaiziliao.contract"
const JIAOCAIZILIAO_CREDIT = "web.team.jiaocaiziliao.credit"
const JIAOCAIZILIAO_DOCUMENT = "web.team.jiaocaiziliao.document"
const JIAOCAIZILIAO_EVENT = "web.team.jiaocaiziliao.event"
const JIAOCAIZILIAO_MARKET = "web.team.jiaocaiziliao.market"
const JIAOCAIZILIAO_MEETING = "web.team.jiaocaiziliao.meeting"
const JIAOCAIZILIAO_MEMBER = "web.team.jiaocaiziliao.member"
const JIAOCAIZILIAO_MESSAGE = "web.team.jiaocaiziliao.message"
const JIAOCAIZILIAO_NOTICE = "web.team.jiaocaiziliao.notice"
const JIAOCAIZILIAO_OFFICIAL = "web.team.jiaocaiziliao.official"
const JIAOCAIZILIAO_PAYMENTLIST = "web.team.jiaocaiziliao.paymentlist"
const JIAOCAIZILIAO_PHOTO = "web.team.jiaocaiziliao.photo"
const JIAOCAIZILIAO_QRCODE = "web.team.jiaocaiziliao.qrcode"
const JIAOCAIZILIAO_RECENT = "web.team.jiaocaiziliao.recent"
const JIAOCAIZILIAO_SERVICE = "web.team.jiaocaiziliao.service"
@ -18,12 +23,18 @@ const JIAOCAIZILIAO_SUPPORT = "web.team.jiaocaiziliao.support"
const JIAOWUXITONG_PORTAL = "web.team.jiaowuxitong.portal"
const JIAOWUXITONG_ALLOW = "web.team.jiaowuxitong.allow"
const JIAOWUXITONG_APPLY = "web.team.jiaowuxitong.apply"
const JIAOWUXITONG_CONTRACT = "web.team.jiaowuxitong.contract"
const JIAOWUXITONG_CREDIT = "web.team.jiaowuxitong.credit"
const JIAOWUXITONG_DOCUMENT = "web.team.jiaowuxitong.document"
const JIAOWUXITONG_EVENT = "web.team.jiaowuxitong.event"
const JIAOWUXITONG_HOMEWORK = "web.team.jiaowuxitong.homework"
const JIAOWUXITONG_MARKET = "web.team.jiaowuxitong.market"
const JIAOWUXITONG_MEETING = "web.team.jiaowuxitong.meeting"
const JIAOWUXITONG_MEMBER = "web.team.jiaowuxitong.member"
const JIAOWUXITONG_MESSAGE = "web.team.jiaowuxitong.message"
const JIAOWUXITONG_NOTICE = "web.team.jiaowuxitong.notice"
const JIAOWUXITONG_PAYMENTLIST = "web.team.jiaowuxitong.paymentlist"
const JIAOWUXITONG_PHOTO = "web.team.jiaowuxitong.photo"
const JIAOWUXITONG_QRCODE = "web.team.jiaowuxitong.qrcode"
const JIAOWUXITONG_RECENT = "web.team.jiaowuxitong.recent"
const JIAOWUXITONG_SERVICE = "web.team.jiaowuxitong.service"
@ -32,11 +43,17 @@ const JIAOWUXITONG_SUPPORT = "web.team.jiaowuxitong.support"
const KAOSHIXITONG_PORTAL = "web.team.kaoshixitong.portal"
const KAOSHIXITONG_ALLOW = "web.team.kaoshixitong.allow"
const KAOSHIXITONG_APPLY = "web.team.kaoshixitong.apply"
const KAOSHIXITONG_CONTRACT = "web.team.kaoshixitong.contract"
const KAOSHIXITONG_CREDIT = "web.team.kaoshixitong.credit"
const KAOSHIXITONG_DOCUMENT = "web.team.kaoshixitong.document"
const KAOSHIXITONG_EVENT = "web.team.kaoshixitong.event"
const KAOSHIXITONG_MARKET = "web.team.kaoshixitong.market"
const KAOSHIXITONG_MEETING = "web.team.kaoshixitong.meeting"
const KAOSHIXITONG_MEMBER = "web.team.kaoshixitong.member"
const KAOSHIXITONG_MESSAGE = "web.team.kaoshixitong.message"
const KAOSHIXITONG_NOTICE = "web.team.kaoshixitong.notice"
const KAOSHIXITONG_PAYMENTLIST = "web.team.kaoshixitong.paymentlist"
const KAOSHIXITONG_PHOTO = "web.team.kaoshixitong.photo"
const KAOSHIXITONG_QRCODE = "web.team.kaoshixitong.qrcode"
const KAOSHIXITONG_QUESTION = "web.team.kaoshixitong.question"
const KAOSHIXITONG_RECENT = "web.team.kaoshixitong.recent"
@ -46,12 +63,18 @@ const KAOSHIXITONG_SUPPORT = "web.team.kaoshixitong.support"
const ZAIXIANKETANG_PORTAL = "web.team.zaixianketang.portal"
const ZAIXIANKETANG_ALLOW = "web.team.zaixianketang.allow"
const ZAIXIANKETANG_APPLY = "web.team.zaixianketang.apply"
const ZAIXIANKETANG_CONTRACT = "web.team.zaixianketang.contract"
const ZAIXIANKETANG_CREDIT = "web.team.zaixianketang.credit"
const ZAIXIANKETANG_DOCUMENT = "web.team.zaixianketang.document"
const ZAIXIANKETANG_EVENT = "web.team.zaixianketang.event"
const ZAIXIANKETANG_LESSON = "web.team.zaixianketang.lesson"
const ZAIXIANKETANG_MARKET = "web.team.zaixianketang.market"
const ZAIXIANKETANG_MEETING = "web.team.zaixianketang.meeting"
const ZAIXIANKETANG_MEMBER = "web.team.zaixianketang.member"
const ZAIXIANKETANG_MESSAGE = "web.team.zaixianketang.message"
const ZAIXIANKETANG_NOTICE = "web.team.zaixianketang.notice"
const ZAIXIANKETANG_PAYMENTLIST = "web.team.zaixianketang.paymentlist"
const ZAIXIANKETANG_PHOTO = "web.team.zaixianketang.photo"
const ZAIXIANKETANG_QRCODE = "web.team.zaixianketang.qrcode"
const ZAIXIANKETANG_RECENT = "web.team.zaixianketang.recent"
const ZAIXIANKETANG_SERVICE = "web.team.zaixianketang.service"

View File

@ -4,6 +4,9 @@ const GONGYINGLIAN_PORTAL = "web.team.gongyinglian.portal"
const GONGYINGLIAN_ALLOW = "web.team.gongyinglian.allow"
const GONGYINGLIAN_APPLY = "web.team.gongyinglian.apply"
const GONGYINGLIAN_BRAND = "web.team.gongyinglian.brand"
const GONGYINGLIAN_CONTRACT = "web.team.gongyinglian.contract"
const GONGYINGLIAN_CREDIT = "web.team.gongyinglian.credit"
const GONGYINGLIAN_DOCUMENT = "web.team.gongyinglian.document"
const GONGYINGLIAN_EVENT = "web.team.gongyinglian.event"
const GONGYINGLIAN_EXPENSE = "web.team.gongyinglian.expense"
const GONGYINGLIAN_EXPRESS = "web.team.gongyinglian.express"
@ -11,11 +14,14 @@ const GONGYINGLIAN_GOODS = "web.team.gongyinglian.goods"
const GONGYINGLIAN_LOAN = "web.team.gongyinglian.loan"
const GONGYINGLIAN_MARKET = "web.team.gongyinglian.market"
const GONGYINGLIAN_MATERIAL = "web.team.gongyinglian.material"
const GONGYINGLIAN_MEETING = "web.team.gongyinglian.meeting"
const GONGYINGLIAN_MEMBER = "web.team.gongyinglian.member"
const GONGYINGLIAN_MESSAGE = "web.team.gongyinglian.message"
const GONGYINGLIAN_NOTICE = "web.team.gongyinglian.notice"
const GONGYINGLIAN_ORDER = "web.team.gongyinglian.order"
const GONGYINGLIAN_PAYMENT = "web.team.gongyinglian.payment"
const GONGYINGLIAN_PAYMENTLIST = "web.team.gongyinglian.paymentlist"
const GONGYINGLIAN_PHOTO = "web.team.gongyinglian.photo"
const GONGYINGLIAN_PRODUCE = "web.team.gongyinglian.produce"
const GONGYINGLIAN_PRODUCT = "web.team.gongyinglian.product"
const GONGYINGLIAN_PURCHASE = "web.team.gongyinglian.purchase"
@ -33,13 +39,27 @@ const GONGYINGLIAN_WAREHOUSE = "web.team.gongyinglian.warehouse"
const GUANLIXITONG_PORTAL = "web.team.guanlixitong.portal"
const GUANLIXITONG_ALLOW = "web.team.guanlixitong.allow"
const GUANLIXITONG_APPLY = "web.team.guanlixitong.apply"
const GUANLIXITONG_CONFERENCE = "web.team.guanlixitong.conference"
const GUANLIXITONG_CONTRACT = "web.team.guanlixitong.contract"
const GUANLIXITONG_CREDIT = "web.team.guanlixitong.credit"
const GUANLIXITONG_DOCUMENT = "web.team.guanlixitong.document"
const GUANLIXITONG_EMPLOYEE = "web.team.guanlixitong.employee"
const GUANLIXITONG_EQUIPMENT = "web.team.guanlixitong.equipment"
const GUANLIXITONG_EVENT = "web.team.guanlixitong.event"
const GUANLIXITONG_INTERVIEW = "web.team.guanlixitong.interview"
const GUANLIXITONG_INVENTORY = "web.team.guanlixitong.inventory"
const GUANLIXITONG_MARKET = "web.team.guanlixitong.market"
const GUANLIXITONG_MEETING = "web.team.guanlixitong.meeting"
const GUANLIXITONG_MEMBER = "web.team.guanlixitong.member"
const GUANLIXITONG_MESSAGE = "web.team.guanlixitong.message"
const GUANLIXITONG_NOTICE = "web.team.guanlixitong.notice"
const GUANLIXITONG_PAYMENTLIST = "web.team.guanlixitong.paymentlist"
const GUANLIXITONG_PHOTO = "web.team.guanlixitong.photo"
const GUANLIXITONG_PROCUREMENT = "web.team.guanlixitong.procurement"
const GUANLIXITONG_QRCODE = "web.team.guanlixitong.qrcode"
const GUANLIXITONG_RECENT = "web.team.guanlixitong.recent"
const GUANLIXITONG_RECRUITMENT = "web.team.guanlixitong.recruitment"
const GUANLIXITONG_RESUME = "web.team.guanlixitong.resume"
const GUANLIXITONG_SERVICE = "web.team.guanlixitong.service"
const GUANLIXITONG_SETTING = "web.team.guanlixitong.setting"
const GUANLIXITONG_SUPPORT = "web.team.guanlixitong.support"
@ -47,11 +67,17 @@ const GUANLIXITONG_TARGET = "web.team.guanlixitong.target"
const SHICHANGYINGXIAO_PORTAL = "web.team.shichangyingxiao.portal"
const SHICHANGYINGXIAO_ALLOW = "web.team.shichangyingxiao.allow"
const SHICHANGYINGXIAO_APPLY = "web.team.shichangyingxiao.apply"
const SHICHANGYINGXIAO_CONTRACT = "web.team.shichangyingxiao.contract"
const SHICHANGYINGXIAO_CREDIT = "web.team.shichangyingxiao.credit"
const SHICHANGYINGXIAO_DOCUMENT = "web.team.shichangyingxiao.document"
const SHICHANGYINGXIAO_EVENT = "web.team.shichangyingxiao.event"
const SHICHANGYINGXIAO_MARKET = "web.team.shichangyingxiao.market"
const SHICHANGYINGXIAO_MEETING = "web.team.shichangyingxiao.meeting"
const SHICHANGYINGXIAO_MEMBER = "web.team.shichangyingxiao.member"
const SHICHANGYINGXIAO_MESSAGE = "web.team.shichangyingxiao.message"
const SHICHANGYINGXIAO_NOTICE = "web.team.shichangyingxiao.notice"
const SHICHANGYINGXIAO_PAYMENTLIST = "web.team.shichangyingxiao.paymentlist"
const SHICHANGYINGXIAO_PHOTO = "web.team.shichangyingxiao.photo"
const SHICHANGYINGXIAO_PROMOTION = "web.team.shichangyingxiao.promotion"
const SHICHANGYINGXIAO_QRCODE = "web.team.shichangyingxiao.qrcode"
const SHICHANGYINGXIAO_RECENT = "web.team.shichangyingxiao.recent"
@ -61,12 +87,18 @@ const SHICHANGYINGXIAO_SUPPORT = "web.team.shichangyingxiao.support"
const ZIJINLIAN_PORTAL = "web.team.zijinlian.portal"
const ZIJINLIAN_ALLOW = "web.team.zijinlian.allow"
const ZIJINLIAN_APPLY = "web.team.zijinlian.apply"
const ZIJINLIAN_CONTRACT = "web.team.zijinlian.contract"
const ZIJINLIAN_CREDIT = "web.team.zijinlian.credit"
const ZIJINLIAN_DOCUMENT = "web.team.zijinlian.document"
const ZIJINLIAN_EVENT = "web.team.zijinlian.event"
const ZIJINLIAN_INVESTMENT = "web.team.zijinlian.investment"
const ZIJINLIAN_MARKET = "web.team.zijinlian.market"
const ZIJINLIAN_MEETING = "web.team.zijinlian.meeting"
const ZIJINLIAN_MEMBER = "web.team.zijinlian.member"
const ZIJINLIAN_MESSAGE = "web.team.zijinlian.message"
const ZIJINLIAN_NOTICE = "web.team.zijinlian.notice"
const ZIJINLIAN_PAYMENTLIST = "web.team.zijinlian.paymentlist"
const ZIJINLIAN_PHOTO = "web.team.zijinlian.photo"
const ZIJINLIAN_QRCODE = "web.team.zijinlian.qrcode"
const ZIJINLIAN_RECENT = "web.team.zijinlian.recent"
const ZIJINLIAN_SERVICE = "web.team.zijinlian.service"

View File

@ -3,12 +3,17 @@ package api
const DASHBOARD_PORTAL = "web.team.dashboard.portal"
const DASHBOARD_ALLOW = "web.team.dashboard.allow"
const DASHBOARD_APPLY = "web.team.dashboard.apply"
const DASHBOARD_CONTRACT = "web.team.dashboard.contract"
const DASHBOARD_CREDIT = "web.team.dashboard.credit"
const DASHBOARD_DASHBOARD = "web.team.dashboard.dashboard"
const DASHBOARD_EVENT = "web.team.dashboard.event"
const DASHBOARD_MARKET = "web.team.dashboard.market"
const DASHBOARD_MEETING = "web.team.dashboard.meeting"
const DASHBOARD_MEMBER = "web.team.dashboard.member"
const DASHBOARD_MESSAGE = "web.team.dashboard.message"
const DASHBOARD_NOTICE = "web.team.dashboard.notice"
const DASHBOARD_PAYMENTLIST = "web.team.dashboard.paymentlist"
const DASHBOARD_PHOTO = "web.team.dashboard.photo"
const DASHBOARD_QRCODE = "web.team.dashboard.qrcode"
const DASHBOARD_RECENT = "web.team.dashboard.recent"
const DASHBOARD_SERVICE = "web.team.dashboard.service"
@ -17,60 +22,3 @@ const DASHBOARD_SUMMARY = "web.team.dashboard.summary"
const DASHBOARD_SUPPORT = "web.team.dashboard.support"
const DEVELOPMENT_PORTAL = "web.team.development.portal"
const DEVELOPMENT_ALLOW = "web.team.development.allow"
const DEVELOPMENT_APPLY = "web.team.development.apply"
const DEVELOPMENT_EVENT = "web.team.development.event"
const DEVELOPMENT_MARKET = "web.team.development.market"
const DEVELOPMENT_MEMBER = "web.team.development.member"
const DEVELOPMENT_MESSAGE = "web.team.development.message"
const DEVELOPMENT_NOTICE = "web.team.development.notice"
const DEVELOPMENT_QRCODE = "web.team.development.qrcode"
const DEVELOPMENT_RECENT = "web.team.development.recent"
const DEVELOPMENT_SERVICE = "web.team.development.service"
const DEVELOPMENT_SETTING = "web.team.development.setting"
const DEVELOPMENT_SUPPORT = "web.team.development.support"
const DEVELOPMENT_VERSION = "web.team.development.version"
const OPERATION_PORTAL = "web.team.operation.portal"
const OPERATION_ALLOW = "web.team.operation.allow"
const OPERATION_APPLY = "web.team.operation.apply"
const OPERATION_EVENT = "web.team.operation.event"
const OPERATION_MARKET = "web.team.operation.market"
const OPERATION_MEMBER = "web.team.operation.member"
const OPERATION_MESSAGE = "web.team.operation.message"
const OPERATION_NOTICE = "web.team.operation.notice"
const OPERATION_QRCODE = "web.team.operation.qrcode"
const OPERATION_RECENT = "web.team.operation.recent"
const OPERATION_RELEASE = "web.team.operation.release"
const OPERATION_SERVICE = "web.team.operation.service"
const OPERATION_SETTING = "web.team.operation.setting"
const OPERATION_SUPPORT = "web.team.operation.support"
const PRODUCTION_PORTAL = "web.team.production.portal"
const PRODUCTION_ALLOW = "web.team.production.allow"
const PRODUCTION_APPLY = "web.team.production.apply"
const PRODUCTION_CASE = "web.team.production.case"
const PRODUCTION_EVENT = "web.team.production.event"
const PRODUCTION_ISSUE = "web.team.production.issue"
const PRODUCTION_MARKET = "web.team.production.market"
const PRODUCTION_MEMBER = "web.team.production.member"
const PRODUCTION_MESSAGE = "web.team.production.message"
const PRODUCTION_NOTICE = "web.team.production.notice"
const PRODUCTION_PLAN = "web.team.production.plan"
const PRODUCTION_QRCODE = "web.team.production.qrcode"
const PRODUCTION_RECENT = "web.team.production.recent"
const PRODUCTION_SERVICE = "web.team.production.service"
const PRODUCTION_SETTING = "web.team.production.setting"
const PRODUCTION_SUPPORT = "web.team.production.support"
const PRODUCTION_TASK = "web.team.production.task"
const STORAGE_PORTAL = "web.team.storage.portal"
const STORAGE_ALLOW = "web.team.storage.allow"
const STORAGE_APPLY = "web.team.storage.apply"
const STORAGE_EVENT = "web.team.storage.event"
const STORAGE_FILE = "web.team.storage.file"
const STORAGE_MARKET = "web.team.storage.market"
const STORAGE_MEMBER = "web.team.storage.member"
const STORAGE_MESSAGE = "web.team.storage.message"
const STORAGE_NOTICE = "web.team.storage.notice"
const STORAGE_QRCODE = "web.team.storage.qrcode"
const STORAGE_RECENT = "web.team.storage.recent"
const STORAGE_SERVICE = "web.team.storage.service"
const STORAGE_SETTING = "web.team.storage.setting"
const STORAGE_SUPPORT = "web.team.storage.support"

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

@ -0,0 +1,7 @@
spark project "云时代的新型操作系统,既要完全自给自足,又要任意互联互通" `
<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/20240724-community"
"源 码" "https://git.shylinux.com/web/community"
"社 区" "https://bbs.shylinux.com"
`

View File

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

View File

@ -9,24 +9,19 @@ import (
type allow struct {
Table
apply apply
order string `data:"503"`
role string `data:"leader"`
create string `name:"create apply_uid* place_uid* user_uid* status*"`
reject string `name:"reject" role:"void"`
approve string `name:"approve" role:"void"`
applyQRCode string `name:"applyQRCode" role:"void"`
apply apply
order string `data:"503"`
role string `data:"leader"`
create string `name:"create apply_uid* place_uid* user_uid* status*"`
reject string `name:"reject" role:"void"`
approve string `name:"approve" role:"void"`
}
func (s allow) Create(m *ice.Message, arg ...string) {
s.Insert(m.Spawn(), arg...)
s.GetCommandUID(m)
s.SendMessage(m, m.Option(model.FROM_USER_UID), "")
s.SendMessage(s.GetCommandUID(m), m.Option(model.FROM_USER_UID), "")
s.SendTemplate(m, "", "", m.Trans("please allow", "权限审批 请处理"))
}
func (s allow) ApplyQRCode(m *ice.Message, arg ...string) {
m.Cmdy(s.Prefix(m, qrcode{}), m.ActionKey(), arg)
}
func (s allow) List(m *ice.Message, arg ...string) {
s.Tables(m, s.apply).FieldsWithCreatedAT(m, s.apply,
s.Key(s.apply, model.USER_UID),
@ -34,13 +29,15 @@ func (s allow) List(m *ice.Message, arg ...string) {
s.AS(s.Key(s, model.UID), model.ALLOW_UID), model.ALLOW_STATUS,
)
if len(arg) == 1 {
s.Select(m, s.Key(s, model.PLACE_UID), arg[0], s.Key(s, model.USER_UID), m.Option(model.USER_UID)).Action(s.ApplyQRCode)
// s.Select(m, s.Key(s, model.PLACE_UID), arg[0], s.Key(s, model.USER_UID), m.Option(model.USER_UID)).Action()
s.Select(m, s.Key(s, model.PLACE_UID), arg[0]).Action()
if m.Length() == 0 {
m.Cmdy(s.Prefix(m, qrcode{}), s.ApplyQRCode, arg)
m.Cmdy(s.Prefix(m, qrcode{}), qrcode{}.ApplyQRCode, arg[0]).SetAppend().Action()
return
}
} else if len(arg) == 2 {
s.SelectDetail(m, s.Key(s, model.PLACE_UID), arg[0], s.Key(s, model.USER_UID), m.Option(model.USER_UID), s.Key(s.apply, model.UID), arg[1])
// s.SelectDetail(m, s.Key(s, model.PLACE_UID), arg[0], s.Key(s, model.USER_UID), m.Option(model.USER_UID), s.Key(s.apply, model.UID), arg[1])
s.SelectDetail(m, s.Key(s, model.PLACE_UID), arg[0], s.Key(s.apply, model.UID), arg[1])
m.Table(func(value ice.Maps) {
if AllowStatus(kit.Int(value[model.ALLOW_STATUS])) != AllowCreate {
s.DoneMessage(m)
@ -57,7 +54,7 @@ func (s allow) List(m *ice.Message, arg ...string) {
}
})
s.SelectJoinUser(m)
s.DisplayBase(m, "")
s.DisplayBase(m, "").DisplayCSS("")
}
func (s allow) Reject(m *ice.Message, arg ...string) {
s.process(m, AllowCreate, AllowRejected, "❌", m.Trans("allow rejected", "权限审批 已驳回"))
@ -77,10 +74,15 @@ func (s allow) process(m *ice.Message, from, to AllowStatus, icon string, title
s.DoneMessage(m)
}
func (s allow) changeStatus(m *ice.Message, from, to AllowStatus, arg ...string) *ice.Message {
msg := s.Select(m.Spawn(), model.UID, m.Option(model.ALLOW_UID), model.USER_UID, m.Option(model.USER_UID))
// msg := s.Select(m.Spawn(), model.UID, m.Option(model.ALLOW_UID), model.USER_UID, m.Option(model.USER_UID))
args := []string{model.UID, m.Option(model.ALLOW_UID), model.USER_UID, m.Option(model.USER_UID)}
if s.IsLeader(m) {
args = []string{model.UID, m.Option(model.ALLOW_UID)}
}
msg := s.Select(m.Spawn(), args...)
if !m.WarnNotFound(msg.Length() == 0, m.Option(model.ALLOW_UID)) {
if status := AllowStatus(kit.Int(msg.Append(model.STATUS))); !m.WarnNotValid(status != from, status.String()) {
s.Update(m, kit.Dict(model.STATUS, to), model.UID, m.Option(model.ALLOW_UID), model.USER_UID, m.Option(model.USER_UID))
s.Update(m.Spawn(), kit.Dict(model.STATUS, to), args...)
}
}
return msg

BIN
src/gonganxitong/allow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -31,12 +31,13 @@ func (s apply) Create(m *ice.Message, arg ...string) {
m.ProcessRewrite(model.UID, m.Result())
}
func (s apply) List(m *ice.Message, arg ...string) {
s.FieldsWithCreatedAT(m, s,
model.USER_UID, model.APPLY_STATUS,
s.AS(s.Key(s, model.ROLE), s.Keys(s.UserPlace, model.ROLE)), model.BEGIN_TIME, model.END_TIME,
)
s.FieldsWithCreatedAT(m, s, model.USER_UID, model.APPLY_STATUS,
s.AS(s.Key(s, model.ROLE), s.Keys(s.UserPlace, model.ROLE)), model.BEGIN_TIME, model.END_TIME)
if len(arg) == 1 {
s.Select(m, model.PLACE_UID, arg[0], model.USER_UID, m.Option(model.USER_UID))
if m.Length() == 0 {
m.Action()
}
} else if len(arg) == 2 {
s.SelectDetail(m, model.PLACE_UID, arg[0], model.USER_UID, m.Option(model.USER_UID), model.UID, arg[1])
switch ApplyStatus(kit.Int(m.Append(model.APPLY_STATUS))) {
@ -57,6 +58,20 @@ func (s apply) List(m *ice.Message, arg ...string) {
func (s apply) Cancel(m *ice.Message, arg ...string) {
s.changeStatus(m, ApplyCreate, ApplyCancel)
}
func (s apply) ApplyCreate(m *ice.Message, arg ...string) {
m.Option(model.UID, m.Cmdy("", s.Create, s.Keys(s.UserPlace, model.ROLE), "3").Result())
m.Cmdy("", s.Submit)
}
func (s Table) ApplyCreate(m *ice.Message, arg ...string) {
m.Cmdy(s.Prefix(m, apply{}), s.ApplyCreate)
}
func (s Table) ApplyCheck(m *ice.Message, arg ...string) {
if m.Cmd(s.Prefix(m, apply{}), arg[0]).Length() == 0 {
m.EchoInfoButton("请申请加入团队", s.ApplyCreate)
} else {
m.Echo("\n「权限申请」已提交\n请等待「管理员」审批\n然后刷新界面查看最新状态")
}
}
func (s apply) Submit(m *ice.Message, arg ...string) {
msg := s.changeStatus(m, ApplyCreate, ApplySubmit)
if m.WarnNotValid(msg.IsErr()) {
@ -70,6 +85,9 @@ func (s apply) Submit(m *ice.Message, arg ...string) {
role, style = UserPlaceLandlord, "notice"
}
msg = m.Cmd(s.UserPlace, s.Select, m.OptionSimple(s.Keys(s.Place, model.UID)), model.ROLE, role)
if msg.Length() == 0 && style == "notice" {
msg = m.Cmd(s.UserPlace, s.Select, m.OptionSimple(s.Keys(s.Place, model.UID)), model.ROLE, UserPlaceCreator)
}
if m.WarnNotFound(msg.Length() == 0, role.String()) {
return
}

BIN
src/gonganxitong/apply.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -70,8 +70,8 @@ func (s command) Cache(m *ice.Message, arg ...string) {
}
func (s command) List(m *ice.Message, arg ...string) *ice.Message {
s.Tables(m, s.service).Fields(m, s.Key(s, model.UPDATED_AT),
s.Key(s, model.INDEX), s.AS(s.Key(s.service, model.INDEX), model.PORTAL), s.AS(model.NODENAME, model.SPACE),
).Orders(m, "`space`,`index`").Limit(m, 300).Select(m).Action(s.Cache, s.Autogen)
s.Key(s, model.INDEX), s.AS(s.Key(s.service, "`"+model.INDEX+"`"), model.PORTAL), s.AS(model.NODENAME, model.SPACE),
).Orders(m, "`space`,`commands`.`index`").Limit(m, 3000).Select(m).Action(s.Cache, s.Autogen)
return m
}

View File

@ -25,34 +25,47 @@ type UserPlacer interface {
Placer
}
type Placer interface {
Keys(target ice.Any, k string) string
Inputs(m *ice.Message, arg ...string)
RewriteAppend(m *ice.Message, arg ...string) *ice.Message
TransValue(m *ice.Message, key string, arg ...string) string
}
type Container interface {
Keys(target ice.Any, k string) string
FindOrCreateByName(m *ice.Message, arg ...string)
}
type Table struct {
db.Table
UserPlace UserPlacer
Place Placer
Street Container
checkRole string `name:"checkRole role"`
inputs string `name:"inputs" role:"void"`
list string `name:"list place_uid uid auto" role:"void"`
marketInsert string `name:"marketInsert domain_uid* title* content" role:"leader"`
memberList string `name:"memberList" role:"void"`
noticeList string `name:"noticeList" role:"void"`
UserPlace UserPlacer
Place Placer
Street Container
STREET_UID string
PLACE_UID string
checkRole string `name:"checkRole role"`
inputs string `name:"inputs" role:"void"`
list string `name:"list place_uid uid auto" role:"void"`
marketInsert string `name:"marketInsert domain_uid* title* content" style:"notice" role:"leader"`
pushPublic string `name:"pushPublic domain_uid* title* content" role:"leader"`
memberList string `name:"memberList" role:"void"`
noticeList string `name:"noticeList" role:"void"`
marketPlaceInfo string `name:"marketPlaceInfo" role:"void"`
messagePlaceInfo string `name:"messagePlaceInfo" role:"void"`
// applyCreate string `name:"applyCreate" role:"void"`
}
func (s Table) LoadTrans(m *ice.Message, arg ...string) {
// m.Option("_iconslib", "https://img.icons8.com/officel/80/")
p := kit.FileLine(1, 100)
if m.PrefixKey() != api.GONGANXITONG_PORTAL {
ice.LoadTrans(m.Spawn(kit.Dict("_template", path.Join(path.Dir(p), "portal.json"))).Message, m.CommandKey(), m.GetCommand().Command)
}
h := ctx.GetCmdFile(m.Message, m.PrefixKey())
kit.If(strings.HasPrefix(h, "/p/src/"), func() { h = strings.TrimPrefix(h, "/p/") })
nfs.Exists(m.Message, kit.ExtChange(h, "png"), func(p string) {
cmd := m.Target().Commands[m.CommandKey()]
cmd.Icon = m.Resource(p)
})
if path.Dir(h) != path.Dir(p) && m.CommandKey() != web.PORTAL {
ice.LoadTrans(m.Spawn(kit.Dict("_template", path.Join(path.Dir(h), "portal.json"))).Message, m.CommandKey(), m.GetCommand().Command)
}
@ -61,6 +74,9 @@ func (s Table) Init(m *ice.Message, arg ...string) {
s.LoadTrans(m, arg...)
s.Table.Init(m, arg...)
}
func (s Table) AfterInit(m *ice.Message, arg ...string) {
m.Cmd("applications", mdb.REMOVE, kit.Hashs(","+m.PrefixKey()+","))
}
func (s Table) AfterMigrate(m *ice.Message, arg ...string) {
kit.If(m.GetCommand().Icon, func() { Portal{}.Show(m) })
}
@ -75,10 +91,19 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
s.InputsList(m, PlaceTypeList, arg...)
case model.DOMAIN_UID:
s.AutoCmdy(m, api.GONGANXITONG_DOMAIN).DisplayInputKeyNameIconTitle()
case model.FROM_USER_UID, model.TO_USER_UID:
m.Cmdy(s.Prefix(m, member{}), m.Option(model.PLACE_UID)).Cut(model.USER_UID, model.USER_NAME, model.USER_AVATAR)
m.RenameAppend(model.USER_UID, arg[0], model.NAME, model.USER_NAME, model.USER_AVATAR, mdb.ICONS)
m.DisplayInputKeyNameIconTitle()
default:
s.Table.Inputs(m, arg...)
}
}
func (s Table) InputsUID(m *ice.Message, arg []string, target ice.Any, args ...string) {
s.Fields(m, model.UID, model.TITLE)
m.Cmdy(target, s.Select, args).RenameAppend(model.UID, arg[0])
m.DisplayInputKeyNameIconTitle()
}
func (s Table) InputsList(m *ice.Message, list ice.Any, arg ...string) {
it := reflect.ValueOf(list).MapRange()
for it.Next() {
@ -111,6 +136,15 @@ func (s Table) InputsListValue(m *ice.Message, list ice.Any, key string) string
}
return ""
}
func (s Table) TransPrice(m *ice.Message, arg []string, field ...string) []string {
kit.If(len(field) == 0, func() { field = append(field, "price", "amount") })
for i := 0; i < len(arg)-1; i += 2 {
if kit.IndexOf(field, arg[i]) > -1 {
arg[i+1] = kit.Format(kit.Int(kit.Float(arg[i+1]) * 100))
}
}
return arg
}
func (s Table) ValueModel(m *ice.Message, action ice.Any, arg ...string) *ice.Message {
defer m.Options(db.DB, m.Configv(db.DB)).Set(ice.MSG_OPTION, db.DB)
defer m.Options(db.MODEL, m.Configv(db.MODEL)).Set(ice.MSG_OPTION, db.MODEL)
@ -119,6 +153,7 @@ func (s Table) ValueModel(m *ice.Message, action ice.Any, arg ...string) *ice.Me
return m.Options(arg).Cmdy(s.PrefixPortal(m), action, arg)
}
func (s Table) ValueCreate(m *ice.Message, arg ...string) {
s.TransPrice(m, arg)
s.ValueModel(m, s.ValueCreate, arg...)
s.RecordEventWithName(m, "")
s.UserPlaceInit(m)
@ -128,6 +163,7 @@ func (s Table) ValueRemove(m *ice.Message, arg ...string) {
s.RecordEventWithName(m, "")
}
func (s Table) ValueModify(m *ice.Message, arg ...string) {
s.TransPrice(m, arg)
s.ValueModel(m, s.ValueModify, arg...)
s.RecordEventWithName(m, "")
}
@ -138,16 +174,12 @@ func (s Table) ValueList(m *ice.Message, arg []string, fields ...ice.Any) *ice.M
}
if s.ValueModel(m, s.ValueList, arg...); len(arg) == 1 {
s.UserPlaceInit(m)
if s.IsLeader(m) {
s.Button(m, "")
} else {
if m.Length() == 0 {
m.Echo("没有数据")
}
m.Action()
if s.IsWorker(m) {
s.Button(m, "", s.Create)
}
}
return s.SelectJoinUser(m)
return m
// return s.SelectJoinUser(m)
}
func (s Table) Create(m *ice.Message, arg ...string) { s.ValueCreate(m, arg...) }
func (s Table) Remove(m *ice.Message, arg ...string) { s.ValueRemove(m, arg...) }
@ -175,6 +207,16 @@ func (s Table) Select(m *ice.Message, arg ...string) *ice.Message {
kit.If(m.Length() > 0, func() { s.UserPlaceInit(m) })
return m
}
func (s Table) InsertIfNeed(m *ice.Message, arg ...string) {
kit.If(m.Cmd("", s.Select, arg).Length() == 0, func() { m.Cmd("", s.Insert, arg) })
}
func (s Table) InsertOrUpdate(m *ice.Message, arg []string, args ...string) {
if s.Select(m, args...).Length() > 0 {
s.Update(m, arg, args...)
} else {
s.Insert(m, arg...)
}
}
func (s Table) SelectDetail(m *ice.Message, arg ...string) *ice.Message {
return s.FieldsDefault(m).Table.SelectDetail(m, arg...)
}
@ -191,12 +233,13 @@ func (s Table) SelectJoinAuth(m *ice.Message, arg ...string) *ice.Message {
return m
}
kit.If(len(arg) == 0, func() {
arg = append(arg, model.NAME, model.INFO, model.AUTH_TYPE, model.AUTH_STATUS, model.AVATAR, model.BACKGROUND, model.DASHBOARD_UID)
arg = append(arg, model.NAME, model.INFO, model.TYPE, model.STATUS, model.AVATAR, model.BACKGROUND, model.DASHBOARD_UID)
})
defer s.SaveBack(m, ice.MSG_USERPOD, ice.MSG_USERROLE)()
return s.SelectJoin(m, s.findSpaceCmd(m, api.RENZHENGSHOUQUAN_AUTH), arg...)
}
func (s Table) SelectJoinRecent(m *ice.Message, PLACE_UID string, arg ...string) *ice.Message {
PLACE_UID = kit.Select(model.PLACE_UID, PLACE_UID)
if m.Length() == 0 {
return m
}
@ -239,6 +282,8 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
value = AllowStatus(kit.Int(value)).String()
case model.MESSAGE_STATUS:
value = MessageStatus(kit.Int(value)).String()
case model.PAYMENTLIST_STATUS:
value = PaymentStatus(kit.Int(value)).String()
}
return value
})
@ -263,16 +308,17 @@ func (s Table) UploadUpdate(m *ice.Message, field, uid string, arg ...string) {
p := m.UploadSave(path.Join(nfs.USR, kit.Select(field, m.Option(model.FIELD)), uid) + nfs.PS)
s.Update(m, kit.Dict(kit.Select(m.Option(model.FIELD), field), p), model.UID, uid)
}
func (s Table) UploadCreate(m *ice.Message, field, uid string, arg ...string) {
func (s Table) UploadCreate(m *ice.Message, field, uid string, arg ...string) string {
if m.IsErr() {
return
return ""
}
p := m.UploadSave(path.Join(nfs.USR, kit.Select(field, m.Option(model.FIELD)), uid) + nfs.PS)
s.Create(m, kit.Select(m.Option(model.FIELD), field), p, model.UID, uid)
s.Create(m, kit.Select(m.Option(model.FIELD), field), p, model.UID, uid, model.USER_UID, m.Option(model.USER_UID))
return p
}
func (s Table) ChangeStatus(m *ice.Message, place_uid, uid string, from, to int, arg ...string) *ice.Message {
msg := s.ValueList(m.Spawn(), []string{place_uid, uid}, model.STATUS)
if !m.WarnNotValid(msg.Length() == 0 || kit.Int(msg.Append(mdb.STATUS)) != int(from)) {
if !m.WarnNotValid(msg.Length() == 0 || from != kit.Int(msg.Append(mdb.STATUS)), kit.Format("%v != %v", from, kit.Int(msg.Append(mdb.STATUS)))) {
s.Update(m, kit.Dict(mdb.STATUS, to, arg), model.UID, uid)
}
return m
@ -287,6 +333,12 @@ func (s Table) IsVisitor(m *ice.Message) bool {
}
return false
}
func (s Table) IsCreator(m *ice.Message) bool {
if role := kit.Int(m.Option(model.USER_ROLE)); role == 1 {
return true
}
return false
}
func (s Table) IsLeader(m *ice.Message) bool {
if role := kit.Int(m.Option(model.USER_ROLE)); role == 1 || role == 2 {
return true
@ -319,7 +371,9 @@ func (s Table) RecordEventWithName(m *ice.Message, info string, arg ...string) {
info = "✅ " + info
case "placeRemove", mdb.REMOVE:
info = "❌ " + info
case "placeAuth":
case "placeAuth", mdb.MODIFY:
info = "🕑 " + info
default:
info = "🕑 " + info
}
})
@ -329,7 +383,7 @@ func (s Table) MemberList(m *ice.Message, arg ...string) {
m.Cmdy(s.Prefix(m, member{}), arg)
}
func (s Table) CityList(m *ice.Message, arg ...string) *ice.Message {
m.Cmdy(s.Prefix(m, city{}), arg).RenameAppend(model.NAME, model.CITY_NAME)
m.Cmdy(city{}, arg).RenameAppend(model.NAME, model.CITY_NAME)
return m
}
func (s Table) CityCmd(m *ice.Message, arg ...ice.Any) *ice.Message {
@ -342,6 +396,7 @@ func (s Table) SettingCmdy(m *ice.Message, arg ...ice.Any) *ice.Message {
return m.Cmdy(append([]ice.Any{s.Prefix(m, setting{})}, arg...)...)
}
func (s Table) AuthCreate(m *ice.Message, authType int, fromUID string, arg ...string) {
m.Info("what %v", m.Option(model.NAME))
s.AutoCmdy(m, api.RENZHENGSHOUQUAN_PORTAL, Portal{}.PlaceCreate,
model.AUTH_NAME, m.Option(model.NAME), model.AUTH_INFO, m.Option(model.INFO),
model.AUTH_TYPE, authType, model.FROM_UID, kit.Select(ice.AUTO, fromUID),
@ -349,28 +404,65 @@ func (s Table) AuthCreate(m *ice.Message, authType int, fromUID string, arg ...s
)
s.Update(m, kit.Dict(m.OptionSimple(model.AUTH_UID)), arg...)
}
func (s Table) SpideCreate(m *ice.Message, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, arg)
}
func (s Table) PlaceIsAuthed(m *ice.Message, arg ...string) *ice.Message {
if msg := m.Cmd(s.Place, s.Select, model.UID, arg[0]); msg.Append(model.AUTH_UID) == "" {
m.Echo("本服务暂未申请认证,请到<用户名片>申请认证")
return nil
} else if m.Cmd(api.RENZHENGSHOUQUAN_AUTH, s.Select, model.UID, msg.Append(model.AUTH_UID)).Append(model.AUTH_STATUS) != "2" {
m.Echo("本服务认证申请中,请等待审批")
return nil
} else {
return msg
}
}
func (s Table) StreetAuthUID(m *ice.Message, arg ...string) string {
if msg := s.PlaceIsAuthed(m, arg...); msg != nil {
return m.Cmd(s.Street, s.Select, model.UID, msg.Append(s.STREET_UID)).Append(model.AUTH_UID)
}
return ""
}
func (s Table) DashboardUpdate(m *ice.Message, arg ...string) {
if m.IsErr() {
return
}
m.Cmd(s.Prefix(m, Portal{}), s.DashboardUpdate)
}
func (s Table) MessagePlaceEnter(m *ice.Message, arg ...string) {
m.Cmdy(message{}, "placeEnter", arg)
}
func (s Table) MessagePlaceInfo(m *ice.Message, arg ...string) {
m.Cmdy(message{}, "placeInfo", arg)
}
func (s Table) MarketPlaceEnter(m *ice.Message, arg ...string) {
m.Cmdy(market{}, "placeEnter", arg)
}
func (s Table) MarketPlaceInfo(m *ice.Message, arg ...string) {
m.Cmdy(market{}, "placeInfo", arg)
}
func (s Table) MarketInsert(m *ice.Message, arg ...string) {
m.Cmdy(s.Prefix(m, Portal{}), s.MarketInsert, arg)
}
func (s Table) PushPublic(m *ice.Message, arg ...string) {
m.Cmdy(s.Prefix(m, Portal{}), s.PushPublic, arg)
}
func (s Table) ServiceList(m *ice.Message, arg ...string) *ice.Message {
return m.Cmd(s.Prefix(m, service{}), arg)
}
func (s Table) GetCommandUID(m *ice.Message, arg ...string) {
func (s Table) GetCommandUID(m *ice.Message, arg ...string) *ice.Message {
m.Option(model.COMMAND_UID, CommandUID(m, kit.Select(m.PrefixKey(), arg, 0)))
return m
}
func (s Table) SendMessage(m *ice.Message, from, to string, arg ...string) {
if m.IsErr() {
return
}
kit.If(len(arg) == 0, func() { arg = append(arg, m.Option(model.PLACE_UID), kit.Select(m.Option(model.UID), m.Result())) })
m.Spawn(ice.Maps{db.DB: ""}).Cmd(s.Prefix(m, message{}), s.Create,
model.FROM_USER_UID, kit.Select(m.Option(model.USER_UID), from), model.TO_USER_UID, kit.Select(m.Option(model.USER_UID), to),
m.OptionSimple(model.COMMAND_UID), model.ARGS, kit.Join(arg),
m.OptionSimple(model.COMMAND_UID), model.ARGS, kit.Join(arg), m.OptionSimple(model.TITLE, model.CONTENT),
)
}
func (s Table) DoneMessage(m *ice.Message, arg ...string) {
@ -395,7 +487,7 @@ func (s Portal) SendTemplate(m *ice.Message, arg ...string) {
s.AutoCmd(m, user{}, s.SendTemplate, arg[1], arg[2], link, kit.JoinWord(m.Option(model.PORTAL_NAME), arg[3]), name, kit.Cut(uid, 6))
}
func (s Table) Button(m *ice.Message, info string, arg ...ice.Any) *ice.Message {
kit.If(!m.IsErr() && m.Length() == 0, func() { m.Options(ctx.STYLE, html.FORM).EchoInfoButton(info, arg...) })
kit.If(!m.IsErr() && m.Length() == 0, func() { m.Options(ctx.STYLE, html.FORM).EchoInfoButton(info, arg...).Action() }, func() { m.Action(arg...) })
return m
}
func (s Table) DisplayBase(m *ice.Message, file string) *ice.Message {
@ -420,7 +512,8 @@ func (s Table) Display(m *ice.Message, file string) *ice.Message {
}
if m.Template(file) == "" {
if m.CommandKey() == web.PORTAL {
file = m.Resource(path.Join(base, "portal.js"))
// file = m.Resource(path.Join(base, "portal.js"))
file = m.Resource(path.Join(sub, "portal.js"))
} else {
file = m.Resource(path.Join(base, "common.js"))
}
@ -494,16 +587,16 @@ type Tables struct{ Table }
func (s Tables) BeforeMigrate(m *ice.Message, arg ...string) {}
func newTable() Table { return Table{UserPlace: userPlace{}, Place: place{}, Street: street{}} }
func newTables() Tables { return Tables{Table: newTable()} }
func newTable() Table { return NewTable(userPlace{}, place{}, street{}) }
func NewTable(userPlace UserPlacer, place Placer, street Container) Table {
return Table{UserPlace: userPlace, Place: place, Street: street}
return Table{UserPlace: userPlace, Place: place, Street: street, STREET_UID: street.Keys(street, model.UID), PLACE_UID: place.Keys(place, model.UID)}
}
func NewTables(userPlace UserPlacer, place Placer, street Container) Tables {
return Tables{Table: NewTable(userPlace, place, street)}
}
func NewPortal(userPlace UserPlacer, place Placer, street Container) Portal {
return Portal{Table: Table{UserPlace: userPlace, Place: place, Street: street}}
return Portal{Table: NewTable(userPlace, place, street)}
}
func (s Portal) getTable() Table { return s.Table }
@ -514,22 +607,40 @@ func PortalCmd(portal ice.Any) {
tables := Tables{Table: table}
cmd := func(name string, data ice.Any) {
_, cmd := ice.Cmd(kit.Keys(p, name), data)
if cmd == nil {
return
}
cmd.RawHand = path.Join(path.Dir(h), name+".go")
what := kit.FileLine(1, 100)
// cmd.Icon = path.Join(path.Dir(what), name) + ".png"
nfs.Exists(ice.Pulse, path.Join(path.Dir(what), name)+".png", func(p string) {
cmd.Icon = "/p/src/gonganxitong/" + name + ".png?pod=20240724-community"
// ice.Pulse.Resource(p)
})
cmd.Actions[ice.CTX_INIT].Hand = icebergs.MergeHand(func(m *icebergs.Message, arg ...string) {
m.Design(mdb.LIST, "", kit.JoinWord(table.Keys(table.Place, model.UID), model.UID, ice.AUTO))
mdb.Config(m, db.DOMAIN, kit.PathName(1))
}, cmd.Actions[ice.CTX_INIT].Hand)
}
cmd("portal", portal)
cmd("search", search{Tables: tables})
cmd("goodslist", goodslist{Table: table})
cmd("quotalist", quotalist{Table: table})
cmd("spendlist", spendlist{Table: table})
cmd("paymentlist", paymentlist{Table: table})
cmd("meeting", meeting{Table: table})
cmd("document", document{Table: table})
cmd("contract", contract{Table: table})
cmd("photo", photo{Table: table})
cmd("credit", credit{Tables: tables})
cmd("member", member{Tables: tables})
cmd("setting", setting{Table: table})
cmd("qrcode", qrcode{Tables: tables})
cmd("event", event{Table: table})
cmd("apply", apply{Table: table})
cmd("allow", allow{Table: table})
cmd("notice", notice{Table: table})
cmd("setting", setting{Table: table})
cmd("member", member{Tables: tables})
cmd("credit", credit{Tables: tables})
cmd("market", market{Table: table})
cmd("message", message{Table: table})
cmd("recent", recent{Table: table})

View File

@ -3,7 +3,10 @@ Volcanos(chat.ONIMPORT, {
var PLACE_NAME = msg.Option("_place_name"), PLACE_TYPE = msg.Option("_place_type"), USER_PLACE_ROLE = msg.Option("_user_place_role")
PLACE_TYPE || can.core.List(msg.append, function(key) { can.base.endWith(key, "_type") && (PLACE_TYPE = key), can.base.endWith(key, "_role") && (USER_PLACE_ROLE = key) })
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list:[value.title||value.name||value.user_name, can.onimport.textView(can, value, PLACE_TYPE), can.onimport.textView(can, value, USER_PLACE_ROLE)]},
{view: html.TITLE, list:[
value.title||value.name||value.user_name, can.onimport.textView(can, value, PLACE_TYPE), can.onimport.textView(can, value, USER_PLACE_ROLE),
can.onimport.titleAction(can, value),
]},
{view: html.STATUS, list: [value.city_name, value.company_name||value.street_name, value.place_name]},
{view: html.STATUS, list: [value.uid && value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
value.address && {view: html.STATUS, list: [value.address]},

View File

@ -0,0 +1,19 @@
package gonganxitong
import "shylinux.com/x/ice"
type contract struct {
Table
order string `data:"95"`
auth string `data:"issued"`
role string `data:"leader,worker"`
fields string `data:"title"`
create string `name:"create title*" role:"leader"`
remove string `name:"remove" role:"leader"`
}
func (s contract) List(m *ice.Message, arg ...string) {
m.Echo("功能正在开发中,敬请等待。")
}
func init() { ice.TeamCtxCmd(contract{Table: newTable()}) }

View File

@ -0,0 +1,10 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.page.Append(can, can._output, [
{view: html.ITEM, list: [{type: html.INPUT, data: {type: html.TEXT}, onblur: function() {
can.sup.onimport.size(can.sup, can.sup.ConfHeight(), can.sup.ConfWidth())
can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
}}]},
])
},
})

View File

@ -13,10 +13,10 @@ type credit struct {
user user
city city
order string `data:"101"`
authCity string `name:"authCity" role:"void"`
authPersonal string `name:"authPersonal" role:"void"`
authService string `name:"authService" role:"void"`
authCompany string `name:"authCompany" role:"void"`
authPersonal string `name:"authPersonal" role:"void"`
authCity string `name:"authCity" role:"void"`
}
func (s credit) List(m *ice.Message, arg ...string) {
@ -25,7 +25,7 @@ func (s credit) List(m *ice.Message, arg ...string) {
m.ProcessField(api.RENZHENGSHOUQUAN_PROFILE, msg.Append(model.AUTH_UID))
return
}
if !s.IsWorker(m) {
if !s.IsLeader(m) {
m.Echo("本服务暂未申请认证")
return
}
@ -49,13 +49,13 @@ func (s credit) List(m *ice.Message, arg ...string) {
func (s credit) AuthService(m *ice.Message, arg ...string) {
m.Cmdy(s.PrefixPortal(m), Portal{}.PlaceAuth, kit.Dict(s.placeInfo(m).AppendSimple())).ProcessRefresh()
}
func (s credit) AuthCompany(m *ice.Message, arg ...string) {
m.Cmdy(s.Street, s.AuthCreate, kit.Dict(s.streetInfo(m).AppendSimple(model.NAME, model.INFO, model.UID, model.CITY_UID)))
}
func (s credit) AuthPersonal(m *ice.Message, arg ...string) {
msg := m.Cmd(s.city, s.Select, model.NAME, m.Option(model.CITY_NAME))
m.Cmdy(s.user, s.AuthCreate, kit.Dict(msg.AppendSimple(model.AUTH_UID)))
}
func (s credit) AuthCompany(m *ice.Message, arg ...string) {
m.Cmdy(s.Street, s.AuthCreate, kit.Dict(s.streetInfo(m).AppendSimple(model.NAME, model.INFO, model.UID, model.CITY_UID)))
}
func (s credit) AuthCity(m *ice.Message, arg ...string) {
m.Cmdy(s.city, s.AuthCreate, kit.Dict(s.cityInfo(m).AppendSimple(model.NAME, model.INFO)))
}

BIN
src/gonganxitong/credit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -0,0 +1,47 @@
package gonganxitong
import (
"shylinux.com/x/ice"
"shylinux.com/x/community/src/gonganxitong/model"
)
type document struct {
Table
order string `data:"94"`
auth string `data:"issued"`
role string `data:"leader,worker"`
fields string `data:"folder_id,vendor,user_uid"`
open string `name:"open" style:"notice" role:"void"`
}
func (s document) Config(m *ice.Message, arg ...string) {
s.InsertOrUpdate(m, arg, m.OptionSimple(model.PLACE_UID)...)
}
func (s document) List(m *ice.Message, arg ...string) {
s.cmdy(m, DocumentVendor.Folder).PushAction(s.Open).Display("")
if len(arg) == 1 {
s.SpendlistCheck(m, 0)
}
}
func (s document) Open(m *ice.Message, arg ...string) {
m.ProcessOpen(m.Option(model.LINK))
}
func init() { ice.TeamCtxCmd(document{Table: newTable()}) }
func (s document) cmdy(m *ice.Message, action ice.Any, arg ...string) *ice.Message {
if m.Option(model.AUTH_UID, s.StreetAuthUID(m, m.Option(model.PLACE_UID))) == "" {
return m
}
if msg := s.Select(m.Spawn(), m.OptionSimple(model.PLACE_UID)...); msg.Append("folder_id") == "" {
m.Echo("本服务暂未配置,请联系公司管理员配置")
} else {
m.Cmdy(msg.Append(model.VENDOR), action, m.Option(model.AUTH_UID), msg.Append("folder_id"))
}
return m
}
var DocumentVendor interface {
Folder(m *ice.Message, arg ...string) *ice.Message
}

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+"."+value.type, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.ownerName, can.onimport.timeView(can, value)]},
] })
},
})

View File

@ -8,17 +8,24 @@ import (
type domain struct {
Table
fields string `name:"name,order"`
create string `name:"create name* info" role:"tech"`
remove string `name:"remove" role:"tech"`
list string `name:"list domain_uid auto" role:"void"`
}
func (s domain) Create(m *ice.Message, arg ...string) { s.Insert(m, arg...) }
func (s domain) Remove(m *ice.Message, arg ...string) { s.Delete(m, arg...) }
func (s domain) Modify(m *ice.Message, arg ...string) {
s.Update(m, arg, model.UID, m.Option(model.DOMAIN_UID))
}
func (s domain) Remove(m *ice.Message, arg ...string) {
s.Delete(m.Options(model.UID, m.Option(model.DOMAIN_UID)))
}
func (s domain) List(m *ice.Message, arg ...string) {
s.Fields(m, model.UID, model.NAME)
s.Fields(m, model.UID, model.NAME, "order")
if len(arg) == 0 {
s.Select(m).RenameAppend(model.UID, model.DOMAIN_UID).Action()
m.SortInt("order")
} else if len(arg) == 1 {
s.SelectDetail(m, model.UID, arg[0])
}

BIN
src/gonganxitong/event.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,118 @@
package gonganxitong
import (
"time"
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
"shylinux.com/x/community/src/gonganxitong/model"
)
type goodslist struct {
Table
quotalist quotalist
spendlist spendlist
paymentlist paymentlist
order string `data:"91"`
auth string `data:"issued"`
role string `data:"leader,worker"`
fields string `data:"name,amount,title,content,user_uid"`
create string `name:"create name* amount* title* content*" role:"leader"`
remove string `name:"remove" role:"leader"`
request string `name:"request" help:"购买" style:"notice" role:"void"`
response string `name:"response" role:"void"`
}
func (s goodslist) AfterMigrate(m *ice.Message, arg ...string) {
s.Table.AfterMigrate(m, arg...)
if s.PrefixPortal(m) == api.RENZHENGSHOUQUAN_PORTAL {
s.insert(m, "service", "3-1", "1000", "基础版")
s.insert(m, "service", "3-2", "3000", "高级版")
s.insert(m, "service", "3-3", "5000", "旗舰版")
s.insert(m, "company", "4-1", "10000", "企业基础版")
s.insert(m, "company", "4-2", "30000", "企业高级版")
s.insert(m, "company", "4-3", "50000", "企业旗舰版")
s.insert(m, "school", "5-1", "10000", "教育基础版")
s.insert(m, "school", "5-2", "30000", "教育高级版")
s.insert(m, "school", "5-3", "50000", "教育旗舰版")
s.insert(m, "street", "6-1", "10000", "社区基础版")
s.insert(m, "street", "6-2", "30000", "社区高级版")
s.insert(m, "street", "6-3", "50000", "社区旗舰版")
}
}
func (s goodslist) Create(m *ice.Message, arg ...string) {
s.Insert(m, kit.Simple(s.TransPrice(m, arg, model.AMOUNT), m.OptionSimple(model.PLACE_UID, model.USER_UID))...)
s.RecordEventWithName(m, "")
}
func (s goodslist) List(m *ice.Message, arg ...string) {
if len(arg) == 1 {
if s.PrefixPortal(m) == api.RENZHENGSHOUQUAN_PORTAL {
msg := m.Cmd(api.RENZHENGSHOUQUAN_AUTH, s.Select, model.UID, arg[0])
switch kit.Int(msg.Append(model.AUTH_TYPE)) {
case 3:
s.Select(m, model.PLACE_UID, "service")
case 4:
s.Select(m, model.PLACE_UID, "company")
case 5:
s.Select(m, model.PLACE_UID, "school")
case 6:
s.Select(m, model.PLACE_UID, "street")
}
m.PushAction(s.Request).Action()
} else {
if s.IsLeader(m) {
s.Select(m, model.PLACE_UID, "service")
m.PushAction(s.Request).Action()
}
msg := s.Select(m.Spawn(), model.PLACE_UID, arg[0])
if s.IsLeader(m) {
msg.PushAction(s.Request, s.Remove).Action(s.Create)
} else {
msg.PushAction(s.Request).Action()
}
m.Copy(msg)
s.SelectJoinUser(m)
}
m.Display("")
} else if len(arg) == 2 {
m.Cmdy(s.Prefix(m, s.quotalist), s.Select, model.GOODSLIST_UID, arg[1])
m.EchoInfoButton("请购买会员", s.Request).Action()
m.Display("quotalist.js")
}
}
func (s goodslist) Request(m *ice.Message, arg ...string) {
if msg := s.Select(m.Spawn(), m.OptionSimple(model.UID)...); msg.IsErr() {
m.Copy(msg)
} else if _msg := m.Cmd(s.Prefix(m, s.paymentlist), s.Create, model.GOODSLIST_UID, m.Option(model.UID),
model.AMOUNT, kit.Float(msg.Append(model.AMOUNT))/100, msg.AppendSimple(model.TITLE, model.CONTENT)); _msg.IsErr() {
m.Copy(_msg)
} else {
m.Options(msg.AppendSimple(model.AMOUNT, model.TITLE, model.CONTENT))
m.Cmdy(s.Prefix(m, s.paymentlist), m.ActionKey(), m.PrefixKey(), "", m.Option(model.PLACE_UID), _msg.Result())
m.Push(model.PAYMENTLIST_UID, _msg.Result())
}
}
func (s goodslist) Response(m *ice.Message, arg ...string) {
if m.Cmdy(s.Prefix(m, s.paymentlist), m.ActionKey(), arg).IsErr() {
return
}
t := time.Now().AddDate(0, 1, 0)
msg := m.Cmd(s.Prefix(m, s.paymentlist), s.Select, model.UID, arg[1])
m.Cmd(s.Prefix(m, s.quotalist), s.Select, msg.AppendSimple(model.GOODSLIST_UID)).Table(func(value ice.Maps) {
m.Cmd(s.Prefix(m, s.spendlist), s.Insert, model.PLACE_UID, arg[0], msg.AppendSimple(model.USER_UID), model.PAYMENTLIST_UID, arg[1],
model.QUOTALIST_UID, value[model.UID], model.EXPIRE_TIME, t.Format(ice.MOD_TIME), model.VENDOR, value[model.VENDOR], model.TOTAL, value[model.TOTAL])
})
}
func init() { ice.TeamCtxCmd(goodslist{Table: newTable()}) }
func (s goodslist) insert(m *ice.Message, auth, level, amount string, arg ...string) {
uid := kit.Hashs(auth, level)
if s.Select(m.Spawn(), model.UID, uid).Length() > 0 {
return
}
s.Insert(m, model.UID, uid, model.PLACE_UID, auth, model.NAME, level,
model.AMOUNT, amount, model.TITLE, kit.Select("", arg, 0), model.CONTENT, kit.Select("", arg, 1))
}

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.amount/100+" / 月", can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.OUTPUT, list: [value.content]},
] })
},
})

54
src/gonganxitong/grant.go Normal file
View File

@ -0,0 +1,54 @@
package gonganxitong
import (
"net/http"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
type grant struct {
Tables
sess sess
confirm string `name:"confirm" role:"void"`
list string `name:"list name auto" help:"扫码授权" role:"void"`
}
func (s grant) List(m *ice.Message, arg ...string) {
if m.Option(ice.FROM_DAEMON) == "" {
m.EchoQRCode(m.MergePodCmd("", m.PrefixKey(), ice.FROM_DAEMON, m.Option(ice.MSG_DAEMON)))
} else {
m.EchoInfoButton("请授权登录", s.Confirm)
}
kit.If(m.IsTech(), func() { m.Action(s.Header) })
}
func (s grant) Header(m *ice.Message, arg ...string) {
m.AddHeaderLogin(mdb.PLUGIN, "weixin", "微信扫码", "9")
// m.Cmd(web.SPACE, ice.OPS, web.SERVE, ice.MAIN, s.PrefixPortal(m), m.Option(ice.MSG_USERPOD))
}
func (s grant) Confirm(m *ice.Message, arg ...string) {
if m.WarnNotAllow(m.Option(ice.MSG_METHOD) == http.MethodGet) {
return
} else if m.WarnNotLogin(m.Option(ice.MSG_USERNAME) == "") || m.WarnNotValid(m.Option(ice.FROM_DAEMON) == "", ice.FROM_DAEMON) {
return
} else if msg := s.spaceInfo(m); m.WarnNotFound(msg.Append(mdb.TYPE) == "", m.Option(web.SPACE)) {
return
} else {
m.Info("what %v", msg.FormatsMeta(nil))
defer m.ProcessOpen(msg.Append(mdb.TEXT))
m.Option(ice.MSG_USERIP, msg.Append(aaa.IP))
m.Option(ice.MSG_USERUA, msg.Append(aaa.UA))
msg := m.Cmd(s.sess, s.Create)
m.Cmd(web.SPACE, m.Option(ice.FROM_DAEMON), ice.MSG_SESSID, msg.Option(ice.MSG_SESSID))
m.Echo(ice.SUCCESS)
}
}
func init() { ice.TeamCtxCmd(grant{Tables: newTables()}) }
func (s grant) spaceInfo(m *ice.Message, arg ...string) *ice.Message {
return m.Cmd(web.SPACE, kit.Keys(kit.Slice(kit.Split(m.Option(ice.FROM_DAEMON), "."), 0, -1)))
}

View File

@ -0,0 +1,6 @@
$output div.item.card div.output div.title {
margin-top:10px;
}
$output div.item.card div.output {
padding:20px 10px;
}

View File

@ -32,6 +32,7 @@ func (s market) List(m *ice.Message, arg ...string) {
s.Key(s, model.USER_UID), model.PLACE_UID, model.SERVICE_NAME, model.TITLE, model.CONTENT,
model.THUMB_COUNT, model.COMMENT_COUNT, model.FAVOR_COUNT, model.SHARE_COUNT, model.THUMB_STATUS, model.FAVOR_STATUS,
s.AS(model.NODENAME, model.SPACE), s.Key(s.command, model.INDEX), model.ARGS,
model.COMMAND_NAME,
)
if len(arg) < 2 {
if m.Option(model.DOMAIN_UID) != "" {
@ -49,7 +50,7 @@ func (s market) List(m *ice.Message, arg ...string) {
s.SelectJoinRecent(m, model.PLACE_UID)
s.SelectJoinUser(m, model.NAME, model.AVATAR, model.AUTH_UID)
s.SelectJoinAuth(m)
s.DisplayBase(m, "")
s.DisplayBase(m, "").DisplayCSS("")
}
func (s market) ThumbToggle(m *ice.Message, arg ...string) {
m.OptionDefault(model.MARKET_UID, m.Option(model.UID))
@ -75,5 +76,21 @@ func (s market) FavorToggle(m *ice.Message, arg ...string) {
func (s market) ShareCreate(m *ice.Message, arg ...string) {
s.AddCount(m, model.SHARE_COUNT, "1")
}
func (s market) PlaceEnter(m *ice.Message, arg ...string) {
// m.ProcessField()
}
func (s market) PlaceInfo(m *ice.Message, arg ...string) {
s.Tables(m, s.command, s.service, s.LeftJoinValue(m, s.thumb, s), s.LeftJoinValue(m, s.favor, s)).FieldsWithCreatedAT(m, s,
s.Key(s, model.USER_UID), model.PLACE_UID, model.SERVICE_NAME, model.TITLE, model.CONTENT,
model.THUMB_COUNT, model.COMMENT_COUNT, model.FAVOR_COUNT, model.SHARE_COUNT, model.THUMB_STATUS, model.FAVOR_STATUS,
s.AS(model.NODENAME, model.SPACE), s.Key(s.command, model.INDEX), model.ARGS,
model.COMMAND_NAME,
)
s.Select(m, s.Key(s, model.UID), m.Option(model.MARKET_UID))
s.SelectJoinRecent(m, model.PLACE_UID)
s.SelectJoinUser(m, model.NAME, model.AVATAR, model.AUTH_UID)
s.SelectJoinAuth(m)
m.PushAction(s.MarketPlaceEnter)
}
func init() { ice.TeamCtxCmd(market{Table: newTable()}) }

View File

@ -5,7 +5,7 @@ Volcanos(chat.ONIMPORT, {
can.onmotion.select(can, can.ui.tabs, html.DIV_ITEM, event.target), can.run(event, [], function(msg) { can.onimport._data(can, msg) })
}}])
can.page.Append(can, can.ui.tabs, msg.Table(function(value) {
return {view: [[html.ITEM, value.uid == domain_uid? html.SELECT: ""], "", value.name], onclick: function(event) { can.misc.Cookie(can, "domain_uid", value.uid)
return {view: [[html.ITEM, value.domain_uid == domain_uid? html.SELECT: ""], "", value.name], onclick: function(event) { can.misc.Cookie(can, "domain_uid", value.domain_uid)
can.onmotion.select(can, can.ui.tabs, html.DIV_ITEM, event.target), can.run(event, [], function(msg) { can.onimport._data(can, msg) })
}}
}))
@ -17,9 +17,12 @@ Volcanos(chat.ONIMPORT, {
{text: [value.user_name, "", aaa.USERNAME]}, can.onimport.authView(can, value), can.onimport.timeView(can, value),
]},
{view: html.STATUS, list: [
{text: [value.street_name, "", "street"]}, {text: [value.place_name, "", "place"]}, {text: [value.service_name.split(" ")[0], "", "service"]},
{text: [value.city_name, "", "city"]},
{text: [value.street_name, "", "street"]},
{text: [value.place_name, "", "place"]},
{text: [value.service_name, "", "service"]},
]},
{view: html.OUTPUT, list: [value.title]},
{view: html.TITLE, list: [value.command_name, value.title]},
{view: html.OUTPUT, list: [value.content]},
{view: html.ACTION, list: [
{view: html.ITEM, list: [{icon: "bi bi-hand-thumbs-up"}, {text: value.thumb_count||"点赞"}], onclick: function(event) {

View File

@ -0,0 +1,16 @@
$fieldset.detail { margin-top:0 !important; height:100%; }
$output.detail { background-color:#646566 !important; text-align:center; height:100% !important; }
$output.detail div.detail { border-radius:10px; background-color:var(--output-bg-color); padding:10px 10px 40px; margin:80px auto 10px; max-width:360px; position:relative; }
$output.detail div.title { font-size:20px; }
$output.detail div.meeting_code { font-size:18px; margin:10px; }
$output.detail div.status { color:var(--notice-bg-color); }
$output.detail div.time { border-bottom:dashed 1px gray; font-size:24px; white-space:pre; padding-bottom:20px; display:flex; justify-content:space-around; align-items: center; }
$output.detail div.span_time { color:gray; font-size:12px; }
$output.detail div.span_time div.zone { margin-top:5px; }
$output.detail div.date { color:gray; font-size:12px; margin-top:5px; }
$output.detail img.qrcode { width:200px !important; }
$output.detail div.logo { background-color:white; position:absolute; padding:3px 3px 0; bottom:calc(170px - 23px); left: calc(50% - 23px); }
$output.detail div.logo img { height:40px; }
$output.detail div.action input { border:var(--box-notice); background-color:var(--notice-bg-color); color:var(--notice-fg-color); font-size:18px; height:40px; width:100%; max-width:360px; }
body.dark $output.detail { background-color:#33363a !important; }
body.width1 $output.detail img.qrcode { border:var(--box-border); border-radius:5px; margin:40px; margin-bottom:10px; }

View File

@ -0,0 +1,68 @@
package gonganxitong
import (
"shylinux.com/x/ice"
"shylinux.com/x/community/src/gonganxitong/model"
)
type meeting struct {
Table
order string `data:"93"`
auth string `data:"issued"`
role string `data:"leader,worker"`
fields string `data:"user_id,vendor"`
config string `name:"config place_uid* user_uid* user_id* vendor*"`
create string `name:"create subject* start_time*:select@date end_time*:select@date" role:"worker"`
modify string `name:"modify subject* start_time*:select@date end_time*:select@date" role:"worker"`
cancel string `name:"cancel" role:"worker"`
enter string `name:"enter" help:"入会" style:"notice" role:"worker"`
}
func (s meeting) Config(m *ice.Message, arg ...string) {
s.InsertOrUpdate(m, arg, m.OptionSimple(model.PLACE_UID)...)
}
func (s meeting) Create(m *ice.Message, arg ...string) { s.cmdy(m, s.MeetingPost, arg...) }
func (s meeting) Modify(m *ice.Message, arg ...string) { s.cmdy(m, s.MeetingPut, arg...) }
func (s meeting) Cancel(m *ice.Message, arg ...string) { s.cmdy(m, s.MeetingCancel, arg...) }
func (s meeting) Enter(m *ice.Message, arg ...string) { m.ProcessOpen(m.Option(model.LINK)) }
func (s meeting) List(m *ice.Message, arg ...string) {
if s.cmdy(m, s.MeetingList, arg[1:]...); m.Length() > 0 {
if len(arg) == 1 {
m.PushAction(s.Enter, s.Modify, s.Cancel).Action(s.Create).Display("").DisplayCSS("")
s.SpendlistCheck(m, 0)
} else if m.IsMobileUA() {
m.EchoQRCode(m.Append(model.LINK)).Display("").DisplayCSS("")
} else {
m.EchoQRCode(m.Append(model.LINK)).Display("").DisplayCSS("")
// m.EchoIFrame(m.Append(model.LINK)).SetAppend()
}
}
}
func (s meeting) MeetingList(m *ice.Message, arg ...string) {}
func (s meeting) MeetingPost(m *ice.Message, arg ...string) {}
func (s meeting) MeetingPut(m *ice.Message, arg ...string) {}
func (s meeting) MeetingCancel(m *ice.Message, arg ...string) {}
func init() { ice.TeamCtxCmd(meeting{Table: newTable()}) }
var MeetingVendor interface {
UserList(m *ice.Message, arg ...string) *ice.Message
MeetingList(m *ice.Message, arg ...string) *ice.Message
MeetingPost(m *ice.Message, arg ...string) *ice.Message
MeetingPut(m *ice.Message, arg ...string) *ice.Message
MeetingCancel(m *ice.Message, arg ...string) *ice.Message
}
func (s meeting) cmdy(m *ice.Message, action ice.Any, arg ...string) {
if m.Option(model.AUTH_UID, s.StreetAuthUID(m, m.Option(model.PLACE_UID))) == "" {
return
}
msg := s.Select(m.Spawn(), m.OptionSimple(model.PLACE_UID)...)
if msg.Append(model.VENDOR) == "" {
m.Echo("本服务暂未配置,请联系公司管理员配置")
return
} else {
m.Cmdy(msg.Append(model.VENDOR), action, arg)
}
}

View File

@ -0,0 +1,34 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.page.ClassList.del(can, can._fields, "detail"), can.page.ClassList.del(can, can._output, "detail")
if (can.Option(UID)) { can.page.ClassList.add(can, can._fields, "detail"), can.page.ClassList.add(can, can._target, "detail")
var start_time = msg.Append("start_time").split(" "), end_time = msg.Append("end_time").split(" ")
can.ui = can.page.Append(can, can._output, [
{view: "detail", list: [
{view: ["title", "", msg.Append("subject")]},
{view: ["meeting_code", "", msg.Append(UID)]},
{view: ["status", "", "待开始"]},
{view: "time", list: [
{view: "start_time", list: [{view: ["hour", "", start_time[1]]}, {view: ["date", "", start_time[0]]}]},
{view: ["span_time"], list: [{view: ["span", "", msg.Append("span_time")]}, {view: ["zone", "", "(GMT+08:00)"]}]},
{view: "end_time", list: [{view: ["hour", "", end_time[1]]}, {view: ["date", "", end_time[0]]}]},
]},
{view: ["qrcode", "", msg.Result()]},
{view: ["logo"], list: [{img: "https://meeting.tencent.com/static/imgs/detail/qrcode_icon2x.png"}]},
{view: ["tips", "", "请使用手机端【腾讯会议App】扫码入会"]},
]},
{view: "action", list: [
{type: html.INPUT, data: {type: html.BUTTON}, name: "join", value: "入会", onclick: function(event) {
can.runAction(can.request(event, msg.Table()[0]), "join")
}},
]},
])
msg.Option("_share_title", msg.Append("subject"))
msg.Option("_share_content", [msg.Append(UID), msg.Append("start_time")].join("\n"))
} else {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.subject, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.start_time, "~", value.end_time.split(" ")[1]]},
] })
}
},
})

View File

@ -1 +1,2 @@
$output>div.item.myself div.title span { font-weight:bold; }
$output>div.item.myself div.title span { font-weight:bold; }
$output>div.item.card div.title span.role { margin-left:auto; }

View File

@ -2,6 +2,7 @@ package gonganxitong
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/gonganxitong/model"
@ -15,25 +16,44 @@ type member struct {
remove string `name:"remove" role:"void"`
enable string `name:"enable" role:"void"`
disable string `name:"disable" role:"void"`
promote string `name:"promote" role:"void"`
demote string `name:"demote" role:"void"`
}
func (s member) Remove(m *ice.Message, arg ...string) {
if s.IsLeader(m) {
m.Cmdy(s.UserPlace, s.Delete, s.option(m))
}
}
func (s member) Enable(m *ice.Message, arg ...string) {
if s.IsLeader(m) {
m.Cmdy(s.UserPlace, s.UpdateField, model.STATUS, MemberNormal, s.option(m))
m.Cmdy(s.UserPlace, s.Delete, s.option(m, model.ROLE, kit.Format(UserPlaceTenant), model.STATUS, kit.Format(MemberDisabled)))
s.recordEvent(m, "❌", m.Trans("remove member", "删除成员"), html.DANGER)
}
}
func (s member) Disable(m *ice.Message, arg ...string) {
if s.IsLeader(m) {
m.Cmdy(s.UserPlace, s.UpdateField, model.STATUS, MemberDisabled, s.option(m))
m.Cmdy(s.UserPlace, s.UpdateField, model.STATUS, MemberDisabled, s.option(m, model.ROLE, kit.Format(UserPlaceTenant)))
s.recordEvent(m, "❌", m.Trans("disable member", "禁用成员"), html.DANGER)
}
}
func (s member) Demote(m *ice.Message, arg ...string) {
if s.IsCreator(m) {
m.Cmdy(s.UserPlace, s.UpdateField, model.ROLE, kit.Format(UserPlaceTenant), s.option(m))
s.recordEvent(m, "❌", m.Trans("demote worker", "降级成为工作人员"), html.DANGER)
}
}
func (s member) Promote(m *ice.Message, arg ...string) {
if s.IsCreator(m) {
m.Cmdy(s.UserPlace, s.UpdateField, model.ROLE, kit.Format(UserPlaceLandlord), s.option(m))
s.recordEvent(m, "✅", m.Trans("promote leader", "升级成为管理人员"), html.NOTICE)
}
}
func (s member) Enable(m *ice.Message, arg ...string) {
if s.IsLeader(m) {
m.Cmdy(s.UserPlace, s.UpdateField, model.STATUS, MemberNormal, s.option(m, model.ROLE, kit.Format(UserPlaceTenant)))
s.recordEvent(m, "✅", m.Trans("enable member", "启用成员"), html.NOTICE)
}
}
func (s member) List(m *ice.Message, arg ...string) {
user_uid, isLeader := m.Option(model.USER_UID), s.IsLeader(m)
USER_PLACE_ROLE := s.Keys(s.UserPlace, model.ROLE)
s.Limit(m, 1000)
user_uid, isLeader, isCreator := m.Option(model.USER_UID), s.IsLeader(m), s.IsCreator(m)
s.FieldsWithCreatedAT(m, s.UserPlace, model.USER_UID, s.Keys(s.UserPlace, model.ROLE), s.AS(s.Key(s.UserPlace, model.STATUS), model.MEMBER_STATUS))
if len(arg) == 1 {
m.Cmdy(s.UserPlace, s.Select, s.Keys(s.Place, model.UID), arg[0]).Action()
@ -42,6 +62,7 @@ func (s member) List(m *ice.Message, arg ...string) {
} else {
return
}
defer m.Sort(kit.Fields(model.MEMBER_STATUS, USER_PLACE_ROLE, model.CREATED_AT))
m.Table(func(value ice.Maps) {
if !m.FieldsIsDetail() {
if user_uid == value[model.USER_UID] {
@ -50,29 +71,47 @@ func (s member) List(m *ice.Message, arg ...string) {
m.Push("who", "")
}
}
if isLeader {
if user_uid == value[model.USER_UID] {
m.PushButton()
} else {
if MemberStatus(kit.Int(value[model.MEMBER_STATUS])) == MemberNormal {
m.PushButton(s.Disable)
} else {
m.PushButton(s.Enable, s.Remove)
button := []ice.Any{}
if MemberStatus(kit.Int(value[model.MEMBER_STATUS])) == MemberNormal {
if isCreator {
switch kit.Int(value[USER_PLACE_ROLE]) {
case 2:
button = append(button, s.Demote)
case 3:
button = append(button, s.Promote)
}
}
if isLeader {
switch kit.Int(value[USER_PLACE_ROLE]) {
case 3:
button = append(button, s.Disable)
}
}
} else {
m.PushButton()
if isCreator {
button = append(button, s.Enable, s.Remove)
} else if isLeader {
switch kit.Int(value[USER_PLACE_ROLE]) {
case 3:
button = append(button, s.Enable, s.Remove)
}
}
}
m.PushButton(button...)
})
s.SelectJoinUser(m, model.NAME, model.INFO, model.AVATAR, model.AUTH_UID)
s.SelectJoinAuth(m)
s.DisplayBase(m, "").DisplayCSS("")
m.Echo("count: %d", m.Length())
}
func init() { ice.TeamCtxCmd(member{Tables: newTables()}) }
func (s member) option(m *ice.Message, arg ...string) []string {
return m.OptionSimple(s.Keys(s.Place, model.UID), model.UID)
return kit.Simple(m.OptionSimple(s.Keys(s.Place, model.UID), model.UID), arg)
}
func (s member) recordEvent(m *ice.Message, icon, title, style string, arg ...string) {
s.RecordEvent(m, kit.JoinWord(icon, title, kit.Cut(m.Option(model.UID), 6), s.TransRole(m, "", style), m.Option(model.USER_NAME)), m.Option(model.UID))
}
type MemberStatus int

View File

@ -6,9 +6,10 @@ Volcanos(chat.ONIMPORT, {
{view: html.TITLE, list: [value.user_name,
can.onimport.authView(can, value), can.onimport.textView(can, value, USER_PLACE_ROLE),
value.member_status != "normal" && can.onimport.textView(can, value, "member_status"),
can.onimport.titleAction(can, value),
// can.onimport.titleAction(can, value),
]},
{view: html.STATUS, list: [value.user_info]},
can.onimport.titleAction(can, value),
]
})
},

BIN
src/gonganxitong/member.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -35,6 +35,7 @@ func (s message) List(m *ice.Message, arg ...string) {
model.FROM_USER_UID, model.COMMAND_NAME, model.MESSAGE_STATUS, model.SCORE,
model.PLACE_UID, model.SERVICE_NAME,
s.AS(model.NODENAME, model.SPACE), s.Key(s.command, model.INDEX), model.ARGS,
model.TITLE, model.CONTENT,
)
if len(arg) < 2 {
args := []string{model.TO_USER_UID, m.Option(model.USER_UID)}
@ -63,8 +64,19 @@ func (s message) List(m *ice.Message, arg ...string) {
}).Action()
m.RenameAppend(model.FROM_USER_UID, model.USER_UID)
s.SelectJoinRecent(m, model.PLACE_UID)
s.SelectJoinUser(m)
// s.SelectJoinUser(m)
s.DisplayBase(m, "")
msg := m.Spawn()
s.Fields(msg, "status, count(*) AS count").Groups(msg, model.STATUS).Orders(msg, model.STATUS)
s.Select(msg, args...).Table(func(value ice.Maps) {
switch status := kit.Int(value[model.STATUS]); m.CommandKey() {
default:
m.Echo(MessageStatus(status).String()).Echo(": ")
m.Echo(value[model.COUNT]).Echo("\n")
}
})
} else if len(arg) == 2 {
msg := s.SelectDetail(m.Spawn(), model.TO_USER_UID, m.Option(model.USER_UID), s.Key(s, model.UID), arg[1])
s.ProcessPodCmd(m, msg, model.MESSAGE_UID, arg[1])
@ -85,6 +97,23 @@ func (s message) Sticky(m *ice.Message, arg ...string) {
func (s message) UnSticky(m *ice.Message, arg ...string) {
s.update(m, ice.Map{model.SCORE: 0})
}
func (s message) PlaceEnter(m *ice.Message, arg ...string) {
// m.ProcessField()
}
func (s message) PlaceInfo(m *ice.Message, arg ...string) {
s.Tables(m, s.command, s.service).FieldsWithCreatedAT(m, s,
model.FROM_USER_UID, model.COMMAND_NAME, model.MESSAGE_STATUS, model.SCORE,
model.PLACE_UID, model.SERVICE_NAME,
s.AS(model.NODENAME, model.SPACE), s.Key(s.command, model.INDEX), model.ARGS,
model.TITLE, model.CONTENT,
)
s.Select(m, s.Key(s, model.UID), m.Option(model.MESSAGE_UID))
m.RenameAppend(model.FROM_USER_UID, model.USER_UID)
s.SelectJoinRecent(m, model.PLACE_UID)
s.SelectJoinUser(m, model.NAME, model.AVATAR, model.AUTH_UID)
s.SelectJoinAuth(m)
m.PushAction(s.MessagePlaceEnter)
}
func init() { ice.TeamCtxCmd(message{Table: newTable()}) }

View File

@ -5,10 +5,15 @@ Volcanos(chat.ONIMPORT, {
can.onimport.myView(can, msg, function(value) { var args = can.core.Split(value.args)
value.icons = value.user_avatar||value.icons; if (value.score > 0) { value._style = ["sticky"] }
return [
{view: html.TITLE, list: [value.place_name, value.command_name, value.detail||(args[1]||"").slice(0, 6), can.onimport.textView(can, value)]},
{view: html.STATUS, list: [value.city_name, value.street_name, value.service_name]},
{view: html.STATUS, list: [can.onimport.timeView(can, value), value.user_name]},
value.info && {view: html.OUTPUT, list: [value.info]},
{view: html.TITLE, list: [
value.command_name, value.title, can.onimport.textView(can, value),
]},
{view: html.STATUS, list: [
value.detail||(args[1]||"").slice(0, 6),
can.onimport.timeView(can, value), value.user_name,
]},
{view: html.STATUS, list: [value.city_name, value.street_name, value.place_name, value.service_name]},
{view: html.OUTPUT, list: [value.content]},
]
})
},

View File

@ -3,106 +3,124 @@ package model
import "shylinux.com/x/mysql-story/src/db"
const (
UID = "uid"
NAME = "name"
INFO = "info"
TYPE = "type"
ROLE = "role"
STATUS = "status"
TITLE = "title"
CONTENT = "content"
AVATAR = "avatar"
BACKGROUND = "background"
CREATED_AT = "created_at"
UPDATED_AT = "updated_at"
USER_UID = "user_uid"
USER_NAME = "user_name"
USER_INFO = "user_info"
USER_ROLE = "user_role"
USER_AVATAR = "user_avatar"
USER_BACKGROUND = "user_background"
USER_PLACE_ROLE = "user_place_role"
MEMBER_UID = "member_uid"
MEMBER_STATUS = "member_status"
PLACE_UID = "place_uid"
PLACE_NAME = "place_name"
PLACE_TYPE = "place_type"
PLACE_INIT = "place_init"
PLACE_ADDRESS = "place_address"
STREET_UID = "street_uid"
STREET_NAME = "street_name"
STREET_INFO = "street_info"
STREET_AVATAR = "street_avatar"
STREET_BACKGROUND = "street_background"
SCHOOL_NAME = "school_name"
COMPANY_NAME = "company_name"
CITY_UID = "city_uid"
CITY_NAME = "city_name"
CITY_INFO = "city_info"
CITY_AVATAR = "city_avatar"
CITY_BACKGROUND = "city_background"
AUTH_UID = "auth_uid"
AUTH_NAME = "auth_name"
AUTH_INFO = "auth_info"
AUTH_TYPE = "auth_type"
AUTH_STATUS = "auth_status"
AUTH_AVATAR = "auth_avatar"
AUTH_BACKGROUND = "auth_background"
DASHBOARD_UID = "dashboard_uid"
DASHBOARD_NAME = "dashboard_name"
DASHBOARD_TYPE = "dashboard_type"
STORAGE_UID = "storage_uid"
STORAGE_NAME = "storage_name"
STORAGE_TYPE = "storage_type"
QRCODE_TYPE = "qrcode_type"
APPLY_UID = "apply_uid"
APPLY_STATUS = "apply_status"
ALLOW_UID = "allow_uid"
ALLOW_STATUS = "allow_status"
EVENT_UID = "event_uid"
DOMAIN_UID = "domain_uid"
DOMAIN_NAME = "domain_name"
MARKET_UID = "market_uid"
COMMAND_UID = "command_uid"
COMMAND_ICON = "command_icon"
COMMAND_NAME = "command_name"
MESSAGE_UID = "message_uid"
MESSAGE_STATUS = "message_status"
SERVICE_UID = "service_uid"
SERVICE_ICON = "service_icon"
SERVICE_NAME = "service_name"
SERVICE_TYPE = "service_type"
SERVICE_STATUS = "service_status"
THUMB_COUNT = "thumb_count"
FAVOR_COUNT = "favor_count"
COMMENT_COUNT = "comment_count"
SHARE_COUNT = "share_count"
THUMB_STATUS = "thumb_status"
FAVOR_STATUS = "favor_status"
FROM_UID = "from_uid"
FROM_USER_UID = "from_user_uid"
TO_USER_UID = "to_user_uid"
BEGIN_TIME = "begin_time"
END_TIME = "end_time"
OPEN_ID = "open_id"
EMAIL = "email"
ADDRESS = "address"
PORTAL = "portal"
PORTAL_NAME = "portal_name"
NODE_NAME = "node_name"
NODENAME = "nodename"
NODETYPE = "nodetype"
SPACE = "space"
INDEX = "index"
FIELD = "field"
ICON = "icon"
ARGS = "args"
INIT = "init"
QUERY = "query"
VALUE = "value"
SCORE = "score"
LEVEL = "level"
UNIT = "unit"
UID = "uid"
NAME = "name"
INFO = "info"
TYPE = "type"
ROLE = "role"
STATUS = "status"
TITLE = "title"
CONTENT = "content"
AVATAR = "avatar"
BACKGROUND = "background"
CREATED_AT = "created_at"
UPDATED_AT = "updated_at"
DELETED_AT = "deleted_at"
USER_UID = "user_uid"
USER_NAME = "user_name"
USER_INFO = "user_info"
USER_ROLE = "user_role"
USER_AVATAR = "user_avatar"
USER_BACKGROUND = "user_background"
USER_PLACE_ROLE = "user_place_role"
MEMBER_UID = "member_uid"
MEMBER_STATUS = "member_status"
PLACE_UID = "place_uid"
PLACE_NAME = "place_name"
PLACE_TYPE = "place_type"
PLACE_INIT = "place_init"
PLACE_ADDRESS = "place_address"
STREET_UID = "street_uid"
STREET_NAME = "street_name"
STREET_INFO = "street_info"
STREET_AVATAR = "street_avatar"
STREET_BACKGROUND = "street_background"
SCHOOL_NAME = "school_name"
COMPANY_NAME = "company_name"
CITY_UID = "city_uid"
CITY_NAME = "city_name"
CITY_INFO = "city_info"
CITY_AVATAR = "city_avatar"
CITY_BACKGROUND = "city_background"
AUTH_UID = "auth_uid"
AUTH_NAME = "auth_name"
AUTH_INFO = "auth_info"
AUTH_TYPE = "auth_type"
AUTH_STATUS = "auth_status"
AUTH_AVATAR = "auth_avatar"
AUTH_BACKGROUND = "auth_background"
PAYMENTLIST_STATUS = "paymentlist_status"
DASHBOARD_UID = "dashboard_uid"
DASHBOARD_NAME = "dashboard_name"
DASHBOARD_TYPE = "dashboard_type"
STORAGE_UID = "storage_uid"
STORAGE_NAME = "storage_name"
STORAGE_TYPE = "storage_type"
QRCODE_TYPE = "qrcode_type"
APPLY_UID = "apply_uid"
APPLY_STATUS = "apply_status"
ALLOW_UID = "allow_uid"
ALLOW_STATUS = "allow_status"
EVENT_UID = "event_uid"
DOMAIN_UID = "domain_uid"
DOMAIN_NAME = "domain_name"
MARKET_UID = "market_uid"
COMMAND_UID = "command_uid"
COMMAND_ICON = "command_icon"
COMMAND_NAME = "command_name"
MESSAGE_UID = "message_uid"
MESSAGE_STATUS = "message_status"
SERVICE_UID = "service_uid"
SERVICE_ICON = "service_icon"
SERVICE_NAME = "service_name"
SERVICE_TYPE = "service_type"
SERVICE_STATUS = "service_status"
THUMB_COUNT = "thumb_count"
FAVOR_COUNT = "favor_count"
COMMENT_COUNT = "comment_count"
SHARE_COUNT = "share_count"
THUMB_STATUS = "thumb_status"
FAVOR_STATUS = "favor_status"
FROM_UID = "from_uid"
FROM_USER_UID = "from_user_uid"
TO_USER_UID = "to_user_uid"
BEGIN_TIME = "begin_time"
END_TIME = "end_time"
OPEN_ID = "open_id"
USER_ID = "user_id"
VENDOR = "vendor"
PHONE = "phone"
EMAIL = "email"
ADDRESS = "address"
PORTAL = "portal"
PORTAL_NAME = "portal_name"
NODE_NAME = "node_name"
NODENAME = "nodename"
NODETYPE = "nodetype"
SPACE = "space"
INDEX = "index"
FIELD = "field"
ICON = "icon"
ARGS = "args"
INIT = "init"
QUERY = "query"
VALUE = "value"
SCORE = "score"
LEVEL = "level"
UNIT = "unit"
LINK = "link"
AMOUNT = "amount"
ACCESS_TOKEN = "access_token"
EXPIRE_TIME = "expire_time"
PRICE = "price"
TOTAL = "total"
COUNT = "count"
GOODSLIST_UID = "goodslist_uid"
QUOTALIST_UID = "quotalist_uid"
PAYMENTLIST_UID = "paymentlist_uid"
SPENDLIST_UID = "spendlist_uid"
SPACE_ID = "space_id"
SIZE = "size"
)
type Sess struct {
@ -135,6 +153,86 @@ type City struct {
Name string `gorm:"type:varchar(64);index"`
}
type Goodslist struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
Name string `gorm:"type:varchar(32)"`
Title string `gorm:"type:varchar(64)"`
Content string `gorm:"type:varchar(128)"`
Amount int `gorm:"default:0"`
ExpireTime db.Time
}
type Paymentlist struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
GoodslistUID string `gorm:"type:char(32)"`
VendorUID string `gorm:"type:char(32)"`
Vendor string `gorm:"type:varchar(128)"`
Title string `gorm:"type:varchar(128)"`
Content string `gorm:"type:varchar(128)"`
Amount int32 `gorm:"default:0"`
Status uint8 `gorm:"default:0"`
Type uint8 `gorm:"default:0"`
}
type Quotalist struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
GoodslistUID string `gorm:"type:char(32);index"`
Title string `gorm:"type:varchar(64)"`
Content string `gorm:"type:varchar(128)"`
Vendor string `gorm:"type:varchar(128)"`
Total int `gorm:"default:0"`
}
type Spendlist struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
PaymentlistUID string `gorm:"type:char(32);index"`
QuotalistUID string `gorm:"type:char(32)"`
Vendor string `gorm:"type:varchar(128)"`
Total int `gorm:"default:0"`
Count int `gorm:"default:0"`
ExpireTime db.Time
}
type Meeting struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
Vendor string `gorm:"type:varchar(128)"`
UserID string `gorm:"type:varchar(32)"`
}
type Document struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
FolderID string `gorm:"type:varchar(128)"`
Vendor string `gorm:"type:varchar(128)"`
}
type Contract struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
}
type Photo struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
SpaceID string `gorm:"type:varchar(128)"`
AccessToken string `gorm:"type:varchar(512)"`
Vendor string `gorm:"type:varchar(128)"`
ExpireTime db.Time
}
type Setting struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32);index"`
Name string `gorm:"type:varchar(64)"`
Value string `gorm:"type:varchar(255)"`
}
type Apply struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index:idx_place"`
@ -146,9 +244,9 @@ type Apply struct {
}
type Allow struct {
db.ModelWithUID
ApplyUID string `gorm:"type:char(32)"`
PlaceUID string `gorm:"type:char(32);index:idx_place"`
UserUID string `gorm:"type:char(32);index:idx_place"`
ApplyUID string `gorm:"type:char(32)"`
Status uint8 `gorm:"default:0"`
}
type Event struct {
@ -162,23 +260,16 @@ type Notice struct {
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
}
type Setting struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32);index"`
Name string `gorm:"type:varchar(64)"`
Value string `gorm:"type:varchar(255)"`
}
type Domain struct {
db.ModelNameInfo
Order int `gorm:"default:0"`
}
type Market struct {
db.ModelContent
DomainUID string `gorm:"type:char(32);index"`
PlaceUID string `gorm:"type:char(32)"`
UserUID string `gorm:"type:char(32)"`
CommandUID string `gorm:"type:char(32)"`
PlaceUID string `gorm:"type:char(32)"`
Args string `gorm:"type:varchar(128)"`
ThumbCount int `gorm:"default:0"`
CommentCount int `gorm:"default:0"`
@ -207,16 +298,16 @@ type Favor struct {
type Command struct {
db.ModelWithUID
ServiceUID string `gorm:"type:char(32)"`
Index string `gorm:"type:varchar(64)"`
Index string `gorm:"type:varchar(128)"`
Name string `gorm:"type:varchar(32)"`
Icon string `gorm:"type:varchar(128)"`
}
type Message struct {
db.ModelWithUID
PlaceUID string `gorm:"type:char(32)"`
db.ModelContent
FromUserUID string `gorm:"type:char(32)"`
ToUserUID string `gorm:"type:char(32);index"`
CommandUID string `gorm:"type:char(32)"`
PlaceUID string `gorm:"type:char(32)"`
Args string `gorm:"type:varchar(128)"`
Status uint `gorm:"default:0"`
Score uint `gorm:"default:0"`
@ -254,7 +345,9 @@ type Support struct {
func init() {
db.CmdModels("",
&Sess{}, &User{}, &UserPlace{}, &Place{}, &Street{}, &City{},
&Apply{}, &Allow{}, &Event{}, &Notice{}, &Setting{},
&Goodslist{}, &Paymentlist{}, &Quotalist{}, &Spendlist{},
&Meeting{}, &Document{}, &Contract{}, &Photo{},
&Setting{}, &Apply{}, &Allow{}, &Event{}, &Notice{},
&Domain{}, &Market{}, &Thumb{}, &Comment{}, &Favor{},
&Command{}, &Message{}, &Recent{}, &Service{}, &Support{},
)

View File

@ -41,8 +41,9 @@ func (s notice) List(m *ice.Message, arg ...string) {
return
}
kit.If(s.IsLeader(m), func() {
m.PushAction(s.Remove)
s.Button(m, "")
if m.PushAction(s.Remove); m.Length() == 0 {
s.Button(m, "")
}
}, func() {
m.Action()
})

BIN
src/gonganxitong/notice.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,88 @@
package gonganxitong
import (
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/gonganxitong/model"
)
type paymentlist struct {
Table
order string `data:"92"`
auth string `data:"issued"`
role string `data:"leader,worker"`
fields string `data:"amount,title,content,paymentlist_status,goodslist_uid,user_uid"`
create string `name:"create amount* title* content" role:"leader"`
request string `name:"request" help:"支付" style:"notice" role:"void"`
response string `name:"response" role:"void"`
}
func (s paymentlist) Create(m *ice.Message, arg ...string) {
s.Insert(m, kit.Simple(s.TransPrice(m, arg, model.AMOUNT), m.OptionSimple(model.PLACE_UID, model.USER_UID))...)
s.RecordEventWithName(m, "")
}
func (s paymentlist) List(m *ice.Message, arg ...string) {
if len(arg) == 1 {
s.Select(m, model.PLACE_UID, arg[0], model.USER_UID, m.Option(model.USER_UID))
} else if len(arg) == 2 {
s.SelectDetail(m, model.PLACE_UID, arg[0], model.USER_UID, m.Option(model.USER_UID), model.UID, arg[1])
if PaymentStatus(kit.Int(m.Append(model.PAYMENTLIST_STATUS))) == PaymentCreate {
if !m.IsWeixinUA() {
m.EchoQRCode(s.Link(m, arg[0], m.PrefixKey(), arg[1])).Echo("请用微信扫码支付")
}
} else {
m.SetAppend().Cmdy(s.Prefix(m, spendlist{}), arg).Action()
return
}
} else {
return
}
m.Table(func(value ice.Maps) {
switch PaymentStatus(kit.Int(value[model.PAYMENTLIST_STATUS])) {
case PaymentCreate:
m.PushButton(s.Request)
case PaymentSuccess:
m.PushButton()
default:
m.PushButton()
}
}).Display("").Action()
s.SelectJoinUser(m)
}
func (s paymentlist) Request(m *ice.Message, arg ...string) {
s.cmdy(m, m.ActionKey(), kit.Simple(kit.Select(m.PrefixKey(), arg, 0), kit.Select("", arg, 1),
kit.Select(m.Option(model.PLACE_UID), arg, 2), kit.Select(m.Option(model.UID), arg, 3), kit.Slice(arg, 4))...)
}
func (s paymentlist) Response(m *ice.Message, arg ...string) {
if !s.cmdy(m, m.ActionKey(), arg...).IsErr() {
s.Update(m, kit.Dict(model.STATUS, PaymentSuccess), model.PLACE_UID, arg[0], model.UID, arg[1])
}
}
func init() { ice.TeamCtxCmd(paymentlist{Table: newTable()}) }
func (s paymentlist) cmdy(m *ice.Message, action ice.Any, arg ...string) *ice.Message {
return m.Cmdy(PaymentVendor, action, arg)
}
type PaymentStatus int
const (
PaymentCreate PaymentStatus = iota
PaymentSuccess
PaymentFailure
)
var PaymentStatusList = map[PaymentStatus]string{
PaymentCreate: "create",
PaymentSuccess: "success",
PaymentFailure: "failure",
}
func (s PaymentStatus) String() string { return PaymentStatusList[s] }
var PaymentVendor interface {
Request(m *ice.Message, arg ...string)
Response(m *ice.Message, arg ...string)
}

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.amount/100), can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.OUTPUT, list: [value.content]},
] })
},
})

67
src/gonganxitong/photo.go Normal file
View File

@ -0,0 +1,67 @@
package gonganxitong
import (
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/gonganxitong/model"
)
type photo struct {
Table
order string `data:"96"`
auth string `data:"issued"`
role string `data:"leader,worker"`
fields string `data:"space_id,access_token,expire_time,vendor"`
upload string `name:"upload" role:"worker"`
rename string `name:"rename newname" role:"worker"`
trash string `name:"trash" role:"worker"`
}
func (s photo) Config(m *ice.Message, arg ...string) {
s.InsertOrUpdate(m, arg, m.OptionSimple(model.PLACE_UID)...)
}
func (s photo) List(m *ice.Message, arg ...string) {
s.cmdy(m, PhotoVendor.Folder, kit.Slice(arg, 1)...)
m.PushAction(s.Rename, s.Trash).Display("")
if len(arg) == 1 {
s.Button(m, "请上传文件", s.Upload)
s.SpendlistCheck(m, 0)
}
}
func (s photo) Upload(m *ice.Message, arg ...string) {
if up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)); s.SpendlistCheck(m, kit.Int(up[2])) {
s.cmdy(m, "")
s.SpendlistUpdate(m, m.Append(model.SIZE))
}
}
func (s photo) Rename(m *ice.Message, arg ...string) {
s.cmdy(m, "")
}
func (s photo) Trash(m *ice.Message, arg ...string) {
s.cmdy(m, "")
s.SpendlistUpdate(m, m.Append(model.SIZE))
}
func init() { ice.TeamCtxCmd(photo{Table: newTable()}) }
func (s photo) cmdy(m *ice.Message, action ice.Any, arg ...string) {
if m.Option(model.AUTH_UID, s.StreetAuthUID(m, m.Option(model.PLACE_UID))) == "" {
return
}
if msg := s.Select(m.Spawn(), m.OptionSimple(model.PLACE_UID)...); msg.Append(model.SPACE_ID) == "" {
m.Echo("本服务暂未配置,请联系公司管理员配置")
} else {
kit.If(action == "", func() { action = m.ActionKey() })
_msg := m.Cmd(msg.Append(model.VENDOR), PhotoVendor.Token, msg.Append(model.SPACE_ID), msg.Append(model.ACCESS_TOKEN), msg.Append(model.EXPIRE_TIME))
m.Cmdy(msg.Append(model.VENDOR), action, m.Option(model.AUTH_UID), msg.Append(model.SPACE_ID), _msg.Append(model.ACCESS_TOKEN), arg)
}
}
var PhotoVendor interface {
Folder(m *ice.Message, arg ...string)
Upload(m *ice.Message, arg ...string)
Rename(m *ice.Message, arg ...string)
Trash(m *ice.Message, arg ...string)
Token(m *ice.Message, arg ...string)
}

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]},
{view: html.STATUS, list: [can.base.Size(value.size), can.base.TimeTrim(value.modify_time)]},
] })
},
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

View File

@ -1,43 +1,63 @@
body.dark { --plugin-bg-color:#0d1117; --output-bg-color:#171a22; }
body.mobile.light { --plugin-bg-color:#f4f5f9; --output-bg-color:#fefefd; }
body.mobile.light { --plugin-bg-color:#f4f5f9; --output-bg-color:white; }
body.mobile fieldset.Action div.input.float { position:static; }
body.mobile fieldset.Action div.input.float table { width:100%; }
body.mobile div.upload.float div.action { display:flex; }
body.mobile div.upload.float div.action div.item.upload { flex-grow:1; }
body.mobile div.upload.float div.action div.item.upload input { width:100%; }
$action { background-color:transparent; position:absolute; top:0; width:100%; z-index:1; }
$action div.item.button { margin-left:10px; margin-right:0; padding:0; height:48px; align-items:center; }
$body:not(.mobile) { background-color:var(--notice-bg-color); }
$body.dark { --plugin-bg-color:#0d1117; --output-bg-color:#171a22; }
$body.width1.light { --plugin-bg-color:#f4f5f9; --output-bg-color:#fefefd; }
$body.width1.light { --plugin-bg-color:#f4f5f9; --output-bg-color:white; }
$body.width1.light { --plugin-bg-color:#f3f3f4; --output-bg-color:white; --notice-bg-color:#006fff; }
$body.width1 fieldset.Action div.input.float { position:static; }
$body.width1 fieldset.Action div.input.float table { width:100%; }
$body.width1 div.upload.float div.action { display:flex; }
$body.width1 div.upload.float div.action div.item.upload { flex-grow:1; }
$body.width1 div.upload.float div.action div.item.upload input { width:100%; }
$body.width1 $action div.item.text.filter { flex-grow:1; }
$action { background-color:transparent; position:absolute; top:0; width:100%; z-index:1; display:none; }
$action div.item:last-child { margin-right:10px; }
$action div.item.text.filter input { width:100%; }
$action div.item { margin-left:10px; margin-right:0; padding:0; height:48px; align-items:center; }
$action div.item.button input { border:none; background-color:var(--plugin-bg-color); color:var(--notice-bg-color); min-width:60px; display:unset; }
$action div.item.button input:hover { background-color:var(--hover-bg-color); }
$action div.item.button span { display:none; }
$action div.item.button i { display:none; }
$output div.title div.action div.item.notice input { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
$output { background-color:var(--plugin-bg-color); }
$output>div.header { background-image:linear-gradient(var(--notice-bg-color), var(--plugin-bg-color)); height:300px; width:100%; position:absolute; top:-50px; left:0; }
$output>div.header { background-image:linear-gradient(var(--notice-bg-color), var(--plugin-bg-color)); height:240px; width:100%; position:absolute; left:0; }
$body.light $output>div.header { background-image:linear-gradient(#dbe7fe, var(--plugin-bg-color)); height:240px; width:100%; position:absolute; left:0; }
$output>div.header img { height:100%; width:100%; object-fit:cover; }
$output div.output>div.code { font-size:16px; position:relative; }
$output div.output>div.code img.avatar { border-radius:10px; height:64px !important; width:64px !important; object-fit:cover; position:absolute; top:153px; left:calc(50% - 32px); }
body.width6 $output>div.output>div.code img.avatar { top:183px; }
$output>div.action>div.list { margin:0 10px; }
$output>div>div.code { margin-bottom:240px; display:flex; flex-direction:column; align-items:center; }
$output div.output>div.code { font-size:16px; position:relative; }
$output div.output>div.code img.avatar {
border-radius:10px; object-fit:cover; --qrcode-icon-height:48px;
height:var(--qrcode-icon-height) !important; width:var(--qrcode-icon-height) !important;
position:absolute; top:calc(50% - var(--qrcode-icon-height) / 2 - 16px); left:calc(50% - var(--qrcode-icon-height) / 2);
}
$output>div>div.code { margin-bottom:20px; display:flex; flex-direction:column; align-items:center; }
$output>div>div.list { border-radius:10px; background-color:var(--output-bg-color); padding:10px; margin:10px; }
$output>div>div.list.myplace>div.output { padding:0 10px; max-height:320px; }
$output>div>div.list.myplace>div.output>div.item>div.output div.title span.type { line-height:18px; }
$output>div>div.list.myplace>div.output>div.item>div.output div.title span.role { line-height:18px; }
$output>div>div.list.myplace>div.output>div.item>div.output div.title { margin-bottom:5px; }
$output>div>div.list.mynotice { cursor:pointer; }
$output>div>div.list.mynotice:not(.hide) { display:flex; align-items:center; }
$output>div>div.list.mynotice>span.title { flex-grow:1; margin:0 5px; }
$output>div>div.list.mynotice>span:first-child { background-color:var(--hover-bg-color); color:var(--notice-bg-color); margin-right:5px; }
$output>div>div.list.mynotice>span:not(.title) { white-space:pre; }
$output>div>div.list.mynotice>span:first-child { background-color:var(--hover-bg-color); color:var(--notice-bg-color); padding:0 5px; margin-right:5px; }
$output>div>div.list.mynotice>span:last-child { color:gray; }
$output>div>div.list>div.title { font-weight:bold; display:flex; align-items:center; }
$output>div>div.list.mylist>fieldset>div.output { max-height:none !important; }
$output>div>div.list>div.title { font-weight:bold; display:flex; align-items:center; border-left:var(--box-notice3); padding-left:10px; }
body.width1 $output fieldset.story>div.output>div.place_info { min-height:68px; }
body.width1 $output fieldset.story>div.output>div.place_info>div.item>div.output { background-color:var(--plugin-bg-color); }
body.width1 $output fieldset.story>div.output>table.detail tr.user_name { display:none; }
body.width1 $output fieldset.story>div.output>table.detail tr.user_avatar { display:none; }
body.width1 $output fieldset.story>div.output>table.detail tr.created_at { display:none; }
$output>div>div.list.myallow>div.title { border-left:var(--box-danger3); padding-left:10px; }
$output>div>div.list.myorder>div.title { border-left:var(--box-danger3); padding-left:10px; }
$output>div>div.list>div.title span:first-child { flex-grow:1; }
$output>div>div.list>div.title div.action div.item.filter input:focus { width:320px; transition:width 0.5s; }
body.mobile $output>div>div.list>div.title div.action div.item.filter input:focus { width:200px; transition:width 0.5s; }
$output>div>div.list>div.title div.action div.item.filter input { transition:width 0.8s; }
$output>div>div.list>div.title div.action { overflow:hidden; }
$output>div>div.list>div.title div.action div.item { margin-right:5px; }
$output>div>div.list>div.title div.action div.item.button.icons input { display:none; }
$output>div>div.list>div.role:not(.hide) { display:flex; align-items:center; justify-content:space-around; }
$output>div>div.list>div.role span { padding:5px; cursor:pointer; }
$output>div>div.list>div.role span { padding:5px; cursor:pointer; white-space:pre; }
$output>div>div.list>div.role span:not(.select) { color:gray; }
$output>div>div.list>div.role span.select { border-bottom:var(--box-notice); }
$output>div>div.list>div.role span.creator.select { border-bottom:var(--box-danger); }
@ -47,10 +67,11 @@ $output>div>div.list>div.role span.leader.select { border-bottom:var(--box-dange
$output>div>div.list>div.role span.boss.select { border-bottom:var(--box-danger); }
$output>div>div.list>div.output>div.item.index:not(.hide) { padding:5px 10px; display:flex; flex-direction:column; align-items:center; float:left; }
$output>div>div.list>div.output>div.item.index img { height:36px; width:36px; object-fit:contain; }
$output>div>div.list>div.output>div.item.index span { font-size:12px; white-space:pre; }
$output>div>div.list>div.output>div.item.index i { font-size:22px; padding:5px; }
$output>div>div.list>div.output>div.item.index span { font-size:12px; white-space:pre; max-width:80px; }
$output>div>div.list div.code { text-align:center; }
$output>div>div.list div.code input { background-color:var(--notice-bg-color); color:var(--notice-fg-color); font-size:18px; margin:auto; min-width:200px; display:block; margin-top:10px; }
// $output>div>div.list fieldset.story>div.output { background-color:var(--output-bg-color); }
$output>div>div.list fieldset.story>div.output { background-color:var(--plugin-bg-color); }
$output div.head>img { height:200px; width:100%; object-fit:cover; }
$output div.head div.item.card img { border-radius:25px; }
$output div.head>div.item.card div.title div.item.button i { display:none; }
@ -58,61 +79,88 @@ $output div.tabs { height:32px; display:flex; position:unset; }
$output div.tabs span { padding:5px 10px; }
$output div.tabs span.select { background-color:var(--output-bg-color); color:var(--hover-fg-color); }
$output div.item.card:not(:last-child) { margin-bottom:2px; }
body:not(.mobile) $output div.item.card { background-color:var(--output-bg-color); flex-direction:row-reverse; }
body:not(.mobile) $output div.item.card>div.action { position:static; flex-shrink:0; }
body:not(.mobile) $output div.item.card>div.output { flex-grow:1; }
$output div.item.card>div.output>div { width:100%; }
$output div.item.card div.title { width:100%; display:flex; align-items:center; position:relative; }
$output div.item.card div.title span:first-child { word-break:break-all; }
$output div.item.card div.title span.auth { font-size:14px; }
$output div.item.card>div.output>div { width:100%; width:calc(100% - 53px); overflow:hidden; }
$output div.item.card div.title { width:100%; display:flex; position:relative; }
$output div.item.card div.title span.type { line-height:22px; }
$output div.item.card div.title span.status { line-height:22px; }
$output div.item.card div.title span.price { color:var(--danger-bg-color); margin-left:auto; }
$output div.item.card div.title span.auth { font-size:14px; padding:3px; }
$output div.item.card div.title span.time { position:absolute; right:0; font-size:12px; color:gray; }
$output div.item.card div.title span:first-child { word-break:break-all; }
$output fieldset.story>div.item.card div.title span { line-height:26px; }
$output div.item.title { border-left:var(--box-notice3); margin-left:10px; padding:10px; background-color:var(--plugin-bg-color); }
$output div.item.title.dealList { border-left:var(--box-danger3); }
$output div.item.title.meetList { border-left:var(--box-danger3); }
$body div.inputs>div.input.float>div.action { display:flex; }
$output div.item.card div.title div.action input { margin-right:0; }
$output div.item.card div.status span { word-break:break-all; }
$output div.item.card img { border-radius:5px; padding:0; margin:0; margin-right:10px; height:48px; width:48px; min-width:48px; object-fit:cover; }
$output div.item.card div.container img { margin-right:0; height:100%; width:100%; }
$output div.item.card div.container>div.action { position:relative; float:right; }
body:not(.mobile) $output div.item.card div.container>div.action { display:none; }
body.mobile $output div.item.card div.container>div.title>span.status { margin-left:auto; }
$output div.item.card.sticky>div.output { background-color:var(--plugin-bg-color); color:var(--notice-bg-color); }
$action div.item.notice input[type=button] { border:var(--box-notice); color:var(--notice-bg-color); }
// $action div.item.notice input[type=button] { border:var(--box-notice); color:var(--notice-bg-color); }
$action div.item input[type=button] { min-width:20px; padding:0 5px; }
$action div.item input[type=button] { color:var(--notice-bg-color); }
// $action div.item input[type=button] { border:var(--box-notice); color:var(--notice-bg-color); }
// $action div.item.text input { border:var(--box-notice); color:var(--notice-bg-color); }
// $action div.item.text input { color:var(--notice-bg-color); }
// $action div.item.text i { color:var(--notice-bg-color); }
$action div.item.danger input[type=button] { border:var(--box-danger); color:var(--danger-bg-color); }
$output input.notice[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
$output input.danger[type=button] { border:var(--box-danger); color:var(--danger-bg-color); }
$output input.notice[type=button]:hover { border:var(--box-notice); background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
$output input.notice[type=button]:not(:hover) { background-color:transparent; color:var(--notice-bg-color); }
$output input.danger[type=button]:not(:hover) { color:var(--danger-bg-color); }
$output input.danger[type=button]:hover { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
$output input[type=button][name=submit] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
$output span.type { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); padding:2px 8px; }
$output span.role { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); padding:2px 8px; }
$output span.status { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); padding:2px 8px; }
$output span.type { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); font-size:var(--status-font-size); line-height:22px; padding:2px 8px; }
$output span.role { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); font-size:var(--status-font-size); line-height:22px; padding:2px 8px; }
$output span.level { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); font-size:var(--status-font-size); line-height:22px; padding:2px 8px; }
$output span.status { border:none; border-radius:5px; background-color:var(--hover-bg-color); color:var(--notice-bg-color); font-size:var(--status-font-size); line-height:22px; padding:2px 8px; }
$output span.type.danger { color:var(--danger-bg-color); }
$output span.role.danger { color:var(--danger-bg-color); }
$output span.level.danger { color:var(--danger-bg-color); }
$output span.status.danger { color:var(--danger-bg-color); }
$output table.content { background-color:var(--output-bg-color); }
$output table.content td.action input.icons { display:unset; }
$output table.content td.action i { display:none; }
$output table.content.detail td.action input { padding:0 20px; min-width:80px; }
$output table.content.detail thead { display:none; }
$output table.content.detail td.action input { padding:0 10px; min-width:60px; }
$output table.content.detail tr.action input.icons { display:unset; }
$output table.content.detail tr.action i { display:none; }
$output table.content.detail tr.uid { display:none; }
$output table.content.detail input { border:none; }
$output>div.output>div.code { padding:10px; }
$output>fieldset.story { margin-top:48px; }
$output fieldset.story { box-shadow:none; }
$output fieldset.story>legend { display:none; }
$output fieldset.story>form.option { display:none; }
$output fieldset.story>div.action { display:none; }
$output fieldset.story>div.status { display:none; }
$output fieldset.story>div.output { background-color:var(--plugin-bg-color); }
$output>fieldset.story>div.output { background-color:var(--plugin-bg-color); }
$output fieldset.story>div.output div.code { padding:0; }
$output fieldset.story>div.output table.content td { box-shadow:none; }
$output fieldset.story>div.output table.content.detail td:last-child { text-align:left; }
$output fieldset.story>div.output table.content td img { max-width:100%; }
$output fieldset.story>div.output table.content tr.icon td img { max-height:128px; max-width:128px; }
$output fieldset.story>div.output table.content tr.user_avatar td img { max-height:128px; max-width:128px; }
$output fieldset.story>div.output table.content tr.auth_avatar td img { max-height:128px; max-width:128px; }
$output fieldset.story>div.output>div.code { text-align:center; }
$output fieldset.story>div.output>div.code>img { display:block; margin:auto; width:100%; max-width:390px; }
$output fieldset.story>div.output>div.code>input[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); margin-right:10px; float:right; }
$output fieldset.story>div.output>div.code { display:flex; flex-direction:column; row-gap:10px; margin-top:20px; margin-bottom:20px; }
$output fieldset.story>div.output>div.code>img { display:block; margin:auto; width:100%; max-width:320px; }
$output fieldset.story>div.output>div.code>input[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); float:right; }
$output fieldset.story>div.output>div.code>input[type=button].danger { border:var(--box-danger); background-color:transparent; color:var(--danger-bg-color); }
$output fieldset.story>div.output>div.code div.item.button { margin-top:20px; }
$output fieldset.story>div.output>div.code div.item.button input[type=button] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); font-size:18px; min-width:240px; height:36px; }
$output fieldset.story>div.output>div.code div.item.button input[type=button][name=cancel] { border:var(--box-border); background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
$output fieldset.story>div.output>div.code div.item.button.danger input[type=button] { background-color:var(--danger-bg-color); color:var(--danger-fg-color); }
$output>fieldset.story>div.output div.item.card>div.output { padding:10px; width:100%; }
$output>fieldset.story>div.output div.item.card.loaded>div.output { background-color:var(--plugin-bg-color); }
$output>fieldset.story>div.output div.item.card>div.output div.output { padding:5px 0; white-space:pre-line; }
$output fieldset.story.form>div.output>div.code>input[type=button] { font-size:18px; margin:10px; height:36px; }
$output>fieldset.story.web.team.renzhengshouquan.profile { margin-top:0; }
$output>fieldset.story.web.team.credit { margin-top:0; }
$output>fieldset.story.web.team.credit>div.output>div.code { margin-top:32px; }
// $output>fieldset.story.web.team.renzhengshouquan.profile { margin-top:0; }
// $output>fieldset.story.web.team.credit { margin-top:0; }
$output>fieldset.story.web.team.credit>div.output>div.code { margin-top:64px; }
$output>fieldset.message div.tabs span.select { border-top:var(--box-border); }
$output>fieldset.message div.tabs span.create.select { border-top:var(--box-danger); }
$output>fieldset.message div.tabs span.read.select { border-top:var(--box-notice); }
@ -120,26 +168,33 @@ $output>fieldset.qrcode table.content td { text-align:center; }
$output>fieldset.market>div.output>div.tabs { display:flex; width:100%; overflow:auto; height:30px; position:sticky; top:0; z-index:1; }
$output>fieldset.market>div.output>div.tabs>div.item { padding:5px 10px; float:left; white-space:pre; }
$output>fieldset.market>div.output>div.tabs>div.item.select { border-top:var(--box-danger); background-color:var(--output-bg-color); color:var(--danger-bg-color); font-weight:bold; position:sticky; left:0; right:0; }
$output>fieldset.market>div.output>div.list div.item.card img { border-radius:50%; height:40px; width:40px; }
$output>fieldset.market>div.output>div.list div.item.card div.status { font-size:14px; }
$output>fieldset.market>div.output>div.list div.item.card img { border-radius:50%; height:40px; width:40px; min-width:40px; }
$output>fieldset.market>div.output>div.list div.item.card div.status { font-size:12px; }
$output>fieldset.market>div.output>div.list div.item.card div.status>span.username { color:var(--body-fg-color); font-size:14px; }
$output>fieldset.market>div.output>div.list div.item.card div.status>span.time { float:right; }
$output>fieldset.market>div.output>div.list div.item.card div.output div.action { color:gray; font-size:14px; width:100%; max-width:100%; display:flex; justify-content:space-around; position:relative; }
$output>fieldset.market>div.output>div.list div.item.card div.output div.action i { margin-right:5px; }
$output>fieldset.market>div.output>div.list div.item.card div.output div.output { padding:10px 0; }
$output>fieldset.market>div.output>div.list div.item.card div.output div.action div.item.done { color:var(--notice-bg-color); }
$output.background>div.output { padding-top:120px; }
$output.public>div>div.list>div.title { display:none; }
$output.background>div.output { padding-top:80px; }
$output.public>div>div.list:not(.mylist)>div.title { display:none; }
$output.public>div>div.list.myplace>div.output { padding:0; }
$output.public>div>div.list.myplace div.item.card div.output { padding:0; }
fieldset.web.team.storage.file div.item.card div.title span:first-child { flex-grow:1; }
fieldset.web.team.renzhengshouquan.profile>div.output div.code { margin-top:60px; margin-bottom:240px; }
body.dark $output>div>div.list.mynotice>span:first-child { background-color:var(--hover-bg-color); color:yellow; white-space:pre; }
body.mobile $output img.qrcode { width:100%; margin:0; }
body.mobile div.input.float { position:absolute; top:0 !important; margin:0; width:100% !important; max-width:100% !important; }
body.mobile div.input.float input[name=submit] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body.mobile fieldset.panel.Action>div.output { background-color:var(--plugin-bg-color); }
body.width1 fieldset.panel.Action>div.output { background-color:var(--plugin-bg-color); }
body.width1 div.input.float { margin:0; width:100% !important; max-width:100% !important; }
body.width1 div.input.float input[name=submit] { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body.width1 $output>div>div.list>div.title div.action div.item.filter input:focus { width:200px; transition:width 0.5s; }
body.width6 $output>div.output>div.code img.avatar { top:183px; }
body:not(.width1) $output div.item.card { flex-direction:row-reverse; }
body:not(.width1) $output div.item.card>div.action { position:static; flex-shrink:0; }
body:not(.width1) $output div.item.card>div.output { flex-grow:1; }
body:not(.width1) $output div.item.card div.title div.action { display:none; }
body:not(.mobile) $output>fieldset.story>div.output div.item.card:not(:hover) { background-color:var(--output-bg-color); }
body:not(.mobile) $output div.item.card div.title div.action { display:none; }
body.en $output>fieldset table.content td:first-child { max-width:180px; width:unset;}
body:not(.mobile) $output div.tabs span:hover { background-color:var(--hover-bg-color); }
body:not(.mobile) $output>div>div.list>div.role span:hover { background-color:var(--hover-bg-color); }
body:not(.mobile) $output fieldset.story>div.output>div.code>input[type=button]:hover { border:var(--box-notice); background-color:transparent; color:var(--notice-bg-color); }
body:not(.mobile) $action div.item.notice input[type=button]:hover { background-color:var(--notice-bg-color); color:var(--notice-fg-color); }
body.en $output>fieldset table.content td:first-child { max-width:190px; min-width:100px; width:unset;}
body.en $output>fieldset table.content td { padding: 10px 5px; }
fieldset.web.team.storage.file div.item.card div.title span:first-child { flex-grow:1; }
$fieldset { box-shadow:none; }

View File

@ -1,6 +1,8 @@
package gonganxitong
import (
"strings"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
@ -25,10 +27,10 @@ type Portal struct {
service service
export string `data:"true"`
short string `data:"index"`
field string `data:"time,icons,name,index,order,enable,init,type,role,view,public"`
field string `data:"time,icons,name,index,order,enable,type,auth,role,view,init,portal"`
create string `name:"create index name icons"`
list string `name:"list place_uid index uid auto" role:"void"`
placeCreate string `name:"placeCreate city_name* street_name* place_name* place_type:select address" icon:"bi bi-plus-square-dotted" role:"void"`
placeCreate string `name:"placeCreate city_name* street_name* place_name* place_type:select address" icon:"bi bi-plus-circle" role:"void"`
placeRemove string `name:"placeRemove" role:"void"`
}
@ -42,6 +44,7 @@ func (s Portal) Exit(m *ice.Message, arg ...string) {
s.Hash.Exit(m, arg...)
}
func (s Portal) BeforeMigrate(m *ice.Message, arg ...string) {
return
if m.Cmd(web.CODE_MYSQL_CLIENT).Length() == 0 {
if s.AutoCmd(m, web.CODE_MYSQL_CLIENT).Table(func(value ice.Maps) { m.Cmd(web.CODE_MYSQL_CLIENT, s.Create, aaa.SESS, "", kit.Simple(value)) }).Length() == 0 {
m.Cmd(web.CODE_MYSQL_CLIENT, s.Create, aaa.SESS, "mysql", "driver", "mysql", "database", "mysql", tcp.HOST, "localhost", tcp.PORT, "10001", aaa.USERNAME, "root", aaa.PASSWORD, "root")
@ -74,6 +77,11 @@ func (s Portal) Command(m *ice.Message, arg ...string) {
}
}
func (s Portal) Run(m *ice.Message, arg ...string) {
if m.Option(model.MESSAGE_UID) != "" {
msg := m.Cmd(message{}, s.Table.Select, model.UID, m.Option(model.MESSAGE_UID))
m.Option(s.Keys(s.Place, model.UID), msg.Append(model.PLACE_UID))
m.Option(model.PLACE_UID, msg.Append(model.PLACE_UID))
}
if cmdPortal[arg[0]] != "" && cmdPortal[arg[0]] != m.PrefixKey() {
s.AutoCmdy(m, cmdPortal[arg[0]], ctx.ACTION, m.ActionKey(), arg)
return
@ -81,6 +89,7 @@ func (s Portal) Run(m *ice.Message, arg ...string) {
s.DisplayBase(m, "common.js")
m.Option(model.SERVICE_UID, ServiceUID(m))
m.Option(model.COMMAND_UID, CommandUID(m, arg[0]))
m.OptionDefault(model.PLACE_UID, m.Option(s.Keys(s.Place, model.UID)))
m.Search(arg[0], func(key string, cmd *ice.Command) {
role := cmd.Role
if len(arg) > 1 && arg[1] == ctx.ACTION {
@ -92,7 +101,10 @@ func (s Portal) Run(m *ice.Message, arg ...string) {
role = action.Role
} else {
m.Option(s.Keys(s.Place, model.UID), arg[1])
defer s.SelectJoinUser(m)
}
} else {
defer s.SelectJoinUser(m)
}
if action, ok := cmd.Actions["beforeAction"]; ok {
action.Hand(m.Message, arg[1:]...)
@ -100,10 +112,21 @@ func (s Portal) Run(m *ice.Message, arg ...string) {
if s.UserPlaceRole(m); kit.IsIn(role, "", aaa.VOID, aaa.TECH, aaa.ROOT) {
kit.If(!ctx.PodCmd(m.Message, arg) && aaa.Right(m.Message, arg), func() { m.Cmdy(arg) })
} else {
if !m.Cmdy(s.Place, s.CheckRole, kit.Split(role)).IsErr() {
if role == "worker" {
if !m.WarnNotRight(!s.IsWorker(m)) {
m.Cmdy(arg)
}
} else if role == "leader" {
if !m.WarnNotRight(!s.IsLeader(m)) {
m.Cmdy(arg)
}
} else if !m.Cmdy(s.Place, s.CheckRole, kit.Split(role)).IsErr() {
m.Cmdy(arg)
}
}
if len(arg) > 0 && strings.HasSuffix(arg[0], ".portal") {
return
}
if kit.IndexOf(arg, mdb.INPUTS) == -1 {
s.Place.RewriteAppend(m)
}
@ -114,6 +137,18 @@ func (s Portal) List(m *ice.Message, arg ...string) {
s.Hash.List(m, kit.Slice(arg, 1)...).PushAction(mdb.DETAIL, s.Hash.Remove).Action().SortInt(mdb.ORDER)
return
}
if m.Option(model.USER_UID) == "" {
if msg := m.Cmd(s.user, s.Table.Select, model.OPEN_ID, m.Option(ice.MSG_USERNAME)); msg.Length() == 0 {
msg := m.Cmd(s.user, s.Table.Create, m.Option(ice.MSG_USERNAME), "", m.OptionDefault(ice.MSG_USERNICK, m.Option(ice.MSG_USERNAME)))
m.ProcessCookie(model.USER_UID, msg.Result())
} else {
m.ProcessCookie(model.USER_UID, msg.Append(model.UID))
}
return
}
if m.Cmd(s.user, s.Table.Select, model.UID, m.Option(model.USER_UID)).Length() == 0 {
m.Cmd(s.user, s.Table.Insert, model.UID, m.Option(model.USER_UID), model.OPEN_ID, m.Option(ice.MSG_USERNAME), model.NAME, m.OptionDefault(ice.MSG_USERNICK, m.Option(ice.MSG_USERNAME)))
}
m.Option(model.SERVICE_UID, ServiceUID(m))
if len(arg) == 0 {
m.Cmdy(m.PrefixKey(), s.PlaceList, m.Option(model.USER_UID)).PushAction(s.PlaceRemove).Action(s.PlaceCreate)
@ -125,8 +160,18 @@ func (s Portal) List(m *ice.Message, arg ...string) {
defer m.EchoQRCode(m.Cmdx("", s.Link, arg[0]))
}
s.Hash.List(m).SortInt(mdb.ORDER)
m.RewriteAppend(func(value, key string, index int) string {
if key == "icons" {
value = m.Resource(value)
}
return value
})
}
s.Place.RewriteAppend(m)
if true {
p := kit.ExtChange(m.Resource(ctx.GetCmdFile(m.Message, m.PrefixKey())), "js")
defer func() { m.Option(ice.MSG_DISPLAY, p+","+m.Option(ice.MSG_DISPLAY)) }()
}
s.DisplayBase(m, "").DisplayCSS("")
}
func (s Portal) PlaceListOption(m *ice.Message, arg ...string) *ice.Message {
@ -137,7 +182,11 @@ func (s Portal) PlaceListOption(m *ice.Message, arg ...string) *ice.Message {
return msg
}
msg.Push(s.Keys(s.UserPlace, model.ROLE), "0")
msg.RenameAppend(model.NAME, s.Keys(s.Place, model.NAME), model.TYPE, s.Keys(s.Place, model.TYPE))
msg.RenameAppend(model.NAME, s.Keys(s.Place, model.NAME),
model.INFO, s.Keys(s.Place, model.INFO),
model.AVATAR, s.Keys(s.Place, model.AVATAR),
model.TYPE, s.Keys(s.Place, model.TYPE),
)
s.SelectJoin(msg, s.Street, model.NAME, model.CITY_UID)
s.SelectJoinCity(msg)
s.SelectJoinAuth(msg)
@ -146,10 +195,8 @@ func (s Portal) PlaceListOption(m *ice.Message, arg ...string) *ice.Message {
msg.Append(model.DASHBOARD_UID, "")
}
s.Place.RewriteAppend(msg)
m.Options(msg.AppendSimple(
s.Keys(s.Place, model.NAME), s.Keys(s.Place, model.TYPE), s.Keys(s.UserPlace, model.ROLE),
model.CITY_NAME, s.Keys(s.Street, model.NAME),
model.MEMBER_STATUS,
m.Options(msg.AppendSimple(model.CITY_NAME, s.Keys(s.Street, model.NAME),
s.Keys(s.Place, model.NAME), s.Keys(s.Place, model.TYPE), s.Keys(s.UserPlace, model.ROLE), model.MEMBER_STATUS,
model.AUTH_STATUS, model.AUTH_NAME, model.AUTH_INFO, model.AUTH_AVATAR, model.AUTH_BACKGROUND, model.DASHBOARD_UID,
))
m.Option(model.STREET_NAME, msg.Append(s.Keys(s.Street, model.NAME)))
@ -179,6 +226,60 @@ func (s Portal) PlaceRemove(m *ice.Message, arg ...string) {
m.Cmd("", s.BeforePlaceRemove, m.OptionSimple(model.USER_UID, model.UID))
m.Cmdy(s.UserPlace, s.Delete, m.OptionSimple(model.USER_UID, model.UID))
}
func (s Portal) PlaceCheck(m *ice.Message, arg ...string) {
if m.PrefixKey() == api.RENZHENGSHOUQUAN_PORTAL {
return
}
s.Tables(m, kit.Format("LEFT JOIN %s ON %s = %s and %s IS NULL",
s.TableNames(s.UserPlace),
s.Key(s.UserPlace, s.Keys(s.Place, model.UID)),
s.Key(s.Place, model.UID),
s.Key(s.UserPlace, model.DELETED_AT),
)).Fields(m,
s.Key(s.Place, model.UID),
s.Key(s.Place, model.NAME),
s.Key(s.Place, model.INFO),
s.Key(s.Place, model.AUTH_UID),
)
m.Cmdy(s.Place, s.Table.Select, kit.Format("%s IS NULL", model.USER_UID))
m.Table(func(value ice.Maps) { m.Push(model.INDEX, m.PrefixKey()) }).DisplayTable()
}
func (s Portal) PlaceTrash(m *ice.Message, arg ...string) {
m.Cmd(s.PrefixPortal(m), s.AfterPlaceTrash)
defer m.Cmd(s.PrefixPortal(m), s.BeforePlaceTrash)
m.Option("__place_uid", s.Keys(s.Place, model.UID))
for key, _ := range m.Target().Commands {
if strings.HasPrefix(key, "_") {
continue
}
if kit.IsIn(key, "cleanup", "portal", "service") {
continue
}
if s.Key(s.UserPlace, model.UID) == kit.Keys(s.TableName(key), model.UID) {
continue
}
if s.Key(s.Place, model.UID) == kit.Keys(s.TableName(key), model.UID) {
continue
}
m.Cmdy(m.Prefix(key), s.PlaceTrash)
}
if m.Cmd(s.Place, s.Delete); m.PrefixKey() == api.RENZHENGSHOUQUAN_PORTAL {
m.Cmd(s.UserPlace, s.RemoveBy, model.AUTH_UID, m.Option(model.UID))
}
m.DisplayTable()
}
func (s Table) PlaceTrash(m *ice.Message, arg ...string) {
if m.Configv("db") == nil {
return
}
if m.Push("key", m.PrefixKey()); s.Place == nil {
s.RemoveBy(m, kit.Format("%s = ?", m.Option("__place_uid")), m.Option(model.UID))
m.Push("table", s.TableName(m.CommandKey())).Push(model.PLACE_UID, m.Option("__place_uid"))
} else {
s.RemoveBy(m, "place_uid = ?", m.Option(model.UID))
m.Push("table", s.TableNames(s.Place)).Push(model.PLACE_UID, "place_uid")
}
}
func (s Portal) PlaceList(m *ice.Message, arg ...string) *ice.Message {
s.Tables(m, s.Place).FieldsWithCreatedAT(m, s.UserPlace, s.Keys(s.Place, model.UID),
s.Keys(s.Place, model.NAME), s.Keys(s.Place, model.TYPE), s.Keys(s.UserPlace, model.ROLE),
@ -251,6 +352,8 @@ func (s Portal) BeforePlaceCreate(m *ice.Message, arg ...string) {}
func (s Portal) AfterPlaceCreate(m *ice.Message, arg ...string) {}
func (s Portal) BeforePlaceRemove(m *ice.Message, arg ...string) {}
func (s Portal) AfterPlaceRemove(m *ice.Message, arg ...string) {}
func (s Portal) BeforePlaceTrash(m *ice.Message, arg ...string) {}
func (s Portal) AfterPlaceTrash(m *ice.Message, arg ...string) {}
func (s Portal) BeforePlaceAuth(m *ice.Message, arg ...string) {}
func (s Portal) AfterPlaceAuth(m *ice.Message, arg ...string) {}
@ -263,6 +366,11 @@ func (s Portal) RecordEvent(m *ice.Message, arg ...string) {
s.event.Record(m.Spawn(kit.Dict(model.PLACE_UID, m.Option(s.Keys(s.Place, model.UID)))), arg[0], arg[1:]...)
}
func (s Portal) MarketInsert(m *ice.Message, arg ...string) {
// m.Option(model.PLACE_UID, m.Option(s.Keys(s.Place, model.UID)))
m.Option(ctx.ARGS, kit.Join([]string{m.Option(model.PLACE_UID), m.Option(model.UID)}))
m.Cmdy(s.Prefix(m, market{}), s.Create, arg)
}
func (s Portal) PushPublic(m *ice.Message, arg ...string) {
m.Option(model.PLACE_UID, m.Option(s.Keys(s.Place, model.UID)))
m.Option(ctx.ARGS, kit.Join([]string{m.Option(model.PLACE_UID), m.Option(model.UID)}))
m.Cmdy(s.Prefix(m, market{}), s.Create, arg)
@ -286,11 +394,11 @@ func (s Portal) DashboardUpdate(m *ice.Message, arg ...string) {
}
func (s Portal) StorageCreate(m *ice.Message, name string, arg ...string) {
kit.If(name == "", func() { name = m.Option(s.Keys(s.Place, model.NAME)) })
s.AutoCmdy(m, api.STORAGE_PORTAL, s.PlaceCreate, m.OptionSimple(model.CITY_NAME, model.COMPANY_NAME), model.STORAGE_NAME, name, model.STORAGE_TYPE, "0")
// s.AutoCmdy(m, api.STORAGE_PORTAL, s.PlaceCreate, m.OptionSimple(model.CITY_NAME, model.COMPANY_NAME), model.STORAGE_NAME, name, model.STORAGE_TYPE, "0")
s.AutoCmd(m, api.RENZHENGSHOUQUAN_AUTH, s.UpdateField, m.OptionSimple(model.STORAGE_UID))
}
func (s Portal) StorageInsert(m *ice.Message, title, content string) {
s.AutoCmd(m, api.STORAGE_FILE, s.Insert, model.TITLE, title, model.CONTENT, content, m.OptionSimple(model.STORAGE_UID, model.USER_UID))
// s.AutoCmd(m, api.STORAGE_FILE, s.Insert, model.TITLE, title, model.CONTENT, content, m.OptionSimple(model.STORAGE_UID, model.USER_UID))
}
func (s Table) NoticeList(m *ice.Message, arg ...string) {
s.Limit(m, 1)
@ -332,7 +440,7 @@ func (s Portal) Create(m *ice.Message, arg ...string) {
kit.If(msg.Length() > 0, func() { args = append(args, mdb.TIME, msg.Append(mdb.TIME)) })
m.Search(m.Option(ctx.INDEX), func(key string, cmd *ice.Command) {
args = append(args, mdb.NAME, cmd.Help, mdb.ICONS, cmd.Icon)
kit.For([]string{mdb.ORDER, mdb.TYPE, aaa.ROLE, mdb.VIEW}, func(key string) {
kit.For([]string{mdb.ORDER, mdb.TYPE, aaa.ROLE, aaa.AUTH, mdb.VIEW}, func(key string) {
value := m.Conf(m.Option(ctx.INDEX), kit.Keym(key))
args = append(args, key, kit.Select(value, msg.Append(key)))
})
@ -348,8 +456,12 @@ func (s Portal) Link(m *ice.Message, arg ...string) *ice.Message {
if len(arg) == 0 {
return m.Echo(m.MergePodCmd("", s.Prefix(m, s)))
}
return m.Echo(m.MergePodCmd("", s.Prefix(m, s), s.Keys(s.Place, model.UID), arg[0]) +
"#" + kit.TrimSuffix(kit.Join([]string{arg[0], kit.Select("", arg, 1), kit.Select("", arg, 2)}, ":"), ":", ":"))
p := m.MergePodCmd("", s.Prefix(m, s), s.Keys(s.Place, model.UID), arg[0])
if len(arg) == 1 {
return m.Echo(p)
}
h := kit.TrimSuffix(kit.Join([]string{arg[0], kit.Select("", arg, 1), kit.Select("", arg, 2)}, ":"), ":", ":")
return m.Echo(p + "#" + h)
}
func init() { ice.TeamCtxCmd(Portal{Table: newTable()}) }

View File

@ -1,12 +1,35 @@
var UID = "uid", PLACE_UID = "place_uid", PLACE_NAME = "place_name", PLACE_TYPE = "place_type", STREET_NAME = "street_name", CITY_NAME = "city_name"
var USER_UID = "user_uid", USER_ROLE = "user_role", AUTH_UID = "auth_uid", AUTH_TYPE = "auth_type"
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { can.onappend.style(can, html.OUTPUT), can.onimport.myPortal(can, msg) },
_init: function(can, msg) {
can.onappend.style(can, html.OUTPUT), can.onimport.myPortal(can, msg)
},
otherList: function(can, msg, action) { if (!msg.IsDetail()) { return } typeof action == "string" && (action = [action])
can.core.Next(action, function(action, next) {
can.run(can.request({}, {uid: msg.Append(UID)}), action, function(msg) { if (msg.Length() == 0) { return next() }
can.page.Append(can, can._output, [{view: [[html.ITEM, html.TITLE, action], "", can.user.trans(can, action)]}])
can.onappend.plugin(can, {index: can.ConfIndex()}, function(sub) { can.onimport.myField(can, sub)
sub.run = function(event, cmds, cb) {
if (!cmds || cmds.length == 0) { cb(msg) } else { can.run(event, cmds, cb) }
}, next()
sub.onexport.output = function(_sub, msg) {
_sub.onaction.carddetail = function(event, _sub, value) {
can.onimport.myStory(can, {index: msg.Option("_command"), args: [msg.Option("place_uid"), value.uid]})
return true
}
}
})
})
})
},
qrcode: function(can, msg, avatar, target) { target = target||can.ui.output, can.onappend.board(can, msg, target)
can.page.Append(can, can.page.SelectOne(can, target, "div.code"), [{img: can.misc.Resource(can, avatar||can.ConfIcons()||can.user.info.favicon), className: "avatar"}])
},
myValue: function(can, value) { return [
{view: html.TITLE, list: [value.auth_name||value._name, can.onimport.authView(can, value),
{text: [value.__type, "", [mdb.TYPE, value._type, value._type_style]]}, value._role != "visitor" && {text: [value.__role, "", [aaa.ROLE, value._role, value._role_style]]},
]},
{view: html.STATUS, list: [value.city_name, value._street, can.ConfHelp(), can.user.info.titles]},
can.ConfIndex() != "web.team.renzhengshouquan.portal" && {view: html.STATUS, list: [value.city_name, value._street, can.ConfHelp(), can.user.info.titles]},
{view: html.STATUS, list: [value.auth_info||value._info]},
] },
myTrans: function(can, value) {
@ -21,20 +44,23 @@ Volcanos(chat.ONIMPORT, {
myTitle: function(can, name, help, target) {
can.page.Appends(can, target||can.ui.list, [{view: html.TITLE, list: [{text: can.user.trans(can, name, help)}]}])
},
qrcode: function(can, msg, avatar, target) { target = target||can.ui.output, can.onappend.board(can, msg, target)
can.page.Append(can, can.page.SelectOne(can, target, "div.code"), [{img: can.misc.Resource(can, avatar||can.ConfIcons()||can.user.info.favicon), className: "avatar"}])
},
myPortal: function(can, msg) { can.sup.current = {}
can.page.tagis(document.body, "body.width1") && (can.user.isMobile = true, can.sup.user.isMobile = true)
can.onmotion.delay(can, function() {
can.page.tagis(document.body, "body.width1") && (can.user.isMobile = true, can.sup.user.isMobile = true)
}, 300)
can.core.List(["_place_uid", "_place_name", "_place_type", "_user_place_role", "_street_name"], function(key) { can.Conf(key, msg.Option(key)) })
var PLACE_UID = can.Conf("_place_uid"), PLACE_NAME = can.Conf("_place_name"), PLACE_TYPE = can.Conf("_place_type")
var USER_PLACE_ROLE = can.Conf("_user_place_role"), STREET_NAME = can.Conf("_street_name")
can.user.isMobile && (can.db.hash = [])
can.isCmdMode() && (can.db.hash = can.base.Obj(can.misc.SearchHash(can), can.db.hash)), can.db.hash[0] && can.onexport.place(can, can.db.hash[0])
if (can.sup._goback) { can.db.hash = can.db.hash.slice(0, 1) }
if (can.db.hash.length > 1 && can.db.hash[1]) {
can.sup.current = can.onimport.myTrans(can, kit.Dict(msg.OptionSimple(PLACE_UID, PLACE_NAME, PLACE_TYPE, USER_PLACE_ROLE, STREET_NAME, CITY_NAME)))
return can.runAction({}, ctx.COMMAND, [can.db.hash[1]], function(msg) { msg.Table(function(value) {
value.args = [can.db.hash[0]].concat(can.db.hash.slice(2)), can.onimport.myStory(can, value)
}) })
} else {
}
can.ui = can.page.Append(can, can._output, [{view: html.HEADER},
{view: html.OUTPUT, list: ["myplace.list", "myinit.list", "mycount.list", "mynotice.list", "myindex.list", "myallow.list", "mylist.list"]},
@ -53,7 +79,9 @@ Volcanos(chat.ONIMPORT, {
can.onimport.myOrder(can, msg, can.ui.myorder)
}
if (can.Option(PLACE_UID) == "") { var uid = can.onimport.myPlace(can, msg, can.ui.myplace)
if (msg.Length() > 0) { msg.Echo(can.ConfHelp()+" "+can.user.info.titles), can.onimport.qrcode(can, msg) }
if (msg.Length() > 0) { msg.Echo(can.ConfHelp()+" "+can.user.info.titles)
can.misc.isDebug(can) && can.onimport.qrcode(can, msg)
}
msg.Length() > 0? can.run({}, [uid], function(msg) { showIndex(can._index_msg = msg) }): can.run({}, [uid], function(msg) { can.onimport.myOrder(can, can._index_msg = msg, can.ui.myorder) })
} else { can.onappend.style(can, "public", can._output)
var _msg = can.request({}); if (msg.Option(PLACE_NAME)) { _msg.Push(kit.Dict(UID, "", msg.OptionSimple(
@ -63,7 +91,8 @@ Volcanos(chat.ONIMPORT, {
if (_msg.Length() == 0) { can.onimport.myOrder(can, msg, can.ui.myorder) } else { showIndex(can._index_msg = msg) }
can.user.agent.init(can, [msg.Option(CITY_NAME), msg.Option(STREET_NAME), msg.Option("auth_info")].join(" "), msg.Option("auth_avatar"))
msg.Echo([msg.Option(CITY_NAME), msg.Option(STREET_NAME), msg.Option(PLACE_NAME)].join(" "))
can.onexport.value(can, can.sup.current), can.onimport.qrcode(can, msg, can.sup.current.auth_avatar)
can.onexport.value(can, can.sup.current)
can.misc.isDebug(can) && can.onimport.qrcode(can, msg, can.sup.current.auth_avatar)
}
},
myPlace: function(can, msg, target) { var place_uid
@ -108,16 +137,18 @@ Volcanos(chat.ONIMPORT, {
can.runAction({}, "noticeList", [value._uid], function(msg) {
if (msg.Length() == 0) { value._notice_hide = true; return can.onmotion.hidden(can, target) } can.onmotion.toggle(can, target, true)
can.page.Append(can, target, [
{text: " [ 通知公告 ] "}, {text: can.base.TimeTrim(msg.Append("created_at"))}, {text: " "}, {text: [msg.Append("title"), "", "title"]}, {text: "查看更多 >"},
{text: can.user.trans(can, "[ notice ]", " [ 公告 ] ")}, {text: can.base.TimeTrim(msg.Append("created_at"))}, {text: " "},
{text: [msg.Append("title"), "", "title"]}, {text: can.user.trans(can, "more >", "更多 >")},
])
})
},
myList: function(can, msg, target) {
var width = (can.ConfWidth()-40)/parseInt((can.ConfWidth()-40)/80); can.user.isMobile && !can.user.isLandscape() && (width = (can.ConfWidth()-40)/5)
myList: function(can, msg, target) { var width = (can.ConfWidth()-40)/parseInt((can.ConfWidth()-40)/60);
(can.page.tagis(document.body, "body.width1") || can.user.isMobile && !can.user.isLandscape()) && (width = (can.ConfWidth()-40)/5)
can.page.Append(can, target, msg.Table(function(value) { if (value.enable == ice.FALSE) { return }
if (value.public && can.page.tagis(can._output, "div.output.public")) { can.onimport.myTitle(can, value.index, value.name, can.ui.mylist)
can.onmotion.toggle(can, can.ui.mylist, true)
can.onappend.plugin(can, {index: value.index, args: [can.sup.current._uid]}, function(sub) {
if ((value.portal || value.public) && can.page.tagis(can._output, "div.output.public")) {
can.onimport.myTitle(can, value.index, value.name, can.ui.mylist), can.onmotion.toggle(can, can.ui.mylist, true)
can.onappend.plugin(can, {index: value.index, args: [can.sup.current._uid], width: can.ConfWidth()-40}, function(sub) {
sub.onimport._field = function(msg) { msg.Table(function(value) { can.onimport.myStory(can, value) }) }
sub.onexport.output = function(_sub, msg) {
_sub.onaction.carddetail = function(event, _sub, value) {
can.onimport.myStory(can, {index: sub.ConfIndex(), args: [can.sup.current._uid, value.uid]})
@ -126,10 +157,23 @@ Volcanos(chat.ONIMPORT, {
}
}, can.ui.mylist)
}
var cmd = value.index.split(".").pop()
return {view: [[html.ITEM, ctx.INDEX].concat(
value.type? [mdb.TYPE]: [], can.core.Split(value.type||""), value.role? [aaa.ROLE]: [], can.core.Split(value.role||""),
value.auth, value.view,
)], style: {width: width}, list: [
{img: can.misc.ResourceIcons(can, value.icons)}, {text: can.user.trans(can, value.index.split(".").pop(), value.name)},
cmd == "market"? {icon: "bi bi-ubuntu"}:
cmd == "message"? {icon: "bi bi-card-checklist"}:
cmd == "recent"? {icon: "bi bi-clock-history"}:
cmd == "service"? {icon: "bi bi-box"}:
cmd == "support"? {icon: "bi bi-opencollective"}:
cmd == "qrcode"? {icon: "bi bi-qr-code"}:
cmd == "apply"? {icon: "bi bi-pencil-square"}:
cmd == "allow"? {icon: "bi bi-clipboard-check"}:
cmd == "event"? {icon: "bi bi-calendar4-week"}:
cmd == "notice"? {icon: "bi bi-megaphone"}:
{img: can.misc.ResourceIcons(can, value.icons)},
{text: can.user.trans(can, value.index.split(".").pop(), value.name)},
], onclick: function(event) {
can.onimport.myStory(can, {space: can.ConfSpace(), index: value.index, args: [can.onexport.place(can)||can.misc.Search(can, can.Conf("_place_uid"))]})
}}
@ -139,8 +183,7 @@ Volcanos(chat.ONIMPORT, {
var _msg = can.request(); msg.Table(function(value) { if (min < value.order && value.order < max) { _msg.Push(value) } })
var output = can.page.Append(can, target, [html.OUTPUT])._target; can.onimport.myList(can, _msg, output)
},
myIndex: function(can, msg, target) {
can.onimport.myTitle(can, "My Index", "我的应用", target)
myIndex: function(can, msg, target) { can.onimport.myTitle(can, "My Index", "我的应用", target)
var list = ["visitor", "creator", "landlord", "teacher", "leader", "boss", "tenant", "student", "worker", "custom", "admin", "parent", "server"]
var _list = can.Conf("_trans.value."+can.Conf("_user_place_role"))
can.core.Item(_list, function(key) { list.indexOf(key) == -1 && list.push(key) })
@ -163,38 +206,55 @@ Volcanos(chat.ONIMPORT, {
layout: function(can) {
can.ui.tabs && can.ui.list && can.page.styleHeight(can, can.ui.list, can.ConfHeight()-can.ui.tabs.offsetHeight)
if (can.ui.action && can.ui.output) {
can.page.style(can, can.ui.output, html.HEIGHT, (can.user.isMobile? window.innerHeight: can.ConfHeight()) - can.ui.action.offsetHeight)
// can.page.style(can, can.ui.output, html.HEIGHT, (can.user.isMobile? window.innerHeight: can.ConfHeight()) - can.ui.action.offsetHeight)
can.page.style(can, can.ui.output, html.HEIGHT, (can.ConfHeight()) - can.ui.action.offsetHeight)
}
},
})
Volcanos(chat.ONACTION, {
beforeInputs: function(event, can, button, sub) {
can.user.isMobile && can._root.Inputs.appendChild(sub._target)
can.user.isMobile && can.page.style(can, sub._target, html.LEFT, (can.page.width()-sub._target.offsetWidth)/2, html.TOP, 0)
can.user.isMobile && can.page.style(can, sub._target, html.MAX_HEIGHT, can.page.height())
can.user.isMobile && can._root.Inputs && can._root.Inputs.appendChild(sub._target)
can.user.isMobile && can.page.style(can, can._root.Action._output, html.VISIBILITY, html.HIDDEN)
sub.Option("city_name", "深圳市")
// sub.Option("city_name", "邹城市")
sub.Option("street_name", "航城街道")
if (!can.misc.isDebug(can)) { return }
sub.Option("street_name", "粤海街道")
sub.Option("school_name", "深圳中学")
sub.Option("company_name", "云境互联")
// sub.Option("company_name", "老邵木器加工")
sub.Option("place_name", "易尚三维")
sub.Option("company_name", "云轩领航")
sub.Option("place_name", "软件产业基地")
sub.Option("queue_name", "二楼产检")
sub.Option("group_name", "爬山群")
sub.Option("group_name", "销售部-华东地区")
sub.Option("class_name", "初一二班")
sub.Option("exam_name", "初一期末考试")
sub.Option("store_name", "老邵木器加工")
sub.Option("capital_name", "国资委")
sub.Option("channel_name", "公众号")
sub.Option("cloud_name", "系统云")
// sub.Option("repos_name", "ContextOS")
sub.Option("repos_name", "contexts")
sub.Option("story_name", "ContextOS")
sub.Option("reception_name", "科室1")
sub.Option("volume_amount", "100")
sub.Option("grade", "2024级")
},
afterInputs: function(event, can, button, sub) {
can.onmotion.delay(can, function() { can._root.Action.onlayout._init(can) })
can.user.isMobile && can.page.style(can, can._root.Action._output, html.VISIBILITY, "")
can.user.isMobile && can.page.style(can, can._root.Action._target, html.DISPLAY, "")
can.user.isMobile && can.onmotion.toggle(can, can._output, true)
},
request: function(event, can) {
can.runAction(event, "request", [], function(msg) { if(msg.IsErr()) { return can.user.toastFailure(can, msg.Result()) }
WeixinJSBridge.invoke('getBrandWCPayRequest', msg.Table()[0], function(res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
can.Update(), can.onimport.myStory(can, {index: "web.team.gonganxitong.paymentlist", args: [msg.Option("place_uid"), msg.Append("paymentlist_uid")]})
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
can.user.toast(can, "支付取消")
} else {
can.user.toast(can, "支付失败")
}
})
})
},
})
Volcanos(chat.ONEXPORT, {
@ -210,21 +270,28 @@ Volcanos(chat.ONEXPORT, {
can.ui.myinit && can.onimport.myInit(can, can._index_msg, value, can.ui.myinit)
can.ui.mycount && can.onimport.myCount(can, value, can.ui.mycount)
can.ui.mynotice && can.onimport.myNotice(can, value, can.ui.mynotice)
can.ui.myallow && can.onmotion.toggle(can, can.ui.myallow, status && (value._role == "creator" || can.page.Select(can, can.ui.myallow, "div.item.index.role."+value._role).length > 0))
can.ui.myallow && can.onmotion.toggle(can, can.ui.myallow, status && (value._role == "creator" || parseInt(value._role) > 0 || can.page.Select(can, can.ui.myallow, "div.item.index.role."+value._role).length > 0))
can.ui.myindex && can.onmotion.toggle(can, can.ui.myindex, status)
if (!can.onmotion.cache(can, function() { return value._uid }, can.ui.header) && value.auth_background) {
can.page.Append(can, can.ui.header, [{img: value.auth_background}])
can.page.ClassList.set(can, can._output, "background", !!can.ui.header.innerHTML)
// can.page.Append(can, can.ui.header, [{img: value.auth_background}])
// can.page.ClassList.set(can, can._output, "background", !!can.ui.header.innerHTML)
}
can.onimport.myOption(can.sup)
},
index: function(can, value, role) { role = role||value._role
can.ui.role && can.onmotion.toggle(can, can.ui.role, value._role == "creator")
can.ui.role && can.onmotion.select(can, can.ui.role, html.SPAN, can.page.SelectOne(can, can.ui.role, "span."+role))
parseInt(role) > 0 || can.ui.role && can.onmotion.select(can, can.ui.role, html.SPAN, can.page.SelectOne(can, can.ui.role, "span."+role))
can.page.Select(can, can.ui.myindex, html.DIV_ITEM, function(target) { var list = target.className.split(" ")
if (list.indexOf(mdb.TYPE) > -1 && list.indexOf(value._type) == -1) {
if (list.indexOf(log.DEBUG) > -1 && !can.misc.isDebug(can)) {
can.onmotion.toggle(can, target, false)
} else if (list.indexOf(aaa.TECH) > -1 && !can.user.isTechOrRoot(can)) {
can.onmotion.toggle(can, target, false)
} else if (list.indexOf(mdb.TYPE) > -1 && list.indexOf(value._type) == -1) {
can.onmotion.toggle(can, target, false)
} else if (list.indexOf(aaa.ROLE) > -1 && (list.indexOf(role) == -1 && role != "creator")) {
can.onmotion.toggle(can, target, false)
} else if (list.indexOf("issued") > -1 && value.auth_status != "issued") {
can.onmotion.toggle(can, target, false)
} else {
can.onmotion.toggle(can, target, true)
}

View File

@ -1,36 +1,35 @@
{
"portal": "用户场景", "placeCreate": "创建", "placeRemove": "删除",
"credit": "用户名片", "member": "组织成员", "setting": "服务配置", "email": "邮箱配置",
"credit": "用户名片", "member": "组织成员",
"goodslist": "在线商城", "paymentlist": "在线支付",
"meeting": "在线会议", "document": "在线文档", "contract": "在线合同", "photo": "在线相册",
"email": "邮箱配置", "setting": "服务配置",
"qrcode": "场景码", "event": "事件流", "apply": "权限申请", "allow": "权限审批", "notice": "通知公告",
"domain": "领域分类", "market": "人民广场", "message": "消息待办", "recent": "最近访问", "service": "服务发现", "support": "客服支持",
"cancel": "取消", "submit": "提交", "finish": "完成", "reject": "驳回", "approve": "通过",
"read": "已读", "done": "完成", "sticky": "置顶", "unSticky": "取消置顶",
"autogen": "生成", "compile": "编译", "oauth": "授权", "project": "项目",
"marketInsert": "推广", "commentCreate": "评论", "applyQRCode": "邀请码",
"marketInsert": "推广",
"marketPlaceEnter": "进入",
"pushPublic": "推广",
"applyCreate": "申请权限",
"commentCreate": "评论", "applyQRCode": "邀请码",
"user": "用户信息", "city": "城市信息", "street": "街道信息", "school": "学校信息", "company": "公司信息",
"auth": "认证", "authCreate": "认证申请", "authCity": "城市认证", "authPersonal": "个人认证", "authService": "服务认证", "authCompany": "公司认证",
"config": "配置", "code": "编程", "data": "数据",
"config": "配置", "code": "编程", "data": "数据", "cache": "缓存",
"promote": "升级", "demote": "降级",
"icons": {
"user": "https://img.icons8.com/officel/80/qr-code.png",
"city": "https://img.icons8.com/officel/80/qr-code.png",
"street": "https://img.icons8.com/officel/80/qr-code.png",
"qrcode": "https://img.icons8.com/officel/80/qr-code.png",
"event": "https://img.icons8.com/officel/80/property-with-timer.png",
"apply": "https://img.icons8.com/officel/80/edit-property.png",
"allow": "https://img.icons8.com/officel/80/receipt-approved.png",
"email": "https://img.icons8.com/officel/80/reading-confirmation.png",
"notice": "https://img.icons8.com/officel/80/commercial.png",
"setting": "https://img.icons8.com/officel/80/settings--v1.png",
"member": "https://img.icons8.com/officel/80/person-at-home.png",
"credit": "https://img.icons8.com/officel/80/passport.png",
"domain": "https://img.icons8.com/officel/80/categorize.png",
"market": "https://img.icons8.com/officel/80/square.png",
"message": "https://img.icons8.com/officel/80/test-partial-passed.png",
"recent": "https://img.icons8.com/officel/80/multiple-smartphones.png",
"service": "https://img.icons8.com/officel/80/activity-grid.png",
"support": "https://img.icons8.com/officel/80/customer-support.png"
"market": "bi bi-ubuntu",
"message": "bi bi-card-checklist",
"goodslist": "https://img.icons8.com/officel/80/online-store.png",
"paymentlist": "https://img.icons8.com/officel/80/online-payment-with-a-credit-card.png",
"meeting": "https://img.icons8.com/officel/80/video-conference.png",
"document": "https://img.icons8.com/officel/80/documents.png",
"contract": "https://img.icons8.com/officel/80/agreement.png",
"photo": "https://img.icons8.com/officel/80/ios-photos.png"
},
"style": {
"marketPlaceEnter": "notice",
"reject": "danger",
"approve": "notice",
"disable": "danger",
@ -62,6 +61,7 @@
"auth_status": "认证状态",
"auth_avatar": "认证头像",
"auth_background": "认证背景",
"paymentlist_status": "支付状态",
"qrcode_type": "链接类型",
"apply_status": "申请状态",
"allow_status": "审批状态",
@ -71,11 +71,14 @@
"service_name": "服务名称",
"begin_time": "起始时间",
"end_time": "结束时间",
"start_time": "开始时间",
"cancel_time": "取消时间",
"finish_time": "完成时间",
"created_at": "创建时间",
"operator": "操作人",
"operate": "操作",
"address": "场景地址",
"auth": "认证",
"init": "初始化",
"info": "详情",
"class": "基类",
@ -87,7 +90,7 @@
"creator": "创建人",
"landlord": "房东",
"tenant": "租客",
"admin": "管理员",
"admin": "管",
"style": {
"creator": "danger",
"landlord": "danger"

View File

@ -1,49 +0,0 @@
chapter "用户场景"
refer `
公众号 https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=494166701
ICON https://igoutu.cn/icons/officel
GORM https://gorm.io/docs/indexes.html
`
field web.chat.wx.access
field web.chat.wx.menu
field web.code.mysql.client
field web.code.mysql.query args `mysql gonganxitong`
field web.code.db.models
field web.code.db.mysql
order `
sess.go
user.go
userPlace.go
placeUser.go
place.go
street.go
city.go
qrcode.go
apply.go
apply.js
allow.go
allow.js
event.go
event.js
common.go
common.js
portal.css
portal.go
portal.js
portal.json
portal.shy
message.go
message.js
recent.go
recent.js
search.go
search.js
command.go
service.go
service.js
support.go
email.go
`

View File

@ -13,30 +13,33 @@ type qrcode struct {
portal Portal
order string `data:"501"`
role string `data:"leader"`
applyQRCode string `name:"applyQRCode" role:"void"`
applyQRCode string `name:"applyQRCode" help:"邀请码" role:"void"`
placeQRCode string `name:"placeQRCode" help:"场景码" role:"void"`
}
func (s Table) EchoQRCode(m *ice.Message, arg ...string) *ice.Message {
m.EchoQRCode(s.Link(m, arg...)).Echo("<img class='avatar' src='%s'/>", m.Resource(kit.Select(ice.Info.NodeIcon, m.Option(model.AUTH_AVATAR))))
return m
}
func (s qrcode) ApplyQRCode(m *ice.Message, arg ...string) {
m.Option(ice.MSG_FG, "blue")
s.info(m, arg[0], "apply")
s.EchoQRCode(m, arg[0], s.Prefix(m, s.apply)).Echo("请让申请人扫码,然后审批权限")
}
func (s qrcode) List(m *ice.Message, arg ...string) {
func (s qrcode) PlaceQRCode(m *ice.Message, arg ...string) {
s.info(m, arg[0], "portal")
s.EchoQRCode(m, arg[0])
m.Echo(kit.JoinWord(m.Append(model.CITY_NAME), m.Append(s.Keys(s.Street, model.NAME)), m.Append(s.Keys(s.Place, model.NAME))))
s.EchoQRCode(m, arg[0]).Echo(kit.JoinWord(m.Append(model.CITY_NAME), m.Append(s.Keys(s.Street, model.NAME)), m.Append(s.Keys(s.Place, model.NAME))))
}
func (s qrcode) List(m *ice.Message, arg ...string) {
s.PlaceQRCode(m, arg[0])
}
func init() { ice.TeamCtxCmd(qrcode{Tables: newTables()}) }
func (s Table) EchoQRCode(m *ice.Message, arg ...string) *ice.Message {
m.EchoQRCode(s.Link(m, arg...)).Echo("<img class='avatar' src='%s'/>", m.Resource(kit.Select(ice.Info.NodeIcon, m.Option(model.AUTH_AVATAR))))
return m
}
func (s qrcode) info(m *ice.Message, place_uid, cmd string) *ice.Message {
m.Cmdy(s.Prefix(m, s.portal), s.portal.PlaceList, m.Option(model.USER_UID), place_uid)
m.Option(model.AUTH_AVATAR, m.Append(model.AUTH_AVATAR))
m.Cut(model.CITY_NAME, s.Keys(s.Street, model.NAME), s.Keys(s.Place, model.NAME))
m.Push(model.QRCODE_TYPE, cmd).Action(s.ApplyQRCode)
m.Push(model.QRCODE_TYPE, cmd).Action(s.ApplyQRCode, s.PlaceQRCode)
return m
}

BIN
src/gonganxitong/qrcode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,78 @@
package gonganxitong
import (
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
"shylinux.com/x/community/src/gonganxitong/model"
)
type quotalist struct {
Table
fields string `data:"place_uid,title,content,vendor,total"`
}
func (s quotalist) AfterMigrate(m *ice.Message, arg ...string) {
s.Table.AfterMigrate(m, arg...)
if s.PrefixPortal(m) == api.RENZHENGSHOUQUAN_PORTAL {
s.insert(m, "service", "3-1", 10, "10人", "在线会议人数上限", api.GONGANXITONG_MEETING)
s.insert(m, "service", "3-2", 30, "30人", "在线会议人数上限", api.GONGANXITONG_MEETING)
s.insert(m, "service", "3-3", 50, "50人", "在线会议人数上限", api.GONGANXITONG_MEETING)
s.insert(m, "service", "3-1", 100*1024*1024, "100M", "在线文档存储容量", api.GONGANXITONG_DOCUMENT)
s.insert(m, "service", "3-2", 300*1024*1024, "300M", "在线文档存储容量", api.GONGANXITONG_DOCUMENT)
s.insert(m, "service", "3-3", 500*1024*1024, "500M", "在线文档存储容量", api.GONGANXITONG_DOCUMENT)
s.insert(m, "service", "3-1", 1024*1024*1024, "1G", "在线相册存储容量", api.GONGANXITONG_PHOTO)
s.insert(m, "service", "3-2", 3*1024*1024*1024, "3G", "在线相册存储容量", api.GONGANXITONG_PHOTO)
s.insert(m, "service", "3-3", 5*1024*1024*1024, "5G", "在线相册存储容量", api.GONGANXITONG_PHOTO)
s.insert(m, "company", "4-1", 10, "10个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
s.insert(m, "company", "4-2", 30, "30个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
s.insert(m, "company", "4-3", 50, "50个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
s.insert(m, "school", "5-1", 10, "10个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
s.insert(m, "school", "5-2", 30, "30个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
s.insert(m, "school", "5-3", 50, "50个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
s.insert(m, "street", "6-1", 10, "10个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
s.insert(m, "street", "6-2", 30, "30个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
s.insert(m, "street", "6-3", 50, "50个", "服务认证数量上限", api.RENZHENGSHOUQUAN_AUTH)
}
}
func (s quotalist) Matrix(m *ice.Message, arg ...string) {
msg := m.Spawn()
s.Tables(msg, goodslist{})
s.Fields(msg, "goodslist_title", "quotalist_title", "quotalists.content", "amount")
list := []string{}
data := kit.Dict()
amount := map[string]string{}
s.Select(msg).Table(func(value ice.Maps) {
kit.Value(data, kit.Keys(value["quotalist_title"], value["goodslist_title"]), value[model.CONTENT])
kit.If(kit.IndexOf(list, value["goodslist_title"]) == -1, func() { list = append(list, value["goodslist_title"]) })
amount[value["goodslist_title"]] = value[model.AMOUNT]
})
kit.For(data, func(key string, value ice.Any) {
m.Push("会员定价", key)
kit.For(list, func(k string) { m.Push(k, kit.Format(kit.Value(value, k))) })
})
m.Push("会员定价", "会员价/月")
kit.For(list, func(k string) { m.Push(k, kit.Format("¥ %v", kit.Float(amount[k])/100)) })
m.DisplayTable()
}
func (s quotalist) List(m *ice.Message, arg ...string) {
s.Matrix(m)
}
func init() { ice.TeamCtxCmd(quotalist{Table: newTable()}) }
func (s quotalist) insert(m *ice.Message, auth, level string, total int, content, title string, arg ...string) {
uid := kit.Hashs(auth, level, kit.Select(m.PrefixKey(), arg, 0))
if s.Select(m.Spawn(), model.UID, uid).Length() > 0 {
return
}
s.Insert(m, model.UID, uid, model.PLACE_UID, auth,
model.GOODSLIST_UID, kit.Hashs(auth, level), model.TITLE, title, model.CONTENT, content,
model.TOTAL, kit.Format(total), model.VENDOR, kit.Select(m.PrefixKey(), arg, 0))
}

View File

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

View File

@ -36,7 +36,7 @@ func (s recent) List(m *ice.Message, arg ...string) {
model.SERVICE_ICON, model.SERVICE_NAME, s.Key(s, model.AUTH_STATUS), model.SCORE,
s.Key(s, model.CITY_NAME), s.Key(s, model.STREET_NAME), s.Key(s, model.PLACE_NAME),
s.AS(model.NODENAME, model.SPACE), model.INDEX, model.PLACE_UID,
).Orders(m, s.Desc(model.SCORE), s.Desc(model.UPDATED_AT))
).Orders(m, s.Desc(model.SCORE), s.Desc(s.Key(s, model.UPDATED_AT)))
s.Select(m, model.USER_UID, m.Option(model.USER_UID)).Action()
} else if len(arg) == 2 {
s.SelectDetail(m, model.USER_UID, m.Option(model.USER_UID), model.UID, arg[1])

View File

@ -1,13 +1,15 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { if (value.score > 0) { value._style = ["sticky"] }
can.onimport.myView(can, msg, function(value) { value._style = []; if (value.score > 0) { value._style = ["sticky"] }
if (can._stacks_root._stacks[[value.space,value.index, value.place_uid].join(",")]) { value._style.push("loaded") }
value.icons = can.misc.Resource(can, value.service_icon.split("?")[0], value.space)
return [
{view: html.TITLE, list: [value.place_name, can.onimport.authView(can, value), can.onimport.timeView(can, value)]},
{view: html.STATUS, list: [value.city_name, value.street_name, value.service_name]},
]
}, function(event, value) { can.onaction._goback(event, function() {
can.onimport.myPlugin(can, {space: value.space, index: value.index, args: [value.place_uid]})
// can.onimport.myPlugin(can, {space: value.space, index: value.index, args: [value.place_uid]})
can.onimport.myStory(can, {space: value.space, index: value.index, args: [value.place_uid]})
}) })
},
})

BIN
src/gonganxitong/recent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -6,6 +6,7 @@ import (
"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"
@ -22,7 +23,7 @@ type service struct {
Table
order string `data:"904"`
update string `name:"update index name icon"`
autogen string `name:"autogen name* help* class* table*" icon:"bi bi-plus-square-dotted"`
autogen string `name:"autogen name* help* class* table* dream" icon:"bi bi-plus-square-dotted"`
oauth string `name:"oauth" icon:"bi bi-shield-fill-check"`
open string `name:"open" role:"void"`
conf string `name:"conf" role:"void"`
@ -31,6 +32,12 @@ type service struct {
func ServiceUID(m *ice.Message) string {
return kit.Hashs(ice.Info.Hostname, ice.Info.Pwd, m.Prefix(web.PORTAL))
}
func (s service) Inputs(m *ice.Message, arg ...string) {
switch s.Table.Inputs(m, arg...); arg[0] {
case web.DREAM:
m.Cut(arg[0])
}
}
func (s service) Update(m *ice.Message, arg ...string) {
uid := ServiceUID(m)
if s.Select(m.Spawn(), model.UID, uid).Length() == 0 {
@ -39,11 +46,18 @@ func (s service) Update(m *ice.Message, arg ...string) {
s.Table.Update(m, kit.Dict(arg, m.OptionSimple(mdb.NAME, mdb.ICON), nfs.MODULE, ice.Info.Make.Module, nfs.VERSION, ice.Info.Make.Versions()), model.UID, uid)
m.Cmd(s.PrefixPortal(m), Portal{}.CommandUpdate, uid)
}
func (s service) Oauth(m *ice.Message, arg ...string) {
m.Options(m.Cmd(web.CHAT_WX_ACCESS).AppendSimple())
m.Option("sess_cmd", kit.JoinWord(m.Prefix(aaa.SESS), mdb.CREATE))
m.Option("user_cmd", kit.JoinWord(m.Prefix(aaa.USER), mdb.CREATE))
m.Cmd(web.SPACE, ice.OPS, ctx.CONFIG, web.CHAT_WX_AGENT, web.SPACE, m.Option(ice.MSG_USERPOD))
m.Cmd(web.CHAT_WX_ACCESS, web.OAUTH)
m.Cmd(grant{}, web.HEADER)
m.ProcessHold()
}
func (s service) Autogen(m *ice.Message, arg ...string) {
table := m.Option(mdb.TABLE)
msg := m.Cmd(api.GONGANXITONG_SERVICE)
p, from := path.Join(nfs.SRC, m.Option(mdb.NAME)), "template/"
m.Option(nfs.MODULE, code.AutogenImport(m.Message, m.Option(mdb.NAME)))
p, table := path.Join(nfs.SRC, m.Option(mdb.NAME)), m.Option(mdb.TABLE)
m.Option(nfs.MODULE, m.Cmdx(web.SPACE, m.Option(web.DREAM), code.AUTOGEN, code.IMPORT, m.Option(mdb.NAME)))
m.Option("CLASS", strings.ToUpper(m.Option(mdb.CLASS)))
m.Option("Class", kit.Capital(m.Option(mdb.CLASS)))
m.Option("class", kit.LowerCapital(m.Option(mdb.CLASS)))
@ -51,29 +65,36 @@ func (s service) Autogen(m *ice.Message, arg ...string) {
m.Option("Table", kit.Capital(table))
m.Option("table", kit.LowerCapital(table))
m.Option("what", kit.LowerCapital(table))
m.Cmd(nfs.DEFS, path.Join(p, "model/model.go"), msg.Template(from+"model/model.go"))
m.Cmd(nfs.DEFS, path.Join(p, "common.go"), msg.Template(from+"common.go"))
m.Cmd(nfs.DEFS, path.Join(p, "portal.go"), msg.Template(from+"portal.go"))
m.Cmd(nfs.DEFS, path.Join(p, "portal.json"), msg.Template(from+"portal.json"))
m.Cmd(nfs.DEFS, path.Join(p, "user"+m.Option("Class")+".go"), msg.Template(from+"userClass.go"))
m.Cmd(nfs.DEFS, path.Join(p, m.Option("class")+".go"), msg.Template(from+"class.go"))
msg := m.Cmd(api.GONGANXITONG_SERVICE)
cmd := func(arg ...string) { m.Cmd(web.SPACE, m.Option(web.DREAM), arg) }
if m.Option(web.DREAM) != "" {
option := func(ctx, mod string) { cmd(code.AUTOGEN, code.IMPORT, mod, ctx, nfs.SRC_OPTION_GO) }
option("shylinux.com/x/ice", "devops")
option("shylinux.com/x/ice", "portal")
demo := func(p string) { cmd(nfs.SAVE, p, m.Cmdx(nfs.CAT, p)) }
demo("src/template/web.code.autogen/demo.go")
demo("src/template/web.code.go/demo.go")
demo("src/template/web.code.js/demo.js")
defer cmd(cli.SYSTEM, "go", "mod", "tidy")
}
save := func(name string, arg ...string) {
cmd(nfs.DEFS, path.Join(p, name), msg.Template("template/"+kit.Select(name, arg, 0)))
}
save("model/model.go")
save("common.go")
save("portal.go")
save("portal.json")
save("user"+m.Option("Class")+".go", "userClass.go")
save(m.Option("class")+".go", "class.go")
kit.For(kit.Split(m.Option(mdb.TABLE)), func(table string) {
msg.Option(mdb.TABLE, kit.LowerCapital(table))
m.Cmd(nfs.DEFS, path.Join(p, m.Option(mdb.TABLE)+".go"), msg.Template(from+"homework.go"))
m.Cmd(nfs.DEFS, path.Join(p, m.Option(mdb.TABLE)+".js"), msg.Template(from+"homework.js"))
save(table+".go", "homework.go")
save(table+".js", "homework.js")
})
}
func (s service) Compile(m *ice.Message, arg ...string) {
m.Cmdy(code.VIMER, code.COMPILE)
}
func (s service) Oauth(m *ice.Message, arg ...string) {
m.Options(m.Cmd(web.CHAT_WX_ACCESS).AppendSimple())
m.Option("sess_cmd", kit.JoinWord(m.Prefix(aaa.SESS), mdb.CREATE))
m.Option("user_cmd", kit.JoinWord(m.Prefix(aaa.USER), mdb.CREATE))
m.Cmd(web.SPACE, ice.OPS, ctx.CONFIG, web.CHAT_WX_AGENT, web.SPACE, m.Option(ice.MSG_USERPOD))
m.Cmd(web.CHAT_WX_ACCESS, web.OAUTH)
m.ProcessHold()
}
func (s service) List(m *ice.Message, arg ...string) {
if len(arg) < 2 {
s.Orders(m, s.Desc(model.UPDATED_AT)).Select(m)
@ -81,7 +102,7 @@ func (s service) List(m *ice.Message, arg ...string) {
s.SelectDetail(m, model.UID, arg[1])
}
if m.IsTech() {
m.PushAction(s.Open, s.Conf, s.Code, s.Data).Action(s.Autogen, s.Compile, s.Oauth)
m.PushAction(s.Open, s.Conf, s.Code, s.Data).Action(s.Oauth, s.Autogen)
} else {
m.PushAction(s.Open).Action()
}

View File

@ -8,7 +8,8 @@ Volcanos(chat.ONIMPORT, {
{view: html.STATUS, list: [value.module, value.version]},
]
}, function(event, value) { can.onaction._goback(event, function() {
can.onimport.myPlugin(can, {space: value.space, index: value.index})
// can.onimport.myPlugin(can, {space: value.space, index: value.index})
can.onimport.myStory(can, {space: value.space, index: value.index})
}) })
},
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -17,7 +17,7 @@ type sess struct {
func (s sess) Create(m *ice.Message, arg ...string) {
s.Insert(m, model.USER_UID, m.Option(model.USER_UID), web.AGENT, m.Option(ice.MSG_USERUA), aaa.IP, m.Option(ice.MSG_USERIP))
m.ProcessCookie(ice.MSG_SESSID, kit.JoinWord(web.SPACE, m.Option(ice.MSG_USERPOD), m.PrefixKey(), aaa.CHECK, m.Result()), "-2")
m.ProcessCookie(ice.MSG_SESSID, m.Option(ice.MSG_SESSID, kit.JoinWord(web.SPACE, m.Option(ice.MSG_USERPOD), m.PrefixKey(), aaa.CHECK, m.Result())), "-2")
}
func (s sess) Check(m *ice.Message, arg ...string) {
msg := s.Select(m.Spawn(), model.UID, arg[0])

View File

@ -9,20 +9,21 @@ import (
type setting struct {
Table
recent recent
service service
order string `data:"103"`
role string `data:"leader,worker,server"`
short string `data:"name"`
field string `data:"name,type,help"`
fields string `data:"name,value"`
create string `name:"create name* type* help" role:"tech"`
update string `name:"update" role:"void"`
recent recent
service service
order string `data:"103"`
role string `data:"leader,worker,server"`
short string `data:"name"`
field string `data:"name,type,help"`
fields string `data:"name,value"`
create string `name:"create name* type* help" role:"tech"`
update string `name:"update" role:"void"`
placeTrash string `name:"placeTrash" help:"删除数据" style:"danger" role:"leader"`
}
func (s setting) Init(m *ice.Message, arg ...string) {
s.Table.Init(m, arg...)
s.Create(m, model.NAME, "profile", model.TYPE, "radio")
s.Create(m, model.NAME, SETTING_PROFILE, model.TYPE, SETTING_RADIO)
}
func (s setting) Create(m *ice.Message, arg ...string) {
s.Hash.Create(m, arg...)
@ -48,3 +49,8 @@ func (s setting) List(m *ice.Message, arg ...string) {
}
func init() { ice.TeamCtxCmd(setting{Table: newTable()}) }
const (
SETTING_RADIO = "radio"
SETTING_PROFILE = "profile"
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -0,0 +1,56 @@
package gonganxitong
import (
"strings"
"shylinux.com/x/ice"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/gonganxitong/model"
)
type spendlist struct {
Table
fields string `data:"vendor,total,count,expire_time"`
}
func (s spendlist) List(m *ice.Message, arg ...string) {
if len(arg) == 2 {
s.Tables(m, quotalist{})
s.Fields(m, "quotalists.title,quotalists.content,expire_time,spendlists.vendor,spendlists.total,count")
s.Select(m, s.Key(s, model.PLACE_UID), arg[0], model.PAYMENTLIST_UID, arg[1]).Display("")
}
}
func init() { ice.TeamCtxCmd(spendlist{Table: newTable()}) }
func (s Table) SpendlistCheck(m *ice.Message, size int) bool {
if size == 0 && m.Length() == 0 {
return true
}
if size == 0 && m.Result() != "" {
return true
}
msg := m.Cmd(s.Prefix(m, spendlist{}), s.Select, m.OptionSimple(model.PLACE_UID), model.VENDOR, m.PrefixKey())
m.Echo("%s / %s",
strings.TrimSuffix(kit.FmtSize(kit.Int(msg.Append(model.COUNT))), "B"),
strings.TrimSuffix(kit.FmtSize(kit.Int(msg.Append(model.TOTAL))), "B"),
)
m.Option(model.SPENDLIST_UID, msg.Option(model.UID))
if kit.Int(msg.Append(model.COUNT))+size >= kit.Int(msg.Append(model.TOTAL)) {
if !m.Warn(size > 0, "存储空间不足,请及时续费或清理空间") {
m.SetResult()
m.Echo("<span style='color:red'>存储空间不足,请及时续费或清理空间</span>").Action()
}
return false
}
kit.If(size > 0, func() { s.SpendlistCount(m, size) })
return true
}
func (s Table) SpendlistCount(m *ice.Message, size int) {
m.Cmd(s.Prefix(m, spendlist{}), s.AddCount, model.COUNT, size, m.Option(model.SPENDLIST_UID))
}
func (s Table) SpendlistUpdate(m *ice.Message, size string) {
msg := m.Cmd(s.Prefix(m, spendlist{}), s.Select, model.PLACE_UID, m.Option(model.PLACE_UID), model.VENDOR, m.PrefixKey())
m.Options(model.UID, msg.Append(model.UID)).Cmd(s.Prefix(m, spendlist{}), s.Modify, model.COUNT, size)
}

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.vendor]},
{view: html.STATUS, list: [value.expire_time]},
{view: html.OUTPUT, list: [can.base.Size(value.count), " / ", can.base.Size(value.total)]},
] }, function(event) {})
},
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,11 +1,14 @@
package gonganxitong
import (
"net/http"
"time"
"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/community/src/gonganxitong/model"
@ -13,32 +16,36 @@ import (
type user struct {
Table
setting setting
template string `data:"4b-Z_r8dZmm1pHdd2h4A10VVYX4OIHvemlLjsHKBj2s"`
create string `name:"create open_id* avatar usernick"`
modify string `name:"modify info" role:"void"`
list string `name:"list uid auto" role:"void"`
email string `name:"email email*"`
setting setting
template string `data:"4b-Z_r8dZmm1pHdd2h4A10VVYX4OIHvemlLjsHKBj2s"`
create string `name:"create open_id* avatar usernick"`
modify string `name:"modify info" role:"void"`
list string `name:"list uid auto" role:"void"`
email string `name:"email email*"`
setCookie string `name:"setCookie" help:"切换" role:"void"`
sendCookie string `name:"sendCookie" help:"授权" role:"void"`
}
func (s user) Create(m *ice.Message, arg ...string) {
if m.IsTech() {
m.OptionDefault(aaa.AVATAR, m.Option(ice.MSG_AVATAR), aaa.USERNICK, m.Option(ice.MSG_USERNICK))
}
if s.Table.Select(m, m.OptionSimple(model.OPEN_ID)...).Length() == 0 {
m.OptionDefault(aaa.AVATAR, m.Option(ice.MSG_AVATAR), aaa.USERNICK, m.Option(ice.MSG_USERNICK))
if msg := s.Table.Select(m.Spawn(), m.OptionSimple(model.OPEN_ID)...); msg.Length() == 0 {
s.Insert(m, kit.Simple(m.OptionSimple(model.OPEN_ID, model.AVATAR), model.NAME, m.Option(aaa.USERNICK))...)
m.Option(model.USER_UID, m.Result())
} else {
s.Update(m, kit.Dict(m.OptionSimple(model.AVATAR), model.NAME, m.Option(aaa.USERNICK)), m.AppendSimple(model.UID)...)
m.Option(model.USER_UID, m.Append(model.UID))
s.Update(m, kit.Dict(m.OptionSimple(model.AVATAR), model.NAME, m.Option(aaa.USERNICK)), msg.AppendSimple(model.UID)...)
m.Option(model.USER_UID, msg.Append(model.UID))
}
}
func (s user) Modify(m *ice.Message, arg ...string) {
s.Update(m, kit.Dict(m.OptionSimple(model.INFO)), model.UID, m.Option(model.USER_UID))
}
func (s user) Remove(m *ice.Message, arg ...string) {
s.Delete(m, m.OptionSimple(model.UID)...)
}
func (s user) List(m *ice.Message, arg ...string) {
if len(arg) == 0 {
if m.IsTech() {
s.Limit(m, 300)
s.Select(m, arg...).Table(func(value ice.Maps) {
if value[model.UID] != m.Option(model.USER_UID) {
m.PushButton(s.SetCookie)
@ -46,6 +53,8 @@ func (s user) List(m *ice.Message, arg ...string) {
m.PushButton()
}
})
m.EchoQRCode(m.MergePodCmd("", m.PrefixKey()+"/action/sendCookie", ice.FROM_DAEMON, m.Option(ice.MSG_DAEMON))).Echo("<br/>").Echo("请扫码授权")
m.StatusTimeCount(mdb.TOTAL, s.SelectTotal(m))
}
} else {
s.SelectDetail(m, model.UID, arg[0])
@ -54,10 +63,34 @@ func (s user) List(m *ice.Message, arg ...string) {
}
}
}
func (s user) SelectTotal(m *ice.Message, arg ...string) string {
msg := m.Spawn()
s.Fields(msg, "count(*) AS total")
return s.Select(msg, arg...).Append(model.TOTAL)
}
func (s user) Email(m *ice.Message, arg ...string) {
s.Table.Update(m, kit.Dict(m.OptionSimple(model.EMAIL)))
}
func (s user) AuthCreate(m *ice.Message, arg ...string) {
m.Options(s.Select(m.Spawn(), model.UID, m.Option(model.USER_UID)).AppendSimple(model.NAME, model.INFO))
msg := s.Select(m.Spawn(), model.UID, m.Option(model.USER_UID))
if msg.Length() == 0 {
s.Insert(m.Spawn(), model.UID, m.Option(model.USER_UID), model.NAME, m.Option(ice.MSG_USERNAME))
m.Options(model.NAME, m.Option(ice.MSG_USERNAME))
} else {
m.Options(msg.AppendSimple(model.NAME, model.INFO))
}
s.Table.AuthCreate(m, 2, m.Option(model.AUTH_UID))
}
func (s user) SendCookie(m *ice.Message, arg ...string) {
if m.Option(ice.MSG_METHOD) == http.MethodGet {
m.EchoInfoButton("请确认授权", s.SendCookie)
} else {
m.Cmd(web.SPACE, m.Option(ice.FROM_DAEMON), "cookie", m.Option(model.USER_UID), model.USER_UID)
}
}
func (s user) SetCookie(m *ice.Message, arg ...string) {
m.ProcessCookie(model.USER_UID, m.Option(model.UID))
}
func (s user) SendTemplate(m *ice.Message, arg ...string) { // from uid url type name hash
msg := s.Select(m, model.UID, kit.Select(m.Option(model.USER_UID), arg, 1))
m.Cmdy("web.chat.wx.template", "", m.Config(nfs.TEMPLATE), msg.Append(model.OPEN_ID), kit.Select("", arg, 2),
@ -65,11 +98,5 @@ func (s user) SendTemplate(m *ice.Message, arg ...string) { // from uid url type
"time11", time.Now().Format("2006年01月02日 15:04"), "thing18", kit.Select(kit.Select(m.Option(ice.MSG_USERNAME), m.Option(ice.MSG_USERNICK)), arg, 0),
)
}
func (s user) SetCookie(m *ice.Message, arg ...string) {
m.ProcessCookie(model.USER_UID, m.Option(model.UID))
}
func (s user) Email(m *ice.Message, arg ...string) {
s.Table.Update(m, kit.Dict(m.OptionSimple(model.EMAIL)))
}
func init() { ice.TeamCtxCmd(user{}) }

View File

@ -11,4 +11,7 @@ import (
func main() { print(ice.Run()) }
func init() { ice.Info.Titles = "云社区" }
func init() {
ice.Info.CodeMain = "src/gonganxitong/portal.go"
ice.Info.NodeMain = "web.team.gonganxitong.portal"
}

View File

@ -1 +1,17 @@
title "云社区"
refer `
官网 https://web.shylinux.com
源码 https://git.shylinux.com/web/community
应用 https://web.shylinux.com/s/20240724-community
`
refer `
GORM https://gorm.io/docs/indexes.html
ICON https://igoutu.cn/icons/officel
ICON https://igoutu.cn/icons/set/%E7%95%8C%E9%9D%A2%E8%AE%BE%E8%AE%A1--style-officel
公众号 https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=494166701
`
field web.code.mysql.client
field web.code.mysql.query args `mysql gonganxitong`
field web.chat.wx.access
field web.chat.wx.menu
field web.team.gonganxitong.service

View File

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

View File

@ -0,0 +1,7 @@
$option div.item.text input { display:none; }
$output fieldset.story>form.option>div.item.text { display:none; }
$output fieldset.story>form.option>div.item.icon.delete { display:none; }
$output fieldset.story>div.output>div.item>div.output div.title>div.action { display:none; }
$output fieldset.story>div.status { display:none; }
$output fieldset.story>div.output>div.code { display:flex; flex-direction:column; align-items:center; }
$output>div.project div.list { padding-left:10px; margin-left:20px; clear:both; }

View File

@ -0,0 +1,32 @@
package renzhengshouquan
import (
"shylinux.com/x/ice"
"shylinux.com/x/community/src/renzhengshouquan/model"
)
type admin struct {
Tables
auth Auth
userAuth userAuth
order string `data:"51"`
role string `data:"leader,worker"`
open string `name:"open" role:"void"`
}
func (s admin) List(m *ice.Message, arg ...string) {
if m.Option("view") == "admin" {
m.Cmdy(s.auth, s.Select, model.FROM_UID, arg[0], model.STATUS, AuthIssued).Cut(model.SERVICE_UID, model.PLACE_UID)
s.SelectJoinRecent(m, "")
s.SelectJoinService(m)
m.Display("").DisplayCSS("").Sort("service_name,place_name")
} else {
m.EchoInfoButton("请打开管理后台", s.Open)
}
}
func (s admin) Open(m *ice.Message, arg ...string) {
m.ProcessOpen(m.MergePodCmd("", m.PrefixKey(), model.AUTH_UID, m.Option(model.AUTH_UID), "view", "admin"))
}
func init() { ice.TeamCtxCmd(admin{}) }

View File

@ -0,0 +1,55 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
if (can.isCmdMode()) {
can.ui = can.onappend.layout(can), can.onimport.service(can, msg)
} else {
msg.Dump(can)
}
},
service: function(can, msg) { var list = {}
msg.Table(function(value) { if (list[value.service_uid]) { list[value.service_uid].push(value); return } list[value.service_uid] = [value]
can.onimport.item(can, {icon: value.service_icon, name: value.service_name, _hash: value.service_name.split(" ")[0]}, function(event, item, show, target) { if (show) { return }
can.request(event, {view: "table", pod: value.nodename})
can._root.Action.run(event, [ctx.ACTION, ctx.RUN, value.index, value.place_uid], function(msg) {
can.onimport.index(can, msg, value, target)
})
})
}), can.db.list = list
},
index: function(can, msg, value, target) {
can.onimport.itemlist(can, msg.Table(function(item) {
item._hash = [value.service_name.split(" ")[0], item.name], item.__title = item.name
if (item.enable == "false" || can.base.isIn(item.index, "web.team.gonganxitong.credit", "web.team.gonganxitong.setting") || item.order > 500) { return }
return item
}), function(event, item, show, target) {
if (show) { return }
var hash = [value.service_name.split(" ")[0], item.name]
can.onimport.itemlist(can, can.core.List(can.db.list[value.service_uid], function(value) {
value._hash = hash.concat(value.place_name), value.__title = [item.name, value.place_name].join(" ")
value.icon = value.service_icon, value.name = value.place_name
return value
}), function(event, value, show, target) { if (show) { return }
can.onimport.content(can, value, item)
}, null, target)
}, null, target)
},
content: function(can, value, item) {
if (can.onmotion.cache(can, function() { return [value.service_uid, value.place_uid, item.index] }, can.ui.content)) { return }
var uid = can.db.hash[3] && can.db.hash.slice(0, 3).join(",") == value._hash.join(",")? can.db.hash[3]: null
can.onappend.plugin(can._root.Action, {space: value.nodename, index: item.index, args: [value.place_uid].concat(uid? [uid]: [])}, function(sub) {
sub.run = function(event, cmds, cb) { can.request(event, {pod: value.nodename})
can._root.Action.run(event, [ctx.ACTION, ctx.RUN, value.index, ctx.ACTION, ctx.RUN, item.index].concat(cmds), cb)
}
if (uid) { sub._history.push([value.place_uid]) }
sub.onexport.output = function(_sub, msg) { if (!can.isCmdMode()) { return }
if (msg.IsDetail()) {
can.user.title(value.__title+" "+(msg.Append("name")||msg.Append("title")))
can.onexport.hash(can, value._hash.concat(sub.Option(UID)))
} else {
can.user.title(value.__title)
can.onexport.hash(can, value._hash)
}
}
}, can.ui.content)
},
})

View File

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

View File

@ -12,41 +12,51 @@ type Auth struct {
cert cert
order string `data:"2"`
models string `data:"auth"`
fields string `data:"from_uid,name,info,auth_type,auth_status,avatar,background,service_uid,place_uid,user_uid"`
memberList string `name:"memberList" role:"leader,worker"`
certList string `name:"certList" role:"leader,worker"`
issue string `name:"issue" role:"leader,worker"`
revoke string `name:"revoke" role:"leader,worker"`
fields string `data:"from_uid,score,name,info,auth_type,auth_status,avatar,background,service_uid,place_uid,user_uid"`
memberList string `name:"memberList" role:"worker"`
certList string `name:"certList" role:"worker"`
issue string `name:"issue" role:"worker"`
revoke string `name:"revoke" role:"worker"`
setScore string `name:"setScore score" role:"void"`
}
func (s Auth) Remove(m *ice.Message, arg ...string) {
s.Delete(m)
}
func (s Auth) SetScore(m *ice.Message, arg ...string) {
s.Update(m, arg, m.OptionSimple(model.UID)...)
}
func (s Auth) List(m *ice.Message, arg ...string) {
if len(arg) == 1 {
s.Select(m, model.FROM_UID, arg[0]).Action()
defer s.authSort(m)
} else if len(arg) == 2 {
m.Cmdy(s.cert, arg[1]).PushAction().Action()
return
s.SelectDetail(m, model.FROM_UID, arg[0], model.UID, arg[1]).Action(s.CertList, s.MemberList)
}
m.Table(func(value ice.Maps) {
switch AuthStatus(kit.Int(value[model.AUTH_STATUS])) {
case AuthCreate:
m.PushButton(s.Issue)
m.PushButton(s.Issue, s.Remove)
case AuthIssued:
m.PushButton(s.Revoke)
m.PushButton(s.SetScore, s.Revoke)
case AuthRevoked:
m.PushButton(s.Issue)
m.PushButton(s.Issue, s.Remove)
default:
m.PushButton()
}
}).Display("")
}).Display("").DisplayCSS("")
}
func (s Auth) SelectList(m *ice.Message, arg ...string) {
s.Table.SelectList(m, arg...).RenameAppend(model.TYPE, model.AUTH_TYPE, model.STATUS, model.AUTH_STATUS)
s.RewriteAppend(m)
}
func (s Auth) MemberList(m *ice.Message, arg ...string) {
m.Cmdy(m.Prefix("member"), arg[0])
m.Cmdy(m.Prefix("member"), arg[1])
}
func (s Auth) CertList(m *ice.Message, arg ...string) {
m.Cmdy(s.cert, arg[0]).Action()
m.Cmdy(s.cert, arg[1]).Action()
kit.If(m.Length() == 0, func() { m.Echo("没有上传证件") })
}
func (s Auth) Issue(m *ice.Message, arg ...string) {

View File

@ -1,7 +1,7 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.name, can.onimport.textView(can, value, AUTH_TYPE), can.onimport.titleAction(can, value)]},
{view: html.TITLE, list: [value.name, value.score, can.onimport.textView(can, value, AUTH_TYPE), can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), can.onimport.textView(can, value)]},
] })
},

View File

@ -1 +1,8 @@
$output div.item.card div.output div.output img { height:unset; width:100%; margin-right:0; }
$output div.item.card div.output div.output img { height:unset; width:100%; margin-right:0; }
$input div.item.text.verify div.verify {
border-radius:0;
line-height:30px; height:30px;
border-left:var(--box-border);
position:absolute; right:1px; width:unset;
padding-left:24px; padding-right:24px;
}

View File

@ -1,9 +1,11 @@
package renzhengshouquan
import (
"math/rand"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/toolkits"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/renzhengshouquan/model"
)
@ -11,20 +13,101 @@ import (
type cert struct {
Table
order string `data:"1"`
fields string `data:"title,content,path,user_uid"`
fields string `data:"cert_status,path,number,name,type,person,address,mobile,verify,user_uid"`
upload string `name:"upload" role:"leader"`
remove string `name:"remove" role:"leader"`
verify string `name:"verify mobile* verify*" style:"notice" role:"leader"`
}
func (s cert) Upload(m *ice.Message, arg ...string) {
m.WarnNotValid(!kit.IsIn(m.OptionDefault(mdb.FIELD, "cert"), "cert"))
s.UploadCreate(m, model.PATH, m.Option(model.AUTH_UID))
p := s.UploadCreate(m.Options(mdb.FIELD, "cert"), model.PATH, "")
switch AuthType(kit.Int(m.Cmd(Auth{}, s.Select, model.UID, m.Option(model.AUTH_UID)).Append(model.AUTH_TYPE))) {
case AuthPersonal:
msg := m.Cmd(OcrVendor, OcrVendor.IDCard, p)
s.Update(m, kit.Dict(
model.NUMBER, msg.Append("IdNum"),
model.NAME, msg.Append("Name"),
model.TYPE, msg.Append("Sex"),
model.BIRTH, msg.Append("Birth"),
model.ADDRESS, msg.Append("Address"),
), m.OptionSimple(model.AUTH_UID)...)
case AuthCompany:
msg := m.Cmd(OcrVendor, OcrVendor.BizLicense, p)
s.Update(m, kit.Dict(
model.NUMBER, msg.Append("RegNum"),
model.NAME, msg.Append("Name"),
model.TYPE, msg.Append("Type"),
model.PERSON, msg.Append("Person"),
model.PERIOD, msg.Append("Period"),
model.ADDRESS, msg.Append("Address"),
model.AUTHOR, msg.Append("RegistrationAuthority"),
), m.OptionSimple(model.AUTH_UID)...)
}
}
func (s cert) List(m *ice.Message, arg ...string) {
if len(arg) == 1 {
s.Select(m, model.AUTH_UID, arg[0]).PushAction(s.Remove).Action(s.Upload).Display("").DisplayCSS("")
s.Select(m, model.AUTH_UID, arg[0]).Table(func(value ice.Maps) {
switch CertStatus(kit.Int(value[model.CERT_STATUS])) {
case CertUpload:
m.PushButton(s.Verify, s.Remove)
case CertVerify:
m.PushButton(s.Check, s.Remove)
default:
m.PushButton()
}
}).Action().Display("").DisplayCSS("")
s.Button(m, "", s.Upload)
}
}
func (s cert) Verify(m *ice.Message, arg ...string) {
msg := s.Select(m.Spawn(), m.OptionSimple(model.AUTH_UID)...)
if msg.Append(model.VERIFY) == "" {
verify := kit.Format("%06d", rand.Intn(1000000))
s.Update(m, kit.Dict(model.MOBILE, m.Option(model.MOBILE), model.VERIFY, verify), m.OptionSimple(model.AUTH_UID)...)
m.Cmd(SmsVendor, SmsVendor.Send, m.Option(model.MOBILE), verify)
} else {
if m.Option(model.VERIFY) == "" {
return
}
if !m.WarnNotValid(m.Option(model.VERIFY) != msg.Append(model.VERIFY)) {
s.Check(m)
}
}
}
func (s cert) Check(m *ice.Message, arg ...string) {
if m.Option(model.PERSON) != "" {
msg := s.Select(m.Spawn(), model.USER_UID, m.Option(model.USER_UID), model.NAME, m.Option(model.PERSON))
m.Options(msg.AppendSimple(model.NUMBER, model.NAME))
}
if !m.Cmdy(RealnameVendor, RealnameVendor.Check, m.Option(model.MOBILE), m.Option(model.NUMBER), kit.Select(m.Option(model.NAME), m.Option(model.PERSON))).IsErr() {
s.Update(m, kit.Dict(model.STATUS, CertCheck), m.OptionSimple(model.AUTH_UID)...)
}
}
func init() { ice.TeamCtxCmd(cert{}) }
type CertStatus int
const (
CertUpload CertStatus = iota
CertVerify
CertCheck
)
var CertStatusList = map[CertStatus]string{
CertUpload: "upload",
CertVerify: "verify",
CertCheck: "check",
}
func (s CertStatus) String() string { return CertStatusList[s] }
var OcrVendor interface {
IDCard(m *ice.Message, arg ...string)
BizLicense(m *ice.Message, arg ...string)
}
var SmsVendor interface {
Send(m *ice.Message, arg ...string)
}
var RealnameVendor interface {
Check(m *ice.Message, arg ...string)
}

View File

@ -1,12 +1,29 @@
Volcanos(chat.ONIMPORT, {
_init: function(can, msg) {
can.onimport.myView(can, msg, function(value) { return [
{view: html.TITLE, list: [value.title]},
{view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
// {view: html.TITLE, list: [value.title]},
// {view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]},
{view: html.TITLE, list: [value.name]},
{view: html.STATUS, list: [value.number]},
{view: html.STATUS, list: [value.address]},
{view: html.OUTPUT, list: [{img: can.misc.Resource(can, value.path)}]},
] }, function(event, value) {})
},
})
Volcanos(chat.ONACTION, {
upload: function(event, can) { can.user.upload(can.request(event, {_handle: ice.TRUE}), can) },
beforeInputs: function(event, can, button, sub) {
can.page.Select(can, sub._target, "table>tr>td>div.item.text.verify>input", function(target) {
can.page.insertBefore(can, [{view: ["verify", "", "发送验证码"], onclick: function(event) {
if (sub.Option("mobile") == "") {
return can.onmotion.delay(can, function() {
can.user.toast(can, "手机号不能为空"), sub.focus("mobile")
})
}
can.runAction(can.request(event, sub.Option(), {verify: "000"}), "verify", [], function() {
can.user.toast(can, "验证码发送成功")
})
}}], target)
})
},
})

View File

@ -7,6 +7,7 @@ import (
"shylinux.com/x/icebergs/base/aaa"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
"shylinux.com/x/community/src/renzhengshouquan/model"
"shylinux.com/x/enterprise/src/guanlixitong"
)
@ -32,6 +33,22 @@ func (s Table) Inputs(m *ice.Message, arg ...string) {
s.Table.Inputs(m, arg...)
}
}
func (s Table) Config(m *ice.Message, arg ...string) {
}
func (s Table) AuthList(m *ice.Message, auth_uid string, cb func(value ice.Maps, auth bool)) {
m.Cmdy(api.RENZHENGSHOUQUAN_AUTH, auth_uid).Table(func(value ice.Maps) {
if value[model.AUTH_STATUS] == AuthIssued.String() {
cb(value, true)
} else {
cb(value, false)
}
})
}
func (s Table) authSort(m *ice.Message, arg ...string) {
s.RewriteAppend(m)
m.Sort("auth_status,auth_type,score,created_at", []string{"issued"},
[]string{"personal", "root", "city", "street", "school", "company", "service"}, ice.INT_R, ice.STR_R)
}
func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
m.RewriteAppend(func(value, key string, index int) string {
if _, e := strconv.ParseInt(value, 10, 64); e != nil {
@ -44,12 +61,23 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message {
value = AuthType(kit.Int(value)).String()
case model.AUTH_STATUS:
value = AuthStatus(kit.Int(value)).String()
case model.CERT_STATUS:
value = CertStatus(kit.Int(value)).String()
}
return value
})
return s.Table.RewriteAppend(m)
}
func (s Table) GetAuthUID(m *ice.Message, arg ...string) string {
// auth_uid := m.Cmdx(ctx.CONFIG, api.RENZHENGSHOUQUAN_PORTAL, kit.Keym(model.AUTH_UID))
// m.Info("default auth_uid %v", auth_uid)
// return auth_uid
msg := m.Cmd(Auth{}, s.Select, model.TYPE, AuthRoot)
m.Info("default auth_uid %v", msg.Append(model.UID))
return msg.Append(model.UID)
}
type Tables struct{ Table }
func (s Tables) BeforeMigrate(m *ice.Message, arg ...string) {}

View File

@ -0,0 +1,20 @@
package external
import (
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/model"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/ocr"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/realname"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/realname/model"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/smh"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/sms"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/sms/model"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/tke"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentdocument"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentdocument/model"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentmeeting"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentmeeting/model"
_ "shylinux.com/x/community/src/renzhengshouquan/external/tencentqian"
_ "shylinux.com/x/community/src/renzhengshouquan/external/weixinpayment"
_ "shylinux.com/x/community/src/renzhengshouquan/external/weixinpayment/model"
)

View File

@ -0,0 +1,4 @@
source weixinpayment/weixinpayment.shy
source tencentmeeting/tencentmeeting.shy
source tencentdocument/tencentdocument.shy
source tencentcloud/tencentcloud.shy

View File

@ -0,0 +1,18 @@
package model
import "shylinux.com/x/mysql-story/src/db"
const (
SECRET_ID = "secret_id"
SECRET_KEY = "secret_key"
)
type Tencentcloud struct {
db.ModelWithUID
AuthUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
SecretID string `gorm:"type:varchar(64)"`
SecretKey string `gorm:"type:varchar(64)"`
}
func init() { db.CmdModels("", &Tencentcloud{}) }

View File

@ -0,0 +1,45 @@
package ocr
import (
"encoding/base64"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/community/src/renzhengshouquan"
"shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
sdk "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ocr/v20181119"
)
type ocr struct {
tencentcloud.Tencentcloud
}
func (s ocr) List(m *ice.Message, arg ...string) {}
func (s ocr) IDCard(m *ice.Message, arg ...string) {
request := sdk.NewIDCardOCRRequest()
request.ImageBase64 = common.StringPtr(s.imageData(m, arg...))
response, err := s.newClient(m).IDCardOCR(request)
s.ParseResponse(m, response, err)
}
func (s ocr) BizLicense(m *ice.Message, arg ...string) {
request := sdk.NewBizLicenseOCRRequest()
request.ImageBase64 = common.StringPtr(s.imageData(m, arg...))
response, err := s.newClient(m).BizLicenseOCR(request)
s.ParseResponse(m, response, err)
}
func init() { ice.TeamCtxCmd(ocr{}) }
func init() { renzhengshouquan.OcrVendor = ocr{} }
func (s ocr) imageData(m *ice.Message, arg ...string) string {
return base64.StdEncoding.EncodeToString([]byte(m.Cmdx(nfs.CAT, arg[0])))
}
func (s ocr) newClient(m *ice.Message, arg ...string) *sdk.Client {
c, _ := sdk.NewClient(s.NewCredential(m), "", s.NewProfile(m))
return c
}

View File

@ -0,0 +1,6 @@
section "图文识别"
refer `
后台 https://console.cloud.tencent.com/ocr/overview
文档 https://cloud.tencent.com/document/product/866/45338
调试 https://console.cloud.tencent.com/api/explorer?Product=ocr&Version=2018-11-19&Action=RecognizeEncryptedIDCardOCR
`

View File

@ -0,0 +1,14 @@
package model
import "shylinux.com/x/mysql-story/src/db"
type Realname struct {
db.ModelWithUID
AuthUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
SourceID string `gorm:"type:varchar(64)"`
SecretID string `gorm:"type:varchar(64)"`
SecretKey string `gorm:"type:varchar(64)"`
}
func init() { db.CmdModels("", &Realname{}) }

View File

@ -0,0 +1,56 @@
package realname
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"net/http"
"time"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/renzhengshouquan"
"shylinux.com/x/community/src/renzhengshouquan/model"
)
type realname struct {
renzhengshouquan.Table
order string `data:"18"`
fields string `data:"source_id,secret_id,secret_key,user_uid"`
create string `name:"create source_id* secret_id* secret_key*" role:"worker"`
remove string `name:"remove" role:"worker"`
list string `name:"list auth_uid uid auto" role:"worker"`
}
func (s realname) List(m *ice.Message, arg ...string) {
s.ValueList(m, arg).Action().Display("")
}
func init() { ice.TeamCtxCmd(realname{}) }
func init() { renzhengshouquan.RealnameVendor = realname{} }
func (s realname) Check(m *ice.Message, arg ...string) {
msg := s.Select(m.Spawn(), model.AUTH_UID, s.GetAuthUID(m))
source := msg.Append("source_id")
secretId := msg.Append("secret_id")
secretKey := msg.Append("secret_key")
auth, datetime := calcAuthorization(source, secretId, secretKey)
m.Option(web.SPIDE_HEADER, map[string]string{"X-Source": source, "Authorization": auth, "X-Date": datetime})
res := m.Cmdx(web.SPIDE, ice.DEV, web.SPIDE_RAW, http.MethodPost, "https://service-rbgpp2hy-1305308687.gz.apigw.tencentcs.com/release/release/mobile/3-realnameauth",
web.SPIDE_FORM, "mobile_number", arg[0], "idcard_number", arg[1], "name", arg[2])
m.WarnNotRight(kit.Value(kit.UnMarshal(res), "data.result") != "0")
}
func calcAuthorization(source string, secretId string, secretKey string) (auth string, datetime string) {
timeLocation, _ := time.LoadLocation("Etc/GMT")
datetime = time.Now().In(timeLocation).Format("Mon, 02 Jan 2006 15:04:05 GMT")
signStr := fmt.Sprintf("x-date: %s\nx-source: %s", datetime, source)
mac := hmac.New(sha1.New, []byte(secretKey))
mac.Write([]byte(signStr))
sign := base64.StdEncoding.EncodeToString(mac.Sum(nil))
auth = fmt.Sprintf("hmac id=\"%s\", algorithm=\"hmac-sha1\", headers=\"x-date x-source\", signature=\"%s\"", secretId, sign)
return auth, datetime
}

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.source_id, can.onimport.titleAction(can, value)]},
{view: html.STATUS, list: [value.secret_id]},
] })
},
})

View File

@ -0,0 +1,11 @@
{
"realname": "实名验证",
"icons": {
"realname": "https://img.icons8.com/officel/80/video-conference.png"
},
"input": {
"source_id": "SourceID",
"secret_id": "SecretID",
"secret_key": "SecretKey"
}
}

View File

@ -0,0 +1,5 @@
section "实名验证"
refer `
后台 https://console.cloud.tencent.com/servicemarket/services/market-2qkoxdj5i
文档 https://market.cloud.tencent.com/products/30034?keyword=%E6%89%8B%E6%9C%BA%E4%B8%89%E8%A6%81%E7%B4%A0%E5%AE%9E%E5%90%8D%E8%AE%A4%E8%AF%81
`

View File

@ -0,0 +1,35 @@
package model
import "shylinux.com/x/mysql-story/src/db"
const (
UID = "uid"
NAME = "name"
INFO = "info"
VENDOR = "vendor"
USER_UID = "user_uid"
PLACE_UID = "place_uid"
AUTH_UID = "auth_uid"
AUTH_STATUS = "auth_status"
PHOTO_UID = "photo_uid"
LIBRARY_ID = "library_id"
LIBRARY_SECRET = "library_secret"
ACCESS_TOKEN = "access_token"
EXPIRE_TIME = "expire_time"
SPACE_ID = "space_id"
USER_ID = "user_id"
)
type Smh struct {
db.ModelWithUID
AuthUID string `gorm:"type:char(32);index"`
UserUID string `gorm:"type:char(32)"`
Name string `gorm:"type:varchar(32)"`
Info string `gorm:"type:varchar(64)"`
LibraryID string `gorm:"type:varchar(32)"`
LibrarySecret string `gorm:"type:varchar(64)"`
AccessToken string `gorm:"type:varchar(512)"`
ExpireTime db.Time
}
func init() { db.CmdModels("", &Smh{}) }

View File

@ -0,0 +1,207 @@
package smh
import (
"net/http"
"path"
"time"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/community/src/api"
"shylinux.com/x/community/src/gonganxitong"
"shylinux.com/x/community/src/renzhengshouquan"
"shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud"
"shylinux.com/x/community/src/renzhengshouquan/external/tencentcloud/smh/model"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
sdk "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/smh/v20210712"
)
type smh struct {
renzhengshouquan.Table
tencentcloud.Tencentcloud
order string `data:"16"`
fields string `data:"name,info,library_id,library_secret,access_token,expire_time,user_uid"`
list string `name:"list auth_uid uid auto" role:"worker"`
libraryCreate string `name:"libraryCreate" role:"worker"`
libraryRemove string `name:"libraryRemove" role:"worker"`
spaceCreate string `name:"spaceCreate" role:"worker"`
spaceRemove string `name:"spaceRemove" role:"worker"`
rename string `name:"rename"`
}
func (s smh) Init(m *ice.Message, arg ...string) {
s.SpideCreate(m, "https://api.tencentsmh.cn/api/v1/", "tencentsmh")
s.Table.Init(m, arg...)
}
func (s smh) List(m *ice.Message, arg ...string) {
if len(arg) == 1 {
if s.ValueList(m, arg).Display("").Length() == 0 {
s.Button(m.SetResult(), "请创建媒体库", s.LibraryCreate).Action()
} else {
msg := s.token(m)
m.Table(func(value ice.Maps) {
_msg := s.spide(m.Spawn(), kit.MergeURL(kit.Format("usage/%s", msg.Append(model.LIBRARY_ID)), msg.AppendSimple(model.ACCESS_TOKEN)))
m.PushRecord(kit.UnMarshal(_msg.Result()), "totalFileSize")
}).PushAction(s.LibraryRemove).Action()
}
} else if len(arg) == 2 {
s.AuthList(m, arg[0], func(value ice.Maps, auth bool) {
if auth {
msg := s.cmdy(m.Spawn(), s.Select, model.PLACE_UID, value[model.PLACE_UID])
if msg.Append(model.SPACE_ID) == "" {
m.Push(model.SPACE_ID, "").Push(model.PHOTO_UID, "").PushButton(s.SpaceCreate)
} else {
m.Push(model.SPACE_ID, msg.Append(model.SPACE_ID))
m.Push(model.PHOTO_UID, msg.Append(model.UID))
m.PushButton(s.SpaceRemove)
}
} else {
m.Push(model.SPACE_ID, "").Push(model.PHOTO_UID, "").PushButton()
}
})
}
}
func (s smh) LibraryCreate(m *ice.Message, arg ...string) {
msg := m.Cmd(api.RENZHENGSHOUQUAN_AUTH, s.Select, model.UID, m.Option(model.AUTH_UID))
request := sdk.NewCreateLibraryRequest()
request.Name = common.StringPtr(msg.Append(model.NAME))
request.Remark = common.StringPtr(msg.Append(model.INFO))
request.LibraryExtension = &sdk.LibraryExtension{
IsFileLibrary: common.BoolPtr(true),
IsMultiSpace: common.BoolPtr(true),
IsMultiAlbum: common.BoolPtr(true),
}
response, err := s.newClient(m).CreateLibrary(request)
if m.Warn(err) {
return
}
req := sdk.NewDescribeLibrarySecretRequest()
req.LibraryId = response.Response.LibraryId
res, err := s.newClient(m).DescribeLibrarySecret(req)
if m.Warn(err) {
return
}
s.Table.Create(m, kit.Simple(msg.AppendSimple(model.NAME, model.INFO), model.LIBRARY_ID, *res.Response.LibraryId, model.LIBRARY_SECRET, *res.Response.LibrarySecret)...)
}
func (s smh) LibraryRemove(m *ice.Message, arg ...string) {
request := sdk.NewDeleteLibraryRequest()
request.LibraryId = common.StringPtr(m.Option(model.LIBRARY_ID))
if _, err := s.newClient(m).DeleteLibrary(request); err != nil {
if err, ok := err.(*errors.TencentCloudSDKError); ok {
if err.Code == "ResourceInUse.MultiSpace" {
m.Warn(true, "请先清理用户空间,清理")
} else {
m.Warn(true, err.Message)
}
}
return
}
s.Table.Remove(m, arg...)
}
func (s smh) SpaceCreate(m *ice.Message, arg ...string) {
msg := s.token(m)
if s.spide(m, http.MethodPost, kit.MergeURL(kit.Format("space/%s", msg.Append(model.LIBRARY_ID)), model.USER_ID, m.Option(model.PLACE_UID), msg.AppendSimple(model.ACCESS_TOKEN)),
"spaceTag", m.Option(model.NAME)).IsErr() {
return
}
m.Option(model.SPACE_ID, kit.Value(kit.UnMarshal(m.Result()), "spaceId"))
s.cmdy(m, s.Config, m.OptionSimple(model.PLACE_UID, model.USER_UID, model.SPACE_ID), model.VENDOR, m.PrefixKey())
}
func (s smh) SpaceRemove(m *ice.Message, arg ...string) {
msg := s.token(m)
if s.spide(m, http.MethodDelete, kit.MergeURL(kit.Format("space/%s/%s", msg.Append(model.LIBRARY_ID), m.Option(model.SPACE_ID)), msg.AppendSimple(model.ACCESS_TOKEN))).IsErr() {
return
}
s.cmdy(m.Options(model.UID, m.Option(model.PHOTO_UID)), s.Delete, m.OptionSimple(model.PLACE_UID, model.SPACE_ID), model.VENDOR, m.PrefixKey())
}
func (s smh) Folder(m *ice.Message, arg ...string) {
msg := s.token(m)
if len(arg) > 3 {
m.EchoImages(kit.MergeURL(kit.Format("https://api.tencentsmh.cn/api/v1/file/%s/%s/%s", msg.Append(model.LIBRARY_ID), arg[1], arg[3]),
"height_size", "320", "width_size", "320", model.ACCESS_TOKEN, arg[2])).Echo(arg[3])
return
}
s.spide(m, kit.MergeURL(kit.Format("directory/%s/%s/", msg.Append(model.LIBRARY_ID), arg[1]), msg.AppendSimple(model.ACCESS_TOKEN)))
kit.For(kit.Value(kit.UnMarshal(m.Result()), "contents"), func(value ice.Map) {
t, _ := time.ParseInLocation("2006-01-02T15:04:05.000Z", kit.Format(value["modificationTime"]), time.UTC)
value["modify_time"] = t.Add(time.Hour * 8).Format(ice.MOD_TIME)
m.PushRecord(value, "name", "size", "modify_time", "type", "fileType", "contentType").Push(model.UID, value["name"])
m.Push("icons", kit.MergeURL(kit.Format("https://api.tencentsmh.cn/api/v1/file/%s/%s/%s", msg.Append(model.LIBRARY_ID), arg[1], value["name"]),
"height_size", "128", "width_size", "128", model.ACCESS_TOKEN, arg[2]))
})
m.SetResult()
}
func (s smh) Upload(m *ice.Message, arg ...string) {
msg := s.token(m)
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
_msg := m.Cmd(web.CACHE, up[0])
if s.spide(m, http.MethodPut, kit.MergeURL(kit.Format("file/%s/%s/%s", msg.Append(model.LIBRARY_ID), arg[1], path.Base(up[1])),
"conflict_resolution_strategy", "rename", "filesize", up[2], msg.AppendSimple(model.ACCESS_TOKEN))).IsErr() {
return
}
res := kit.UnMarshal(m.Result())
if s.spide(m.Options(web.SPIDE_HEADER, kit.Value(res, "headers")), http.MethodPut,
"https://"+kit.Format(kit.Value(res, web.DOMAIN))+kit.Format(kit.Value(res, nfs.PATH)), web.SPIDE_FILE, _msg.Append(nfs.FILE)).IsErr() {
return
}
s.spide(m, http.MethodPost, kit.MergeURL(kit.Format("file/%s/%s/%s", msg.Append(model.LIBRARY_ID), arg[1], kit.Value(res, "confirmKey")),
"confirm", "confirm", "conflict_resolution_strategy", "rename", msg.AppendSimple(model.ACCESS_TOKEN)))
s.spaceSize(m, msg, arg...)
}
func (s smh) spaceSize(m, msg *ice.Message, arg ...string) {
s.spide(m, http.MethodGet, kit.MergeURL(kit.Format("space/%s/%s/size", msg.Append(model.LIBRARY_ID), arg[1]), msg.AppendSimple(model.ACCESS_TOKEN)))
m.Push("size", kit.Value(kit.UnMarshal(m.Result()), "size"))
}
func (s smh) Rename(m *ice.Message, arg ...string) {
msg := s.token(m)
m.Info("what %v", m.FormatChain())
s.spide(m, http.MethodPut, kit.MergeURL(kit.Format("file/%s/%s/%s", msg.Append(model.LIBRARY_ID), arg[1], m.Option("newname")), msg.AppendSimple(model.ACCESS_TOKEN)), "from", m.Option(model.NAME))
}
func (s smh) Trash(m *ice.Message, arg ...string) {
msg := s.token(m)
s.spide(m, http.MethodDelete, kit.MergeURL(kit.Format("file/%s/%s/%s", msg.Append(model.LIBRARY_ID), arg[1], m.Option(model.NAME)), msg.AppendSimple(model.ACCESS_TOKEN)))
s.spaceSize(m, msg, arg...)
}
func (s smh) Token(m *ice.Message, arg ...string) {
if arg[1] == "" || arg[2] < m.Time() {
msg := s.token(m)
if _msg := s.spide(m.Spawn(), "token", msg.AppendSimple(model.LIBRARY_ID, model.LIBRARY_SECRET), model.SPACE_ID, arg[0]); !_msg.IsErr() {
res := kit.UnMarshal(_msg.Result())
s.cmdy(m, s.Config, model.ACCESS_TOKEN, kit.Value(res, "accessToken"), model.EXPIRE_TIME, m.Time(kit.Format(kit.Value(res, "expiresIn"))+"s"))
m.Push(model.ACCESS_TOKEN, kit.Value(res, "accessToken"))
}
} else {
m.Push(model.ACCESS_TOKEN, arg[1])
}
}
func init() { ice.TeamCtxCmd(smh{}) }
func init() { gonganxitong.PhotoVendor = smh{} }
func (s smh) cmdy(m *ice.Message, arg ...ice.Any) *ice.Message {
return m.Cmdy(append([]ice.Any{"web.team.gonganxitong.photo"}, arg...)...)
}
func (s smh) token(m *ice.Message, arg ...string) *ice.Message {
msg := s.Select(m.Spawn(), m.OptionSimple(model.AUTH_UID)...)
if msg.Append(model.ACCESS_TOKEN) == "" || msg.Append(model.EXPIRE_TIME) < m.Time() {
if _msg := s.spide(m.Spawn(), "token", msg.AppendSimple(model.LIBRARY_ID, model.LIBRARY_SECRET), "grant", "admin"); !_msg.IsErr() {
res := kit.UnMarshal(_msg.Result())
s.Update(m, kit.Dict(model.ACCESS_TOKEN, kit.Value(res, "accessToken"), model.EXPIRE_TIME, m.Time(kit.Format(kit.Value(res, "expiresIn"))+"s")), m.OptionSimple(model.AUTH_UID)...)
}
msg = s.Select(m.Spawn(), m.OptionSimple(model.AUTH_UID)...)
}
return msg
}
func (s smh) spide(m *ice.Message, arg ...ice.Any) *ice.Message {
return m.SetAppend().SetResult().Cmdy(append([]ice.Any{web.SPIDE, "tencentsmh", web.SPIDE_RAW}, arg...)...).Options(web.SPIDE_HEADER, kit.Dict())
}
func (s smh) newClient(m *ice.Message, arg ...string) *sdk.Client {
c, _ := sdk.NewClient(s.NewCredential(m), "", s.NewProfile(m))
return c
}

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.library_id, can.onimport.timeView(can, value), can.base.Size(value.totalFileSize)]},
{view: html.OUTPUT, list: [value.info]},
] })
},
})

View File

@ -0,0 +1,12 @@
{
"smh": "智能媒资托管",
"libraryCreate": "创建", "libraryRemove": "删除",
"spaceCreate": "分配", "spaceRemove": "清理",
"style": {
"libraryCreate": "notice", "libraryRemove": "danger",
"spaceCreate": "notice", "spaceRemove": "danger"
},
"icons": {
"smh": "https://img.icons8.com/officel/80/stack-of-photos.png"
}
}

View File

@ -0,0 +1,5 @@
section "智能媒资托管"
refer `
后台 https://console.cloud.tencent.com/smh/overview
文档 https://cloud.tencent.com/document/product/1339
`

Some files were not shown because too many files have changed in this diff Show More