commit 6e56cab8480735adfb93a858f13306f1fa3cbfcb Author: Yangtao Date: Tue Nov 18 17:48:20 2025 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c526674 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +*.exe +/logs/*.log +/logs +/web/fy-trade/unpackage +.DS_Store +/data +__debug_bin* + +HELP.md +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.ipr +/out/ +/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +#.vscode/ + + +/node_modules +/web/node_modules +*.iml +/logs +*.tmp +projectFilesBackup +/*.exe +/NNOperation +lastupdate.tmp +/temp +/views/static +/serviceoperation +/app diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..ae6c4e1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,80 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "app", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/server/main.go", + "cwd": "${workspaceFolder}", + "args": ["app", "-e", "dev"] + }, + { + "name": "app-local", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/server/main.go", + "cwd": "${workspaceFolder}", + "args": ["app", "-e", "local"] + }, + { + "name": "admin", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/server/main.go", + "cwd": "${workspaceFolder}", + "args": ["admin", "-e", "dev"] + }, + { + "name": "admin-local", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/server/main.go", + "cwd": "${workspaceFolder}", + "args": ["admin", "-e", "local"] + }, + { + "name": "cms", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/server/main.go", + "cwd": "${workspaceFolder}", + "args": ["cms", "-e", "dev"] + }, + { + "name": "data", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/server/main.go", + "cwd": "${workspaceFolder}", + "args": ["data", "-e", "dev"] + }, + { + "name": "trade", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/server/main.go", + "cwd": "${workspaceFolder}", + "args": ["all", "-e", "dev"] + }, + { + "name": "activity", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/server/main.go", + "cwd": "${workspaceFolder}", + "args": ["activity", "-e", "dev"] + } + ] +} \ No newline at end of file diff --git a/.zed/debug.json b/.zed/debug.json new file mode 100644 index 0000000..385b9e1 --- /dev/null +++ b/.zed/debug.json @@ -0,0 +1,33 @@ +// Project-local debug tasks +// +// For more documentation on how to configure debug tasks, +// see: https://zed.dev/docs/debugger +[ + { + "adapter": "Delve", + "label": "app_dev", + "request": "launch", + "mode": "debug", + "program": "${ZED_WORKTREE_ROOT}/cmd/server/main.go", + "cwd": "${ZED_WORKTREE_ROOT}", + "args": ["app", "-e", "dev"] + }, + { + "adapter": "Delve", + "label": "admin_dev", + "request": "launch", + "mode": "debug", + "program": "${ZED_WORKTREE_ROOT}/cmd/server/main.go", + "cwd": "${ZED_WORKTREE_ROOT}", + "args": ["admin", "-e", "dev"] + }, + { + "adapter": "Delve", + "label": "cms_dev", + "request": "launch", + "mode": "debug", + "program": "${ZED_WORKTREE_ROOT}/cmd/server/main.go", + "cwd": "${ZED_WORKTREE_ROOT}", + "args": ["cms", "-e", "dev"] + } +] diff --git a/README.md b/README.md new file mode 100644 index 0000000..1be9954 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +## 代码说明 + +### 目录说明 + +- pkg:通用模块 + - errors:错误定义 + - client:三方api客户端封装 + - lock:内存中的单体服务全局锁 + - constant:常量定义 + - datasource:数据库连接,其中的fields可以用户res结构体的scan映射 + - log:日志 + - model:模型实体定义,自动生成 + - repo:数据库访问方法定义,自动生成 + - req:请求体定义,前缀为模块名 + - res:响应体定义,前缀为模块名 + - tools:通用工具封装 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d764dff --- /dev/null +++ b/go.mod @@ -0,0 +1,163 @@ +module servicebase + +go 1.24.0 + +toolchain go1.24.10 + +require ( + github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect + github.com/alibabacloud-go/debug v1.0.1 // indirect + github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect + github.com/alibabacloud-go/openapi-util v0.1.1 // indirect + github.com/aliyun/alibaba-cloud-sdk-go v1.63.49 + github.com/anxpp/beego v1.12.2-no-color-info + github.com/apache/rocketmq-client-go/v2 v2.1.2 + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/disintegration/imaging v1.6.2 + github.com/gin-gonic/gin v1.10.0 + github.com/go-resty/resty/v2 v2.15.3 + github.com/golang-jwt/jwt/v5 v5.2.1 + github.com/google/uuid v1.6.0 + github.com/natefinch/lumberjack v2.0.0+incompatible + github.com/olivere/elastic/v7 v7.0.32 + github.com/pkg/errors v0.9.1 + github.com/prometheus/client_golang v1.20.5 // indirect + github.com/qiniu/go-sdk/v7 v7.25.0 + github.com/redis/go-redis/v9 v9.7.0 + github.com/shopspring/decimal v1.4.0 + github.com/spf13/viper v1.19.0 + github.com/tealeg/xlsx v1.0.5 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1038 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1038 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1031 + go.mongodb.org/mongo-driver v1.17.1 + go.opentelemetry.io/otel/trace v1.31.0 + go.uber.org/zap v1.27.0 + gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df + gorm.io/driver/mysql v1.5.7 + gorm.io/gen v0.3.26 + gorm.io/gorm v1.25.12 + gorm.io/plugin/dbresolver v1.5.3 +) + +require ( + github.com/AgoraIO/Tools/DynamicKey/AgoraDynamicKey/go/src v0.0.0-20250603060255-42a9cad9cffc + github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7 + github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 + github.com/alibabacloud-go/tea v1.3.8 + github.com/alibabacloud-go/tea-utils/v2 v2.0.7 + github.com/yidun/yidun-golang-sdk v1.0.29 +) + +require ( + github.com/anxpp/common-utils v0.0.0-20250612015512-2dc997d0693c + github.com/wechatpay-apiv3/wechatpay-go v0.2.21 +) + +require ( + github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1 // indirect + github.com/alibabacloud-go/tea-fileform v1.1.1 // indirect + github.com/alibabacloud-go/tea-oss-sdk v1.1.5 // indirect + github.com/alibabacloud-go/tea-oss-utils v1.1.0 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect +) + +require ( + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 // indirect + github.com/alibabacloud-go/cloudauth-20190307/v3 v3.9.2 + github.com/alibabacloud-go/tea-utils v1.4.5 // indirect + github.com/alibabacloud-go/tea-xml v1.1.3 // indirect + github.com/aliyun/credentials-go v1.4.6 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bytedance/sonic v1.12.1 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/elastic/go-sysinfo v1.15.0 // indirect + github.com/elastic/go-windows v1.0.0 // indirect + github.com/emirpasic/gods v1.12.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.5 // indirect + github.com/gammazero/toposort v0.1.1 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.22.0 // indirect + github.com/goccy/go-json v0.10.3 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/golang/mock v1.4.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect + github.com/sirupsen/logrus v1.6.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/tidwall/gjson v1.13.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tjfoc/gmsm v1.4.1 + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/arch v0.9.0 // indirect + golang.org/x/crypto v0.28.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect + golang.org/x/time v0.13.0 + golang.org/x/tools v0.24.0 // indirect + google.golang.org/protobuf v1.35.1 // indirect + gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c // indirect + gorm.io/hints v1.1.0 // indirect + howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect + modernc.org/fileutil v1.0.0 // indirect + stathat.com/c/consistent v1.0.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..12e73f5 --- /dev/null +++ b/go.sum @@ -0,0 +1,821 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AgoraIO/Tools/DynamicKey/AgoraDynamicKey/go/src v0.0.0-20250603060255-42a9cad9cffc h1:VMQwCNGT82ipigEooHtijUvbSp5g1JG6WTXQ9wyhYMM= +github.com/AgoraIO/Tools/DynamicKey/AgoraDynamicKey/go/src v0.0.0-20250603060255-42a9cad9cffc/go.mod h1:4bXIK0ntDk9CqAXobmomWd7dedbfNv/aaIpmpqqzt+A= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +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/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 h1:7dONQ3WNZ1zy960TmkxJPuwoolZwL7xKtpcM04MBnt4= +github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82/go.mod h1:nLnM0KdK1CmygvjpDUO6m1TjSsiQtL61juhNsvV/JVI= +github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA= +github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo= +github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= +github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 h1:zE8vH9C7JiZLNJJQ5OwjU9mSi4T9ef9u3BURT6LCLC8= +github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5/go.mod h1:tWnyE9AjF8J8qqLk645oUmVUnFybApTQWklQmi5tY6g= +github.com/alibabacloud-go/cloudauth-20190307/v3 v3.9.2 h1:y4s0WQ1jrBtOJfXGgsv/83brJvkkHbFdORp0WDyVAuw= +github.com/alibabacloud-go/cloudauth-20190307/v3 v3.9.2/go.mod h1:kD75qqMQyjCiz6lssjRzYGTumcli8STLXQstVe6ytxk= +github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY= +github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI= +github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE= +github.com/alibabacloud-go/darabonba-encode-util v0.0.2/go.mod h1:JiW9higWHYXm7F4PKuMgEUETNZasrDM6vqVr/Can7H8= +github.com/alibabacloud-go/darabonba-map v0.0.2 h1:qvPnGB4+dJbJIxOOfawxzF3hzMnIpjmafa0qOTp6udc= +github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+MtEzBunJwQGceGQlvaPGPc= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.0/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.2/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10/go.mod h1:26a14FGhZVELuz2cc2AolvW4RHmIO3/HRwsdHhaIPDE= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7 h1:ASXSBga98QrGMxbIThCD6jAti09gedLfvry6yJtsoBE= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.7/go.mod h1:TBpgqm3XofZz2LCYjZhektGPU7ArEgascyzbm4SjFo4= +github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg= +github.com/alibabacloud-go/darabonba-signature-util v0.0.7/go.mod h1:oUzCYV2fcCH797xKdL6BDH8ADIHlzrtKVjeRtunBNTQ= +github.com/alibabacloud-go/darabonba-string v1.0.2 h1:E714wms5ibdzCqGeYJ9JCFywE5nDyvIXIIQbZVFkkqo= +github.com/alibabacloud-go/darabonba-string v1.0.2/go.mod h1:93cTfV3vuPhhEwGGpKKqhVW4jLe7tDpo3LUM0i0g6mA= +github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= +github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= +github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg= +github.com/alibabacloud-go/debug v1.0.1/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= +github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 h1:UTl97mt2qfavxveqCkaVg4tKaZUPzA9RKbFIRaIdtdg= +github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6/go.mod h1:UWpcGrWwTbES9QW7OQ7xDffukMJ/l7lzioixIz8+lgY= +github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q= +github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE= +github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= +github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= +github.com/alibabacloud-go/openapi-util v0.1.1 h1:ujGErJjG8ncRW6XtBBMphzHTvCxn4DjrVw4m04HsS28= +github.com/alibabacloud-go/openapi-util v0.1.1/go.mod h1:/UehBSE2cf1gYT43GV4E+RxTdLRzURImCYY0aRmlXpw= +github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1 h1:L0TIjr9Qh/SLVc1yPhFkcB9+9SbCNK/jPq4ZKB5zmnc= +github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1/go.mod h1:EKxBRDLcMzwl4VLF/1WJwlByZZECJawPXUvinKMsTTs= +github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg= +github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.10/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.11/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.12/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= +github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= +github.com/alibabacloud-go/tea v1.1.20/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= +github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk= +github.com/alibabacloud-go/tea v1.3.8 h1:Sk2+BDJC//xJ1/Eljf+Dlg2u2tgWpA9P7mlb87AEcEs= +github.com/alibabacloud-go/tea v1.3.8/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= +github.com/alibabacloud-go/tea-fileform v1.1.1 h1:1YG6erAP3joQ0XdCXYIotuD7zyOM6qCR49xkp5FZDeU= +github.com/alibabacloud-go/tea-fileform v1.1.1/go.mod h1:ZeCV91o4ISmxidd686f0ebdS5EDHWU+vW+TkjLhrsFE= +github.com/alibabacloud-go/tea-oss-sdk v1.1.3/go.mod h1:yUnodpR3Bf2rudLE7V/Gft5txjJF30Pk+hH77K/Eab0= +github.com/alibabacloud-go/tea-oss-sdk v1.1.5 h1:CFUFcqanvBaoGN/CyTHUZrVNtFZd1WTjem46m0HTTV0= +github.com/alibabacloud-go/tea-oss-sdk v1.1.5/go.mod h1:5fhlKMa/kWRJNgPYRt+5qSg3UidRvNbf9Z2bI8Dp5/s= +github.com/alibabacloud-go/tea-oss-utils v1.1.0 h1:y65crjjcZ2Pbb6UZtC2deuIZHDVTS3IaDWE7M9nVLRc= +github.com/alibabacloud-go/tea-oss-utils v1.1.0/go.mod h1:PFCF12e9yEKyBUIn7X1IrF/pNjvxgkHy0CgxX4+xRuY= +github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= +github.com/alibabacloud-go/tea-utils v1.3.6/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= +github.com/alibabacloud-go/tea-utils v1.4.5 h1:h0/6Xd2f3bPE4XHTvkpjwxowIwRCJAJOqY6Eq8f3zfA= +github.com/alibabacloud-go/tea-utils v1.4.5/go.mod h1:KNcT0oXlZZxOXINnZBs6YvgOd5aYp9U67G+E3R8fcQw= +github.com/alibabacloud-go/tea-utils/v2 v2.0.0/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= +github.com/alibabacloud-go/tea-utils/v2 v2.0.3/go.mod h1:sj1PbjPodAVTqGTA3olprfeeqqmwD0A5OQz94o9EuXQ= +github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4= +github.com/alibabacloud-go/tea-utils/v2 v2.0.6/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I= +github.com/alibabacloud-go/tea-utils/v2 v2.0.7 h1:WDx5qW3Xa5ZgJ1c8NfqJkF6w+AU5wB8835UdhPr6Ax0= +github.com/alibabacloud-go/tea-utils/v2 v2.0.7/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I= +github.com/alibabacloud-go/tea-xml v1.1.1/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= +github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= +github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzYtqw7dgt0= +github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= +github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= +github.com/aliyun/alibaba-cloud-sdk-go v1.63.49 h1:79qdt3Rzg3fQV/KwNwpBjOUW108Ram/fSda6IC/vF0k= +github.com/aliyun/alibaba-cloud-sdk-go v1.63.49/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= +github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= +github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0= +github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmPrib8NVePL3fxM= +github.com/aliyun/credentials-go v1.3.10/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= +github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= +github.com/aliyun/credentials-go v1.4.6 h1:CG8rc/nxCNKfXbZWpWDzI9GjF4Tuu3Es14qT8Y0ClOk= +github.com/aliyun/credentials-go v1.4.6/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= +github.com/anxpp/beego v1.12.2-no-color-info h1:wuWLtMoUcjiCKOVZxps7Ur5yzm9Xq7OMsW7RHNJ//qQ= +github.com/anxpp/beego v1.12.2-no-color-info/go.mod h1:fH8i0zzzdz83XlTnHhwkinhyWY4C66ZEA7C5tqkeIio= +github.com/anxpp/common-utils v0.0.0-20250612015512-2dc997d0693c h1:85zxsmewhZ2/EaeKeegi8yWN4DL0SK4Q/1k8xXpsdYg= +github.com/anxpp/common-utils v0.0.0-20250612015512-2dc997d0693c/go.mod h1:aIMWzeXuzYK3m3M/bKfG+B71mKgy4Uy0GP61+yYr7Hc= +github.com/apache/rocketmq-client-go/v2 v2.1.2 h1:yt73olKe5N6894Dbm+ojRf/JPiP0cxfDNNffKwhpJVg= +github.com/apache/rocketmq-client-go/v2 v2.1.2/go.mod h1:6I6vgxHR3hzrvn+6n/4mrhS+UTulzK/X9LB2Vk1U5gE= +github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= +github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bytedance/sonic v1.12.1 h1:jWl5Qz1fy7X1ioY74WqO0KjAMtAGQs4sYnjiEBiyX24= +github.com/bytedance/sonic v1.12.1/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= +github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= +github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= +github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= +github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= +github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= +github.com/elastic/go-sysinfo v1.0.2/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyzzjiW90t8cY= +github.com/elastic/go-sysinfo v1.15.0 h1:54pRFlAYUlVNQ2HbXzLVZlV+fxS7Eax49stzg95M4Xw= +github.com/elastic/go-sysinfo v1.15.0/go.mod h1:jPSuTgXG+dhhh0GKIyI2Cso+w5lPJ5PvVqKlL8LV/Hk= +github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= +github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= +github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= +github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= +github.com/gammazero/toposort v0.1.1 h1:OivGxsWxF3U3+U80VoLJ+f50HcPU1MIqE1JlKzoJ2Eg= +github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= +github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= +github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= +github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= +github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= +github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= +github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= +github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +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.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE= +github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= +github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E= +github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk= +github.com/qiniu/go-sdk/v7 v7.25.0 h1:Roi4XMxRly9K4wb87DhQOKaQylyiphEXC7/l8uqJZaQ= +github.com/qiniu/go-sdk/v7 v7.25.0/go.mod h1:uZE85Pi0ftIHT/UNLShosdzwsovqpdas0LwAGO7cPao= +github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= +github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= +github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= +github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s= +github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/assertions v1.1.1 h1:T/YLemO5Yp7KPzS+lVtu+WsHn8yoSwTfItdAd1r3cck= +github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +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.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= +github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= +github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE= +github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1038 h1:o959ZjutJ3JNTRPUhlxtcHusxTNXhyZhw4kzsyUlcSI= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1038/go.mod h1:ycOzZvXJAduBYfdglvjE6MEqw78thHkQlpOJedJSt7A= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1031/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1038 h1:tB3DLzyQXavvGTI+JUvEcuYh0EtTn1rvh9W6xxFHL38= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1038/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1031 h1:H6dg0sRgD4Cv5gLh6Dyb9YZgSKZRPuxePuSq/S6YwjQ= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.1031/go.mod h1:g8gKXKzfVl//PXhLeyRk2Nzlct7hMwHszgWcD2pdVFk= +github.com/tidwall/gjson v1.13.0 h1:3TFY9yxOQShrvmjdM76K+jc66zJeT6D3/VFFYCGQf7M= +github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= +github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= +github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/wechatpay-apiv3/wechatpay-go v0.2.21 h1:uIyMpzvcaHA33W/QPtHstccw+X52HO1gFdvVL9O6Lfs= +github.com/wechatpay-apiv3/wechatpay-go v0.2.21/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q= +github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/yidun/yidun-golang-sdk v1.0.29 h1:/KGl1g4LCMGoY8EwpfQ/G+eAsW57CvAi29drrKMECYA= +github.com/yidun/yidun-golang-sdk v1.0.29/go.mod h1:+JGdWbkUvLi9uKTtHI+nrxajulfZKA7BXDPlzt1RCsU= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +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/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= +go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM= +go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k= +golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +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/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.8.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/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +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.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +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/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/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/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/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-20210112080510-489259a85091/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-20211216021012-1d35b9e2eb4e/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.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.18.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/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +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.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +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.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/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= +golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200117065230-39095c1d176c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +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/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +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= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/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/datatypes v1.1.1-0.20230130040222-c43177d3cf8c h1:jWdr7cHgl8c/ua5vYbR2WhSp+NQmzhsj0xoY3foTzW8= +gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c/go.mod h1:SH2K9R+2RMjuX1CkCONrPwoe9JzVv2hkQvEu4bXGojE= +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/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= +gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg= +gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= +gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU= +gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= +gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0= +gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= +gorm.io/gen v0.3.26 h1:sFf1j7vNStimPRRAtH4zz5NiHM+1dr6eA9aaRdplyhY= +gorm.io/gen v0.3.26/go.mod h1:a5lq5y3w4g5LMxBcw0wnO6tYUCdNutWODq5LrIt75LE= +gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= +gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= +gorm.io/plugin/dbresolver v1.5.3 h1:wFwINGZZmttuu9h7XpvbDHd8Lf9bb8GNzp/NpAMV2wU= +gorm.io/plugin/dbresolver v1.5.3/go.mod h1:TSrVhaUg2DZAWP3PrHlDlITEJmNOkL0tFTjvTEsQ4XE= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= +howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +modernc.org/fileutil v1.0.0 h1:Z1AFLZwl6BO8A5NldQg/xTSjGLetp+1Ubvl4alfGx8w= +modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +stathat.com/c/consistent v1.0.0 h1:ezyc51EGcRPJUxfHGSgJjWzJdj3NiMU9pNfLNGiXV0c= +stathat.com/c/consistent v1.0.0/go.mod h1:QkzMWzcbB+yQBL2AttO6sgsQS/JSTapcDISJalmCDS0= diff --git a/pkg/authmeta/rbac.go b/pkg/authmeta/rbac.go new file mode 100644 index 0000000..6316d7a --- /dev/null +++ b/pkg/authmeta/rbac.go @@ -0,0 +1,46 @@ +package authmeta + +// 定义通用 + +type TenantItem struct { + Name string + Type string + Code string +} + +type ScopeItem struct { + Name string + Type string + Code string +} + +type PrivilegeItem struct { + Name string + Type string + Code string + Children []PrivilegeItem +} + +// (comment:(?.+)){0}" json.*`$ +type RoleItem struct { + Name string + Code string + UserType string + Desc string + PrivilegeResource []string + PrivilegeInterface []string +} + +type AdminUser struct { + Username string + Channel string + ChannelCode string + Nickname string + Desc string + State int32 + Password string + PassCipher string + PassSalt string + ExtID string + Roles []string +} diff --git a/pkg/cache/RedisSingleton.go b/pkg/cache/RedisSingleton.go new file mode 100644 index 0000000..6c2010f --- /dev/null +++ b/pkg/cache/RedisSingleton.go @@ -0,0 +1,174 @@ +package cache + +import ( + "sync" + + redis "github.com/redis/go-redis/v9" +) + +// 公共redis单例 +var commonInstance *singleton +var commonOnce sync.Once + +func CommonClient() *redis.Client { + return GetCommonRedisInstance().RedisClient +} + +// 获取公用redis连接 +func GetCommonRedisInstance() *singleton { + commonOnce.Do(func() { + commonInstance = &singleton{} + commonInstance.RedisClient = createCommonmRedisClient() + }) + return commonInstance +} + +// 用户redis单例 +var userInstance *singleton +var userOnce sync.Once + +func UserClient() *redis.Client { + return GetUserRedisInstance().RedisClient +} + +// 获取公用redis连接 +func GetUserRedisInstance() *singleton { + userOnce.Do(func() { + userInstance = &singleton{} + userInstance.RedisClient = createUserRedisClient() + }) + return userInstance +} + +// 用户关系redis单例 +var relationInstance *singleton +var relationOnce sync.Once + +// 获取relation redis连接 +func GetUserRelationRedisInstance() *singleton { + relationOnce.Do(func() { + relationInstance = &singleton{} + relationInstance.RedisClient = createUserRelationRedisClient() + }) + return relationInstance +} + +// 动态redis单例 +var timelineInstance *singleton +var timelineOnce sync.Once + +// 获取动态redis连接 +func GetTimelineRedisInstance() *singleton { + timelineOnce.Do(func() { + timelineInstance = &singleton{} + timelineInstance.RedisClient = createTimelineRedisClient() + }) + return timelineInstance +} + +// 活动redis单例 +var activityInstance *singleton +var activityOnce sync.Once + +func ActivityClient() *redis.Client { + return GetActivityRedisInstance().RedisClient +} + +// 获取活动redis连接 +func GetActivityRedisInstance() *singleton { + activityOnce.Do(func() { + activityInstance = &singleton{} + activityInstance.RedisClient = createActivityRedisClient() + }) + return activityInstance +} + +// 公会redis单例 +var guildInstance *singleton +var guildOnce sync.Once + +func GuildClient() *redis.Client { + return GetGuildRedisInstance().RedisClient +} + +// 获取公会redis连接 +func GetGuildRedisInstance() *singleton { + guildOnce.Do(func() { + guildInstance = &singleton{} + guildInstance.RedisClient = createGuildRedisClient() + }) + return guildInstance +} + +// 聊天室redis单例 +var chatroomInstance *singleton +var chatroomOnce sync.Once + +func RoomClient() *redis.Client { + return GetChatroomRedisInstance().RedisClient +} + +// 获取chatroom redis连接 +func GetChatroomRedisInstance() *singleton { + chatroomOnce.Do(func() { + chatroomInstance = &singleton{} + chatroomInstance.RedisClient = createChatroomRedisClient() + }) + return chatroomInstance +} + +// SESSION redis单例 +var sessionInstance *singleton +var sessionOnce sync.Once + +// 获取Session redis连接 +func GetSessionRedisInstance() *singleton { + sessionOnce.Do(func() { + sessionInstance = &singleton{} + sessionInstance.RedisClient = createSessionRedisClient() + }) + return sessionInstance +} + +// 技能订单redis单例 +var skillInstance *singleton +var skillOnce sync.Once + +// 获取用户关系redis连接 +func GetSkillRedisInstance() *singleton { + skillOnce.Do(func() { + skillInstance = &singleton{} + skillInstance.RedisClient = createSkillRedisClient() + }) + return skillInstance +} + +// 活动redis单例 +var imInstance *singleton +var imOnce sync.Once + +// 获取用户关系redis连接 +func GetIMRedisInstance() *singleton { + imOnce.Do(func() { + imInstance = &singleton{} + imInstance.RedisClient = createIMRedisClient() + }) + return imInstance +} + +// Cms系统 redis单例 +var cmsInstance *singleton +var cmsOnce sync.Once + +func CmsClient() *redis.Client { + return GetCmsRedisInstance().RedisClient +} + +// 获取公用redis连接 +func GetCmsRedisInstance() *singleton { + cmsOnce.Do(func() { + cmsInstance = &singleton{} + cmsInstance.RedisClient = createCmsRedisClient() + }) + return cmsInstance +} diff --git a/pkg/cache/redis_client.go b/pkg/cache/redis_client.go new file mode 100644 index 0000000..a2aa0d1 --- /dev/null +++ b/pkg/cache/redis_client.go @@ -0,0 +1,163 @@ +package cache + +import ( + logs "servicebase/pkg/log" + "context" + + redis "github.com/redis/go-redis/v9" + "github.com/spf13/viper" +) + +type singleton struct { + RedisClient *redis.Client +} + +func Ctx() context.Context { + return context.Background() +} + +// 创建公共的redis +func createCommonmRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.default.addr"), + Password: viper.GetString("redis.default.pass"), + DB: 0, + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 common redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建user的redis +func createUserRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.default.addr"), + Password: viper.GetString("redis.default.pass"), // no password set + DB: 1, + PoolSize: 32, + MinIdleConns: 4, + }) + + logs.Info("#REDIS#" + "创建一个 user redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建relation的redis +func createUserRelationRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.default.addr"), + Password: viper.GetString("redis.default.pass"), // no password set + DB: 2, + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 relation redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建timeline的redis +func createTimelineRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.default.addr"), + Password: viper.GetString("redis.default.pass"), // no password set + DB: 3, + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 timeline redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建活动的redis +func createActivityRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.activity.addr"), + Password: viper.GetString("redis.activity.pass"), // no password set + DB: viper.GetInt("redis.activity.db"), + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 activity redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建俱乐部的redis +func createGuildRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.guild.addr"), + Password: viper.GetString("redis.guild.pass"), // no password set + DB: viper.GetInt("redis.guild.db"), + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 guild redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建chatroom的redis +func createChatroomRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.default.addr"), + Password: viper.GetString("redis.default.pass"), // no password set + DB: 6, + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 chatroom redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建session的redis +func createSessionRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.default.addr"), + Password: viper.GetString("redis.default.pass"), // no password set + DB: 7, + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 session redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建用户关系的redis +func createSkillRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.default.addr"), + Password: viper.GetString("redis.default.pass"), // no password set + DB: 8, + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 skill redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建IM的redis +func createIMRedisClient() *redis.Client { + client := redis.NewClient(&redis.Options{ + Addr: viper.GetString("redis.default.addr"), + Password: viper.GetString("redis.default.pass"), // no password set + DB: 10, + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 im redis连接池,返回一个连接" + "#REDIS#") + return client +} + +// 创建CMS的redis +func createCmsRedisClient() *redis.Client { + redisHost := viper.GetString("redis.default.addr") + redisPwd := viper.GetString("redis.default.pass") + client := redis.NewClient(&redis.Options{ + Addr: redisHost, + Password: redisPwd, + DB: 11, + PoolSize: 32, + MinIdleConns: 4, + }) + logs.Info("#REDIS#" + "创建一个 cms redis连接池,返回一个连接" + "#REDIS#") + return client +} diff --git a/pkg/cache/redis_key.go b/pkg/cache/redis_key.go new file mode 100644 index 0000000..71e9715 --- /dev/null +++ b/pkg/cache/redis_key.go @@ -0,0 +1,511 @@ +package cache + +import "time" + +const ( + // 验证码的RedisKEY + biz_type + mobile = verification code + AUTH_CODE_KEY_PREV = "AUTH_CODE_KEY_" + SMS_CODE_EXPIRATION_KEY = "SMS_CODE_EXPIRATION_" +) + +const ( + //微信登录用户的KEY + WX_SESSION_ID = WxUser json + WX_SESSION_USER_KEY_PREV = "WX_SESSION_USER_KEY_" + //微信unionID绑定的嗯嗯ID + WX_UNION_ID = USER_ID + WX_UNIONID_BINDED_ID_PREV = "WX_UNIONID_BINDED_ID_" +) + +const ( + //管理员Session + staff_id = staffmodel + SESSION_STAFF_PREV = "SESSION_STAFF_" + + BANNER_KEY_PREV = "BANNER_LIST_KEY_PREV_" + LuckBoxPrize = "LUCK_BOX_PRIZE" + HotBoxPrize = "HOT_BOX_PRIZE" + HotBoxAngerPrize = "HOT_BOX_ANGER_PRIZE" + PetPrize = "PET_PRIZE" + // 下载页 + COMMON_DOWNLOAD_DATA = "COMMON_DOWNLOAD_DATA" + WITHDRAW_WHITE_LIST = "WITHDRAW_SPEC_ACCOUNT_LIST_KEY" + JACKPOT_WHITE_LIST = "HIT_EGG_SINGLE_POOL_USER" + + HomeDataConfig = "HOME_DATA_CONFIG" + + AppSettingKey = "APP_SETTING_KEY" + + PRODUCT_KEY_PREV = "PRODUCT_LIST_KEY" + ProductNCoin_KEY_PREV = "PRODUCT_N_COIN_LIST_KEY" + + //礼物列表 = string + GIFT_WALL_VIEW_LIST_KEY = "TOTALLY_GIFT_LIST_KEY" + + // 审核帐号列表 + APPLE_APPROVE_ID_LIST_KEY = "APPLE_APPROVE_ID_LIST" +) + +const ( + + // 验证码的RedisKEY +biz_type+mobile = verification code + VERICODE_KEY_PREV = "VERICODE_KEY_" + + // 验证码的默认过期时间 5分钟 + VERICODE_DEFAULT_EXPIRE_DURATION = time.Minute * 5 + + // 登录验证码的过期时间 5分钟 + SIGN_IN_VERICODE_DURATION = time.Minute * 5 + + // 验证码发送时间 + biz_type + mobile = 时间 + VERICODE_SEND_TIME_PREV = "VERICODE_SEND_TIME_" + + // 授权令牌的redisKEY +access_token = user_id + // ACCESSTOKEN_KEY_PREV = "ACCESSTOKEN_" + + //accesstoken 过期时间为30天 + // ACCESSTOKEN_EXPIRE_DURATION = time.Hour * 24 * 180 + + // 用户信息的RedisKEY +user_id = user_model_json + USER_DETAIL_KEY_PREV = "USER_DETAIL_" + + // 用户VIP信息的RedisKEY + user_id = user_vip_model_json + USER_VIP_MODEL_KEY_PREV = "USER_VIP_MODEL_" + + // 用户粉丝列表 + user_id = zset 按关注时间 + USER_FAN_LIST_KEY_PREV = "USER_FAN_LIST_KEY_" + + // 用户关注列表 + user_id = zset 按关注时间 + USER_FOLLOW_LIST_KEY_PREV = "USER_FOLLOW_LIST_KEY_" + + // 用户黑名单列表 + user_id = set + USER_BLACK_LIST_KEY_PREV = "USER_BLACK_LIST_KEY_" + + // 数据版本号缓存 + DATA_VERSION_KEY = "DATA_VERSION_KEY" + + // 兴趣列表的KEY + DATA_HOBBIES_KEY = "DATA_HOBBIES_KEY" + + // 黑名单关键词的KEY + DATA_BLACK_KEYWORD_KEY = "DATA_BLACK_KEYWORD_KEY" + + //AppSetting的KEY + APP_SETTING_KEY = "APP_SETTING_KEY" + + // 首页内容配置 + HOME_DATA_CONFIG = "HOME_DATA_CONFIG" + + // 七牛图片上传的TOKEN EKY + QINIU_PHOTO_UPLOAD_KEY = "QINIU_PHOTO_UPLOAD_KEY" + + // 运营后台七牛图片上传的TOKEN EKY + QINIU_PHOTO_UPLOAD_KEY_FOR_OPERATION = "QINIU_PHOTO_UPLOAD_KEY_FOR_OPERATION" + + // 七牛audio上传的TOKEN EKY + QINIU_AUDIO_UPLOAD_KEY = "QINIU_AUDIO_UPLOAD_KEY" + + // 七牛VIDEO上传的TOKEN EKY + QINIU_VIDEO_UPLOAD_KEY = "QINIU_VIDEO_UPLOAD_KEY" + + // 用户照片墙 + user_id = string + USER_PHOTO_LIST_KEY_PREV = "USER_PHOTO_LIST_KEY_" + + // 用户兴趣 + user_id = string + USER_HOBBIES_LIST_KEY_PREV = "USER_HOBBIES_LIST_KEY_" + + // 用户Tag + user_id = string + USER_TAG_LIST_KEY_PREV = "USER_TAG_LIST_KEY_" + + // 用户Tag + user_id = string + USER_CS_SET = "USER_CS_SET" + + // 用户属性 + user_id = string + USER_PROP_LIST_KEY_PREV = "USER_PROP_LIST_KEY_" + + // 用户别名 + user_id = hash + USER_ALIAS_NAME_KEY_PREV = "USER_ALIAS_NAME_KEY_" + + // 用户最后活跃时间 + USER_LAST_HEART_TIME = "USER_LAST_HEART_TIME" + + // 商品列表 = string + PRODUCT_LIST_KEY = "PRODUCT_LIST_KEY" + PRODUCT_N_COIN_LIST_KEY = "PRODUCT_N_COIN_LIST_KEY" + + // 正常的礼物列表 = string + GIFT_LIST_KEY = "GIFT_LIST_KEY" + + GENERAL_RANK_REWARD_KEY = "GENERAL_RANK_CHARM_REWARD_KEY" + + GENERAL_RANK_BALLER_KEY = "GENERAL_RANK_BALLER_REWARD_KEY" + + // 全部礼物列表 包括过期的 + TOTALLY_GIFT_LIST_KEY = "TOTALLY_GIFT_LIST_KEY" + + // 礼物详情 + giftId = DBModel + GIFT_DETAIL_KEY_PREV = "GIFT_DETAIL_" + + // 首页tab列表 = string + HOME_TAB_LIST_KEY = "HOME_TAB_LIST_KEY" + + //banner列表 + position_code = string + BANNER_LIST_KEY_PREV = "app:data:banner" + + // 银行列表 + BANK_LIST_KEY = "BANK_LIST_KEY" + + // 聊天室模板列表 + CHATROOM_TEMPLATE_LIST_KEY = "CHATROOM_TEMPLATE_LIST_KEY" + + // 用户收藏的聊天室KEY + user_id + USER_COLLECT_CHATROOM_LIST_KEY_PREV = "USER_COLLECT_CHATROOM_LIST_" + + // 用户访问的聊天室KEY + user_id + USER_VISITED_CHATROOM_LIST_KEY_PREV = "USER_VISITED_CHATROOM_LIST_" + + // 聊天室周榜key + chatroomid + 年 + 周 = 总魅力 某个聊天室当前周总魅力值 + CHATROOM_WEEKLY_TOTAL_INCOME_KEY = "CHATROOM_WEEKLY_TOTAL_INCOME_" + + // 聊天室周榜key + chatroomid + 年 + 周 = 总消费 某个聊天室当前周总贡献(流水) + CHATROOM_WEEKLY_TOTAL_CONSUME_KEY = "CHATROOM_WEEKLY_TOTAL_CONSUME_" + + // 聊天室周榜key + 年 + 周 = ZSCORE 周聊天室收益排行榜 + CHATROOM_WEEKLY_ROOM_REVENUE_TOP_LIST = "CHATROOM_WEEKLY_ROOM_REVENUE_TOP_LIST" + + // 房间周贡献榜KEY + chatroomid + 年 + 周 = zset集合 某个聊天室的周贡献榜单 + CHATROOM_WEEKLY_CONSUME_USER_LIST_KEY_PREV = "CHATROOM_WEEKLY_CONSUME_USER_LIST_KEY_" + + // 房间月贡献榜KEY + chatroomid + 年月 = zset集合 某个聊天室的月贡献榜单 + CHATROOM_MONTH_CONSUME_USER_LIST_KEY_PREV = "CHATROOM_MONTH_CONSUME_USER_LIST_KEY_" + + // 房间总贡献榜KEY + chatroomid = zset集合 某个聊天室的贡献榜单 + CHATROOM_ALL_CONSUME_USER_LIST_KEY_PREV = "CHATROOM_ALL_CONSUME_USER_LIST_KEY_" + + // 房间日贡献榜KEY + chatroomid = zset集合 某个聊天室的贡献榜单 + CHATROOM_DAY_CONSUME_USER_LIST_KEY_PREV = "CHATROOM_DAY_CONSUME_USER_LIST_KEY_" + + // 房间周魅力KEY + chatroomid + 年 + 周 = zset集合 某个聊天室的周魅力榜单 + CHATROOM_WEEKLY_CHARM_USER_LIST_KEY_PREV = "CHATROOM_WEEKLY_CHARM_USER_LIST_KEY_" + + // 房间月魅力KEY + chatroomid + 年月 = zset集合 某个聊天室的月魅力榜单 + CHATROOM_MONTH_CHARM_USER_LIST_KEY_PREV = "CHATROOM_MONTH_CHARM_USER_LIST_KEY_" + + // 房间总魅力KEY + chatroomid + 年月 = zset集合 某个聊天室的总魅力榜单 + CHATROOM_ALL_CHARM_USER_LIST_KEY_PREV = "CHATROOM_ALL_CHARM_USER_LIST_KEY_" + + // 房间日魅力KEY + chatroomid + 日 = zset集合 某个聊天室的日魅力榜单 + CHATROOM_DAY_CHARM_USER_LIST_KEY_PREV = "CHATROOM_DAY_CHARM_USER_LIST_KEY_" + + // 聊天室超级管理员列表 SET + CHATROOM_SUPER_ADMIN_USER_LIST_KEY = "CHATROOM_SUPER_ADMIN_USER_LIST" + + // 聊天室房管列表key+chatroomId SET 某个聊天室的管理员列表 + CHATROOM_ADMIN_USER_LIST_PREV = "CHATROOM_ADMIN_USER_LIST_" + + // 聊天室主持人列表key+chatroomId SET 某个聊天室的主持人列表 + CHATROOM_HOST_USER_LIST_PREV = "CHATROOM_HOST_USER_LIST_" + + // 聊天室黑名单列表key+chatroomId SET 某个聊天室的黑名单列表 + CHATROOM_BLACK_USER_LIST_PREV = "CHATROOM_BLACK_USER_LIST_" + + // 聊天室在线人数 + chatroomId 某个聊天室的在线人数 + CHATROOM_ONLINE_USER_COUNT_PREV = "CHATROOM_ONLINE_USER_COUNT_" + + // 聊天室在线人数 + chatroomId 某个跟聊天室的在线人数(包含子房间) + CHATROOM_ROOT_ONLINE_USER_SET__PREV = "CHATROOM_ROOT_ONLINE_USER_SET_" + + // 开启的聊天室列表key 全服正在开厅的聊天室列表 + CHATROOM_OPENING_LIST_KEY = "CHATROOM_OPENING_LIST_KEY" + + // 推荐到首页的房间 + SET_RECOMMEND_ROOM_IDS_KEY = "SET_RECOMMEND_ROOM" + + CHATROOM_EMOJI_RESULT_PREV = "CHATROOM_EMOJI_RESULT_" + + // 聊天室当前主持人 + chatroomId = user_id 某个聊天室当前的主持人ID + CHATROOM_CURRENT_HOST_USER_PREV = "CHATROOM_CURRENT_HOST_USER_" + + // 聊天室DBModel缓存 某个聊天室的DB MODEL缓存 + // CHATROOM_DB_MODEL_KEY_PREV = "CHATROOM_DB_MODEL_KEY_" + + // 聊天室DBModel缓存 某个聊天室的DB MODEL缓存 + CHATROOM_HOT_SET = "CHATROOM_HOT_SET_" + + // 聊天室EXT DBModel缓存 某个聊天室的EXT DB MODEL缓存 + CHATROOM_EXT_DB_MODEL_KEY_PREV = "CHATROOM_EXT_DB_MODEL_KEY_PREV" + + // 聊天室全服周贡献榜KEY + 年 + 周 = zset 全服周贡献榜 + CHATROOM_TOTAL_CONSUME_USER_LIST_PREV = "CHATROOM_TOTAL_CONSUME_USER_LIST_" + + // 聊天室全服周魅力榜KEY + 年 + 周 = zset 全服周魅力榜 + CHATROOM_TOTAL_CHARM_USER_LIST_PREV = "CHATROOM_TOTAL_CHARM_USER_LIST_" + + // 牵手榜 + CHATROOM_HAND_PREV = "CHATROOM_HAND_PREV_" + + // 聊天室打赏连击次数key + chatroomId + userId + giftId + touserId = 连击次数 + CHATROOM_USER_COMBO_HIT_COUNT_PREV = "CHATROOM_USER_COMBO_HIT_COUNT_" + + // 连击已发送的全服消息数 + chatroomId + userId + giftId + touserId = 已发送的飞机数 + CHATROOM_COMBOHIT_SENDED_FULL_MSG_COUNT_PREV = "CHATROOM_COMBOHIT_SENDED_FULL_MSG_COUNT_" + + // 聊天室表情列表 + CHATROOM_EMOJI_LIST_KEY = "CHATROOM_EMOJI_LIST_KEY" + + // 聊天室座位缓存 key+chatroomId HASH 某个聊天室的座位列表 + CHATROOM_SEAT_LIST_HASH_KEY_PREV = "CHATROOM_SEAT_LIST_HASH_KEY_" + // 管理员麦序 + CHATROOM_SEAT_LIST_ADMIN_KEY_PREV = "CHATROOM_SEAT_LIST_ADMIN_" + CHATROOM_SEAT_HASH_ADMIN_KEY_PREV = "CHATROOM_SEAT_HASG_ADMIN_" + // 自由麦序 + CHATROOM_SEAT_LIST_FREE_KEY_PREV = "CHATROOM_SEAT_LIST_FREE_" + CHATROOM_SEAT_HASH_FREE_KEY_PREV = "CHATROOM_SEAT_HASH_FREE_" + // 聊天室排队列表对象缓存 key+chatroomId Hset 某个聊天室的申请上麦列表 + CHATROOM_WAITING_QUEUE_LIST_REVE = "CHATROOM_WAITING_QUEUE_LIST_" + // 聊天室排队列表 有序userId列表 + CHATROOM_WAITING_QUEUE_SORTED_USERID_PREV = "CHATROOM_WAITING_QUEUE_SORTED_USERID_" + CHATROOM_COMMON_SEAT_COUNTDOWN_LOCK = "CHATROOM_COMMON_SEAT_COUNTDOWN_LOCK" + CHATROOM_COMMON_SEAT_COUNTDOWN_ZSET = "CHATROOM_COMMON_SEAT_COUNTDOWN" + + // 聊天室的命令编号 + CHATROOM_CMD_SEQUENCE_NUMBER_PREV = "CHATROOM_CMD_SEQUENCE_NUMBER_" + + // VIP配置列表 + VIP_CONFIG_MODEL_LIST_KEY = "VIP_CONFIG_MODEL_LIST" + + // VIP配置列表 + VIP_RIGHT_MODEL_LIST_KEY = "VIP_RIGHT_MODEL_LIST" + + // 用户当前所在的房间ID + userid = chatroomid + // USER_CURRENT_IN_CHATROOM_ID_PREV = "USER_CURRENT_IN_CHATROOM_ID_" + + // 用户在聊天室的心跳时间 + userid = datetime + USER_IN_CHATROOM_HEARTBEAT_TIME_PREV = "USER_IN_CHATROOM_HEARTBEAT_TIME_" + + // 交友房间的阶段 开始时间 等数据 HASH + chatroomId = hash + FRIEND_CHATROOM_GAME_DATA_PREV = "FRIEND_CHATROOM_GAME_DATA_" + + // 被踢出房间的用户KEY +chatroom_id + user_id = 1 + KICKED_USER_FROM_CHATROOM_PREV = "KICKED_USER_FROM_CHATROOM_" + + // 交友模板 房间当轮魅力值 + chatroomId = zset + CHATROOM_CURRENT_ROUND_CHARM_ZSET = "CHATROOM_CURRENT_ROUND_CHARM_ZSET" + + // 聊天室关闭时间 10秒过期,如果存在不能创建 +chatroomId = close_time + CHATROOM_CLOSE_TIME_PREV = "CHATROOM_CLOSE_TIME_PREV" + + // 聊天室在线成员列表 + chatroomId = set + CHATROOM_ONLINE_MEMBER_LIST_PREV = "CHATROOM_ONLINE_MEMBER_LIST_PREV" + + // 聊天室机器人列表 + chatroomId = set + CHATROOM_ROBOT_LIST_PREV = "CHATROOM_ROBOT_LIST_PREV" + + // 聊天室守护配置 string + CHATROOM_GUARD_CONFIG_KEY = "CHATROOM_GUARD_CONFIG_KEY" + + // 聊天室活动列表KEY + CHATROOM_ACTIVITY_LIST_KEY = "CHATROOM_ACTIVITY_LIST_KEY" + + // 用户隐私设置的KEY +userId = string + USER_PRIVACY_SETTING_KEY = "USER_PRIVACY_SETTING_KEY_" + + // 用户头像框的KEY +userId = string + USER_AVATAR_DECORATION_KEY = "USER_AVATAR_DECORATION_KEY_" + + // 聊天室背景图 + chatroomID = string + CHATROOM_BACKGROUDN_IMG_URL_PREV = "CHATROOM_BACKGROUDN_IMG_URL_" + + // 聊天室每分钟的流水 + chatroomID + 分钟 = int64 + CHATROOM_MINUTE_REVENUE_PREV = "CHATROOM_MINUTE_REVENUE_" + + // 个人房间在线人数排序SET + CHATROOMID = ZSET SCORE = 人数 + PERSONAL_ROOM_SORTED_SET = "PERSONAL_ROOM_SORTED_SET" + + // 用户在聊天室里的签结果 + chatroomId + useId = string + ROCK_SKEWER_RESULT_PREV = "ROCK_SKEWER_RESULT_" + + // 礼物对应的头饰 + GIFTID = string + GIFT_INCLUDED_AVATAR_DECORATION_LIST_PREV = "GIFT_INCLUDED_AVATAR_DECORATION_LIST_" + + // 商品详情 + goodsId = string + GOODS_DETAIL_DB_MODEL_PREV = "GOODS_DETAIL_DB_MODEL_" + + // 用户当前使用的头饰或座驾 + GOODS_TYPE + "_" + USER_ID = USER_STORE MODEL STR + USER_CURRENT_USED_STORE_MODEL_PREV = "USER_CURRENT_USED_STORE_MODEL_" + + // 订单是否正在支付 + order_id = 1 + PAY_ORDER_IS_PAYING_PREV = "PAY_ORDER_IS_PAYING_" + + //============= 技能订单相关 ================== + + // 技能对象缓存的KEY + skill_id = string + SKILL_MODEL_KEY_PREV = "SKILL_MODEL_" + + // 技能配置 + SKILL_CONFIG_TREE_HASH_KEY = "SKILL_CONFIG_TREE_HASH" + + // 技能配置 + SKILL_CONFIG_KEY = "SKILL_CONFIG_" + + // 用户审核中的技能 +user_id = SET + USER_APPLYING_SKILL_ID_LIST_PREV = "USER_APPLYING_SKILL_ID_LIST_" + + // ///////////////////////// + // 派单 1、添加到房间的派单列表 CHATROOM_CURRENT_DISPATCH_ORDER_LIST + // 2、追加接单的用户 DISPATCH_ORDER_TO_USER_LIST DISPATCH_ORDER_TO_USER_MAP + // 3、用户可接单 DISPATCH_ORDER_USER_GET_LIST + // 陪玩接单 + // 1、移除用户可接单 DISPATCH_ORDER_USER_GET_LIST + // 2、添加用户已接单 DISPATCH_ORDER_USER_GET_TAKED_LIST + // 3、添加派单已接单用户 DISPATCH_ORDER_TO_USER_TAKED_LIST + // 派单结束 + // 1、删除房间派单列表中的数据 CHATROOM_CURRENT_DISPATCH_ORDER_LIST + // 2、用户可解的单中删除该派单 DISPATCH_ORDER_USER_GET_LIST DISPATCH_ORDER_USER_GET_TAKED_LIST + // 3、删除派给的用户列表 DISPATCH_ORDER_TO_USER_LIST DISPATCH_ORDER_TO_USER_MAP + // ///////////////////////// + + // 聊天室当前派单ID + chatroomid = order_id + CHATROOM_CURRENT_DISPATCH_ORDER_ID = "CHATROOM_CURRENT_DISPATCH_ORDER_ID_" + // 聊天室当前派单列表 + chatroomid = order_id + CHATROOM_CURRENT_DISPATCH_ORDER_LIST = "CHATROOM_CURRENT_DISPATCH_ORDER_LIST_" + // 当前派单已派的用户LIST + order_id = userIds + DISPATCH_ORDER_TO_USER_LIST = "DISPATCH_ORDER_TO_USER_LIST_" + // 当前派单已派的用户SET + order_id = userIds (实际是Set) + DISPATCH_ORDER_TO_USER_MAP = "DISPATCH_ORDER_TO_USER_MAP_" + // 当前用户可接的派单 + user_id = orderIds + DISPATCH_ORDER_USER_GET_LIST = "DISPATCH_ORDER_USER_GET_LIST_" + // 当前派单接单的用户 + order_id = userIds + DISPATCH_ORDER_TO_USER_TAKED_LIST = "DISPATCH_ORDER_TO_USER_TAKED_LIST_" + // 当前用户已接的派单 + order_id = userIds + DISPATCH_ORDER_USER_GET_TAKED_LIST = "DISPATCH_ORDER_USER_GET_TAKED_LIST_" + + // ============= 定时任务ID ============== + + // 定时清理异常掉线的聊天室用户 + TASK_ID_CLEAR_CHATROOM_DEADED_USER = "TASK_ID_CLEAR_CHATROOM_DEADED_USER" + TASK_ID_CLEAR_DISPATCH_CHATROOM_DEADED_USER = "TASK_ID_CLEAR_DISPATCH_CHATROOM_DEADED_USER" + + // 自动解冻帐号 + TASK_ID_AUTO_UNFROZEN_USER = "TASK_ID_AUTO_UNFROZEN_USER" + + // 定时清理房间麦序 + TASK_ID_CLEAR_CHATROOM_SEAT_USER = "TASK_ID_CLEAR_CHATROOM_SEAT_USER" + + // 定时清理个人厅异常掉线的聊天室用户 + TASK_ID_CLEAR_PERSONAL_CHATROOM_DEADED_USER = "TASK_ID_CLEAR_PERSONAL_CHATROOM_DEADED_USER" + + // ============ 打赏特殊帐号 刷空单 ================== + // 老板号 + DASHANG_SPEC_ACCOUNT_BOSS_LIST_KEY = "DASHANG_SPEC_ACCOUNT_BOSS_LIST" + + // 服务员号 + DASHANG_SPEC_ACCOUNT_WAITTER_LIST_KEY = "DASHANG_SPEC_ACCOUNT_WAITTER_LIST" + + // 指定厅 + DASHANG_SPEC_BOSS_WAITTER_ROOM_LIST_KEY = "DASHANG_SPEC_BOSS_WAITTER_ROOM_LIST_KEY" + + // 置顶厅 + SET_TOP_CHATROOM_ID_LIST_KEY = "SET_TOP_CHATROOM_ID_LIST_KEY" + + // 提现特殊帐号 可日提的 + WITHDRAW_SPEC_ACCOUNT_LIST_KEY = "WITHDRAW_SPEC_ACCOUNT_LIST_KEY" + + // SVIP用户每次钻石打赏限额 + user_id = 已用 + HIT_EGG_SVIP_USER_DAY_USED_MONEY = "HIT_EGG_SVIP_USER_DAY_USED_MONEY_" + + // 用户动态数 + user_id = value + USER_TIMELINE_COUNT = "USER_TIMELINE_COUNT_" + + // 用户位置的集合 + LOCATION_USER = "LOCATION_USER" + + // 用户最后获取广播的时间 + user_id = string + USER_LAST_GET_BROADCAST_TIME = "USER_LAST_GET_BROADCAST_TIME_" + + // 动态详情model + timelineId = model json + TIMELINE_MODEL_PREV = "TIMELINE_MODEL_" + + // 日注册用户数 + YYYY-MM-DD = string + DAY_SIGNUP_USER_COUNT_PREV = "DAY_SIGNUP_USER_COUNT_" + + // 技能等级配置 + SKILL_LEVEL_CONFIG = "SKILL_LEVEL_CONFIG" + + // 动态Location的集合 + TIMELINE_LOCATION_COLLECTION_KEY = "TIMELINE_LOCATION_COLLECTION" + + // 动态的点赞用户列表 + TIMELINEID = LIST + TIMELINE_PRAISED_USER_LIST_PREV = "TIMELINE_PRAISED_USER_LIST_" + + // 动态的点赞数 = string + TIMELINE_PRAISED_USER_COUNT_PREV = "TIMELINE_PRAISED_USER_COUNT_" + + // 关注的动态 +userid = list + TIMELINE_FOLLOWED_KEY_PREV = "TIMELINE_FOLLOWED_KEY_" + + // 关注的动态 +userid = list + TIMELINE_FOLLOWED_NEW_CNT_KEY_PREV = "TIMELINE_FOLLOWED_NEW_CNT_KEY_" + + // 用户勋章缓存 + USER_ID = STR + USER_MEDAL_LIST = "USER_MEDAL_LIST_" + + // SKU勋章缓存 + SKU_ID = STR + SKU_MEDAL_LIST = "SKU_MEDAL_LIST_" + + // 勋章缓存 = STR + MEDAL_LIST_KEY = "MEDAL_LIST_KEY" + + // 进入场景对象缓存 + sceneId = str + ENTER_ROOM_SCENE_MODEL_PREV = "ENTER_ROOM_SCENE_MODEL_" + + // VIP SCENE 列表 + VIP_SCENE_LIST = "VIP_SCENE_LIST" + + // MainTabBar 列表 = string + MAIN_TAB_BAR_LIST_KEY = "MAIN_TAB_BAR_LIST" + + // 青少年模式集合 + CHILD_MODE_SET_KEY = "CHILD_MODE_SET" + + // 爵位配置Hash + ALL_NOBILITY_CONFIG_LIST_KEY = "ALL_NOBILITY_CONFIG_LIST" + + // 用户贵族信息的RedisKEY + user_id = user_nobility_model_json + USER_NOBILITY_MODEL_KEY_PREV = "USER_NOBILITY_MODEL_" + + // 开箱排行榜KEY + USER_OPEN_BOX_RANK_PREV = "USER_OPEN_BOX_RANK_" + + // 易盾TOKEN对应手机号 + YIDUN_TOKEN_PREV = "YIDUN_TOKEN_" + + //APPLE登录AUTH CODE的key + APPLE_AUTH_CODE_PREV = "APPLE_AUTH_CODE_" + + // 用户支付宝充值的支付宝帐号hash + USERID = HASH + USER_ALIPAY_RECHARGE_PAY_ACCOUNT_HASH_PREV = "USER_ALIPAY_RECHARGE_PAY_ACCOUNT_HASH_" + USER_ALIPAY_RECHARGE_N_COIN_PAY_ACCOUNT_HASH_PREV = "USER_ALI_RECHARGE_N_COIN_ACCOUNT_HASH_" + + // 谁给用户发了多少信息 + USER_ID = HASH + USER_MSG_MAP_FROM_PREV = "USER_MSG_MAP_FROM_" + + // 用户特殊颜色缓存 + USER_SPEC_COLOR_MODEL_PREV = "USER_SPEC_COLOR_MODEL_" + + // 用户IAP充值 预检查通过的key + USER_IAP_RECHARGE_PASS_KEY = "USER_IAP_RECHARGE_PASS_" + + // 用户最后获取访客记录的时间 + USER_LAST_GET_VISITED_LIST_TIME_PREV = "USER_LAST_GET_VISITED_LIST_TIME_" + + // 用户新访客set + USER_NEW_VISITOR_SET_PREV = "USER_NEW_VISITOR_SET_" + + // 用户修改昵称缓存记录 + USER_EDIT_NICKNAME_COUNT_PREV = "USER_EDIT_NICKNAME_COUNT_" + + // 公会相关的 + // 公会信息 + GUILD_MODEL_KEY_PREV = "guild:model:" + + // 周星礼物发放定时任务的礼物列表 + WEEK_STAR_GRANT_GIFT_KEY = "WEEK_STAR_GRANT_GIFT_KEY" +) diff --git a/pkg/cache/redis_lock.go b/pkg/cache/redis_lock.go new file mode 100644 index 0000000..f1ec722 --- /dev/null +++ b/pkg/cache/redis_lock.go @@ -0,0 +1,68 @@ +package cache + +import ( + "servicebase/pkg/log" + "errors" + "time" +) + +func Lock(key string) (e error) { + var success bool + TryMax := 6 + redisClient := GetCommonRedisInstance().RedisClient + for i := 0; i < TryMax; i++ { + success, e = redisClient.SetNX(Ctx(), key, time.Now(), time.Millisecond*1000*3).Result() + if e != nil { + log.Info("Lock GetCommonRedisInstance error: " + e.Error()) + } + if success { + return nil + } + time.Sleep(time.Millisecond * 50) + } + return errors.New("操作太频繁了~") +} + +func Free(key string) { + client := GetCommonRedisInstance().RedisClient + _ = client.Del(Ctx(), key).Err() +} + +const ( + TryMax = int(30) + TryDuration = time.Millisecond * 13 + LockTimeout = time.Millisecond * 700 +) + +func RedisLockGetTime(key string, duration time.Duration) (e error) { + redisClient := GetCommonRedisInstance().RedisClient + success, e := redisClient.SetNX(Ctx(), key, "1", duration).Result() + if !success { + e = errors.New("(LOCK_FAILED)系统繁忙,请稍后再试!") + } + return +} + +func RedisLockGet(key string) (e error) { + redisClient := GetCommonRedisInstance().RedisClient + success := false + for i := 0; i < TryMax; i++ { + success, e = redisClient.SetNX(Ctx(), key, time.Now(), LockTimeout).Result() + if nil != e { + return + } + if success { + break + } + time.Sleep(TryDuration) + } + if !success { + e = errors.New("(LOCK_FAILED)系统繁忙,请稍后再试!") + } + return +} + +func RedisLockDel(key string) { + redisClient := GetCommonRedisInstance().RedisClient + _ = redisClient.Del(Ctx(), key).Err() +} diff --git a/pkg/cache/user/user.go b/pkg/cache/user/user.go new file mode 100644 index 0000000..10263f9 --- /dev/null +++ b/pkg/cache/user/user.go @@ -0,0 +1,68 @@ +package cache_user + +import ( + "servicebase/pkg/cache" + "servicebase/pkg/tools" + "fmt" + "strings" + "time" + + "github.com/anxpp/beego/logs" + "github.com/anxpp/common-utils/str" +) + +const key = "user:models" +const keyToken = "user:token" + +// 用户当前所在的房间ID + userid = chatroomid +const ACCESSTOKEN_KEY_PREV = "ACCESSTOKEN_" +const ACCESSTOKEN_EXPIRE_DURATION = time.Hour * 24 * 180 + +// 通过token获取userId +func IdByToken(token string) (userId string) { + if len(token) == 0 { + return + } + var e error + if userId, e = cache.CommonClient().HGet(cache.Ctx(), keyToken, token).Result(); e != nil || len(userId) == 0 { + userId, e = cache.CommonClient().Get(cache.Ctx(), ACCESSTOKEN_KEY_PREV+token).Result() + if e != nil { + logs.Error("GetUserIdByAccessToken redisError=%v token=%v", e.Error(), token) + return + } else if len(userId) > 0 { + // 迁移token + ttl, err := cache.CommonClient().TTL(cache.Ctx(), ACCESSTOKEN_KEY_PREV+token).Result() + if err != nil { + return + } + value := fmt.Sprintf("%s#%s", userId, str.TimeToString(time.Now().Add(ttl))) + if err := cache.CommonClient().HSet(cache.Ctx(), keyToken, token, value).Err(); err == nil { + cache.CommonClient().Del(cache.Ctx(), ACCESSTOKEN_KEY_PREV+token) + } + } + } else { + arr := strings.Split(userId, "#") + if len(arr) != 2 { + _ = IdTokenDel(token) + return "" + } + over := tools.StrToDateTime(arr[1]) + if over.Before(time.Now()) { + _ = IdTokenDel(token) + return "" + } + userId = arr[0] + } + return +} + +func IdTokenSet(token, userId string) (e error) { + value := fmt.Sprintf("%s#%s", userId, str.TimeToString(time.Now().Add(ACCESSTOKEN_EXPIRE_DURATION))) + return cache.CommonClient().HSet(cache.Ctx(), keyToken, token, value).Err() +} + +func IdTokenDel(token string) (e error) { + _, e = cache.CommonClient().HDel(cache.Ctx(), keyToken, token).Result() + cache.CommonClient().Del(cache.Ctx(), ACCESSTOKEN_KEY_PREV+token) + return +} diff --git a/pkg/cerrors/const.go b/pkg/cerrors/const.go new file mode 100644 index 0000000..0520e1f --- /dev/null +++ b/pkg/cerrors/const.go @@ -0,0 +1,63 @@ +package cerrors + +import "errors" + +const ( + Success = 200 + + BadRequest = 400 + Unauthorized = 401 + Forbidden = 403 + NotFound = 404 + NotAcceptable = 406 + Gone = 410 + RangeNotSatisfiable = 416 + + ParamError = 501 + + InternalServerError = 500 + ServiceUnavailable = 503 + + DataCreateError = 511 + DataUpdateError = 512 + DataUpdateNoneError = 515 + DataReadError = 513 + DataDeleteError = 514 + + // ContentSmsTemplateExistErr 81xx 内容维护错误码 + ContentSmsTemplateExistErr = 8100 +) + +var ( + CodeMsg = map[int]string{ + Success: "成功", + + BadRequest: "请求出错", + Unauthorized: "登录信息过期", + Forbidden: "无权限访问", + NotFound: "数据不存在", + NotAcceptable: "服务器忙", + Gone: "数据已失效", + RangeNotSatisfiable: "请求参数范围不支持", + + ParamError: "参数错误", + InternalServerError: "服务器错误", + ServiceUnavailable: "服务暂不可用", + + DataCreateError: "数据创建失败", + DataUpdateError: "数据更新失败", + DataUpdateNoneError: "数据更新无效", + DataReadError: "数据查询失败", + DataDeleteError: "数据删除失败", + + ContentSmsTemplateExistErr: "短信模板已存在", + } +) + +func Msg(code int) string { + return CodeMsg[code] +} + +func GetError(code int) error { + return errors.New(Msg(code)) +} diff --git a/pkg/client/configs/mail-template-reset.html b/pkg/client/configs/mail-template-reset.html new file mode 100644 index 0000000..e3385e8 --- /dev/null +++ b/pkg/client/configs/mail-template-reset.html @@ -0,0 +1,15 @@ + + + + + + {{.Title}} + + + +

Hello!

+

This is a password reset email.

+ {{.Url}} + + + \ No newline at end of file diff --git a/pkg/client/game/wz/wz_client.go b/pkg/client/game/wz/wz_client.go new file mode 100644 index 0000000..71cfab6 --- /dev/null +++ b/pkg/client/game/wz/wz_client.go @@ -0,0 +1,225 @@ +package client_game_wz + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "servicebase/pkg/utils" + + "github.com/anxpp/common-utils/logg" + "github.com/anxpp/common-utils/str" +) + +const WZYD_TOKEN = "SZN62jr4" +const WZYD_UID = "1702857155" + +func RoleInfo(targetUid string) (targetRole map[string]interface{}, e error) { + if len(targetUid) == 0 { + e = errors.New("参数不足") + return + } + apiUrl := "https://kohcamp.qq.com/game/koh/profile" + token := WZYD_TOKEN // 登录王者营地的token + uid := WZYD_UID // 营地ID + headerMap := make(map[string]string, 0) + headerMap["Content-Type"] = "application/json" + headerMap["userId"] = uid + headerMap["cCurrentGameId"] = "20001" + headerMap["Accept-Language"] = "zh-Hans-CN;q=1, en-CN;q=0.9" + headerMap["token"] = token + + paraMap := make(map[string]string, 4) + paraMap["CampPreloadHTTPHandledIdentifier"] = "2" + paraMap["targetUserId"] = targetUid + + resStr, err2 := utils.HttpDo(http.MethodPost, apiUrl, headerMap, str.ToJsonString(paraMap)) + + if err2 != nil { + logg.Info("调用王者营地数据查询失败", err2.Error()) + e = fmt.Errorf("调用王者营地数据查询失败: %v", err2.Error()) + return + } + + logg.Info(resStr) + + resMap := make(map[string]interface{}, 0) + json.Unmarshal([]byte(resStr), &resMap) + + if resMap["returnCode"].(float64) != 0 { + e = fmt.Errorf("调用王者营地数据查询失败2: %v", resMap["returnMsg"]) + return + } + + // 获取成功 + data := resMap["data"].(map[string]interface{}) + // 默认角色ID + targetRoleId := data["targetRoleId"].(string) + + //角色列表 + roleList := data["roleList"].([]interface{}) + + // 匹配默认角色 + for _, item := range roleList { + m := item.(map[string]interface{}) + if m["roleId"].(string) == targetRoleId { + targetRole = m + } + } + if targetRole == nil { + e = errors.New("未找到角色信息") + return + } + + // 其他数据 + head := data["head"].(map[string]interface{}) + mods := head["mods"].([]interface{}) + //targetRole["mods"] = mods + + for _, item := range mods { + mod := item.(map[string]interface{}) + modId := mod["modId"].(float64) + if modId == 401 { + // 总场次 + targetRole["totalPlayCount"] = mod["content"].(string) + } else if modId == 408 { + // MVP + targetRole["mvpCount"] = mod["content"].(string) + } else if modId == 409 { + // 胜率 + targetRole["winRate"] = mod["content"].(string) + } else if modId == 201 { + // 英雄数 + targetRole["heroCount"] = mod["content"].(string) + } else if modId == 202 { + // 皮肤数 + targetRole["skinCount"] = mod["content"].(string) + } else if modId == 702 { + // 巅峰赛 + targetRole["topScore"] = mod["content"].(string) + } else if modId == 304 { + // 战力 + targetRole["battleScore"] = mod["content"].(string) + } + } + return +} + +func RoleSkinList(roleId string) (result map[string][]interface{}, e error) { + apiUrl := "https://kohcamp.qq.com/game/itempage/skinlist" + token := WZYD_TOKEN // 登录王者营地的token + uid := WZYD_UID // 营地ID + + if len(roleId) == 0 { + e = errors.New("参数不足") + return + } + headerMap := make(map[string]string, 0) + headerMap["Content-Type"] = "application/json" + headerMap["userId"] = uid + headerMap["cCurrentGameId"] = "20001" + headerMap["Accept-Language"] = "zh-Hans-CN;q=1, en-CN;q=0.9" + headerMap["token"] = token + + paraMap := make(map[string]string, 4) + paraMap["roleId"] = roleId + + resStr, err2 := utils.HttpDo(http.MethodPost, apiUrl, headerMap, str.ToJsonString(paraMap)) + + if err2 != nil { + logg.Info("调用王者营地数据查询失败", err2.Error()) + e = fmt.Errorf("调用王者营地数据查询失败:%v", err2) + return + } + + resMap := make(map[string]interface{}, 0) + json.Unmarshal([]byte(resStr), &resMap) + + if _, ok := resMap["returnCode"]; ok { + e = fmt.Errorf("调用王者营地数据查询失败2: %v", resMap["returnMsg"]) + return + } + + //全部皮肤 + allSkin := resMap["allSkinConf"].([]interface{}) + // 用户的皮肤 + userSkinList := resMap["skinData"].([]interface{}) + + resultList := []interface{}{} + + rongyaoList := []interface{}{} // 荣耀典藏 + xiandingList := []interface{}{} // 限定 + shishiList := []interface{}{} // 史诗级 + chuanshuoList := []interface{}{} // 传说 + wushuangList := []interface{}{} //无双 + + for _, item := range userSkinList { + skinMap := item.(map[string]interface{}) + userSkinId := skinMap["skinId"].(float64) + + mySkin := getSkinModel(allSkin, userSkinId) + mySkin["acquireTime"] = skinMap["acquireTime"].(string) + + // 去掉隐藏的皮肤 + if mySkin["isHidden"].(float64) == 1 { + continue + } + + // 去掉原皮 + if int64(userSkinId)%100 == 0 { + continue + } + + // 等级处理 + classTypeName := mySkin["classTypeName"].([]interface{}) + + nameList := []string{} + for _, name := range classTypeName { + nameList = append(nameList, name.(string)) + } + + str := fmt.Sprintf("%s(%s)", mySkin["skinName"].(string), mySkin["heroName"].(string)) + + if utils.IsInStringList("荣耀典藏", nameList) { + rongyaoList = append(rongyaoList, str) + } + if utils.IsInStringList("限定", nameList) { + xiandingList = append(xiandingList, str) + } + if utils.IsInStringList("史诗品质", nameList) { + shishiList = append(shishiList, str) + } + if utils.IsInStringList("传说品质", nameList) { + chuanshuoList = append(chuanshuoList, str) + } + if utils.IsInStringList("无双", nameList) { + wushuangList = append(wushuangList, str) + } + + resultList = append(resultList, mySkin) + } + + logg.Info("皮肤数量", len(resultList)) + + result = make(map[string][]interface{}, 0) + // result["totalCount"] = len(resultList) + result["allSkin"] = resultList + result["荣耀典藏"] = rongyaoList + result["限定"] = xiandingList + result["史诗品质"] = shishiList + result["传说品质"] = chuanshuoList + result["无双"] = wushuangList + return +} + +func getSkinModel(allSkin []interface{}, userSkinId float64) (result map[string]interface{}) { + for _, item := range allSkin { + skin := item.(map[string]interface{}) + skinId := skin["skinId"].(float64) + if skinId == userSkinId { + result = skin + break + } + } + return +} diff --git a/pkg/client/http.go b/pkg/client/http.go new file mode 100644 index 0000000..876a508 --- /dev/null +++ b/pkg/client/http.go @@ -0,0 +1,89 @@ +package client + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "time" +) + +func NewClient() *http.Client { + tr := &http.Transport{ + MaxIdleConns: 10, + IdleConnTimeout: 30 * time.Second, + DisableCompression: true, + } + return &http.Client{ + Transport: tr, + Timeout: 5 * time.Second, + } +} + +func Get(url string, headers map[string]string, params map[string]string) (res []byte, e error) { + var ( + client = NewClient() + resp *http.Response + ) + req, _ := http.NewRequest(http.MethodGet, url, nil) + for k, v := range headers { + req.Header.Add(k, v) + } + q := req.URL.Query() + for k, v := range params { + q.Add(k, v) + } + req.URL.RawQuery = q.Encode() + if resp, e = client.Do(req); e != nil { + return + } + defer func(body io.ReadCloser) { + _ = body.Close() + }(resp.Body) + if res, e = io.ReadAll(resp.Body); e != nil { + return + } + if !success(resp.StatusCode) { + e = errors.New(fmt.Sprintf("status code error: %s", resp.Status)) + } + return +} + +func Post(url string, headers map[string]string, body map[string]interface{}) (res []byte, e error) { + var ( + client = NewClient() + resp *http.Response + ) + j, e := json.Marshal(body) + if e != nil { + return + } + req, _ := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(j)) + for k, v := range headers { + req.Header.Add(k, v) + } + //q := req.URL.Query() + //for k, v := range params { + // q.Add(k, v) + //} + //req.URL.RawQuery = q.Encode() + if resp, e = client.Do(req); e != nil { + return + } + defer func(body io.ReadCloser) { + _ = body.Close() + }(resp.Body) + if res, e = io.ReadAll(resp.Body); e != nil { + return + } + if !success(resp.StatusCode) { + e = errors.New(fmt.Sprintf("status code error: %s", resp.Status)) + } + return +} + +// func success(code int) bool { +// return code >= 200 && code < 400 +// } diff --git a/pkg/client/http_api/user.go b/pkg/client/http_api/user.go new file mode 100644 index 0000000..4230117 --- /dev/null +++ b/pkg/client/http_api/user.go @@ -0,0 +1,45 @@ +package http_api + +import ( + "servicebase/pkg/log" + "servicebase/pkg/res" + "servicebase/pkg/utils" + "errors" + + "github.com/go-resty/resty/v2" +) + +type InnerLoginReq struct { + Mobile string `json:"mobile"` + Signature string `json:"signature"` +} + +type InnerLoginRes struct { + Code string + Result res.AccessTokenDTO + Msg string +} + +func InnerLogin(url, secret, mobile string) (token string, e error) { + var req = map[string]string{ + "mobile": mobile, + } + sign := utils.CreateApiSign(req, secret) + req["Signature"] = sign + client := resty.New() + _ = client + var res InnerLoginRes + resp, err := client.R(). + SetHeader("Content-Type", "application/json"). + SetBody(req). + SetResult(&res). // or SetResult(AuthSuccess{}). + Post(url) + if err != nil { + return "", err + } + log.InfoF("%++v %v", res, string(resp.Body())) + if res.Code == "8000" { + return res.Result.AccessToken, nil + } + return "", errors.New("登录失败:" + res.Msg) +} diff --git a/pkg/client/mongo.go b/pkg/client/mongo.go new file mode 100644 index 0000000..efbfdb1 --- /dev/null +++ b/pkg/client/mongo.go @@ -0,0 +1,112 @@ +package client + +import ( + "context" + "fmt" + + "servicebase/pkg/common/req" + + "github.com/spf13/viper" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type MongoInitStarter struct { +} + +var Client *mongo.Client +var DB *mongo.Database + +func (s *MongoInitStarter) Init() error { + var ( + ctx = context.TODO() + host = viper.GetString("db.mongo.host") + port = viper.GetString("db.mongo.port") + username = viper.GetString("db.mongo.username") + password = viper.GetString("db.mongo.password") + dbname = viper.GetString("db.mongo.dbname") + e error + ) + // log.InfoF(ctx, "host=%s port=%s db=%s", host, port, dbname) + if Client, e = mongo.Connect(ctx, options.Client(). + SetAuth(options.Credential{Username: username, Password: password}). + ApplyURI(fmt.Sprintf("mongodb://%s:%s", host, port))); e != nil { + return e + } + DB = Client.Database(dbname) + return nil +} + +func CheckTable(c context.Context, table string) error { + if r, e := DB.ListCollectionNames(c, bson.M{"name": "table"}); e != nil { + return e + } else if len(r) == 0 { + return DB.CreateCollection(c, table) + } + return nil +} + +func InsertOne(c context.Context, table string, record interface{}) (*mongo.InsertOneResult, error) { + if e := CheckTable(c, table); e != nil { + return nil, e + } + return DB.Collection(table).InsertOne(c, record) +} + +func SaveOne(c context.Context, table string, filter, record interface{}) (*mongo.UpdateResult, error) { + if e := CheckTable(c, table); e != nil { + return nil, e + } + return DB.Collection(table).ReplaceOne(c, filter, record, options.Replace().SetUpsert(true)) +} + +func DeleteOne(c context.Context, table string, record interface{}) (*mongo.DeleteResult, error) { + if e := CheckTable(c, table); e != nil { + return nil, e + } + return DB.Collection(table).DeleteOne(c, record) +} + +func UpdateByID(c context.Context, table string, id interface{}, record interface{}) (*mongo.UpdateResult, error) { + if e := CheckTable(c, table); e != nil { + return nil, e + } + return DB.Collection(table).UpdateByID(c, id, bson.D{{Key: "$set", Value: record}}) +} + +func Page(c context.Context, table string, page req.Page, filter bson.D, results interface{}) (int64, error) { + if e := CheckTable(c, table); e != nil { + return 0, e + } + cursor, e := DB.Collection(table).Find( + c, + filter, + options.Find().SetSkip(int64(page.Offset())), + options.Find().SetLimit(int64(page.Limit())), + ) + if e != nil { + // log.ErrorF(c, "db Page error: %v", e) + return 0, e + } + defer func() { + if e := cursor.Close(c); e != nil { + // log.Error(c, e.Error()) + } + }() + if e != nil { + return 0, e + } + cnt, e := DB.Collection(table).CountDocuments(c, filter) + if e != nil { + return 0, e + } + return cnt, cursor.All(c, results) +} + +func MToD(m bson.M) (d bson.D) { + for key, value := range m { + d = append(d, bson.E{Key: key, Value: value}) + } + return +} diff --git a/pkg/client/netease/IMService.go b/pkg/client/netease/IMService.go new file mode 100644 index 0000000..736157a --- /dev/null +++ b/pkg/client/netease/IMService.go @@ -0,0 +1,132 @@ +package Netease + +import ( + "servicebase/pkg/common/HyTools" + "encoding/json" + "net/url" + "time" + + Netease "servicebase/pkg/common/netease" + + "github.com/anxpp/beego" + "github.com/anxpp/beego/logs" +) + +const ( + // ChatRoomManagerUserId 聊天室消息管理员ID + ChatRoomManagerUserId = "34cc7185d0b60eacf38f616b8aad8c51" + SystemNoticeUserId = "x94b992dbb4e4dfca9c971200d797a02" + P2pMessagesTypeSystemNotice = "104" + TimeDefaultFormat = "Y-m-d H:i:s" +) + +type ImService struct { +} + +// ImMsgBodyAttach IM消息 body对象 +type ImMsgBodyAttach struct { + TypeCode string `json:"TypeCode"` + BizData interface{} `json:"BizData"` + Msg string `json:"msg,omitempty"` +} + +// ChatRoomMsgAttach 聊天室自定义消息 +type ChatRoomMsgAttach struct { + TypeCode string `json:"TypeCode"` + BizData interface{} `json:"BizData"` +} + +// SendCustomMsgToChatroomByChatroomManager 向聊天室发消息 +func (s *ImService) SendCustomMsgToChatroomByChatroomManager(messageRoomId string, attachData ChatRoomMsgAttach) error { + msgParameter := make(map[string]string) + msgParameter["roomid"] = messageRoomId + msgParameter["msgId"] = HyTools.GetUUID() + msgParameter["fromAccid"] = ChatRoomManagerUserId + msgParameter["msgType"] = "100" //自定义消息 + msgParameter["resendFlag"] = "0" + bodyBytes, _ := json.Marshal(attachData) + msgParameter["ext"] = "" + msgParameter["attach"] = string(bodyBytes) + imClient := Netease.NewImClient() + return imClient.SendChatroomMsg(msgParameter) +} + +// SendCustomerMsgFromAToB 发IM点对点自定义消息 系统通知 用户关系变化 +func (s *ImService) SendCustomerMsgFromAToB(fromAccid, toAccid, pushContent, payloadJson string, bodyModel ImMsgBodyAttach, optionMap map[string]string) error { + msgParameter := make(map[string]string) + msgParameter["from"] = fromAccid + msgParameter["ope"] = "0" //0=p2p 1=群消息 + msgParameter["to"] = toAccid + msgParameter["type"] = "100" //0 表示文本消息, 1 表示图片, 2 表示语音, 3 表示视频, 4 表示地理位置信息, 6 表示文件, 100 自定义消息类型 + + bodyBytes, _ := json.Marshal(bodyModel) + + msgParameter["body"] = string(bodyBytes) //最大长度5000字符,为一个JSON串 + msgParameter["antispam"] = "false" //对于对接了易盾反垃圾功能的应用,本消息是否需要指定经由易盾检测的内容 只对消息类型为:100 自定义消息类型 的消息生效。 + + optionBytes, _ := json.Marshal(optionMap) + msgParameter["option"] = string(optionBytes) //发消息时特殊指定的行为选项,JSON格式,可用于指定消息的漫游,存云端历史,发送方多端同步,推送,消息抄送等特殊行为 + + //需要推送 + if optionMap["push"] == "true" { + if len(pushContent) > 0 { + msgParameter["pushcontent"] = pushContent // ios推送内容,不超过150字符,option选项中允许推送(push=true),此字段可以指定推送内容 + } + + if len(payloadJson) > 0 { + msgParameter["payload"] = payloadJson // ios 推送对应的payload,必须是JSON,不能超过2k字符 + } + } + imClient := Netease.NewImClient() + return imClient.SendMsg(msgParameter) +} + +// SendSystemNoticeToUser 给用户发系统消息 +// _ = messageService.SendSystemNoticeToUser(userId, "厅补贴到账通知", msgContent, "", "") +func (s *ImService) SendSystemNoticeToUser(toAccid, msgTitle, msgText, schemeUrl, imageUrl string) { + option := GetDefaultMsgOption() + fromUserId := SystemNoticeUserId + logs.Info("SendSystemNoticeToUser from " + fromUserId + "to " + toAccid) + pushContent := "" + payloadJson := "" + bizData := make(map[string]string, 0) + bizData["Title"] = url.QueryEscape(msgTitle) + bizData["Content"] = url.QueryEscape(msgText) + bizData["Scheme"] = schemeUrl + bizData["ImageUrl"] = imageUrl + bizData["CreateTime"] = beego.Date(time.Now(), TimeDefaultFormat) + //body的业务数据 + var bodyAttach ImMsgBodyAttach + bodyAttach.TypeCode = P2pMessagesTypeSystemNotice + bodyAttach.BizData = bizData + bodyAttach.Msg = msgTitle + err := s.SendCustomerMsgFromAToB(fromUserId, toAccid, pushContent, payloadJson, bodyAttach, option) + if nil != err { + logs.Error("通知发送失败!!!!") + logs.Info(err.Error()) + } +} + +// GetDefaultMsgOption 发送消息默认的配置 +func GetDefaultMsgOption() map[string]string { + /* + 1. roam: 该消息是否需要漫游,默认true(需要app开通漫游消息功能); + 2. history: 该消息是否存云端历史,默认true; + 3. sendersync: 该消息是否需要发送方多端同步,默认true; + 4. push: 该消息是否需要APNS推送或安卓系统通知栏推送,默认true; + 5. route: 该消息是否需要抄送第三方;默认true (需要app开通消息抄送功能); + 6. badge:该消息是否需要计入到未读计数中,默认true; + 7. needPushNick: 推送文案是否需要带上昵称,不设置该参数时默认true; + 8. persistent: 是否需要存离线消息,不设置该参数时默认true。 + */ + result := make(map[string]string) + result["roam"] = "true" + result["history"] = "true" + result["sendersync"] = "false" + result["push"] = "true" + result["route"] = "true" + result["badge"] = "true" + result["needPushNick"] = "false" + result["persistent"] = "true" + return result +} diff --git a/pkg/client/netease/MessageService.go b/pkg/client/netease/MessageService.go new file mode 100644 index 0000000..d56c6e0 --- /dev/null +++ b/pkg/client/netease/MessageService.go @@ -0,0 +1,104 @@ +package Netease + +const ( + // ChatroomCustomMessageTypePresentActivityMsg 聊天室打赏活动物品消息 + ChatroomCustomMessageTypePresentActivityMsg = "380" + // ChatroomCustomMessageTypeFullScreenNoticeMsg 聊天室 全服通知动效 + ChatroomCustomMessageTypeFullScreenNoticeMsg = "381" +) + +const ( + //聊天室字体颜色 - 黄色 + CHATROOM_SYSTEM_MSG_COLOR_YELLOW = "#FFD700" + //聊天室字体颜色 - 绿色 + CHATROOM_SYSTEM_MSG_COLOR_GREEN = "#8ADE4D" + //聊天室字体颜色 - 系统栏 + CHATROOM_SYSTEM_MSG_COLOR_SYSTEM_BLUE = "#43EAE1" + //聊天室字体颜色 - 紫色 + CHATROOM_SYSTEM_MSG_COLOR_PURPLE = "#E031FE" + // 默认等级的背景颜色 + SKILL_LEVEL_DEFAULT_BG_COLOR = "#FFD700" + //聊天室字体颜色 - 蓝色 + CHATROOM_SYSTEM_MSG_COLOR_BLUE = "#25C6FD" + //聊天室字体颜色 - 青色 + CHATROOM_SYSTEM_MSG_COLOR_QING = "#00FFCC" + //聊天室字体颜色 - 白色 + CHATROOM_SYSTEM_MSG_COLOR_WHITE = "#FFFFFF" +) + +type MessageService struct { +} + +type TextAndColor struct { + Text string + Color string +} + +// ChatroomFullScreenNoticeMsgBizData 聊天室活动全服飘屏通知 +type ChatroomFullScreenNoticeMsgBizData struct { + ChatroomId string + ContentIcon string + ContentText string + ContentTextColor string //内容字体颜色 + ContentBgColor string //背景颜色 + AnimationApngUrl string //加入播放礼物动效队列 + BgImgUrl string //背景图 + TextList []TextAndColor //文字颜色列表 + StayTime string //停留时长(秒) +} + +// ChatroomPresentActivityMsgBizData 聊天室打赏活动消息data数据结构 +type ChatroomPresentActivityMsgBizData struct { + ChatroomId string + FromUserId string + FromNickName string + FromAvatar string + FromNickNameColor string //打赏人昵称颜色 + ActionText string //动作文本 :赠送一个盲盒给 + ActionTextColor string //动作文本颜色 + + ToNickName string + ToNickNameColor string //被打赏人昵称颜色 + + PresentCount string //物品个数 + PresentGoodsName string + PresentGoodsIcon string + PresentGoodsNameColor string + + ResultGoodsIcon string + ComboHitCount string //连击次数 + AnimationApngUrl string //加入播放礼物动效队列 有的话显示播放动画 + AnimationFormat string //动画格式 SVGA APNG + FillMode string //填充模式 1=左右 2=上下 + + IsViewFlyView string //是否显示飘屏view 有的话显示连击信息 + //显示到信息流 + TextList []TextAndColor //信息流文字颜色列表 + +} + +// SendChatroomSystemMsgV2 发送聊天室系统消息 V2 +func (s *MessageService) SendChatroomSystemMsgV2(messageRoomId string, msgData ChatroomPresentActivityMsgBizData) (err error) { + // 发打赏消息 + var service ImService + attachModel := ChatRoomMsgAttach{} + //消息类型 + typeCode := ChatroomCustomMessageTypePresentActivityMsg + attachModel.TypeCode = typeCode + attachModel.BizData = msgData + err = service.SendCustomMsgToChatroomByChatroomManager(messageRoomId, attachModel) + return +} + +// SendChatroomPresentActivityFullServiceMsg 发送聊天室活动全服 +func (s *MessageService) SendChatroomPresentActivityFullServiceMsg(messageRoomId string, msgData ChatroomFullScreenNoticeMsgBizData) (err error) { + // 发打赏消息 + var service ImService + attachModel := ChatRoomMsgAttach{} + //消息类型 + typeCode := ChatroomCustomMessageTypeFullScreenNoticeMsg + attachModel.TypeCode = typeCode + attachModel.BizData = msgData + err = service.SendCustomMsgToChatroomByChatroomManager(messageRoomId, attachModel) + return +} diff --git a/pkg/client/netease/captcha.go b/pkg/client/netease/captcha.go new file mode 100644 index 0000000..0ebee50 --- /dev/null +++ b/pkg/client/netease/captcha.go @@ -0,0 +1,43 @@ +package Netease + +import ( + "servicebase/pkg/log" + "encoding/json" + + "github.com/pkg/errors" + "github.com/spf13/viper" + captcha "github.com/yidun/yidun-golang-sdk/yidun/service/captcha" +) + +var ( + CaptchaId = "28a052c000324d2e992e9e184291c92d" +) + +// CaptchaSecondVerify 验证码二次校验请求 +func CaptchaSecondVerify(captchaId, validate string) (bool, error) { + request := captcha.NewCaptchaVerifyRequest() + var user string = "" + request.SetCaptchaId(captchaId).SetValidate(validate).SetUser(user) + secretId := viper.GetString("netease.captcha.secretId") + secretKey := viper.GetString("netease.captcha.secretKey") + captchaClient := captcha.NewCaptchaVerifyClientWithAccessKey(secretId, secretKey) + response, err := captchaClient.Verify(request) + if err != nil { + log.ErrorF("CaptchaSecondVerify err: %+v", err) + return false, err + } + if response == nil { + log.ErrorF("CaptchaSecondVerify response is nil") + return false, errors.Errorf("CaptchaSecondVerify response is nil") + } + respBody, err := json.Marshal(response) + if err != nil { + return false, err + } + log.InfoF("CaptchaSecondVerify response is : %s", string(respBody)) + if response.Result == nil { + log.ErrorF("CaptchaSecondVerify response.Result is nil") + return false, errors.Errorf("CaptchaSecondVerify response.Result is nil") + } + return *response.Result, nil +} diff --git a/pkg/client/netease/live_person.go b/pkg/client/netease/live_person.go new file mode 100644 index 0000000..f1028af --- /dev/null +++ b/pkg/client/netease/live_person.go @@ -0,0 +1,196 @@ +package Netease + +import ( + "context" + "crypto/md5" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "math/rand" + "net/http" + "net/url" + "servicebase/pkg/log" + "sort" + "strconv" + "strings" + "time" + + "github.com/pkg/errors" + "github.com/spf13/viper" + "github.com/tjfoc/gmsm/sm3" +) + +const ( + apiURL = "https://verify.dun.163.com/v1/face/liveness/h5/auth" + recheckTokenUrl = "https://verify.dun.163.com/v1/face/liveness/h5/recheck" + version = "v1" +) + +type ApplyInfoReq struct { + Name string + CardNo string + RedirectUrl string + CallBackUrl string + DataId string + CallbackValidate string + EncryptType string +} + +type BaseRsp[T any] struct { + Code int `json:"code"` + Msg string `json:"msg"` + Result T `json:"result"` +} + +type H5ApplyLivePersonRsp struct { + AuthUrl string `json:"authUrl"` + AuthToken string `json:"authToken"` +} + +type H5ReCheckLivePersonTokenRsp struct { + TaskId string `json:"taskId"` + PicType int64 `json:"picType"` + Avatar string `json:"avatar"` + Status int64 `json:"status"` + ReasonType int `json:"reasonType"` + IsPayed int64 `json:"isPayed"` + SimilarityScore float64 `json:"similarityScore"` + FaceMatched int64 `json:"faceMatched"` + FaceAttributeInfo interface{} `json:"faceAttributeInfo"` + ExtInfo ExtInfoEntity `json:"extInfo"` +} + +type ExtInfoEntity struct { + SuspectedNonageFlag bool `json:"suspectedNonageFlag"` +} + +// H5ApplyLivePerson 请求易盾生成h5人身验证h5 url 和 authToken +func H5ApplyLivePerson(ctx context.Context, req *ApplyInfoReq) (*H5ApplyLivePersonRsp, error) { + params := url.Values{ + "name": []string{req.Name}, + "cardNo": []string{req.CardNo}, + "redirectUrl": []string{req.RedirectUrl}, + } + rsp, err := apply(params) + if err != nil { + return nil, err + } + return rsp, nil +} + +// H5ReCheckLivePersonToken 根据authToken二次验证,并获取相关信息,如正面拍照的活体图片 +func H5ReCheckLivePersonToken(ctx context.Context, token string) (*H5ReCheckLivePersonTokenRsp, error) { + params := url.Values{ + "authToken": []string{token}, + } + rsp, err := checkToken(params) + if err != nil { + return nil, err + } + return rsp, nil +} + +// 生成签名信息 +func genSignature(params url.Values) string { + var paramStr string + keys := make([]string, 0, len(params)) + for k := range params { + keys = append(keys, k) + } + sort.Strings(keys) + for _, key := range keys { + paramStr += key + params[key][0] + } + paramStr += viper.GetString("netease.captcha.secretKey") + if params["signatureMethod"] != nil && params["signatureMethod"][0] == "SM3" { + sm3Reader := sm3.New() + sm3Reader.Write([]byte(paramStr)) + return hex.EncodeToString(sm3Reader.Sum(nil)) + } + md5Reader := md5.New() + md5Reader.Write([]byte(paramStr)) + return hex.EncodeToString(md5Reader.Sum(nil)) +} + +// 请求易盾接口 +func apply(params url.Values) (*H5ApplyLivePersonRsp, error) { + params["secretId"] = []string{viper.GetString("netease.captcha.secretId")} + params["businessId"] = []string{viper.GetString("netease.captcha.businessId")} + params["version"] = []string{version} + params["timestamp"] = []string{strconv.FormatInt(time.Now().UnixNano()/1000000, 10)} + params["nonce"] = []string{strconv.FormatInt(rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(10000000000), 10)} + params["signature"] = []string{genSignature(params)} + + resp, err := http.Post(apiURL, "application/x-www-form-urlencoded", strings.NewReader(params.Encode())) + + if err != nil { + return nil, errors.WithStack(err) + } + if resp.StatusCode != http.StatusOK { + return nil, errors.Errorf("请求网易易盾获取h5人身验证失败,状态码为%d", resp.StatusCode) + } + defer resp.Body.Close() + contents, _ := io.ReadAll(resp.Body) + log.InfoF("请求网易易盾获取h5人身验证响应: %s", string(contents)) + var rsp BaseRsp[*H5ApplyLivePersonRsp] + err = json.Unmarshal(contents, &rsp) + if err != nil { + return nil, errors.WithStack(err) + } + if rsp.Code != 200 { + return nil, errors.Errorf("响应体状态码不是200(%d),信息: %s", rsp.Code, rsp.Msg) + } + return rsp.Result, nil +} + +func checkToken(params url.Values) (*H5ReCheckLivePersonTokenRsp, error) { + params["secretId"] = []string{viper.GetString("netease.captcha.secretId")} + params["businessId"] = []string{viper.GetString("netease.captcha.businessId")} + params["version"] = []string{version} + params["timestamp"] = []string{strconv.FormatInt(time.Now().UnixNano()/1000000, 10)} + params["nonce"] = []string{strconv.FormatInt(rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(10000000000), 10)} + params["signature"] = []string{genSignature(params)} + + resp, err := http.Post(recheckTokenUrl, "application/x-www-form-urlencoded", strings.NewReader(params.Encode())) + + if err != nil { + return nil, errors.WithStack(err) + } + if resp.StatusCode != http.StatusOK { + return nil, errors.Errorf("请求网易易盾获取h5人身验证失败,状态码为%d", resp.StatusCode) + } + defer resp.Body.Close() + contents, _ := io.ReadAll(resp.Body) + log.InfoF("请求网易云盾获取人身核验二次验证token响应: %s", string(contents)) + var rsp BaseRsp[*H5ReCheckLivePersonTokenRsp] + err = json.Unmarshal(contents, &rsp) + if err != nil { + return nil, errors.WithStack(err) + } + if rsp.Code != 200 { + return nil, errors.Errorf("响应体状态码不是200(%d),信息: %s", rsp.Code, rsp.Msg) + } + return rsp.Result, nil +} + +var livePersonAndIdCheckFailReason = map[int]string{ + 2: "活体通过,姓名身份证号一致,人脸比对非同一人", + 3: "活体通过,姓名身份证号不一致", + 4: "活体不通过", + 5: "活体检测超时或出现异常", + 6: "活体通过,查无此身份证", + 7: "活体通过,库中无此身份证照片", + 8: "活体通过,人脸照过大", + 9: "活体通过,权威数据源出现异常", + 10: "疑似攻击,建议拦截", + 11: "检测对象为未成年人", +} + +func GetLivePersonAndIdCheckFailReason(code int) string { + r, ok := livePersonAndIdCheckFailReason[code] + if !ok { + return fmt.Sprintf("其他原因:ReasonType==%d", code) + } + return r +} diff --git a/pkg/client/netease/live_person_test.go b/pkg/client/netease/live_person_test.go new file mode 100644 index 0000000..4f7c105 --- /dev/null +++ b/pkg/client/netease/live_person_test.go @@ -0,0 +1,78 @@ +package Netease + +import ( + "servicebase/pkg/common/HyTools" + "servicebase/pkg/log" + "servicebase/pkg/partner/qiniu" + "context" + "github.com/spf13/viper" + "io" + "net/http" + "testing" +) + +func TestApplyH5LivePerson(t *testing.T) { + log.Init() + rst, err := H5ApplyLivePerson(context.Background(), &ApplyInfoReq{ + Name: "xxx", // 姓名 + CardNo: "xxxxxxx", // 身份证号码,x需要变成大写X + RedirectUrl: "https://www.baidu.com", + CallBackUrl: "", + DataId: "", + CallbackValidate: "", + EncryptType: "", + }) + if err != nil { + t.Error(err) + } + println(rst.AuthToken) + println(rst.AuthUrl) +} + +func TestH5ReCheckLivePersonToken(t *testing.T) { + log.Init() + _, err := H5ReCheckLivePersonToken(context.Background(), "6ZgHU-x9XsRVF8aS7PIFppBho28QEUAR") + if err != nil { + t.Error(err) + } +} + +func TestB(t *testing.T) { + log.Init() + + // key: CwGN8XGmbEZr7qqJl-y-QodcUYREz8ph_glVKCqp + // secret: KbZKt8WwQcZ6II0tygMLsO3KWpm50aMz737VaMV0 + viper.Set("qiniu.key", "CwGN8XGmbEZr7qqJl-y-QodcUYREz8ph_glVKCqp") + + viper.Set("qiniu.secret", "KbZKt8WwQcZ6II0tygMLsO3KWpm50aMz737VaMV0") + + viper.Set("qiniu.bucket.photo", "ddphoto") + + key := func() string { + resp, err := http.Get("xxx") + if err != nil { + log.ErrorF("获取人脸核身正面照图片错误:%+v", err) + return "" + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + log.ErrorF("获取人脸核身正面照图片错误 http code为%d", resp.StatusCode) + return "" + } + imageData, err := io.ReadAll(resp.Body) + if err != nil { + log.ErrorF("") + return "" + } + + key := "upload/" + HyTools.GetUUID() + ".jpg" + //上传文件 + newKey := qiniu.UploadFile(context.Background(), viper.GetString("qiniu.bucket.photo"), imageData, key) + if len(newKey) == 0 { + log.ErrorF("获取人脸核身正面照图片上传到七牛oss失败") + return "" + } + return key + }() + println(key) +} diff --git a/pkg/client/shengwang_client.go b/pkg/client/shengwang_client.go new file mode 100644 index 0000000..661f9ea --- /dev/null +++ b/pkg/client/shengwang_client.go @@ -0,0 +1,84 @@ +package client + +import ( + "fmt" + "servicebase/pkg/tools" + + rtctokenbuilder "github.com/AgoraIO/Tools/DynamicKey/AgoraDynamicKey/go/src/rtctokenbuilder2" + "github.com/spf13/viper" +) + +func GenerateShenWangToken(userNo, RoomId string) (token string, e error) { + // Need to set environment variable AGORA_APP_ID + appId := viper.GetString("agora.tokenGen.appId") + // Need to set environment variable AGORA_APP_CERTIFICATE + appCertificate := viper.GetString("agora.tokenGen.appCertificate") + channelName := RoomId + uidStr := userNo + uid := uint32(tools.StrToInt32(userNo)) + expire := 3600 * 24 + tokenExpirationInSeconds := uint32(expire) + privilegeExpirationInSeconds := uint32(expire) + joinChannelPrivilegeExpireInSeconds := uint32(expire) + pubAudioPrivilegeExpireInSeconds := uint32(expire) + pubVideoPrivilegeExpireInSeconds := uint32(expire) + pubDataStreamPrivilegeExpireInSeconds := uint32(expire) + + fmt.Println("App Id:", appId) + fmt.Println("App Certificate:", appCertificate) + if appId == "" || appCertificate == "" { + fmt.Println("Need to set environment variable AGORA_APP_ID and AGORA_APP_CERTIFICATE") + return + } + + result, err := rtctokenbuilder.BuildTokenWithUid(appId, appCertificate, channelName, uid, rtctokenbuilder.RolePublisher, tokenExpirationInSeconds, privilegeExpirationInSeconds) + if err != nil { + fmt.Println(err) + return "", err + } else { + fmt.Printf("Token with int uid: %s\n", result) + } + + result, err = rtctokenbuilder.BuildTokenWithUserAccount(appId, appCertificate, channelName, uidStr, rtctokenbuilder.RolePublisher, tokenExpirationInSeconds, privilegeExpirationInSeconds) + if err != nil { + fmt.Println(err) + return "", err + } else { + fmt.Printf("Token with user account: %s\n", result) + } + + result, err = rtctokenbuilder.BuildTokenWithUidAndPrivilege(appId, appCertificate, channelName, uid, + tokenExpirationInSeconds, joinChannelPrivilegeExpireInSeconds, pubAudioPrivilegeExpireInSeconds, pubVideoPrivilegeExpireInSeconds, pubDataStreamPrivilegeExpireInSeconds) + if err != nil { + fmt.Println(err) + return "", err + } else { + fmt.Printf("Token with int uid and privilege: %s\n", result) + } + + result, err = rtctokenbuilder.BuildTokenWithUserAccountAndPrivilege(appId, appCertificate, channelName, uidStr, + tokenExpirationInSeconds, joinChannelPrivilegeExpireInSeconds, pubAudioPrivilegeExpireInSeconds, pubVideoPrivilegeExpireInSeconds, pubDataStreamPrivilegeExpireInSeconds) + if err != nil { + fmt.Println(err) + return "", err + } else { + fmt.Printf("Token with user account and privilege: %s\n", result) + } + + result, err = rtctokenbuilder.BuildTokenWithRtm(appId, appCertificate, channelName, uidStr, rtctokenbuilder.RolePublisher, tokenExpirationInSeconds, privilegeExpirationInSeconds) + if err != nil { + fmt.Println(err) + return "", err + } else { + fmt.Printf("Token with RTM: %s\n", result) + } + + result, err = rtctokenbuilder.BuildTokenWithRtm2(appId, appCertificate, channelName, uidStr, rtctokenbuilder.RolePublisher, tokenExpirationInSeconds, privilegeExpirationInSeconds, pubAudioPrivilegeExpireInSeconds, pubVideoPrivilegeExpireInSeconds, pubDataStreamPrivilegeExpireInSeconds, uidStr, tokenExpirationInSeconds) + if err != nil { + fmt.Println(err) + return "", err + } else { + fmt.Printf("Token with RTM: %s\n", result) + } + return result, err +} diff --git a/pkg/client/shengwang_client_test.go b/pkg/client/shengwang_client_test.go new file mode 100644 index 0000000..13cf6b9 --- /dev/null +++ b/pkg/client/shengwang_client_test.go @@ -0,0 +1,11 @@ +package client + +import ( + "fmt" + "testing" +) + +func TestGenerateShenWangToken(t *testing.T) { + gotToken, err := GenerateShenWangToken("65945666", "9956050") + fmt.Printf("%+v %+v\n", gotToken, err) +} diff --git a/pkg/client/sms_client.go b/pkg/client/sms_client.go new file mode 100644 index 0000000..9050550 --- /dev/null +++ b/pkg/client/sms_client.go @@ -0,0 +1,311 @@ +package client + +import ( + "errors" + "fmt" + "servicebase/pkg/helper" + "servicebase/pkg/log" + "sync" + + openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v3/client" + util "github.com/alibabacloud-go/tea-utils/v2/service" + "github.com/alibabacloud-go/tea/tea" + "github.com/spf13/viper" +) + +// CreateAliSmsClient +/** + * 使用AK&SK初始化账号Client + * @param accessKeyId + * @param accessKeySecret + * @return Client + * @throws Exception + */ +func CreateAliSmsClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) { + config := &openapi.Config{ + // 必填,您的 AccessKey ID + AccessKeyId: accessKeyId, + // 必填,您的 AccessKey Secret + AccessKeySecret: accessKeySecret, + } + // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi + config.Endpoint = tea.String("dysmsapi.aliyuncs.com") + _result = &dysmsapi20170525.Client{} + _result, _err = dysmsapi20170525.NewClient(config) + return _result, _err +} + +var ( + smsSignList = []string{"淮南东东网络科技"} + tempCodeList = []string{"SMS_320216048"} + smsSignCodeLock sync.Mutex + smsSignCodeIndex int64 +) + +func getSignAndCode() (sign, code string) { + smsSignCodeLock.Lock() + defer smsSignCodeLock.Unlock() + i := smsSignCodeIndex % int64(len(smsSignList)) + sign = smsSignList[int(i)] + code = tempCodeList[int(i)] + smsSignCodeIndex++ + return +} + +func SendVerifyCode01(mobile, content string, fn func(_result *dysmsapi20170525.SendSmsResponse, success bool)) (_result *dysmsapi20170525.SendSmsResponse, e error) { + if !helper.IsMobile(mobile) { + return nil, errors.New("手机号有误!") + } + sign, code := getSignAndCode() + log.InfoF("get sms sign and code: %s %s", sign, code) + _result, e = SendMobileMsg01(mobile, sign, code, content) + if fn != nil { + fn(_result, e == nil) + } + return +} + +func SendMobileMsg01(mobile, signName, tempCode, content string) (_result *dysmsapi20170525.SendSmsResponse, _err error) { + var ( + ID = viper.GetString("aliyun.sms.accessKeyId") + Secret = viper.GetString("aliyun.sms.accessKeySecret") + ) + // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 + // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378661.html + client, _err := CreateAliSmsClient(tea.String(ID), tea.String(Secret)) + if _err != nil { + return nil, _err + } + + sendSmsRequest := &dysmsapi20170525.SendSmsRequest{ + PhoneNumbers: tea.String(mobile), + SignName: tea.String(signName), + TemplateCode: tea.String(tempCode), + TemplateParam: tea.String(fmt.Sprintf("{\"code\":\"%s\"}", content)), + } + res, tryErr := func() (_result *dysmsapi20170525.SendSmsResponse, _e error) { + defer func() { + if r := tea.Recover(recover()); r != nil { + _e = r + } + }() + // 复制代码运行请自行打印 API 的返回值 + _result, _err = client.SendSmsWithOptions(sendSmsRequest, &util.RuntimeOptions{}) + if _err != nil { + return nil, _err + } + + return + }() + + if tryErr != nil { + var e = &tea.SDKError{} + if _t, ok := tryErr.(*tea.SDKError); ok { + e = _t + } else { + e.Message = tea.String(tryErr.Error()) + } + // 如有需要,请打印 error + _, _err = util.AssertAsString(e.Message) + if _err != nil { + return nil, _err + } + } + return res, _err +} + +func SendVerifyCodeUsaAndCanada(mobile, content string, fn func(_result *dysmsapi20170525.SendSmsResponse, success bool)) (_result *dysmsapi20170525.SendSmsResponse, e error) { + // if !helper.IsMobile(mobile) { + // return nil, errors.New("手机号有误!") + // } + sign, code := getSignAndCode() + log.InfoF("SendVerifyCodeUsaAndCanada get sms sign and code: %s %s", sign, code) + _result, e = SendMobileMsgUsaAndCanada(mobile, sign, code, content) + if fn != nil { + fn(_result, e == nil) + } + return +} + +func SendVerifyCodeGlobalOther(mobile, content string, fn func(_result *dysmsapi20170525.SendSmsResponse, success bool)) (_result *dysmsapi20170525.SendSmsResponse, e error) { + // if !helper.IsMobile(mobile) { + // return nil, errors.New("手机号有误!") + // } + sign, code := getSignAndCode() + log.InfoF("SendVerifyCodeUsaAndCanada get sms sign and code: %s %s", sign, code) + _result, e = SendMobileMsgGlobalOther(mobile, sign, code, content) + if fn != nil { + fn(_result, e == nil) + } + return +} + +// SendMobileMsgUsaAndCanada 美国/加拿大地区短信发送 +func SendMobileMsgUsaAndCanada(mobile, signName, tempCode, content string) (_result *dysmsapi20170525.SendSmsResponse, _err error) { + var ( + ID = viper.GetString("aliyun.sms.accessKeyId") + Secret = viper.GetString("aliyun.sms.accessKeySecret") + ) + // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 + // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378661.html + client, _err := CreateAliSmsClient(tea.String(ID), tea.String(Secret)) + if _err != nil { + return nil, _err + } + + sendSmsRequest := &dysmsapi20170525.SendSmsRequest{ + PhoneNumbers: tea.String(mobile), + SignName: tea.String(signName), + TemplateCode: tea.String(tempCode), + TemplateParam: tea.String(fmt.Sprintf("{\"code\":\"%s\"}", content)), + } + res, tryErr := func() (_result *dysmsapi20170525.SendSmsResponse, _e error) { + defer func() { + if r := tea.Recover(recover()); r != nil { + _e = r + } + }() + // 复制代码运行请自行打印 API 的返回值 + _result, _err = client.SendSmsWithOptions(sendSmsRequest, &util.RuntimeOptions{}) + if _err != nil { + return nil, _err + } + + return + }() + + if tryErr != nil { + var e = &tea.SDKError{} + if _t, ok := tryErr.(*tea.SDKError); ok { + e = _t + } else { + e.Message = tea.String(tryErr.Error()) + } + // 如有需要,请打印 error + _, _err = util.AssertAsString(e.Message) + if _err != nil { + return nil, _err + } + } + return res, _err +} + +// SendMobileMsgGlobalOther 全球其他国家 +func SendMobileMsgGlobalOther(mobile, signName, tempCode, content string) (_result *dysmsapi20170525.SendSmsResponse, _err error) { + var ( + // ID AccessKey ID + // LTAI5tRfkJnr6Y6NU2T6jWoB + // + // AccessKey Secret + // BcaMWgXkwdxdJXFnCwRQbEl3Q3Xtxl + // TODO: 替换为您的AccessKey ID和AccessKey Secret + ID = viper.GetString("aliyun.sms.accessKeyId") + Secret = viper.GetString("aliyun.sms.accessKeySecret") + ) + // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 + // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378661.html + client, _err := CreateAliSmsClient(tea.String(ID), tea.String(Secret)) + if _err != nil { + return nil, _err + } + + sendSmsRequest := &dysmsapi20170525.SendSmsRequest{ + PhoneNumbers: tea.String(mobile), + SignName: tea.String(signName), + TemplateCode: tea.String(tempCode), + TemplateParam: tea.String(fmt.Sprintf("{\"code\":\"%s\"}", content)), + } + res, tryErr := func() (_result *dysmsapi20170525.SendSmsResponse, _e error) { + defer func() { + if r := tea.Recover(recover()); r != nil { + _e = r + } + }() + // 复制代码运行请自行打印 API 的返回值 + _result, _err = client.SendSmsWithOptions(sendSmsRequest, &util.RuntimeOptions{}) + if _err != nil { + return nil, _err + } + + return + }() + + if tryErr != nil { + var e = &tea.SDKError{} + if _t, ok := tryErr.(*tea.SDKError); ok { + e = _t + } else { + e.Message = tea.String(tryErr.Error()) + } + // 如有需要,请打印 error + _, _err = util.AssertAsString(e.Message) + if _err != nil { + return nil, _err + } + } + return res, _err +} + +func SendVerifyHKMacauAndTW(mobile, content string, fn func(_result *dysmsapi20170525.SendSmsResponse, success bool)) (_result *dysmsapi20170525.SendSmsResponse, e error) { + if !helper.IsMobile(mobile) { + return nil, errors.New("手机号有误!") + } + sign, code := getSignAndCode() + log.InfoF("get sms sign and code: %s %s", sign, code) + _result, e = SendMobileMsgHKMacauAndTW(mobile, sign, code, content) + if fn != nil { + fn(_result, e == nil) + } + return +} + +// SendMobileMsgHKMacauAndTW 港澳台 +func SendMobileMsgHKMacauAndTW(mobile, signName, tempCode, content string) (_result *dysmsapi20170525.SendSmsResponse, _err error) { + var ( + ID = viper.GetString("aliyun.sms.accessKeyId") + Secret = viper.GetString("aliyun.sms.accessKeySecret") + ) + // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 + // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378661.html + client, _err := CreateAliSmsClient(tea.String(ID), tea.String(Secret)) + if _err != nil { + return nil, _err + } + + sendSmsRequest := &dysmsapi20170525.SendSmsRequest{ + PhoneNumbers: tea.String(mobile), + SignName: tea.String(signName), + TemplateCode: tea.String(tempCode), + TemplateParam: tea.String(fmt.Sprintf("{\"code\":\"%s\"}", content)), + } + res, tryErr := func() (_result *dysmsapi20170525.SendSmsResponse, _e error) { + defer func() { + if r := tea.Recover(recover()); r != nil { + _e = r + } + }() + // 复制代码运行请自行打印 API 的返回值 + _result, _err = client.SendSmsWithOptions(sendSmsRequest, &util.RuntimeOptions{}) + if _err != nil { + return nil, _err + } + + return + }() + + if tryErr != nil { + var e = &tea.SDKError{} + if _t, ok := tryErr.(*tea.SDKError); ok { + e = _t + } else { + e.Message = tea.String(tryErr.Error()) + } + // 如有需要,请打印 error + _, _err = util.AssertAsString(e.Message) + if _err != nil { + return nil, _err + } + } + return res, _err +} diff --git a/pkg/client/tencent.go b/pkg/client/tencent.go new file mode 100644 index 0000000..8c19e3c --- /dev/null +++ b/pkg/client/tencent.go @@ -0,0 +1,260 @@ +package client + +import ( + "encoding/json" + "fmt" + "strings" + "time" + + "github.com/spf13/viper" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" + sms "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms/v20210111" // 引入sms +) + +func _SmsFullContent(template string, param []interface{}) string { + var smsTemplateContentMap = map[string]string{ + viper.GetString("tencent.smsTemplateCode"): "验证码为:{1},您正在登录,若非本人操作,请勿泄露。", + } + return fmt.Sprintf(smsTemplateContentMap[template], param...) +} + +func _SmsSendVerifyCode(mobile, code string) (*sms.SendSmsResponseParams, error) { + return _SmsSendByTemplate(viper.GetString("tencent.smsTemplateCode"), mobile, []string{code}) +} + +func _SmsSendByTemplate(templateID, mobile string, param []string) (*sms.SendSmsResponseParams, error) { + if !strings.HasPrefix(mobile, "+86") && !strings.HasPrefix(mobile, "86") { + mobile = "+86" + mobile + } + credential := common.NewCredential(viper.GetString("tencent.secretId"), viper.GetString("tencent.secretKey")) + cpf := profile.NewClientProfile() + cpf.HttpProfile.ReqMethod = "POST" + cpf.HttpProfile.Endpoint = "sms.tencentcloudapi.com" + cpf.SignMethod = "HmacSHA1" + client, _ := sms.NewClient(credential, "ap-guangzhou", cpf) + request := sms.NewSendSmsRequest() + request.SmsSdkAppId = common.StringPtr(viper.GetString("tencent.sdkAppId")) + request.SignName = common.StringPtr(viper.GetString("tencent.signName")) + request.TemplateId = common.StringPtr(templateID) + request.TemplateParamSet = common.StringPtrs(param) + request.PhoneNumberSet = common.StringPtrs([]string{mobile}) + request.SessionContext = common.StringPtr("") + request.ExtendCode = common.StringPtr("") + request.SenderId = common.StringPtr("") + response, err := client.SendSms(request) + if _, ok := err.(*errors.TencentCloudSDKError); ok { + fmt.Printf("An API error has returned: %s", err) + return nil, err + } + if err != nil { + return nil, err + } + return response.Response, nil + // {"SendStatusSet":[{"SerialNo":"4012:319315169316952992330592922","PhoneNumber":"+8615215229221","Fee":1,"SessionContext":"","Code":"Ok","Message":"send success","IsoCode":"CN"}],"RequestId":"82798726-4312-4ea8-926b-b23894a39cf1"} +} + +func _SmsQueryStatus(mobile string) (*sms.PullSmsSendStatusByPhoneNumberResponseParams, error) { + credential := common.NewCredential(viper.GetString("tencent.secretId"), viper.GetString("tencent.secretKey")) + cpf := profile.NewClientProfile() + cpf.HttpProfile.ReqMethod = "POST" + cpf.HttpProfile.Endpoint = "sms.tencentcloudapi.com" + cpf.SignMethod = "HmacSHA1" + client, _ := sms.NewClient(credential, "ap-guangzhou", cpf) + request := sms.NewPullSmsSendStatusByPhoneNumberRequest() + request.SmsSdkAppId = common.StringPtr(viper.GetString("tencent.sdkAppId")) + request.Limit = common.Uint64Ptr(10) + request.PhoneNumber = common.StringPtr(mobile) + request.BeginTime = common.Uint64Ptr(uint64(time.Now().Unix()) - (60 * 60)) + request.Offset = common.Uint64Ptr(0) + response, err := client.PullSmsSendStatusByPhoneNumber(request) + if _, ok := err.(*errors.TencentCloudSDKError); ok { + fmt.Printf("An API error has returned: %s", err) + return nil, err + } + if err != nil { + return nil, err + } + return response.Response, nil + // {"PullSmsSendStatusSet":[{"UserReceiveTime":1695299239,"CountryCode":"86","SubscriberNumber":"15215229221","PhoneNumber":"+8615215229221","SerialNo":"4012:319315169316952992330592922","ReportStatus":"SUCCESS","Description":"DELIVRD","SessionContext":""}],"RequestId":"40476317-2cf4-4c48-bf30-2b33ac14a8b7"} +} + +func _SendSms() { + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 + * 您也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及您的财产安全。 + * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */ + credential := common.NewCredential( + // os.Getenv("TENCENTCLOUD_SECRET_ID"), + // os.Getenv("TENCENTCLOUD_SECRET_KEY"), + viper.GetString("tencent.secretId"), + viper.GetString("tencent.secretKey"), + ) + /* 非必要步骤: + * 实例化一个客户端配置对象,可以指定超时时间等配置 */ + cpf := profile.NewClientProfile() + + /* SDK默认使用POST方法。 + * 如果您一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */ + cpf.HttpProfile.ReqMethod = "POST" + + /* SDK有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ + // cpf.HttpProfile.ReqTimeout = 5 + + /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */ + cpf.HttpProfile.Endpoint = "sms.tencentcloudapi.com" + + /* SDK默认用TC3-HMAC-SHA256进行签名,非必要请不要修改这个字段 */ + cpf.SignMethod = "HmacSHA1" + + /* 实例化要请求产品(以sms为例)的client对象 + * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */ + client, _ := sms.NewClient(credential, "ap-guangzhou", cpf) + + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 您可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + request := sms.NewSendSmsRequest() + + /* 基本类型的设置: + * SDK采用的是指针风格指定参数,即使对于基本类型您也需要用指针来对参数赋值。 + * SDK提供对基本类型的指针引用封装函数 + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + request.SmsSdkAppId = common.StringPtr(viper.GetString("tencent.sdkAppId")) + + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看 + request.SignName = common.StringPtr("好出行Trip小程序") + + /* 模板 ID: 必须填写已审核通过的模板 ID */ + // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看 + request.TemplateId = common.StringPtr("1916515") + + /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空*/ + request.TemplateParamSet = common.StringPtrs([]string{"6666"}) + + /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] + * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/ + request.PhoneNumberSet = common.StringPtrs([]string{"+8615215229221"}) + + /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ + request.SessionContext = common.StringPtr("") + + /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */ + request.ExtendCode = common.StringPtr("") + + /* 国内短信无需填写该项;国际/港澳台短信已申请独立 SenderId 需要填写该字段,默认使用公共 SenderId,无需填写该字段。注:月度使用量达到指定量级可申请独立 SenderId 使用,详情请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 */ + request.SenderId = common.StringPtr("") + + // 通过client对象调用想要访问的接口,需要传入请求对象 + response, err := client.SendSms(request) + // 处理异常 + if _, ok := err.(*errors.TencentCloudSDKError); ok { + fmt.Printf("An API error has returned: %s", err) + return + } + // 非SDK异常,直接失败。实际代码中可以加入其他的处理。 + if err != nil { + panic(err) + } + b, _ := json.Marshal(response.Response) + // 打印返回的json字符串 + fmt.Printf("%s", b) + + // {"SendStatusSet":[{"SerialNo":"4012:319315169316952992330592922","PhoneNumber":"+8615215229221","Fee":1,"SessionContext":"","Code":"Ok","Message":"send success","IsoCode":"CN"}],"RequestId":"82798726-4312-4ea8-926b-b23894a39cf1"} + + /* 当出现以下错误码时,快速解决方案参考 + * [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * 更多错误,可咨询[腾讯云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms) + */ +} + +func _PullStatus() { + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 + * 您也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及您的财产安全。 + * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */ + credential := common.NewCredential( + // os.Getenv("TENCENTCLOUD_SECRET_ID"), + // os.Getenv("TENCENTCLOUD_SECRET_KEY"), + viper.GetString("tencent.secretId"), + viper.GetString("tencent.secretKey"), + ) + /* 非必要步骤: + * 实例化一个客户端配置对象,可以指定超时时间等配置 */ + cpf := profile.NewClientProfile() + + /* SDK默认使用POST方法。 + * 如果您一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */ + cpf.HttpProfile.ReqMethod = "POST" + + /* SDK有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ + // cpf.HttpProfile.ReqTimeout = 5 + + /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */ + cpf.HttpProfile.Endpoint = "sms.tencentcloudapi.com" + + /* SDK默认用TC3-HMAC-SHA256进行签名 + * 非必要请不要修改这个字段 */ + cpf.SignMethod = "HmacSHA1" + + /* 实例化要请求产品(以sms为例)的client对象 + * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */ + client, _ := sms.NewClient(credential, "ap-guangzhou", cpf) + + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 您可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + request := sms.NewPullSmsSendStatusByPhoneNumberRequest() + + /* 基本类型的设置: + * SDK采用的是指针风格指定参数,即使对于基本类型您也需要用指针来对参数赋值。 + * SDK提供对基本类型的指针引用封装函数 + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + request.SmsSdkAppId = common.StringPtr(viper.GetString("tencent.sdkAppId")) + /* 拉取最大条数,最多100条 */ + request.Limit = common.Uint64Ptr(10) + PhoneNumber := "+8615215229221" + request.PhoneNumber = &PhoneNumber + beginTime := uint64(time.Now().Unix()) - (60 * 60) + request.BeginTime = &beginTime + Offset := uint64(0) + request.Offset = &Offset + + // 通过client对象调用想要访问的接口,需要传入请求对象 + response, err := client.PullSmsSendStatusByPhoneNumber(request) + // 处理异常 + if _, ok := err.(*errors.TencentCloudSDKError); ok { + fmt.Printf("An API error has returned: %s", err) + return + } + // 非SDK异常,直接失败。实际代码中可以加入其他的处理。 + if err != nil { + panic(err) + } + b, _ := json.Marshal(response.Response) + // 打印返回的json字符串 + fmt.Printf("%s", b) + // {"PullSmsSendStatusSet":[{"UserReceiveTime":1695299239,"CountryCode":"86","SubscriberNumber":"15215229221","PhoneNumber":"+8615215229221","SerialNo":"4012:319315169316952992330592922","ReportStatus":"SUCCESS","Description":"DELIVRD","SessionContext":""}],"RequestId":"40476317-2cf4-4c48-bf30-2b33ac14a8b7"} +} diff --git a/pkg/client/tencent_test.go b/pkg/client/tencent_test.go new file mode 100644 index 0000000..cbd7b35 --- /dev/null +++ b/pkg/client/tencent_test.go @@ -0,0 +1,74 @@ +package client + +import ( + "testing" + + sms "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms/v20210111" +) + +func TestSendSms(t *testing.T) { + tests := []struct { + name string + }{ + { + name: "test01", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _SendSms() + }) + } +} + +func TestPullStatus(t *testing.T) { + tests := []struct { + name string + }{ + { + name: "test01", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _PullStatus() + }) + } +} + +func TestSmsSendByTemplate(t *testing.T) { + type args struct { + templateID string + mobile string + param []string + } + tests := []struct { + name string + args args + want *sms.SendSmsResponseParams + wantErr bool + }{ + { + name: "01", + args: args{ + templateID: "2319145", + mobile: "", + param: []string{"6666"}, + }, + want: &sms.SendSmsResponseParams{}, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := _SmsSendByTemplate(tt.args.templateID, tt.args.mobile, tt.args.param) + if (err != nil) != tt.wantErr { + t.Errorf("SmsSendByTemplate() error = %v, wantErr %v", err, tt.wantErr) + return + } + // if !reflect.DeepEqual(got, tt.want) { + // t.Errorf("SmsSendByTemplate() = %v, want %v", got, tt.want) + // } + }) + } +} diff --git a/pkg/client/wechat_client.go b/pkg/client/wechat_client.go new file mode 100644 index 0000000..b500a7a --- /dev/null +++ b/pkg/client/wechat_client.go @@ -0,0 +1,215 @@ +package client + +import ( + "encoding/json" + "fmt" + "io" + "net/http" +) + +const ( + UserAppID = "" + UserSecret = "" + DriverAppID = "" + DriverSecret = "" + Code2SessionAppURL = "https://api.weixin.qq.com/sns/oauth2/access_token" + UserInfoAppURL = "https://api.weixin.qq.com/sns/userinfo" + + Code2SessionJsURL = "https://api.weixin.qq.com/sns/jscode2session" + + SendMessageURL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN" + GetAccessTokenURL = "https://api.weixin.qq.com/cgi-bin/token" +) + +func WeChatNewAuthJsReqMap(code string) map[string]string { + return map[string]string{ + "appid": UserAppID, + "secret": UserSecret, + "js_code": code, + "grant_type": "authorization_code"} +} + +func WeChatNewAuthAppReqMap(code string) map[string]string { + return map[string]string{ + "appid": UserAppID, + "secret": UserSecret, + "code": code, + "grant_type": "authorization_code"} +} + +func WeChatGetAccessTokenReq(_type int) map[string]string { + switch _type { + case 1: // 用户 + return map[string]string{ + "grant_type": "client_credential", + "appid": UserAppID, + "secret": UserSecret, + } + case 2: // 其他 + return map[string]string{ + "grant_type": "client_credential", + "appid": DriverAppID, + "secret": DriverSecret, + } + } + return nil +} + +// 小程序换取token的返回 +type WeChatLoginJsRes struct { + SessionKey string `json:"session_key"` + UnionID string `json:"unionid"` + OpenID string `json:"openid"` + ErrCode int32 `json:"errcode"` + ErrMsg string `json:"errmsg"` +} + +// APP换取token的返回 +type WeChatLoginAppRes struct { + AccessToken string `json:"access_token"` // 接口调用凭证 + ExpiresIn int32 `json:"expires_in"` // access_token 接口调用凭证超时时间,单位(秒) + RefreshToken string `json:"refresh_token"` // 用户刷新 access_token + UnionID string `json:"unionid"` // 用户统一标识。针对一个微信开放平台账号下的应用,同一用户的 unionid 是唯一的 + OpenID string `json:"openid"` // 授权用户唯一标识 + Scope string `json:"scope"` // 用户授权的作用域,使用逗号(,)分隔 + ErrCode int32 `json:"errcode"` + ErrMsg string `json:"errmsg"` +} + +// APP获取用户信息 +type WeChatUserInfoAppRes struct { + UnionID string `json:"unionid"` // 用户统一标识。针对一个微信开放平台账号下的应用,同一用户的 unionid 是唯一的 + OpenID string `json:"openid"` // 授权用户唯一标识 + Nickname string `json:"nickname"` // 普通用户昵称 + Sex int32 `json:"sex"` // 普通用户性别,1 为男性,2 为女性 + Province string `json:"province"` // 普通用户个人资料填写的省份 + City string `json:"city"` // 普通用户个人资料填写的城市 + Country string `json:"country"` // 国家,如中国为 CN + Avatar string `json:"headimgurl"` // 用户头像,最后一个数值代表正方形头像大小(有 0、46、64、96、132 数值可选,0 代表 640*640 正方形头像),用户没有头像时该项为空 + ErrCode int32 `json:"errcode"` + ErrMsg string `json:"errmsg"` +} + +// 换取token所用的请求 +func WeChatNewAuthReqMapUser(code string) map[string]string { + return map[string]string{ + "appid": UserAppID, + "secret": UserSecret, + "js_code": code, + "grant_type": "authorization_code"} +} + +// 小程序换取token的请求 +func WeChatCode2JsSession(headers map[string]string, params map[string]string) (wxLoginBody WeChatLoginJsRes, e error) { + var ( + client = NewClient() + resp *http.Response + res []byte + ) + req, _ := http.NewRequest(http.MethodGet, Code2SessionJsURL, nil) + for k, v := range headers { + req.Header.Add(k, v) + } + q := req.URL.Query() + for k, v := range params { + q.Add(k, v) + } + req.URL.RawQuery = q.Encode() + if resp, e = client.Do(req); e != nil { + return + } + defer func(body io.ReadCloser) { + _ = body.Close() + }(resp.Body) + if res, e = io.ReadAll(resp.Body); e != nil { + return + } + if !success(resp.StatusCode) { + e = fmt.Errorf("status code error: %s", resp.Status) + } + if e = json.Unmarshal(res, &wxLoginBody); e != nil { + return + } + if wxLoginBody.ErrCode != 0 { + e = fmt.Errorf("获取微信登录凭证错误,错误码: %d 错误信息:%s", wxLoginBody.ErrCode, wxLoginBody.ErrMsg) + return + } + return +} + +// APP换取token的请求 +func WeChatCode2AppToken(headers map[string]string, params map[string]string) (wxLoginBody WeChatLoginAppRes, e error) { + var ( + client = NewClient() + resp *http.Response + res []byte + ) + req, _ := http.NewRequest(http.MethodGet, Code2SessionAppURL, nil) + for k, v := range headers { + req.Header.Add(k, v) + } + q := req.URL.Query() + for k, v := range params { + q.Add(k, v) + } + req.URL.RawQuery = q.Encode() + if resp, e = client.Do(req); e != nil { + return + } + defer func(body io.ReadCloser) { + _ = body.Close() + }(resp.Body) + if res, e = io.ReadAll(resp.Body); e != nil { + return + } + if !success(resp.StatusCode) { + e = fmt.Errorf("status code error: %s", resp.Status) + } + if e = json.Unmarshal(res, &wxLoginBody); e != nil { + return + } + if wxLoginBody.ErrCode != 0 { + e = fmt.Errorf("获取微信登录凭证错误,错误码: %d 错误信息:%s", wxLoginBody.ErrCode, wxLoginBody.ErrMsg) + return + } + return +} + +// APP获取用户信息 +func WeChatUserInfoApp(token, openId string) (wxUserInfoBody WeChatUserInfoAppRes, e error) { + var ( + client = NewClient() + resp *http.Response + res []byte + ) + req, _ := http.NewRequest(http.MethodGet, UserInfoAppURL, nil) + + q := req.URL.Query() + q.Add("access_token", token) + q.Add("openid", openId) + req.URL.RawQuery = q.Encode() + if resp, e = client.Do(req); e != nil { + return + } + defer func(body io.ReadCloser) { + _ = body.Close() + }(resp.Body) + if res, e = io.ReadAll(resp.Body); e != nil { + return + } + if !success(resp.StatusCode) { + e = fmt.Errorf("status code error: %s", resp.Status) + } + if e = json.Unmarshal(res, &wxUserInfoBody); e != nil { + return + } + if wxUserInfoBody.ErrCode != 0 { + e = fmt.Errorf("获取微信登录凭证错误,错误码: %d 错误信息:%s", wxUserInfoBody.ErrCode, wxUserInfoBody.ErrMsg) + return + } + return +} + +func success(code int) bool { + return code >= 200 && code < 400 +} diff --git a/pkg/client/weichat_notice.go b/pkg/client/weichat_notice.go new file mode 100644 index 0000000..dc1686c --- /dev/null +++ b/pkg/client/weichat_notice.go @@ -0,0 +1,76 @@ +package client + +import ( + "encoding/json" + "fmt" + "strings" + "time" +) + +type WeGetTokenRes struct { + AccessToken string `json:"access_token"` + ExpiresIn int `json:"expires_in"` +} + +func WeGetToken() (token string, e error) { + gotRes, err := Get(GetAccessTokenURL, nil, WeChatGetAccessTokenReq(1)) + if err != nil { + return "", err + } + var body WeGetTokenRes + if e = json.Unmarshal(gotRes, &body); e != nil { + return + } + token = body.AccessToken + return +} + +type WeSendMessageReq map[string]WeSendMessageItemReq + +type WeSendMessageItemReq struct { + Value string `json:"value"` +} + +func WeSendMessage(openID, templateID string, message WeSendMessageReq, token string) (e error) { + if len(token) == 0 { + if token, e = WeGetToken(); e != nil { + return + } + } + gotRes, err := Post(strings.ReplaceAll(SendMessageURL, "ACCESS_TOKEN", token), nil, map[string]interface{}{ + "template_id": templateID, + "touser": openID, + "data": message, + "miniprogram_state": "formal", // developer为开发版;trial为体验版;formal为正式版;默认为正式版 + "lang": "zh_CN", // 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为 zh_CN + }) + if err != nil { + return err + } + fmt.Printf("%s\n", string(gotRes)) + return +} + +func WeSendNoticeTakeOrder(openID, company, driver, vehicel string, date time.Time) error { + const tid = "Ff5tDsIlBy-t51Usxh_oBvge9WbMbBFVKI020hIpWcA" + return WeSendMessage(openID, tid, messageNoticeTakeOrder(company, driver, vehicel, date), "") +} + +// messageBookReminder 预约提醒消息 +func messageNoticeTakeOrder(company, driver, vehicel string, date time.Time) WeSendMessageReq { + return WeSendMessageReq{ + "thing1": WeSendMessageItemReq{Value: company}, // 公司名称 + "thing2": WeSendMessageItemReq{Value: driver}, // 接单司机 + "car_number3": WeSendMessageItemReq{Value: vehicel}, // 车牌号 + "time4": WeSendMessageItemReq{Value: StrFromTime(date)}, // 接单时间 + } +} + +const ( + TimeFormat = "2006-01-02 15:04:05" + DateFormat = "2006-01-02" +) + +func StrFromTime(t time.Time) string { + return t.Format(TimeFormat) +} diff --git a/pkg/comm/p_vars.go b/pkg/comm/p_vars.go new file mode 100644 index 0000000..3e83e6d --- /dev/null +++ b/pkg/comm/p_vars.go @@ -0,0 +1,5 @@ +package comm + +const ( + ApiDomain = "https://www.jx3api.com" +) diff --git a/pkg/common/CmdTools/AliyunCloudClient.go b/pkg/common/CmdTools/AliyunCloudClient.go new file mode 100644 index 0000000..e169003 --- /dev/null +++ b/pkg/common/CmdTools/AliyunCloudClient.go @@ -0,0 +1,118 @@ +package main + +import ( + "flag" + "fmt" + + "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" +) + +// LTAI5tCB8SmJcwfO +// dX4kgF4VcblsbCVdKvtCGCmvNbLkZK +// ./AliyunCloudClient -t b -o update -key LTAI5tCB8SmJcwfO -sec dX4kgF4VcblsbCVdKvtCGCmvNbLkZK -reg cn-hangzhou -lb "[{"ServerId":"ServerId","Weight":"0"}] +func main() { + var target string + flag.StringVar(&target, "t", "b", "target: b=backendServer") + var operation string + flag.StringVar(&operation, "o", "update", "operation: add、update、remove") + var accessKeyId string + flag.StringVar(&accessKeyId, "key", "accessKeyId", "accessKeyId") + var accessSecret string + flag.StringVar(&accessSecret, "sec", "accessSecret", "accessSecret") + var regionId string + flag.StringVar(®ionId, "reg", "regionId", "regionId: cn-hangzhou") + var loadBalancerId string + flag.StringVar(&loadBalancerId, "lb", "loadBalancerId", "loadBalancerId") + var params string + flag.StringVar(¶ms, "params", "", `SetBackendServers: [{"ServerId":"ServerId","Weight":"0"}] +AddBackendServers: [{"ServerId":"ServerId","Weight":"100","Type":"eni","ServerIp":"192.168.11.1"}] +RemoveBackendServers: [{"ServerId":"ServerId","Weight":"100"}] +`) + flag.Parse() + flag.Usage() + fmt.Printf("target=%s,operation=%s,accessKeyId=%s,accessSecret=%s,regionId=%s,loadBalancerId=%s,params=%s", target, operation, accessKeyId, accessSecret, regionId, loadBalancerId, params) + if target == "b" { + switch operation { + case "update": + SetBackendServers(regionId, accessKeyId, accessSecret, loadBalancerId, params) + break + case "add": + AddBackendServers(regionId, accessKeyId, accessSecret, loadBalancerId, params) + break + case "remove": + RemoveBackendServers(regionId, accessKeyId, accessSecret, loadBalancerId, params) + break + default: + fmt.Println("operation: " + operation + " not support") + } + } else { + fmt.Println("target: " + target + " not support") + } +} + +func SetBackendServers(regionId, accessKeyId, accessSecret, loadBalancerId, params string) { + // client, err := slb.NewClientWithAccessKey(regionId, accessKeyId, accessSecret) + // if nil != err { + // fmt.Println("get client error:") + // fmt.Println(err.Error()) + // } + + // request := slb.CreateSetBackendServersRequest() + // request.Scheme = "https" + + // request.LoadBalancerId = loadBalancerId + // request.BackendServers = params + + // if nil == client { + // fmt.Println("error: client is nil") + // return + // } + // response, err := client.SetBackendServers(request) + // if err != nil { + // fmt.Print(err.Error()) + // } + // fmt.Printf("response is %#v\n", response) +} + +func AddBackendServers(regionId, accessKeyId, accessSecret, loadBalancerId, params string) { + client, err := slb.NewClientWithAccessKey(regionId, accessKeyId, accessSecret) + + request := slb.CreateAddBackendServersRequest() + request.Scheme = "https" + + request.LoadBalancerId = loadBalancerId + request.BackendServers = params + + if nil == client { + fmt.Println("error: client is nil") + return + } + + response, err := client.AddBackendServers(request) + if err != nil { + fmt.Print(err.Error()) + } + fmt.Printf("response is %#v\n", response) +} + +func RemoveBackendServers(regionId, accessKeyId, accessSecret, loadBalancerId, params string) { + + client, err := slb.NewClientWithAccessKey(regionId, accessKeyId, accessSecret) + + request := slb.CreateRemoveBackendServersRequest() + request.Scheme = "https" + + request.LoadBalancerId = loadBalancerId + request.BackendServers = params + + if nil == client { + fmt.Println("error: client is nil") + return + } + + response, err := client.RemoveBackendServers(request) + if err != nil { + fmt.Print(err.Error()) + } + fmt.Printf("response is %#v\n", response) +} diff --git a/pkg/common/CmdTools/ExcelTool.go b/pkg/common/CmdTools/ExcelTool.go new file mode 100644 index 0000000..2fdaccd --- /dev/null +++ b/pkg/common/CmdTools/ExcelTool.go @@ -0,0 +1,70 @@ +package main + +import ( + "encoding/json" + "fmt" + "strconv" + + "github.com/tealeg/xlsx" +) + +func main02() { + data := ReadSheet("./CmdTools/星钻VIP体系.xlsx", 0) + fmt.Println(json.Marshal(data)) + for index, item := range data { + if index > 0 { + level, _ := strconv.Atoi(item[0]) + exp, _ := strconv.Atoi(item[1]) + fmt.Printf("insert into t_vip_config (id,vip_level,min_exp,vip_name,vip_icon,create_time) values (%d,%d,%d,'v%d','https://xz-static.10909.com/XingZuanCommon/Img/Vip/%d@2x.png',now());\n", level, level, exp, level, level) + } + } +} + +func ReadSheet(file string, sheet int) [][]string { + var result [][]string + xlFile, err := xlsx.OpenFile(file) + if err != nil { + fmt.Println(err.Error()) + return result + } + for index, row := range xlFile.Sheets[sheet].Rows { + if index > 60 { + break + } + var data []string + for index, cell := range row.Cells { + if index > 1 { + break + } + text := cell.String() + println(text) + data = append(data, text) + } + result = append(result, data) + } + + return result +} + +func ReadAll(file string) { + // 打开文件 + xlFile, err := xlsx.OpenFile(file) + if err != nil { + fmt.Println(err.Error()) + return + } + // 遍历sheet页读取 + for _, sheet := range xlFile.Sheets { + fmt.Println("sheet name: ", sheet.Name) + //遍历行读取 + for _, row := range sheet.Rows { + // 遍历每行的列读取 + for _, cell := range row.Cells { + text := cell.String() + fmt.Printf("%20s", text) + } + fmt.Print("\n") + } + } + fmt.Println("\n\nimport success") +} diff --git a/pkg/common/CmdTools/TencentCloudClient.go b/pkg/common/CmdTools/TencentCloudClient.go new file mode 100644 index 0000000..69a5eb8 --- /dev/null +++ b/pkg/common/CmdTools/TencentCloudClient.go @@ -0,0 +1,94 @@ +package main + +import ( + "flag" + "fmt" + + clb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb/v20180317" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" +) + +// ./TencentCloudClient -t b -o add -key AKIDSoxxjI5tukPr9ECsQmwthKhroaCZlldI -sec b1FG2b3JMrESVLxjJdhYDgx12qPiplXB -reg ap-shanghai -params "{\"LoadBalancerId\":\"lb-jip7505r\",\"Targets\":[{\"InstanceId\":\"ins-n2i7x483\",\"Weight\":20}]}" +// ./TencentCloudClient -t b -o remove -key AKIDSoxxjI5tukPr9ECsQmwthKhroaCZlldI -sec b1FG2b3JMrESVLxjJdhYDgx12qPiplXB -reg ap-shanghai -params "{\"LoadBalancerId\":\"lb-jip7505r\",\"InstanceIds\":[\"ins-n2i7x483\"]}" +func main03() { + + var target string + flag.StringVar(&target, "t", "b", "target: b=backendServer") + var operation string + flag.StringVar(&operation, "o", "add", "operation: add、remove") + var accessKeyId string + flag.StringVar(&accessKeyId, "key", "secretId", "accessKeyId") + var accessSecret string + flag.StringVar(&accessSecret, "sec", "secretKey", "accessSecret") + var regionId string + flag.StringVar(®ionId, "reg", "regionId", "regionId: cn-hangzhou") + var params string + flag.StringVar(¶ms, "params", "params", ` +AddBackendServers: [{"ServerId":"ServerId","Weight":"100","Type":"eni","ServerIp":"192.168.11.1"}] +RemoveBackendServers: [{"ServerId":"ServerId","Weight":"100"}] +`) + flag.Parse() + flag.Usage() + fmt.Printf("target=%s,operation=%s,accessKeyId=%s,accessSecret=%s,regionId=%s,params=%s\n", target, operation, accessKeyId, accessSecret, regionId, params) + if target == "b" { + switch operation { + case "add": + ClassicBind(regionId, accessKeyId, accessSecret, params) + break + case "remove": + ClassicRemove(regionId, accessKeyId, accessSecret, params) + break + default: + fmt.Println("operation: " + operation + " not support") + } + } else { + fmt.Println("target: " + target + " not support") + } +} + +func ClassicBind(regionId, accessKeyId, accessSecret, params string) { + credential := common.NewCredential(accessKeyId, accessSecret) + cpf := profile.NewClientProfile() + cpf.HttpProfile.Endpoint = "clb.tencentcloudapi.com" + client, _ := clb.NewClient(credential, regionId, cpf) + + request := clb.NewRegisterTargetsWithClassicalLBRequest() + + err := request.FromJsonString(params) + if err != nil { + panic(err) + } + response, err := client.RegisterTargetsWithClassicalLB(request) + if _, ok := err.(*errors.TencentCloudSDKError); ok { + fmt.Printf("An API error has returned: %s", err) + return + } + if err != nil { + panic(err) + } + fmt.Printf("%s", response.ToJsonString()) +} + +func ClassicRemove(regionId, accessKeyId, accessSecret, params string) { + credential := common.NewCredential(accessKeyId, accessSecret) + cpf := profile.NewClientProfile() + cpf.HttpProfile.Endpoint = "clb.tencentcloudapi.com" + client, _ := clb.NewClient(credential, regionId, cpf) + + request := clb.NewDeregisterTargetsFromClassicalLBRequest() + err := request.FromJsonString(params) + if err != nil { + panic(err) + } + response, err := client.DeregisterTargetsFromClassicalLB(request) + if _, ok := err.(*errors.TencentCloudSDKError); ok { + fmt.Printf("An API error has returned: %s", err) + return + } + if err != nil { + panic(err) + } + fmt.Printf("%s", response.ToJsonString()) +} diff --git a/pkg/common/CmdTools/readme.md b/pkg/common/CmdTools/readme.md new file mode 100644 index 0000000..feee5cd --- /dev/null +++ b/pkg/common/CmdTools/readme.md @@ -0,0 +1,57 @@ +# CMD 工具 + +## 阿里云SLB后端服务器client工具 + +### Usage + + Example: SlbClient.exe -t lb -o update -reg cn-hangzhou -key LTAI5tCB8SmJcwfO -sec dX4kgF4VcblsbCVdKvtCGCmvNbLkZK -lb lb-bp1nz8xl5q8kiqfv0iumf -params "[{\"ServerId\":\"i-bp1hcv8qx0677hv9pr0s\",\"Weight\":\"100\"}]" + +``` +Usage of SlbClient.exe: + -key string + accessKeyId (default "accessKeyId") + -lb string + loadBalancerId (default "loadBalancerId") + -o string + operation: add、update、remove (default "update") + -params string + SetBackendServers: [{"ServerId":"ServerId","Weight":"0"}] + AddBackendServers: [{"ServerId":"ServerId","Weight":"100","Type":"eni","ServerIp":"192.168.11.1"}] + RemoveBackendServers: [{"ServerId":"ServerId","Weight":"100"}] + (default "params") + -reg string + regionId: cn-hangzhou (default "regionId") + -sec string + accessSecret (default "accessSecret") + -t string + target: lb (default "lb") +``` + + +## 腾讯云CLB后端服务器client工具 + +### Usage + + Example1: ./TencentCloudClient -t b -o add -key AKIDSoxxjI5tukPr9ECsQmwthKhroaCZlldI -sec b1FG2b3JMrESVLxjJdhYDgx12qPiplXB -reg ap-shanghai -params "{\"LoadBalancerId\":\"lb-jip7505r\",\"Targets\":[{\"InstanceId\":\"ins-n2i7x483\",\"Weight\":20}]}" + Example2: ./TencentCloudClient -t b -o remove -key AKIDSoxxjI5tukPr9ECsQmwthKhroaCZlldI -sec b1FG2b3JMrESVLxjJdhYDgx12qPiplXB -reg ap-shanghai -params "{\"LoadBalancerId\":\"lb-jip7505r\",\"InstanceIds\":[\"ins-n2i7x483\"]}" + +``` +Usage of ./TencentCloudClient: + -key string + accessKeyId (default "secretId") + -o string + operation: add、remove (default "add") + -params string + + AddBackendServers: [{"ServerId":"ServerId","Weight":"100","Type":"eni","ServerIp":"192.168.11.1"}] + RemoveBackendServers: [{"ServerId":"ServerId","Weight":"100"}] + (default "params") + -reg string + regionId: cn-hangzhou (default "regionId") + -sec string + accessSecret (default "secretKey") + -t string + target: b=backendServer (default "b") + +``` + diff --git a/pkg/common/ConstVar.go b/pkg/common/ConstVar.go new file mode 100644 index 0000000..cb60524 --- /dev/null +++ b/pkg/common/ConstVar.go @@ -0,0 +1,146 @@ +package common + +import ( + "encoding/json" + + "github.com/anxpp/beego/logs" +) + +const ( + + //公用 + + //API版本号 + // API_V_NUM = "1" + + //API密钥 + // API_SECRECT = "x63363eacf804b4394a120aea240fd9a" + + //图片域名 + + PHOTO_URL_PREV = "https://photo-app.ddegame.cn/" + + MEDIA_URL_PREV = "https://media-qiniu-app.ddegame.cn/" + + //====== 三方key ======= + //NETEASE_IM_APPKEY = "a0671ecde01ef03928ccfd460c62d203" + //NETEASE_IM_SECRET = "eb88916031ca" + + //用户认证申请状态 + USER_CERTIFY_STATUS_INIT = "1" //已提交 + USER_CERTIFY_STATUS_SUCCESS = "2" //成功 + USER_CERTIFY_STATUS_INIT_FAIL = "3" //初始化失败 + USER_CERTIFY_STATUS_AUTH_FAIL = "4" //认证失败 + USER_CERTIFY_STATUS_REFUSE = "5" //拒绝 + + // 模块和页面ID + + //用户管理 + MODULE_ID_USER_MANAGE = "1" + //基础数据 + MODULE_ID_BASE_DATA = "4" + //财务管理 + MODULE_ID_FIN_MANAGE = "7" + //数据报表 + MODULE_ID_DATA_REPORT = "14" + //聊天室管理 + MODULE_ID_ROOM_MANAGE = "20" + //付款管理 + MODULE_ID_PAY_MANAGE = "100" + //抽奖管理 + MODULE_ID_LUCK_MANAGE = "200" + //技能管理 + MODULE_ID_SKILL_MANAGE = "300" + //技能订单管理 + MODULE_ID_SKILL_ORDER_MANAGE = "400" + //技能订单列表 + PAGE_ID_FIN_SKILL_ORDER_LIST = "401" + + //用户列表 + PAGE_ID_USER_LIST = "2" + //用户认证列表 + PAGE_ID_USER_AUTH_LIST = "3" + //礼物列表 + PAGE_ID_GIFT_LIST = "5" + //首页分类列表 + PAGE_ID_HOME_TAB_LIST = "6" + //充值列表 + PAGE_ID_FIN_RECHARGE_LIST = "8" + //提现列表 + PAGE_ID_FIN_WITHDRAW_LIST = "9" + //兑换列表 + PAGE_ID_FIN_EXCHANGE_LIST = "10" + //表情列表 + PAGE_ID_FIN_EMOJI_ORDER_LIST = "11" + //守护订单列表 + PAGE_ID_FIN_GUARD_ORDER_LIST = "12" + //打赏列表 + PAGE_ID_FIN_PRESENT_GIFT_LIST = "13" + + //日报表 + PAGE_ID_DAY_REPORT = "15" + //厅日流水报表 + PAGE_ID_DAY_ROOM_SALE_REPORT = "142" + //实时厅流水报表 + PAGE_ID_TODAY_ROOM_SALE_RANK = "143" + //厅费用排行 + PAGE_ID_TODAY_ROOM_MARKET_FEE_RANK = "144" + + //聊天室列表 + PAGE_ID_CHATROOM_LIST = "21" + //房主列表 + PAGE_ID_CHATROOM_OWNER_LIST = "22" + //打赏列表 + PAGE_ID_FIN_OPERATION_DIAMOND_LIST = "24" + // + PAGE_ID_FILTER_USER_NO = "25" + //付款单列表 + PAGE_ID_PAY_ORDER_LIST = "101" + //客户列表 + PAGE_ID_PAY_CUSTOMER_LIST = "102" + + //砸蛋列表 + PAGE_ID_HIT_EGG_LIST = "201" + //方案列表 + PAGE_ID_SOLUTION_LIST_LIST = "202" + //权益列表 + PAGE_ID_QUANYI_LIST_LIST = "203" + //用户砸蛋汇总 + PAGE_ID_USER_HITEGG_SUMMARY = "204" + + //技能申请列表 + PAGE_ID_SKILL_APPLY_LIST_LIST = "301" + + //技能列表 + PAGE_ID_SKILL_LIST = "302" + + //卖家列表 + PAGE_ID_SELLER_LIST = "303" + + //SKU列表 + PAGE_ID_SKILL_SKU_LIST = "304" + + //技能修改申请列表 + PAGE_ID_SKILL_EDIT_LIST = "305" + + //技能价格列表 + PAGE_ID_SKILL_PRICE_LIST = "306" + //技能订单列表 + PAGE_ID_SKILL_ORDER_LIST = "401" + + // 代理订单类型 后台充值 + AGENT_DIAMOND_ORDER_TYPE_ADMIN_RECHARGE = "1" + // 代理订单类型 上级转账 + AGENT_DIAMOND_ORDER_TYPE_UPER_TRANSFER = "2" + + // 文本反垃圾类型 - 昵称检测 + RISK_TYPE_TEXT_NICKNAME = "nickname_detection" + RISK_TYPE_TEXT_COMMENT = "comment_detection" //评论检测 +) + +func LogJson(v interface{}) { + b, _ := json.Marshal(v) + logs.Info(string(b)) +} + +const photoDomainUrl = "https://ddphoto.youkeya.cn" diff --git a/pkg/common/HyTools/HttpClient.go b/pkg/common/HyTools/HttpClient.go new file mode 100644 index 0000000..9d07c2f --- /dev/null +++ b/pkg/common/HyTools/HttpClient.go @@ -0,0 +1,96 @@ +package HyTools + +import ( + "io/ioutil" + "net/http" + "strings" +) + +// 调用POST请求 +func HttpPost(url string, body string) (remoteResponse string, err error) { + + bodyReader := strings.NewReader(body) + //application/x-www-form-urlencoded + //application/json + response, err1 := http.Post(url, "application/x-www-form-urlencoded", bodyReader) + + if err1 != nil { + err = err1 + return + } + defer response.Body.Close() + + resBody, err2 := ioutil.ReadAll(response.Body) + + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(resBody) + + return +} + +// 复杂http请求 +func HttpDo(httpMethod string, url string, headerMap map[string]string, rawBody string) (remoteResponse string, err error) { + + client := &http.Client{} + + req, err0 := http.NewRequest(httpMethod, url, strings.NewReader(rawBody)) + + if err0 != nil { + err = err0 + return + } + + if len(headerMap) > 0 { + for k, v := range headerMap { + req.Header.Set(k, v) + } + } + + resp, err1 := client.Do(req) + + if err1 != nil { + err = err1 + return + } + + defer resp.Body.Close() + + body, err2 := ioutil.ReadAll(resp.Body) + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(body) + return + +} + +func HttpPostJson(url string, body string) (remoteResponse string, err error) { + + bodyReader := strings.NewReader(body) + //application/x-www-form-urlencoded + //application/json + response, err1 := http.Post(url, "application/json", bodyReader) + + if err1 != nil { + err = err1 + return + } + defer response.Body.Close() + + resBody, err2 := ioutil.ReadAll(response.Body) + + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(resBody) + + return +} diff --git a/pkg/common/HyTools/RandTools.go b/pkg/common/HyTools/RandTools.go new file mode 100644 index 0000000..dfa23ed --- /dev/null +++ b/pkg/common/HyTools/RandTools.go @@ -0,0 +1,40 @@ +package HyTools + +import ( + "math/rand" + "time" +) + +func RandInt64(min, max int64) int64 { + if min >= max || min == 0 || max == 0 { + return max + } + return rand.Int63n(max-min) + min +} + +// 获取随机数字字符串 +func GetRandNumber(l int) string { + + str := "0123456789" + bytes := []byte(str) + result := []byte{} + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := 0; i < l; i++ { + result = append(result, bytes[r.Intn(len(bytes))]) + } + return string(result) + +} + +// 生成随机字符串 +func GetRandomString(l int) string { + + str := "0123456789abcdefghijklmnopqrstuvwxyz" + bytes := []byte(str) + result := []byte{} + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := 0; i < l; i++ { + result = append(result, bytes[r.Intn(len(bytes))]) + } + return string(result) +} diff --git a/pkg/common/HyTools/RsaUtil.go b/pkg/common/HyTools/RsaUtil.go new file mode 100644 index 0000000..c6b0a30 --- /dev/null +++ b/pkg/common/HyTools/RsaUtil.go @@ -0,0 +1,146 @@ +package HyTools + +import ( + "bytes" + "crypto" + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/x509" + "encoding/base64" + "encoding/pem" + "errors" +) + +// RSA加密 +func RsaEncrypt(origData string, publicKey string) (string, error) { + + block, _ := pem.Decode([]byte(publicKey)) //将密钥解析成公钥实例 + if block == nil { + return "", errors.New("public key error") + } + + pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) //解析pem.Decode()返回的Block指针实例 + if err != nil { + return "", err + } + + pub := pubInterface.(*rsa.PublicKey) + + partLen := pub.N.BitLen()/8 - 11 + + chunks := ByteSplit([]byte(origData), partLen) + + buffer := bytes.NewBufferString("") + + for _, chunk := range chunks { + + bytes, err := rsa.EncryptPKCS1v15(rand.Reader, pub, chunk) + + if err != nil { + return "", err + } + + buffer.Write(bytes) + } + + return base64.StdEncoding.EncodeToString(buffer.Bytes()), nil + +} + +// RSA解密 +func RsaDecrypt(ciphertext string, privateKey string) (string, error) { + + block, _ := pem.Decode([]byte(privateKey)) + + if block == nil { + + return "", errors.New("private key error!") + } + priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return "", err + } + + partLen := priv.N.BitLen() / 8 + + raw, err := base64.StdEncoding.DecodeString(ciphertext) + + chunks := ByteSplit([]byte(raw), partLen) + + buffer := bytes.NewBufferString("") + + for _, chunk := range chunks { + + decrypted, err := rsa.DecryptPKCS1v15(rand.Reader, priv, chunk) + + if err != nil { + + return "", err + + } + + buffer.Write(decrypted) + + } + + return buffer.String(), err +} + +// RSA SHA1加签 +func RsaSHA1Sign(data string, privateKey string) (string, error) { + + block, _ := pem.Decode([]byte(privateKey)) + if block == nil { + return "", errors.New("Sign private key decode error") + } + + prk8, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return "", err + } + + h := sha1.New() + h.Write([]byte(data)) + hashed := h.Sum(nil) + + sign, err := rsa.SignPKCS1v15(rand.Reader, prk8, crypto.SHA1, hashed) + + if err != nil { + return "", err + } + + return base64.StdEncoding.EncodeToString(sign), err + +} + +// RSA SHA1验签 +func RsaSHA1Verify(data string, sign string, publicKey string) error { + + h := sha1.New() + h.Write([]byte(data)) + hashed := h.Sum(nil) + + decodedSign, err := base64.StdEncoding.DecodeString(sign) + + if err != nil { + + return err + + } + + block, _ := pem.Decode([]byte(publicKey)) + if block == nil { + return errors.New("Sign public key decode error") + } + + pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) //解析pem.Decode()返回的Block指针实例 + if err != nil { + return err + } + + pub := pubInterface.(*rsa.PublicKey) + + return rsa.VerifyPKCS1v15(pub, crypto.SHA1, hashed, decodedSign) + +} diff --git a/pkg/common/HyTools/StringBuilder.go b/pkg/common/HyTools/StringBuilder.go new file mode 100644 index 0000000..c6c0974 --- /dev/null +++ b/pkg/common/HyTools/StringBuilder.go @@ -0,0 +1,30 @@ +package HyTools + +import ( + "bytes" + "encoding/json" + "fmt" +) + +type StringBuilder struct { + buf bytes.Buffer +} + +func NewStringBuilder() *StringBuilder { + return &StringBuilder{buf: bytes.Buffer{}} +} + +func (this *StringBuilder) Append(obj interface{}) *StringBuilder { + this.buf.WriteString(fmt.Sprintf("%v", obj)) + return this +} + +func (this *StringBuilder) ToString() string { + return this.buf.String() +} + +// 字符串转int32 +func JsonStr(v interface{}) string { + bys, _ := json.Marshal(v) + return string(bys) +} diff --git a/pkg/common/HyTools/TypeTools.go b/pkg/common/HyTools/TypeTools.go new file mode 100644 index 0000000..4c19dad --- /dev/null +++ b/pkg/common/HyTools/TypeTools.go @@ -0,0 +1,243 @@ +package HyTools + +import ( + "bytes" + "crypto/md5" + "crypto/sha1" + "encoding/hex" + "fmt" + "math" + "strconv" + "strings" + "time" +) + +// MD5加密 +func StringToMD5(waitMD5string string) string { + + h := md5.New() + h.Write([]byte(waitMD5string)) + cipherStr := h.Sum(nil) + + result := hex.EncodeToString(cipherStr) + + return result +} + +// SHA1加密 +func StringToSHA1(waitMD5string string) string { + + h := sha1.New() + h.Write([]byte(waitMD5string)) + cipherStr := h.Sum(nil) + + result := hex.EncodeToString(cipherStr) + + return result +} + +// 字符串转int64 +func StringToInt64(waitString string) int64 { + + stringInt64, err := strconv.ParseInt(waitString, 10, 64) + + if err != nil { + return 0 + } + return stringInt64 +} + +// 字符串转int32 +func StringToInt(waitString string) int { + + stringInt, err := strconv.Atoi(waitString) + + if err != nil { + return 0 + } + + return stringInt +} + +// 字符串转float64 +func StringToFloat64(waitString string) float64 { + + stringInt64, err := strconv.ParseFloat(waitString, 64) + + if err != nil { + return 0 + } + return stringInt64 +} + +// strconv.FormatFloat(float64, 'E', -1, 64) +// float64转字符串 +func Float64ToString(waitFloat64 float64) string { + + stringInt64 := strconv.FormatFloat(waitFloat64, 'f', -1, 64) + + return stringInt64 +} + +// 截取字符串 +func Substr(str string, start int, length int) string { + rs := []rune(str) + rl := len(rs) + end := 0 + + if start < 0 { + start = rl - 1 + start + } + end = start + length + + if start > end { + start, end = end, start + } + + if start < 0 { + start = 0 + } + if start > rl { + start = rl + } + if end < 0 { + end = 0 + } + if end > rl { + end = rl + } + + return string(rs[start:end]) +} + +// map转html +func MapToXML(mapData map[string]string) string { + + if len(mapData) == 0 { + return "" + } + sb := NewStringBuilder() + sb.Append("") + for key, val := range mapData { + sb.Append("<" + key + ">") + sb.Append(val) + sb.Append("") + + } + sb.Append("") + + return sb.ToString() +} + +// 获取当前年周 +func GetCurrentYearWeek() string { + + year, week := time.Now().ISOWeek() + + return strconv.Itoa(year) + strconv.Itoa(week) +} + +// 字符串转time类型 +func StringToTime(dateString string) time.Time { + + //获取本地location + toBeCharge := dateString //待转化为时间戳的字符串 注意 这里的小时和分钟还要秒必须写 因为是跟着模板走的 修改模板的话也可以不写 + timeLayout := "2006-01-02 15:04:05" //转化所需模板 + loc, _ := time.LoadLocation("Local") //重要:获取时区 + theTime, _ := time.ParseInLocation(timeLayout, toBeCharge, loc) //使用模板在对应时区转化为time.time类型 + //sr := theTime.Unix() //转化为时间戳 类型是int64 + + //时间戳转日期 + //dataTimeStr := time.Unix(sr, 0).Format(timeLayout) //设置时间戳 使用模板格式化为日期字符串 + + return theTime +} + +// 判断数组是否包含某个元素 +func CheckStringIsInArray(arrayList []string, element string) bool { + + if len(arrayList) == 0 { + return false + } + + isInArray := false + for _, data := range arrayList { + + if data == element { + isInArray = true + break + } + } + + return isInArray +} + +// slice to 字符串 +func StringListToString(stringList []string, split string) string { + if len(split) == 0 { + split = "," + } + return strings.Replace(strings.Trim(fmt.Sprint(stringList), "[]"), " ", split, -1) +} + +// map 转 url参数 +func MapToUrlParams(mapData map[string]string) string { + + mapLen := len(mapData) + if mapLen == 0 { + return "" + } + sb := NewStringBuilder() + + i := 0 + for k, v := range mapData { + + sb.Append(k + "=" + v) + if i < mapLen-1 { + sb.Append("&") + } + + i++ + } + return sb.ToString() +} + +// []byte 合并 +func BytesCombine(pBytes ...[]byte) []byte { + return bytes.Join(pBytes, []byte("")) +} + +// 获取当前UTC时间 秒数 +func GetCurrentUtcTimeSecond() int64 { + return time.Now().UTC().Unix() +} + +// byte数组分组 +func ByteSplit(buf []byte, lim int) [][]byte { + + var chunk []byte + + chunks := make([][]byte, 0, len(buf)/lim+1) + + for len(buf) >= lim { + + chunk, buf = buf[:lim], buf[lim:] + + chunks = append(chunks, chunk) + + } + + bufLen := len(buf) + if bufLen > 0 { + + chunks = append(chunks, buf[:bufLen]) + + } + + return chunks + +} + +func Float64ToIntRound(f float64) int { + return int(math.Round(f)) +} diff --git a/pkg/common/HyTools/Uuid.go b/pkg/common/HyTools/Uuid.go new file mode 100644 index 0000000..285f352 --- /dev/null +++ b/pkg/common/HyTools/Uuid.go @@ -0,0 +1,111 @@ +package HyTools + +import ( + crand "crypto/rand" + "encoding/hex" + "errors" + "fmt" + mrand "math/rand" + "regexp" + "strings" + "time" + + "github.com/google/uuid" +) + +// seeded indicates if math/rand has been seeded +var seeded bool = false + +// uuidRegex matches the UUID string +var uuidRegex *regexp.Regexp = regexp.MustCompile(`^\{?([a-fA-F0-9]{8})-?([a-fA-F0-9]{4})-?([a-fA-F0-9]{4})-?([a-fA-F0-9]{4})-?([a-fA-F0-9]{12})\}?$`) + +// UUID type. +type UUID [16]byte + +// Hex returns a hex string representation of the UUID in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format. +func (this UUID) Hex() string { + + x := [16]byte(this) + + return fmt.Sprintf("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + x[0], x[1], x[2], x[3], x[4], + x[5], x[6], + x[7], x[8], + x[9], x[10], x[11], x[12], x[13], x[14], x[15]) +} + +// Rand generates a new version 4 UUID. +func Rand() UUID { + var x [16]byte + randBytes(x[:]) + x[6] = (x[6] & 0x0F) | 0x40 + x[8] = (x[8] & 0x3F) | 0x80 + return x +} + +// FromStr returns a UUID based on a string. +// The string could be in the following format: +// +// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +// +// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +// +// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} +// +// If the string is not in one of these formats, it'll return an error. +func FromStr(s string) (id UUID, err error) { + if s == "" { + err = errors.New("Empty string") + return + } + + parts := uuidRegex.FindStringSubmatch(s) + if parts == nil { + err = errors.New("Invalid string format") + return + } + + var array [16]byte + slice, _ := hex.DecodeString(strings.Join(parts[1:], "")) + copy(array[:], slice) + id = array + return +} + +// MustFromStr behaves similarly to FromStr except that it'll panic instead of +// returning an error. +func MustFromStr(s string) UUID { + id, err := FromStr(s) + if err != nil { + panic(err) + } + return id +} + +// randBytes uses crypto random to get random numbers. If fails then it uses math random. +func randBytes(x []byte) { + + length := len(x) + n, err := crand.Read(x) + + if n != length || err != nil { + if !seeded { + mrand.Seed(time.Now().UnixNano()) + } + + for length > 0 { + length-- + x[length] = byte(mrand.Int31n(256)) + } + } +} + +func GetUUID() string { + + u7, _ := uuid.NewV7() + return strings.ReplaceAll(u7.String(), "-", "") + // var uuid UUID = Rand() + + // return uuid.Hex() + +} diff --git a/pkg/common/app_const.go b/pkg/common/app_const.go new file mode 100644 index 0000000..3f7573d --- /dev/null +++ b/pkg/common/app_const.go @@ -0,0 +1,1352 @@ +package common + +import ( + "crypto/md5" + "encoding/hex" + "sort" + "strings" + "time" +) + +const ( + //============= 数据库别名 ================ + MYSQL_ALIAS_DEFAULT_DB = "default" // APP主库别名 - 默认库 + MYSQL_ALIAS_MASTER_WRITE_DB = "master" // APP主库别名 + MYSQL_ALIAS_APP_READ_ONLY_DB = "master-ro" // 主库只读 + MYSQL_ALIAS_ACTIVITY_DB = "activity" // 活动库别名 + MYSQL_ALIAS_LOG_DB = "data" // 日志库别名 + MYSQL_ALIAS_SPREAD_DB = "spread" // 推广库别名 + MYSQL_ALIAS_OPERATION_DB = "admin" // 后台 + MYSQL_ALIAS_LINK_DB = "link" // 短链接 + MYSQL_ALIAS_TEAM_DB = "team" // 短链接 +) + +const ( + //============= 通用 ============== + + EXPORT_MAX_ROW = 65000 + + REGISTER_ROOM_NOTICE_CLOSE = "STR_REGISTER_ROOM_NOTICE_CLOSE" + + //iOS的bundleID + APP_IOS_BUNDLE_ID = "com.laichuangjiutian.ayou" + + // 时间格式 + TimeDefaultFormat = "Y-m-d H:i:s" + + // 默认日期 + DateDefaultFormat = "Y-m-d" + + //post请求 + HTTP_METHOD_POST = "POST" + + // 消费单位名称 + CONSUME_UNIT_NAME = "钻石" + + // 收益单位名称 + REVENUE_UNIT_NAME = "猫粮" + + // 收益单位名称 + N_COIN_UNIT_NAME = "N币" + + // 钻石打赏到收益比例 + // DIAMOND_DASHANG_TO_REVENUE = 0.7 + + // 守护收益比率 + // CHATROOM_GUARD_RATE = 0.7 + + // 订单收益比率 + // SKILL_ORDER_RATE = 0.8 + + //试营业期间护航单猫粮比例 + SKILL_FREE_PILOT_RUN_ORDER_RATE = 1.0 + + //试运行结束日期 + SKILL_FREE_PILOT_RUN_ORDER_END_DATE = "2025-09-17 20:00:00" + + //正式营业期护航单猫粮比例 + SKILL_FREE_ORDER_RATE = 0.75 + + // 魅力值对应现金 + REVENUE_TO_CASH = 0.1 + + //N币对应现金 + NCoin_TO_CASH = 0.1 + + // 现金兑换钻石 + CASH_TO_DIAMOND = 10 + + SKILL_ORDER_RATE_NCoin = 0.9 + + // 每次最大提现金额 + CHARM_WITHDRAW_MAX_CASH = 50000 + // 每次最小提现金额 + CHARM_WITHDRAW_MIN_CASH = 10 + + // NCoin_WITHDRAW_MAX_CASH 每次最大提现金额 + NCoin_WITHDRAW_MAX_CASH = 50000 + // NCoin_WITHDRAW_MIN_CASH 每次最小提现金额 + NCoin_WITHDRAW_MIN_CASH = 10 + + // 提现手续费 2% + CHARM_WITHDRAW_SERVICE_FEE = 0.02 + + // 认证方式 芝麻认证 + CERTIFY_TYPE_ZHIMA = "1" + + // 认证方式 人工认证 + CERTIFY_TYPE_RENGONG = "2" + + // 认证方式 支付宝认证 + CERTIFY_TYPE_ALI = "3" + + // 认证方式 阿里三要素认证 + CERTIFY_TYPE_ALI_3 = "4" + + // 认证方式 阿里二要素认证 + CERTIFY_TYPE_ALI_2 = "5" + + // 认证方式 易盾人身核验认证 + CERTIFY_TYPE_NETEASE = "6" + + // 广告资源位代码 聊天室首页顶部 + POSITION_CODE_CHATROOM_HOME_TOP = "chatroom_home_top" + + // 广告资源位代码 启动页 + POSITION_CODE_START_UP_PAGE = "start_up_page" + + // 广告资源位代码 APP首页顶部 + POSITION_CODE_APP_HOME_TOP = "app_home_top" + + // 广告资源位代码 首页弹窗 + POSITION_CODE_HOME_POPUP = "home_pop_up" + + // 一个身份证最多认证几个帐号 + CERTNO_AUTH_MAX_USER_COUNT = 1 + + // 一个设备最多注册几个帐号 + DEVICE_SIGNUP_MAX_USER_COUNT = 5 + + // 日志引用符号 + LOG_QUOTE_STRING = "#" + + // 被邀请的用户最多可以给邀请人奖励多少钻石 + INVITED_USER_REWARDS_MAX_DIAMOND = 2000 + + // 聊天室字体颜色 - 黄色 + CHATROOM_SYSTEM_MSG_COLOR_YELLOW = "#FFD700" + + // 聊天室字体颜色 - 绿色 + CHATROOM_SYSTEM_MSG_COLOR_GREEN = "#8ADE4D" + + // 聊天室字体颜色 - 系统栏 + CHATROOM_SYSTEM_MSG_COLOR_SYSTEM_BLUE = "#43EAE1" + + // 聊天室字体颜色 - 紫色 + CHATROOM_SYSTEM_MSG_COLOR_PURPLE = "#E031FE" + + // 默认等级的背景颜色 + SKILL_LEVEL_DEFAULT_BG_COLOR = "#FFD700" + + // 聊天室字体颜色 - 蓝色 + CHATROOM_SYSTEM_MSG_COLOR_BLUE = "#25C6FD" + + // 聊天室字体颜色 - 青色 + CHATROOM_SYSTEM_MSG_COLOR_QING = "#00FFCC" + + // 聊天室字体颜色 - 白色 + CHATROOM_SYSTEM_MSG_COLOR_WHITE = "#FFFFFF" + + //IM用户分组 消息列表顶部 + IM_USER_GROUP_TYPE_LIST_TOP = "ListTop" + + // 订单前缀 + //RECHARGE_ORDER_PREV = "NN_" + + // 用户账本 业务类型 + USER_JOURNAL_ACTION_TYPE_XIAOFEI = "1" // 消费 + USER_JOURNAL_ACTION_TYPE_SHOURU = "2" // 收入 + USER_JOURNAL_ACTION_TYPE_CHONGZHI = "3" // 充值 + USER_JOURNAL_ACTION_TYPE_OPERATION_CONTROL = "4" // 运营控制 + USER_JOURNAL_ACTION_TYPE_AGENT_TRANSFER = "5" // 代理转移 + // 用户账本 业务ID user_journal_type表 + USER_JOURNAL_TYPE_ID_CHATROOM_DASHANG_XIAOFEI = "301" // 聊天室打赏消费 + USER_JOURNAL_TYPE_ID_XIADAN_XIAOFEI = "302" // 下单消费 + USER_JOURNAL_TYPE_ID_TIMELINE_DASHANG_XIAOFEI = "303" // 动态打赏消费 + USER_JOURNAL_TYPE_ID_BUY_GUARD_XIAOFEI = "304" // 守护消费 + + USER_JOURNAL_TYPE_ID_CHATROOM_DASHANG_SHOURU = "401" // 聊天室打赏收入 + USER_JOURNAL_TYPE_ID_XIADAN_SHOURU = "402" // 下单收入 + USER_JOURNAL_TYPE_ID_TIMELINE_DASHANG_SHOURU = "403" // 动态打赏收入 + USER_JOURNAL_TYPE_ID_SALE_GUARD_SHOURU = "404" // 守护收入 + USER_JOURNAL_TYPE_ID_ROOM_COMMISSION_SHOURU = "405" // 流水结算收入 + + USER_JOURNAL_TYPE_ID_CHONGZHI = "501" // 用户充值 + USER_JOURNAL_TYPE_ID_INVITE_FRIEND_JIANGLI = "502" // 邀请好友奖励充值 + USER_JOURNAL_TYPE_ID_OPERATION_GIVE = "503" // 运营赠送充值 + USER_JOURNAL_TYPE_ID_OPERATION_REDUCE_REVENUE = "601" // 运营扣除收益 + USER_JOURNAL_TYPE_ID_OPERATION_REDUCE_DIAMOND = "602" // 运营扣除钻石 + USER_JOURNAL_TYPE_ID_AGENT_TRANSFER_IN = "507" // 代理转入 + + //============ 订单相关 ============== + + // 未支付订单多久过期(分钟) + NOT_PAID_ORDER_EXPIRE_MINUTES = 10 + + // 已结束多久自动完成(小时) + ORDER_ENDED_AUTO_FINISH_HOURS = 24 + + // 已申请退款多久自动退款(小时) + ORDER_REFUNDING_AUTO_REFUND_HOURS = 24 + + // 订单消息 消息里用户身份 1=买家 2=卖家 + MESSAGE_ORDER_USER_TYPE_BUYER = "1" + MESSAGE_ORDER_USER_TYPE_SELLER = "2" + + // 订单支付状态 未支付 + ORDER_PAY_STATUS_UNPAY = "0" + // 订单支付状态 已支付 + ORDER_PAY_STATUS_PAID = "1" + // 订单支付状态 已退款 + ORDER_PAY_STATUS_REFUND = "2" + + // 订单原始状态 已下单待支付 + ORDER_ORIGIN_STATUS_CREATED_WAIT_PAY = "1" + // 订单原始状态 已支付待接单 + ORDER_ORIGIN_STATUS_PAID_WAIT_SELLER_AGREE = "2" + // 订单原始状态 已接单 + ORDER_ORIGIN_STATUS_SELLER_AGREED = "3" + // 订单原始状态 已完成 + ORDER_ORIGIN_STATUS_FINISHED = "4" + // 订单原始状态 退款中 + ORDER_ORIGIN_STATUS_REFUNDING = "5" + // 订单原始状态 申诉中 + ORDER_ORIGIN_STATUS_IN_APPEAL = "6" + // 订单原始状态 申诉失败 订单完成 + ORDER_ORIGIN_STATUS_APPEAL_FAILED = "8" + // 订单原始状态 支付前买家取消 + ORDER_ORIGIN_STATUS_UNPAY_BUYER_CANCELED = "20" + // 订单原始状态 10分钟未支付自动过期 + ORDER_ORIGIN_STATUS_UNPAY_AUTO_EXPISED = "21" + // 订单原始状态 支付后买家取消 + ORDER_ORIGIN_STATUS_PAID_BUYER_CANCELED = "22" + // 订单原始状态 支付后卖家未接单 自动取消 + ORDER_ORIGIN_STATUS_PAID_SELLER_NOT_AGREE_AUTO_CANCELED = "23" + // 订单原始状态 卖家拒绝接单 + ORDER_ORIGIN_STATUS_SELLER_REJECTED_ORDER = "24" + // 订单原始状态 卖家同意退款 + ORDER_ORIGIN_STATUS_SELLER_AGREE_REFUND = "25" + // 订单原始状态 申诉成功取消并退款 + ORDER_ORIGIN_STATUS_APPEAL_SUCCESS_CANCELED = "26" + // 订单原始状态 买家申请退款卖家超时未处理自动取消 + ORDER_ORIGIN_STATUS_REFUNDING_EXPIRED_AUTO_CANCELED = "27" + + //PayOrder = 支付订单 CancelOrder = 取消订单 AgreeOrder= 同意接单 RefuseOrder=拒绝接单 FinishOrder = 确认完成 RequestRefund=请求退款 AgreeRefund=同意退款 RefuseRefund=拒绝退款 + // 订单操作 创建订单 + ORDER_ACTION_CREATE_ORDER = "CreateOrder" + // 订单操作 支付订单 + ORDER_ACTION_PAY_ORDER = "PayOrder" + // 订单操作 取消订单 + ORDER_ACTION_CANCEL_ORDER = "CancelOrder" + // 订单操作 卖家同意接单 + ORDER_ACTION_AGREE_ORDER = "AgreeOrder" + // 订单操作 卖家完成一局 + ORDER_ACTION_SUB_COMPLETE_ORDER = "SubCompleteOrder" + // 订单操作 买家续单 + ORDER_ACTION_RENEW_ORDER = "RenewOrder" + // 订单操作 卖家开始陪玩 + ORDER_ACTION_START_ORDER = "StartOrder" + // 订单操作 卖家拒绝接单 + ORDER_ACTION_REJECT_ORDER = "RejectOrder" + // 订单操作 买家完成订单 + ORDER_ACTION_FINISH_ORDER = "FinishOrder" + // 订单操作 提前结束 + ORDER_ACTION_EARLY_END_ORDER = "EarlyEndOrder" + // 订单操作 按局订单 陪玩结束 + ORDER_ACTION_SELLER_END_ORDER = "SellerEndOrderByCount" + // 订单操作 买家请求退款 + ORDER_ACTION_REQUEST_REFUND = "RequestRefund" + // 订单操作 卖家同意退款 + ORDER_ACTION_AGREE_REFUND = "AgreeRefund" + // 订单操作 卖家拒绝退款 + ORDER_ACTION_REJECT_REFUND = "RejectRefund" + // 订单操作 评价订单 + ORDER_ACTION_RATE_ORDER = "RateOrder" + // 订单操作 再次下单 + ORDER_ACTION_ORDER_AGAIN = "ReCreateOrder" + // 订单操作 申请售后 + ORDER_ACTION_ORDER_SUPPORT = "ApplySupportOrder" + // 订单操作 删除订单 + ORDER_ACTION_ORDER_DEL = "DeleteOrder" + // 订单操作 订单免单 + ORDER_ACTION_ORDER_FREE = "FreeOrder" + // 订单操作 联系售后 + ORDER_ACTION_CONTACT_SUPPORT = "ContactSupport" + // 订单操作 删除评价订单 + ORDER_ACTION_DELETE_ORDER_RATE = "DeleteOrderRate" + // 订单操作 删除订单 + ORDER_ACTION_DELETE_ORDER = "DeleteOrder" + // 订单操作 申诉 + ORDER_ACTION_APPEAL_SUCCESS = "AppealSuccess" + // 订单操作 申诉失败 + ORDER_ACTION_APPEAL_FAIL = "AppealFail" + //订单操作 增加单量 + ORDER_ACTION_ADD_ORDER_COUNT = "AddOrderCount" + //订单操作 减少单量 + ORDER_ACTION_REDUCE_ORDER_COUNT = "ReduceOrderCount" + //订单操作 进入房间 + ORDER_ACTION_ENTER_ROOM = "EnterRoom" + + // 自动脚本订单操作 + // 未付款自动过期 + TASK_ORDER_ACTION_NOT_PAID_AUTO_EXPIRED = "NotPaidAutoExpired" + // 已支付未接单自动过期 + TASK_ORDER_ACTION_SELLER_NOT_AGREED_AUTO_EXPIRED = "SellerNotAgreedAutoExpired" + // 自动完成 + TASK_ORDER_ACTION_AUTO_FINISH = "OrderAutoFinish" + // 自动退款 + TASK_ORDER_ACTION_AUTO_REFUND = "OrderAutoRefund" + + //============ 技能相关 ============== + + // 用户技能状态-正常 + SELLER_SKILL_STATUS_NORMAL = "1" + SELLER_SKILL_STATUS_NORMAL_I = 1 + + // 技能申请状态 - 待审核 + SELLER_SKILL_STATUS_WAIT_APPROVE = "2" + + // 用户技能状态-冻结 + SELLER_SKILL_STATUS_FROZEN = "3" + + // 用户技能状态-拒绝 + SELLER_SKILL_STATUS_REFUSE = "4" + + // 技能申请状态 - 已审核 + SKILL_APPLY_STATUS_APPROVED = "1" + + // 技能申请状态 - 待审核 + SKILL_APPLY_STATUS_WAIT_APPROVE = "2" + + // 技能申请状态 - 已拒绝 + SKILL_APPLY_STATUS_REFUSED = "3" + + // 技能修改状态 - 已审核 + SKILL_EDIT_STATUS_APPROVED = "1" + + // 技能申请状态 - 待审核 + SKILL_EDIT_STATUS_WAIT_APPROVE = "2" + + // 技能申请状态 - 已拒绝 + SKILL_EDIT_STATUS_REFUSED = "3" + + // 大神状态 正常 + SELLER_STATUS_NORMAL = "1" + + // 大神状态 冻结 + SELLER_STATUS_FROZEN = "0" + + // 大神状态 注销 + SELLER_STATUS_DELETE = "2" + + // 用户接单状态-接单 + SELLER_SERVICE_STATUS_OPEN = "1" + + // 用户接单状态-不接单 + SELLER_SERVICE_STATUS_CLOSE = "0" + + // 是否大神 0=未申请过 + IS_SELLER_NOT_APPLY_SKILL = "0" + + // 是否大神 1=是大神 + IS_SELLER_IS_GOD = "1" + + // 是否大神 2=有待审核或被拒绝的 + IS_SELLER_HAVE_WAIT_APPROVE_OR_REJECT = "2" + + // 是否大神 3=已冻结 + IS_SELLER_FROZEN = "3" + + // ============ 微信支付交易类型 ============ + + // 公众号支付 + WEIXIN_PAY_TRADER_TYPE_GONGZHONGHAO = "JSAPI" + + //APP支付 + WEIXIN_PAY_TRADER_TYPE_APP = "APP" + + //H5支付 + WEIXIN_PAY_TRADER_TYPE_H5 = "MWEB" + + //H5支付 + WEIXIN_PAY_TRADER_TYPE_NATIVE = "NATIVE" + + // ============ 客户端平台 ============== + + //Android平台 + CLIENT_PLATFORM_ANDROID = "Android" + + //iOS平台 + CLIENT_PLATFORM_IOS = "iOS" + + //H5平台 + CLIENT_PLATFORM_H5 = "H5" + + //PC + CLIENT_PLATFORM_PC = "Windows" + + //H5密钥 + // H5_CLIENT_SECRET = "x63363eacf804b4394a120aea240fd9a" + + //============= 域名相关 ======================== + + // 图片域名 + PHOTO_DOMAIN_URL = "https://photo-app.ddegame.cn/" + + // 音视频域名 + MEDIA_DOMAIN_URL = "https://media-qiniu-app.ddegame.cn/" + + // =========== 短信模板 ============== + + //submail验证码模板 + VericodeSubmailTplId = "S6fgD3" + + // 订单支付给大神发短信 + PayOrderToSellerSubmailTplId = "T7sX33" + + // 国际短信验证码 + InterNationalVericodeTplId = "6OiZo3" + + // ========== 用户相关 ================ + + // 手机号注册 + SIGNUP_SOURCE_APP_MOBILE = "1" + // 微信注册 + SIGNUP_SOURCE_APP_WEIXIN = "2" + //QQ注册 + SIGNUP_SOURCE_APP_QQ = "3" + //H5注册 + SIGNUP_SOURCE_WEB_H5 = "4" + // 易盾一键注册 + SIGNUP_SOURCE_YIDUN_ONECLICK = "5" + //apple注册 + SIGNUP_SOURCE_APPLE_SIGN = "6" + + // 热度基础值 + HotBaseCount = 0 + + // 手机号 密码方式登录 + SIGNIN_TYPE_MOBILE_PASSWORD = "1" //APP PC + // 微信登录 + SIGNIN_TYPE_WEIXIN = "2" //APP + // QQ登录 + SIGNIN_TYPE_QQ = "3" //APP + // 验证码登录 + SIGNIN_TYPE_VERICODE = "4" //APP PC H5 + // 手机号或ID登录 + SIGNIN_TYPE_MOBILE_OR_ID = "5" //H5 + + // 易盾一键登录 + SIGNIN_TYPE_YIDUN_ONE_CLICK = "6" //APP + + // 苹果登录 + SIGNIN_TYPE_APPLE_SIGNIN = "7" //APP + + // 用户状态 正常 + USER_STATUS_NORMAL = "1" + + // 用户状态 冻结 + USER_STATUS_FROZEN = "2" + + // 用户状态 注销申请中 + USER_STATUS_DELETE_APPLYING = "3" + + // 用户状态 已注销 + USER_STATUS_DELETED = "4" + + // 用户账户状态 冻结 + USER_ACCOUNT_STATUS_FROZEN = "2" + + USER_ACCOUNT_DIAMOND_STATUS_FROZEN = "frozen" + + USER_ACCOUNT_CHARM_STATUS_FROZEN = "frozen" + + // 用户激活状态 已激活 + USER_ACTIVE_STATUS_ACTIVED = "1" + USER_ACTIVE_STATUS_ACTIVED_INT = 1 + + // 用户激活状态 未激活 + USER_ACTIVE_STATUS_UNACTIVE = "2" + + // ============ 充值相关 ============== + // 充值订单类型 1 = 钻石充值 + FIN_RECHARGE_ORDER_TYPE_DIAMOND = "1" + FIN_RECHARGE_ORDER_TYPE_N_COIN = "2" + // 充值订单类型 3 = 钻石充值 + FIN_RECHARGE_ORDER_TYPE_ORDER = "3" + + // 充值订单渠道 + FIN_RECHARGE_ORDER_CHANNEL_APP_IOS = "1" + + // 充值订单渠道 APP-Android + FIN_RECHARGE_ORDER_CHANNEL_APP_ANDROID = "2" + + // 充值订单渠道 微信公众号 + FIN_RECHARGE_ORDER_CHANNEL_WX_PUBLIC_PLATFORM = "3" + + // 充值订单渠道 pc native 微信支付 + FIN_RECHARGE_ORDER_CHANNEL_NATIVE_WEB = "4" + + // 充值订单渠道 H5 + FIN_RECHARGE_ORDER_CHANNEL_H5_WEB = "5" + + // ============== 聊天室业务相关 ============== + + // 座位类型 黄金守护位 + CHATROOM_SEAT_TYPE_GOLD_GUARD_SEAT = "1" + + // 座位类型 白银守护位 + CHATROOM_SEAT_TYPE_SILVER_GUARD_SEAT = "2" + + // 座位类型 白银守护位 + CHATROOM_SEAT_TYPE_BRONZE_GUARD_SEAT = "3" + + // 座位类型 老板位 + CHATROOM_SEAT_TYPE_BOSS_SEAT = "4" + + // 座位类型 嘉宾位(陪陪位) + CHATROOM_SEAT_TYPE_GOD_SEAT = "5" + + // 默认聊天室最大人数 + DEFAULT_MAX_CHATROOM_MEMBER = "200" + + // 连击间隔时间 10秒 + COMBO_HIT_GAP_SEC = 5 + COMBO_HIT_GAP_TIME = time.Second * COMBO_HIT_GAP_SEC + + // 聊天室开启 Status + CHATROOM_STATUS_OPENING = "1" + + // 聊天室关闭 Status + CHATROOM_STATUS_CLOSED = "2" + + // 聊天室冻结 Status + CHATROOM_STATUS_FREEZING = "0" + + // 陪玩模板ID + TEMPLATE_ID_PEIWAN = "5001" + + // 交友模板ID + TEMPLATE_ID_JIAOYOU = "5002" + + // 电台模板ID + TEMPLATE_ID_DIANTAI = "5003" + + // 派单模板ID + TEMPLATE_ID_PAIDAN = "5004" + + // 个人秀模板ID + TEMPLATE_ID_USER_SHOW = "5005" + + // 小圈 + TEMPLATE_ID_XIAOQUAN = "5006" + + // 频道 + TEMPLATE_ID_PINDAO = "5007" + + // 闲聊大厅 + TEMPLATE_ID_TALK = "5008" + + // 主持人的seatindex + CHATROOM_MASTER_SEATINDEX = "master" + // 频道boss位 1麦 + CHATROOM_BOOS_SEATINDEX = "boss" + CHATROOM_SEATINDEX_0 = "0" + CHATROOM_SEATINDEX_1 = "1" + CHATROOM_SEATINDEX_2 = "2" + CHATROOM_SEATINDEX_3 = "3" + CHATROOM_SEATINDEX_4 = "4" + CHATROOM_SEATINDEX_5 = "5" + CHATROOM_SEATINDEX_6 = "6" + CHATROOM_SEATINDEX_7 = "7" + CHATROOM_SEATINDEX_8 = "8" + + // 首页魅力榜IconUrl + HOME_CHARM_TOP_ICON_URL = "" + + // 首页贡献榜IconUrl + HOME_CONSUME_TOP_ICON_URL = "" + + // 连击累计达到多少有全服飞机 + FULL_SERVICE_MSG_MIN_DIAMOND = 52000 + FULL_SERVICE_MSG_MIN_N_COIN = 52000 + + // 重开房间的时间限制 + REOPEN_CHATROOM_TIME_LIMIT = time.Second * 10 + + // 踢出房间的时间限制 + KICKED_OUT_CHATROOM_TIME_LIMIT = time.Second * 300 + + // 踢出房间的消息内容 + KICKED_OUT_CHATROOM_MSG = "被踢出房间5分钟" + + // 聊天室表情玩法类型 + + // 空的 = 普通表情 + CHATROOM_EMOJI_GAME_TYPE_NORMAL = "" + CHATROOM_EMOJI_GAME_TYPE_FOX_MACHINE = "fox_machine" + // 随机结果 + CHATROOM_EMOJI_GAME_TYPE_RAND = "rand" + + // 聊天室上麦类型 + CHATROOM_UP_SEAT_TYPE_QUEUE = "1" // 排队(麦序模式) + CHATROOM_UP_SEAT_TYPE_AUTO = "2" // 直接上麦(自由模式) + CHATROOM_UP_SEAT_TYPE_CHAIR = "3" // 主席 + + // 个人房间TAB_ID + PERSONAL_ROOM_TAB_ID = "10" + // 情感房间TAB_ID + EMOTION_ROOM_TAB_ID = "2" + // 情感房间TAB_ID + MUSIC_ROOM_TAB_ID = "5" + EMOTION_BOY_ROOM_TAB_ID = "8" + + // ========== 系统帐号 ========== + + // 客服帐号 客服 + SYSTEM_KEFU_USER_ID = "" + + // 聊天室消息管理员ID + CHAT_ROOM_MANAGER_USER_ID = "34cc7185d0b60eacf38f616b8aad8c51" + + // 系统通知 用户ID + SYSTEM_NOTICE_USER_ID = "x94b992dbb4e4dfca9c971200d797a02" + + // 官方公告 + GUANFANG_GONGGAO_USER_ID = "xe0abc0405216b57d788453278e9a212" + + // 数据同步 用户ID + SYNC_DATA_USER_ID = "xcee02f852184c37b1656ada378b0678" + + // 订单助手 用户ID + ORDER_HELPER_USER_ID = "xcee02d852184c37b1656ada378b0789" + + // 派单中心 用户ID + DISPATCH_ORDER_CENTER_USER_ID = "x83b992dbb4e4dfca9c971200d797a86" + + // 动态互动消息管理员ID + TIMELINE_HUDONG_USER_ID = "xa3cc7185d0b60908d38f616b8aad8c8" + + //========== 交易业务类型 ===================== + + // 账户资金 出 + BIZ_ACTION_TYPE_OUT = "2" + + // 账户资金 入 + BIZ_ACTION_TYPE_IN = "1" + + BIZ_TYPE_N_COIN_IN_ORDER_RECHARGE = "102" + BIZ_TYPE_ORDER_IN_ORDER_RECHARGE = "1011" + + BIZ_TYPE_SIGN = "213" + + //后台添加经验 + BIZ_TYPE_ADMIN_OPERATION_ADD = "217" + //########################################################################################## + + // 这部分属于钻石入帐相关的业务类型定义 + + //#####################################start##################################################### + + // 充值钻石 + BIZ_TYPE_DIAMOND_IN_ORDER_RECHARGE = "101" + + BIZ_TYPE_DIAMOND_IN_AGENT_TRANSFER = "1071" + // pc端导入 + BIZ_TYPE_DIAMOND_IN_MOVE_IN = "131" + // 米多多系统同步 + BIZ_TYPE_DIAMOND_IN_MDD_MOVE_IN = "132" + // 收益兑换钻石 + BIZ_TYPE_DIAMOND_IN_REVENUE_EXCHANGE = "102" + // 运营赠送钻石 + BIZ_TYPE_DIAMOND_IN_OPERATION_ADD = "105" + // 邀请好友增加钻石 + BIZ_TYPE_DIAMOND_IN_INVITE_USER = "107" + // 订单退款 + BIZ_TYPE_DIAMOND_IN_SKILL_ORDER_REFUND = "108" + // 考试订单免单 + BIZ_TYPE_DIAMOND_IN_EAXM_ORDER_REFUND = "111" + // 抢红包 + BIZ_TYPE_DIAMOND_IN_RED_ENVELOPE_GET = "107" + // 订单退回(提前结束订单等) + BIZ_TYPE_DIAMOND_IN_ORDER_REFUND = "109" + // 红包退回 + BIZ_TYPE_DIAMOND_IN_RED_ENVELOPE_OVERDUE = "110" + //抢红包 + BIZ_TYPE_DIAMOND_IN_RED_ENVELOPE_GIVE = "140" + //########################################end#################################################### + + // 这部分属于钻石出帐相关的业务类型定义 + + //########################################start################################################## + + // 聊天室打赏消费 消费钻石 + BIZ_TYPE_DIAMOND_OUT_CHATROOM_DASHANG = "201" + + // 表情消费 + BIZ_TYPE_DIAMOND_OUT_CHATROOM_BUY_EMOJI = "204" + + // 购买守护位 + BIZ_TYPE_DIAMOND_OUT_BUY_GUARD_SEAT = "205" + + // 消耗钻石 + BIZ_TYPE_DIAMOND_OUT_FIND_TREASURE = "206" + + // 消耗钻石 + BIZ_TYPE_DIAMOND_OUT_HIT_EGG = "207" + + // 支付订单 + BIZ_TYPE_DIAMOND_OUT_PAY_SKILL_ORDER = "208" + + // 购买头饰并开盒子 + BIZ_TYPE_DIAMOND_OUT_BUY_AVATAR_DECORATION_FOR_OPEN_BOX = "209" + + // 聊天室赠送活动物品 消费钻石 + BIZ_TYPE_DIAMOND_OUT_CHATROOM_PRESENT_ACTIVITY = "210" + + // 支付考试订单 + BIZ_TYPE_DIAMOND_OUT_PAY_EXAM_ORDER = "211" + + // 商城下单 + BIZ_TYPE_DIAMOND_OUT_MALL_ORDER = "212" + + // 修改昵称 + BIZ_TYPE_DIAMOND_OUT_EDIT_NICKNAME = "214" + + // 发红包 + BIZ_TYPE_DIAMOND_OUT_RED_ENVELOPE_GIVE = "215" + + // 运营扣除钻石 + BIZ_TYPE_DIAMOND_OUT_OPERATION_REDUCE = "216" + + //充值单退款扣猫粮 + BIZ_TYPE_DIAMOND_OUT_RECHANGE_REFUND = "217" + + // 动态打赏 钻石打赏 出 + BIZ_TYPE_DIAMOND_OUT_TIMELINE = "318" + + BIZ_TYPE_DIAMOND_OUT_IM = "320" + + BIZ_TYPE_DIAMOND_OUT_USER_HOME = "324" + + //########################################end################################################## + + // 这部分属于猫粮入帐相关的业务类型定义 + + //########################################start################################################ + // 收到聊天室打赏 得到魅力值 + BIZ_TYPE_CHARM_IN_RECEIVE_CHATROOM_GIFT = "101" + + // 收到聊天室打赏 守护收益 + BIZ_TYPE_CHARM_IN_RECEIVE_GUARD_REVENUE = "103" + + // 订单完成 收到收益 + BIZ_TYPE_CHARM_IN_FINISH_SKILL_ORDER_REVENUE = "104" + + // 回退提现收益 + BIZ_TYPE_CHARM_IN_WITHDRAW_RETURN = "105" + + // 回退提现收益 + BIZ_TYPE_CHARM_IN_WITHDRAW_TIMELY_RETURN = "1051" + + // 运营赠送 + BIZ_TYPE_CHARM_IN_OPERATION_GIVE = "106" + + // 后台付款单 + BIZ_TYPE_CHARM_IN_PAYMENTAPPLY = "107" + + // PC端导入 + BIZ_TYPE_CHARM_IN_MOVE_IN = "130" + + // 米多多转入 + BIZ_TYPE_CHARM_IN_TRANSFER_IN = "132" + + // 动态打赏 钻石打赏 入 + BIZ_TYPE_CHARM_IN_TIMELINE = "322" + BIZ_TYPE_CHARM_IN_IM = "323" + BIZ_TYPE_CHARM_IN_USER_HOME = "326" + + //########################################end################################################## + + // 这部分属于猫粮出帐相关的业务类型定义 + + //########################################start################################################ + // 魅力值提现 + BIZ_TYPE_CHARM_OUT_WITHDRAW_CHARM = "201" + + BIZ_TYPE_CHARM_OUT_WITHDRAW_CHARM_TIMELY = "2011" + // 兑换钻石 + BIZ_TYPE_CHARM_OUT_EXCHANGE_DIAMOND = "202" + + // 运营扣除 + BIZ_TYPE_CHARM_OUT_OPERATION_REDUCE = "203" + + //订单退款扣除 + BIZ_TYPE_CHARM_OUT_ORDER_REFUND_REDUCE = "204" + + BIZ_TYPE_CHARM_OUT_EXAM_ORDER_REFUND_REDUCE = "204" + + //########################################end################################################## + + // 回退提现N币 + BizTypeCharmInWithdrawReturn = "1051" + + // 聊天室礼物盒 增加库存 砸蛋 + BIZ_TYPE_GIFT_IN_HIT_EGG = "101" + + // 聊天室礼物盒 增加库存 兑换 + BIZ_TYPE_GIFT_IN_EXCHANGE = "102" + + // 活动获取 + BIZ_TYPE_GIFT_IN_ACTIVITY = "103" + + // 聊天室礼物盒 扣减库存 聊天室打赏 + BIZ_TYPE_GIFT_OUT_CHATROOM_DASHANG = "201" + + // 动态打赏 钻石打赏 出 + BIZ_TYPE_GIFT_OUT_TIMELINE = "319" + BIZ_TYPE_GIFT_OUT_IM = "321" + BIZ_TYPE_GIFT_OUT_USER_HOME = "325" + + PRESENT_TYPE_TIMELINE = "TIMELINE" // 动态打赏 + PRESENT_TYPE_IM = "IM" // 消息打赏 + PRESENT_TYPE_USER_HOME = "USER_HOME" // 主页打赏 + + //=============道具业务类型========== + // vip升级获得 + STOCK_BIZ_TYPE_IN_BY_VIP_UPDATE = "10" + // 购买获得 + STOCK_BIZ_TYPE_IN_BY_BUY = "11" + // 获赠 + STOCK_BIZ_TYPE_IN_BY_RECEIVED = "12" + // 打赏获得 + STOCK_BIZ_TYPE_IN_BY_DASHANG = "13" + // 取消使用 + STOCK_BIZ_TYPE_IN_BY_CANCEL_USE = "14" + // 抽奖获得 + STOCK_BIZ_TYPE_IN_BY_CHOUJIANG = "15" + // 兑换获得 + STOCK_BIZ_TYPE_IN_BY_EXCHANGE = "16" + // 收到礼物获得 + STOCK_BIZ_TYPE_IN_BY_RECEIVE_GIFT = "17" + // 活动获得 + STOCK_BIZ_TYPE_IN_BY_ACTIVITY = "18" + // 积分兑换获得 + STOCK_BIZ_TYPE_IN_BY_POINTS_BUY = "19" + // 签到获得 + STOCK_BIZ_TYPE_IN_BY_SIGN = "20" + // 后台发放 + STOCK_BIZ_TYPE_IN_BY_OPERATION = "21" + + // 赠送 + STOCK_BIZ_TYPE_OUT_BY_GIVE = "21" + // 使用 + STOCK_BIZ_TYPE_OUT_BY_USE = "22" + // 使用 + STOCK_BIZ_TYPE_OUT_BY_LUCKBOX = "25" + // 丢弃 + STOCK_BIZ_TYPE_OUT_BY_DISCARD = "23" + + // 赠送 + STOCK_BIZ_TYPE_OUT_BY_EXCHANGE = "24" + + // 商品类型 头饰 + GOODS_TYPE_AVATAR_DECORATION = "TS" + // 商品类型 座驾 + GOODS_TYPE_ZUOJIA = "ZJ" + // 商品类型 进入场景 + GOODS_TYPE_ENTER_ROOM_SCENE = "ERS" + + // 商品类型 房间聊天气泡 + GOODS_TYPE_ENTER_ROOM_CHAT_MESSAGE_BG = "RCMB" + + // 商品类型 道具 + GOODS_TYPE_DAOJU = "DJ" + + // 穿上 + GOODS_USE_ACTION_TYPE_WARE = "1" + + // 卸下 + GOODS_USE_ACTION_TYPE_TAKE_OFF = "2" + + // 丢弃 + GOODS_USE_ACTION_TYPE_DISCARD = "3" + + // 进入聊天室的消息数据类型 进入房间 + CHATROOM_MESSAGE_DATA_TYPE_COME_IN = "1" + + // 进入聊天室的消息数据类型 离开房间 + CHATROOM_MESSAGE_DATA_TYPE_LEAVE = "2" + + // 清除房间魅力值操作类型-清除全部 + CLEAR_CHATROOM_CHARM_TYPE_ALL = "1" + + // 清除房间魅力值操作类型-清除某个人 + CLEAR_CHATROOM_CHARM_TYPE_ONE_USER = "2" + + // 是否记录魅力值 + CHATROOM_IS_RECORD_CHARM_YES = "1" + + //========== 系统通知的消息类型 ==================== + + //========= 点对点消息类型 =============== + // 系统通知 + P2P_MESSAGES_TYPE_SYSTEM_NOTICE = "104" + + // 官方公告 + P2P_MESSAGES_TYPE_GUANFANG_GONGGAO = "105" + + // 订单助手 + P2P_MESSAGES_TYPE_OEDER_HELPER = "106" + + // 派单中心 + P2P_MESSAGES_TYPE_DISPATCH_ORDER = "107" + + // 互动消息 + P2P_MESSAGES_TYPE_TIMELINE_HUDONG = "108" + + // 关系变化给被操作人发的消息 + P2P_MESSAGES_TYPE_RALATION_CHANGED = "600" + + // 数据同步的自定义消息 + P2P_MESSAGES_TYPE_DATA_SYNC = "608" + + // P2P消息显示格式 1=对话模式 + P2P_MESSAGE_VIEW_TYPE_CHAT = "1" + + // P2P消息显示格式 2=hint + P2P_MESSAGE_VIEW_TYPE_HINT = "2" + + // ========== 通知客户端同步数据的数据类型 ============ + // 刷新余额(余额变化等通知客户端) + SYNC_DATA_TYPE_USER_BALANCE = "sync_balance" + + // 刷新VIP (VIP升级后通知客户端) + SYNC_DATA_TYPE_VIP_UPDATED = "vip_updated" + + // 进入房间 调度某人进入房间 + SYNC_DATA_TYPE_ENTER_ROOM = "enter_room" + + // 用户信息更新 + SYNC_DATA_TYPE_USER_UPDATE = "user_info_update" + + // 派单 收到新的派单 + SYNC_DATA_TYPE_NEW_DISPATH_ORDER = "new_dispatch_order" + + // 派单 有人接单 + SYNC_DATA_TYPE_DISPATH_TAKE = "dispatch_order_take" + + // 派单 有人取消接单 + SYNC_DATA_TYPE_DISPATH_TAKE_CANCEL = "dispatch_order_take_cancel" + + // 派单 状态改变 + SYNC_DATA_TYPE_DISPATH_STATE_CHANGE = "dispatch_order_state_change" + + // 派单 人数增加 + SYNC_DATA_TYPE_DISPATH_USER_CNT_ADD = "dispatch_order_user_cnt_add" + + // 礼物 收到打赏 + SYNC_DATA_TYPE_GIFT_RECEIVE_REWARD = "gift_receive_reward" + + //=========== 聊天室自定义消息类型 ==================== + + // 聊天室有随机结果的表情消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_EMOJI = "316" + + // 离开聊天室消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_LEAVE_ROOM = "301" + + // 关闭聊天室消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_CLOSE_ROOM = "302" + + // 聊天室打赏消息 普通打赏 + CHATROOM_CUSTOME_MESSAGE_TYPE_PRESENT_GIFT_NORMAL = "303" + + // 聊天室打赏活动物品消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_PRESENT_ACTIVITY_MSG = "380" + + // 聊天室 全服通知动效 + CHATROOM_CUSTOME_MESSAGE_TYPE_FULL_SCREEN_NOTICE_MSG = "381" + + // 聊天室打赏消息 交友打赏 + CHATROOM_CUSTOME_MESSAGE_TYPE_PRESENT_GIFT_JIAOYOU = "309" + + // 聊天室打赏消息 批量打赏 + CHATROOM_CUSTOME_MESSAGE_TYPE_PRESENT_GIFT_BATCH = "411" + + // 聊天室踢人消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_KICK_OUT_USER = "407" + + // 聊天室系统消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_SYSTEM_MSG = "412" + + // 聊天室贡献榜首变化 + CHATROOM_CUSTOME_MESSAGE_TYPE_CHANGE_TOP_CONSUME = "403" + + // 聊天室周榜前三发生了变化 + CHATROOM_CUSTOME_MESSAGE_TYPE_CHANGE_WEEKLY_TOP_USERS = "409" + + // 聊天室全服打赏消息 飞机 + CHATROOM_CUSTOME_MESSAGE_TYPE_FULL_SERVICE = "405" + + // 聊天室设置管理消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_SET_ADMIN = "501" + + // 购买守护位成功 + CHATROOM_USER_BUY_GUARD_SEAT_SUCCESS = "317" + + // 守护用户进入电台房间 + CHATROOM_GUARD_USER_ENTER_AUDIO_ROOM = "318" + + // 守护用户离开电台房间 + CHATROOM_GUARD_USER_LEAVE_AUDIO_ROOM = "318" + + // 房间热度更新 + CHATROOM_HOT_UPDATED = "338" + + // 礼物更新 通知房间 + CHATROOM_UPDATED_GIFT_DATA = "630" + + // 房间解锁 上锁 + CHATROOM_LOCK_STATUS_UPDATE = "631" + + // 进入和离开聊天室消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_COMEIN_OR_LEAVE = "633" + + // 聊天室更改上麦方式消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_UPDATE_UP_SEAT_TYPE = "634" + + // 聊天室清除魅力的消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_CLEAR_CHARM = "635" + + // 聊天室红包 + CHATROOM_CUSTOME_MESSAGE_TYPE_RED_ENVELOP = "636" + + // 聊天室更改麦序到计时 + CHATROOM_CUSTOME_MESSAGE_TYPE_UPDATE_SEAT_COUNT_DOWN = "637" + + // 聊天室派单的消息 + CHATROOM_CUSTOME_MESSAGE_TYPE_DISPATCH_ORDER = "413" + + // 设置房间背景通知 + CHATROOM_CUSTOME_MESSAGE_TYPE_SET_ROOM_BACKGROUND = "415" + + // 设置房间背景通知 + CHATROOM_CUSTOME_MESSAGE_TYPE_UPDATE_CHAT_MSG_BACKGROUND = "431" + + // 聊天室礼物飘飞 + CHATROOM_CUSTOME_MESSAGE_TYPE_GIFT_FLY = "433" + + // 更新头饰给房间发信息 + CHATROOM_CUSTOME_MESSAGE_TYPE_UPDATE_USER_AVATAR_DECORATION = "321" + + //==========================聊天室命令============================= + + // 强制同步 + ROOM_CMD_CODE_REFRESH_ROOM = "0X" + + // 离开房间 + ROOM_CMD_CODE_LEAVE_ROOM = "00" + + // 向主持人申请上麦 + ROOM_CMD_CODE_APPLY_UP_SEAT = "01" + + // 取消排麦 + ROOM_CMD_CODE_CANCEL_APPLY_UP_SEAT = "02" + + // 主持人同意上麦 + ROOM_CMD_CODE_HOST_ACCEPT_UP_SEAT = "03" + ROOM_CMD_CODE_ADMIN_UP_SEAT = "103" // 管理员开麦 + ROOM_CMD_CODE_FREE_UP_SEAT = "104" // 自由模式开麦 + ROOM_CMD_CODE_UP_DOWN_SEAT = "105" // 上下麦切换 + + // 主持人拒绝上麦 + ROOM_CMD_CODE_HOST_REJECT_UP_SEAT = "04" + ROOM_CMD_CODE_ADMIN_DOWN_SEAT = "106" // 管理员闭麦 + ROOM_CMD_CODE_FREE_DOWN_SEAT = "107" // 自由模式闭麦 + + // 主持人设置座位静音 + ROOM_CMD_CODE_HOST_MUTE_SEAT = "05" + + // 主持人取消座位静音 + ROOM_CMD_CODE_HOST_CANCEL_MUTE_SEAT = "06" + + // 主持人抱用户上麦 + ROOM_CMD_CODE_HOST_SET_UP_SEAT = "07" + + // 主持人抱用户下麦 + ROOM_CMD_CODE_HOST_SET_DOWN_SEAT = "08" + + // 用户下麦 + ROOM_CMD_CODE_USER_SET_DOWN_SEAT = "09" + + // 主持人锁定座位 + ROOM_CMD_CODE_HOST_LOCK_SEAT = "10" + + // 主持人解锁座位 + ROOM_CMD_CODE_HOST_UNLOCK_SEAT = "11" + + // 房主用新人替换座位上的人 + ROOM_CMD_CODE_OWNER_REPLACE_SEAT_USER = "12" + + // 房主或主持上主持位 + ROOM_CMD_CODE_UP_HOST_SEAT = "13" + + // 房主或主持人下主持位 + ROOM_CMD_CODE_DOWN_HOST_SEAT = "14" + + // 禁言 + ROOM_CMD_CODE_CLOSE_USER_SAY = "16" + + // 取消禁言 + ROOM_CMD_CODE_OPEN_USER_SAY = "17" + + // 交友准备阶段 + ROOM_CMD_CODE_SECTION_FRIEND_PREPARE = "18" + + // 交友进入心动选择阶段 + ROOM_CMD_CODE_SECTION_FRIEND_SELECT = "19" + + // 交友选择心动 + ROOM_CMD_CODE_FRIEND_SELECT_LOVE = "20" + + // 交友取消选择心动 + ROOM_CMD_CODE_FRIEND_CANCEL_LOVE = "21" + + // 交友公布阶段 + ROOM_CMD_CODE_SECTION_FRIEND_PUBLISH_RESULT = "22" + + // 设置房间模板 + ROOM_CMD_CODE_SET_ROOM_TEMPLATE = "23" + + // 公布交友结果 + ROOM_CMD_CODE_PUBLISH_FRIEND_LOVE = "24" + + // 清空排队列表 + ROOM_CMD_CODE_CLEAR_WAIT_LIST = "25" + + // 开始倒计时 + ROOM_CMD_CODE_BEGIN_COUNTDOWN = "27" + + // 用户打开麦克风 + ROOM_CMD_CODE_OPEN_MIC = "101" + + // 用户关闭麦克风 + ROOM_CMD_CODE_CLOSE_MIC = "102" + + // 设置房间禁麦 /开麦 + ROOM_CMD_CODE_ALLOW_QUEUE = "110" + + // 交友房间的阶段 准备阶段 + ROOM_SECTION_PREPARE = "0" + + // 交友房间的阶段 选择阶段 + ROOM_SECTION_SELECTION = "1" + + // 交友房间的阶段 公布阶段 + ROOM_SECTION_PUBLISH = "2" + + // 交友模板 阶段Field值 + FRIEND_ROOM_GAME_DATA_FIELD_SECTION = "section" + + // 交友模板 开始时间Field值 + FRIEND_ROOM_GAME_DATA_FIELD_STARTTIME = "startTime" + + // 消息聊天室的状态 打开 + MESSAGE_ROOM_STAT_OPEN = "true" + + // 消息聊天室状态 关闭 + MESSAGE_ROOM_STAT_CLOSE = "false" + + // 娱乐厅ID 不参与热门排名 + GAME_CHATROOM_ID_LIST = "" + + // 房间Tab类型 1= 运营厅 + ROOM_TAB_TYPE_OPERATION = "1" + + // 房间Tab类型 2= 个人房 + ROOM_TAB_TYPE_PERSONAL = "2" + + // 用户头像 + SELLER_SAMPLE_AVATAR_IMG = "https://ddphoto.youkeya.cnssets/img/seller_sample_avatar_2.png" + + // 麦上用户列表 + SET_ONLINE_SEAT_USER = "SET_ONLINE_SEAT_USER" + + // ONLINE user count 在线用户数量 + STR_ONLINE_USER_COUNT = "STR_ONLINE_USER_COUNT" + + //API版本号 + API_NUM_VERSION_1_0_0 = 13 // 1.0.0 + API_NUM_VERSION_2_0_0 = 14 // 2_0_0 + + // APP首页顶部 + BANNER_POSITION_APP_HOME_TOP = "app_home_top" + + // 动态相关 + TIMELINE_CONTENT_TYPE_IMG = "1" // 图片动态 + TIMELINE_CONTENT_TYPE_VIDEO = "2" // 视频动态 + TIMELINE_VIDEO_M3U8_NAME = "-ddv.m3u8" // 视频流后缀 + + // 房间榜一特效ID + ROOM_TOP_ONE_SCENE_ID = "1" + + // 商品计量类型 + GOODS_MEASUREMENT_EXPIRE = "EXPIRE" // 有效期类型 头饰 座驾 进场特效等 + GOODS_MEASUREMENT_DELAY = "DELAY" // 有效期类型 权益卡 + GOODS_MEASUREMENT_QUANTITY = "QUANTITY" // 有效期类型 数量 萌宠等道具 + + // 积分进出 + POINTS_ACTION_TYPE_OUT = "OUT" // 积分进出 出 + POINTS_ACTION_TYPE_IN = "IN" // 积分进出 进 + + // 积分业务类型 + POINTS_BIZ_TYPE_ID_IN_DIAMOND_BUY_PRESENT = "1001" // 商城消费送积分 + POINTS_BIZ_TYPE_ID_IN_SIGN = "1002" // 签到送积分 + POINTS_BIZ_TYPE_ID_OUT_BUY_GOODS = "2001" // 购买商品 + + // 商城订单类型 + MALL_ORDER_TYPE_DIAMOND = "1" // 钻石订单 + MALL_ORDER_TYPE_POINTS = "2" // 积分订单 + + // 隐私数据雷霆 + PRIVACY_DATA_TYPE_HIDDEN_ROOM_IN_PERSON_PAGE = "RoomInUserPageHidden" // 主页隐藏聊天室 + PRIVACY_DATA_TYPE_ENTER_ROOM_HIDDEN = "EnterRoomHidden" // 隐身进厅 + PRIVACY_DATA_TYPE_ROOM_RANK_HIDDEN = "RoomRankHidden" // 房间榜单隐身 + PRIVACY_DATA_TYPE_IM_MSG_STATE_HIDDEN = "ImMsgStateHidden" // 房间榜单隐身 + PRIVACY_DATA_TYPE_VISIT_HIDDEN = "VisitHidden" // 隐藏足迹 + + // 贵族等级 + NOBILITY_LEVEL_GUOWANG = 8 // 绯红 + NOBILITY_LEVEL_QIWANG = 7 // 星辰 + NOBILITY_LEVEL_JUWANG = 6 // 瑶光 + NOBILITY_LEVEL_GONGJUE = 5 // 琉恋 + NOBILITY_LEVEL_HOUJUE = 4 // 黑曜 + NOBILITY_LEVEL_BOJUE = 3 // 莹玉 + NOBILITY_LEVEL_ZIJUE = 2 // 鎏金 + NOBILITY_LEVEL_NANJUE = 1 // 白银 + + //iOS审核demo帐号 + IOS_APPROVE_USER_ID = "" + + // 浏览足迹类型 + VISIT_PAGE_TYPE_USER_HOME = "USER_HOME" + VISIT_PAGE_TYPE_USER_SKILL_PAGE = "USER_SKILL" + + // 隐身大佬头像 + HIDDEN_USER_AVATAR_IMG = "https://ddphoto.youkeya.cnssets/img/op_1600003929.png" + + // 免费修改昵称 最大次数 + EDIT_NICKNAME_ALLOW_FREE_COUNT = 3 + + // 修改昵称价格 + EDIT_NICKNAME_PRICE = "299" + + // 道具属性CODE + PROP_CODE_HIDDEN_BL_MSG = "PROP_HIDDEN_BL_MSG" + PROP_CODE_SEQUENCE_GIFT = "PROP_SEQUENCE_GIFT" + + CAP_MAN_TOP_ONE = "assets/img/op_1598426728.png" // 男1 + CAP_MAN_TOP_TWO = "assets/img/op_1598426711.png" // 男2 + CAP_MAN_TOP_THREE = "assets/img/op_1598426695.png" // 男3 + CAP_WOMEN_TOP_ONE = "assets/img/op_1598426675.png" // 女1 + CAP_WOMEN_TOP_TWO = "assets/img/op_1598426656.png" // 女2 + CAP_WOMEN_TOP_THREE = "assets/img/op_1598426631.png" // 女3 + + // vipiconlist icon类型 + ICON_TYPE_VIP = "VIP" + ICON_TYPE_NOBILITY = "NOBILITY" + ICON_TYPE_MEDAL = "MEDAL" + + H5ROOM_API_SECRET = "H5ROOM_API_SECRET" //H5客户端key + INNER_API_SECRET_TRADE = "INNER_API_SECRET_TRADE_kasdhfih" //trade客户端key +) + +const ( + ORDER_FLOW_TYPE_ADMIN = "admin" + ORDER_FLOW_TYPE_USER = "user" + ORDER_FLOW_TYPE_GUILD = "guild" +) + +// 禁止的特殊字符 +var ( + SpecialCharMap map[rune]bool +) + +func init() { + SpecialCharMap = make(map[rune]bool) + //SpecialCharMap[32] = true //空格 + SpecialCharMap[34] = true // 双引号 + //SpecialCharMap[37] = true // 百分号 + SpecialCharMap[39] = true //单引号 + // SpecialCharMap[3164] = true // 人民币符号 + // SpecialCharMap[12644] = true //中文顿号 + SpecialCharMap[12288] = true // 全角空格 +} + +func FullPhotoUrl(path string) string { + if len(path) == 0 { + return "" + } + if strings.Index(path, "http") == 0 { + return path + } + return PHOTO_DOMAIN_URL + path +} + +func Md5ForList(s ...string) string { + sort.Strings(s) + h := md5.New() + h.Write([]byte(strings.Join(s, ""))) + return hex.EncodeToString(h.Sum(nil)) +} + +type SellerOrderStatus = string + +const ( + Accepting SellerOrderStatus = "accepting" + Idle SellerOrderStatus = "idle" +) + +// PaymentApplyType 付款单类型 +type PaymentApplyType = string + +const ( + //PaymentApplyTypeWoodpecker 啄木鸟订单 + PaymentApplyTypeWoodpecker PaymentApplyType = "woodpecker" +) + +// PaymentApplyStatus 付款单状态类型 +type PaymentApplyStatus = string + +const ( + // PaymentApplyStatusInit 待审核 + PaymentApplyStatusInit PaymentApplyStatus = "init" + // PaymentApplyStatusAgree 审核通过 + PaymentApplyStatusAgree PaymentApplyStatus = "agree" + // PaymentApplyStatusRefuse 审核拒绝 + PaymentApplyStatusRefuse PaymentApplyStatus = "refuse" + // PaymentApplyStatusComplete 付款完成 + PaymentApplyStatusComplete PaymentApplyStatus = "complete" +) + +type PaymentApplyPayType = string + +const ( + //PaymentApplyAliPay 支付宝支付 + PaymentApplyAliPay PaymentApplyPayType = "alipay" + //PaymentApplyWechatPay 微信支付 + PaymentApplyWechatPay PaymentApplyPayType = "wechat" + //PaymentApplyBankPay 银行卡支付 + PaymentApplyBankPay PaymentApplyPayType = "bank" +) diff --git a/pkg/common/es/document/user.go b/pkg/common/es/document/user.go new file mode 100644 index 0000000..03b4bf4 --- /dev/null +++ b/pkg/common/es/document/user.go @@ -0,0 +1,94 @@ +package document + +type User struct { + Id string + Mobile string + RegionCode string + NickName string + Salt string + Password string + Status string + Avatar string + Gender string + Birthday string + WxUnionId string + QqOpenId string + MarketChannel string + CreateTime string + IsActive string + ActiveTime string + SignupSource string + SignupDevicePlatform string + SignupDeviceUdid string + IdNo string + IsAuth string + TrueName string + Sign string + ViewFlag string + VideoUrl string + School string + UserNo string + BankName string + BankUserName string + BankBranchName string + BankCardNo string + AuthFailReason string + AlipayAccount string + WellNoIcon string +} + +//字符串: text keyword +//整数 : byte, short, integer, long +//浮点数: float, double +//布尔型: boolean +//日期: date +var UserIndex = map[string]interface{}{ + "settings": map[string]interface{}{"number_of_shards": 5, "number_of_replicas": 1}, + "mappings": map[string]interface{}{ + "properties": map[string]interface{}{ + "ActiveTime": map[string]string{"type": "date", "format": "yyyy-MM-dd HH:mm:ssZ||yyyy-MM-dd HH:mm:ss.SSSZ||yyyy-MM-ddZ||epoch_millis||epoch_second"}, + "AlipayAccount": map[string]string{"type": "keyword"}, + "AuthFailReason": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "Avatar": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "BankBranchName": map[string]string{"type": "keyword"}, + "BankCardNo": map[string]string{"type": "keyword"}, + "BankName": map[string]string{"type": "text"}, + "BankUserName": map[string]string{"type": "text"}, + "Birthday": map[string]string{"type": "date", "format": "yyyy-MM-dd HH:mm:ssZ||yyyy-MM-dd HH:mm:ss.SSSZ||yyyy-MM-ddZ||epoch_millis||epoch_second"}, + "CreateTime": map[string]string{"type": "date", "format": "yyyy-MM-dd HH:mm:ssZ||yyyy-MM-dd HH:mm:ss.SSSZ||yyyy-MM-ddZ||epoch_millis||epoch_second"}, + "Gender": map[string]string{"type": "keyword"}, + "Id": map[string]string{"type": "keyword"}, + "IdNo": map[string]string{"type": "keyword"}, + "IsActive": map[string]string{"type": "keyword"}, + "IsAuth": map[string]string{"type": "keyword"}, + "MarketChannel": map[string]string{"type": "keyword"}, + "Mobile": map[string]string{"type": "keyword"}, + "NickName": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "QqOpenId": map[string]string{"type": "keyword"}, + "RegionCode": map[string]string{"type": "keyword"}, + "Salt": map[string]string{"type": "keyword"}, + "School": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "Sign": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "SignupDevicePlatform": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "SignupDeviceUdid": map[string]string{"type": "keyword"}, + "SignupSource": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "Status": map[string]string{"type": "keyword"}, + "TrueName": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "UserNo": map[string]string{"type": "keyword"}, + "VideoUrl": map[string]string{"type": "text", "analyzer": "ik_max_word"}, + "ViewFlag": map[string]string{"type": "keyword"}, + "WellNoIcon": map[string]string{"type": "keyword"}, + "WxUnionId": map[string]string{"type": "keyword"}, + }, + }, +} + +var MessageIndex = map[string]interface{}{ + "settings": map[string]interface{}{"number_of_shards": 5, "number_of_replicas": 1}, + "mappings": map[string]interface{}{ + "properties": map[string]interface{}{ + "id": map[string]string{"type": "keyword"}, + "curTime": map[string]string{"type": "date", "format": "yyyy-MM-dd HH:mm:ssZ||yyyy-MM-dd HH:mm:ss.SSSZ||yyyy-MM-ddZ||epoch_millis||epoch_second"}, + }, + }, +} diff --git a/pkg/common/es/es_client.go b/pkg/common/es/es_client.go new file mode 100644 index 0000000..20bdb03 --- /dev/null +++ b/pkg/common/es/es_client.go @@ -0,0 +1,261 @@ +package ess + +import ( + "servicebase/pkg/common/es/document" + "servicebase/pkg/common/messages" + "context" + "encoding/json" + "reflect" + "time" + + "github.com/anxpp/beego/logs" + "github.com/olivere/elastic/v7" + "github.com/spf13/viper" +) + +var client *elastic.Client + +type EsClient struct { +} + +func Init() { + index := messages.TagIndex(string(messages.EventTagUser)) + client = _connect() + exists, e := client.IndexExists(index).Do(context.Background()) + if e != nil { + logs.Error("IndexExists ", index, " error: ", e.Error()) + return + } + if !exists { + logs.Info("es user not exist") + createIndex, e := client.CreateIndex(index).BodyJson(document.UserIndex).Do(context.Background()) + if e != nil { + logs.Error("IndexCreate ", index, " error: ", e.Error()) + return + } + if !createIndex.Acknowledged { + } + } + indexMessage := messages.TagIndex(string(messages.EventTagMessage)) + existsMessage, e := client.IndexExists(indexMessage).Do(context.Background()) + if e != nil { + logs.Error("IndexExists indexMessage", index, " error: ", e.Error()) + return + } + if !existsMessage { + logs.Info("es indexMessage not exist") + createIndex, e := client.CreateIndex(indexMessage).BodyJson(document.MessageIndex).Do(context.Background()) + if e != nil { + logs.Error("IndexCreate ", indexMessage, " error: ", e.Error()) + return + } + if !createIndex.Acknowledged { + } + } + logs.Info("init elasticsearch finish") +} + +func _connect() (c *elastic.Client) { + c, e := elastic.NewSimpleClient( + elastic.SetHealthcheck(true), + elastic.SetHealthcheckInterval(10*time.Second), + elastic.SetURL(viper.GetString("es.default.addr")), + // elastic.SetBasicAuth(beego.AppConfig.String("es_username"), beego.AppConfig.String("es_password")), + ) + if e != nil { + logs.Error("NewClient_error: ", e.Error()) + } + return c +} + +// 创建记录 +func (*EsClient) Create(index, id string, model interface{}) (body string, success bool, msg string) { + client := _connect() + _, e := client.Index().Index(index).Id(id).BodyJson(model).Do(context.Background()) + if e != nil { + success = false + msg = e.Error() + b, _ := json.Marshal(model) + logs.Error("Document Create Error: ", e.Error(), " document: ", string(b), index, id) + return + } + success = true + return +} + +// 判断存在 +func (*EsClient) Exists(index, id string) (exists, success bool, msg string, e error) { + client := _connect() + exists, e = client.Exists().Index(index).Type("_doc").Id(id).Do(context.Background()) + if e != nil { + success = false + msg = e.Error() + logs.Error("Id Exists Error: ", e.Error(), " id: ", id) + return + } + success = true + return +} + +// 更新记录 +func (*EsClient) Update(index, id string, model interface{}) (body string, success bool, msg string) { + client := _connect() + _, e := client.Update().Index(index).Id(id).Doc(model).Do(context.Background()) + if e != nil { + success = false + msg = e.Error() + return + } + success = true + return +} + +// 搜索 +func (*EsClient) Search(index string, key string, fields ...string) (body []interface{}, success bool, msg string) { + client := _connect() + logs.Info("ES Search index =", index, " key =", key, " fields =", fields) + var list []*elastic.WildcardQuery + for _, field := range fields { + list = append(list, elastic.NewWildcardQuery(field, key)) + } + s := client.Search().Index(index) + for _, query := range list { + s = s.Query(query) + } + res, e := s.From(0).Size(20).Pretty(true).Do(context.Background()) + if e != nil { + success = false + msg = e.Error() + return + } + logs.Info(res.Status) + logs.Info(res.Hits.TotalHits) + var item document.User + for _, item := range res.Each(reflect.TypeOf(item)) { + if t, ok := item.(document.User); ok { + body = append(body, t) + } + } + //if res.Hits.TotalHits.Value > 0 { + // for _, hit := range res.Hits.Hits { + // var t document.User + // _ := json.Unmarshal(hit.Source, &t) + // body = append(body, t) + // } + //} + return +} + +type ESFilter struct { + Queries []ESQuery + BoolMustInShouldQueries [][]ESQuery + Sort ESSort +} + +type ESQuery struct { + Key string + Value string + Type string +} + +type ESSort struct { + Field string + Ascending bool +} + +// 搜索消息 +func (*EsClient) SearchMulti(index string, filter ESFilter, page, size int) (result interface{}, success bool, msg string) { + client := _connect() + var list []elastic.Query + for _, item := range filter.Queries { + switch item.Type { + case "match": + list = append(list, elastic.NewMatchQuery(item.Key, item.Value)) + case "multi_match": + list = append(list, elastic.NewMultiMatchQuery(item.Value).Type("best_fields").Lenient(true)) + case "range_gte": + list = append(list, elastic.NewRangeQuery(item.Key).Gte(item.Value)) + case "range_lte": + list = append(list, elastic.NewRangeQuery(item.Key).Lte(item.Value)) + } + } + if len(filter.BoolMustInShouldQueries) > 0 { + BQ := elastic.NewBoolQuery() + var bqList []elastic.Query + for _, bq := range filter.BoolMustInShouldQueries { + var listBq []elastic.Query + boolQuery := elastic.NewBoolQuery() + for _, item := range bq { + switch item.Type { + case "match": + listBq = append(listBq, elastic.NewMatchQuery(item.Key, item.Value)) + case "multi_match": + listBq = append(listBq, elastic.NewMultiMatchQuery(item.Value).Type("best_fields").Lenient(true)) + case "range_gte": + listBq = append(listBq, elastic.NewRangeQuery(item.Key).Gte(item.Value)) + case "range_lte": + listBq = append(listBq, elastic.NewRangeQuery(item.Key).Lte(item.Value)) + } + } + boolQuery.Must(listBq...) + bqList = append(bqList, boolQuery) + } + BQ.Should(bqList...) + list = append(list, BQ) + } + query := elastic.NewBoolQuery().Filter(list...) + //logs.Info(len(list)) + //a1, _ := query.Source() + //a2, _ := json.MarshalIndent(a1, "", " ") + //logs.Info(string(a2)) + s := client.Search().Index(index).Query(query) + if len(filter.Sort.Field) > 0 { + s = s.Sort(filter.Sort.Field, filter.Sort.Ascending) + } + res, e := s.From(page * size).Size(size).Pretty(false).Do(context.Background()) + if e != nil { + return + } + var body []interface{} + for _, item := range res.Hits.Hits { + b, _ := item.Source.MarshalJSON() + m := make(map[string]interface{}) + _ = json.Unmarshal(b, &m) + body = append(body, m) + } + result = map[string]interface{}{ + "Status": res.Status, + "Total": res.Hits.TotalHits, + "List": body, + } + return +} + +// 搜索 +func (*EsClient) QueryString(page, size int, index string, key string, fields ...string) (list []document.User, count int64, success bool, msg string) { + client := _connect() + logs.Info("ES QueryString index =", index, " key =", key, " fields =", fields) + query := elastic.NewQueryStringQuery(key) + for _, field := range fields { + query.Field(field) + } + query.AnalyzeWildcard(false) + s := client.Search().Index(index) + s = s.Query(query) + s = s.Sort("_score", false) + res, e := s.From(page * size).Size(size).Pretty(true).Do(context.Background()) + if e != nil { + success = false + msg = e.Error() + return + } + count = res.TotalHits() + var user document.User + for _, item := range res.Each(reflect.TypeOf(user)) { + if t, ok := item.(document.User); ok { + list = append(list, t) + } + } + success = true + return +} diff --git a/pkg/common/es/es_client_test.go b/pkg/common/es/es_client_test.go new file mode 100644 index 0000000..ceb82ff --- /dev/null +++ b/pkg/common/es/es_client_test.go @@ -0,0 +1,81 @@ +package ess + +import ( + "servicebase/pkg/common/messages" + "context" + "testing" + "time" + + "github.com/anxpp/beego/logs" + "github.com/olivere/elastic/v7" + "github.com/spf13/viper" +) + +func TestClient(t *testing.T) { + Init() +} + +func TestClientCreateUser(t *testing.T) { + //for _, item := range models.LogUserRegisterAll() { + // cli := EsClient{} + // _, success, msg := cli.Create("test_user_register", item.Id, item) + // if !success { + // logs.Error(msg) + // } + //} +} + +func TestClientSearch(t *testing.T) { +} + +func _testConnect() (c *elastic.Client) { + c, e := elastic.NewSimpleClient( + elastic.SetHealthcheck(true), + elastic.SetHealthcheckInterval(10*time.Second), + // elastic.SetURL("http://47.97.157.234:9200"), + elastic.SetURL(viper.GetString("es.default.addr")), + // elastic.SetBasicAuth(beego.AppConfig.String("es_username"), beego.AppConfig.String("es_password")), + ) + if e != nil { + logs.Error("NewClient_error: ", e.Error()) + } + return c +} + +func TestClientNew(t *testing.T) { + var client EsClient + client.Create("es_index_message", "003", map[string]interface{}{ + "id": "003", + "curTime": 1440570500855, + "f1": 1234, + "f2": "22222", + "f3": "22222", + "f4": "22222", + "f5": "22222", + "f6": "2020-08-09 23:37:00", + }) +} + +func TestSearchMessage(t *testing.T) { + index := messages.TagIndex(string(messages.EventTagMessage)) + client := _testConnect() + var list []elastic.Query + list = append(list, elastic.NewWildcardQuery("eventType", "1")) + list = append(list, elastic.NewMatchQuery("msgType", "TEXT")) + s := client.Search().Index(index) + for _, query := range list { + s = s.Query(query) + } + res, e := s.From(0).Size(20).Pretty(true).Do(context.Background()) + if e != nil { + return + } + logs.Info(res.Status) + logs.Info(res.Hits.TotalHits) + logs.Info(len(res.Hits.Hits)) + for i, item := range res.Hits.Hits { + b, _ := item.Source.MarshalJSON() + logs.Info(i, string(b)) + } + time.Sleep(time.Second * 3) +} diff --git a/pkg/common/http/dto/ChatRoomDTO.go b/pkg/common/http/dto/ChatRoomDTO.go new file mode 100644 index 0000000..d940eb7 --- /dev/null +++ b/pkg/common/http/dto/ChatRoomDTO.go @@ -0,0 +1,25 @@ +package dto + +type ChatRoomModelDTO struct { + Id string + OwnerUserId string + RoomNo string + RoomName string + MessageRoomId string + TabId string //分类ID + TemplateId string + CreateTime string + Status string + OpenTime string + RoomPwd string + MaxMemberCount string + IsHot string + RobotCount string + RoomTagIcon string + GuestCanUseEmoji string + SendMessageTimeGap string //发送消息间隔 + UpSeatType string //1=排麦 2=自由麦 + AudioQualityLevel string //音质等级 1=正常 2=高音质 3=超高音质 + ViewSkewer string //是否显示福签 1=显示 0=不显示 + IsViewHitegg string // 是否显示砸蛋 +} diff --git a/pkg/common/http/dto/RequestDTO.go b/pkg/common/http/dto/RequestDTO.go new file mode 100644 index 0000000..a5df8c7 --- /dev/null +++ b/pkg/common/http/dto/RequestDTO.go @@ -0,0 +1,5 @@ +package dto + +type RequestDTO struct { + Token string +} diff --git a/pkg/common/http/dto/UserDTO.go b/pkg/common/http/dto/UserDTO.go new file mode 100644 index 0000000..5c5ea08 --- /dev/null +++ b/pkg/common/http/dto/UserDTO.go @@ -0,0 +1,17 @@ +package dto + +type UserDTO struct { + UserId string + UserNo string + NickName string + Avatar string + Gender string + BirthDay string + VipLevel string + VipExp string + IsAuth string + Status string + TrueName string + Mobile string + AvatarDecoration string //头饰 +} diff --git a/pkg/common/http/dto/UserInviteSummaryDTO.go b/pkg/common/http/dto/UserInviteSummaryDTO.go new file mode 100644 index 0000000..c128527 --- /dev/null +++ b/pkg/common/http/dto/UserInviteSummaryDTO.go @@ -0,0 +1,7 @@ +package dto + +type UserInviteSummaryDTO struct { + UserId string + InviteDiamond string + InviteUserCount string +} diff --git a/pkg/common/http/response/Activity.go b/pkg/common/http/response/Activity.go new file mode 100644 index 0000000..cd42ba3 --- /dev/null +++ b/pkg/common/http/response/Activity.go @@ -0,0 +1,51 @@ +package response + +import "servicebase/pkg/common/http/dto" + +type CommonResponse struct { + Code string + Result interface{} + Msg string +} + +// 用户信息 +type UserInfoResponse struct { + Code string + Result dto.UserDTO + Msg string +} + +//获取用户邀请汇总数据返回 +type UserInviteSummaryResponse struct { + Code string + Result dto.UserInviteSummaryDTO + Msg string +} + +func Success(data interface{}) (res CommonResponse) { + res.Code = "6000" + res.Result = data + return +} + +func Page(data interface{}, count int64) (res CommonResponse) { + res.Code = "6000" + res.Result = map[string]interface{}{ + "list": data, + "count": count, + } + return +} + +func Failed(msg string) (res CommonResponse) { + res.Code = "8020" + res.Msg = msg + return +} + +func Gen(code, msg string, result interface{}) (res CommonResponse) { + res.Code = code + res.Msg = msg + res.Result = result + return +} diff --git a/pkg/common/messages/active_message.go b/pkg/common/messages/active_message.go new file mode 100644 index 0000000..fcb9abc --- /dev/null +++ b/pkg/common/messages/active_message.go @@ -0,0 +1,12 @@ +package messages + +// 活跃消息 +type Active struct { + MessageId string + UserId string //用户ID + DeviceId string //设备ID + ActiveTime string //活跃的平台 + ActivePlatform string //活跃的平台 + ActiveDeviceModel string //活跃的设备型号 + ActiveIp string //活跃的IP +} diff --git a/pkg/common/messages/error_message.go b/pkg/common/messages/error_message.go new file mode 100644 index 0000000..8a1ac65 --- /dev/null +++ b/pkg/common/messages/error_message.go @@ -0,0 +1,26 @@ +package messages + +// 错误消息(补偿) +type Error struct { + MessageId string + Code string // 错误代码 + Content string // 错误内容(json) + Tag ErrorTag // 消息标签:auto=自动处理 manual=手动处理 auto_to_manual=自动转手动 +} + +type ErrorTag string + +const ( + Auto ErrorTag = "AUTO" + Manual ErrorTag = "MANUAL" + AutoToManual ErrorTag = "AUTO_TO_MANUAL" +) + +type ErrorState string + +const ( + ErrorCreate ErrorState = "CREATED" + ErrorSuccess ErrorState = "SUCCESS" + ErrorFailed ErrorState = "FAILED" + ErrorReSuccess ErrorState = "RE_SUCCESS" +) diff --git a/pkg/common/messages/event_message.go b/pkg/common/messages/event_message.go new file mode 100644 index 0000000..f2af3a1 --- /dev/null +++ b/pkg/common/messages/event_message.go @@ -0,0 +1,49 @@ +package messages + +import ( + "encoding/json" + + "github.com/spf13/viper" +) + +// 事件 +type Event struct { + MessageId string + Tag EventTag // 消息标签:EventTagUser=用户 + Flag EventFlag // 消息标签:EventFlagCreate=创建 EventFlagUpdate=更新 + EventId string // 事件ID + EventContent interface{} // 事件内容 +} + +type EventTag string + +const ( + EventTagUser EventTag = "user" + EventTagRoomInto EventTag = "into_room" + EventTagMessage EventTag = "message" +) + +func TagIndex(key string) string { + switch key { + case string(EventTagUser): + return viper.GetString("es.default.indexUser") + case string(EventTagMessage): + return viper.GetString("es.default.indexMessage") + default: + return "" + } +} + +type EventFlag string + +const ( + EventFlagSave EventFlag = "save" + EventFlagCreate EventFlag = "create" + EventFlagUpdate EventFlag = "update" + EventFlagDelete EventFlag = "delete" +) + +func (message *Event) ToJson() string { + b, _ := json.Marshal(message) + return string(b) +} diff --git a/pkg/common/messages/register_message.go b/pkg/common/messages/register_message.go new file mode 100644 index 0000000..5484c51 --- /dev/null +++ b/pkg/common/messages/register_message.go @@ -0,0 +1,12 @@ +package messages + +// 注册消息 +type Register struct { + MessageId string + UserId string //用户ID + DeviceId string //设备ID + RegisterTime string //注册时间 + ChannelCode string //渠道代码 + Ip string //ip + Platform string //平台 +} diff --git a/pkg/common/messages/transaction_message.go b/pkg/common/messages/transaction_message.go new file mode 100644 index 0000000..3a9a573 --- /dev/null +++ b/pkg/common/messages/transaction_message.go @@ -0,0 +1,98 @@ +package messages + +// 交易消息 +type Transaction struct { + MessageId string + FromUserId string //发起用户ID + FromCurrency TransactionCurrencyEnum //扣款类型 + FromAmount string //扣款数量 + FromPlatform string //扣款所在平台 + ToUserId string //接收用户 + ToCurrency TransactionCurrencyEnum //接收类型 + ToAmount string //接收数量 + TransactionRate string //交易抽成 + TransactionState TransactionStateEnum //交易状态 + TransactionType TransactionTypeEnum //充值、打赏、购买表情、购买守护、兑换、砸蛋、提现、订单等 + TransactionId string //充值ID、打赏ID、购买表情ID、购买守护ID、兑换ID、砸蛋ID、提现ID、订单ID等 + TransactionCreateTime string //交易创建时间 + TransactionCompleteTime string //交易完成时间 + TransactionSubjectId string //充值为产品ID、打赏为房间ID、购买表情为表情ID、购买守护为房间ID、兑换为配置ID、砸蛋为配置ID、提现为配置ID、订单为品类ID + TransactionCode TransactionCodeEnum //充值为充值渠道(支付宝H5、支付宝App、微信、运营赠送等)、打赏为打赏类型(单个、批量)、购买表情为空、购买守护为守护类型、兑换为空、砸蛋为中奖等级、提现为银行名称、订单为空 + TransactionAmount string //交易金额(单位为扣款类型) + TransactionAmountCoupon string //交易优惠金额(单位为扣款类型) + TransactionAmountCouponId string //交易优惠凭证ID + TransactionAmountPay string //交易实际支付金额(单位为扣款类型) + GuildId string //俱乐部ID +} + +// 交易更新消息 +type TransactionUpdate struct { + MessageId string + TransactionState TransactionStateEnum //交易状态 + TransactionId string //充值ID、打赏ID、购买表情ID、购买守护ID、兑换ID、砸蛋ID、提现ID、订单ID等 + TransactionCompleteTime string //交易完成时间 +} + +type TransactionCodeEnum string + +const ( + RewardSimple TransactionCodeEnum = "SIMPLE" //单个打赏 + RewardMulti TransactionCodeEnum = "MULTI" //批量打赏 + RewardBagSimple TransactionCodeEnum = "BAG_SIMPLE" //背包礼物单个打赏 + RewardBagMulti TransactionCodeEnum = "BAG_MULTI" //背包礼物批量打赏 + + GuardLevel01 TransactionCodeEnum = "1" //青铜守护 + GuardLevel02 TransactionCodeEnum = "2" //白银守护 + GuardLevel03 TransactionCodeEnum = "3" //黄金守护 + + Hunting1 TransactionCodeEnum = "1" //单砸 + Hunting10 TransactionCodeEnum = "10" //十砸 + Hunting100 TransactionCodeEnum = "100" //百砸 + + RechargeAppAlipay TransactionCodeEnum = "AppAlipay" //app支付宝 + RechargeAppWeChat TransactionCodeEnum = "AppWeChat" //app微信 + RechargeAppIap TransactionCodeEnum = "AppIap" //appIap + RechargeH5Alipay TransactionCodeEnum = "H5Alipay" //H5支付宝 + RechargeH5WeChatClub TransactionCodeEnum = "H5WeChatClub" //H5微信公众号 + RechargeOperation TransactionCodeEnum = "Operation" //Operation +) + +type TransactionStateEnum string + +const ( + CREATED TransactionStateEnum = "CREATED" //已创建 + SUCCESS TransactionStateEnum = "SUCCESS" //成功 + FAILED TransactionStateEnum = "FAILED" //失败 +) + +type TransactionCurrencyEnum string + +const ( + DIAMOND TransactionCurrencyEnum = "DIAMOND" //钻石 + CRYSTAL TransactionCurrencyEnum = "CRYSTAL" //晶石 + MONEY TransactionCurrencyEnum = "MONEY" //钱 + FRAGMENT TransactionCurrencyEnum = "FRAGMENT" //碎片 +) + +type TransactionTypeEnum string + +const ( + RECHARGE TransactionTypeEnum = "RECHARGE" //充值 + RechargeNCoin TransactionTypeEnum = "RECHARGE_N_COIN" //充值N币 + REWARD TransactionTypeEnum = "REWARD" //打赏 + REWARDNCoin TransactionTypeEnum = "REWARD_N_COIN" //打赏 + GUARD TransactionTypeEnum = "GUARD" //购买守护 + EMOJI TransactionTypeEnum = "EMOJI" //购买表情 + OperationDiamond TransactionTypeEnum = "OPERATION_DIAMOND" //手工加钻石 + OperationCrystal TransactionTypeEnum = "OPERATION_CRYSTAL" //手工加晶石 + OperationCrystalReduce TransactionTypeEnum = "OPERATION_CRYSTAL_REDUCE" //手工扣除晶石 + EXCHANGE TransactionTypeEnum = "EXCHANGE" //兑换 + HUNTING TransactionTypeEnum = "HUNTING" //星空寻宝 + WithdrawNCoin TransactionTypeEnum = "WITHDRAW_N_COIN" //提现 N币 + ORDER TransactionTypeEnum = "ORDER" //订单 + ORDERNCoin TransactionTypeEnum = "ORDER_N_COIN" //订单 + ORDER_H5 TransactionTypeEnum = "ORDER_H5" //订单 + ORDER_H5_NCoin TransactionTypeEnum = "ORDER_H5_N_COIN" //订单 + LUCK_GIFT TransactionTypeEnum = "LUCK_GIFT" //幸运礼物 + LuckGiftNCoin TransactionTypeEnum = "LUCK_GIFT_N_COIN" //幸运礼物 +) diff --git a/pkg/common/netease/ImClient.go b/pkg/common/netease/ImClient.go new file mode 100644 index 0000000..28ed0a7 --- /dev/null +++ b/pkg/common/netease/ImClient.go @@ -0,0 +1,767 @@ +package Netease + +import ( + "context" + "encoding/json" + "fmt" + "servicebase/pkg/common" + "servicebase/pkg/common/HyTools" + yunxin "servicebase/pkg/common/netease/dto" + "servicebase/pkg/htools" + "servicebase/pkg/log" + "strings" + + "github.com/pkg/errors" + "github.com/spf13/cast" + + "math/rand" + "strconv" + "time" + + "github.com/anxpp/beego/logs" + "github.com/spf13/viper" +) + +type ImClient struct { + AppKey string + AppSecret string +} + +type CreateImRes struct { + Code int + Desc string +} + +type BroadcastNotificationReq struct { + FromAccountId string `json:"from_account_id"` + Content string `json:"content"` + TargetOs []string `json:"target_os"` +} + +func NewImClient() *ImClient { + fmt.Printf("NewImClient: %s\n", viper.GetString("netease.im.key")) + key := viper.GetString("netease.im.key") + secret := viper.GetString("netease.im.secret") + return &ImClient{AppKey: key, AppSecret: secret} +} + +// 生成云信header +func (client *ImClient) generateHeader() map[string]string { + nonce := randNumber() + t := time.Now() + currentTime := strconv.FormatInt(t.UTC().Unix(), 10) + result := make(map[string]string) + result["AppKey"] = client.AppKey + result["Nonce"] = nonce + result["CurTime"] = currentTime + result["CheckSum"] = client.generateCheckSum(nonce, currentTime) + result["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8" + return result +} + +func (client *ImClient) generateJsonHeader() map[string]string { + nonce := randNumber() + t := time.Now() + currentTime := strconv.FormatInt(t.UTC().Unix(), 10) + result := make(map[string]string) + result["AppKey"] = client.AppKey + result["Nonce"] = nonce + result["CurTime"] = currentTime + result["CheckSum"] = client.generateCheckSum(nonce, currentTime) + result["Content-Type"] = "application/json" + return result +} + +// 生成云信签名 +func (client *ImClient) generateCheckSum(nonce, currentTime string) string { + waitSignStr := client.AppSecret + nonce + currentTime + result := HyTools.StringToSHA1(waitSignStr) + return result +} + +// 创建云信账户 +// imService.CreateImUser(common.SYNC_DATA_USER_ID,"数据同步",common.PHOTO_DOMAIN_URL+"assets/sys/guanfanggonggao.png") +func (client *ImClient) CreateImUser(userId, nickName, avatar string) error { + url := "https://api.netease.im/nimserver/user/create.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + sb := HyTools.NewStringBuilder() + sb.Append("accid=" + userId) + sb.Append("&") + sb.Append("token=123456") + sb.Append("&") + sb.Append("name=" + nickName) + sb.Append("&") + sb.Append("icon=" + avatar) + res, err := HyTools.HttpDo(httpMethod, url, header, sb.ToString()) + if err != nil { + // {"desc":"already register","code":414} + logs.Info("YunXin_SignUp_Fail_AccID_%s:"+err.Error(), userId) + return err + } else { + // {"code":200,"info":{"token":"123456","accid":"b8af4bebe2064435974ba2340d852055","name":"b8af4bebe2064435974ba2340d852055"}} + var resDTO CreateImRes + json.Unmarshal([]byte(res), &resDTO) + if resDTO.Code != 200 { + logs.Info("YunXin_SignUp_Fail_AccID_%s:"+resDTO.Desc, userId) + } else { + logs.Info("YunXin_SignUp_Success_AccID_%s:"+res, userId) + } + } + var body map[string]interface{} + if errJson := json.Unmarshal([]byte(res), &body); errJson != nil { + return errJson + } + if int(body["code"].(float64)) != 200 { + return errors.New(body["desc"].(string)) + } + return err +} + +// 查询用户信息 +func (client *ImClient) GetImUserInfo(userId string) error { + url := "https://api.netease.im/nimserver/user/getUinfos.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + sb := HyTools.NewStringBuilder() + accids := []string{userId} + byteData, _ := json.Marshal(accids) + sb.Append("accids=" + string(byteData)) + res, err := HyTools.HttpDo(httpMethod, url, header, sb.ToString()) + // #查询云信用户信息结果:{"desc":"b8af4bebe2064435974ba2340d852055not register","code":414}# + // {"code":200,"uinfos":[{"icon":"https://xzphoto.meetalk.tech/upload/6bba4098-6ea8-4758-8193-19abed540c0b.0","accid":"2251bae8a0514e6892f0374f5dd260d4","name":"弦乐","gender":0}]} + logs.Info("#" + "查询云信用户信息结果:" + res + "#") + var body map[string]interface{} + if errJson := json.Unmarshal([]byte(res), &body); errJson != nil { + return errJson + } + if int(body["code"].(float64)) != 200 { + return errors.New(body["desc"].(string)) + } + return err +} + +// 更新云信信息 +func (client *ImClient) UpdateImUserInfo(accid, nickName, avatar string) error { + url := "https://api.netease.im/nimserver/user/updateUinfo.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + sb := htools.NewStringBuilder() + sb.Append("accid=" + accid) + sb.Append("&") + sb.Append("name=" + nickName) + sb.Append("&") + sb.Append("icon=" + avatar) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "云信更新用户信息结果:" + res + common.LOG_QUOTE_STRING) + return err +} + +// 更新云信用户扩展信息 +func (client *ImClient) UpdateImUserExt(accid, ext string) error { + url := "https://api.netease.im/nimserver/user/updateUinfo.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + sb := htools.NewStringBuilder() + sb.Append("accid=" + accid) + sb.Append("&") + sb.Append("ex=" + ext) + logs.Info("update_im_user userID[%s] ext:%s", accid, ext) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING+"云信更新用户ext%s信息结果:"+res+common.LOG_QUOTE_STRING, ext) + return err +} + +// 封禁云信帐号 +func (client *ImClient) BlockImUser(accid string) error { + + url := "https://api.netease.im/nimserver/user/block.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + sb.Append("accid=" + accid) + sb.Append("&") + sb.Append("needkick=true") + + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "封禁云信帐号结果:" + res + common.LOG_QUOTE_STRING) + return err +} + +// 解禁云信帐号 +func (client *ImClient) UnBlockImUser(accid string) error { + + url := "https://api.netease.im/nimserver/user/unblock.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + sb.Append("accid=" + accid) + + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "解禁云信帐号结果:" + res + common.LOG_QUOTE_STRING) + return err +} + +// 创建云信聊天室 +func (client *ImClient) CreateChatroom(ownerUserId string, roomName string) (chatroomModel NeteaseChatroomDTO) { + logs.Info("CreateChatroom ownerUserId=%s roomName=%s", ownerUserId, roomName) + url := "https://api.netease.im/nimserver/chatroom/create.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + sb := htools.NewStringBuilder() + sb.Append("creator=" + ownerUserId) + sb.Append("&") + sb.Append("name=" + roomName) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + if err != nil { + logs.Info(common.LOG_QUOTE_STRING + "云信创建聊天室请求失败:" + err.Error() + common.LOG_QUOTE_STRING) + return + } + // {"valid":true,"ext":"","creator":"1b94b5e7af8a45ed9fda27d28165d4c9","name":"32452345","muted":false,"roomid":11142139973,"queuelevel":0} + logs.Info(common.LOG_QUOTE_STRING + "云信创建聊天室结果:" + res + common.LOG_QUOTE_STRING) + var createRes CreateChatroomResponse + err1 := json.Unmarshal([]byte(res), &createRes) + if err1 != nil { + logs.Info(common.LOG_QUOTE_STRING + "创建聊天室失败,解析结果错误:" + res + common.LOG_QUOTE_STRING) + panic(err1) + } + if createRes.Code != 200 { + + logs.Info(common.LOG_QUOTE_STRING + "创建Im聊天室失败:code= " + strconv.Itoa(createRes.Code) + common.LOG_QUOTE_STRING) + panic(errors.New("创建云信Im聊天室失败")) + } + chatroomModel = createRes.Chatroom + return +} + +// IM发送消息 +func (client *ImClient) SendMsg(parameters map[string]string) error { + url := "https://api.netease.im/nimserver/msg/sendMsg.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + logs.Info(common.LOG_QUOTE_STRING + "云信IM发消息请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "云信IM发消息结果:" + res + common.LOG_QUOTE_STRING) + return err +} + +// 添加机器人 +func (client *ImClient) AddRobot(parameters map[string]string) error { + url := "https://api.netease.im/nimserver/chatroom/addRobot.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + logs.Info(common.LOG_QUOTE_STRING + "添加机器人:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "添加机器人:" + res + common.LOG_QUOTE_STRING) + return err +} + +// 移除机器人 +func (client *ImClient) RemoveRobot(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/chatroom/removeRobot.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + logs.Info(common.LOG_QUOTE_STRING + "移除机器人:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "移除机器人:" + res + common.LOG_QUOTE_STRING) + return err +} + +// 发送聊天室消息 +func (client *ImClient) SendChatroomMsg(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/chatroom/sendMsg.action" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + + logs.Info(common.LOG_QUOTE_STRING + "聊天室发消息请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "聊天室发消息结果:" + res + common.LOG_QUOTE_STRING) + + return err +} + +// 获取在线成员信息 +func (client *ImClient) GetChatroomMembers(parameters map[string]string) (imResponse ImResponse, err error) { + + url := "https://api.netease.im/nimserver/chatroom/queryMembers.action" + + httpMethod := common.HTTP_METHOD_POST + + header := client.generateHeader() + + body := generateBodyData(parameters) + + logs.Info(common.LOG_QUOTE_STRING + "获取在线成员请求:" + body + common.LOG_QUOTE_STRING) + + res, err1 := htools.HttpDo(httpMethod, url, header, body) + + if err1 != nil { + logs.Error(common.LOG_QUOTE_STRING + "获取在线成员失败:" + err1.Error() + common.LOG_QUOTE_STRING) + err = err1 + return + } + + logs.Info(common.LOG_QUOTE_STRING + "获取在线成员结果:" + res + common.LOG_QUOTE_STRING) + var response ImResponse + if err2 := json.Unmarshal([]byte(res), &response); err2 != nil { + + logs.Error(common.LOG_QUOTE_STRING + "获取在线成员解析失败:" + err2.Error() + common.LOG_QUOTE_STRING) + err = err2 + return + } + + imResponse = response + + return + +} + +// 分页获取聊天室在线用户列表 +func (client *ImClient) GetChatroomOnlineUserListByPage(parameters map[string]string) (imResponse ImResponse, err error) { + + url := "https://api.netease.im/nimserver/chatroom/membersByPage.action" + + httpMethod := common.HTTP_METHOD_POST + + header := client.generateHeader() + + body := generateBodyData(parameters) + + logs.Info(common.LOG_QUOTE_STRING + "分页获取聊天室在线列表:" + body + common.LOG_QUOTE_STRING) + + res, err1 := htools.HttpDo(httpMethod, url, header, body) + + if err1 != nil { + logs.Error(common.LOG_QUOTE_STRING + "分页获取聊天室在线列表失败:" + err1.Error() + common.LOG_QUOTE_STRING) + err = err1 + return + } + + logs.Info(common.LOG_QUOTE_STRING + "分页获取聊天室在线列表结果:" + res + common.LOG_QUOTE_STRING) + var response ImResponse + if err2 := json.Unmarshal([]byte(res), &response); err2 != nil { + + logs.Error(common.LOG_QUOTE_STRING + "分页获取聊天室在线列表失败:" + err2.Error() + common.LOG_QUOTE_STRING) + err = err2 + return + } + + imResponse = response + + return +} + +// 更新聊天室房间信息 +func (client *ImClient) UpdateRoomInfo(request yunxin.UpdateRoomInfoRequest) (err error) { + + url := "https://api.netease.im/nimserver/chatroom/update.action" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + sb.Append("roomid=" + request.Roomid) + sb.Append("&") + sb.Append("name=") + sb.Append("&") + sb.Append("announcement=") + sb.Append("&") + sb.Append("ext=") + sb.Append("&") + sb.Append("notifyExt=" + request.NotifyExt) + + logs.Info(common.LOG_QUOTE_STRING + "更新聊天室信息请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, httpErr := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "更新聊天室信息结果:" + res + common.LOG_QUOTE_STRING) + + if httpErr != nil { + logs.Info(common.LOG_QUOTE_STRING + "更新聊天室信息失败:" + httpErr.Error() + common.LOG_QUOTE_STRING) + err = httpErr + return + } + + resMap := make(map[string]interface{}) + jsonErr := json.Unmarshal([]byte(res), &resMap) + + if jsonErr != nil { + logs.Info(common.LOG_QUOTE_STRING + "解析更新房间信息结果失败:" + jsonErr.Error() + common.LOG_QUOTE_STRING) + err = jsonErr + return + } + + code := resMap["code"].(float64) + codeStr := htools.Float64ToString(code) + if codeStr != "200" { + logs.Info(common.LOG_QUOTE_STRING + "更新房间信息结果失败: code=" + codeStr + common.LOG_QUOTE_STRING) + err = errors.New("更新失败 code=" + codeStr) + return + } + + return + +} + +// 聊天室临时禁言 +func (client *ImClient) ChatroomMuteUser(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/chatroom/temporaryMute.action" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + + logs.Info(common.LOG_QUOTE_STRING + "聊天室临时禁言请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "聊天室临时禁言结果:" + res + common.LOG_QUOTE_STRING) + + return err +} + +// 切换聊天室状态 +func (client *ImClient) ChangeChatroomStat(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/chatroom/toggleCloseStat.action" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + + requestId := HyTools.GetUUID() + logs.Info(common.LOG_QUOTE_STRING + "聊天室切换聊天室开关状态请求:requestId " + requestId + " body " + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + if len(res) == 0 { + logs.Info(common.LOG_QUOTE_STRING + "聊天室切换聊天室开关状态结果:失败 res为空 requestId " + requestId + common.LOG_QUOTE_STRING) + return errors.New("操作失败") + } + + if err != nil { + logs.Info(common.LOG_QUOTE_STRING + "聊天室切换聊天室开关状态结果:失败 返回error requestId " + requestId + "error " + err.Error() + common.LOG_QUOTE_STRING) + return err + } + + //{"desc":"parameter roomid should be long","code":414} + var resData struct { + Code int `json:"code"` + Desc string `json:"desc"` + } + + _ = json.Unmarshal([]byte(res), &resData) + + if resData.Code != 200 { + if resData.Code != 417 { // 重复操作 直接忽略 + logs.Info(fmt.Sprintf(common.LOG_QUOTE_STRING+"聊天室切换聊天室开关状态结果:失败 code[%d] requestId "+requestId+" desc[%s] "+common.LOG_QUOTE_STRING, resData.Code, resData.Desc)) + return errors.New("操作失败") + } + } + + logs.Info(common.LOG_QUOTE_STRING + "聊天室切换聊天室开关状态结果: requestId " + requestId + " response " + res + common.LOG_QUOTE_STRING) + return err +} + +// 设置聊天室成员角色 +func (client *ImClient) SetChatroomMemberRole(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/chatroom/setMemberRole.action" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + + logs.Info(common.LOG_QUOTE_STRING + "设置聊天室成员角色请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "设置聊天室成员角色结果:" + res + common.LOG_QUOTE_STRING) + + return err +} + +// 发送广播消息 +func (client *ImClient) SendBroadCastMsg(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/msg/broadcastMsg.action" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + + logs.Info(common.LOG_QUOTE_STRING + "发送广播请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "发送广播结果:" + res + common.LOG_QUOTE_STRING) + + return err +} + +// 发送全员广播 V2 +func (client *ImClient) SendBroadCastMsgV2(req BroadcastNotificationReq) error { + + url := "https://open.yunxinapi.com/im/v2/broadcast_notification" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateJsonHeader() + + bodyStr := HyTools.JsonStr(req) + + logs.Info(common.LOG_QUOTE_STRING + "发送广播请求V2:" + bodyStr + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, bodyStr) + logs.Info(common.LOG_QUOTE_STRING + "发送广播结果V2:" + res + common.LOG_QUOTE_STRING) + + return err +} + +// 踢出用户登录 V2 https://{endpoint}/im/v2/accounts/{account_id}/actions/kick + +func (client *ImClient) KickOutUserV2(userId string) error { + + url := "https://open.yunxinapi.com/im/v2/accounts/" + userId + "/actions/kick" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateJsonHeader() + + req := make(map[string]any, 3) + req["type"] = 1 + req["device_id_list"] = []string{} + req["kick_notify_extension"] = "" + + bodyStr := HyTools.JsonStr(req) + + logs.Info(common.LOG_QUOTE_STRING + "发送踢下线请求V2:" + bodyStr + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, bodyStr) + logs.Info(common.LOG_QUOTE_STRING + "发送踢下线结果V2:" + res + common.LOG_QUOTE_STRING) + + return err +} + +// 设置/取消 拉黑 静音 +func (client *ImClient) SetSpecialRelation(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/user/setSpecialRelation.action" + + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + + logs.Info(common.LOG_QUOTE_STRING + "设置/取消 拉黑请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "设置/取消 拉黑结果:" + res + common.LOG_QUOTE_STRING) + + return err +} + +// 发送自定义系统通知 +func (client *ImClient) BatchSendMsg(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/msg/sendBatchMsg.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + logs.Info(common.LOG_QUOTE_STRING + "云信IM批量发消息请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "云信IM批量发消息结果:" + res + common.LOG_QUOTE_STRING) + return err +} + +// 批量发送消息 +func (client *ImClient) SendAttachMsg(parameters map[string]string) error { + + url := "https://api.netease.im/nimserver/msg/sendAttachMsg.action" + httpMethod := common.HTTP_METHOD_POST + header := client.generateHeader() + + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + logs.Info(common.LOG_QUOTE_STRING + "云信IM发系统通知请求:" + sb.ToString() + common.LOG_QUOTE_STRING) + res, err := htools.HttpDo(httpMethod, url, header, sb.ToString()) + logs.Info(common.LOG_QUOTE_STRING + "云信IM发系统通知结果:" + res + common.LOG_QUOTE_STRING) + if parameters["to"] == "b260b07ff3d1411f926e2d767cb9d6f3" { + log.Info("完成给老板发接单消息") + } + return err +} + +// CreateChatGroup 创建群组 +func (client *ImClient) CreateChatGroup(ctx context.Context, ownerUserId string, groupName string, inviteMem []string) (string, error) { + + url := "https://open.yunxinapi.com/im/v2.1/teams" + httpMethod := common.HTTP_METHOD_POST + header := client.generateJsonHeader() + reqBody := &CreateChatGroupReq{ + OwnerAccountID: ownerUserId, + TeamType: 1, + Name: groupName, + MembersLimit: 3000, + InviteAccountIDs: inviteMem, + InviteMsg: "管理", + Configuration: &TeamConfiguration{ + JoinMode: 1, + }, + AntispamConfiguration: nil, + } + bodyBytes, err := json.Marshal(reqBody) + if err != nil { + return "", errors.WithStack(err) + } + + res, err := HyTools.HttpDo(httpMethod, url, header, string(bodyBytes)) + if err != nil { + // {"desc":"already register","code":414} + logs.Info("YunXin_CreateChatGroup_Fail_AccID_%s:"+err.Error(), ownerUserId) + return "", errors.WithStack(err) + } + log.InfoF("create group chat resp: %s", res) + var body BaseRes[CreateChatGroupRsp] + err = json.Unmarshal([]byte(res), &body) + if err != nil { + return "", errors.WithStack(err) + } + if body.Code != 200 { + return "", errors.Errorf("YunXin_CreateChatGroup code(%d) not 200,msg: %s", body.Code, body.Msg) + } + if len(body.Data.FailedList) > 0 { + var errInfo []string + for _, member := range body.Data.FailedList { + errInfo = append(errInfo, fmt.Sprintf("account: %s ,code: %d ,msg: %s", member.AccountID, member.ErrorCode, member.ErrorMsg)) + } + return "", errors.Errorf("YunXin_CreateChatGroup err: %s", strings.Join(errInfo, ";")) + } + + return cast.ToString(body.Data.TeamInfo.TeamID), nil +} + +// ================ 私有方法 ======================== +func generateBodyData(parameters map[string]string) string { + sb := htools.NewStringBuilder() + parametersCount := len(parameters) + i := 0 + for k, v := range parameters { + sb.Append(k + "=" + v) + if i < parametersCount-1 { + sb.Append("&") + } + i++ + } + return sb.ToString() +} + +func randNumber() string { + str := "0123456789" + bytes := []byte(str) + var result []byte + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := 0; i < 4; i++ { + result = append(result, bytes[r.Intn(len(bytes))]) + } + return string(result) +} diff --git a/pkg/common/netease/ImClient_test.go b/pkg/common/netease/ImClient_test.go new file mode 100644 index 0000000..e9f7f58 --- /dev/null +++ b/pkg/common/netease/ImClient_test.go @@ -0,0 +1,124 @@ +package Netease + +import ( + "context" + "testing" +) + +// 测试获取IM用户信息 +func TestImClient_GetImUserInfo(t *testing.T) { + type fields struct { + AppKey string + AppSecret string + } + type args struct { + userId string + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "test", + fields: fields{ + AppKey: "543b1a440b940b170fccdf494839efc01", + AppSecret: "41134093938f1", + }, + args: args{ + // 2251bae8a0514e6892f0374f5dd260d4 + // b8af4bebe2064435974ba2340d852055 + userId: "fcda23bc00e641f5ae17492503b566ed", + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client := &ImClient{ + AppKey: tt.fields.AppKey, + AppSecret: tt.fields.AppSecret, + } + if err := client.GetImUserInfo(tt.args.userId); (err != nil) != tt.wantErr { + t.Errorf("GetImUserInfo() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +// 测试注册IM用户 +func TestImClient_CreateImUser(t *testing.T) { + type fields struct { + AppKey string + AppSecret string + } + type args struct { + userId string + nickname string + avatar string + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "test", + fields: fields{ + AppKey: "543b1a440b940b170fccdf494839efc01", + AppSecret: "41134093938f1", + }, + args: args{ + // 2251bae8a0514e6892f0374f5dd260d4 + // b8af4bebe2064435974ba2340d852055 + userId: "fcda23bc00e641f5ae17492503b566ed", + nickname: "杏", + avatar: "https://photo-app.ddegame.cn/upload/19986a27-3bae-49f7-9643-cd18cda87557.jpg", + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client := &ImClient{ + AppKey: tt.fields.AppKey, + AppSecret: tt.fields.AppSecret, + } + if err := client.CreateImUser(tt.args.userId, tt.args.nickname, tt.args.avatar); (err != nil) != tt.wantErr { + t.Errorf("GetImUserInfo() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +// 测试注册IM用户 +func TestImClient_CreateImUserOne(t *testing.T) { + client := &ImClient{ + AppKey: "543b1a440b940b170fccdf494839efc01", + AppSecret: "41134093938f1", + } + client.CreateImUser("fcda23bc00e641f5ae17492503b566ed", "杏", "https://photo-app.ddegame.cn/upload/19986a27-3bae-49f7-9643-cd18cda87557.jpg") +} + +func TestImClient_CreateChatGroup(t *testing.T) { + client := &ImClient{ + AppKey: "543b1a440b940b170fccdf494839efc01", + AppSecret: "41134093938f1", + } + groupId, err := client.CreateChatGroup(context.Background(), "e1fbefbbd77a402e8c2101a0ebe15f5d", "测试群", []string{"e1fbefbbd77a402e8c2101a0ebe15f5d"}) + if err != nil { + t.Error(err) + } + println(groupId) +} + +func init() { + // viper.SetConfigName("dev.yaml") + // viper.AddConfigPath("../../../configs/admin/") + // viper.SetConfigType("yaml") + // _ = viper.ReadInConfig() + // log.Init() + // datasource.InitMySQlMaster() +} diff --git a/pkg/common/netease/ImResponse.go b/pkg/common/netease/ImResponse.go new file mode 100644 index 0000000..5eb53cf --- /dev/null +++ b/pkg/common/netease/ImResponse.go @@ -0,0 +1,33 @@ +package Netease + +type ImResponse struct { + Code int `json:"code"` + Desc interface{} `json:"desc"` +} + +// 获取聊天室在线列表返回对象 +type GetChatroomMemberResponse struct { + Data []ChatroomMemberDTO `json:"data"` +} + +// 聊天室会员 +type ChatroomMemberDTO struct { + RoomId int `json:"roomid"` + AccId string `json:"accid"` + OnlineStat bool `json:"onlineStat"` +} + +// 创建聊天室返回结果 +type CreateChatroomResponse struct { + Code int `json:"code"` + Chatroom NeteaseChatroomDTO `json:"chatroom"` +} + +// 聊天室会员 +type NeteaseChatroomDTO struct { + RoomId int `json:"roomid"` + Valid bool `json:"valid"` + RoomName string `json:"name"` + Ext string `json:"ext"` + Creator string `json:"creator"` +} diff --git a/pkg/common/netease/dto/ImChatroomOnlineMember.go b/pkg/common/netease/dto/ImChatroomOnlineMember.go new file mode 100644 index 0000000..e877379 --- /dev/null +++ b/pkg/common/netease/dto/ImChatroomOnlineMember.go @@ -0,0 +1,10 @@ +package yunxin + +// 聊天室在线成员对象 +type ImChatroomOnlineMember struct { + MessageRoomId int `json:"roomid"` + UserId string `json:"accid"` + EnterTime int64 `json:"enterTime"` + Type string `json:"type"` + OnlineStat bool `json:"onlineStat"` +} diff --git a/pkg/common/netease/dto/ImUserExtData.go b/pkg/common/netease/dto/ImUserExtData.go new file mode 100644 index 0000000..a909e7f --- /dev/null +++ b/pkg/common/netease/dto/ImUserExtData.go @@ -0,0 +1,9 @@ +package yunxin + +// IM用户扩展信息 会话列表用户数据从IM信息获取 +type ImUserExtData struct { + VipLevel string // Vip等级 + AvatarDecoration string // 头饰 + GroupType string + VipConfig string // json字符串dto.UserVipConfigDTO +} diff --git a/pkg/common/netease/dto/UpdateRoomInfoRequest.go b/pkg/common/netease/dto/UpdateRoomInfoRequest.go new file mode 100644 index 0000000..c7eb882 --- /dev/null +++ b/pkg/common/netease/dto/UpdateRoomInfoRequest.go @@ -0,0 +1,7 @@ +package yunxin + +// 更新聊天室信息请求对象 +type UpdateRoomInfoRequest struct { + Roomid string `json:"roomid"` // 房间ID + NotifyExt string `json:"notifyExt" // 扩展信息` +} diff --git a/pkg/common/netease/req.go b/pkg/common/netease/req.go new file mode 100644 index 0000000..e8f54ab --- /dev/null +++ b/pkg/common/netease/req.go @@ -0,0 +1,38 @@ +package Netease + +// CreateChatGroupReq 创建群组请求 +// https://doc.yunxin.163.com/messaging2/server-apis/DIwODUwMTE?platform=server +type CreateChatGroupReq struct { + OwnerAccountID string `json:"owner_account_id"` // M 群主(创建者)的 IM 账号 ID。 + TeamType int `json:"team_type"` // M 1:高级群。2:超大群。 + Name string `json:"name"` // M 长度上限 64 位字符。 + Icon string `json:"icon,omitempty"` // O 群组头像的 URL 地址,例如 "https://netease/xxx.png",长度上限 1024 位字符。 + Announcement string `json:"announcement,omitempty"` // O 群组公告,长度上限 1024 位字符。 + Intro string `json:"intro,omitempty"` // O群组简介,长度上限 512 位字符。 + MembersLimit int `json:"members_limit"` // O 群组成员数上限(包含群主),默认为 200。可设置范围的为:[2 ~ 200]。 + ServerExtension string `json:"server_extension,omitempty"` // O 自定义群组扩展字段,第三方可以跟据此属性自定义扩展自己的群属性,建议封装成 JSONObject 格式,{key:value}。长度上限 1024 位字符。 对应 SDK 的 serverExtension 字段。 + CustomerExtension string `json:"customer_extension,omitempty"` // O 客户端自定义扩展字段,仅服务器 API 可以设置,SDK 仅负责透传,不解析内容。 对应 SDK 的 customerExtension 字段。 + Extension string `json:"extension,omitempty"` // M 创建群组时邀请入群的成员列表。 + InviteAccountIDs []string `json:"invite_account_ids,omitempty"` // M 邀请入群的附言,长度上限 150 位字符。 + InviteMsg string `json:"invite_msg,omitempty"` + Configuration *TeamConfiguration `json:"configuration,omitempty"` + AntispamConfiguration *AntispamConfig `json:"antispam_configuration,omitempty"` +} + +type TeamConfiguration struct { + JoinMode int `json:"join_mode"` // 通过 SDK 侧操作申请入群的验证方式。 0(默认):无需验证,直接入群。 1:需要群主或管理员验证通过才能入群。 2:不允许任何人申请入群。 + AgreeMode int `json:"agree_mode"` // 邀请入群时是否需要被邀请人的同意。 0(默认):需要被邀请人同意才能入群。 1:不需要被邀请人同意,直接入群。 + InviteMode int `json:"invite_mode"` // 邀请权限,即谁可以邀请他人入群。 0(默认):群主和管理员。 1:所有人。 + UpdateTeamInfoMode int `json:"update_team_info_mode"` + UpdateExtensionMode int `json:"update_extension_mode"` +} + +type AntispamConfig struct { + Enabled bool `json:"enabled"` + BusinessIDMap *BusinessIDMap `json:"business_id_map,omitempty"` +} + +type BusinessIDMap struct { + Type int `json:"type"` + AntispamBusinessID string `json:"antispam_business_id"` +} diff --git a/pkg/common/netease/rsp.go b/pkg/common/netease/rsp.go new file mode 100644 index 0000000..da9bc52 --- /dev/null +++ b/pkg/common/netease/rsp.go @@ -0,0 +1,35 @@ +package Netease + +type CreateChatGroupRsp struct { + FailedList []*FailedMember `json:"failed_list,omitempty"` + TeamInfo *TeamInfo `json:"team_info"` +} + +type FailedMember struct { + AccountID string `json:"account_id"` + ErrorCode int `json:"error_code"` + ErrorMsg string `json:"error_msg"` +} + +type TeamInfo struct { + TeamID int64 `json:"team_id"` + OwnerAccountID string `json:"owner_account_id"` + Name string `json:"name"` + Icon string `json:"icon,omitempty"` + Announcement string `json:"announcement,omitempty"` + Intro string `json:"intro,omitempty"` + MembersLimit int `json:"members_limit"` + MemberCount int `json:"member_count"` + ServerExtension string `json:"server_extension,omitempty"` + CustomerExtension string `json:"customer_extension,omitempty"` + CreateTime int64 `json:"create_time"` + UpdateTime int64 `json:"update_time"` + TeamType int `json:"team_type"` + Configuration *TeamConfiguration `json:"configuration,omitempty"` +} + +type BaseRes[T any] struct { + Code int + Msg string + Data T +} diff --git a/pkg/common/network/response.go b/pkg/common/network/response.go new file mode 100644 index 0000000..4b5a87f --- /dev/null +++ b/pkg/common/network/response.go @@ -0,0 +1,45 @@ +package network + +import ( + "encoding/json" +) + +const ( + SuccessCode = "6000" // 成功 + NeedLogin = "6018" // 登陆过期 + ErrorCode = "6020" // 错误 + +) + +type Response struct { + Code string + Result interface{} + Msg string +} + +type EmptyResponse struct { +} + +func Fail(msg string) Response { + response := Response{Code: ErrorCode, Msg: msg} + return response +} + +func Invalid() string { + response := Response{Code: NeedLogin, Msg: "用户身份已过期"} + str, _ := json.Marshal(response) + return string(str) +} + +func Success(data interface{}) Response { + response := Response{Code: SuccessCode, Result: data} + return response +} + +func Page(data interface{}, count int64) Response { + response := Response{Code: SuccessCode, Result: map[string]interface{}{ + "List": data, + "Count": count, + }} + return response +} diff --git a/pkg/common/pinyin/pinyin.go b/pkg/common/pinyin/pinyin.go new file mode 100644 index 0000000..4f69e6e --- /dev/null +++ b/pkg/common/pinyin/pinyin.go @@ -0,0 +1,148 @@ +package pinyin + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" + "unicode/utf8" +) + +type vowel int32 + +var ( + ys = []vowel{'ā', 'ē', 'ī', 'ō', 'ū', 'ǖ', 'Ā', 'Ē', 'Ī', 'Ō', 'Ū', 'Ǖ'} // 单韵母 一声 + es = []vowel{'á', 'é', 'í', 'ó', 'ú', 'ǘ', 'Á', 'É', 'Í', 'Ó', 'Ú', 'Ǘ'} // 单韵母 二声 + ss = []vowel{'ǎ', 'ě', 'ǐ', 'ǒ', 'ǔ', 'ǚ', 'Ǎ', 'Ě', 'Ǐ', 'Ǒ', 'Ǔ', 'Ǚ'} // 单韵母 三声 + fs = []vowel{'à', 'è', 'ì', 'ò', 'ù', 'ǜ', 'À', 'È', 'Ì', 'Ò', 'Ù', 'Ǜ'} // 单韵母 四声 + ws = []vowel{'a', 'e', 'i', 'o', 'u', 'v', 'A', 'E', 'I', 'O', 'U', 'V'} // 单韵母 无声调 +) + +var ( + pinyinTemp map[vowel]interface{} + toneTemp map[vowel]vowel +) + +const ( + Tone string = "带声调的拼音" // 带声调的拼音 例如:Cào + InitialsInCapitals string = "首字母大写不带声调" // 首字母大写不带声调 例如:Cao + None string = "" //如果匹配不到汉字,就靠大家维护下 【匹配失败,手动添加代码到pinyin.txt】 +) + +func LoadingPYFile(filename string) { + f, err := os.Open(filename) + if err != nil { + fmt.Println(err) + } + if err != nil { + panic(err) + } + pinyinTemp = make(map[vowel]interface{}, 0) + toneTemp = make(map[vowel]vowel) + for i, t := range ys { + toneTemp[t] = ws[i] + } + for i, t := range es { + toneTemp[t] = ws[i] + } + for i, t := range ss { + toneTemp[t] = ws[i] + } + for i, t := range fs { + toneTemp[t] = ws[i] + } + defer func() { + _ = f.Close() + }() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + //单行分割取出拼音 + str := strings.Split(scanner.Text(), "=>") + if len(str) < 2 { + continue + } + i, err := strconv.ParseInt(str[0], 16, 32) + if err != nil { + continue + } + pinyinTemp[vowel(i)] = str[1] + //fmt.Println(pinyinTemp[vowel(i)]) + } +} + +func PY(source string) (string, error) { + return PYSplit(source, "", "") +} + +func PYSplit(source string, split string, types string) (string, error) { + hz := []vowel(source) + words := make([]string, 0) + for _, s := range hz { + word, err := _vowel(s, types) + if err != nil { + return None, err + } + if len(word) > 0 { + words = append(words, word) + } + } + return strings.Join(words, split), nil +} + +func _vowel(source vowel, types string) (string, error) { + switch types { + case Tone: + return getTone(source), nil + case InitialsInCapitals: + return getInitialsInCapitals(source), nil + default: + return getDefault(source), nil + } +} + +func getTone(source vowel) string { + if pinyinTemp[source] != nil { + return pinyinTemp[source].(string) + } + return string(source) +} + +func getInitialsInCapitals(source vowel) string { + def := getDefault(source) + var result string + if def == "" { + return def + } + str := []vowel(def) + if str[0] > 32 { + str[0] = str[0] - 32 + } + for _, v := range str { + result += string(v) + } + return result +} + +func getDefault(source vowel) string { + tone := getTone(source) + var result string + if tone == "" { + return None + } + resultLen := make([]vowel, utf8.RuneCountInString(tone)) + count := 0 + for _, t := range tone { + changes, ok := toneTemp[vowel(t)] + if ok { + resultLen[count] = changes + } else { + resultLen[count] = vowel(t) + } + count++ + } + for _, v := range resultLen { + result += string(v) + } + return result +} diff --git a/pkg/common/pinyin/pinyin.txt b/pkg/common/pinyin/pinyin.txt new file mode 100644 index 0000000..82d18fa --- /dev/null +++ b/pkg/common/pinyin/pinyin.txt @@ -0,0 +1,41208 @@ +3400=>qiū +3401=>tiàn +3404=>kuà +3405=>wǔ +3406=>yǐn +340C=>yí +3416=>xié +341C=>chóu +3421=>nuò +3424=>dān +3428=>xù +3429=>xíng +342B=>xiōng +342C=>liú +342D=>lǐn +342E=>xiāng +342F=>yōng +3430=>xìn +3431=>zhěn +3432=>dài +3433=>wù +3434=>pān +3437=>mǎ +3438=>qiàn +3439=>yì +343A=>yín +343B=>nèi +343C=>chèng +343D=>fēng +3441=>zhuō +3442=>fǎng +3443=>ǎo +3444=>wǔ +3445=>zuò +3447=>zhòu +3448=>dòng +3449=>sù +344A=>yì +344B=>qióng +344C=>kuāng +344D=>lèi +344E=>nǎo +344F=>zhù +3450=>shū +3454=>xǔ +3457=>shēn +3458=>jiè +3459=>dié +345A=>nuó +345B=>sù +345C=>yì +345D=>lòng +345E=>yìng +345F=>běng +3463=>lán +3464=>miáo +3465=>yì +3466=>lì +3467=>jì +3468=>yǔ +3469=>luó +346A=>chái +346E=>hún +346F=>xǔ +3470=>huì +3471=>rǎo +3473=>zhòu +3475=>hàn +3476=>xì +3477=>tài +3478=>yáo +3479=>huì +347A=>jùn +347B=>mà +347C=>lüè +347D=>táng +347E=>yáo +347F=>zhào +3480=>zhāi +3481=>yǔ +3482=>zhuó +3483=>èr +3484=>rǎn +3485=>qǐ +3486=>chì +3487=>wǔ +3488=>hàn +3489=>tǎng +348A=>sè +348C=>qióng +348D=>léi +348E=>sà +3491=>kuǐ +3492=>pú +3493=>tà +3494=>shú +3495=>yāng +3496=>ǒu +3497=>tái +3499=>mián +349A=>yìn +349B=>diào +349C=>yǔ +349D=>miè +349E=>jùn +349F=>niǎo +34A0=>xiè +34A1=>yóu +34A4=>chè +34A5=>fēng +34A6=>lěi +34A7=>lì +34A9=>luǒ +34AB=>jì +34B0=>quán +34B2=>cái +34B3=>liǎng +34B4=>gǔ +34B5=>mào +34B7=>guǎ +34B8=>suì +34BB=>mào +34BC=>mán +34BD=>quān +34BE=>shì +34BF=>lí +34C1=>wǎng +34C2=>kòu +34C3=>dù +34C4=>zhèn +34C5=>tīng +34C8=>bìng +34C9=>huò +34CA=>dòng +34CB=>gòng +34CC=>chēng +34CE=>qīn +34CF=>jiǒng +34D0=>lù +34D1=>xìng +34D3=>nán +34D4=>xiè +34D6=>bì +34D7=>jié +34D8=>sù +34DA=>gōng +34DC=>yòu +34DD=>xíng +34DE=>qià +34DF=>pí +34E0=>diàn +34E1=>fǔ +34E2=>luò +34E3=>qià +34E4=>qià +34E5=>tāng +34E6=>bāi +34E7=>gān +34E8=>cí +34E9=>xuān +34EA=>lǎng +34ED=>shé +34EF=>lí +34F0=>huà +34F1=>tóu +34F2=>piān +34F3=>dī +34F4=>ruǎn +34F5=>è +34F6=>qiè +34F7=>yì +34F8=>zhuō +34F9=>ruì +34FA=>jiān +34FC=>chì +34FD=>chóng +34FE=>xī +3500=>lüè +3501=>dēng +3502=>lín +3503=>jué +3504=>sù +3505=>xiào +3506=>zàn +3509=>zhǔ +350A=>zhǎn +350B=>jiān +350C=>zòu +350D=>chuā +350E=>xiè +350F=>lì +3511=>chì +3512=>xí +3513=>jiǎn +3515=>jí +3517=>fèi +3518=>chù +3519=>bēng +351A=>jié +351C=>bá +351D=>liǎng +351E=>kuài +3520=>xiā +3521=>biē +3522=>jué +3523=>léi +3524=>xìn +3525=>bài +3526=>yǎng +3527=>lǜ +3528=>bèi +3529=>è +352A=>lǔ +352D=>chè +352E=>nuó +352F=>xuán +3530=>héng +3531=>yǔ +3533=>guǐ +3534=>yì +3535=>xuǎn +3536=>gòng +3537=>lòu +3538=>tī +3539=>lè +353A=>shì +353C=>sǔn +353D=>yào +353E=>xiān +353F=>zòu +3541=>què +3542=>yín +3543=>xī +3544=>zhǐ +3545=>jiá +3546=>hù +3547=>lā +3548=>yǐ +3549=>kè +354A=>fū +354B=>qín +354C=>ài +354E=>kè +354F=>chú +3550=>xiě +3551=>chú +3552=>wēi +3555=>huàn +3556=>sù +3557=>yòu +3559=>jùn +355A=>zhǎo +355B=>xù +355C=>shǐ +355E=>shuā +355F=>kuì +3560=>shuāng +3561=>hé +3562=>gài +3563=>yǎn +3564=>qiú +3565=>shēn +3566=>huà +3567=>xī +3568=>fàn +3569=>pàng +356A=>dǎn +356B=>fǎng +356C=>gōng +356D=>āo +356E=>fǔ +356F=>nè +3570=>xuè +3571=>yóu +3572=>huá +3574=>chén +3575=>guó +3576=>ň +3577=>huà +3578=>lì +3579=>fá +357A=>xiāo +357B=>pǒu +357D=>sì +3580=>lè +3581=>lìn +3582=>yì +3583=>hǒu +3585=>xù +3586=>qú +3587=>ér +358A=>xún +358F=>niè +3590=>wěi +3591=>xiè +3592=>tí +3593=>hóng +3594=>tǔn +3595=>niè +3596=>niè +3597=>yín +3598=>zhēn +359E=>wāi +359F=>shòu +35A0=>nuò +35A1=>yè +35A2=>qí +35A3=>tòu +35A4=>hán +35A5=>jùn +35A6=>dǒng +35A7=>hūn +35A8=>lù +35A9=>jū +35AA=>huò +35AB=>líng +35AD=>tiǎn +35AE=>lún +35B5=>gé +35B6=>yān +35B7=>shí +35B8=>xué +35B9=>pēn +35BA=>chǔn +35BB=>niú +35BC=>duǒ +35BD=>zé +35BE=>è +35BF=>xié +35C0=>yōu +35C1=>è +35C2=>shěng +35C3=>wěn +35C4=>kū +35C5=>hú +35C6=>gé +35C7=>xiá +35C8=>màn +35C9=>lüè +35CA=>jí +35CB=>hóu +35CC=>zhì +35CF=>wāi +35D1=>bai +35D2=>ài +35D3=>zhuī +35D4=>qiān +35D5=>gòu +35D6=>dàn +35D7=>bēi +35D8=>bó +35D9=>chū +35DA=>lì +35DB=>xiào +35DC=>xiù +35E2=>hóng +35E3=>tì +35E4=>cù +35E5=>kuò +35E6=>láo +35E7=>zhì +35E8=>xiē +35E9=>xī +35EB=>qiè +35EC=>zhā +35ED=>xī +35F0=>cóng +35F1=>jí +35F2=>huò +35F3=>tǎ +35F4=>yán +35F5=>xù +35F6=>pō +35F7=>sǎi +35FB=>guō +35FC=>yè +35FD=>xiǎng +35FE=>xuē +35FF=>hé +3600=>zuò +3601=>yì +3602=>cí +3604=>lēng +3605=>xián +3606=>tǎi +3607=>róng +3608=>yì +3609=>zhì +360A=>xī +360B=>xián +360C=>jù +360D=>jí +360E=>hǎn +3610=>pào +3611=>lì +3613=>lán +3614=>sǎi +3615=>hǎn +3616=>yán +3617=>qū +3619=>yán +361A=>hǎn +361B=>kān +361C=>chǐ +361D=>niè +361E=>huò +3620=>bì +3621=>xiá +3622=>wěng +3623=>xuán +3624=>wān +3625=>yóu +3626=>qín +3627=>xù +3628=>niè +3629=>bì +362A=>hào +362B=>jǐng +362C=>ào +362D=>ào +3630=>zhēn +3631=>tān +3632=>jú +3634=>zuò +3635=>bù +3636=>jié +3637=>ài +3638=>zàng +3639=>cí +363A=>fá +363F=>niè +3640=>liù +3641=>méi +3642=>duì +3643=>bāng +3644=>bì +3645=>bǎo +3647=>chù +3648=>xià +3649=>tiǎn +364A=>cháng +364D=>duō +364E=>wēi +364F=>fù +3650=>duǒ +3651=>yǔ +3652=>yě +3653=>kuí +3654=>wěi +3655=>kuài +3657=>wēi +3658=>yāo +3659=>lǒng +365A=>xīng +365B=>zhuān +365C=>chí +365D=>xié +365E=>niè +365F=>lǎng +3660=>yī +3661=>zōng +3662=>mán +3663=>zhàng +3664=>xià +3665=>gùn +3666=>xié +3668=>jì +3669=>liáo +366A=>yì +366B=>jí +366C=>yín +366E=>dā +366F=>yì +3670=>xiè +3671=>hào +3672=>yǒng +3673=>kǎn +3674=>chàn +3675=>tái +3676=>táng +3677=>zhí +3678=>bào +3679=>méng +367A=>kuí +367B=>chán +367C=>lěi +367E=>xì +3680=>xī +3681=>qiào +3682=>nàng +3683=>yūn +3685=>lóng +3686=>fù +3687=>zōng +3689=>gǔ +368A=>kāi +368B=>diāo +368C=>huà +368D=>kuǐ +368F=>gǎo +3690=>tào +3692=>shǎn +3693=>lǎi +3694=>niè +3695=>fú +3696=>gǎo +3697=>qié +3698=>bàn +3699=>jiā +369A=>kōng +369B=>xì +369C=>yù +369D=>zhuī +369E=>shěn +369F=>chuò +36A0=>xiāo +36A1=>jǐ +36A2=>nú +36A3=>xiáo +36A4=>yì +36A5=>yú +36A6=>yí +36A7=>yǎn +36A8=>shěn +36A9=>rǎn +36AA=>hào +36AB=>sà +36AC=>jūn +36AD=>yóu +36AF=>xín +36B0=>pēi +36B1=>qiū +36B2=>chān +36B4=>bù +36B5=>dōng +36B6=>sì +36B7=>ěr +36B9=>mǎo +36BA=>yùn +36BB=>jī +36BD=>qiǎo +36BE=>xiōng +36BF=>páo +36C0=>chú +36C1=>pēng +36C2=>nuǒ +36C3=>jié +36C4=>yī +36C5=>èr +36C6=>duò +36CA=>duǒ +36CD=>qiè +36CE=>lǚ +36CF=>qiú +36D0=>sǒu +36D1=>càn +36D2=>dòu +36D3=>xī +36D4=>fēng +36D5=>yì +36D6=>suō +36D7=>qiē +36D8=>pò +36D9=>xīn +36DA=>tǒng +36DB=>xìn +36DC=>yóu +36DD=>bèi +36DE=>lòng +36E3=>yún +36E4=>lí +36E5=>tà +36E6=>lǎn +36E7=>mǎn +36E8=>qiǎng +36E9=>zhóu +36EA=>yàn +36EB=>xī +36EC=>lù +36ED=>xī +36EE=>sǎo +36EF=>fàn +36F1=>wěi +36F2=>fà +36F3=>yì +36F4=>nǎo +36F5=>chēng +36F6=>tàn +36F7=>jī +36F8=>shù +36F9=>pián +36FA=>ān +36FB=>kuā +36FC=>chā +36FE=>xián +36FF=>zhì +3702=>fēng +3703=>liàn +3704=>xún +3705=>xù +3706=>mì +3707=>huì +3708=>mù +3709=>yōng +370A=>zhǎn +370B=>yì +370C=>nǒu +370D=>táng +370E=>xī +370F=>yún +3710=>shù +3711=>fú +3712=>yì +3713=>dá +3715=>lián +3716=>cáo +3717=>cān +3718=>jù +3719=>lù +371A=>sù +371B=>nèn +371C=>ào +371D=>ǎn +371E=>qiàn +3720=>cuī +3721=>cōng +3723=>rán +3724=>niǎn +3725=>mái +3726=>xín +3727=>yuè +3728=>nái +3729=>ào +372A=>shēn +372B=>mà +372E=>làn +372F=>xī +3730=>yuè +3731=>zhì +3732=>wěng +3733=>huái +3734=>mèng +3735=>niǎo +3736=>wǎn +3737=>mí +3738=>niè +3739=>qú +373A=>zàn +373B=>liàn +373C=>zhí +373D=>zǐ +373E=>hái +373F=>xù +3740=>hào +3741=>xuān +3742=>zhì +3743=>miǎn +3744=>chún +3745=>gòu +3747=>chún +3748=>luán +3749=>zhù +374A=>shǒu +374B=>liǎo +374C=>jiù +374D=>xiě +374E=>dìng +374F=>jiè +3750=>róng +3751=>máng +3753=>kè +3754=>yǎo +3755=>níng +3756=>yí +3757=>láng +3758=>yóng +3759=>yín +375A=>yán +375B=>sù +375D=>lín +375E=>yā +375F=>máo +3760=>míng +3761=>zuì +3762=>yǔ +3763=>yì +3764=>gòu +3765=>mǐ +3766=>jùn +3767=>wěn +3769=>kāng +376A=>diàn +376B=>lóng +376D=>xǐng +376E=>cuì +376F=>qiáo +3770=>mián +3771=>mèng +3772=>qǐn +3774=>wán +3775=>dé +3776=>ài +3778=>biàn +3779=>nóu +377A=>lián +377B=>jǐn +377C=>yū +377D=>chuí +377E=>zuǒ +377F=>bǒ +3780=>huī +3781=>yào +3782=>tuǐ +3783=>jì +3784=>ān +3785=>luò +3786=>jǐ +3787=>wěi +3788=>bō +3789=>zā +378A=>xù +378B=>niǎn +378C=>yùn +378E=>bǎ +378F=>zhé +3790=>jū +3791=>wěi +3792=>xiè +3793=>qì +3794=>yí +3795=>xiè +3796=>cí +3797=>qiú +3798=>dū +3799=>niào +379A=>qì +379B=>jǐ +379C=>tuī +379E=>sóng +379F=>diàn +37A0=>láo +37A1=>zhǎn +37A4=>yín +37A5=>cén +37A6=>jǐ +37A7=>huì +37A8=>zǐ +37A9=>lán +37AA=>náo +37AB=>jù +37AC=>qìn +37AD=>dài +37AF=>jié +37B0=>xǔ +37B1=>cōng +37B2=>yòng +37B3=>dǒu +37B4=>chí +37B6=>mǐn +37B7=>huáng +37B8=>suì +37B9=>kě +37BA=>zú +37BB=>hào +37BC=>chéng +37BD=>xuè +37BE=>ní +37BF=>chì +37C0=>lián +37C1=>àn +37C2=>mǔ +37C3=>sī +37C4=>xiáng +37C5=>yáng +37C6=>huá +37C7=>cuò +37C8=>qiú +37C9=>láo +37CA=>fú +37CB=>duì +37CC=>máng +37CD=>láng +37CE=>tuǒ +37CF=>hán +37D0=>mǎng +37D1=>bó +37D2=>qūn +37D3=>qí +37D4=>hán +37D6=>lòng +37D8=>tiáo +37D9=>zé +37DA=>qí +37DB=>zàn +37DC=>mí +37DD=>péi +37DE=>zhàn +37DF=>xiàng +37E0=>gǎng +37E2=>qí +37E4=>lù +37E6=>yùn +37E7=>è +37E8=>duān +37E9=>mín +37EA=>wēi +37EB=>quán +37EC=>sǒu +37ED=>mín +37EE=>tū +37F0=>mǐng +37F1=>yǎo +37F2=>jué +37F3=>lì +37F4=>kuài +37F5=>gǎng +37F6=>yuán +37F7=>da +37F9=>láo +37FA=>lóu +37FB=>qiàn +37FC=>áo +37FD=>biǎo +37FE=>yōng +37FF=>mǎng +3800=>dǎo +3802=>áo +3804=>xí +3805=>fú +3806=>dān +3807=>jiù +3808=>rùn +3809=>tóng +380A=>qū +380B=>è +380C=>qī +380D=>jí +380E=>jí +380F=>huá +3810=>jiào +3811=>zuì +3812=>biǎo +3813=>méng +3814=>bài +3815=>wěi +3816=>yǐ +3817=>ào +3818=>yǔ +3819=>háo +381A=>duì +381B=>wò +381C=>nì +381D=>cuán +381F=>lí +3820=>lú +3821=>niǎo +3822=>huái +3823=>lì +3825=>lǜ +3826=>fēng +3827=>mǐ +3828=>yù +382A=>jù +382D=>zhǎn +382E=>pēng +382F=>yǐ +3831=>jì +3832=>bǐ +3834=>rèn +3835=>huāng +3836=>fán +3837=>gé +3838=>kù +3839=>jiè +383A=>shā +383C=>sī +383D=>tóng +383E=>yuān +383F=>zī +3840=>bì +3841=>kuǎ +3842=>lì +3843=>huāng +3844=>xún +3845=>nuǒ +3847=>zhé +3848=>wèn +3849=>xián +384A=>qià +384B=>yé +384C=>mào +384F=>shù +3851=>qiāo +3852=>zhūn +3853=>kūn +3854=>wù +3855=>yīng +3856=>chuáng +3857=>tí +3858=>lián +3859=>bī +385A=>gōu +385B=>máng +385C=>xiè +385D=>fèng +385E=>lóu +385F=>zāo +3860=>zhèng +3861=>chú +3862=>màn +3863=>lóng +3865=>yìn +3866=>pīn +3867=>zhèng +3868=>jiān +3869=>luán +386A=>nié +386B=>yì +386D=>jì +386E=>jí +386F=>zhái +3870=>yǔ +3871=>jiǔ +3872=>huán +3873=>zhǐ +3874=>lā +3875=>líng +3876=>zhǐ +3877=>běn +3878=>zhà +3879=>jū +387A=>dàn +387B=>liào +387C=>yì +387D=>zhào +387E=>xiàn +387F=>chì +3880=>cì +3881=>chǐ +3882=>yǎn +3883=>láng +3884=>dòu +3885=>lòng +3886=>chán +3888=>tuí +3889=>chá +388A=>ǎi +388B=>chǐ +388D=>yǐng +388E=>zhé +388F=>tóu +3891=>tuí +3892=>chá +3893=>yǎo +3894=>zǒng +3896=>pān +3897=>qiào +3898=>lián +3899=>qín +389A=>lǔ +389B=>yàn +389C=>kàng +389D=>sū +389E=>yì +389F=>chān +38A0=>jiǒng +38A1=>jiǎng +38A3=>jìng +38A5=>dòng +38A7=>juàn +38A8=>hàn +38A9=>dì +38AC=>hóng +38AE=>chí +38AF=>diāo +38B0=>bì +38B2=>xùn +38B3=>lú +38B5=>xié +38B6=>bì +38B8=>bì +38BA=>xián +38BB=>ruì +38BC=>biè +38BD=>ěr +38BE=>juàn +38C0=>zhèn +38C1=>bèi +38C2=>è +38C3=>yǔ +38C4=>qú +38C5=>zàn +38C6=>mí +38C7=>yì +38C8=>sì +38CC=>shàn +38CD=>tái +38CE=>mù +38CF=>jìng +38D0=>biàn +38D1=>róng +38D2=>cèng +38D3=>càn +38D4=>dīng +38D9=>dí +38DA=>tǒng +38DB=>tà +38DC=>xíng +38DD=>sōng +38DE=>duó +38DF=>xì +38E0=>tāo +38E2=>tí +38E3=>shàn +38E4=>jiàn +38E5=>zhì +38E6=>wēi +38E7=>yìn +38EA=>huǎn +38EB=>zhǒng +38EC=>qì +38ED=>zōng +38EF=>xiè +38F0=>xiè +38F1=>zé +38F2=>wéi +38F5=>tà +38F6=>zhān +38F7=>nìng +38FB=>yì +38FC=>rěn +38FD=>shù +38FE=>chà +38FF=>zhuó +3901=>miǎn +3902=>jí +3903=>fáng +3904=>pèi +3905=>ài +3906=>fàn +3907=>ǎo +3908=>qìn +3909=>qiā +390A=>xiào +390B=>fēn +390C=>gān +390D=>qiāo +390E=>gē +390F=>tóng +3910=>chān +3911=>yòu +3912=>gāo +3913=>bèn +3914=>fù +3915=>chù +3916=>zhù +3918=>zhòu +391A=>háng +391B=>nín +391C=>jué +391D=>chōng +391E=>chà +391F=>kǒng +3920=>liè +3921=>lì +3922=>yù +3924=>yú +3925=>hài +3926=>lì +3927=>hóu +3928=>gǒng +3929=>kè +392A=>yuàn +392B=>dé +392C=>huì +392E=>guàng +392F=>jiǒng +3930=>zuò +3931=>fù +3932=>qiè +3933=>běi +3934=>chè +3935=>cí +3936=>máng +3937=>hān +3938=>xì +3939=>qiú +393A=>huǎng +393D=>chóu +393E=>sàn +393F=>yān +3940=>zhí +3941=>dé +3942=>tè +3943=>mèn +3944=>líng +3945=>shòu +3946=>tuì +3947=>cán +3948=>dié +3949=>chè +394A=>péng +394B=>yī +394C=>jú +394D=>jì +394E=>lái +394F=>tiǎn +3950=>yuàn +3952=>cǎi +3953=>qī +3954=>yù +3955=>lián +3956=>cōng +395A=>yú +395B=>jí +395C=>wèi +395D=>mǐ +395E=>suì +395F=>xié +3960=>xū +3961=>chì +3962=>qiú +3963=>huì +3965=>yú +3966=>qiè +3967=>shùn +3968=>shuì +3969=>duǒ +396A=>lóu +396C=>páng +396D=>tài +396E=>zhòu +396F=>yǐn +3970=>sāo +3971=>fěi +3972=>chēn +3973=>yuán +3974=>yí +3975=>hùn +3976=>sè +3977=>yè +3978=>mǐn +3979=>fěn +397A=>hé +397C=>yìn +397D=>cè +397E=>nì +397F=>ào +3980=>féng +3981=>lián +3982=>cháng +3983=>chǎn +3984=>má +3985=>diē +3986=>hū +3987=>lù +3989=>yì +398A=>huá +398B=>zhā +398C=>hū +398D=>è +398E=>huò +398F=>sǔn +3990=>nì +3991=>xiàn +3992=>lí +3993=>xiàn +3994=>yàn +3995=>lóng +3996=>mèn +3997=>jīn +3998=>jī +399A=>biǎn +399B=>yǔ +399C=>huò +399D=>miǎo +399E=>chóu +399F=>mái +39A1=>lè +39A2=>jié +39A3=>wèi +39A4=>yì +39A5=>xuān +39A6=>xì +39A7=>cǎn +39A8=>lán +39A9=>yǐn +39AA=>xiè +39AB=>zā +39AC=>luǒ +39AD=>líng +39AE=>qián +39AF=>huò +39B0=>jiān +39B1=>wǒ +39B4=>gé +39B5=>zhū +39B6=>dié +39B7=>yǒng +39B8=>jǐ +39B9=>yáng +39BA=>rù +39BB=>xí +39BC=>shuàng +39BD=>yù +39BE=>yí +39BF=>qiǎn +39C0=>jí +39C1=>qù +39C2=>tián +39C3=>shōu +39C4=>qiǎn +39C5=>mù +39C6=>jīn +39C7=>mǎo +39C8=>yǐn +39C9=>gài +39CA=>pō +39CB=>xuǎn +39CC=>mào +39CD=>fǎng +39CE=>yá +39CF=>gāng +39D0=>sǒng +39D1=>huī +39D2=>yù +39D3=>guā +39D4=>guài +39D5=>liǔ +39D6=>è +39D7=>zǐ +39D8=>zì +39D9=>bì +39DA=>wǎ +39DC=>liè +39DF=>kuǎi +39E1=>hài +39E2=>yīn +39E3=>zhū +39E4=>chòng +39E5=>xiǎn +39E6=>xuàn +39E8=>qiú +39E9=>pèi +39EA=>guǐ +39EB=>ér +39EC=>gǒng +39ED=>qióng +39EE=>hū +39EF=>lǎo +39F0=>lì +39F1=>chèn +39F2=>sǎn +39F3=>zhuò +39F4=>wǒ +39F5=>póu +39F6=>kēng +39F7=>tùn +39F8=>pēng +39F9=>tè +39FA=>tà +39FB=>zhuó +39FC=>biào +39FD=>gù +39FE=>hū +3A00=>bǐng +3A01=>zhì +3A02=>dǒng +3A03=>duǐ +3A04=>zhōu +3A05=>nèi +3A06=>lǐn +3A07=>pó +3A08=>jǐ +3A09=>mín +3A0A=>wěi +3A0B=>chě +3A0C=>gòu +3A0D=>bāng +3A0E=>rú +3A0F=>tān +3A10=>bǔ +3A11=>zōng +3A12=>kuī +3A13=>láo +3A14=>hàn +3A15=>yíng +3A16=>zhì +3A17=>jié +3A18=>xǐng +3A19=>xié +3A1A=>xún +3A1B=>shǎn +3A1C=>qián +3A1D=>xiē +3A1E=>sù +3A1F=>hāi +3A20=>mì +3A21=>hún +3A22=>pī +3A24=>huì +3A25=>nà +3A26=>sǒng +3A27=>bèn +3A28=>chōu +3A29=>jié +3A2A=>huàng +3A2B=>lǎn +3A2D=>hù +3A2E=>dōu +3A2F=>huò +3A30=>gǔn +3A31=>yáo +3A32=>cè +3A33=>guǐ +3A34=>jiàn +3A35=>jiǎn +3A36=>dǎo +3A37=>jìn +3A38=>mà +3A39=>huì +3A3A=>miǎn +3A3B=>cán +3A3C=>lüè +3A3D=>pì +3A3E=>yàng +3A3F=>jù +3A40=>jù +3A41=>què +3A43=>qiān +3A44=>shāi +3A46=>jiù +3A47=>huò +3A48=>yǔn +3A49=>dá +3A4A=>xuān +3A4B=>xiāo +3A4C=>fèi +3A4D=>cè +3A4E=>yè +3A50=>dèn +3A52=>qín +3A53=>huǐ +3A54=>tún +3A56=>qiáng +3A57=>xí +3A58=>nǐ +3A59=>sāi +3A5A=>méng +3A5B=>tuán +3A5C=>lǎn +3A5D=>háo +3A5E=>cì +3A5F=>zhài +3A60=>āo +3A61=>luǒ +3A62=>miè +3A64=>fū +3A66=>xié +3A67=>bó +3A68=>huì +3A69=>qǐng +3A6A=>xié +3A6D=>bó +3A6E=>qián +3A6F=>pó +3A70=>jiǎo +3A71=>jué +3A72=>kǔn +3A73=>sǒng +3A74=>jú +3A75=>è +3A76=>niè +3A77=>qiān +3A78=>dié +3A79=>dié +3A7B=>qī +3A7C=>zhī +3A7D=>qí +3A7E=>zhuì +3A7F=>kū +3A80=>yú +3A81=>qín +3A82=>kū +3A83=>hé +3A84=>fú +3A86=>dǐ +3A87=>xiàn +3A88=>guì +3A89=>hé +3A8A=>qún +3A8B=>hàn +3A8C=>tǒng +3A8D=>bó +3A8E=>shǎn +3A8F=>bǐ +3A90=>lù +3A91=>yè +3A92=>ní +3A93=>chuái +3A94=>sàn +3A95=>diào +3A96=>lù +3A97=>tǒu +3A98=>liǎn +3A99=>kě +3A9A=>sàn +3A9B=>zhěn +3A9C=>chuǎi +3A9D=>liàn +3A9E=>mào +3AA0=>qiān +3AA1=>kài +3AA2=>shǎo +3AA3=>xiāo +3AA4=>bì +3AA5=>zhā +3AA6=>yìn +3AA7=>xī +3AA8=>shàn +3AA9=>sù +3AAA=>sà +3AAB=>ruì +3AAC=>chuō +3AAD=>lú +3AAE=>líng +3AAF=>chá +3AB1=>huàn +3AB4=>jiá +3AB5=>bàn +3AB6=>hú +3AB7=>dǒu +3AB9=>lǒu +3ABA=>jū +3ABB=>juàn +3ABC=>kě +3ABD=>suǒ +3ABE=>luò +3ABF=>zhé +3AC0=>dǐng +3AC1=>duàn +3AC2=>zhù +3AC3=>yǎn +3AC4=>páng +3AC5=>chá +3ACA=>yǐ +3ACD=>yóu +3ACE=>huī +3ACF=>yǎo +3AD0=>yǎo +3AD1=>zhǐ +3AD2=>gǒng +3AD3=>qǐ +3AD4=>gèn +3AD7=>hòu +3AD8=>mì +3AD9=>fú +3ADA=>hū +3ADB=>guàng +3ADC=>tǎn +3ADD=>dī +3ADF=>yán +3AE2=>qù +3AE4=>chǎng +3AE5=>mǐng +3AE6=>tāo +3AE7=>bào +3AE8=>ān +3AEB=>xiǎn +3AEF=>mào +3AF0=>làng +3AF1=>nǎn +3AF2=>bèi +3AF3=>chén +3AF5=>fēi +3AF6=>zhǒu +3AF7=>jī +3AF8=>jiē +3AF9=>shù +3AFB=>kùn +3AFC=>dié +3AFD=>lù +3B02=>yú +3B03=>tái +3B04=>chàn +3B05=>màn +3B06=>mǐn +3B07=>huàn +3B08=>wēn +3B09=>nuǎn +3B0A=>huàn +3B0B=>hóu +3B0C=>jìng +3B0D=>bó +3B0E=>xiǎn +3B0F=>lì +3B10=>jìn +3B12=>mǎng +3B13=>piào +3B14=>háo +3B15=>yáng +3B17=>xiàn +3B18=>sù +3B19=>wěi +3B1A=>chè +3B1B=>xī +3B1C=>jìn +3B1D=>céng +3B1E=>hè +3B1F=>fēn +3B20=>shài +3B21=>líng +3B23=>duì +3B24=>qī +3B25=>pù +3B26=>yuè +3B27=>bó +3B29=>huì +3B2A=>dié +3B2B=>yàn +3B2C=>jù +3B2D=>jiào +3B2E=>nàn +3B2F=>liè +3B30=>yú +3B31=>tì +3B32=>tiān +3B33=>wǔ +3B34=>hǒng +3B35=>xiáo +3B36=>hào +3B38=>tiāo +3B39=>zhēng +3B3B=>huāng +3B3C=>fù +3B3F=>tūn +3B41=>réng +3B42=>jiǎo +3B44=>xìn +3B47=>yuàn +3B48=>jué +3B49=>huá +3B4B=>bàng +3B4C=>móu +3B4E=>gāng +3B4F=>wěi +3B51=>mèi +3B52=>sì +3B53=>biàn +3B54=>lú +3B55=>qū +3B58=>gé +3B59=>zhé +3B5A=>lǚ +3B5B=>pài +3B5C=>róng +3B5D=>qiú +3B5E=>liè +3B5F=>gǒng +3B60=>xiǎn +3B61=>xì +3B62=>xīn +3B64=>niǎo +3B68=>xié +3B69=>liè +3B6A=>fū +3B6B=>cuó +3B6C=>zhuó +3B6D=>bā +3B6E=>zuò +3B6F=>zhé +3B70=>zuī +3B71=>hé +3B72=>jí +3B74=>jiān +3B78=>tú +3B79=>xián +3B7A=>yǎn +3B7B=>táng +3B7C=>tà +3B7D=>dǐ +3B7E=>jué +3B7F=>áng +3B80=>hán +3B81=>xiáo +3B82=>jú +3B83=>wēi +3B84=>bǎng +3B85=>zhuī +3B86=>niè +3B87=>tiàn +3B88=>nài +3B8B=>yǒu +3B8C=>mián +3B8F=>nài +3B90=>shěng +3B91=>chā +3B92=>yān +3B93=>gèn +3B94=>chòng +3B95=>ruǎn +3B96=>jiá +3B97=>qín +3B98=>máo +3B99=>è +3B9A=>lì +3B9B=>chí +3B9C=>zāng +3B9D=>hé +3B9E=>jié +3B9F=>niǎn +3BA1=>guàn +3BA2=>hóu +3BA3=>gài +3BA5=>bèn +3BA6=>suǒ +3BA7=>wū +3BA8=>jì +3BA9=>xī +3BAA=>qióng +3BAB=>hé +3BAC=>wēng +3BAD=>xián +3BAE=>jié +3BAF=>hún +3BB0=>pí +3BB1=>shēn +3BB2=>chōu +3BB3=>zhèn +3BB5=>zhān +3BB6=>shuò +3BB7=>jī +3BB8=>sòng +3BB9=>zhǐ +3BBA=>běn +3BBE=>lǎng +3BBF=>bì +3BC0=>xuàn +3BC1=>péi +3BC2=>dài +3BC4=>zhī +3BC5=>pí +3BC6=>chǎn +3BC7=>bì +3BC8=>sù +3BC9=>huò +3BCA=>hén +3BCB=>jiǒng +3BCC=>chuán +3BCD=>jiǎng +3BCE=>nèn +3BCF=>gǔ +3BD0=>fǎng +3BD3=>tà +3BD4=>cuì +3BD5=>xī +3BD6=>dé +3BD7=>xián +3BD8=>kuǎn +3BD9=>zhé +3BDA=>tā +3BDB=>hú +3BDC=>cuì +3BDD=>lù +3BDE=>juàn +3BDF=>lù +3BE0=>qiàn +3BE1=>pào +3BE2=>zhèn +3BE4=>lì +3BE5=>cáo +3BE6=>qí +3BE9=>tì +3BEA=>líng +3BEB=>qú +3BEC=>liǎn +3BED=>lǔ +3BEE=>shú +3BEF=>gòng +3BF0=>zhé +3BF1=>pāo +3BF2=>jìn +3BF3=>qíng +3BF6=>zōng +3BF7=>pú +3BF8=>jǐn +3BF9=>biǎo +3BFA=>jiàn +3BFB=>gǔn +3BFE=>zāo +3BFF=>liè +3C00=>lí +3C01=>luǒ +3C02=>shěn +3C03=>mián +3C04=>jiàn +3C05=>dí +3C06=>bèi +3C08=>liǎn +3C0A=>xián +3C0B=>pín +3C0C=>què +3C0D=>lóng +3C0E=>zuì +3C10=>jué +3C11=>shān +3C12=>xué +3C14=>xiè +3C16=>lǎn +3C17=>qí +3C18=>yí +3C19=>nuó +3C1A=>lí +3C1B=>yuè +3C1D=>yǐ +3C1E=>chī +3C1F=>jì +3C20=>hāng +3C21=>xiè +3C22=>kēng +3C23=>zī +3C24=>hē +3C25=>xì +3C26=>qù +3C27=>hāi +3C28=>xiā +3C29=>hāi +3C2A=>guī +3C2B=>chān +3C2C=>xún +3C2D=>xū +3C2E=>shèn +3C2F=>kòu +3C30=>xiā +3C31=>shà +3C32=>yū +3C33=>yà +3C34=>pǒu +3C35=>zú +3C36=>yǒu +3C37=>zì +3C38=>liǎn +3C39=>xiān +3C3A=>xià +3C3B=>yǐ +3C3C=>shà +3C3D=>yàn +3C3E=>jiào +3C3F=>xī +3C40=>chǐ +3C41=>shì +3C42=>kāng +3C43=>yǐn +3C44=>hēi +3C45=>yì +3C46=>xī +3C47=>sè +3C48=>jìn +3C49=>yè +3C4A=>yōu +3C4B=>què +3C4C=>yé +3C4D=>luán +3C4E=>kūn +3C4F=>zhèng +3C54=>xiē +3C56=>cuì +3C57=>xiū +3C58=>àn +3C59=>xiǔ +3C5A=>cán +3C5B=>chuǎn +3C5C=>zhá +3C5E=>yì +3C5F=>pī +3C60=>kū +3C61=>shēng +3C62=>láng +3C63=>tuǐ +3C64=>xī +3C65=>líng +3C66=>qī +3C67=>wò +3C68=>liàn +3C69=>dú +3C6A=>mèn +3C6B=>làn +3C6C=>wěi +3C6D=>duàn +3C6E=>kuài +3C6F=>ái +3C70=>zǎi +3C71=>huì +3C72=>yì +3C73=>mò +3C74=>zì +3C75=>fèn +3C76=>péng +3C78=>bì +3C79=>lì +3C7A=>lú +3C7B=>luò +3C7C=>hāi +3C7D=>zhěn +3C7E=>gāi +3C7F=>què +3C80=>zhēn +3C81=>kōng +3C82=>chéng +3C83=>jiù +3C84=>jué +3C85=>jì +3C86=>líng +3C88=>sháo +3C89=>què +3C8A=>ruì +3C8B=>chuò +3C8C=>nèng +3C8D=>zhī +3C8E=>lóu +3C8F=>pāo +3C92=>bào +3C93=>róng +3C94=>xiān +3C95=>lèi +3C96=>xiāo +3C97=>fū +3C98=>qú +3C9A=>shā +3C9B=>zhǐ +3C9C=>tán +3C9D=>rǒng +3C9E=>sū +3C9F=>yǐng +3CA0=>máo +3CA1=>nài +3CA2=>biàn +3CA4=>shuāi +3CA5=>táng +3CA6=>hàn +3CA7=>sào +3CA8=>róng +3CAA=>dēng +3CAB=>pú +3CAC=>jiāo +3CAD=>tǎn +3CAF=>rán +3CB0=>níng +3CB1=>liè +3CB2=>dié +3CB3=>dié +3CB4=>zhòng +3CB6=>lǜ +3CB7=>dàn +3CB8=>xī +3CB9=>guǐ +3CBA=>jí +3CBB=>nì +3CBC=>yì +3CBD=>niàn +3CBE=>yǔ +3CBF=>wǎng +3CC0=>guò +3CC1=>zè +3CC2=>yán +3CC3=>cuì +3CC4=>xián +3CC5=>jiǎo +3CC6=>tǒu +3CC7=>fù +3CC8=>pèi +3CCA=>yōu +3CCB=>qiū +3CCC=>yā +3CCD=>bù +3CCE=>biàn +3CCF=>shì +3CD0=>zhá +3CD1=>yì +3CD2=>biàn +3CD4=>duì +3CD5=>lán +3CD6=>yī +3CD7=>chài +3CD8=>chōng +3CD9=>xuàn +3CDA=>xù +3CDB=>yú +3CDC=>xiū +3CE0=>tà +3CE1=>guō +3CE5=>lòng +3CE6=>xiè +3CE7=>chè +3CE8=>jiǎn +3CE9=>tān +3CEA=>pì +3CEB=>zǎn +3CEC=>xuán +3CED=>xián +3CEE=>niào +3CF4=>mì +3CF5=>jì +3CF6=>nǒu +3CF7=>hū +3CF8=>huā +3CF9=>wǎng +3CFA=>yóu +3CFB=>zé +3CFC=>bì +3CFD=>mǐ +3CFE=>qiāng +3CFF=>xiè +3D00=>fàn +3D01=>yì +3D02=>tān +3D03=>lèi +3D04=>yǒng +3D06=>jìn +3D07=>shè +3D08=>yìn +3D09=>jǐ +3D0B=>sù +3D0F=>wǎng +3D10=>miàn +3D11=>sù +3D12=>yì +3D13=>shāi +3D14=>xī +3D15=>jí +3D16=>luò +3D17=>yōu +3D18=>mào +3D19=>zhǎ +3D1A=>suì +3D1B=>zhì +3D1C=>biàn +3D1D=>lí +3D25=>qiào +3D26=>guàn +3D27=>xī +3D28=>zhèn +3D29=>yōng +3D2A=>niè +3D2B=>jùn +3D2C=>xiè +3D2D=>yǎo +3D2E=>xiè +3D2F=>zhī +3D30=>néng +3D32=>sī +3D33=>lǒng +3D34=>chén +3D35=>mì +3D36=>què +3D37=>dān +3D38=>shǎn +3D3C=>sù +3D3D=>xiè +3D3E=>bó +3D3F=>dǐng +3D40=>zú +3D42=>shù +3D43=>shé +3D44=>hàn +3D45=>tān +3D46=>gǎo +3D4A=>nà +3D4B=>mì +3D4C=>xún +3D4D=>mèn +3D4E=>jiàn +3D4F=>cuǐ +3D50=>jué +3D51=>hè +3D52=>fèi +3D53=>shí +3D54=>chě +3D55=>shèn +3D56=>nǜ +3D57=>píng +3D58=>màn +3D5D=>yì +3D5E=>chóu +3D60=>kū +3D61=>báo +3D62=>léi +3D63=>kě +3D64=>shà +3D65=>bì +3D66=>suí +3D67=>gé +3D68=>pì +3D69=>yì +3D6A=>xián +3D6B=>nì +3D6C=>yíng +3D6D=>zhǔ +3D6E=>chún +3D6F=>féng +3D70=>xù +3D71=>piǎo +3D72=>wǔ +3D73=>liáo +3D74=>cáng +3D75=>zòu +3D76=>zuō +3D77=>biàn +3D78=>yào +3D79=>huán +3D7A=>pài +3D7B=>xiū +3D7D=>lěi +3D7E=>qìng +3D7F=>xiào +3D80=>jiāo +3D81=>guó +3D84=>yán +3D85=>xué +3D86=>zhū +3D87=>héng +3D88=>yíng +3D89=>xī +3D8C=>lián +3D8D=>xiǎn +3D8E=>huán +3D8F=>yīn +3D91=>liàn +3D92=>shǎn +3D93=>cáng +3D94=>bèi +3D95=>jiǎn +3D96=>shù +3D97=>fàn +3D98=>diàn +3D9A=>bà +3D9B=>yú +3D9E=>nǎng +3D9F=>lěi +3DA0=>yì +3DA1=>dài +3DA3=>chán +3DA4=>chǎo +3DA5=>gān +3DA6=>jìn +3DA7=>nèn +3DAB=>liǎo +3DAC=>mò +3DAD=>yǒu +3DAF=>liù +3DB0=>hán +3DB2=>yòng +3DB3=>jìn +3DB4=>chǐ +3DB5=>rèn +3DB6=>nóng +3DB9=>hòng +3DBA=>tiàn +3DBC=>āi +3DBD=>guā +3DBE=>biāo +3DBF=>bó +3DC0=>qióng +3DC2=>shù +3DC3=>chuǐ +3DC4=>huǐ +3DC5=>chǎo +3DC6=>fù +3DC7=>huī +3DC8=>è +3DC9=>wèi +3DCA=>fén +3DCB=>tán +3DCD=>lún +3DCE=>hè +3DCF=>yǒng +3DD0=>huǐ +3DD2=>yú +3DD3=>zǒng +3DD4=>yàn +3DD5=>qiú +3DD6=>zhào +3DD7=>jiǒng +3DD8=>tái +3DDF=>tuì +3DE0=>lín +3DE1=>jiǒng +3DE2=>zhǎ +3DE3=>xīng +3DE4=>hù +3DE6=>xù +3DEA=>cuì +3DEB=>qǐng +3DEC=>mò +3DEE=>zāo +3DEF=>bèng +3DF0=>chī +3DF3=>yàn +3DF4=>gé +3DF5=>mò +3DF6=>bèi +3DF7=>juǎn +3DF8=>dié +3DF9=>zhào +3DFB=>wú +3DFC=>yàn +3DFE=>jué +3DFF=>xiān +3E00=>tái +3E01=>hǎn +3E03=>diǎn +3E04=>jì +3E05=>jié +3E07=>zuǎn +3E09=>xiè +3E0A=>lài +3E0B=>fán +3E0C=>huò +3E0D=>xì +3E0E=>niè +3E0F=>mí +3E10=>rán +3E11=>cuàn +3E12=>yín +3E13=>mì +3E15=>jué +3E16=>qū +3E17=>tóng +3E18=>wàn +3E19=>zhē +3E1A=>lǐ +3E1B=>sháo +3E1C=>kòng +3E1D=>xiān +3E1E=>zhé +3E1F=>zhī +3E20=>tiǎo +3E21=>shū +3E22=>bèi +3E23=>yè +3E24=>piàn +3E25=>chàn +3E26=>hù +3E27=>kèn +3E28=>jiū +3E29=>ān +3E2A=>chún +3E2B=>qián +3E2C=>bèi +3E2D=>bā +3E2E=>fén +3E2F=>kē +3E30=>tuó +3E31=>tuó +3E32=>zuó +3E33=>líng +3E35=>guǐ +3E36=>yān +3E37=>shì +3E38=>hǒu +3E39=>liè +3E3A=>shā +3E3B=>sì +3E3D=>bèi +3E3E=>rèn +3E3F=>dú +3E40=>bó +3E41=>liáng +3E42=>qiǎn +3E43=>fèi +3E44=>jì +3E45=>zǒng +3E46=>huī +3E47=>hé +3E48=>lí +3E49=>yuán +3E4A=>yuè +3E4B=>xiū +3E4C=>chǎn +3E4D=>dí +3E4E=>léi +3E4F=>jǐn +3E50=>chóng +3E51=>sì +3E52=>pǔ +3E53=>yǎo +3E54=>jiāng +3E55=>huān +3E56=>huàn +3E57=>tāo +3E58=>rù +3E59=>wěng +3E5A=>yíng +3E5B=>ráo +3E5C=>yín +3E5D=>shì +3E5E=>yín +3E5F=>jué +3E60=>tún +3E61=>xuán +3E62=>jiā +3E63=>zhōng +3E64=>qiè +3E65=>zhù +3E66=>diāo +3E68=>yòu +3E6B=>yí +3E6C=>shǐ +3E6D=>yì +3E6E=>mò +3E71=>què +3E72=>xiāo +3E73=>wú +3E74=>gēng +3E75=>yǐng +3E76=>tíng +3E77=>shǐ +3E78=>ní +3E79=>gēng +3E7A=>tà +3E7B=>wō +3E7C=>jú +3E7D=>chǎn +3E7E=>piǎo +3E7F=>zhuó +3E80=>hū +3E81=>nǎo +3E82=>yán +3E83=>gǒu +3E84=>yǔ +3E85=>hóu +3E87=>sī +3E88=>chī +3E89=>hù +3E8A=>yàng +3E8B=>wēng +3E8C=>xiàn +3E8D=>pín +3E8E=>róng +3E8F=>lóu +3E90=>lǎo +3E91=>shān +3E92=>xiāo +3E93=>zé +3E94=>hài +3E95=>fán +3E96=>hǎn +3E97=>chān +3E98=>zhàn +3E9A=>tǎ +3E9B=>zhù +3E9C=>nóng +3E9D=>hàn +3E9E=>yú +3E9F=>zhuó +3EA0=>yòu +3EA1=>lì +3EA2=>huò +3EA3=>xī +3EA4=>xiān +3EA5=>chán +3EA6=>lián +3EA8=>sī +3EA9=>jiù +3EAA=>pú +3EAB=>qiú +3EAC=>gǒng +3EAD=>zǐ +3EAE=>yú +3EB1=>réng +3EB2=>niǔ +3EB3=>méi +3EB4=>bā +3EB5=>jiú +3EB7=>xù +3EB8=>píng +3EB9=>biàn +3EBA=>mào +3EBF=>yí +3EC0=>yú +3EC2=>píng +3EC3=>qū +3EC4=>bǎo +3EC5=>huì +3EC9=>bù +3ECA=>máng +3ECB=>là +3ECC=>tú +3ECD=>wú +3ECE=>lì +3ECF=>líng +3ED1=>jì +3ED2=>jùn +3ED3=>zōu +3ED4=>duǒ +3ED5=>jué +3ED6=>dài +3ED7=>bèi +3EDD=>là +3EDE=>bīn +3EDF=>suí +3EE0=>tú +3EE1=>xuē +3EE7=>duò +3EEA=>suì +3EEB=>bì +3EEC=>tū +3EED=>sè +3EEE=>càn +3EEF=>tú +3EF0=>miǎn +3EF1=>jīn +3EF2=>lǚ +3EF5=>zhàn +3EF6=>bǐ +3EF7=>jí +3EF8=>zēn +3EF9=>xuān +3EFA=>lì +3EFD=>suì +3EFE=>yōng +3EFF=>shǔ +3F02=>é +3F07=>qióng +3F08=>luó +3F09=>zhèn +3F0A=>tún +3F0B=>gū +3F0C=>yǔ +3F0D=>lěi +3F0E=>bó +3F0F=>něi +3F10=>pián +3F11=>liàn +3F12=>tǎng +3F13=>lián +3F14=>wēn +3F15=>dāng +3F16=>lì +3F17=>tíng +3F18=>wǎ +3F19=>zhòu +3F1A=>gāng +3F1B=>xíng +3F1C=>àng +3F1D=>fàn +3F1E=>pèng +3F1F=>bó +3F20=>tuó +3F21=>shū +3F22=>yí +3F23=>bó +3F24=>qiè +3F25=>tǒu +3F26=>gǒng +3F27=>tóng +3F28=>hán +3F29=>chéng +3F2A=>jié +3F2B=>huàn +3F2C=>xìng +3F2D=>diàn +3F2E=>chāi +3F2F=>dòng +3F30=>pí +3F31=>ruǎn +3F32=>liè +3F33=>shěng +3F34=>ǒu +3F35=>dì +3F36=>yú +3F37=>chuán +3F38=>róng +3F39=>kāng +3F3A=>táng +3F3B=>cóng +3F3C=>piáo +3F3D=>chuǎng +3F3E=>lù +3F3F=>tóng +3F40=>zhèng +3F41=>lì +3F42=>sà +3F43=>pān +3F44=>sī +3F46=>dāng +3F47=>hú +3F48=>yì +3F49=>xiàn +3F4A=>xiè +3F4B=>luó +3F4C=>liù +3F4E=>tán +3F4F=>gàn +3F51=>tán +3F55=>yóu +3F56=>nán +3F58=>gǎng +3F59=>jùn +3F5A=>chì +3F5B=>gōu +3F5C=>wǎn +3F5D=>lì +3F5E=>liú +3F5F=>liè +3F60=>xiá +3F61=>bēi +3F62=>ǎn +3F63=>yù +3F64=>jú +3F65=>róu +3F66=>xún +3F67=>zī +3F68=>cuó +3F69=>càn +3F6A=>zěng +3F6B=>yōng +3F6C=>fù +3F6D=>ruǎn +3F6F=>xí +3F70=>shù +3F71=>jiǎo +3F72=>jiǎo +3F73=>xū +3F74=>zhàng +3F77=>shuì +3F78=>chén +3F79=>fǎn +3F7A=>jí +3F7B=>zhī +3F7D=>gù +3F7E=>wù +3F80=>qiè +3F81=>shù +3F82=>hāi +3F83=>tuó +3F84=>dú +3F85=>zǐ +3F86=>rán +3F87=>mù +3F88=>fù +3F89=>líng +3F8A=>jí +3F8B=>xiū +3F8C=>xuǎn +3F8D=>nái +3F8E=>yā +3F8F=>jiè +3F90=>lì +3F91=>dá +3F92=>rú +3F93=>yuān +3F94=>lǚ +3F95=>shěn +3F96=>lǐ +3F97=>liàng +3F98=>gěng +3F99=>xìn +3F9A=>xiē +3F9B=>qǐn +3F9C=>qiè +3F9D=>chè +3F9E=>yóu +3F9F=>bù +3FA0=>kuáng +3FA1=>què +3FA2=>ài +3FA3=>qīn +3FA4=>qiāng +3FA5=>chù +3FA6=>pèi +3FA7=>kuò +3FA8=>yī +3FA9=>guāi +3FAA=>shěng +3FAB=>piān +3FAD=>zhòu +3FAE=>huáng +3FAF=>huī +3FB0=>hú +3FB1=>bèi +3FB4=>zhā +3FB5=>jì +3FB6=>gǔ +3FB7=>xī +3FB8=>gǎo +3FB9=>chái +3FBA=>mà +3FBB=>zhù +3FBC=>tuǐ +3FBD=>zhuì +3FBE=>xiān +3FBF=>láng +3FC3=>zhì +3FC4=>ài +3FC5=>xiǎn +3FC6=>guō +3FC7=>xí +3FC9=>tuǐ +3FCA=>cǎn +3FCB=>sào +3FCC=>xiān +3FCD=>jiè +3FCE=>fèn +3FCF=>qún +3FD1=>yào +3FD2=>dǎo +3FD3=>jiá +3FD4=>lěi +3FD5=>yán +3FD6=>lú +3FD7=>tuí +3FD8=>yíng +3FD9=>pì +3FDA=>luò +3FDB=>lì +3FDC=>biě +3FDE=>mào +3FDF=>bái +3FE0=>huàng +3FE2=>yào +3FE3=>hē +3FE4=>chǔn +3FE5=>hé +3FE6=>nìng +3FE7=>chóu +3FE8=>lì +3FE9=>tǎng +3FEA=>huán +3FEB=>bì +3FEC=>bā +3FED=>chè +3FEE=>yàng +3FEF=>dá +3FF0=>áo +3FF1=>xué +3FF3=>zī +3FF4=>dā +3FF5=>rǎn +3FF6=>bāng +3FF7=>cuó +3FF8=>wǎn +3FF9=>tà +3FFA=>báo +3FFB=>gān +3FFC=>yán +3FFD=>xī +3FFE=>zhù +3FFF=>yǎ +4000=>fàn +4001=>yòu +4002=>ān +4003=>tuí +4004=>méng +4005=>shè +4006=>jìn +4007=>gǔ +4008=>jì +4009=>qiáo +400A=>jiǎo +400B=>yán +400C=>xì +400D=>kàn +400E=>miǎn +400F=>xuàn +4010=>shān +4011=>wò +4012=>qiān +4013=>huàn +4014=>rèn +4015=>zhèn +4016=>tiān +4017=>jué +4018=>xié +4019=>qì +401A=>áng +401B=>mèi +401C=>gǔ +401E=>tāo +401F=>fán +4020=>jù +4021=>chàn +4022=>shùn +4023=>bì +4024=>mào +4025=>shuò +4026=>gǔ +4027=>hǒng +4028=>huà +4029=>luò +402A=>háng +402B=>jiá +402C=>quán +402D=>gāi +402E=>huāng +402F=>bǔ +4030=>gǔ +4031=>fēng +4032=>mù +4033=>ài +4034=>yǐng +4035=>shùn +4036=>liàng +4037=>jié +4038=>chì +4039=>jié +403A=>chōu +403B=>pìng +403C=>chēn +403D=>yán +403E=>dǔ +403F=>dì +4041=>liàng +4042=>xiàn +4043=>biāo +4044=>xìng +4045=>měng +4046=>yè +4047=>mì +4048=>qì +4049=>qì +404A=>wò +404B=>xiè +404C=>yù +404D=>qià +404E=>chéng +404F=>yǎo +4050=>yīng +4051=>yáng +4052=>jí +4053=>zōng +4054=>xuān +4055=>mín +4056=>lōu +4057=>kǎi +4058=>yǎo +4059=>yǎn +405A=>sǔn +405B=>guì +405C=>huàng +405D=>yíng +405E=>shěng +405F=>chá +4060=>lián +4062=>xuán +4063=>chuán +4064=>chè +4065=>nì +4066=>qù +4067=>miáo +4068=>huò +4069=>yú +406A=>zhǎn +406B=>hú +406C=>céng +406D=>biāo +406E=>qián +406F=>xī +4070=>jiǎng +4071=>kōu +4072=>mái +4073=>mǎng +4074=>zhǎn +4075=>biǎn +4076=>jī +4077=>jué +4078=>náng +4079=>bì +407A=>shì +407B=>shuò +407C=>mò +407D=>liè +407E=>miè +407F=>mò +4080=>xī +4081=>chán +4082=>qú +4083=>jiào +4084=>huò +4085=>xiān +4086=>xù +4087=>niǔ +4088=>tóng +4089=>hóu +408A=>yù +408C=>chōng +408D=>bó +408E=>zuǎn +408F=>diāo +4090=>zhuō +4091=>jī +4092=>qià +4094=>xìng +4095=>huì +4096=>shí +4097=>kū +4099=>duī +409A=>yáo +409B=>yú +409C=>bàng +409D=>jié +409E=>zhè +409F=>jiā +40A0=>shǐ +40A1=>dǐ +40A2=>dǒng +40A3=>cí +40A4=>fù +40A5=>mín +40A6=>zhēn +40A7=>zhěn +40A9=>yàn +40AA=>qiǎo +40AB=>hāng +40AC=>gǒng +40AD=>qiāo +40AE=>lüè +40AF=>guài +40B0=>là +40B1=>ruì +40B2=>fǎ +40B3=>cuǒ +40B4=>yán +40B5=>gōng +40B6=>jié +40B7=>guāi +40B8=>guó +40B9=>suǒ +40BA=>wǒ +40BB=>zhèng +40BC=>niè +40BD=>diào +40BE=>lǎi +40BF=>tà +40C0=>cuì +40C1=>yā +40C2=>gǔn +40C5=>dī +40C7=>mián +40C8=>jiē +40C9=>mín +40CA=>jǔ +40CB=>yú +40CC=>zhēn +40CD=>zhào +40CE=>zhà +40CF=>xīng +40D1=>bān +40D2=>hé +40D3=>gòu +40D4=>hóng +40D5=>láo +40D6=>wù +40D7=>bō +40D8=>kēng +40D9=>lù +40DA=>cù +40DB=>lián +40DC=>yī +40DD=>qiào +40DE=>shú +40E0=>xuàn +40E1=>jīn +40E2=>qīn +40E3=>huǐ +40E4=>sù +40E5=>chuáng +40E6=>dūn +40E7=>lóng +40E9=>náo +40EA=>tán +40EB=>dǎn +40EC=>wěi +40ED=>gǎn +40EE=>dá +40EF=>lì +40F0=>cā +40F1=>xiàn +40F2=>pán +40F3=>là +40F4=>zhū +40F5=>niǎo +40F6=>huái +40F7=>yíng +40F8=>xiàn +40F9=>làn +40FA=>mó +40FB=>bà +40FD=>guǐ +40FE=>bǐ +40FF=>fū +4100=>huò +4101=>yì +4102=>liù +4104=>yīn +4105=>juàn +4106=>huó +4107=>chéng +4108=>dòu +4109=>é +410B=>yǎn +410C=>zhuì +410D=>zhà +410E=>qǐ +410F=>yú +4110=>quàn +4111=>huó +4112=>niè +4113=>huáng +4114=>jǔ +4115=>shè +4118=>péng +4119=>míng +411A=>cáo +411B=>lóu +411C=>lí +411D=>chuāng +411F=>cuī +4120=>shàn +4121=>dān +4122=>qí +4124=>lài +4125=>líng +4126=>liǎo +4127=>réng +4128=>yú +4129=>yì +412A=>diǎo +412B=>qǐ +412C=>yí +412D=>nián +412E=>fū +412F=>jiǎn +4130=>yá +4131=>fāng +4132=>ruì +4133=>xiān +4136=>bì +4137=>shí +4138=>pò +4139=>nián +413A=>zhì +413B=>táo +413C=>tiǎn +413D=>tiǎn +413E=>rù +413F=>yì +4140=>liè +4141=>àn +4142=>hé +4143=>qióng +4144=>lì +4145=>guī +4146=>zì +4147=>sù +4148=>yuàn +4149=>yà +414A=>chá +414B=>wǎn +414C=>juān +414D=>tǐng +414E=>yǒu +414F=>huì +4150=>jiǎn +4151=>ruí +4152=>máng +4153=>jǔ +4154=>zī +4155=>jū +4156=>ān +4157=>suì +4158=>lái +4159=>hùn +415A=>quǎn +415B=>chāng +415C=>duò +415D=>kōng +415E=>nè +415F=>cǎn +4160=>tí +4161=>xǔ +4162=>jiù +4163=>huáng +4164=>qì +4165=>jié +4166=>máo +4167=>yān +4169=>zhǐ +416A=>tuí +416C=>ài +416D=>páng +416E=>càng +416F=>táng +4170=>ěn +4171=>hùn +4172=>qí +4173=>chú +4174=>suǒ +4175=>zhuó +4176=>nòu +4177=>tú +4178=>shēn +4179=>lǒu +417A=>biāo +417B=>lí +417C=>mán +417D=>xīn +417E=>cén +417F=>huáng +4180=>měi +4181=>gāo +4182=>lián +4183=>dào +4184=>zhǎn +4185=>zī +4188=>zhì +4189=>bà +418A=>cuì +418B=>qiū +418D=>lóng +418E=>xiān +418F=>fèi +4190=>guó +4191=>chéng +4192=>jiù +4193=>è +4194=>chōng +4195=>yuè +4196=>hóng +4197=>yǎo +4198=>yā +4199=>yáo +419A=>tóng +419B=>zhà +419C=>yòu +419D=>xuè +419E=>yǎo +419F=>kè +41A0=>huàn +41A1=>láng +41A2=>yuè +41A3=>chén +41A6=>shèn +41A8=>níng +41A9=>míng +41AA=>hōng +41AB=>chuāng +41AC=>yǔn +41AD=>xuān +41AE=>jìn +41AF=>zhuó +41B0=>yū +41B1=>tān +41B2=>kāng +41B3=>qióng +41B5=>chéng +41B6=>jiū +41B7=>xuè +41B8=>zhēng +41B9=>chōng +41BA=>pān +41BB=>qiào +41BD=>qú +41BE=>lán +41BF=>yì +41C0=>róng +41C1=>sī +41C2=>qiān +41C3=>sì +41C5=>fá +41C7=>méng +41C8=>huà +41CB=>hài +41CC=>qiào +41CD=>chù +41CE=>què +41CF=>duì +41D0=>lì +41D1=>bà +41D2=>jiè +41D3=>xū +41D4=>luò +41D6=>yǔn +41D7=>zhōng +41D8=>hù +41D9=>yǐn +41DB=>zhǐ +41DC=>qiǎn +41DE=>gān +41DF=>jiàn +41E0=>zhù +41E1=>zhù +41E2=>kǔ +41E3=>niè +41E4=>ruì +41E5=>zé +41E6=>ǎng +41E7=>zhì +41E8=>gòng +41E9=>yì +41EA=>chī +41EB=>jī +41EC=>zhū +41ED=>lǎo +41EE=>rèn +41EF=>róng +41F0=>zhēng +41F1=>nà +41F2=>cè +41F5=>yí +41F6=>jué +41F7=>bié +41F8=>chéng +41F9=>jùn +41FA=>dòu +41FB=>wěi +41FC=>yì +41FD=>zhé +41FE=>yán +4200=>sān +4201=>lún +4202=>píng +4203=>zhǎo +4204=>hán +4205=>yù +4206=>dài +4207=>zhào +4208=>féi +4209=>shà +420A=>líng +420B=>tà +420C=>qū +420D=>máng +420E=>yè +420F=>báo +4210=>guì +4211=>guǎ +4212=>nǎn +4213=>gé +4215=>shí +4216=>kē +4217=>suǒ +4218=>cí +4219=>zhòu +421A=>tái +421B=>kuài +421C=>qìn +421D=>xū +421E=>dǔ +421F=>cè +4220=>huǎn +4221=>cōng +4222=>sǎi +4223=>zhèng +4224=>qián +4225=>jīn +4226=>zōng +4227=>wěi +422A=>xì +422B=>nà +422C=>pú +422D=>sōu +422E=>jù +422F=>zhēn +4230=>shāo +4231=>tāo +4232=>bān +4233=>tà +4234=>qiàn +4235=>wēng +4236=>róng +4237=>luò +4238=>hú +4239=>sǒu +423A=>zhōng +423B=>pú +423C=>miè +423D=>jīn +423E=>shāo +423F=>mì +4240=>shù +4241=>líng +4242=>lěi +4243=>jiǎng +4244=>léng +4245=>zhì +4246=>diǎo +4248=>sǎn +4249=>gū +424A=>fàn +424B=>mèi +424C=>suì +424D=>jiǎn +424E=>táng +424F=>xiè +4250=>kū +4251=>wú +4252=>fán +4253=>luò +4254=>cān +4255=>céng +4256=>líng +4257=>yī +4258=>cóng +4259=>yún +425A=>méng +425B=>yù +425C=>zhì +425D=>yǐ +425E=>dǎn +425F=>huò +4260=>wéi +4261=>tán +4262=>sè +4263=>xiè +4264=>sǒu +4265=>sǒng +4266=>qiān +4267=>liú +4268=>yì +426A=>lèi +426B=>lí +426C=>fèi +426D=>liè +426E=>lìn +426F=>xiàn +4270=>xiào +4271=>ōu +4272=>mí +4273=>xiān +4274=>ráng +4275=>zhuàn +4276=>shuāng +4277=>yán +4278=>biàn +4279=>líng +427A=>hóng +427B=>qí +427C=>liào +427D=>bǎn +427E=>bì +427F=>hú +4280=>hú +4282=>cè +4283=>pèi +4284=>qióng +4285=>míng +4286=>jiù +4287=>bù +4288=>méi +4289=>sǎn +428A=>wèi +428D=>lí +428E=>quǎn +4290=>hún +4291=>xiǎng +4293=>shì +4294=>yíng +4296=>nǎn +4297=>huáng +4298=>jiù +4299=>yān +429B=>sà +429C=>tuán +429D=>xiè +429E=>zhé +429F=>mén +42A0=>xì +42A1=>mán +42A3=>huáng +42A4=>tán +42A5=>xiào +42A6=>yè +42A7=>bì +42A8=>luó +42A9=>fán +42AA=>lì +42AB=>cuǐ +42AC=>chuā +42AD=>dào +42AE=>dí +42AF=>kuàng +42B0=>chú +42B1=>xiān +42B2=>chàn +42B3=>mí +42B4=>qiàn +42B5=>qiú +42B6=>zhèn +42BA=>hù +42BB=>gān +42BC=>chǐ +42BD=>guài +42BE=>mù +42BF=>bó +42C0=>huà +42C1=>gěng +42C2=>yáo +42C3=>mào +42C4=>wǎng +42C8=>rú +42C9=>xué +42CA=>zhēng +42CB=>mín +42CC=>jiǎng +42CE=>zhàn +42CF=>zuó +42D0=>yuè +42D1=>liè +42D3=>zhòu +42D4=>bì +42D5=>rèn +42D6=>yù +42D8=>chuò +42D9=>ěr +42DA=>yì +42DB=>mǐ +42DC=>qìng +42DE=>wǎng +42DF=>jì +42E0=>bǔ +42E2=>biē +42E3=>fán +42E4=>yuè +42E5=>lí +42E6=>fán +42E7=>qú +42E8=>fǔ +42E9=>ér +42EA=>ē +42EB=>zhēng +42EC=>tiān +42ED=>yù +42EE=>jìn +42EF=>qǐ +42F0=>jú +42F1=>lái +42F2=>chě +42F3=>běi +42F4=>niù +42F5=>yì +42F6=>xǔ +42F7=>móu +42F8=>xún +42F9=>fú +42FB=>nín +42FC=>tīng +42FD=>běng +42FE=>zhǎ +42FF=>wēi +4300=>kē +4301=>yāo +4302=>òu +4303=>xiāo +4304=>gěng +4305=>táng +4306=>guì +4307=>huì +4308=>tā +430A=>yáo +430B=>dā +430C=>qì +430D=>jǐn +430E=>lüè +430F=>mì +4310=>mì +4311=>jiān +4312=>lù +4313=>fán +4314=>ōu +4315=>mí +4316=>jié +4317=>fǔ +4318=>biè +4319=>huàng +431A=>sū +431B=>yáo +431C=>niè +431D=>jīn +431E=>liǎn +431F=>bó +4320=>jiān +4321=>tǐ +4322=>líng +4323=>zuǎn +4324=>shī +4325=>yǐn +4326=>dào +4327=>chóu +4328=>cā +4329=>miè +432A=>yǎn +432B=>lǎn +432C=>chóng +432D=>jiāo +432E=>shuāng +432F=>quān +4330=>niè +4331=>luò +4333=>shī +4334=>luò +4335=>zhú +4337=>chōu +4338=>juàn +4339=>jiǒng +433A=>ěr +433B=>yì +433C=>ruì +433D=>cǎi +433E=>rén +433F=>fú +4340=>lán +4341=>suì +4342=>yú +4343=>yóu +4344=>diǎn +4345=>líng +4346=>zhù +4347=>tà +4348=>píng +4349=>zhǎi +434A=>jiāo +434B=>chuí +434C=>bù +434D=>kòu +434E=>cùn +4350=>hǎn +4351=>hǎn +4352=>mǒu +4353=>hù +4354=>gōng +4355=>dī +4356=>fú +4357=>xuàn +4358=>mí +4359=>méi +435A=>làng +435B=>gù +435C=>zhào +435D=>tà +435E=>yù +435F=>zòng +4360=>lí +4361=>lù +4362=>wú +4363=>léi +4364=>jǐ +4365=>lì +4366=>lí +4368=>pō +4369=>yǎng +436A=>wà +436B=>tuó +436C=>pēng +436E=>zhào +436F=>guǐ +4371=>xú +4372=>nái +4373=>què +4374=>wěi +4375=>zhēng +4376=>dōng +4377=>wěi +4378=>bó +437A=>huàn +437B=>xuàn +437C=>zān +437D=>lì +437E=>yǎn +437F=>huáng +4380=>xuè +4381=>hú +4382=>bǎo +4383=>rǎn +4384=>xiāo +4385=>pò +4386=>liào +4387=>zhōu +4388=>yì +4389=>xù +438A=>luò +438B=>kào +438C=>chù +438E=>nà +438F=>hán +4390=>chǎo +4391=>lù +4392=>zhǎn +4393=>tà +4394=>fū +4395=>hōng +4396=>zēng +4397=>qiáo +4398=>sù +4399=>pīn +439A=>guàn +439C=>hūn +439D=>chú +439F=>ér +43A0=>ér +43A1=>ruǎn +43A2=>qǐ +43A3=>sì +43A4=>jú +43A6=>yǎn +43A7=>bàng +43A8=>yè +43A9=>zī +43AA=>nè +43AB=>chuàng +43AC=>bà +43AD=>cāo +43AE=>tì +43AF=>hàn +43B0=>zuó +43B1=>bà +43B2=>zhé +43B3=>wà +43B4=>gēng +43B5=>bì +43B6=>èr +43B7=>zhù +43B8=>wù +43B9=>wén +43BA=>zhì +43BB=>zhòu +43BC=>lù +43BD=>wén +43BE=>gǔn +43BF=>qiú +43C0=>là +43C1=>zǎi +43C2=>sǒu +43C3=>mián +43C4=>dǐ +43C5=>qì +43C6=>cáo +43C7=>piào +43C8=>lián +43C9=>shī +43CA=>lóng +43CB=>sù +43CC=>qì +43CD=>yuàn +43CE=>féng +43CF=>xū +43D0=>jué +43D1=>dì +43D2=>piàn +43D3=>guǎn +43D4=>niǔ +43D5=>rèn +43D6=>zhèn +43D7=>gài +43D8=>pì +43D9=>tǎn +43DA=>chǎo +43DB=>chǔn +43DC=>hē +43DD=>zhuān +43DE=>mò +43DF=>bié +43E0=>qì +43E1=>shì +43E2=>bǐ +43E3=>jué +43E4=>sì +43E6=>guā +43E7=>nà +43E8=>huǐ +43E9=>xī +43EA=>èr +43EB=>xiū +43EC=>móu +43EE=>xí +43EF=>zhì +43F0=>rùn +43F1=>jú +43F2=>dié +43F3=>zhè +43F4=>shào +43F5=>měng +43F6=>bì +43F7=>hàn +43F8=>yú +43F9=>xiàn +43FA=>pāng +43FB=>néng +43FC=>cán +43FD=>bù +43FF=>qǐ +4400=>jì +4401=>zhuó +4402=>lù +4403=>jùn +4404=>xiàn +4405=>xī +4406=>cǎi +4407=>wěn +4408=>zhí +4409=>zì +440A=>kūn +440B=>cōng +440C=>tiǎn +440D=>chù +440E=>dī +440F=>chǔn +4410=>qiū +4411=>zhé +4412=>zhā +4413=>róu +4414=>bǐn +4415=>jí +4416=>xī +4417=>zhū +4418=>jué +4419=>gé +441A=>jī +441B=>dā +441C=>chēn +441D=>suò +441E=>ruò +441F=>xiǎng +4420=>huǎng +4421=>qí +4422=>zhù +4423=>sǔn +4424=>chāi +4425=>wěng +4426=>kē +4427=>kào +4428=>gǔ +4429=>gāi +442A=>fàn +442B=>cōng +442C=>cáo +442D=>zhì +442E=>chǎn +442F=>léi +4430=>xiū +4431=>zhài +4432=>zhé +4433=>yú +4434=>guì +4435=>gōng +4436=>zān +4437=>dān +4438=>huò +4439=>sōu +443A=>tàn +443B=>gū +443C=>xì +443D=>mán +443E=>duó +443F=>ào +4440=>pì +4441=>wù +4442=>ǎi +4443=>méng +4444=>pì +4445=>méng +4446=>yǎng +4447=>zhì +4448=>bó +4449=>yíng +444A=>wéi +444B=>rǎng +444C=>lán +444D=>yān +444E=>chǎn +444F=>quán +4450=>zhěn +4451=>pú +4453=>tái +4454=>fèi +4455=>shǔ +4457=>dàng +4458=>cuó +4459=>tān +445A=>tián +445B=>chǐ +445C=>tà +445D=>jiǎ +445E=>shùn +445F=>huáng +4460=>liǎo +4463=>chēn +4464=>jìn +4465=>è +4466=>gōu +4467=>fú +4468=>duò +446A=>è +446B=>bēng +446C=>tāo +446D=>dì +446F=>dì +4470=>bù +4471=>wǎn +4472=>zhào +4473=>lún +4474=>qí +4475=>mù +4476=>qiàn +4478=>zōng +4479=>sōu +447B=>yóu +447C=>zhōu +447D=>tà +447F=>sù +4480=>bù +4481=>xí +4482=>jiǎng +4483=>cào +4484=>fù +4485=>téng +4486=>chè +4487=>fù +4488=>fèi +4489=>wǔ +448A=>xī +448B=>yǎng +448C=>mìng +448D=>pǎng +448E=>mǎng +448F=>sēng +4490=>méng +4491=>cǎo +4492=>tiáo +4493=>kǎi +4494=>bài +4495=>xiǎo +4496=>xìn +4497=>qì +449A=>shǎo +449B=>huàn +449C=>niú +449D=>xiáo +449E=>chén +449F=>dān +44A0=>fēng +44A1=>yǐn +44A2=>áng +44A3=>rǎn +44A4=>rì +44A5=>mán +44A6=>fàn +44A7=>qū +44A8=>shǐ +44A9=>hé +44AA=>biàn +44AB=>dài +44AC=>mò +44AD=>děng +44B0=>kuāng +44B2=>chà +44B3=>duǒ +44B4=>yǒu +44B5=>hào +44B7=>guā +44B8=>xuè +44B9=>lèi +44BA=>jǐn +44BB=>qǐ +44BC=>qū +44BD=>wǎng +44BE=>yī +44BF=>liáo +44C2=>yán +44C3=>yì +44C4=>yín +44C5=>qí +44C6=>zhé +44C7=>xì +44C8=>yì +44C9=>yé +44CA=>wú +44CB=>zhī +44CC=>zhì +44CD=>hǎn +44CE=>chuò +44CF=>fū +44D0=>chún +44D1=>píng +44D2=>kuǎi +44D3=>chóu +44D5=>tuǒ +44D6=>qióng +44D7=>cōng +44D8=>gāo +44D9=>kuā +44DA=>qū +44DB=>qū +44DC=>zhī +44DD=>mèng +44DE=>lì +44DF=>zhōu +44E0=>tà +44E1=>zhī +44E2=>gù +44E3=>liǎng +44E4=>hū +44E5=>là +44E6=>diǎn +44E7=>cì +44E8=>yīng +44EB=>qí +44ED=>chà +44EE=>mào +44EF=>dú +44F0=>yīn +44F1=>chái +44F2=>ruì +44F3=>hěn +44F4=>ruǎn +44F5=>fū +44F6=>lài +44F7=>xìng +44F8=>jiān +44F9=>yì +44FA=>měi +44FC=>máng +44FD=>jì +44FE=>suō +44FF=>hàn +4501=>lì +4502=>zǐ +4503=>zǔ +4504=>yáo +4505=>gē +4506=>lí +4507=>qǐ +4508=>gòng +4509=>lì +450A=>bīng +450B=>suō +450E=>sù +450F=>chòu +4510=>jiān +4511=>xié +4512=>bèi +4513=>xǔ +4514=>jìng +4515=>pú +4516=>líng +4517=>xiáng +4518=>zuò +4519=>diào +451A=>chún +451B=>qǐng +451C=>nán +451D=>zhāi +451E=>lǜ +451F=>yí +4520=>shǎo +4521=>yú +4522=>huá +4523=>lí +4524=>pā +4527=>lí +452A=>shuǎng +452C=>yì +452D=>nìng +452E=>sī +452F=>kù +4530=>fù +4531=>yī +4532=>dēng +4533=>rán +4534=>cè +4536=>tí +4537=>qín +4538=>biǎo +4539=>suì +453A=>wéi +453B=>dūn +453C=>sè +453D=>ài +453E=>qì +453F=>zǔn +4540=>kuǎn +4541=>fěi +4543=>yìn +4545=>sǎo +4546=>dòu +4547=>huì +4548=>xiè +4549=>zé +454A=>tán +454B=>táng +454C=>zhì +454D=>yì +454E=>fú +454F=>é +4551=>jùn +4552=>jiā +4553=>chá +4554=>xián +4555=>màn +4557=>bì +4558=>líng +4559=>jié +455A=>kuì +455B=>jiá +455D=>chēng +455E=>làng +455F=>xīng +4560=>fèi +4561=>lǘ +4562=>zhǎ +4563=>hé +4564=>jī +4565=>nǐ +4566=>yíng +4567=>xiào +4568=>téng +4569=>lǎo +456A=>zé +456B=>kuí +456D=>qián +456E=>jú +456F=>piáo +4570=>fán +4571=>tóu +4572=>lǐn +4573=>mí +4574=>zhuó +4575=>xié +4576=>hù +4577=>mí +4578=>jiē +4579=>zá +457A=>cóng +457B=>lì +457C=>rán +457D=>zhú +457E=>yín +457F=>hàn +4581=>yì +4582=>luán +4583=>yuè +4584=>rán +4585=>líng +4586=>niàng +4587=>yù +4588=>nüè +458A=>yì +458B=>nüè +458C=>yì +458D=>qián +458E=>xiá +458F=>chǔ +4590=>yín +4591=>mì +4592=>xī +4593=>nà +4594=>kǎn +4595=>zǔ +4596=>xiá +4597=>yán +4598=>tú +4599=>tī +459A=>wū +459B=>suǒ +459C=>yín +459D=>chóng +459E=>zhǒu +459F=>mǎng +45A0=>yuán +45A1=>nǜ +45A2=>miáo +45A3=>zǎo +45A4=>wǎn +45A5=>lí +45A6=>qū +45A7=>nà +45A8=>shí +45A9=>bì +45AA=>zī +45AB=>bàng +45AD=>juàn +45AE=>xiǎng +45AF=>kuí +45B0=>pài +45B1=>kuāng +45B2=>xún +45B3=>zhà +45B4=>yáo +45B5=>kūn +45B6=>huī +45B7=>xī +45B8=>é +45B9=>yáng +45BA=>tiáo +45BB=>yóu +45BC=>jué +45BD=>lí +45BF=>lí +45C0=>chēng +45C1=>jì +45C2=>hǔ +45C3=>zhàn +45C4=>fǔ +45C5=>cháng +45C6=>guǎn +45C7=>jú +45C8=>méng +45C9=>chāng +45CA=>tàn +45CB=>móu +45CC=>xīng +45CD=>lǐ +45CE=>yān +45CF=>sōu +45D0=>shī +45D1=>yì +45D2=>bìng +45D3=>cōng +45D4=>hóu +45D5=>wǎn +45D6=>dì +45D7=>jī +45D8=>gé +45D9=>hán +45DA=>bó +45DB=>xiū +45DC=>liú +45DD=>cán +45DE=>cán +45DF=>yì +45E0=>xuán +45E1=>yán +45E2=>zǎo +45E3=>hàn +45E4=>yóng +45E5=>zōng +45E7=>kāng +45E8=>yú +45E9=>qī +45EA=>zhè +45EB=>má +45EE=>shuǎng +45EF=>jìn +45F0=>guàn +45F1=>pú +45F2=>lìn +45F4=>tíng +45F5=>jiāng +45F6=>là +45F7=>yì +45F8=>yōng +45F9=>cì +45FA=>yǎn +45FB=>jié +45FC=>xūn +45FD=>wèi +45FE=>xiǎn +45FF=>níng +4600=>fù +4601=>gé +4603=>mò +4604=>zhù +4605=>nái +4606=>xiǎn +4607=>wén +4608=>lì +4609=>cán +460A=>miè +460B=>jiān +460C=>nì +460D=>chài +460E=>wān +460F=>xù +4610=>nǜ +4611=>mài +4612=>zuī +4613=>kàn +4614=>kā +4615=>háng +4618=>yù +4619=>wèi +461A=>zhú +461D=>yì +461F=>diāo +4620=>fú +4621=>bǐ +4622=>zhǔ +4623=>zǐ +4624=>shù +4625=>xiá +4626=>ní +4628=>jiǎo +4629=>xún +462A=>chōng +462B=>nòu +462C=>róng +462D=>zhì +462E=>sāng +4630=>shān +4631=>yù +4633=>jīn +4635=>lù +4636=>hān +4637=>biē +4638=>yì +4639=>zuì +463A=>zhàn +463B=>yù +463C=>wǎn +463D=>ní +463E=>guǎn +463F=>jué +4640=>běng +4641=>cán +4643=>duò +4644=>qì +4645=>yāo +4646=>kuì +4647=>ruán +4648=>hóu +4649=>xún +464A=>xiè +464C=>kuì +464E=>xié +464F=>bó +4650=>kè +4651=>cuī +4652=>xù +4653=>bǎi +4654=>ōu +4655=>zǒng +4657=>tì +4658=>chǔ +4659=>chí +465A=>niǎo +465B=>guàn +465C=>féng +465D=>xiè +465E=>dēng +465F=>wéi +4660=>jué +4661=>kuì +4662=>zèng +4663=>sà +4664=>duǒ +4665=>líng +4666=>méng +4668=>guǒ +4669=>méng +466A=>lóng +466C=>yìng +466E=>guàn +466F=>cù +4670=>lí +4671=>dú +4673=>biāo +4675=>xī +4677=>dé +4678=>dé +4679=>xiàn +467A=>lián +467C=>shào +467D=>xié +467E=>shī +467F=>wèi +4682=>hè +4683=>yóu +4684=>lù +4685=>lài +4686=>yǐng +4687=>shěng +4688=>juàn +4689=>qì +468A=>jiǎn +468B=>yùn +468D=>qì +468F=>lìn +4690=>jí +4691=>mái +4692=>chuáng +4693=>niǎn +4694=>bīn +4695=>lì +4696=>líng +4697=>gāng +4698=>chéng +4699=>xuān +469A=>xiǎn +469B=>hú +469C=>bī +469D=>zú +469E=>dǎi +469F=>dǎi +46A0=>hùn +46A1=>sāi +46A2=>chè +46A3=>tí +46A5=>nuò +46A6=>zhì +46A7=>liú +46A8=>fèi +46A9=>jiǎo +46AA=>guān +46AB=>xí +46AC=>lín +46AD=>xuān +46AE=>réng +46AF=>tǎo +46B0=>pǐ +46B1=>xìn +46B2=>shàn +46B3=>zhì +46B4=>wà +46B5=>tǒu +46B6=>tiān +46B7=>yī +46B8=>xiè +46B9=>pǐ +46BA=>yáo +46BB=>yáo +46BC=>nǜ +46BD=>hào +46BE=>nín +46BF=>yìn +46C0=>fǎn +46C1=>nán +46C2=>yāo +46C3=>wàn +46C4=>yuǎn +46C5=>xiá +46C6=>zhòu +46C7=>yuǎn +46C8=>shì +46C9=>miàn +46CA=>xī +46CB=>jì +46CC=>táo +46CD=>fèi +46CE=>xuè +46CF=>ní +46D0=>cí +46D1=>mì +46D2=>biàn +46D4=>ná +46D5=>yù +46D6=>è +46D7=>zhǐ +46D8=>rén +46D9=>xù +46DA=>lüè +46DB=>huì +46DC=>xùn +46DD=>náo +46DE=>hàn +46DF=>jiá +46E0=>dòu +46E1=>huà +46E2=>tū +46E3=>pīng +46E4=>cù +46E5=>xī +46E6=>sòng +46E7=>mí +46E8=>xìn +46E9=>wù +46EA=>qióng +46EB=>zhāng +46EC=>táo +46ED=>xìng +46EE=>jiù +46EF=>jù +46F0=>hùn +46F1=>tí +46F2=>mán +46F3=>yàn +46F4=>jī +46F5=>shòu +46F6=>lěi +46F7=>wǎn +46F8=>chè +46F9=>càn +46FA=>jiè +46FB=>yòu +46FC=>huǐ +46FD=>zhǎ +46FE=>sù +46FF=>gé +4700=>nǎo +4701=>xì +4703=>duī +4704=>chí +4705=>wéi +4706=>zhé +4707=>gǔn +4708=>chāo +4709=>chī +470A=>zāo +470B=>huì +470C=>luán +470D=>liáo +470E=>láo +470F=>tuō +4710=>huī +4711=>wù +4712=>ào +4713=>shè +4714=>suí +4715=>mài +4716=>tàn +4717=>xìn +4718=>jǐng +4719=>án +471A=>tà +471B=>chán +471C=>wèi +471D=>tuǎn +471E=>jì +471F=>chén +4720=>chè +4721=>yù +4722=>xiǎn +4723=>xīn +4727=>nǎo +4729=>yàn +472A=>qiú +472B=>jiāng +472C=>sǒng +472D=>jùn +472E=>liáo +472F=>jú +4731=>mǎn +4732=>liè +4734=>chù +4735=>chǐ +4736=>xiáng +4737=>qīn +4738=>měi +4739=>shù +473A=>chǎi +473B=>chǐ +473C=>gú +473D=>yú +473E=>yīn +4740=>liú +4741=>láo +4742=>shù +4743=>zhé +4744=>shuāng +4745=>huī +4748=>è +474A=>shà +474B=>zòng +474C=>jué +474D=>jùn +474E=>tuān +474F=>lóu +4750=>wéi +4751=>chōng +4752=>zhù +4753=>liè +4755=>zhé +4756=>zhǎo +4758=>yì +4759=>chū +475A=>ní +475B=>bō +475C=>suān +475D=>yǐ +475E=>hào +475F=>yà +4760=>huán +4761=>màn +4762=>màn +4763=>qú +4764=>lǎo +4765=>háo +4766=>zhōng +4767=>mín +4768=>xián +4769=>zhèn +476A=>shǔ +476B=>zuó +476C=>zhù +476D=>gòu +476E=>xuàn +476F=>yì +4770=>zhì +4771=>xié +4772=>jìn +4773=>cán +4775=>bù +4776=>liáng +4777=>zhī +4778=>jì +4779=>wǎn +477A=>guàn +477B=>jū +477C=>jìng +477D=>ài +477E=>fù +477F=>guì +4780=>hòu +4781=>yàn +4782=>ruǎn +4783=>zhì +4784=>biào +4785=>yí +4786=>suǒ +4787=>dié +4788=>guì +4789=>shèng +478A=>xùn +478B=>chèn +478C=>shé +478D=>qíng +4790=>chǔn +4791=>hóng +4792=>dòng +4793=>chēng +4794=>wěi +4795=>rú +4796=>shǔ +4797=>cāi +4798=>jí +4799=>zá +479A=>qí +479B=>yān +479C=>fù +479D=>yù +479E=>fú +479F=>pò +47A0=>zhī +47A1=>tǎn +47A2=>zuó +47A3=>chě +47A4=>qú +47A5=>yòu +47A6=>hé +47A7=>hòu +47A8=>guǐ +47A9=>è +47AA=>jiàng +47AB=>yǔn +47AC=>tòu +47AD=>cūn +47AE=>tū +47AF=>fù +47B0=>zuó +47B1=>hú +47B3=>bó +47B4=>zhāo +47B5=>juě +47B6=>tāng +47B7=>jué +47B8=>fù +47B9=>huáng +47BA=>chūn +47BB=>yǒng +47BC=>chuǐ +47BD=>suǒ +47BE=>chí +47BF=>qiān +47C0=>cāi +47C1=>xiáo +47C2=>mán +47C3=>cān +47C4=>qì +47C5=>jiàn +47C6=>bì +47C7=>jī +47C8=>zhí +47C9=>zhú +47CA=>qú +47CB=>zhǎn +47CC=>jí +47CD=>biān +47CF=>lì +47D0=>lì +47D1=>yuè +47D2=>quán +47D3=>chēng +47D4=>fù +47D5=>chà +47D6=>tàng +47D7=>shì +47D8=>hàng +47D9=>qiè +47DA=>qí +47DB=>bó +47DC=>nà +47DD=>tòu +47DE=>chú +47DF=>cù +47E0=>yuè +47E1=>zhī +47E2=>chén +47E3=>chù +47E4=>bì +47E5=>méng +47E6=>bá +47E7=>tián +47E8=>mín +47E9=>liě +47EA=>fěng +47EB=>chēng +47EC=>qiù +47ED=>tiáo +47EE=>fú +47EF=>kuò +47F0=>jiǎn +47F4=>zhèn +47F5=>qiú +47F6=>zuò +47F7=>chì +47F8=>kuí +47F9=>liè +47FA=>bèi +47FB=>dù +47FC=>wǔ +47FE=>zhuó +47FF=>lù +4800=>tāng +4802=>chú +4803=>liǎng +4804=>tiǎn +4805=>kǔn +4806=>cháng +4807=>jué +4808=>tú +4809=>huàn +480A=>fèi +480B=>bì +480D=>xiā +480E=>wò +480F=>jì +4810=>qù +4811=>kuǐ +4812=>hú +4813=>qiū +4814=>suì +4815=>cāi +4817=>qiù +4818=>pì +4819=>páng +481A=>wà +481B=>yáo +481C=>róng +481D=>xūn +481E=>cù +481F=>dié +4820=>chì +4821=>cuó +4822=>mèng +4823=>xuǎn +4824=>duǒ +4825=>bié +4826=>zhè +4827=>chú +4828=>chàn +4829=>guì +482A=>duàn +482B=>zòu +482C=>dèng +482D=>lái +482E=>téng +482F=>yuè +4830=>quán +4831=>zhú +4832=>líng +4833=>chēn +4834=>zhěn +4835=>fù +4836=>shè +4837=>tiǎo +4838=>kuā +4839=>ái +483B=>qióng +483C=>shù +483D=>hái +483E=>shǎn +483F=>wài +4840=>zhǎn +4841=>lǒng +4842=>jiū +4843=>lì +4845=>chūn +4846=>róng +4847=>yuè +4848=>jué +4849=>kǎng +484A=>fǎn +484B=>qí +484C=>hóng +484D=>fú +484E=>lú +484F=>hóng +4850=>tuó +4851=>mín +4852=>tián +4853=>juàn +4854=>qǐ +4855=>zhěng +4856=>qìng +4857=>gǒng +4858=>tián +4859=>láng +485A=>mào +485B=>yìn +485C=>lù +485D=>yuān +485E=>jú +485F=>pì +4861=>xié +4862=>biàn +4863=>hūn +4864=>zhū +4865=>róng +4866=>sǎng +4867=>wū +4868=>chà +4869=>kēng +486A=>shàn +486B=>péng +486C=>màn +486D=>xiū +486F=>cōng +4870=>kēng +4871=>zhuǎn +4872=>chán +4873=>sī +4874=>chōng +4875=>suì +4876=>bèi +4877=>kài +4879=>zhì +487A=>wèi +487B=>mín +487C=>líng +487D=>zuān +487E=>niè +487F=>líng +4880=>qì +4881=>yuè +4883=>yì +4884=>xǐ +4885=>chén +4887=>rǒng +4888=>chén +4889=>nóng +488A=>yóu +488B=>jì +488C=>bó +488D=>fǎng +4890=>cú +4891=>dǐ +4892=>jiāo +4893=>yú +4894=>hé +4895=>xù +4896=>yù +4897=>qū +4899=>bài +489A=>gēng +489B=>jiǒng +489D=>yà +489E=>shù +489F=>yóu +48A0=>sòng +48A1=>yè +48A2=>càng +48A3=>yáo +48A4=>shù +48A5=>yán +48A6=>shuài +48A7=>liào +48A8=>cōng +48A9=>yù +48AA=>bó +48AB=>suí +48AD=>yàn +48AE=>lèi +48AF=>lín +48B0=>tī +48B1=>dú +48B2=>yuè +48B3=>jǐ +48B5=>yún +48B8=>jū +48B9=>jǔ +48BA=>chū +48BB=>chén +48BC=>gōng +48BD=>xiàng +48BE=>xiǎn +48BF=>ān +48C0=>guǐ +48C1=>yǔ +48C2=>lěi +48C4=>tú +48C5=>chén +48C6=>xíng +48C7=>qiú +48C8=>hàng +48CA=>dǎng +48CB=>cǎi +48CC=>dǐ +48CD=>yǎn +48CE=>zī +48D0=>yīng +48D1=>chán +48D3=>lí +48D4=>suǒ +48D5=>mǎ +48D6=>mǎ +48D8=>táng +48D9=>péi +48DA=>lóu +48DB=>qī +48DC=>cuó +48DD=>tú +48DE=>è +48DF=>cán +48E0=>jié +48E1=>yí +48E2=>jí +48E3=>dǎng +48E4=>jué +48E5=>bǐ +48E6=>lèi +48E7=>yì +48E8=>chún +48E9=>chún +48EA=>pò +48EB=>lí +48EC=>zǎi +48ED=>tài +48EE=>pò +48EF=>cú +48F0=>jù +48F1=>xù +48F2=>fàn +48F4=>xù +48F5=>èr +48F6=>huó +48F7=>zhū +48F8=>rǎn +48F9=>fá +48FA=>juān +48FB=>hān +48FC=>liáng +48FD=>zhī +48FE=>mì +48FF=>yū +4901=>cén +4902=>méi +4903=>yīn +4904=>miǎn +4905=>tú +4906=>kuí +4909=>mì +490A=>róng +490B=>yù +490C=>qiāng +490D=>mí +490E=>jú +490F=>pǐ +4910=>jǐn +4911=>wàng +4912=>jì +4913=>méng +4914=>jiàn +4915=>xuè +4916=>bào +4917=>gǎn +4918=>chǎn +4919=>lì +491A=>lǐ +491B=>qiú +491C=>dùn +491D=>yìng +491E=>yǔn +491F=>chén +4920=>zhǐ +4921=>rǎn +4923=>lüè +4924=>kāi +4925=>guǐ +4926=>yuè +4927=>huì +4928=>pì +4929=>chá +492A=>duǒ +492B=>chán +492C=>shā +492D=>shì +492E=>shè +492F=>xíng +4930=>yíng +4931=>shì +4932=>chì +4933=>yè +4934=>hán +4935=>fèi +4936=>yè +4937=>yǎn +4938=>zuàn +4939=>sōu +493A=>jīn +493B=>duò +493C=>xiàn +493D=>guān +493E=>tāo +493F=>qiè +4940=>chǎn +4941=>hán +4942=>mèng +4943=>yuè +4944=>cù +4945=>qiàn +4946=>jǐn +4947=>shàn +4948=>mǔ +4949=>yuān +494B=>pēng +494C=>zhèng +494D=>zhì +494E=>chún +494F=>yǔ +4950=>móu +4951=>wàn +4952=>jiàng +4953=>qī +4954=>sù +4955=>piě +4956=>tián +4957=>kuǎn +4958=>cù +4959=>suì +495B=>jiē +495C=>jiàn +495D=>áo +495E=>jiǎo +495F=>yè +4961=>yè +4962=>lóng +4963=>záo +4964=>báo +4965=>lián +4967=>huán +4968=>lǜ +4969=>wéi +496A=>xiǎn +496B=>tiě +496C=>bó +496D=>zhèng +496E=>zhú +496F=>bēi +4970=>méng +4971=>xiě +4972=>ōu +4973=>yōu +4975=>xiǎo +4976=>lì +4977=>zhá +4978=>mí +497A=>yé +497D=>pō +497E=>xiě +4982=>shàn +4983=>zhuō +4985=>shàn +4986=>jué +4987=>jì +4988=>jiē +498A=>niǎo +498B=>áo +498C=>chù +498D=>wù +498E=>guǎn +498F=>xiè +4990=>tǐng +4991=>xuè +4992=>dàng +4993=>zhān +4994=>tǎn +4995=>pēng +4996=>xié +4997=>xù +4998=>xiàn +4999=>sì +499A=>kuà +499B=>zhèng +499C=>wú +499D=>huō +499E=>rùn +499F=>wěn +49A0=>dū +49A1=>huán +49A2=>kuò +49A3=>fù +49A4=>chuài +49A5=>xián +49A6=>qín +49A7=>qié +49A8=>lán +49AA=>yà +49AB=>yīng +49AC=>què +49AD=>hāng +49AE=>chǔn +49AF=>zhì +49B1=>wěi +49B2=>yán +49B3=>xiàng +49B4=>yì +49B5=>nǐ +49B6=>zhèng +49B7=>chuài +49B9=>shí +49BA=>dīng +49BB=>zǐ +49BC=>jué +49BD=>xù +49BE=>yuán +49C1=>xǔ +49C2=>dào +49C3=>tián +49C4=>gè +49C5=>yí +49C6=>hóng +49C7=>yī +49C9=>lǐ +49CA=>kū +49CB=>xiǎn +49CC=>suī +49CD=>xì +49CE=>xuàn +49D1=>dī +49D2=>lái +49D3=>zhōu +49D4=>niàn +49D5=>chéng +49D6=>jiàn +49D7=>bì +49D8=>zhuàn +49D9=>líng +49DA=>hào +49DB=>bàng +49DC=>táng +49DD=>chī +49DE=>mà +49DF=>xiàn +49E0=>shuàn +49E1=>yōng +49E2=>qū +49E4=>pú +49E5=>huì +49E6=>wéi +49E7=>yǐ +49E8=>yè +49EA=>chè +49EB=>háo +49EC=>bīn +49EE=>xiàn +49EF=>chán +49F0=>hùn +49F2=>hàn +49F3=>cí +49F4=>zhī +49F5=>qí +49F6=>kuí +49F7=>róu +49F9=>yīng +49FA=>xióng +49FC=>hú +49FD=>cuǐ +49FF=>què +4A00=>dí +4A01=>wù +4A02=>qiū +4A04=>yàn +4A05=>liáo +4A06=>bí +4A08=>bīn +4A0A=>yuān +4A0B=>nüè +4A0C=>báo +4A0D=>yǐng +4A0E=>hóng +4A0F=>cí +4A10=>qià +4A11=>tí +4A12=>yù +4A13=>léi +4A14=>báo +4A16=>jì +4A17=>fú +4A18=>xiàn +4A19=>cén +4A1A=>hū +4A1B=>sè +4A1C=>bēng +4A1D=>qīng +4A1E=>yǔ +4A1F=>wā +4A20=>ǎi +4A21=>hán +4A22=>dàn +4A23=>gé +4A24=>dí +4A25=>huò +4A26=>pāng +4A28=>zhuī +4A29=>líng +4A2A=>mái +4A2B=>mài +4A2C=>lián +4A2D=>xiāo +4A2E=>xuě +4A2F=>zhèn +4A30=>pò +4A31=>fù +4A32=>nóu +4A33=>xì +4A34=>duì +4A35=>dàn +4A36=>yǔn +4A37=>xiàn +4A38=>yǐn +4A39=>shū +4A3A=>duì +4A3B=>bèng +4A3C=>hù +4A3D=>fěi +4A3E=>fèi +4A3F=>zá +4A40=>bèi +4A41=>fēi +4A42=>xiān +4A43=>shì +4A44=>miǎn +4A45=>zhǎn +4A46=>zhǎn +4A47=>zhān +4A48=>huì +4A49=>fǔ +4A4A=>wǎn +4A4B=>mǒ +4A4C=>qiáo +4A4D=>liǎo +4A4F=>miè +4A50=>hū +4A51=>hóng +4A52=>yú +4A53=>qí +4A54=>duò +4A55=>áng +4A57=>bà +4A58=>dì +4A59=>xuàn +4A5A=>dì +4A5B=>bì +4A5C=>zhòu +4A5D=>páo +4A5E=>tié +4A5F=>yí +4A61=>jiá +4A62=>zhì +4A63=>tú +4A64=>xié +4A65=>dàn +4A66=>tiáo +4A67=>xiè +4A68=>chàng +4A69=>yuǎn +4A6A=>guǎn +4A6B=>liǎng +4A6C=>běng +4A6E=>lù +4A6F=>jí +4A70=>xuàn +4A71=>shù +4A72=>dū +4A73=>sōu +4A74=>hú +4A75=>yùn +4A76=>chǎn +4A77=>bāng +4A78=>róng +4A79=>é +4A7A=>wēng +4A7B=>bà +4A7C=>féng +4A7D=>yū +4A7E=>zhè +4A7F=>fén +4A80=>guǎn +4A81=>bǔ +4A82=>gé +4A83=>dūn +4A84=>huáng +4A85=>dú +4A86=>tǐ +4A87=>bó +4A88=>qiàn +4A89=>liè +4A8A=>lóng +4A8B=>wèi +4A8C=>zhàn +4A8D=>lán +4A8E=>suī +4A8F=>nà +4A90=>bì +4A91=>tuó +4A92=>zhù +4A93=>diē +4A94=>bǔ +4A95=>jú +4A96=>pò +4A97=>xiá +4A98=>wěi +4A99=>pò +4A9A=>dā +4A9B=>fān +4A9C=>chān +4A9D=>hù +4A9E=>zá +4AA4=>fán +4AA5=>xiè +4AA6=>hóng +4AA7=>chí +4AA8=>báo +4AA9=>yín +4AAB=>jīng +4AAC=>bó +4AAD=>ruǎn +4AAE=>chǒu +4AAF=>yīng +4AB0=>yī +4AB1=>gǎi +4AB2=>kūn +4AB3=>yǔn +4AB4=>zhěn +4AB5=>yǎ +4AB6=>jū +4AB7=>hòu +4AB8=>mín +4AB9=>bāi +4ABA=>gé +4ABB=>biàn +4ABC=>zhuō +4ABD=>hào +4ABE=>zhěn +4ABF=>shěng +4AC0=>gěn +4AC1=>bì +4AC2=>duǒ +4AC3=>chún +4AC4=>chuà +4AC5=>sàn +4AC6=>chéng +4AC7=>rán +4AC8=>chěn +4AC9=>mào +4ACA=>péi +4ACB=>wēi +4ACC=>pǐ +4ACD=>fǔ +4ACE=>zhuō +4ACF=>qī +4AD0=>lín +4AD1=>yī +4AD2=>mén +4AD3=>wú +4AD4=>qì +4AD5=>dié +4AD6=>chěn +4AD7=>xiá +4AD8=>hé +4AD9=>sǎng +4ADA=>guā +4ADB=>hóu +4ADC=>āo +4ADD=>fǔ +4ADE=>qiāo +4ADF=>hùn +4AE0=>pī +4AE1=>yán +4AE2=>sī +4AE3=>xí +4AE4=>míng +4AE5=>kuǐ +4AE6=>gé +4AE8=>ào +4AE9=>sǎn +4AEA=>shuǎng +4AEB=>lóu +4AEC=>zhěn +4AED=>huì +4AEE=>chán +4AF0=>lìn +4AF1=>ná +4AF2=>hàn +4AF3=>dú +4AF4=>jìn +4AF5=>mián +4AF6=>fán +4AF7=>è +4AF8=>chāo +4AF9=>hóng +4AFA=>hóng +4AFB=>yù +4AFC=>xuè +4AFD=>pāo +4AFE=>bī +4AFF=>chāo +4B00=>yǒu +4B01=>yí +4B02=>xuè +4B03=>sà +4B04=>xù +4B05=>lì +4B06=>lì +4B07=>yuàn +4B08=>duì +4B09=>huò +4B0A=>shà +4B0B=>léng +4B0C=>pōu +4B0D=>hū +4B0E=>guó +4B0F=>bù +4B10=>ruí +4B11=>wèi +4B12=>sōu +4B13=>àn +4B14=>yú +4B15=>xiāng +4B16=>héng +4B17=>yáng +4B18=>xiāo +4B19=>yáo +4B1B=>bì +4B1D=>héng +4B1E=>táo +4B1F=>liú +4B21=>zhù +4B23=>xì +4B24=>zàn +4B25=>yì +4B26=>dòu +4B27=>yuán +4B28=>jiù +4B2A=>bó +4B2B=>tí +4B2C=>yǐng +4B2E=>yí +4B2F=>nián +4B30=>shào +4B31=>bèn +4B32=>gōu +4B33=>bǎn +4B34=>mò +4B35=>gāi +4B36=>èn +4B37=>shě +4B39=>zhì +4B3A=>yàng +4B3B=>jiàn +4B3C=>yuàn +4B3D=>shuì +4B3E=>tí +4B3F=>wěi +4B40=>xùn +4B41=>zhì +4B42=>yì +4B43=>rěn +4B44=>shì +4B45=>hú +4B46=>nè +4B47=>yē +4B48=>jiàn +4B49=>suǐ +4B4A=>yǐng +4B4B=>bǎo +4B4C=>hú +4B4D=>hú +4B4E=>yè +4B50=>yàng +4B51=>lián +4B52=>xī +4B53=>èn +4B54=>duī +4B55=>zǎn +4B56=>zhù +4B57=>yǐng +4B58=>yǐng +4B59=>jǐn +4B5A=>chuáng +4B5B=>dàn +4B5D=>kuài +4B5E=>yì +4B5F=>yè +4B60=>jiǎn +4B61=>èn +4B62=>níng +4B63=>cí +4B64=>qiǎn +4B65=>xuè +4B66=>bō +4B67=>mǐ +4B68=>shuì +4B69=>mó +4B6A=>liáng +4B6B=>qǐ +4B6C=>qǐ +4B6D=>shǒu +4B6E=>fú +4B6F=>bó +4B70=>bèng +4B71=>bié +4B72=>yǐ +4B73=>wèi +4B74=>huán +4B75=>fán +4B76=>qí +4B77=>máo +4B78=>bǎo +4B79=>áng +4B7A=>ǎng +4B7B=>fù +4B7C=>qí +4B7D=>qún +4B7E=>tuó +4B7F=>yì +4B80=>bó +4B81=>pián +4B82=>bá +4B84=>xuán +4B87=>yù +4B88=>chí +4B89=>lú +4B8A=>yí +4B8B=>lì +4B8D=>niǎo +4B8E=>xì +4B8F=>wú +4B91=>lèi +4B92=>pū +4B93=>zhuō +4B94=>zuī +4B95=>zhuó +4B96=>chāng +4B97=>àn +4B98=>ér +4B99=>yù +4B9A=>lèng +4B9B=>fù +4B9C=>zhá +4B9D=>hún +4B9E=>chǔn +4B9F=>sōu +4BA0=>bī +4BA1=>bì +4BA2=>zhá +4BA4=>hé +4BA5=>lì +4BA7=>hàn +4BA8=>zǎi +4BA9=>gú +4BAA=>chéng +4BAB=>lóu +4BAC=>mò +4BAD=>mì +4BAE=>mài +4BAF=>ào +4BB0=>zhé +4BB1=>zhú +4BB2=>huáng +4BB3=>fán +4BB4=>dèng +4BB5=>tóng +4BB7=>dú +4BB8=>wò +4BB9=>wèi +4BBA=>jì +4BBB=>chì +4BBC=>lín +4BBD=>biāo +4BBE=>lóng +4BBF=>jiǎn +4BC0=>niè +4BC1=>luó +4BC2=>shēn +4BC4=>guā +4BC5=>niè +4BC6=>yì +4BC7=>kū +4BC8=>wán +4BC9=>wā +4BCA=>qià +4BCB=>bó +4BCC=>kāo +4BCD=>líng +4BCE=>gàn +4BCF=>guā +4BD0=>hái +4BD1=>kuāng +4BD2=>héng +4BD3=>kuī +4BD4=>zé +4BD5=>tīng +4BD6=>láng +4BD7=>bì +4BD8=>huàn +4BD9=>pò +4BDA=>yǎo +4BDB=>wàn +4BDC=>tì +4BDD=>suǐ +4BDE=>kuā +4BDF=>duì +4BE0=>ǎo +4BE1=>jiàn +4BE2=>mó +4BE3=>kuì +4BE4=>kuài +4BE5=>àn +4BE6=>mà +4BE7=>qǐng +4BE8=>qiāo +4BEA=>kǎo +4BEB=>hào +4BEC=>duǒ +4BED=>xiān +4BEE=>nái +4BEF=>suō +4BF0=>jiè +4BF1=>pī +4BF2=>pā +4BF3=>sōng +4BF4=>cháng +4BF5=>niè +4BF6=>mán +4BF7=>sōng +4BF8=>cì +4BF9=>xiān +4BFA=>kuò +4BFC=>dí +4BFD=>póu +4BFE=>tiáo +4BFF=>zú +4C00=>wǒ +4C01=>fèi +4C02=>cài +4C03=>péng +4C04=>sāi +4C06=>róu +4C07=>qí +4C08=>cuó +4C09=>pán +4C0A=>bó +4C0B=>mán +4C0C=>zǒng +4C0D=>cì +4C0E=>kuì +4C0F=>jì +4C10=>lán +4C12=>méng +4C13=>mián +4C14=>pán +4C15=>lú +4C16=>zuǎn +4C18=>liú +4C19=>yǐ +4C1A=>wén +4C1B=>lì +4C1C=>lì +4C1D=>zèng +4C1E=>zhǔ +4C1F=>hún +4C20=>shén +4C21=>chì +4C22=>xìng +4C23=>wǎng +4C24=>dōng +4C25=>huò +4C26=>pǐ +4C27=>hū +4C28=>mèi +4C29=>chě +4C2A=>mèi +4C2B=>chāo +4C2C=>jú +4C2D=>nòu +4C2F=>yì +4C30=>rú +4C31=>líng +4C32=>yà +4C34=>qì +4C35=>zī +4C37=>bàng +4C38=>gōng +4C39=>zé +4C3A=>jiè +4C3B=>yú +4C3C=>qín +4C3D=>bèi +4C3E=>bā +4C3F=>tuó +4C40=>yāng +4C41=>qiáo +4C42=>yǒu +4C43=>zhì +4C44=>jiè +4C45=>mò +4C46=>shéng +4C47=>shàn +4C48=>qí +4C49=>shàn +4C4A=>mǐ +4C4B=>gǒng +4C4C=>yí +4C4D=>gèng +4C4E=>gèng +4C4F=>tǒu +4C50=>fū +4C51=>xué +4C52=>yè +4C53=>tíng +4C54=>tiáo +4C55=>móu +4C56=>liú +4C57=>cān +4C58=>lí +4C59=>shū +4C5A=>lù +4C5B=>huò +4C5C=>cuò +4C5D=>pái +4C5E=>liú +4C5F=>jù +4C60=>zhàn +4C61=>jú +4C62=>zhēng +4C63=>zú +4C64=>xiàn +4C65=>zhì +4C68=>là +4C6B=>là +4C6C=>xū +4C6D=>gèng +4C6E=>é +4C6F=>mú +4C70=>zhòng +4C71=>tí +4C72=>yuán +4C73=>zhān +4C74=>gèng +4C75=>wēng +4C76=>láng +4C77=>yú +4C78=>sōu +4C79=>zhǎ +4C7A=>hái +4C7B=>huá +4C7C=>zhǎn +4C7E=>lóu +4C7F=>chàn +4C80=>zhì +4C81=>wèi +4C82=>xuán +4C83=>zǎo +4C84=>mín +4C85=>guī +4C86=>sū +4C89=>sī +4C8A=>duò +4C8B=>cén +4C8C=>kuǎn +4C8D=>téng +4C8E=>něi +4C8F=>láo +4C90=>lǔ +4C91=>yí +4C92=>xiè +4C93=>yǎn +4C94=>qíng +4C95=>pū +4C96=>chóu +4C97=>xián +4C98=>guǎn +4C99=>jié +4C9A=>lài +4C9B=>méng +4C9C=>yè +4C9E=>lì +4C9F=>yìn +4CA0=>chūn +4CA1=>qiū +4CA2=>téng +4CA3=>yú +4CA6=>dài +4CA7=>dù +4CA8=>hóng +4CAA=>xì +4CAC=>qí +4CAE=>yuán +4CAF=>jí +4CB0=>yùn +4CB1=>fǎng +4CB2=>gōng +4CB3=>háng +4CB4=>zhèn +4CB5=>què +4CB8=>jiè +4CB9=>pí +4CBA=>gàn +4CBB=>xuán +4CBC=>shēng +4CBD=>shí +4CBE=>qiǎo +4CBF=>cí +4CC0=>dié +4CC1=>bó +4CC2=>diāo +4CC3=>wǎn +4CC4=>cí +4CC5=>zhǐ +4CC6=>bái +4CC7=>wǔ +4CC8=>bǎo +4CC9=>dàn +4CCA=>bá +4CCB=>tóng +4CCD=>gōng +4CCE=>jiù +4CCF=>guì +4CD0=>cì +4CD1=>yǒu +4CD2=>yuán +4CD3=>lǎo +4CD4=>jú +4CD5=>fú +4CD6=>niè +4CD7=>é +4CD8=>é +4CD9=>xǐng +4CDA=>kàn +4CDB=>yàn +4CDC=>tú +4CDD=>pǒu +4CDE=>běng +4CDF=>míng +4CE0=>shuì +4CE1=>yàn +4CE2=>qí +4CE3=>yuán +4CE4=>biē +4CE6=>xuān +4CE7=>hóu +4CE8=>huáng +4CE9=>yāo +4CEA=>juàn +4CEB=>kuí +4CEC=>è +4CED=>jí +4CEE=>mò +4CEF=>chóng +4CF0=>bǎo +4CF1=>wù +4CF2=>zhèn +4CF3=>xù +4CF4=>tà +4CF5=>chì +4CF6=>xī +4CF7=>cóng +4CF8=>má +4CF9=>kòu +4CFA=>yàn +4CFB=>cán +4CFD=>hè +4CFE=>dēng +4CFF=>rán +4D00=>tóng +4D01=>yù +4D02=>xiàng +4D03=>náo +4D04=>shùn +4D05=>fén +4D06=>pú +4D07=>líng +4D08=>ǎo +4D09=>huán +4D0A=>yí +4D0B=>huán +4D0C=>méng +4D0D=>yīng +4D0E=>lěi +4D0F=>yàn +4D10=>bǎo +4D11=>dié +4D12=>líng +4D13=>shī +4D14=>jiāo +4D15=>liè +4D16=>jīng +4D17=>jú +4D18=>tī +4D19=>pì +4D1A=>gǎng +4D1B=>xiāo +4D1C=>wāi +4D1D=>chuài +4D1E=>dí +4D1F=>huán +4D20=>yǎo +4D21=>lì +4D22=>mí +4D23=>hū +4D24=>shēng +4D25=>jiā +4D26=>yín +4D27=>wēi +4D29=>piáo +4D2A=>lù +4D2B=>líng +4D2C=>yì +4D2D=>cái +4D2E=>shàn +4D2F=>hū +4D30=>shú +4D31=>tuō +4D32=>mò +4D33=>huá +4D34=>tiè +4D35=>bǐng +4D36=>péng +4D37=>hún +4D38=>fū +4D39=>guǒ +4D3A=>bù +4D3B=>lí +4D3C=>chàn +4D3D=>pí +4D3E=>cuó +4D3F=>méng +4D40=>suǒ +4D41=>qiàng +4D42=>zhí +4D43=>kuàng +4D44=>bí +4D45=>áo +4D46=>méng +4D47=>xiàn +4D48=>kù +4D49=>tóu +4D4A=>tuān +4D4B=>wěi +4D4C=>xiān +4D4E=>tuān +4D4F=>lǎo +4D50=>chǎn +4D51=>nì +4D52=>nì +4D53=>lí +4D54=>dǒng +4D55=>jù +4D56=>qiàn +4D57=>bó +4D58=>shài +4D59=>zhā +4D5A=>tǎo +4D5B=>qiàn +4D5C=>nǒng +4D5D=>yì +4D5E=>jìng +4D5F=>gǎn +4D60=>dí +4D61=>jiǎn +4D62=>mèi +4D63=>dá +4D64=>jiǎn +4D65=>yù +4D66=>xiè +4D67=>zài +4D68=>máng +4D69=>lí +4D6A=>gùn +4D6B=>xūn +4D6C=>tà +4D6D=>zhè +4D6E=>yàng +4D6F=>tuǎn +4D70=>shāng +4D71=>xì +4D72=>qiāo +4D73=>wèi +4D74=>yìng +4D75=>chuā +4D76=>qú +4D77=>wā +4D79=>zhī +4D7A=>tǐng +4D7B=>gǔ +4D7C=>shāng +4D7D=>cà +4D7E=>fú +4D7F=>tiè +4D80=>tà +4D81=>tà +4D82=>zhuó +4D83=>hán +4D84=>píng +4D85=>hé +4D86=>zhuī +4D87=>zhòu +4D88=>bó +4D89=>liú +4D8A=>nǜ +4D8B=>xī +4D8C=>pào +4D8D=>dì +4D8E=>hē +4D8F=>tì +4D90=>wài +4D91=>tì +4D92=>qí +4D93=>jì +4D94=>chí +4D95=>bà +4D96=>jìn +4D97=>kè +4D98=>lì +4D99=>jù +4D9A=>qǔ +4D9B=>là +4D9C=>gǔ +4D9D=>qià +4D9E=>qí +4D9F=>xiàn +4DA0=>jiǎn +4DA1=>shí +4DA2=>jiān +4DA3=>ái +4DA4=>huá +4DA5=>zhā +4DA6=>zé +4DA7=>yǎo +4DA8=>zhān +4DA9=>jì +4DAA=>chà +4DAB=>yàn +4DAC=>jiān +4DAE=>yǎn +4DB0=>jiāo +4DB1=>tóng +4DB2=>nán +4DB3=>yuè +4DB5=>chí +4E00=>yī +4E01=>dīng +4E02=>kǎo +4E03=>qī +4E04=>shàng +4E05=>xià +4E06=>hǎn +4E07=>wàn +4E08=>zhàng +4E09=>sān +4E0A=>shàng +4E0B=>xià +4E0C=>jī +4E0D=>bù +4E0E=>yǔ +4E0F=>miǎn +4E10=>gài +4E11=>chǒu +4E12=>chǒu +4E13=>zhuān +4E14=>qiě +4E15=>pī +4E16=>shì +4E17=>shì +4E18=>qiū +4E19=>bǐng +4E1A=>yè +4E1B=>cóng +4E1C=>dōng +4E1D=>sī +4E1E=>chéng +4E1F=>diū +4E20=>qiū +4E21=>liǎng +4E22=>diū +4E23=>yǒu +4E24=>liǎng +4E25=>yán +4E26=>bìng +4E27=>sàng +4E28=>gǔn +4E29=>jiū +4E2A=>gè +4E2B=>yā +4E2C=>qiáng +4E2D=>zhōng +4E2E=>jǐ +4E2F=>jiè +4E30=>fēng +4E31=>guàn +4E32=>chuàn +4E33=>chǎn +4E34=>lín +4E35=>zhuó +4E36=>zhǔ +4E37=>ha +4E38=>wán +4E39=>dān +4E3A=>wèi +4E3B=>zhǔ +4E3C=>jǐng +4E3D=>lì +4E3E=>jǔ +4E3F=>piě +4E40=>fú +4E41=>yí +4E42=>yì +4E43=>nǎi +4E44=>wu +4E45=>jiǔ +4E46=>jiǔ +4E47=>tuō +4E48=>me +4E49=>yì +4E4A=>yī +4E4B=>zhī +4E4C=>wū +4E4D=>zhà +4E4E=>hu +4E4F=>fá +4E50=>lè +4E51=>yín +4E52=>pīng +4E53=>pāng +4E54=>qiáo +4E55=>hǔ +4E56=>guāi +4E57=>chéng +4E58=>chéng +4E59=>yǐ +4E5A=>yǐn +4E5B=>ya +4E5C=>miē +4E5D=>jiǔ +4E5E=>qǐ +4E5F=>yě +4E60=>xí +4E61=>xiāng +4E62=>gài +4E63=>jiǔ +4E64=>xià +4E65=>hù +4E66=>shū +4E67=>dou +4E68=>shǐ +4E69=>jī +4E6A=>náng +4E6B=>jiā +4E6C=>jù +4E6D=>shí +4E6E=>mǎo +4E6F=>hū +4E70=>mǎi +4E71=>luàn +4E72=>zī +4E73=>rǔ +4E74=>xué +4E75=>yǎn +4E76=>fǔ +4E77=>shā +4E78=>nǎ +4E79=>gān +4E7A=>suǒ +4E7B=>yú +4E7C=>cui +4E7D=>zhě +4E7E=>gān +4E7F=>zhì +4E80=>guī +4E81=>gān +4E82=>luàn +4E83=>lǐn +4E84=>yì +4E85=>jué +4E86=>le +4E87=>ma +4E88=>yǔ +4E89=>zhēng +4E8A=>shì +4E8B=>shì +4E8C=>èr +4E8D=>chù +4E8E=>yú +4E8F=>kuī +4E90=>yú +4E91=>yún +4E92=>hù +4E93=>qí +4E94=>wǔ +4E95=>jǐng +4E96=>sì +4E97=>suì +4E98=>gèn +4E99=>gèn +4E9A=>yà +4E9B=>xiē +4E9C=>yà +4E9D=>qí +4E9E=>yà +4E9F=>jí +4EA0=>tóu +4EA1=>wáng +4EA2=>kàng +4EA3=>tà +4EA4=>jiāo +4EA5=>hài +4EA6=>yì +4EA7=>chǎn +4EA8=>hēng +4EA9=>mǔ +4EAA=>ye +4EAB=>xiǎng +4EAC=>jīng +4EAD=>tíng +4EAE=>liàng +4EAF=>xiǎng +4EB0=>jīng +4EB1=>yè +4EB2=>qīn +4EB3=>bó +4EB4=>yòu +4EB5=>xiè +4EB6=>dǎn +4EB7=>lián +4EB8=>duǒ +4EB9=>mén +4EBA=>rén +4EBB=>rén +4EBC=>jí +4EBD=>ji +4EBE=>wáng +4EBF=>yì +4EC0=>shén +4EC1=>rén +4EC2=>lè +4EC3=>dīng +4EC4=>zè +4EC5=>jǐn +4EC6=>pū +4EC7=>chóu +4EC8=>bā +4EC9=>zhǎng +4ECA=>jīn +4ECB=>jiè +4ECC=>bīng +4ECD=>réng +4ECE=>cóng +4ECF=>fó +4ED0=>sǎn +4ED1=>lún +4ED2=>bīng +4ED3=>cāng +4ED4=>zǐ +4ED5=>shì +4ED6=>tā +4ED7=>zhàng +4ED8=>fù +4ED9=>xian +4EDA=>xiān +4EDB=>tuō +4EDC=>hóng +4EDD=>tóng +4EDE=>rèn +4EDF=>qiān +4EE0=>gǎn +4EE1=>gē +4EE2=>bó +4EE3=>dài +4EE4=>lìng +4EE5=>yǐ +4EE6=>chào +4EE7=>cháng +4EE8=>sā +4EE9=>shang +4EEA=>yí +4EEB=>mù +4EEC=>men +4EED=>rèn +4EEE=>jiǎ +4EEF=>chào +4EF0=>yǎng +4EF1=>qián +4EF2=>zhòng +4EF3=>pǐ +4EF4=>wò +4EF5=>wǔ +4EF6=>jiàn +4EF7=>jià +4EF8=>yǎo +4EF9=>fēng +4EFA=>cāng +4EFB=>rèn +4EFC=>wáng +4EFD=>fèn +4EFE=>dī +4EFF=>fǎng +4F00=>zhōng +4F01=>qǐ +4F02=>pèi +4F03=>yú +4F04=>diào +4F05=>dùn +4F06=>wù +4F07=>yì +4F08=>xǐn +4F09=>kàng +4F0A=>yī +4F0B=>jí +4F0C=>ài +4F0D=>wu +4F0E=>jì +4F0F=>fú +4F10=>fá +4F11=>xiū +4F12=>jìn +4F13=>pī +4F14=>dǎn +4F15=>fū +4F16=>tǎng +4F17=>zhòng +4F18=>yōu +4F19=>huǒ +4F1A=>huì +4F1B=>yǔ +4F1C=>cuì +4F1D=>chuán +4F1E=>sǎn +4F1F=>wěi +4F20=>chuán +4F21=>chē +4F22=>yá +4F23=>xiàn +4F24=>shāng +4F25=>chāng +4F26=>lún +4F27=>cāng +4F28=>xùn +4F29=>xìn +4F2A=>wěi +4F2B=>zhù +4F2C=>ze +4F2D=>xián +4F2E=>nǔ +4F2F=>bó +4F30=>gū +4F31=>nǐ +4F32=>nì +4F33=>xiè +4F34=>bàn +4F35=>xù +4F36=>ling +4F37=>zhòu +4F38=>shēn +4F39=>qū +4F3A=>cì +4F3B=>bēng +4F3C=>shì +4F3D=>jiā +4F3E=>pī +4F3F=>yì +4F40=>sì +4F41=>yǐ +4F42=>zhēng +4F43=>diàn +4F44=>hān +4F45=>mài +4F46=>dàn +4F47=>zhù +4F48=>bù +4F49=>qū +4F4A=>bǐ +4F4B=>zhāo +4F4C=>cǐ +4F4D=>wèi +4F4E=>dī +4F4F=>zhù +4F50=>zuǒ +4F51=>yòu +4F52=>yǎng +4F53=>tǐ +4F54=>zhàn +4F55=>hé +4F56=>bì +4F57=>tuó +4F58=>shé +4F59=>yú +4F5A=>yì +4F5B=>fú +4F5C=>zuò +4F5D=>gōu +4F5E=>nìng +4F5F=>tóng +4F60=>nǐ +4F61=>xiān +4F62=>qú +4F63=>yōng +4F64=>wǎ +4F65=>qiān +4F66=>shi +4F67=>kǎ +4F68=>bao +4F69=>pèi +4F6A=>huí +4F6B=>hè +4F6C=>lǎo +4F6D=>xiáng +4F6E=>gé +4F6F=>yáng +4F70=>bǎi +4F71=>fǎ +4F72=>mǐng +4F73=>jiā +4F74=>èr +4F75=>bìng +4F76=>jí +4F77=>hěn +4F78=>huó +4F79=>guǐ +4F7A=>quán +4F7B=>tiāo +4F7C=>jiǎo +4F7D=>cì +4F7E=>yì +4F7F=>shǐ +4F80=>xíng +4F81=>shēn +4F82=>tuō +4F83=>kǎn +4F84=>zhí +4F85=>gāi +4F86=>lái +4F87=>yí +4F88=>chǐ +4F89=>kuǎ +4F8A=>guāng +4F8B=>lì +4F8C=>yīn +4F8D=>shì +4F8E=>mǐ +4F8F=>zhū +4F90=>xù +4F91=>yòu +4F92=>ān +4F93=>lù +4F94=>móu +4F95=>ér +4F96=>lún +4F97=>dòng +4F98=>chà +4F99=>chī +4F9A=>xùn +4F9B=>gōng +4F9C=>zhōu +4F9D=>yī +4F9E=>rú +4F9F=>cún +4FA0=>xiá +4FA1=>sì +4FA2=>zài +4FA3=>lǚ +4FA4=>ta +4FA5=>jiǎo +4FA6=>zhēn +4FA7=>cè +4FA8=>qiáo +4FA9=>kuài +4FAA=>chái +4FAB=>nìng +4FAC=>nóng +4FAD=>jǐn +4FAE=>wǔ +4FAF=>hóu +4FB0=>jiǒng +4FB1=>chěng +4FB2=>zhèn +4FB3=>zuò +4FB4=>chǒu +4FB5=>qīn +4FB6=>lǚ +4FB7=>jú +4FB8=>shù +4FB9=>tǐng +4FBA=>shèn +4FBB=>tuì +4FBC=>bó +4FBD=>nán +4FBE=>xiāo +4FBF=>biàn +4FC0=>tuǐ +4FC1=>yǔ +4FC2=>xì +4FC3=>cù +4FC4=>é +4FC5=>qiú +4FC6=>xú +4FC7=>guàng +4FC8=>kù +4FC9=>wǔ +4FCA=>jùn +4FCB=>yì +4FCC=>fǔ +4FCD=>liáng +4FCE=>zǔ +4FCF=>qiào +4FD0=>lì +4FD1=>yǒng +4FD2=>hùn +4FD3=>jìng +4FD4=>qiàn +4FD5=>sàn +4FD6=>pěi +4FD7=>sú +4FD8=>fú +4FD9=>xī +4FDA=>lǐ +4FDB=>fǔ +4FDC=>pīng +4FDD=>bǎo +4FDE=>yú +4FDF=>qí +4FE0=>xiá +4FE1=>xìn +4FE2=>xiū +4FE3=>yǔ +4FE4=>dì +4FE5=>chē +4FE6=>chóu +4FE7=>zhi +4FE8=>yǎn +4FE9=>liǎ +4FEA=>lì +4FEB=>lái +4FEC=>si +4FED=>jiǎn +4FEE=>xiū +4FEF=>fǔ +4FF0=>huò +4FF1=>jù +4FF2=>xiào +4FF3=>pái +4FF4=>jiàn +4FF5=>biào +4FF6=>chù +4FF7=>fèi +4FF8=>fèng +4FF9=>yà +4FFA=>ǎn +4FFB=>bèi +4FFC=>yù +4FFD=>xīn +4FFE=>bǐ +4FFF=>hǔ +5000=>chāng +5001=>zhī +5002=>bìng +5003=>jiù +5004=>yáo +5005=>cuì +5006=>liǎ +5007=>wǎn +5008=>lái +5009=>cāng +500A=>zòng +500B=>gè +500C=>guān +500D=>bèi +500E=>tiǎn +500F=>shū +5010=>shū +5011=>men +5012=>dào +5013=>tán +5014=>jué +5015=>chuí +5016=>xìng +5017=>péng +5018=>tǎng +5019=>hou +501A=>yǐ +501B=>qī +501C=>tì +501D=>gàn +501E=>jìng +501F=>jiè +5020=>suī +5021=>chàng +5022=>jié +5023=>fǎng +5024=>zhí +5025=>kōng +5026=>juàn +5027=>zōng +5028=>jù +5029=>qiàn +502A=>ní +502B=>lún +502C=>zhuō +502D=>wō +502E=>luǒ +502F=>sōng +5030=>lèng +5031=>hùn +5032=>dōng +5033=>zì +5034=>bèn +5035=>wǔ +5036=>jù +5037=>nǎi +5038=>cǎi +5039=>jiǎn +503A=>zhài +503B=>yē +503C=>zhí +503D=>shà +503E=>qīng +503F=>qie +5040=>yīng +5041=>chēng +5042=>jiān +5043=>yǎn +5044=>ruǎn +5045=>zhòng +5046=>chǔn +5047=>jiǎ +5048=>jì +5049=>wěi +504A=>yǔ +504B=>bìng +504C=>ruò +504D=>tí +504E=>wēi +504F=>piān +5050=>yàn +5051=>fēng +5052=>tǎng +5053=>wò +5054=>è +5055=>xié +5056=>chě +5057=>shěng +5058=>kǎn +5059=>dì +505A=>zuò +505B=>chā +505C=>tíng +505D=>bèi +505E=>xiè +505F=>huáng +5060=>yǎo +5061=>zhàn +5062=>chǒu +5063=>yān +5064=>yóu +5065=>jiàn +5066=>xǔ +5067=>zhā +5068=>cī +5069=>fù +506A=>bī +506B=>zhì +506C=>zǒng +506D=>miǎn +506E=>jí +506F=>yǐ +5070=>xiè +5071=>xún +5072=>cāi +5073=>duān +5074=>cè +5075=>zhēn +5076=>ǒu +5077=>tōu +5078=>tōu +5079=>bèi +507A=>zá +507B=>lóu +507C=>jié +507D=>wěi +507E=>fèn +507F=>cháng +5080=>guī +5081=>sǒu +5082=>zhì +5083=>sù +5084=>xiā +5085=>fu +5086=>yuàn +5087=>rǒng +5088=>lì +5089=>nù +508A=>yùn +508B=>jiǎng +508C=>mà +508D=>bàng +508E=>diān +508F=>táng +5090=>hào +5091=>jié +5092=>xī +5093=>shàn +5094=>qiàn +5095=>jué +5096=>cāng +5097=>chù +5098=>sǎn +5099=>bèi +509A=>xiào +509B=>yǒng +509C=>yáo +509D=>tàn +509E=>suō +509F=>yǎng +50A0=>fā +50A1=>bìng +50A2=>jiā +50A3=>dǎi +50A4=>zài +50A5=>tǎng +50A6=>gu +50A7=>bīn +50A8=>chǔ +50A9=>nuó +50AA=>cān +50AB=>lěi +50AC=>cuī +50AD=>yōng +50AE=>zāo +50AF=>zǒng +50B0=>bēng +50B1=>sǒng +50B2=>ào +50B3=>chuán +50B4=>yǔ +50B5=>zhài +50B6=>zú +50B7=>shāng +50B8=>chuǎng +50B9=>jìng +50BA=>chì +50BB=>shǎ +50BC=>hàn +50BD=>zhāng +50BE=>qīng +50BF=>yàn +50C0=>dì +50C1=>xiè +50C2=>lóu +50C3=>bèi +50C4=>piào +50C5=>jǐn +50C6=>liàn +50C7=>lù +50C8=>mán +50C9=>qiān +50CA=>xiān +50CB=>tàn +50CC=>yíng +50CD=>dòng +50CE=>zhuàn +50CF=>xiàng +50D0=>shàn +50D1=>qiáo +50D2=>jiǒng +50D3=>tuǐ +50D4=>zǔn +50D5=>pú +50D6=>xī +50D7=>láo +50D8=>chǎng +50D9=>guāng +50DA=>liáo +50DB=>qī +50DC=>chēng +50DD=>chán +50DE=>wěi +50DF=>jī +50E0=>bō +50E1=>huì +50E2=>chuǎn +50E3=>tiě +50E4=>dàn +50E5=>jiǎo +50E6=>jiù +50E7=>sēng +50E8=>fèn +50E9=>xiàn +50EA=>jú +50EB=>è +50EC=>jiāo +50ED=>jiàn +50EE=>tóng +50EF=>lìn +50F0=>bó +50F1=>gù +50F2=>xian +50F3=>sù +50F4=>xiàn +50F5=>jiāng +50F6=>mǐn +50F7=>yè +50F8=>jìn +50F9=>jià +50FA=>qiào +50FB=>pì +50FC=>fēng +50FD=>zhòu +50FE=>ài +50FF=>sài +5100=>yí +5101=>jùn +5102=>nóng +5103=>chán +5104=>yì +5105=>dàng +5106=>jǐng +5107=>xuān +5108=>kuài +5109=>jiǎn +510A=>chù +510B=>dān +510C=>jiǎo +510D=>shǎ +510E=>zài +510F=>can +5110=>bīn +5111=>án +5112=>rú +5113=>tái +5114=>chóu +5115=>chái +5116=>lán +5117=>nǐ +5118=>jǐn +5119=>qiàn +511A=>méng +511B=>wǔ +511C=>níng +511D=>qióng +511E=>nǐ +511F=>cháng +5120=>liè +5121=>lěi +5122=>lǚ +5123=>kuǎng +5124=>bào +5125=>yù +5126=>biāo +5127=>zǎn +5128=>zhí +5129=>sì +512A=>yōu +512B=>háo +512C=>chèn +512D=>chèn +512E=>lì +512F=>téng +5130=>wěi +5131=>lǒng +5132=>chǔ +5133=>chán +5134=>ráng +5135=>shū +5136=>huì +5137=>lì +5138=>luó +5139=>zǎn +513A=>nuó +513B=>tǎng +513C=>yǎn +513D=>léi +513E=>nàng +513F=>ér +5140=>wù +5141=>yǔn +5142=>zān +5143=>yuán +5144=>xiōng +5145=>chōng +5146=>zhào +5147=>xiōng +5148=>xiān +5149=>guāng +514A=>duì +514B=>kè +514C=>duì +514D=>miǎn +514E=>tù +514F=>cháng +5150=>ér +5151=>duì +5152=>ér +5153=>jīn +5154=>tù +5155=>sì +5156=>yǎn +5157=>yǎn +5158=>shǐ +515A=>dǎng +515B=>qiān +515C=>dōu +515D=>fēn +515E=>máo +515F=>shēn +5160=>dōu +5162=>jīng +5163=>lǐ +5164=>huáng +5165=>rù +5166=>wáng +5167=>nèi +5168=>quán +5169=>liǎng +516A=>yú +516B=>bā +516C=>gōng +516D=>liù +516E=>xī +516F=>han +5170=>lán +5171=>gòng +5172=>tiān +5173=>guān +5174=>xìng +5175=>bīng +5176=>qí +5177=>jù +5178=>diǎn +5179=>zī +517A=>fēn +517B=>yǎng +517C=>jiān +517D=>shòu +517E=>jì +517F=>yì +5180=>jì +5181=>chǎn +5182=>jiōng +5183=>mào +5184=>rǎn +5185=>nèi +5186=>yuán +5187=>mǎo +5188=>gāng +5189=>rǎn +518A=>cè +518B=>jiōng +518C=>cè +518D=>zài +518E=>guǎ +518F=>jiǒng +5190=>mào +5191=>zhòu +5192=>mào +5193=>gòu +5194=>xǔ +5195=>miǎn +5196=>mì +5197=>rǒng +5198=>yín +5199=>xiě +519A=>kǎn +519B=>jūn +519C=>nóng +519D=>yí +519E=>mí +519F=>shì +51A0=>guān +51A1=>méng +51A2=>zhǒng +51A3=>jù +51A4=>yuān +51A5=>míng +51A6=>kòu +51A7=>lín +51A8=>fù +51A9=>xiě +51AA=>mì +51AB=>bīng +51AC=>dōng +51AD=>tái +51AE=>gāng +51AF=>féng +51B0=>bīng +51B1=>hù +51B2=>chōng +51B3=>jué +51B4=>hù +51B5=>kuàng +51B6=>yě +51B7=>lěng +51B8=>pàn +51B9=>fú +51BA=>mǐn +51BB=>dòng +51BC=>xiǎn +51BD=>liè +51BE=>qià +51BF=>jiān +51C0=>jìng +51C1=>shù +51C2=>měi +51C3=>tú +51C4=>qī +51C5=>gù +51C6=>zhǔn +51C7=>sōng +51C8=>jìng +51C9=>liáng +51CA=>qìng +51CB=>diāo +51CC=>líng +51CD=>dòng +51CE=>gàn +51CF=>jiǎn +51D0=>yīn +51D1=>còu +51D2=>yí +51D3=>lì +51D4=>chuàng +51D5=>mǐng +51D6=>zhun +51D7=>cuī +51D8=>sī +51D9=>duó +51DA=>jìn +51DB=>lǐn +51DC=>lǐn +51DD=>níng +51DE=>xī +51DF=>dú +51E0=>jǐ +51E1=>fán +51E2=>fán +51E3=>fán +51E4=>fèng +51E5=>jū +51E6=>chǔ +51E7=>zheng +51E8=>fēng +51E9=>mu +51EA=>zhi +51EB=>fú +51EC=>fēng +51ED=>píng +51EE=>fēng +51EF=>kǎi +51F0=>huáng +51F1=>kǎi +51F2=>gān +51F3=>dèng +51F4=>píng +51F5=>qiǎn +51F6=>xiōng +51F7=>kuài +51F8=>tū +51F9=>āo +51FA=>chū +51FB=>jī +51FC=>dàng +51FD=>hán +51FE=>hán +51FF=>záo +5200=>dāo +5201=>diāo +5202=>dāo +5203=>rèn +5204=>rèn +5205=>chuāng +5206=>fēn +5207=>qiè +5208=>yì +5209=>jī +520A=>kān +520B=>qiàn +520C=>cǔn +520D=>chú +520E=>wěn +520F=>jī +5210=>dǎn +5211=>xíng +5212=>huà +5213=>wán +5214=>jué +5215=>lí +5216=>yuè +5217=>liè +5218=>liú +5219=>zé +521A=>gāng +521B=>chuàng +521C=>fú +521D=>chū +521E=>qù +521F=>jū +5220=>shān +5221=>mǐn +5222=>líng +5223=>zhōng +5224=>pàn +5225=>bié +5226=>jié +5227=>jié +5228=>páo +5229=>lì +522A=>shān +522B=>bié +522C=>chǎn +522D=>jǐng +522E=>guā +522F=>gēng +5230=>dào +5231=>chuàng +5232=>kuī +5233=>kū +5234=>duò +5235=>èr +5236=>zhì +5237=>shuā +5238=>quàn +5239=>shā +523A=>cì +523B=>kè +523C=>jié +523D=>guì +523E=>cì +523F=>guì +5240=>kǎi +5241=>duò +5242=>jì +5243=>tì +5244=>jǐng +5245=>lóu +5246=>luǒ +5247=>zé +5248=>yuān +5249=>cuò +524A=>xuē +524B=>kè +524C=>lá +524D=>qián +524E=>shā +524F=>chuàng +5250=>guǎ +5251=>jiàn +5252=>cuò +5253=>lí +5254=>tī +5255=>fèi +5256=>pōu +5257=>chǎn +5258=>qí +5259=>chuàng +525A=>zì +525B=>gāng +525C=>wān +525D=>bō +525E=>jī +525F=>duō +5260=>qíng +5261=>shàn +5262=>dū +5263=>jiàn +5264=>jì +5265=>bō +5266=>yān +5267=>jù +5268=>huō +5269=>shèng +526A=>jiǎn +526B=>duó +526C=>duān +526D=>wū +526E=>guǎ +526F=>fù +5270=>shèng +5271=>jiàn +5272=>gē +5273=>dá +5274=>kǎi +5275=>chuàng +5276=>chuān +5277=>chǎn +5278=>tuán +5279=>lù +527A=>lí +527B=>pěng +527C=>shān +527D=>piāo +527E=>kōu +527F=>jiǎo +5280=>guā +5281=>qiāo +5282=>jué +5283=>huà +5284=>zhā +5285=>zhuò +5286=>lián +5287=>jù +5288=>pī +5289=>liú +528A=>guì +528B=>jiǎo +528C=>guì +528D=>jiàn +528E=>jiàn +528F=>tāng +5290=>huō +5291=>jì +5292=>jiàn +5293=>yì +5294=>jiàn +5295=>zhì +5296=>chán +5297=>jiǎn +5298=>mó +5299=>lí +529A=>zhǔ +529B=>lì +529C=>yà +529D=>quàn +529E=>bàn +529F=>gōng +52A0=>jiā +52A1=>wu +52A2=>mài +52A3=>liè +52A4=>jìn +52A5=>kēng +52A6=>xié +52A7=>zhǐ +52A8=>dòng +52A9=>zhù +52AA=>nǔ +52AB=>jié +52AC=>qú +52AD=>shào +52AE=>yì +52AF=>zhū +52B0=>mò +52B1=>lì +52B2=>jìn +52B3=>láo +52B4=>láo +52B5=>juàn +52B6=>kǒu +52B7=>yáng +52B8=>wā +52B9=>xiào +52BA=>móu +52BB=>kuāng +52BC=>jié +52BD=>liè +52BE=>hé +52BF=>shì +52C0=>kè +52C1=>jìn +52C2=>gào +52C3=>bó +52C4=>mǐn +52C5=>chì +52C6=>láng +52C7=>yǒng +52C8=>yǒng +52C9=>miǎn +52CA=>kè +52CB=>xūn +52CC=>juàn +52CD=>qíng +52CE=>lù +52CF=>bù +52D0=>měng +52D1=>chì +52D2=>lēi +52D3=>kài +52D4=>miǎn +52D5=>dòng +52D6=>xù +52D7=>xù +52D8=>kān +52D9=>wu +52DA=>yì +52DB=>xūn +52DC=>wěng +52DD=>shèng +52DE=>láo +52DF=>mù +52E0=>lù +52E1=>piào +52E2=>shì +52E3=>jī +52E4=>qín +52E5=>jiàng +52E6=>chāo +52E7=>quàn +52E8=>xiàng +52E9=>yì +52EA=>jué +52EB=>fān +52EC=>juān +52ED=>tóng +52EE=>jù +52EF=>dān +52F0=>xié +52F1=>mài +52F2=>xūn +52F3=>xūn +52F4=>lǜ +52F5=>lì +52F6=>chè +52F7=>ráng +52F8=>quàn +52F9=>bāo +52FA=>sháo +52FB=>yún +52FC=>jiū +52FD=>bào +52FE=>gōu +52FF=>wù +5300=>yún +5301=>wén +5302=>bi +5303=>gài +5304=>gài +5305=>bāo +5306=>cōng +5307=>yi +5308=>xiōng +5309=>pēng +530A=>jū +530B=>táo +530C=>gé +530D=>pú +530E=>è +530F=>páo +5310=>fú +5311=>gōng +5312=>dá +5313=>jiù +5314=>qiōng +5315=>bǐ +5316=>huà +5317=>běi +5318=>nǎo +5319=>shi +531A=>fāng +531B=>jiù +531C=>yí +531D=>zā +531E=>jiàng +531F=>kàng +5320=>jiang +5321=>kuāng +5322=>hū +5323=>xiá +5324=>qū +5325=>biàn +5326=>guǐ +5327=>qiè +5328=>zāng +5329=>kuāng +532A=>fěi +532B=>hū +532C=>yǔ +532D=>guǐ +532E=>kuì +532F=>huì +5330=>dān +5331=>guì +5332=>lián +5333=>lián +5334=>suǎn +5335=>dú +5336=>jiù +5337=>jué +5338=>xì +5339=>pǐ +533A=>qū +533B=>yī +533C=>kē +533D=>yǎn +533E=>biǎn +533F=>nì +5340=>qū +5341=>shí +5342=>xùn +5343=>qiān +5344=>niàn +5345=>sà +5346=>zú +5347=>shēng +5348=>wǔ +5349=>huì +534A=>bàn +534B=>shì +534C=>xì +534D=>wàn +534E=>huá +534F=>xié +5350=>wàn +5351=>bēi +5352=>zú +5353=>zhuō +5354=>xié +5355=>dān +5356=>mài +5357=>nán +5358=>dān +5359=>jí +535A=>bó +535B=>shuài +535C=>bo +535D=>kuàng +535E=>biàn +535F=>bǔ +5360=>zhàn +5361=>kǎ +5362=>lú +5363=>yǒu +5364=>lǔ +5365=>xī +5366=>guà +5367=>wò +5368=>xiè +5369=>jié +536A=>jié +536B=>wèi +536C=>áng +536D=>qióng +536E=>zhī +536F=>mǎo +5370=>yìn +5371=>wēi +5372=>shào +5373=>jí +5374=>què +5375=>luǎn +5376=>chǐ +5377=>juǎn +5378=>xiè +5379=>xù +537A=>jǐn +537B=>què +537C=>wù +537D=>jí +537E=>è +537F=>qīng +5380=>xī +5381=>san +5382=>chǎng +5383=>wěi +5384=>è +5385=>tīng +5386=>lì +5387=>zhé +5388=>hǎn +5389=>lì +538A=>yǎ +538B=>yā +538C=>yàn +538D=>shè +538E=>dǐ +538F=>zhǎ +5390=>páng +5391=>yá +5392=>hé +5393=>yá +5394=>zhì +5395=>cè +5396=>páng +5397=>tí +5398=>lí +5399=>shè +539A=>hòu +539B=>tīng +539C=>zuī +539D=>cuò +539E=>fèi +539F=>yuán +53A0=>cè +53A1=>yuán +53A2=>xiāng +53A3=>yǎn +53A4=>lì +53A5=>jué +53A6=>shà +53A7=>diān +53A8=>chú +53A9=>jiù +53AA=>jǐn +53AB=>áo +53AC=>guǐ +53AD=>yàn +53AE=>sī +53AF=>lì +53B0=>chǎng +53B1=>lán +53B2=>lì +53B3=>yán +53B4=>yǎn +53B5=>yuán +53B6=>sī +53B7=>gōng +53B8=>lín +53B9=>róu +53BA=>qù +53BB=>qù +53BC=>ěr +53BD=>lěi +53BE=>dū +53BF=>xiàn +53C0=>zhuān +53C1=>sān +53C2=>cān +53C3=>cān +53C4=>cān +53C5=>cān +53C6=>ài +53C7=>dài +53C8=>yòu +53C9=>chā +53CA=>jí +53CB=>you +53CC=>shuāng +53CD=>fǎn +53CE=>shōu +53CF=>guài +53D0=>bá +53D1=>fā +53D2=>ruò +53D3=>shì +53D4=>shū +53D5=>zhuó +53D6=>qǔ +53D7=>shòu +53D8=>biàn +53D9=>xù +53DA=>jiǎ +53DB=>pàn +53DC=>sǒu +53DD=>gào +53DE=>wèi +53DF=>sǒu +53E0=>dié +53E1=>ruì +53E2=>cóng +53E3=>kǒu +53E4=>gǔ +53E5=>jù +53E6=>lìng +53E7=>guǎ +53E8=>dāo +53E9=>kòu +53EA=>zhǐ +53EB=>jiào +53EC=>zhào +53ED=>ba +53EE=>dīng +53EF=>kě +53F0=>tái +53F1=>chì +53F2=>shǐ +53F3=>yòu +53F4=>qiú +53F5=>pǒ +53F6=>yè +53F7=>hào +53F8=>sī +53F9=>tàn +53FA=>chǐ +53FB=>lè +53FC=>diāo +53FD=>jī +53FE=>liǎo +53FF=>hōng +5400=>miē +5401=>xū +5402=>máng +5403=>chī +5404=>gè +5405=>xuān +5406=>yāo +5407=>zǐ +5408=>hé +5409=>jí +540A=>diào +540B=>cùn +540C=>tóng +540D=>míng +540E=>hòu +540F=>lì +5410=>tǔ +5411=>xiàng +5412=>zhā +5413=>xià +5414=>yě +5415=>lǚ +5416=>yā +5417=>ma +5418=>ǒu +5419=>huō +541A=>yī +541B=>jūn +541C=>chǒu +541D=>lìn +541E=>tūn +541F=>yín +5420=>fèi +5421=>bǐ +5422=>qìn +5423=>qìn +5424=>jiè +5425=>bù +5426=>fǒu +5427=>ba +5428=>dūn +5429=>fēn +542A=>é +542B=>hán +542C=>tīng +542D=>kēng +542E=>shǔn +542F=>qǐ +5430=>hóng +5431=>zhī +5432=>yǐn +5433=>wú +5434=>wú +5435=>chǎo +5436=>ne +5437=>xuè +5438=>xī +5439=>chuī +543A=>dōu +543B=>wěn +543C=>hǒu +543D=>hōng +543E=>wú +543F=>gào +5440=>ya +5441=>jùn +5442=>lǚ +5443=>è +5444=>gé +5445=>méi +5446=>dāi +5447=>qǐ +5448=>chéng +5449=>wú +544A=>gào +544B=>fū +544C=>jiào +544D=>hōng +544E=>chǐ +544F=>shēng +5450=>ne +5451=>tūn +5452=>fǔ +5453=>yì +5454=>dāi +5455=>ǒu +5456=>lì +5457=>bei +5458=>yuán +5459=>guō +545A=>wen +545B=>qiāng +545C=>wū +545D=>è +545E=>shī +545F=>juǎn +5460=>pěn +5461=>wěn +5462=>ne +5463=>ḿ +5464=>lìng +5465=>rán +5466=>yōu +5467=>dǐ +5468=>zhōu +5469=>shì +546A=>zhòu +546B=>tiè +546C=>xì +546D=>yì +546E=>qì +546F=>píng +5470=>zǐ +5471=>gū +5472=>cī +5473=>wèi +5474=>xǔ +5475=>ā +5476=>náo +5477=>gā +5478=>pēi +5479=>yì +547A=>xiāo +547B=>shēn +547C=>hū +547D=>mìng +547E=>dá +547F=>qù +5480=>jǔ +5481=>hán +5482=>zā +5483=>tuō +5484=>duō +5485=>pǒu +5486=>páo +5487=>bié +5488=>fú +5489=>yāng +548A=>hé +548B=>zǎ +548C=>hé +548D=>hāi +548E=>jiù +548F=>yǒng +5490=>fu +5491=>dā +5492=>zhòu +5493=>wǎ +5494=>kā +5495=>gu +5496=>kā +5497=>zuo +5498=>bù +5499=>lóng +549A=>dōng +549B=>níng +549C=>ta +549D=>sī +549E=>xiàn +549F=>huò +54A0=>qì +54A1=>èr +54A2=>è +54A3=>guāng +54A4=>zhà +54A5=>xì +54A6=>yí +54A7=>lie +54A8=>zī +54A9=>miē +54AA=>mī +54AB=>zhǐ +54AC=>yǎo +54AD=>jī +54AE=>zhòu +54AF=>gē +54B0=>shù +54B1=>zán +54B2=>xiào +54B3=>hāi +54B4=>huī +54B5=>kuǎ +54B6=>huài +54B7=>táo +54B8=>xián +54B9=>è +54BA=>xuǎn +54BB=>xiū +54BC=>guō +54BD=>yàn +54BE=>lǎo +54BF=>yī +54C0=>āi +54C1=>pǐn +54C2=>shěn +54C3=>tóng +54C4=>hōng +54C5=>xiōng +54C6=>duō +54C7=>wa +54C8=>hā +54C9=>zāi +54CA=>yòu +54CB=>diè +54CC=>pài +54CD=>xiǎng +54CE=>āi +54CF=>gén +54D0=>kuāng +54D1=>yǎ +54D2=>dā +54D3=>xiāo +54D4=>bì +54D5=>huì +54D6=>nian +54D7=>huā +54D8=>xing +54D9=>kuài +54DA=>duǒ +54DB=>fēn +54DC=>jì +54DD=>nóng +54DE=>mōu +54DF=>yō +54E0=>hào +54E1=>yuán +54E2=>lòng +54E3=>pǒu +54E4=>máng +54E5=>gē +54E6=>ó +54E7=>chī +54E8=>shào +54E9=>li +54EA=>nǎ +54EB=>zú +54EC=>hé +54ED=>kū +54EE=>xiāo +54EF=>xiàn +54F0=>láo +54F1=>bō +54F2=>zhé +54F3=>zhā +54F4=>liàng +54F5=>bā +54F6=>miē +54F7=>liè +54F8=>suī +54F9=>fú +54FA=>bǔ +54FB=>hàn +54FC=>hēng +54FD=>gěng +54FE=>shuō +54FF=>gě +5500=>yòu +5501=>yàn +5502=>gū +5503=>gǔ +5504=>bei +5505=>hán +5506=>suō +5507=>chún +5508=>yì +5509=>āi +550A=>jiá +550B=>tū +550C=>xián +550D=>wǎn +550E=>lì +550F=>xī +5510=>táng +5511=>zuò +5512=>qiú +5513=>chē +5514=>wú +5515=>zào +5516=>yǎ +5517=>dōu +5518=>qǐ +5519=>dí +551A=>qìn +551B=>mà +551C=>mò +551D=>gòng +551E=>dǒu +551F=>qù +5520=>láo +5521=>liǎng +5522=>suǒ +5523=>zào +5524=>huàn +5525=>lang +5526=>shā +5527=>jī +5528=>zuǒ +5529=>wō +552A=>fěng +552B=>jìn +552C=>hu +552D=>qì +552E=>shòu +552F=>wéi +5530=>shuā +5531=>chàng +5532=>ér +5533=>lì +5534=>qiàng +5535=>ǎn +5536=>zé +5537=>yō +5538=>niàn +5539=>yū +553A=>tiǎn +553B=>lài +553C=>shà +553D=>xī +553E=>tuò +553F=>hū +5540=>ái +5541=>zhāo +5542=>nǒu +5543=>kěn +5544=>zhuó +5545=>zhuó +5546=>shāng +5547=>dì +5548=>hēng +5549=>lín +554A=>a +554B=>cǎi +554C=>xiāng +554D=>tūn +554E=>wǔ +554F=>wèn +5550=>cuì +5551=>shà +5552=>gǔ +5553=>qǐ +5554=>qǐ +5555=>táo +5556=>dàn +5557=>dàn +5558=>yè +5559=>zǐ +555A=>bǐ +555B=>cuì +555C=>chuài +555D=>hé +555E=>yǎ +555F=>qǐ +5560=>zhé +5561=>fēi +5562=>liǎng +5563=>xián +5564=>pí +5565=>shà +5566=>la +5567=>zé +5568=>yīng +5569=>guà +556A=>pā +556B=>zhě +556C=>sè +556D=>zhuàn +556E=>niè +556F=>guo +5570=>luō +5571=>yān +5572=>dì +5573=>quán +5574=>chǎn +5575=>bo +5576=>dìng +5577=>lāng +5578=>xiào +5579=>jú +557A=>táng +557B=>chì +557C=>tí +557D=>án +557E=>jiū +557F=>dàn +5580=>kā +5581=>yóng +5582=>wèi +5583=>nán +5584=>shàn +5585=>yù +5586=>zhé +5587=>lǎ +5588=>jiē +5589=>hóu +558A=>hǎn +558B=>dié +558C=>zhōu +558D=>chái +558E=>wāi +558F=>nuò +5590=>yù +5591=>yīn +5592=>zá +5593=>yāo +5594=>ō +5595=>miǎn +5596=>hú +5597=>yǔn +5598=>chuǎn +5599=>huì +559A=>huàn +559B=>huàn +559C=>xǐ +559D=>hē +559E=>jī +559F=>kuì +55A0=>zhǒng +55A1=>wéi +55A2=>shà +55A3=>xù +55A4=>huáng +55A5=>duó +55A6=>niè +55A7=>xuān +55A8=>liàng +55A9=>yù +55AA=>sàng +55AB=>chī +55AC=>qiáo +55AD=>yàn +55AE=>dān +55AF=>pèn +55B0=>cān +55B1=>lí +55B2=>yō +55B3=>zhā +55B4=>wēi +55B5=>miāo +55B6=>yíng +55B7=>pēn +55B8=>bǔ +55B9=>kuí +55BA=>xì +55BB=>yù +55BC=>jié +55BD=>lou +55BE=>kù +55BF=>zào +55C0=>hù +55C1=>tí +55C2=>yáo +55C3=>hè +55C4=>á +55C5=>xiù +55C6=>qiāng +55C7=>sè +55C8=>yōng +55C9=>sù +55CA=>hǒng +55CB=>xié +55CC=>ài +55CD=>suō +55CE=>ma +55CF=>chā +55D0=>hài +55D1=>kē +55D2=>dā +55D3=>sǎng +55D4=>chēn +55D5=>rù +55D6=>sōu +55D7=>wā +55D8=>jī +55D9=>pǎng +55DA=>wū +55DB=>qiǎn +55DC=>shì +55DD=>gé +55DE=>zī +55DF=>jiē +55E0=>luò +55E1=>wēng +55E2=>wà +55E3=>sì +55E4=>chī +55E5=>háo +55E6=>suo +55E8=>hāi +55E9=>suǒ +55EA=>qín +55EB=>niè +55EC=>hē +55ED=>zhí +55EE=>sài +55EF=>ń +55F0=>gè +55F1=>ná +55F2=>diǎ +55F3=>āi +55F4=>qiang +55F5=>tōng +55F6=>bì +55F7=>áo +55F8=>áo +55F9=>lián +55FA=>zuī +55FB=>zhē +55FC=>mò +55FD=>sou +55FE=>sǒu +55FF=>tǎn +5600=>dí +5601=>qī +5602=>jiào +5603=>chōng +5604=>jiāo +5605=>kǎi +5606=>tàn +5607=>shān +5608=>cáo +5609=>jiā +560A=>ái +560B=>xiāo +560C=>piào +560D=>lou +560E=>gā +560F=>gǔ +5610=>xiāo +5611=>hū +5612=>huì +5613=>guō +5614=>ǒu +5615=>xiān +5616=>zé +5617=>cháng +5618=>xū +5619=>pó +561A=>dē +561B=>ma +561C=>mà +561D=>hú +561E=>lei +561F=>dū +5620=>gā +5621=>tāng +5622=>yě +5623=>bēng +5624=>yīng +5625=>sai +5626=>jiào +5627=>mì +5628=>xiào +5629=>huā +562A=>mǎi +562B=>rán +562C=>chuài +562D=>pēng +562E=>láo +562F=>xiào +5630=>jī +5631=>zhǔ +5632=>cháo +5633=>kuì +5634=>zuǐ +5635=>xiāo +5636=>sī +5637=>háo +5638=>fǔ +5639=>liáo +563A=>qiáo +563B=>xī +563C=>chù +563D=>chǎn +563E=>dàn +563F=>hēi +5640=>xùn +5641=>ě +5642=>zǔn +5643=>fān +5644=>chī +5645=>huī +5646=>zǎn +5647=>chuáng +5648=>cù +5649=>dàn +564A=>yù +564B=>tūn +564C=>cēng +564D=>jiào +564E=>yē +564F=>xī +5650=>qì +5651=>háo +5652=>lián +5653=>xū +5654=>dēng +5655=>huī +5656=>yín +5657=>pū +5658=>juē +5659=>qín +565A=>xún +565B=>niè +565C=>lū +565D=>sī +565E=>yǎn +565F=>yìng +5660=>dā +5661=>zhān +5662=>ō +5663=>zhòu +5664=>jìn +5665=>nóng +5666=>huì +5667=>xiè +5668=>qì +5669=>è +566A=>zào +566B=>yī +566C=>shì +566D=>jiào +566E=>yuàn +566F=>āi +5670=>yōng +5671=>jué +5672=>kuài +5673=>yǔ +5674=>pēn +5675=>dào +5676=>gá +5677=>hm +5678=>dūn +5679=>dāng +567A=>xin +567B=>sāi +567C=>pī +567D=>pǐ +567E=>yīn +567F=>zuǐ +5680=>níng +5681=>dí +5682=>làn +5683=>tā +5684=>huō +5685=>rú +5686=>hāo +5687=>xià +5688=>yè +5689=>duō +568A=>pì +568B=>chóu +568C=>jì +568D=>jìn +568E=>háo +568F=>tì +5690=>cháng +5691=>xun +5692=>me +5693=>cā +5694=>tì +5695=>lǔ +5696=>huì +5697=>bó +5698=>yōu +5699=>niè +569A=>yín +569B=>hù +569C=>me +569D=>hōng +569E=>zhé +569F=>lí +56A0=>liú +56A1=>hai +56A2=>náng +56A3=>xiāo +56A4=>mó +56A5=>yàn +56A6=>lì +56A7=>lú +56A8=>lóng +56A9=>mó +56AA=>dàn +56AB=>chèn +56AC=>pín +56AD=>pǐ +56AE=>xiàng +56AF=>huò +56B0=>mó +56B1=>xì +56B2=>duǒ +56B3=>kù +56B4=>yán +56B5=>chán +56B6=>yīng +56B7=>rǎng +56B8=>diǎn +56B9=>la +56BA=>tà +56BB=>xiāo +56BC=>jué +56BD=>chuò +56BE=>huān +56BF=>huò +56C0=>zhuàn +56C1=>niè +56C2=>xiāo +56C3=>cà +56C4=>lí +56C5=>chǎn +56C6=>chài +56C7=>lì +56C8=>yì +56C9=>luō +56CA=>náng +56CB=>zá +56CC=>sū +56CD=>xǐ +56CE=>zen +56CF=>jiān +56D0=>zá +56D1=>zhǔ +56D2=>lán +56D3=>niè +56D4=>nāng +56D5=>lǎn +56D6=>lo +56D7=>wéi +56D8=>huí +56D9=>yīn +56DA=>qiú +56DB=>sì +56DC=>nín +56DD=>jiǎn +56DE=>huí +56DF=>xìn +56E0=>yīn +56E1=>nān +56E2=>tuán +56E3=>tuán +56E4=>dùn +56E5=>kàng +56E6=>yuān +56E7=>jiǒng +56E8=>piān +56E9=>yún +56EA=>cōng +56EB=>hú +56EC=>huí +56ED=>yuán +56EE=>é +56EF=>guó +56F0=>kùn +56F1=>cōng +56F2=>tōng +56F3=>tú +56F4=>wéi +56F5=>lún +56F6=>guó +56F7=>qūn +56F8=>rì +56F9=>líng +56FA=>gù +56FB=>guó +56FC=>tāi +56FD=>guó +56FE=>tú +56FF=>yòu +5700=>guó +5701=>yín +5702=>hùn +5703=>pǔ +5704=>yǔ +5705=>hán +5706=>yuán +5707=>lún +5708=>quān +5709=>yǔ +570A=>qīng +570B=>guó +570C=>chuán +570D=>wéi +570E=>yuán +570F=>quān +5710=>kū +5711=>fù +5712=>yuán +5713=>yuán +5714=>yà +5715=>tú +5716=>tú +5717=>tú +5718=>tuán +5719=>lüè +571A=>huì +571B=>yì +571C=>huán +571D=>luán +571E=>luán +571F=>tǔ +5720=>yà +5721=>tǔ +5722=>tǐng +5723=>shèng +5724=>pǔ +5725=>lù +5726=>kuai +5727=>yā +5728=>zài +5729=>wéi +572A=>gē +572B=>yù +572C=>wū +572D=>guī +572E=>pǐ +572F=>yí +5730=>de +5731=>qiān +5732=>qiān +5733=>zhèn +5734=>zhuó +5735=>dàng +5736=>qià +5737=>xia +5738=>shan +5739=>kuàng +573A=>chǎng +573B=>qí +573C=>niè +573D=>mò +573E=>jī +573F=>jiá +5740=>zhǐ +5741=>zhǐ +5742=>bǎn +5743=>xūn +5744=>yì +5745=>qǐn +5746=>méi +5747=>jūn +5748=>rǒng +5749=>tún +574A=>fang +574B=>bèn +574C=>bèn +574D=>tān +574E=>kǎn +574F=>huài +5750=>zuò +5751=>kēng +5752=>bì +5753=>jǐng +5754=>dì +5755=>jīng +5756=>jì +5757=>kuài +5758=>dǐ +5759=>jīng +575A=>jiān +575B=>tán +575C=>lì +575D=>bà +575E=>wù +575F=>fén +5760=>zhuì +5761=>pō +5762=>bàn +5763=>tāng +5764=>kūn +5765=>qū +5766=>tǎn +5767=>zhī +5768=>tuó +5769=>gān +576A=>píng +576B=>diàn +576C=>guà +576D=>ní +576E=>tái +576F=>pī +5770=>jiōng +5771=>yǎng +5772=>fó +5773=>ào +5774=>lù +5775=>qiū +5776=>mǔ +5777=>kě +5778=>gòu +5779=>xuè +577A=>bá +577B=>chí +577C=>chè +577D=>líng +577E=>zhù +577F=>fù +5780=>hū +5781=>zhì +5782=>chuí +5783=>lā +5784=>lǒng +5785=>lǒng +5786=>lú +5787=>ào +5788=>dài +5789=>páo +578A=>min +578B=>xíng +578C=>dòng +578D=>jì +578E=>hè +578F=>lǜ +5790=>cí +5791=>chǐ +5792=>lěi +5793=>gāi +5794=>yīn +5795=>hòu +5796=>duī +5797=>zhào +5798=>fú +5799=>guāng +579A=>yáo +579B=>duǒ +579C=>duǒ +579D=>guǐ +579E=>chá +579F=>yáng +57A0=>yín +57A1=>fá +57A2=>gòu +57A3=>yuán +57A4=>dié +57A5=>xié +57A6=>kěn +57A7=>shǎng +57A8=>shǒu +57A9=>è +57AA=>bing +57AB=>diàn +57AC=>hóng +57AD=>yā +57AE=>kuǎ +57AF=>da +57B0=>ka +57B1=>dàng +57B2=>kǎi +57B3=>hang +57B4=>nǎo +57B5=>ǎn +57B6=>xīng +57B7=>xiàn +57B8=>yuàn +57B9=>bāng +57BA=>fū +57BB=>bà +57BC=>yì +57BD=>yìn +57BE=>hàn +57BF=>xù +57C0=>chuí +57C1=>qín +57C2=>gěng +57C3=>āi +57C4=>běng +57C5=>fáng +57C6=>què +57C7=>yǒng +57C8=>jùn +57C9=>jiā +57CA=>dì +57CB=>mái +57CC=>làng +57CD=>juǎn +57CE=>chéng +57CF=>shān +57D0=>jīn +57D1=>zhé +57D2=>liè +57D3=>liè +57D4=>bù +57D5=>chéng +57D6=>hua +57D7=>bù +57D8=>shí +57D9=>xūn +57DA=>guō +57DB=>jiōng +57DC=>yě +57DD=>niàn +57DE=>dǐ +57DF=>yù +57E0=>bù +57E1=>yā +57E2=>quán +57E3=>suì +57E4=>pí +57E5=>qīng +57E6=>wǎn +57E7=>jù +57E8=>lǔn +57E9=>zhēng +57EA=>kōng +57EB=>chǒng +57EC=>dōng +57ED=>dài +57EE=>tàn +57EF=>ǎn +57F0=>cài +57F1=>chù +57F2=>běng +57F3=>kǎn +57F4=>zhí +57F5=>duǒ +57F6=>yì +57F7=>zhí +57F8=>yì +57F9=>péi +57FA=>jī +57FB=>zhǔn +57FC=>qí +57FD=>sào +57FE=>jù +57FF=>ní +5800=>kū +5801=>kè +5802=>táng +5803=>kūn +5804=>nì +5805=>jiān +5806=>duī +5807=>jǐn +5808=>gāng +5809=>yù +580A=>è +580B=>péng +580C=>gù +580D=>tù +580E=>lèng +580F=>fang +5810=>yá +5811=>qiàn +5812=>kun +5813=>àn +5814=>shen +5815=>duò +5816=>nǎo +5817=>tū +5818=>chéng +5819=>yīn +581A=>hún +581B=>bì +581C=>liàn +581D=>guō +581E=>dié +581F=>zhuàn +5820=>hòu +5821=>bǎo +5822=>bǎo +5823=>yú +5824=>dī +5825=>máo +5826=>jiē +5827=>ruán +5828=>yè +5829=>gèng +582A=>kān +582B=>zōng +582C=>yú +582D=>huáng +582E=>è +582F=>yáo +5830=>yàn +5831=>bào +5832=>cí +5833=>méi +5834=>chǎng +5835=>dǔ +5836=>tuó +5837=>yìn +5838=>féng +5839=>zhòng +583A=>jiè +583B=>jīn +583C=>hèng +583D=>gāng +583E=>chūn +583F=>jiǎn +5840=>ping +5841=>lei +5842=>xiàng +5843=>huāng +5844=>léng +5845=>duàn +5846=>wān +5847=>xuān +5848=>jì +5849=>jí +584A=>kuài +584B=>yíng +584C=>tā +584D=>chéng +584E=>yǒng +584F=>kǎi +5850=>sù +5851=>sù +5852=>shí +5853=>mì +5854=>tǎ +5855=>wěng +5856=>chéng +5857=>tú +5858=>táng +5859=>què +585A=>zhǒng +585B=>lì +585C=>zhǒng +585D=>bàng +585E=>sāi +585F=>zàng +5860=>duī +5861=>tián +5862=>wù +5863=>zhèng +5864=>xūn +5865=>gé +5866=>zhèn +5867=>ài +5868=>gōng +5869=>yán +586A=>kǎn +586B=>tián +586C=>yuán +586D=>wēn +586E=>xiè +586F=>liù +5870=>hai +5871=>lǎng +5872=>cháng +5873=>péng +5874=>bèng +5875=>chén +5876=>lù +5877=>lǔ +5878=>ōu +5879=>qiàn +587A=>méi +587B=>mò +587C=>zhuān +587D=>shuǎng +587E=>shú +587F=>lǒu +5880=>chí +5881=>màn +5882=>biāo +5883=>jìng +5884=>cè +5885=>shù +5886=>zhì +5887=>zhāng +5888=>kàn +5889=>yōng +588A=>diàn +588B=>chěn +588C=>zhí +588D=>xì +588E=>guō +588F=>qiǎng +5890=>jìn +5891=>dì +5892=>shāng +5893=>mù +5894=>cuī +5895=>yàn +5896=>tǎ +5897=>zēng +5898=>qián +5899=>qiáng +589A=>liáng +589B=>wei +589C=>zhuì +589D=>qiāo +589E=>zēng +589F=>xū +58A0=>shàn +58A1=>shàn +58A2=>bá +58A3=>pú +58A4=>kuài +58A5=>dǒng +58A6=>fán +58A7=>què +58A8=>mò +58A9=>dūn +58AA=>dūn +58AB=>zūn +58AC=>dì +58AD=>shèng +58AE=>duò +58AF=>duò +58B0=>tán +58B1=>dèng +58B2=>mú +58B3=>fén +58B4=>huáng +58B5=>tán +58B6=>da +58B7=>yè +58B8=>zhu +58B9=>jian +58BA=>ào +58BB=>qiáng +58BC=>jī +58BD=>qiāo +58BE=>kěn +58BF=>yì +58C0=>pí +58C1=>bì +58C2=>diàn +58C3=>jiāng +58C4=>yě +58C5=>yōng +58C6=>xué +58C7=>tán +58C8=>lǎn +58C9=>jù +58CA=>huài +58CB=>dàng +58CC=>rǎng +58CD=>qiàn +58CE=>xūn +58CF=>xiàn +58D0=>xǐ +58D1=>hè +58D2=>ài +58D3=>yā +58D4=>dǎo +58D5=>háo +58D6=>ruán +58D7=>jin +58D8=>lěi +58D9=>kuàng +58DA=>lú +58DB=>yán +58DC=>tán +58DD=>wěi +58DE=>huài +58DF=>lǒng +58E0=>lǒng +58E1=>ruì +58E2=>lì +58E3=>lín +58E4=>rǎng +58E5=>chan +58E6=>xūn +58E7=>yán +58E8=>léi +58E9=>bà +58EA=>wān +58EB=>shì +58EC=>rén +58ED=>san +58EE=>zhuàng +58EF=>zhuàng +58F0=>shēng +58F1=>yī +58F2=>mài +58F3=>ké +58F4=>zhù +58F5=>zhuàng +58F6=>hú +58F7=>hú +58F8=>kǔn +58F9=>yī +58FA=>hú +58FB=>xù +58FC=>kǔn +58FD=>shòu +58FE=>mǎng +58FF=>zūn +5900=>shòu +5901=>yī +5902=>zhǐ +5903=>gǔ +5904=>chù +5905=>jiàng +5906=>féng +5907=>bèi +5908=>zhai +5909=>biàn +590A=>suī +590B=>qūn +590C=>líng +590D=>fù +590E=>cuò +590F=>xià +5910=>xiòng +5911=>xie +5912=>náo +5913=>xià +5914=>kuí +5915=>xī +5916=>wài +5917=>yuàn +5918=>mǎo +5919=>sù +591A=>duō +591B=>duō +591C=>yè +591D=>qíng +591E=>wài +591F=>gòu +5920=>gòu +5921=>qì +5922=>mèng +5923=>mèng +5924=>yín +5925=>huǒ +5926=>chěn +5927=>dà +5928=>zè +5929=>tiān +592A=>tài +592B=>fu +592C=>guài +592D=>yāo +592E=>yāng +592F=>hāng +5930=>gǎo +5931=>shī +5932=>tāo +5933=>tài +5934=>tóu +5935=>yǎn +5936=>bǐ +5937=>yí +5938=>kuā +5939=>jiā +593A=>duó +593B=>huà +593C=>kuǎng +593D=>yǔn +593E=>jiā +593F=>bā +5940=>ēn +5941=>lián +5942=>huàn +5943=>dī +5944=>yǎn +5945=>pào +5946=>juàn +5947=>qí +5948=>nài +5949=>fèng +594A=>xié +594B=>fèn +594C=>diǎn +594D=>yang +594E=>kuí +594F=>zòu +5950=>huàn +5951=>qì +5952=>kāi +5953=>zhā +5954=>bēn +5955=>yì +5956=>jiǎng +5957=>tào +5958=>zàng +5959=>běn +595A=>xī +595B=>huǎng +595C=>fěi +595D=>diāo +595E=>xùn +595F=>bēng +5960=>diàn +5961=>ào +5962=>shē +5963=>wěng +5964=>hǎ +5965=>ào +5966=>wù +5967=>ào +5968=>jiǎng +5969=>lián +596A=>duó +596B=>yūn +596C=>jiǎng +596D=>shì +596E=>fèn +596F=>huò +5970=>bì +5971=>luán +5972=>duǒ +5973=>nǚ +5974=>nú +5975=>dǐng +5976=>nǎi +5977=>qiān +5978=>jiān +5979=>tā +597A=>jiǔ +597B=>nuán +597C=>chà +597D=>hǎo +597E=>xiān +597F=>fàn +5980=>jǐ +5981=>shuò +5982=>rú +5983=>fēi +5984=>wàng +5985=>hóng +5986=>zhuāng +5987=>fù +5988=>mā +5989=>dān +598A=>rèn +598B=>fū +598C=>jìng +598D=>yán +598E=>hài +598F=>wèn +5990=>zhōng +5991=>pā +5992=>dù +5993=>jì +5994=>kēng +5995=>zhòng +5996=>yāo +5997=>jìn +5998=>yún +5999=>miào +599A=>fǒu +599B=>chi +599C=>yuè +599D=>zhuāng +599E=>niū +599F=>yàn +59A0=>nà +59A1=>xīn +59A2=>fén +59A3=>bǐ +59A4=>yú +59A5=>tuǒ +59A6=>fēng +59A7=>wàn +59A8=>fáng +59A9=>wǔ +59AA=>yù +59AB=>guī +59AC=>dù +59AD=>bá +59AE=>nī +59AF=>zhóu +59B0=>zhuó +59B1=>zhāo +59B2=>dá +59B3=>nǎi +59B4=>yuàn +59B5=>tǒu +59B6=>xián +59B7=>zhí +59B8=>ē +59B9=>mèi +59BA=>mò +59BB=>qī +59BC=>bì +59BD=>shēn +59BE=>qiè +59BF=>ē +59C0=>hé +59C1=>xǔ +59C2=>fá +59C3=>zhēng +59C4=>mín +59C5=>bàn +59C6=>mǔ +59C7=>fū +59C8=>líng +59C9=>zǐ +59CA=>zǐ +59CB=>shǐ +59CC=>rǎn +59CD=>shān +59CE=>yāng +59CF=>mán +59D0=>jie +59D1=>gū +59D2=>sì +59D3=>xìng +59D4=>wěi +59D5=>zī +59D6=>jù +59D7=>shān +59D8=>pīn +59D9=>rèn +59DA=>yáo +59DB=>dòng +59DC=>jiāng +59DD=>shū +59DE=>jí +59DF=>gāi +59E0=>xiàng +59E1=>huá +59E2=>juān +59E3=>jiāo +59E4=>gòu +59E5=>lǎo +59E6=>jiān +59E7=>jiān +59E8=>yí +59E9=>niàn +59EA=>zhí +59EB=>jī +59EC=>jī +59ED=>xiàn +59EE=>héng +59EF=>guāng +59F0=>jūn +59F1=>kuā +59F2=>yàn +59F3=>mǐng +59F4=>liè +59F5=>pèi +59F6=>è +59F7=>yòu +59F8=>yán +59F9=>chà +59FA=>shēn +59FB=>yīn +59FC=>shí +59FD=>guǐ +59FE=>quán +59FF=>zī +5A00=>sōng +5A01=>wēi +5A02=>hóng +5A03=>wá +5A04=>lóu +5A05=>yà +5A06=>ráo +5A07=>jiāo +5A08=>luán +5A09=>pīng +5A0A=>xiàn +5A0B=>shào +5A0C=>lǐ +5A0D=>chéng +5A0E=>xiè +5A0F=>máng +5A10=>fū +5A11=>suō +5A12=>méi +5A13=>wěi +5A14=>kè +5A15=>chuò +5A16=>chuò +5A17=>tǐng +5A18=>niang +5A19=>xíng +5A1A=>nán +5A1B=>yú +5A1C=>nà +5A1D=>pōu +5A1E=>něi +5A1F=>juān +5A20=>shēn +5A21=>zhì +5A22=>hán +5A23=>dì +5A24=>zhuāng +5A25=>é +5A26=>pín +5A27=>tuì +5A28=>xiàn +5A29=>miǎn +5A2A=>wú +5A2B=>yán +5A2C=>wǔ +5A2D=>āi +5A2E=>yán +5A2F=>yú +5A30=>sì +5A31=>yú +5A32=>wā +5A33=>li +5A34=>xián +5A35=>jū +5A36=>qǔ +5A37=>zhuì +5A38=>qī +5A39=>xián +5A3A=>zhuó +5A3B=>dōng +5A3C=>chāng +5A3D=>lù +5A3E=>ǎi +5A3F=>ē +5A40=>ē +5A41=>lóu +5A42=>mián +5A43=>cóng +5A44=>pǒu +5A45=>jú +5A46=>pó +5A47=>cāi +5A48=>líng +5A49=>wǎn +5A4A=>biǎo +5A4B=>xiāo +5A4C=>shú +5A4D=>qǐ +5A4E=>huī +5A4F=>fàn +5A50=>wǒ +5A51=>ruí +5A52=>tán +5A53=>fēi +5A54=>fei +5A55=>jié +5A56=>tiān +5A57=>ní +5A58=>quán +5A59=>jìng +5A5A=>hūn +5A5B=>jīng +5A5C=>qiān +5A5D=>diàn +5A5E=>xìng +5A5F=>hù +5A60=>wān +5A61=>lái +5A62=>bì +5A63=>yīn +5A64=>chōu +5A65=>nào +5A66=>fù +5A67=>jìng +5A68=>lún +5A69=>àn +5A6A=>lán +5A6B=>kūn +5A6C=>yín +5A6D=>yà +5A6E=>jū +5A6F=>lì +5A70=>diǎn +5A71=>xián +5A72=>hua +5A73=>huà +5A74=>yīng +5A75=>chán +5A76=>shěn +5A77=>tíng +5A78=>dàng +5A79=>yǎo +5A7A=>wù +5A7B=>nàn +5A7C=>chuò +5A7D=>jiǎ +5A7E=>tōu +5A7F=>xù +5A80=>yù +5A81=>wéi +5A82=>dì +5A83=>róu +5A84=>měi +5A85=>dān +5A86=>ruǎn +5A87=>qīn +5A88=>huī +5A89=>wò +5A8A=>qián +5A8B=>chūn +5A8C=>miáo +5A8D=>fù +5A8E=>jiě +5A8F=>duān +5A90=>yí +5A91=>zhòng +5A92=>méi +5A93=>huáng +5A94=>mián +5A95=>ān +5A96=>yīng +5A97=>xuān +5A98=>jiē +5A99=>wēi +5A9A=>mèi +5A9B=>yuàn +5A9C=>zhēng +5A9D=>qiū +5A9E=>shì +5A9F=>xiè +5AA0=>tuǒ +5AA1=>liàn +5AA2=>mào +5AA3=>rǎn +5AA4=>sī +5AA5=>piān +5AA6=>wèi +5AA7=>wā +5AA8=>jiù +5AA9=>hú +5AAA=>ǎo +5AAB=>qie +5AAC=>bǎo +5AAD=>xū +5AAE=>tōu +5AAF=>guī +5AB0=>chú +5AB1=>yáo +5AB2=>pì +5AB3=>xí +5AB4=>yuán +5AB5=>yìng +5AB6=>róng +5AB7=>rù +5AB8=>chī +5AB9=>liú +5ABA=>měi +5ABB=>pán +5ABC=>ǎo +5ABD=>mā +5ABE=>gòu +5ABF=>kuì +5AC0=>qín +5AC1=>jià +5AC2=>sǎo +5AC3=>zhēn +5AC4=>yuán +5AC5=>jiē +5AC6=>róng +5AC7=>míng +5AC8=>yīng +5AC9=>jí +5ACA=>sù +5ACB=>niǎo +5ACC=>xián +5ACD=>tāo +5ACE=>páng +5ACF=>láng +5AD0=>nǎo +5AD1=>báo +5AD2=>ài +5AD3=>pì +5AD4=>pín +5AD5=>yì +5AD6=>piáo +5AD7=>yù +5AD8=>léi +5AD9=>xuán +5ADA=>mān +5ADB=>yī +5ADC=>zhāng +5ADD=>kāng +5ADE=>yōng +5ADF=>nì +5AE0=>lí +5AE1=>dí +5AE2=>guī +5AE3=>yān +5AE4=>jǐn +5AE5=>zhuān +5AE6=>cháng +5AE7=>zé +5AE8=>hān +5AE9=>nèn +5AEA=>lào +5AEB=>mó +5AEC=>zhē +5AED=>hù +5AEE=>hù +5AEF=>ào +5AF0=>nèn +5AF1=>qiáng +5AF2=>ma +5AF3=>piè +5AF4=>gū +5AF5=>wǔ +5AF6=>qiáo +5AF7=>tuǒ +5AF8=>zhǎn +5AF9=>máo +5AFA=>xián +5AFB=>xián +5AFC=>mò +5AFD=>liáo +5AFE=>lián +5AFF=>huà +5B00=>guī +5B01=>dēng +5B02=>zhí +5B03=>xū +5B04=>yī +5B05=>huà +5B06=>xī +5B07=>kuì +5B08=>ráo +5B09=>xī +5B0A=>yàn +5B0B=>chán +5B0C=>jiāo +5B0D=>měi +5B0E=>fàn +5B0F=>fān +5B10=>xiān +5B11=>yì +5B12=>huì +5B13=>jiào +5B14=>fù +5B15=>shì +5B16=>bì +5B17=>shàn +5B18=>suì +5B19=>qiáng +5B1A=>liǎn +5B1B=>huán +5B1C=>xīn +5B1D=>niǎo +5B1E=>dǒng +5B1F=>yì +5B20=>cān +5B21=>ài +5B22=>niáng +5B23=>níng +5B24=>mā +5B25=>tiǎo +5B26=>chóu +5B27=>jìn +5B28=>cí +5B29=>yú +5B2A=>pín +5B2B=>róng +5B2C=>rú +5B2D=>nǎi +5B2E=>yān +5B2F=>tái +5B30=>yīng +5B31=>cán +5B32=>niǎo +5B33=>yuè +5B34=>yíng +5B35=>mián +5B36=>bi +5B37=>mā +5B38=>shěn +5B39=>xìng +5B3A=>nì +5B3B=>dú +5B3C=>liǔ +5B3D=>yuān +5B3E=>lǎn +5B3F=>yàn +5B40=>shuāng +5B41=>líng +5B42=>jiǎo +5B43=>niáng +5B44=>lǎn +5B45=>qiān +5B46=>yīng +5B47=>shuāng +5B48=>huì +5B49=>quán +5B4A=>mǐ +5B4B=>lí +5B4C=>luán +5B4D=>yán +5B4E=>zhú +5B4F=>lǎn +5B50=>zi +5B51=>jié +5B52=>jué +5B53=>jué +5B54=>kǒng +5B55=>yùn +5B56=>mā +5B57=>zì +5B58=>cún +5B59=>sūn +5B5A=>fú +5B5B=>bèi +5B5C=>zī +5B5D=>xiào +5B5E=>xìn +5B5F=>mèng +5B60=>sì +5B61=>tāi +5B62=>bāo +5B63=>jì +5B64=>gū +5B65=>nú +5B66=>xué +5B67=>you +5B68=>zhuǎn +5B69=>hái +5B6A=>luán +5B6B=>sūn +5B6C=>nāo +5B6D=>miē +5B6E=>cóng +5B6F=>qiān +5B70=>shú +5B71=>càn +5B72=>yā +5B73=>zī +5B74=>nǐ +5B75=>fū +5B76=>zī +5B77=>lí +5B78=>xué +5B79=>bò +5B7A=>rú +5B7B=>nái +5B7C=>niè +5B7D=>niè +5B7E=>yīng +5B7F=>luán +5B80=>mián +5B81=>níng +5B82=>rǒng +5B83=>tā +5B84=>guǐ +5B85=>zhái +5B86=>qióng +5B87=>yǔ +5B88=>shǒu +5B89=>ān +5B8A=>tū +5B8B=>sòng +5B8C=>wán +5B8D=>ròu +5B8E=>yǎo +5B8F=>hóng +5B90=>yí +5B91=>jǐng +5B92=>zhūn +5B93=>mì +5B94=>zhǔ +5B95=>dàng +5B96=>hóng +5B97=>zōng +5B98=>guān +5B99=>zhòu +5B9A=>dìng +5B9B=>wǎn +5B9C=>yi +5B9D=>bǎo +5B9E=>shí +5B9F=>shí +5BA0=>chǒng +5BA1=>shěn +5BA2=>kè +5BA3=>xuān +5BA4=>shì +5BA5=>yòu +5BA6=>huàn +5BA7=>yí +5BA8=>tiǎo +5BA9=>shǐ +5BAA=>xiàn +5BAB=>gōng +5BAC=>chéng +5BAD=>qún +5BAE=>gōng +5BAF=>xiāo +5BB0=>zǎi +5BB1=>zhà +5BB2=>bǎo +5BB3=>hài +5BB4=>yàn +5BB5=>xiāo +5BB6=>jiā +5BB7=>shěn +5BB8=>chén +5BB9=>róng +5BBA=>huǎng +5BBB=>mì +5BBC=>kòu +5BBD=>kuān +5BBE=>bīn +5BBF=>sù +5BC0=>cǎi +5BC1=>zǎn +5BC2=>jì +5BC3=>yuān +5BC4=>jì +5BC5=>yín +5BC6=>mì +5BC7=>kòu +5BC8=>qīng +5BC9=>què +5BCA=>zhēn +5BCB=>jiàn +5BCC=>fù +5BCD=>níng +5BCE=>bìng +5BCF=>huán +5BD0=>mèi +5BD1=>qǐn +5BD2=>hán +5BD3=>yù +5BD4=>shí +5BD5=>níng +5BD6=>jìn +5BD7=>níng +5BD8=>zhì +5BD9=>yǔ +5BDA=>bǎo +5BDB=>kuān +5BDC=>níng +5BDD=>qǐn +5BDE=>mò +5BDF=>chá +5BE0=>jù +5BE1=>guǎ +5BE2=>qǐn +5BE3=>hū +5BE4=>wù +5BE5=>liáo +5BE6=>shí +5BE7=>níng +5BE8=>zhài +5BE9=>shěn +5BEA=>wěi +5BEB=>xiě +5BEC=>kuān +5BED=>huì +5BEE=>liáo +5BEF=>jùn +5BF0=>huán +5BF1=>yì +5BF2=>yí +5BF3=>bǎo +5BF4=>qīn +5BF5=>chǒng +5BF6=>bǎo +5BF7=>fēng +5BF8=>cùn +5BF9=>duì +5BFA=>sì +5BFB=>xún +5BFC=>dǎo +5BFD=>lǜ +5BFE=>duì +5BFF=>shòu +5C00=>pǒ +5C01=>fēng +5C02=>zhuān +5C03=>fū +5C04=>shè +5C05=>kè +5C06=>jiāng +5C07=>jiāng +5C08=>zhuān +5C09=>wèi +5C0A=>zūn +5C0B=>xún +5C0C=>shù +5C0D=>duì +5C0E=>dǎo +5C0F=>xiǎo +5C10=>jié +5C11=>shǎo +5C12=>ěr +5C13=>ěr +5C14=>ěr +5C15=>gǎ +5C16=>jiān +5C17=>shū +5C18=>chén +5C19=>shàng +5C1A=>shàng +5C1B=>mo +5C1C=>gá +5C1D=>cháng +5C1E=>liào +5C1F=>xiǎn +5C20=>xiǎn +5C21=>kun +5C22=>yóu +5C23=>wāng +5C24=>yóu +5C25=>liào +5C26=>liào +5C27=>yáo +5C28=>máng +5C29=>wāng +5C2A=>wāng +5C2B=>wāng +5C2C=>gà +5C2D=>yáo +5C2E=>duò +5C2F=>kuì +5C30=>zhǒng +5C31=>jiù +5C32=>gān +5C33=>gǔ +5C34=>gān +5C35=>tuí +5C36=>gān +5C37=>gān +5C38=>shī +5C39=>yǐn +5C3A=>chǐ +5C3B=>kāo +5C3C=>ní +5C3D=>jǐn +5C3E=>wěi +5C3F=>niào +5C40=>jú +5C41=>pì +5C42=>céng +5C43=>xì +5C44=>bī +5C45=>jū +5C46=>jiè +5C47=>tián +5C48=>qū +5C49=>ti +5C4A=>jiè +5C4B=>wū +5C4C=>diǎo +5C4D=>shī +5C4E=>shǐ +5C4F=>píng +5C50=>jī +5C51=>xiè +5C52=>zhěn +5C53=>xiè +5C54=>ní +5C55=>zhǎn +5C56=>xī +5C57=>wěi +5C58=>mǎn +5C59=>ē +5C5A=>lòu +5C5B=>píng +5C5C=>ti +5C5D=>fèi +5C5E=>shǔ +5C5F=>xiè +5C60=>tú +5C61=>lǚ +5C62=>lǚ +5C63=>xǐ +5C64=>céng +5C65=>lǚ +5C66=>jù +5C67=>xiè +5C68=>jù +5C69=>juē +5C6A=>liáo +5C6B=>jué +5C6C=>shǔ +5C6D=>xì +5C6E=>chè +5C6F=>tún +5C70=>nì +5C71=>shān +5C72=>wa +5C73=>xiān +5C74=>lì +5C75=>è +5C76=>dao +5C77=>hui +5C78=>lóng +5C79=>yì +5C7A=>qǐ +5C7B=>rèn +5C7C=>wù +5C7D=>hàn +5C7E=>shēn +5C7F=>yǔ +5C80=>chū +5C81=>suì +5C82=>qǐ +5C83=>rèn +5C84=>yuè +5C85=>bǎn +5C86=>yǎo +5C87=>áng +5C88=>yá +5C89=>wù +5C8A=>jié +5C8B=>è +5C8C=>jí +5C8D=>qiān +5C8E=>fén +5C8F=>wán +5C90=>qí +5C91=>cén +5C92=>qián +5C93=>qí +5C94=>chà +5C95=>jiè +5C96=>qū +5C97=>gǎng +5C98=>xiàn +5C99=>ào +5C9A=>lán +5C9B=>dǎo +5C9C=>bā +5C9D=>zuò +5C9E=>zuò +5C9F=>yǎng +5CA0=>jù +5CA1=>gāng +5CA2=>kě +5CA3=>gǒu +5CA4=>xué +5CA5=>pō +5CA6=>lì +5CA7=>tiáo +5CA8=>qū +5CA9=>yán +5CAA=>fú +5CAB=>xiù +5CAC=>jiǎ +5CAD=>lǐng +5CAE=>tuó +5CAF=>pí +5CB0=>ào +5CB1=>dài +5CB2=>kuàng +5CB3=>yuè +5CB4=>qū +5CB5=>hù +5CB6=>pò +5CB7=>mín +5CB8=>àn +5CB9=>tiáo +5CBA=>líng +5CBB=>chí +5CBC=>ping +5CBD=>dōng +5CBE=>hàn +5CBF=>kuī +5CC0=>xiù +5CC1=>mǎo +5CC2=>tóng +5CC3=>xué +5CC4=>yì +5CC5=>bian +5CC6=>hé +5CC7=>bā +5CC8=>luò +5CC9=>è +5CCA=>fù +5CCB=>xún +5CCC=>dié +5CCD=>lù +5CCE=>ěn +5CCF=>ér +5CD0=>gāi +5CD1=>quān +5CD2=>dòng +5CD3=>yí +5CD4=>mǔ +5CD5=>shí +5CD6=>ān +5CD7=>wéi +5CD8=>huán +5CD9=>zhì +5CDA=>mì +5CDB=>lǐ +5CDC=>jì +5CDD=>tóng +5CDE=>wéi +5CDF=>yòu +5CE0=>gu +5CE1=>xiá +5CE2=>lǐ +5CE3=>yáo +5CE4=>jiào +5CE5=>zhēng +5CE6=>luán +5CE7=>jiāo +5CE8=>é +5CE9=>é +5CEA=>yù +5CEB=>xié +5CEC=>bū +5CED=>qiào +5CEE=>qūn +5CEF=>fēng +5CF0=>fēng +5CF1=>náo +5CF2=>lǐ +5CF3=>yóu +5CF4=>xiàn +5CF5=>hóng +5CF6=>dǎo +5CF7=>shēn +5CF8=>chéng +5CF9=>tú +5CFA=>gěng +5CFB=>jùn +5CFC=>hào +5CFD=>xiá +5CFE=>yín +5CFF=>yǔ +5D00=>làng +5D01=>kàn +5D02=>láo +5D03=>lái +5D04=>xiǎn +5D05=>què +5D06=>kōng +5D07=>chóng +5D08=>chóng +5D09=>tà +5D0A=>lín +5D0B=>huà +5D0C=>jū +5D0D=>lái +5D0E=>qí +5D0F=>mín +5D10=>kūn +5D11=>kūn +5D12=>zú +5D13=>gù +5D14=>cuī +5D15=>yá +5D16=>yá +5D17=>gǎng +5D18=>lún +5D19=>lún +5D1A=>léng +5D1B=>jué +5D1C=>duō +5D1D=>zhēng +5D1E=>guō +5D1F=>yín +5D20=>dōng +5D21=>hán +5D22=>zhēng +5D23=>wěi +5D24=>xiáo +5D25=>pí +5D26=>yān +5D27=>sōng +5D28=>jié +5D29=>bēng +5D2A=>zú +5D2B=>kū +5D2C=>dōng +5D2D=>zhǎn +5D2E=>gù +5D2F=>yín +5D30=>zi +5D31=>zè +5D32=>huáng +5D33=>yú +5D34=>wǎi +5D35=>yáng +5D36=>fēng +5D37=>qiú +5D38=>yáng +5D39=>tí +5D3A=>yǐ +5D3B=>zhì +5D3C=>shì +5D3D=>zǎi +5D3E=>yǎo +5D3F=>è +5D40=>zhù +5D41=>kān +5D42=>lǜ +5D43=>yǎn +5D44=>měi +5D45=>hán +5D46=>jī +5D47=>jī +5D48=>huàn +5D49=>tíng +5D4A=>shèng +5D4B=>méi +5D4C=>qiàn +5D4D=>wù +5D4E=>yú +5D4F=>zōng +5D50=>lán +5D51=>kě +5D52=>yán +5D53=>yán +5D54=>wěi +5D55=>zōng +5D56=>chá +5D57=>suì +5D58=>róng +5D59=>ke +5D5A=>qīn +5D5B=>yú +5D5C=>ti +5D5D=>lǒu +5D5E=>tú +5D5F=>duī +5D60=>xī +5D61=>wěng +5D62=>cāng +5D63=>dàng +5D64=>róng +5D65=>jié +5D66=>kǎi +5D67=>liú +5D68=>wù +5D69=>sōng +5D6A=>qiāo +5D6B=>zī +5D6C=>wéi +5D6D=>bēng +5D6E=>diān +5D6F=>cuó +5D70=>qiǎn +5D71=>yǒng +5D72=>niè +5D73=>cuó +5D74=>jǐ +5D75=>shi +5D76=>ruo +5D77=>sǒng +5D78=>zōng +5D79=>jiàng +5D7A=>liáo +5D7B=>kāng +5D7C=>chǎn +5D7D=>dié +5D7E=>cēn +5D7F=>dǐng +5D80=>tū +5D81=>lǒu +5D82=>zhàng +5D83=>zhǎn +5D84=>zhǎn +5D85=>áo +5D86=>cáo +5D87=>qū +5D88=>qiāng +5D89=>cuī +5D8A=>zuǐ +5D8B=>dǎo +5D8C=>dǎo +5D8D=>xí +5D8E=>yù +5D8F=>pèi +5D90=>lóng +5D91=>xiàng +5D92=>céng +5D93=>bō +5D94=>qīn +5D95=>jiāo +5D96=>yǎn +5D97=>láo +5D98=>zhàn +5D99=>lín +5D9A=>liáo +5D9B=>liáo +5D9C=>jīn +5D9D=>dèng +5D9E=>duò +5D9F=>zūn +5DA0=>jiào +5DA1=>guì +5DA2=>yáo +5DA3=>jiāo +5DA4=>yáo +5DA5=>jué +5DA6=>zhān +5DA7=>yì +5DA8=>xué +5DA9=>náo +5DAA=>yè +5DAB=>yè +5DAC=>yí +5DAD=>niè +5DAE=>xiǎn +5DAF=>jí +5DB0=>xiè +5DB1=>kě +5DB2=>xī +5DB3=>dì +5DB4=>ào +5DB5=>zuǐ +5DB6=>wei +5DB7=>yí +5DB8=>róng +5DB9=>dǎo +5DBA=>lǐng +5DBB=>zá +5DBC=>yǔ +5DBD=>yuè +5DBE=>yǐn +5DBF=>ru +5DC0=>jié +5DC1=>lì +5DC2=>guī +5DC3=>lóng +5DC4=>lóng +5DC5=>diān +5DC6=>róng +5DC7=>xī +5DC8=>jú +5DC9=>chán +5DCA=>yǐng +5DCB=>kuī +5DCC=>yán +5DCD=>wēi +5DCE=>náo +5DCF=>quán +5DD0=>chǎo +5DD1=>cuán +5DD2=>luán +5DD3=>diān +5DD4=>diān +5DD5=>nie +5DD6=>yán +5DD7=>yán +5DD8=>yǎn +5DD9=>kuí +5DDA=>yǎn +5DDB=>chuān +5DDC=>kuài +5DDD=>chuān +5DDE=>zhōu +5DDF=>huāng +5DE0=>jīng +5DE1=>xún +5DE2=>cháo +5DE3=>cháo +5DE4=>liè +5DE5=>gōng +5DE6=>zuǒ +5DE7=>qiǎo +5DE8=>jù +5DE9=>gǒng +5DEA=>jù +5DEB=>wū +5DEC=>pu +5DED=>pu +5DEE=>chà +5DEF=>qiú +5DF0=>qiú +5DF1=>jǐ +5DF2=>yǐ +5DF3=>sì +5DF4=>ba +5DF5=>zhī +5DF6=>zhāo +5DF7=>xiàng +5DF8=>yí +5DF9=>jǐn +5DFA=>xùn +5DFB=>juàn +5DFC=>bā +5DFD=>xùn +5DFE=>jīn +5DFF=>fú +5E00=>zā +5E01=>bì +5E02=>shì +5E03=>bù +5E04=>dīng +5E05=>shuài +5E06=>fān +5E07=>niè +5E08=>shī +5E09=>fēn +5E0A=>pà +5E0B=>zhǐ +5E0C=>xī +5E0D=>hù +5E0E=>dàn +5E0F=>wéi +5E10=>zhàng +5E11=>tǎng +5E12=>dài +5E13=>mò +5E14=>pèi +5E15=>pà +5E16=>tiē +5E17=>bō +5E18=>lián +5E19=>zhì +5E1A=>zhou +5E1B=>bó +5E1C=>zhì +5E1D=>dì +5E1E=>mò +5E1F=>yì +5E20=>yì +5E21=>píng +5E22=>qià +5E23=>juǎn +5E24=>rú +5E25=>shuài +5E26=>dài +5E27=>zhèng +5E28=>shuì +5E29=>qiào +5E2A=>zhēn +5E2B=>shī +5E2C=>qún +5E2D=>xí +5E2E=>bāng +5E2F=>dài +5E30=>guī +5E31=>chóu +5E32=>píng +5E33=>zhàng +5E34=>sàn +5E35=>wān +5E36=>dài +5E37=>wéi +5E38=>cháng +5E39=>shà +5E3A=>qí +5E3B=>zé +5E3C=>guó +5E3D=>mào +5E3E=>dǔ +5E3F=>hóu +5E40=>zhèng +5E41=>xū +5E42=>mì +5E43=>wéi +5E44=>wò +5E45=>fú +5E46=>yì +5E47=>bāng +5E48=>píng +5E49=>die +5E4A=>gōng +5E4B=>pán +5E4C=>huǎng +5E4D=>tāo +5E4E=>mì +5E4F=>jià +5E50=>téng +5E51=>huī +5E52=>zhōng +5E53=>shān +5E54=>màn +5E55=>mù +5E56=>biāo +5E57=>guó +5E58=>zé +5E59=>mù +5E5A=>bāng +5E5B=>zhàng +5E5C=>jǐng +5E5D=>chǎn +5E5E=>fú +5E5F=>zhì +5E60=>hū +5E61=>fān +5E62=>chuáng +5E63=>bì +5E64=>bi +5E65=>zhang +5E66=>mì +5E67=>qiāo +5E68=>chān +5E69=>fén +5E6A=>méng +5E6B=>bāng +5E6C=>chóu +5E6D=>miè +5E6E=>chú +5E6F=>jié +5E70=>xiǎn +5E71=>lán +5E72=>gàn +5E73=>píng +5E74=>nián +5E75=>jiān +5E76=>bìng +5E77=>bìng +5E78=>xìng +5E79=>gàn +5E7A=>yāo +5E7B=>huàn +5E7C=>yòu +5E7D=>yōu +5E7E=>jǐ +5E7F=>guǎng +5E80=>pǐ +5E81=>tīng +5E82=>zè +5E83=>guǎng +5E84=>zhuāng +5E85=>mo +5E86=>qìng +5E87=>bì +5E88=>qín +5E89=>dùn +5E8A=>chuáng +5E8B=>guǐ +5E8C=>yǎ +5E8D=>bài +5E8E=>jiè +5E8F=>xù +5E90=>lú +5E91=>wǔ +5E92=>zhuang +5E93=>kù +5E94=>yīng +5E95=>dǐ +5E96=>páo +5E97=>diàn +5E98=>yā +5E99=>miào +5E9A=>gēng +5E9B=>cì +5E9C=>fǔ +5E9D=>tóng +5E9E=>páng +5E9F=>fèi +5EA0=>xiáng +5EA1=>yǐ +5EA2=>zhì +5EA3=>tiāo +5EA4=>zhì +5EA5=>xiū +5EA6=>dù +5EA7=>zuò +5EA8=>xiāo +5EA9=>tú +5EAA=>guǐ +5EAB=>kù +5EAC=>máng +5EAD=>tíng +5EAE=>yǒu +5EAF=>bū +5EB0=>bìng +5EB1=>chěng +5EB2=>lái +5EB3=>bì +5EB4=>jí +5EB5=>ān +5EB6=>shù +5EB7=>kāng +5EB8=>yōng +5EB9=>tuǒ +5EBA=>sōng +5EBB=>shù +5EBC=>qǐng +5EBD=>yù +5EBE=>yǔ +5EBF=>miào +5EC0=>sōu +5EC1=>cè +5EC2=>xiāng +5EC3=>fèi +5EC4=>jiù +5EC5=>è +5EC6=>guī +5EC7=>liù +5EC8=>shà +5EC9=>lián +5ECA=>láng +5ECB=>sōu +5ECC=>zhì +5ECD=>pǒu +5ECE=>qǐng +5ECF=>jiù +5ED0=>jiù +5ED1=>jǐn +5ED2=>áo +5ED3=>kuò +5ED4=>lóu +5ED5=>yìn +5ED6=>liào +5ED7=>dài +5ED8=>lù +5ED9=>yì +5EDA=>chú +5EDB=>chán +5EDC=>tú +5EDD=>sī +5EDE=>xīn +5EDF=>miào +5EE0=>chǎng +5EE1=>wǔ +5EE2=>fèi +5EE3=>guǎng +5EE4=>kù +5EE5=>kuài +5EE6=>bì +5EE7=>qiáng +5EE8=>xiè +5EE9=>lǐn +5EEA=>lǐn +5EEB=>liáo +5EEC=>lú +5EED=>ji +5EEE=>yǐng +5EEF=>xiān +5EF0=>tīng +5EF1=>yōng +5EF2=>lí +5EF3=>tīng +5EF4=>yǐn +5EF5=>xún +5EF6=>yán +5EF7=>tíng +5EF8=>dí +5EF9=>pǎi +5EFA=>jiàn +5EFB=>huí +5EFC=>nǎi +5EFD=>huí +5EFE=>gǒng +5EFF=>niàn +5F00=>kāi +5F01=>biàn +5F02=>yì +5F03=>qì +5F04=>nòng +5F05=>fèn +5F06=>jǔ +5F07=>yǎn +5F08=>yì +5F09=>zàng +5F0A=>bì +5F0B=>yì +5F0C=>yī +5F0D=>èr +5F0E=>sān +5F0F=>shì +5F10=>èr +5F11=>shì +5F12=>shì +5F13=>gōng +5F14=>diào +5F15=>yǐn +5F16=>hù +5F17=>fú +5F18=>hóng +5F19=>wū +5F1A=>tuí +5F1B=>chí +5F1C=>jiàng +5F1D=>bà +5F1E=>shěn +5F1F=>dì +5F20=>zhāng +5F21=>jué +5F22=>tāo +5F23=>fǔ +5F24=>dǐ +5F25=>mí +5F26=>xián +5F27=>hú +5F28=>chāo +5F29=>nǔ +5F2A=>jìng +5F2B=>zhěn +5F2C=>yí +5F2D=>mǐ +5F2E=>quān +5F2F=>wān +5F30=>shāo +5F31=>ruò +5F32=>xuān +5F33=>jìng +5F34=>diāo +5F35=>zhāng +5F36=>jiàng +5F37=>qiáng +5F38=>péng +5F39=>dàn +5F3A=>qiáng +5F3B=>bì +5F3C=>bì +5F3D=>shè +5F3E=>dàn +5F3F=>jiǎn +5F40=>gòu +5F41=>ge +5F42=>fā +5F43=>bì +5F44=>kōu +5F45=>jian +5F46=>biè +5F47=>xiāo +5F48=>dàn +5F49=>guō +5F4A=>jiàng +5F4B=>hóng +5F4C=>mí +5F4D=>guō +5F4E=>wān +5F4F=>jué +5F50=>jì +5F51=>jì +5F52=>guī +5F53=>dāng +5F54=>lù +5F55=>lù +5F56=>tuàn +5F57=>huì +5F58=>zhì +5F59=>huì +5F5A=>huì +5F5B=>yí +5F5C=>yí +5F5D=>yí +5F5E=>yí +5F5F=>yuē +5F60=>yuē +5F61=>shān +5F62=>xíng +5F63=>wén +5F64=>tóng +5F65=>yàn +5F66=>yàn +5F67=>yù +5F68=>chī +5F69=>cǎi +5F6A=>biāo +5F6B=>diāo +5F6C=>bīn +5F6D=>péng +5F6E=>yǒng +5F6F=>piǎo +5F70=>zhāng +5F71=>yǐng +5F72=>chī +5F73=>chì +5F74=>zhuó +5F75=>tuǒ +5F76=>jí +5F77=>fǎng +5F78=>zhōng +5F79=>yì +5F7A=>wáng +5F7B=>chè +5F7C=>bǐ +5F7D=>dī +5F7E=>líng +5F7F=>fú +5F80=>wǎng +5F81=>zhēng +5F82=>cú +5F83=>wǎng +5F84=>jìng +5F85=>dài +5F86=>xī +5F87=>xùn +5F88=>hěn +5F89=>yáng +5F8A=>huái +5F8B=>lǜ +5F8C=>hòu +5F8D=>wǎng +5F8E=>chěng +5F8F=>zhì +5F90=>xú +5F91=>jìng +5F92=>tú +5F93=>cóng +5F94=>zhi +5F95=>lái +5F96=>cóng +5F97=>de +5F98=>pái +5F99=>xǐ +5F9A=>dōng +5F9B=>jì +5F9C=>cháng +5F9D=>zhì +5F9E=>cóng +5F9F=>zhōu +5FA0=>lái +5FA1=>yù +5FA2=>xiè +5FA3=>jiè +5FA4=>jiàn +5FA5=>shì +5FA6=>jiǎ +5FA7=>biàn +5FA8=>huáng +5FA9=>fù +5FAA=>xún +5FAB=>wěi +5FAC=>páng +5FAD=>yáo +5FAE=>wēi +5FAF=>xī +5FB0=>zhēng +5FB1=>piào +5FB2=>tí +5FB3=>dé +5FB4=>zhēng +5FB5=>zhēng +5FB6=>bié +5FB7=>dé +5FB8=>chōng +5FB9=>chè +5FBA=>jiǎo +5FBB=>huì +5FBC=>jiǎo +5FBD=>huī +5FBE=>méi +5FBF=>lòng +5FC0=>xiāng +5FC1=>bào +5FC2=>qú +5FC3=>xīn +5FC4=>xin +5FC5=>bì +5FC6=>yì +5FC7=>lè +5FC8=>rén +5FC9=>dāo +5FCA=>dìng +5FCB=>gǎi +5FCC=>jì +5FCD=>rěn +5FCE=>rén +5FCF=>chàn +5FD0=>tǎn +5FD1=>tè +5FD2=>tè +5FD3=>gān +5FD4=>qì +5FD5=>shì +5FD6=>cǔn +5FD7=>zhì +5FD8=>wàng +5FD9=>máng +5FDA=>xī +5FDB=>fán +5FDC=>yīng +5FDD=>tiǎn +5FDE=>mín +5FDF=>wěn +5FE0=>zhōng +5FE1=>chōng +5FE2=>wù +5FE3=>jí +5FE4=>wǔ +5FE5=>xì +5FE6=>jiá +5FE7=>yōu +5FE8=>wàn +5FE9=>cōng +5FEA=>sōng +5FEB=>kuài +5FEC=>yù +5FED=>biàn +5FEE=>zhì +5FEF=>qí +5FF0=>cuì +5FF1=>chén +5FF2=>tài +5FF3=>tún +5FF4=>qián +5FF5=>niàn +5FF6=>hún +5FF7=>xiōng +5FF8=>niǔ +5FF9=>kuáng +5FFA=>xiān +5FFB=>xīn +5FFC=>kāng +5FFD=>hū +5FFE=>kài +5FFF=>fèn +6000=>huái +6001=>tài +6002=>sǒng +6003=>wǔ +6004=>òu +6005=>chàng +6006=>chuàng +6007=>jù +6008=>yì +6009=>bǎo +600A=>chāo +600B=>mín +600C=>pēi +600D=>zuò +600E=>zěn +600F=>yàng +6010=>jù +6011=>bàn +6012=>nù +6013=>náo +6014=>zhēng +6015=>pà +6016=>bù +6017=>tiē +6018=>hù +6019=>hù +601A=>jù +601B=>dá +601C=>lián +601D=>sī +601E=>chóu +601F=>dì +6020=>dài +6021=>yí +6022=>tū +6023=>yóu +6024=>fū +6025=>jí +6026=>pēng +6027=>xìng +6028=>yuàn +6029=>ní +602A=>guài +602B=>fú +602C=>xì +602D=>bì +602E=>yōu +602F=>qiè +6030=>xuàn +6031=>cōng +6032=>bǐng +6033=>huǎng +6034=>xù +6035=>chù +6036=>bì +6037=>shù +6038=>xī +6039=>tān +603A=>yong +603B=>zǒng +603C=>duì +603D=>mo +603E=>zhǐ +603F=>yì +6040=>shì +6041=>nèn +6042=>xún +6043=>shì +6044=>xì +6045=>lǎo +6046=>héng +6047=>kuāng +6048=>móu +6049=>zhǐ +604A=>xié +604B=>liàn +604C=>tiāo +604D=>huǎng +604E=>dié +604F=>hào +6050=>kǒng +6051=>guǐ +6052=>héng +6053=>xī +6054=>jiǎo +6055=>shù +6056=>si +6057=>hū +6058=>qiū +6059=>yàng +605A=>huì +605B=>huí +605C=>chì +605D=>jiá +605E=>yí +605F=>xiōng +6060=>guài +6061=>lìn +6062=>huī +6063=>zì +6064=>xù +6065=>chǐ +6066=>shàng +6067=>nǜ +6068=>hèn +6069=>ēn +606A=>kè +606B=>dòng +606C=>tián +606D=>gōng +606E=>quān +606F=>xi +6070=>qià +6071=>yuè +6072=>pēng +6073=>kěn +6074=>dé +6075=>huì +6076=>è +6077=>xiao +6078=>tòng +6079=>yān +607A=>kǎi +607B=>cè +607C=>nǎo +607D=>yùn +607E=>máng +607F=>yǒng +6080=>yǒng +6081=>yuān +6082=>pī +6083=>kǔn +6084=>qiāo +6085=>yuè +6086=>yù +6087=>tú +6088=>jiè +6089=>xī +608A=>zhé +608B=>lìn +608C=>tì +608D=>hàn +608E=>hào +608F=>qiè +6090=>tì +6091=>bù +6092=>yì +6093=>qiàn +6094=>huǐ +6095=>xī +6096=>bèi +6097=>mán +6098=>yī +6099=>hēng +609A=>sǒng +609B=>quān +609C=>chěng +609D=>kuī +609E=>wù +609F=>wù +60A0=>yōu +60A1=>lí +60A2=>liàng +60A3=>huàn +60A4=>cōng +60A5=>yì +60A6=>yuè +60A7=>lì +60A8=>nín +60A9=>nǎo +60AA=>è +60AB=>què +60AC=>xuán +60AD=>qiān +60AE=>wù +60AF=>mǐn +60B0=>cóng +60B1=>fěi +60B2=>bēi +60B3=>duó +60B4=>cuì +60B5=>chàng +60B6=>mèn +60B7=>sàn +60B8=>jì +60B9=>guàn +60BA=>guàn +60BB=>xìng +60BC=>dào +60BD=>qī +60BE=>kōng +60BF=>tiǎn +60C0=>lún +60C1=>xī +60C2=>kǎn +60C3=>gǔn +60C4=>nì +60C5=>qíng +60C6=>chóu +60C7=>dūn +60C8=>guǒ +60C9=>zhān +60CA=>jīng +60CB=>wǎn +60CC=>yuān +60CD=>jīn +60CE=>jì +60CF=>lán +60D0=>yù +60D1=>huò +60D2=>hé +60D3=>quán +60D4=>tán +60D5=>tì +60D6=>tì +60D7=>niè +60D8=>wǎng +60D9=>chuò +60DA=>hū +60DB=>hūn +60DC=>xī +60DD=>chǎng +60DE=>xīn +60DF=>wéi +60E0=>huì +60E1=>è +60E2=>suǒ +60E3=>zǒng +60E4=>jiān +60E5=>yǒng +60E6=>diàn +60E7=>jù +60E8=>cǎn +60E9=>chéng +60EA=>dé +60EB=>bèi +60EC=>qiè +60ED=>cán +60EE=>dàn +60EF=>guàn +60F0=>duò +60F1=>nǎo +60F2=>yùn +60F3=>xiǎng +60F4=>zhuì +60F5=>dié +60F6=>huáng +60F7=>chǔn +60F8=>qióng +60F9=>rě +60FA=>xīng +60FB=>cè +60FC=>biǎn +60FD=>mǐn +60FE=>zōng +60FF=>tí +6100=>qiǎo +6101=>chóu +6102=>bèi +6103=>xuān +6104=>wēi +6105=>gé +6106=>qiān +6107=>wěi +6108=>yù +6109=>yú +610A=>bì +610B=>xuān +610C=>huàn +610D=>mǐn +610E=>bì +610F=>yì +6110=>miǎn +6111=>yǒng +6112=>kài +6113=>dàng +6114=>yīn +6115=>è +6116=>chén +6117=>mào +6118=>qià +6119=>kè +611A=>yú +611B=>ài +611C=>qiè +611D=>yǎn +611E=>nuò +611F=>gǎn +6120=>yùn +6121=>zǒng +6122=>sāi +6123=>lèng +6124=>fèn +6125=>ying +6126=>kuì +6127=>kuì +6128=>què +6129=>gōng +612A=>yún +612B=>sù +612C=>sù +612D=>qí +612E=>yáo +612F=>sǒng +6130=>huàng +6131=>jí +6132=>gǔ +6133=>jù +6134=>chuàng +6135=>nì +6136=>xié +6137=>kǎi +6138=>zhěng +6139=>yǒng +613A=>cǎo +613B=>xùn +613C=>shèn +613D=>bó +613E=>kài +613F=>yuàn +6140=>xì +6141=>hùn +6142=>yǒng +6143=>yǎng +6144=>lì +6145=>sāo +6146=>tāo +6147=>yīn +6148=>cí +6149=>xù +614A=>qiàn +614B=>tài +614C=>huāng +614D=>yùn +614E=>shèn +614F=>mǐng +6150=>gong +6151=>shè +6152=>cóng +6153=>piāo +6154=>mù +6155=>mù +6156=>guó +6157=>chì +6158=>cǎn +6159=>cán +615A=>cán +615B=>cuī +615C=>mǐn +615D=>tè +615E=>zhāng +615F=>tòng +6160=>ào +6161=>shuǎng +6162=>màn +6163=>guàn +6164=>què +6165=>zào +6166=>jiù +6167=>huì +6168=>kǎi +6169=>lián +616A=>òu +616B=>sǒng +616C=>qín +616D=>yìn +616E=>lǜ +616F=>shāng +6170=>wèi +6171=>tuán +6172=>mán +6173=>qiān +6174=>shè +6175=>yōng +6176=>qìng +6177=>kāng +6178=>dì +6179=>zhí +617A=>lóu +617B=>juàn +617C=>qī +617D=>qī +617E=>yù +617F=>píng +6180=>liáo +6181=>còng +6182=>yōu +6183=>chōng +6184=>zhì +6185=>tòng +6186=>chēng +6187=>qì +6188=>qū +6189=>péng +618A=>bèi +618B=>biē +618C=>qióng +618D=>jiāo +618E=>zēng +618F=>chì +6190=>lián +6191=>píng +6192=>kuì +6193=>huì +6194=>qiáo +6195=>chéng +6196=>yìn +6197=>yìn +6198=>xǐ +6199=>xī +619A=>dàn +619B=>tán +619C=>duǒ +619D=>duì +619E=>duì +619F=>sù +61A0=>jué +61A1=>cè +61A2=>xiāo +61A3=>fān +61A4=>fèn +61A5=>láo +61A6=>lào +61A7=>chōng +61A8=>hān +61A9=>qì +61AA=>xián +61AB=>mǐn +61AC=>jǐng +61AD=>liǎo +61AE=>wǔ +61AF=>cǎn +61B0=>jué +61B1=>cù +61B2=>xiàn +61B3=>tǎn +61B4=>shéng +61B5=>pī +61B6=>yì +61B7=>chù +61B8=>xiān +61B9=>náo +61BA=>dàn +61BB=>tǎn +61BC=>jǐng +61BD=>sōng +61BE=>hàn +61BF=>jiǎo +61C0=>wèi +61C1=>xuān +61C2=>dǒng +61C3=>qín +61C4=>qín +61C5=>jù +61C6=>cǎo +61C7=>kěn +61C8=>xiè +61C9=>yīng +61CA=>ào +61CB=>mào +61CC=>yì +61CD=>lǐn +61CE=>sè +61CF=>jùn +61D0=>huái +61D1=>mèn +61D2=>lǎn +61D3=>ài +61D4=>lǐn +61D5=>yān +61D6=>kuò +61D7=>xià +61D8=>chì +61D9=>yǔ +61DA=>yìn +61DB=>dāi +61DC=>měng +61DD=>ài +61DE=>méng +61DF=>duì +61E0=>qí +61E1=>mǒ +61E2=>lán +61E3=>mèn +61E4=>chóu +61E5=>zhì +61E6=>nuò +61E7=>nuò +61E8=>yān +61E9=>yǎng +61EA=>bó +61EB=>zhì +61EC=>kuàng +61ED=>kuǎng +61EE=>yǒu +61EF=>fū +61F0=>liú +61F1=>miè +61F2=>chéng +61F3=>hui +61F4=>chàn +61F5=>měng +61F6=>lǎn +61F7=>huái +61F8=>xuán +61F9=>ràng +61FA=>chàn +61FB=>jì +61FC=>jù +61FD=>huān +61FE=>shè +61FF=>yì +6200=>liàn +6201=>nǎn +6202=>mí +6203=>tǎng +6204=>jué +6205=>gàng +6206=>gàng +6207=>zhuàng +6208=>gē +6209=>yuè +620A=>wù +620B=>jiān +620C=>xū +620D=>shù +620E=>róng +620F=>xì +6210=>chéng +6211=>wǒ +6212=>jiè +6213=>gē +6214=>jiān +6215=>qiāng +6216=>huò +6217=>qiāng +6218=>zhàn +6219=>dòng +621A=>qi +621B=>jiá +621C=>dié +621D=>zéi +621E=>jiá +621F=>jǐ +6220=>zhī +6221=>kān +6222=>jí +6223=>kuí +6224=>gài +6225=>děng +6226=>zhàn +6227=>qiāng +6228=>gē +6229=>jiǎn +622A=>jié +622B=>yù +622C=>jiǎn +622D=>yǎn +622E=>lù +622F=>hū +6230=>zhàn +6231=>xì +6232=>xì +6233=>chuō +6234=>dài +6235=>qú +6236=>hù +6237=>hù +6238=>hù +6239=>è +623A=>shì +623B=>tì +623C=>mǎo +623D=>hù +623E=>lì +623F=>fáng +6240=>suǒ +6241=>biǎn +6242=>diàn +6243=>jiōng +6244=>shǎng +6245=>yí +6246=>yǐ +6247=>shàn +6248=>hù +6249=>fēi +624A=>yǎn +624B=>shǒu +624C=>shou +624D=>cái +624E=>zhā +624F=>qiú +6250=>lè +6251=>pū +6252=>bā +6253=>dǎ +6254=>rēng +6255=>fǎn +6256=>ru +6257=>zài +6258=>tuō +6259=>zhàng +625A=>diǎo +625B=>káng +625C=>yū +625D=>kū +625E=>gǎn +625F=>shēn +6260=>chā +6261=>tuō +6262=>gǔ +6263=>kòu +6264=>wù +6265=>dèn +6266=>qiān +6267=>zhí +6268=>rèn +6269=>kuò +626A=>mén +626B=>sǎo +626C=>yáng +626D=>niǔ +626E=>ban +626F=>chě +6270=>rǎo +6271=>xī +6272=>qián +6273=>bān +6274=>jiá +6275=>yú +6276=>fú +6277=>ào +6278=>xī +6279=>pī +627A=>zhǐ +627B=>zhì +627C=>è +627D=>dèn +627E=>zhǎo +627F=>chéng +6280=>jì +6281=>yǎn +6282=>kuáng +6283=>biàn +6284=>chāo +6285=>jū +6286=>wěn +6287=>hú +6288=>yuè +6289=>jué +628A=>bǎ +628B=>qìn +628C=>dǎn +628D=>zhěng +628E=>yǔn +628F=>wán +6290=>nè +6291=>yì +6292=>shū +6293=>zhuā +6294=>póu +6295=>tóu +6296=>dǒu +6297=>kàng +6298=>zhé +6299=>póu +629A=>fǔ +629B=>pāo +629C=>bá +629D=>ǎo +629E=>zé +629F=>tuán +62A0=>kōu +62A1=>lūn +62A2=>qiǎng +62A3=>yun +62A4=>hù +62A5=>bào +62A6=>bǐng +62A7=>zhǐ +62A8=>pēng +62A9=>tān +62AA=>bù +62AB=>pī +62AC=>tái +62AD=>yǎo +62AE=>zhěn +62AF=>zhā +62B0=>yāng +62B1=>bào +62B2=>hē +62B3=>nǐ +62B4=>yè +62B5=>dǐ +62B6=>chì +62B7=>pī +62B8=>jiā +62B9=>mǒ +62BA=>mèi +62BB=>chēn +62BC=>yā +62BD=>chōu +62BE=>qū +62BF=>mǐn +62C0=>chù +62C1=>jiā +62C2=>fú +62C3=>zhǎ +62C4=>zhǔ +62C5=>dān +62C6=>chāi +62C7=>mu +62C8=>niān +62C9=>lā +62CA=>fǔ +62CB=>pāo +62CC=>bàn +62CD=>pāi +62CE=>līn +62CF=>ná +62D0=>guǎi +62D1=>qián +62D2=>jù +62D3=>tà +62D4=>bá +62D5=>tuō +62D6=>tuō +62D7=>ǎo +62D8=>jū +62D9=>zhuō +62DA=>pàn +62DB=>zhāo +62DC=>bài +62DD=>bài +62DE=>dǐ +62DF=>nǐ +62E0=>jù +62E1=>kuò +62E2=>lǒng +62E3=>jiǎn +62E4=>qiá +62E5=>yōng +62E6=>lán +62E7=>níng +62E8=>bō +62E9=>zé +62EA=>qiān +62EB=>hén +62EC=>kuò +62ED=>shì +62EE=>jié +62EF=>zhěng +62F0=>nǐn +62F1=>gǒng +62F2=>gǒng +62F3=>quán +62F4=>shuān +62F5=>cún +62F6=>zā +62F7=>kǎo +62F8=>yí +62F9=>xié +62FA=>cè +62FB=>huī +62FC=>pīn +62FD=>zhuāi +62FE=>shi +62FF=>ná +6300=>bāi +6301=>chí +6302=>guà +6303=>zhì +6304=>kuò +6305=>duǒ +6306=>duǒ +6307=>zhǐ +6308=>qiè +6309=>àn +630A=>nòng +630B=>zhèn +630C=>gé +630D=>jiào +630E=>kuà +630F=>dòng +6310=>ná +6311=>tiāo +6312=>liè +6313=>zhā +6314=>lǚ +6315=>dié +6316=>wā +6317=>jué +6318=>lie +6319=>jǔ +631A=>zhì +631B=>luán +631C=>yà +631D=>wō +631E=>tà +631F=>xié +6320=>náo +6321=>dǎng +6322=>jiǎo +6323=>zhēng +6324=>jǐ +6325=>huī +6326=>xián +6327=>yu +6328=>āi +6329=>tuō +632A=>nuó +632B=>cuò +632C=>bó +632D=>gěng +632E=>tǐ +632F=>zhèn +6330=>chéng +6331=>sā +6332=>sā +6333=>kēng +6334=>měi +6335=>lòng +6336=>jū +6337=>péng +6338=>jiǎn +6339=>yì +633A=>tǐng +633B=>shān +633C=>ruá +633D=>wǎn +633E=>xié +633F=>chā +6340=>féng +6341=>jiǎo +6342=>wǔ +6343=>jùn +6344=>jiù +6345=>tǒng +6346=>kǔn +6347=>huò +6348=>tú +6349=>zhuō +634A=>póu +634B=>lǚ +634C=>bā +634D=>hàn +634E=>shāo +634F=>niē +6350=>juān +6351=>zè +6352=>shù +6353=>yé +6354=>jué +6355=>bǔ +6356=>wán +6357=>bù +6358=>zùn +6359=>yì +635A=>zhāi +635B=>lǚ +635C=>sōu +635D=>tuō +635E=>lāo +635F=>sǔn +6360=>bāng +6361=>jiǎn +6362=>huàn +6363=>dǎo +6364=>wei +6365=>wàn +6366=>qín +6367=>pěng +6368=>shě +6369=>liè +636A=>mín +636B=>mén +636C=>fǔ +636D=>bǎi +636E=>jù +636F=>dáo +6370=>wǒ +6371=>ái +6372=>juǎn +6373=>yuè +6374=>zǒng +6375=>chēn +6376=>chuí +6377=>jié +6378=>tū +6379=>bèn +637A=>nà +637B=>niǎn +637C=>ruó +637D=>zuó +637E=>wò +637F=>xī +6380=>xiān +6381=>chéng +6382=>diān +6383=>sǎo +6384=>lūn +6385=>qìng +6386=>gāng +6387=>duō +6388=>shòu +6389=>diào +638A=>póu +638B=>dǐ +638C=>zhǎng +638D=>hùn +638E=>jǐ +638F=>tāo +6390=>qiā +6391=>qí +6392=>pái +6393=>shū +6394=>qiān +6395=>líng +6396=>yē +6397=>yà +6398=>jué +6399=>zhēng +639A=>liǎng +639B=>guà +639C=>yì +639D=>huò +639E=>shàn +639F=>zhěng +63A0=>è +63A1=>cǎi +63A2=>tàn +63A3=>chè +63A4=>bīng +63A5=>jiē +63A6=>tì +63A7=>kòng +63A8=>tuī +63A9=>yǎn +63AA=>cuò +63AB=>zhōu +63AC=>jū +63AD=>tiàn +63AE=>qián +63AF=>kèn +63B0=>bāi +63B1=>pá +63B2=>jiē +63B3=>lǔ +63B4=>guāi +63B5=>ming +63B6=>geng +63B7=>zhì +63B8=>dǎn +63B9=>meng +63BA=>càn +63BB=>sāo +63BC=>guàn +63BD=>pèng +63BE=>yuàn +63BF=>nuò +63C0=>jiǎn +63C1=>zhēng +63C2=>jiū +63C3=>jiǎn +63C4=>yú +63C5=>yán +63C6=>kuí +63C7=>nǎn +63C8=>hōng +63C9=>róu +63CA=>pì +63CB=>wēi +63CC=>sāi +63CD=>zòu +63CE=>xuān +63CF=>miáo +63D0=>tí +63D1=>niē +63D2=>chā +63D3=>shì +63D4=>zǒng +63D5=>zhèn +63D6=>yī +63D7=>xún +63D8=>yóng +63D9=>biān +63DA=>yáng +63DB=>huàn +63DC=>yǎn +63DD=>zǎn +63DE=>ǎn +63DF=>xū +63E0=>yà +63E1=>wò +63E2=>ké +63E3=>chuāi +63E4=>jí +63E5=>tì +63E6=>lá +63E7=>là +63E8=>chén +63E9=>kāi +63EA=>jiū +63EB=>jiū +63EC=>tú +63ED=>jiē +63EE=>huī +63EF=>gèn +63F0=>chòng +63F1=>xiāo +63F2=>dié +63F3=>xiē +63F4=>yuán +63F5=>qián +63F6=>yé +63F7=>chā +63F8=>zhā +63F9=>bēi +63FA=>yáo +63FB=>wēi +63FC=>beng +63FD=>lǎn +63FE=>wèn +63FF=>qìn +6400=>chān +6401=>gē +6402=>lǒu +6403=>zǒng +6404=>gēng +6405=>jiǎo +6406=>gòu +6407=>qìn +6408=>róng +6409=>què +640A=>chōu +640B=>chuāi +640C=>zhǎn +640D=>sǔn +640E=>sūn +640F=>bó +6410=>chù +6411=>róng +6412=>bàng +6413=>cuō +6414=>sāo +6415=>kē +6416=>yáo +6417=>dǎo +6418=>zhī +6419=>nù +641A=>lā +641B=>jiān +641C=>sōu +641D=>qiǔ +641E=>gǎo +641F=>xiǎn +6420=>shuò +6421=>sǎng +6422=>jìn +6423=>miè +6424=>è +6425=>chuí +6426=>nuò +6427=>shān +6428=>tà +6429=>zhǎ +642A=>táng +642B=>pán +642C=>bān +642D=>dā +642E=>lì +642F=>tāo +6430=>hú +6431=>zhì +6432=>wā +6433=>huá +6434=>qiān +6435=>wèn +6436=>qiǎng +6437=>tián +6438=>zhēn +6439=>è +643A=>xié +643B=>nuò +643C=>quán +643D=>chá +643E=>zhà +643F=>gé +6440=>wǔ +6441=>èn +6442=>shè +6443=>káng +6444=>shè +6445=>shū +6446=>bǎi +6447=>yáo +6448=>bìn +6449=>sōu +644A=>tān +644B=>sà +644C=>chǎn +644D=>suō +644E=>jiū +644F=>chōng +6450=>chuāng +6451=>guāi +6452=>bǐng +6453=>féng +6454=>shuāi +6455=>dì +6456=>qì +6457=>sōu +6458=>zhāi +6459=>liǎn +645A=>chēng +645B=>chī +645C=>guàn +645D=>lù +645E=>luò +645F=>lǒu +6460=>zǒng +6461=>gài +6462=>hù +6463=>zhā +6464=>chuǎng +6465=>tàng +6466=>huà +6467=>cuī +6468=>nái +6469=>mó +646A=>jiāng +646B=>guī +646C=>yǐng +646D=>zhí +646E=>áo +646F=>zhì +6470=>niè +6471=>màn +6472=>chàn +6473=>kōu +6474=>chū +6475=>shè +6476=>tuán +6477=>jiǎo +6478=>mō +6479=>mó +647A=>zhé +647B=>càn +647C=>kēng +647D=>biāo +647E=>jiàng +647F=>yīn +6480=>gòu +6481=>qiān +6482=>liào +6483=>jí +6484=>yīng +6485=>juē +6486=>piē +6487=>piē +6488=>lāo +6489=>dūn +648A=>xiàn +648B=>ruán +648C=>guì +648D=>zǎn +648E=>yì +648F=>xián +6490=>chēng +6491=>chēng +6492=>sā +6493=>náo +6494=>hòng +6495=>sī +6496=>hàn +6497=>guàng +6498=>dā +6499=>zǔn +649A=>niǎn +649B=>lǐn +649C=>zhěng +649D=>huī +649E=>zhuàng +649F=>jiǎo +64A0=>jǐ +64A1=>cāo +64A2=>dǎn +64A3=>dǎn +64A4=>chè +64A5=>bō +64A6=>chě +64A7=>juē +64A8=>fǔ +64A9=>liāo +64AA=>bèn +64AB=>fǔ +64AC=>qiào +64AD=>bō +64AE=>cuō +64AF=>zhuó +64B0=>zhuàn +64B1=>wěi +64B2=>pū +64B3=>qìn +64B4=>dūn +64B5=>niǎn +64B6=>huá +64B7=>xié +64B8=>lū +64B9=>jiǎo +64BA=>cuān +64BB=>tà +64BC=>hàn +64BD=>qiào +64BE=>wō +64BF=>jiǎn +64C0=>gǎn +64C1=>yōng +64C2=>léi +64C3=>nǎng +64C4=>lǔ +64C5=>shàn +64C6=>zhuó +64C7=>zé +64C8=>pū +64C9=>chuò +64CA=>jī +64CB=>dǎng +64CC=>sè +64CD=>cāo +64CE=>qíng +64CF=>qíng +64D0=>huàn +64D1=>jiē +64D2=>qín +64D3=>kuǎi +64D4=>dān +64D5=>xié +64D6=>kā +64D7=>pǐ +64D8=>bāi +64D9=>ào +64DA=>jù +64DB=>yè +64DC=>e +64DD=>meng +64DE=>sǒu +64DF=>mí +64E0=>jǐ +64E1=>tái +64E2=>zhuó +64E3=>dǎo +64E4=>xǐng +64E5=>lǎn +64E6=>cā +64E7=>jǔ +64E8=>yé +64E9=>rǔ +64EA=>yè +64EB=>yè +64EC=>nǐ +64ED=>wò +64EE=>jí +64EF=>bìn +64F0=>níng +64F1=>gē +64F2=>zhì +64F3=>zhì +64F4=>kuò +64F5=>mó +64F6=>jiàn +64F7=>xié +64F8=>liè +64F9=>tān +64FA=>bǎi +64FB=>sǒu +64FC=>lǔ +64FD=>lüè +64FE=>rǎo +64FF=>tī +6500=>pān +6501=>yǎng +6502=>lèi +6503=>cā +6504=>shū +6505=>zǎn +6506=>niǎn +6507=>xiǎn +6508=>jùn +6509=>huō +650A=>lì +650B=>là +650C=>huǎn +650D=>yíng +650E=>lú +650F=>lǒng +6510=>qiān +6511=>qiān +6512=>zǎn +6513=>qiān +6514=>lán +6515=>xiān +6516=>yīng +6517=>méi +6518=>rǎng +6519=>chān +651A=>ying +651B=>cuān +651C=>xié +651D=>shè +651E=>luó +651F=>jùn +6520=>mí +6521=>lí +6522=>zǎn +6523=>luán +6524=>tān +6525=>zuàn +6526=>lì +6527=>diān +6528=>wā +6529=>dǎng +652A=>jiǎo +652B=>jué +652C=>lǎn +652D=>lì +652E=>nǎng +652F=>zhī +6530=>guì +6531=>guǐ +6532=>qī +6533=>xún +6534=>pū +6535=>suī +6536=>shōu +6537=>kǎo +6538=>yōu +6539=>gǎi +653A=>yǐ +653B=>gōng +653C=>gān +653D=>bān +653E=>fàng +653F=>zhèng +6540=>pò +6541=>diān +6542=>kòu +6543=>mǐn +6544=>wù +6545=>gù +6546=>hé +6547=>cè +6548=>xiào +6549=>mǐ +654A=>chù +654B=>gé +654C=>dí +654D=>xù +654E=>jiào +654F=>mǐn +6550=>chén +6551=>jiù +6552=>shēn +6553=>duó +6554=>yǔ +6555=>chì +6556=>áo +6557=>bài +6558=>xù +6559=>jiào +655A=>duó +655B=>liǎn +655C=>niè +655D=>bì +655E=>chang +655F=>diǎn +6560=>duō +6561=>yì +6562=>gǎn +6563=>sàn +6564=>kě +6565=>yàn +6566=>dūn +6567=>jī +6568=>tǒu +6569=>xiào +656A=>duó +656B=>jiǎo +656C=>jìng +656D=>yáng +656E=>xiá +656F=>mín +6570=>shù +6571=>ái +6572=>qiāo +6573=>ái +6574=>zhěng +6575=>dí +6576=>zhèn +6577=>fū +6578=>shù +6579=>liáo +657A=>qū +657B=>xiòng +657C=>yǐ +657D=>jiǎo +657E=>shan +657F=>jiǎo +6580=>zhuó +6581=>yì +6582=>liǎn +6583=>bì +6584=>lí +6585=>xiào +6586=>xiào +6587=>wén +6588=>xué +6589=>qí +658A=>qí +658B=>zhāi +658C=>bīn +658D=>jué +658E=>zhāi +658F=>láng +6590=>fěi +6591=>bān +6592=>bān +6593=>lán +6594=>yǔ +6595=>lán +6596=>wěi +6597=>dòu +6598=>shēng +6599=>liào +659A=>jiǎ +659B=>hú +659C=>xié +659D=>jiǎ +659E=>yǔ +659F=>zhēn +65A0=>jiào +65A1=>wò +65A2=>tiǎo +65A3=>dòu +65A4=>jīn +65A5=>chì +65A6=>yín +65A7=>fǔ +65A8=>qiāng +65A9=>zhǎn +65AA=>qú +65AB=>zhuó +65AC=>zhǎn +65AD=>duàn +65AE=>cuò +65AF=>sī +65B0=>xīn +65B1=>zhuó +65B2=>zhuó +65B3=>qín +65B4=>lín +65B5=>zhuó +65B6=>chù +65B7=>duàn +65B8=>zhǔ +65B9=>fāng +65BA=>chǎn +65BB=>háng +65BC=>yú +65BD=>shī +65BE=>pèi +65BF=>yóu +65C0=>mèi +65C1=>páng +65C2=>qí +65C3=>zhān +65C4=>máo +65C5=>lǚ +65C6=>pèi +65C7=>pī +65C8=>liú +65C9=>fū +65CA=>fǎng +65CB=>xuán +65CC=>jīng +65CD=>jīng +65CE=>nǐ +65CF=>zú +65D0=>zhào +65D1=>yǐ +65D2=>liú +65D3=>shāo +65D4=>jiàn +65D5=>yú +65D6=>yǐ +65D7=>qí +65D8=>zhì +65D9=>fān +65DA=>piāo +65DB=>fān +65DC=>zhān +65DD=>kuài +65DE=>suì +65DF=>yú +65E0=>wú +65E1=>jì +65E2=>jì +65E3=>jì +65E4=>huò +65E5=>rì +65E6=>dàn +65E7=>jiù +65E8=>zhǐ +65E9=>zǎo +65EA=>xié +65EB=>tiāo +65EC=>xún +65ED=>xù +65EE=>gā +65EF=>lá +65F0=>gàn +65F1=>hàn +65F2=>tái +65F3=>dì +65F4=>xū +65F5=>chǎn +65F6=>shí +65F7=>kuàng +65F8=>yáng +65F9=>shí +65FA=>wàng +65FB=>mín +65FC=>mín +65FD=>tùn +65FE=>chūn +65FF=>wǔ +6600=>yún +6601=>bèi +6602=>áng +6603=>zè +6604=>bǎn +6605=>jié +6606=>kūn +6607=>shēng +6608=>hù +6609=>fǎng +660A=>hào +660B=>guì +660C=>chāng +660D=>xuān +660E=>míng +660F=>hūn +6610=>fēn +6611=>qǐn +6612=>hū +6613=>yì +6614=>xī +6615=>xīn +6616=>yán +6617=>zè +6618=>fǎng +6619=>tán +661A=>shèn +661B=>jù +661C=>yáng +661D=>zǎn +661E=>bǐng +661F=>xīng +6620=>yìng +6621=>xuàn +6622=>pò +6623=>zhěn +6624=>líng +6625=>chūn +6626=>hào +6627=>mèi +6628=>zuó +6629=>mò +662A=>biàn +662B=>xù +662C=>hūn +662D=>zhāo +662E=>zòng +662F=>shì +6630=>shì +6631=>yù +6632=>fèi +6633=>dié +6634=>mǎo +6635=>nì +6636=>chǎng +6637=>wēn +6638=>dōng +6639=>ǎi +663A=>bǐng +663B=>áng +663C=>zhòu +663D=>lóng +663E=>xiǎn +663F=>kuàng +6640=>tiǎo +6641=>cháo +6642=>shí +6643=>huang +6644=>huǎng +6645=>xuǎn +6646=>kuí +6647=>xū +6648=>jiǎo +6649=>jìn +664A=>zhì +664B=>jìn +664C=>shǎng +664D=>tóng +664E=>hǒng +664F=>yàn +6650=>gāi +6651=>xiǎng +6652=>shài +6653=>xiǎo +6654=>yè +6655=>yūn +6656=>huī +6657=>hán +6658=>hàn +6659=>jùn +665A=>wǎn +665B=>xiàn +665C=>kūn +665D=>zhòu +665E=>xī +665F=>chéng +6660=>shèng +6661=>bū +6662=>zhé +6663=>zhé +6664=>wù +6665=>hàn +6666=>huì +6667=>hào +6668=>chen +6669=>wǎn +666A=>tiǎn +666B=>zhuó +666C=>zuì +666D=>zhǒu +666E=>pǔ +666F=>jǐng +6670=>xī +6671=>shǎn +6672=>nǐ +6673=>xī +6674=>qíng +6675=>qǐ +6676=>jīng +6677=>guǐ +6678=>zhěng +6679=>yì +667A=>zhì +667B=>àn +667C=>wǎn +667D=>lín +667E=>liàng +667F=>chāng +6680=>wǎng +6681=>xiǎo +6682=>zàn +6683=>fei +6684=>xuān +6685=>gèng +6686=>yí +6687=>xiá +6688=>yūn +6689=>huī +668A=>xǔ +668B=>mǐn +668C=>kuí +668D=>yē +668E=>yìng +668F=>shǔ +6690=>wěi +6691=>shǔ +6692=>qíng +6693=>mào +6694=>nán +6695=>jiǎn +6696=>nuǎn +6697=>àn +6698=>yáng +6699=>chūn +669A=>yáo +669B=>suǒ +669C=>jìn +669D=>míng +669E=>jiǎo +669F=>kǎi +66A0=>gǎo +66A1=>wěng +66A2=>chàng +66A3=>qì +66A4=>hào +66A5=>yàn +66A6=>lì +66A7=>ài +66A8=>jì +66A9=>jì +66AA=>mèn +66AB=>zàn +66AC=>xiè +66AD=>hào +66AE=>mù +66AF=>mò +66B0=>cōng +66B1=>nì +66B2=>zhāng +66B3=>huì +66B4=>bào +66B5=>hàn +66B6=>xuán +66B7=>chuán +66B8=>liáo +66B9=>xiān +66BA=>dàn +66BB=>jǐng +66BC=>piē +66BD=>lín +66BE=>tūn +66BF=>xǐ +66C0=>yì +66C1=>jì +66C2=>huàng +66C3=>dài +66C4=>yè +66C5=>yè +66C6=>lì +66C7=>tán +66C8=>tóng +66C9=>xiǎo +66CA=>fèi +66CB=>shěn +66CC=>zhào +66CD=>hào +66CE=>yì +66CF=>xiǎng +66D0=>xīng +66D1=>shēn +66D2=>jiǎo +66D3=>bào +66D4=>jìng +66D5=>yàn +66D6=>ài +66D7=>yè +66D8=>rú +66D9=>shǔ +66DA=>méng +66DB=>xūn +66DC=>yào +66DD=>pù +66DE=>lì +66DF=>chén +66E0=>kuàng +66E1=>dié +66E2=>liǎo +66E3=>yàn +66E4=>huò +66E5=>lú +66E6=>xī +66E7=>róng +66E8=>lóng +66E9=>nǎng +66EA=>luǒ +66EB=>luán +66EC=>shài +66ED=>tǎng +66EE=>yǎn +66EF=>zhú +66F0=>yuē +66F1=>yuē +66F2=>qū +66F3=>yè +66F4=>gèng +66F5=>yè +66F6=>hū +66F7=>hé +66F8=>shū +66F9=>cáo +66FA=>cáo +66FB=>sheng +66FC=>màn +66FD=>cēng +66FE=>céng +66FF=>tì +6700=>zuì +6701=>cǎn +6702=>xù +6703=>huì +6704=>yǐn +6705=>qiè +6706=>fēn +6707=>pí +6708=>yuè +6709=>yǒu +670A=>ruǎn +670B=>péng +670C=>fén +670D=>fú +670E=>líng +670F=>fěi +6710=>qú +6711=>tì +6712=>nǜ +6713=>tiǎo +6714=>shuò +6715=>zhèn +6716=>lǎng +6717=>lǎng +6718=>zuī +6719=>míng +671A=>huāng +671B=>wàng +671C=>tūn +671D=>cháo +671E=>jī +671F=>qī +6720=>yīng +6721=>zōng +6722=>wàng +6723=>tóng +6724=>lǎng +6725=>lao +6726=>méng +6727=>lóng +6728=>mù +6729=>děng +672A=>wèi +672B=>mò +672C=>běn +672D=>zhá +672E=>shù +672F=>shù +6730=>mù +6731=>zhū +6732=>rén +6733=>bā +6734=>pǔ +6735=>duo +6736=>duǒ +6737=>dāo +6738=>lì +6739=>guǐ +673A=>jī +673B=>jiū +673C=>bǐ +673D=>xiǔ +673E=>chéng +673F=>cì +6740=>shā +6741=>ru +6742=>zá +6743=>quán +6744=>qiān +6745=>yú +6746=>gān +6747=>wū +6748=>chā +6749=>shān +674A=>xún +674B=>fán +674C=>wù +674D=>zǐ +674E=>li +674F=>xìng +6750=>cái +6751=>cūn +6752=>rèn +6753=>biāo +6754=>tuō +6755=>dì +6756=>zhàng +6757=>máng +6758=>chì +6759=>yì +675A=>gài +675B=>gōng +675C=>dù +675D=>lí +675E=>qǐ +675F=>shù +6760=>gāng +6761=>tiáo +6762=>jiang +6763=>shan +6764=>wan +6765=>lái +6766=>jiu +6767=>máng +6768=>yáng +6769=>mà +676A=>miǎo +676B=>sì +676C=>yuán +676D=>háng +676E=>fèi +676F=>bēi +6770=>jié +6771=>dōng +6772=>gǎo +6773=>yǎo +6774=>xiān +6775=>chǔ +6776=>chūn +6777=>pá +6778=>shū +6779=>huà +677A=>xīn +677B=>chǒu +677C=>zhù +677D=>chǒu +677E=>sōng +677F=>bǎn +6780=>sōng +6781=>jí +6782=>wò +6783=>jìn +6784=>gòu +6785=>jī +6786=>máo +6787=>pí +6788=>bì +6789=>wang +678A=>àng +678B=>fāng +678C=>fén +678D=>yì +678E=>fú +678F=>nán +6790=>xī +6791=>hù +6792=>yā +6793=>dǒu +6794=>xín +6795=>zhěn +6796=>yāo +6797=>lín +6798=>ruì +6799=>ě +679A=>méi +679B=>zhào +679C=>guǒ +679D=>zhī +679E=>cōng +679F=>yùn +67A0=>zui +67A1=>dǒu +67A2=>shū +67A3=>zǎo +67A4=>duo +67A5=>lì +67A6=>lu +67A7=>jiǎn +67A8=>chéng +67A9=>song +67AA=>qiāng +67AB=>fēng +67AC=>nán +67AD=>xiāo +67AE=>xiān +67AF=>kū +67B0=>píng +67B1=>tái +67B2=>xǐ +67B3=>zhǐ +67B4=>guǎi +67B5=>xiāo +67B6=>jià +67B7=>jiā +67B8=>gǒu +67B9=>bāo +67BA=>mò +67BB=>yì +67BC=>yè +67BD=>yè +67BE=>shì +67BF=>niè +67C0=>bǐ +67C1=>duò +67C2=>yí +67C3=>líng +67C4=>bǐng +67C5=>nǐ +67C6=>lā +67C7=>hé +67C8=>bàn +67C9=>fán +67CA=>zhōng +67CB=>dài +67CC=>cí +67CD=>yǎng +67CE=>fū +67CF=>bǎi +67D0=>mǒu +67D1=>gān +67D2=>qī +67D3=>rǎn +67D4=>róu +67D5=>mào +67D6=>sháo +67D7=>sōng +67D8=>zhè +67D9=>xiá +67DA=>yòu +67DB=>shēn +67DC=>guì +67DD=>tuò +67DE=>zhà +67DF=>nán +67E0=>níng +67E1=>yǒng +67E2=>dǐ +67E3=>zhì +67E4=>zhā +67E5=>chá +67E6=>dàn +67E7=>gū +67E8=>bù +67E9=>jiù +67EA=>āo +67EB=>fú +67EC=>jiǎn +67ED=>bā +67EE=>duò +67EF=>kē +67F0=>nài +67F1=>zhù +67F2=>bì +67F3=>liǔ +67F4=>chái +67F5=>shān +67F6=>sì +67F7=>chù +67F8=>pēi +67F9=>shì +67FA=>guǎi +67FB=>zhā +67FC=>yǎo +67FD=>chēng +67FE=>jiù +67FF=>shì +6800=>zhī +6801=>liǔ +6802=>méi +6803=>li +6804=>róng +6805=>zhà +6806=>zao +6807=>biāo +6808=>zhàn +6809=>zhì +680A=>lóng +680B=>dòng +680C=>lú +680D=>shēng +680E=>lì +680F=>lán +6810=>yǒng +6811=>shù +6812=>xún +6813=>shuān +6814=>qì +6815=>zhēn +6816=>qī +6817=>lì +6818=>yí +6819=>xiáng +681A=>zhèn +681B=>lì +681C=>sè +681D=>guā +681E=>kān +681F=>bēn +6820=>rěn +6821=>xiào +6822=>bǎi +6823=>rěn +6824=>bìng +6825=>zī +6826=>chóu +6827=>yì +6828=>cì +6829=>xǔ +682A=>zhū +682B=>jiàn +682C=>zuì +682D=>ér +682E=>ěr +682F=>yǒu +6830=>fá +6831=>gǒng +6832=>kǎo +6833=>lǎo +6834=>zhān +6835=>liè +6836=>yīn +6837=>yàng +6838=>hé +6839=>gēn +683A=>yì +683B=>shì +683C=>gé +683D=>zāi +683E=>luán +683F=>fú +6840=>jié +6841=>héng +6842=>guì +6843=>táo +6844=>guāng +6845=>wéi +6846=>kuāng +6847=>rú +6848=>àn +6849=>ān +684A=>juàn +684B=>yí +684C=>zhuō +684D=>kū +684E=>zhì +684F=>qióng +6850=>tóng +6851=>sāng +6852=>sāng +6853=>huán +6854=>jú +6855=>jiù +6856=>xuè +6857=>duò +6858=>zhuì +6859=>yú +685A=>zǎn +685C=>yīng +685D=>jie +685E=>liu +685F=>zhàn +6860=>yā +6861=>ráo +6862=>zhēn +6863=>dàng +6864=>qī +6865=>qiáo +6866=>huà +6867=>guì +6868=>jiǎng +6869=>zhuāng +686A=>xún +686B=>suō +686C=>shā +686D=>zhēn +686E=>bēi +686F=>tīng +6870=>kuò +6871=>jìng +6872=>po +6873=>bèn +6874=>fú +6875=>ruí +6876=>tǒng +6877=>jué +6878=>xī +6879=>láng +687A=>liǔ +687B=>fēng +687C=>qī +687D=>wěn +687E=>jūn +687F=>gǎn +6880=>sù +6881=>liáng +6882=>qiú +6883=>tǐng +6884=>yǒu +6885=>méi +6886=>bāng +6887=>lòng +6888=>pēng +6889=>zhuāng +688A=>dì +688B=>xuān +688C=>tú +688D=>zào +688E=>āo +688F=>gù +6890=>bì +6891=>dí +6892=>hán +6893=>zǐ +6894=>zhī +6895=>rèn +6896=>bèi +6897=>gěng +6898=>jiǎn +6899=>huàn +689A=>wǎn +689B=>nuó +689C=>jiā +689D=>tiáo +689E=>jì +689F=>xiāo +68A0=>lǚ +68A1=>hún +68A2=>shāo +68A3=>cén +68A4=>fén +68A5=>sōng +68A6=>mèng +68A7=>wú +68A8=>lí +68A9=>lí +68AA=>dòu +68AB=>qǐn +68AC=>yǐng +68AD=>suō +68AE=>jū +68AF=>tī +68B0=>xiè +68B1=>kǔn +68B2=>zhuó +68B3=>shū +68B4=>chān +68B5=>fàn +68B6=>wěi +68B7=>jìng +68B8=>lí +68B9=>bīn +68BA=>xia +68BB=>fo +68BC=>táo +68BD=>zhì +68BE=>lái +68BF=>lián +68C0=>jiǎn +68C1=>zhuō +68C2=>líng +68C3=>lí +68C4=>qì +68C5=>bìng +68C6=>lún +68C7=>cōng +68C8=>qiàn +68C9=>mián +68CA=>qí +68CB=>qí +68CC=>cài +68CD=>gùn +68CE=>chán +68CF=>dé +68D0=>fěi +68D1=>pái +68D2=>bàng +68D3=>bàng +68D4=>hūn +68D5=>zōng +68D6=>chéng +68D7=>zǎo +68D8=>jí +68D9=>lì +68DA=>péng +68DB=>yù +68DC=>yù +68DD=>gù +68DE=>jùn +68DF=>dòng +68E0=>táng +68E1=>gāng +68E2=>wǎng +68E3=>dì +68E4=>cuò +68E5=>fán +68E6=>chēng +68E7=>zhàn +68E8=>qǐ +68E9=>yuān +68EA=>yǎn +68EB=>yù +68EC=>quān +68ED=>yì +68EE=>sēn +68EF=>rěn +68F0=>chuí +68F1=>léng +68F2=>qī +68F3=>zhuō +68F4=>fú +68F5=>kē +68F6=>lái +68F7=>zōu +68F8=>zōu +68F9=>zhào +68FA=>guān +68FB=>fēn +68FC=>fén +68FD=>shēn +68FE=>qíng +68FF=>ní +6900=>wǎn +6901=>guǒ +6902=>lù +6903=>háo +6904=>jiē +6905=>yǐ +6906=>chóu +6907=>jǔ +6908=>jú +6909=>chéng +690A=>zuó +690B=>liáng +690C=>qiāng +690D=>zhí +690E=>chuí +690F=>yā +6910=>jū +6911=>bēi +6912=>jiāo +6913=>zhuó +6914=>zī +6915=>bīn +6916=>péng +6917=>dìng +6918=>chǔ +6919=>chang +691A=>men +691B=>hua +691C=>jiǎn +691D=>guī +691E=>xì +691F=>dú +6920=>qiàn +6921=>dao +6922=>gui +6923=>dian +6924=>luó +6925=>zhī +6926=>quan +6927=>mìng +6928=>fu +6929=>geng +692A=>pèng +692B=>zhǎn +692C=>yi +692D=>tuǒ +692E=>sēn +692F=>duǒ +6930=>yē +6931=>fù +6932=>wěi +6933=>wēi +6934=>duàn +6935=>jiǎ +6936=>zōng +6937=>jiān +6938=>yí +6939=>shèn +693A=>xí +693B=>yàn +693C=>yǎn +693D=>chuán +693E=>jiān +693F=>chūn +6940=>yǔ +6941=>hé +6942=>zhā +6943=>wò +6944=>pián +6945=>bī +6946=>yāo +6947=>huò +6948=>xū +6949=>ruò +694A=>yáng +694B=>là +694C=>yán +694D=>běn +694E=>huī +694F=>kuí +6950=>jiè +6951=>kuí +6952=>sī +6953=>fēng +6954=>xiē +6955=>tuǒ +6956=>zhì +6957=>jiàn +6958=>mù +6959=>mào +695A=>chu +695B=>hù +695C=>hú +695D=>liàn +695E=>léng +695F=>tíng +6960=>nán +6961=>yú +6962=>yóu +6963=>méi +6964=>sǒng +6965=>xuàn +6966=>xuàn +6967=>yǎng +6968=>zhēn +6969=>pián +696A=>yè +696B=>jí +696C=>jié +696D=>yè +696E=>chǔ +696F=>dùn +6970=>yú +6971=>zòu +6972=>wēi +6973=>méi +6974=>tì +6975=>jí +6976=>jié +6977=>kǎi +6978=>qiū +6979=>yíng +697A=>rǒu +697B=>huáng +697C=>lóu +697D=>lè +697E=>quan +697F=>xiang +6980=>pǐn +6981=>shi +6982=>gài +6983=>tán +6984=>lǎn +6985=>wēn +6986=>yú +6987=>chèn +6988=>lǘ +6989=>jǔ +698A=>shen +698B=>chu +698C=>pi +698D=>xiè +698E=>jiǎ +698F=>yì +6990=>zhǎn +6991=>fú +6992=>nuò +6993=>mì +6994=>láng +6995=>róng +6996=>gǔ +6997=>jiàn +6998=>jǔ +6999=>tā +699A=>yǎo +699B=>zhēn +699C=>bǎng +699D=>shā +699E=>yuán +699F=>zǐ +69A0=>míng +69A1=>sù +69A2=>jià +69A3=>yáo +69A4=>jié +69A5=>huàng +69A6=>gàn +69A7=>fěi +69A8=>zhà +69A9=>qián +69AA=>mà +69AB=>sǔn +69AC=>yuán +69AD=>xiè +69AE=>róng +69AF=>shí +69B0=>zhī +69B1=>cuī +69B2=>yún +69B3=>tíng +69B4=>liú +69B5=>róng +69B6=>táng +69B7=>què +69B8=>zhāi +69B9=>sī +69BA=>shèng +69BB=>tà +69BC=>kē +69BD=>xī +69BE=>gǔ +69BF=>qī +69C0=>gǎo +69C1=>gǎo +69C2=>sūn +69C3=>pán +69C4=>tāo +69C5=>gé +69C6=>xún +69C7=>diān +69C8=>nòu +69C9=>jí +69CA=>shuò +69CB=>gòu +69CC=>chuí +69CD=>qiāng +69CE=>chá +69CF=>qiǎn +69D0=>huái +69D1=>méi +69D2=>xù +69D3=>gàng +69D4=>gāo +69D5=>zhuó +69D6=>tuó +69D7=>qiao +69D8=>yàng +69D9=>diān +69DA=>jiǎ +69DB=>kǎn +69DC=>zuì +69DD=>dao +69DE=>long +69DF=>bīn +69E0=>zhū +69E1=>sang +69E2=>xí +69E3=>jī +69E4=>lián +69E5=>huì +69E6=>yōng +69E7=>qiàn +69E8=>guǒ +69E9=>gài +69EA=>gài +69EB=>tuán +69EC=>huà +69ED=>qī +69EE=>sēn +69EF=>cuī +69F0=>péng +69F1=>yǒu +69F2=>hú +69F3=>jiǎng +69F4=>hù +69F5=>huàn +69F6=>guì +69F7=>niè +69F8=>yì +69F9=>gāo +69FA=>kāng +69FB=>guī +69FC=>guī +69FD=>cáo +69FE=>màn +69FF=>jǐn +6A00=>dī +6A01=>zhuāng +6A02=>lè +6A03=>lǎng +6A04=>chén +6A05=>cōng +6A06=>lí +6A07=>xiū +6A08=>qíng +6A09=>shuǎng +6A0A=>fán +6A0B=>tǒng +6A0C=>guàn +6A0D=>zé +6A0E=>sù +6A0F=>lěi +6A10=>lǔ +6A11=>liáng +6A12=>mì +6A13=>lóu +6A14=>cháo +6A15=>sù +6A16=>kē +6A17=>chū +6A18=>táng +6A19=>biāo +6A1A=>lù +6A1B=>jiū +6A1C=>zhè +6A1D=>zhā +6A1E=>shū +6A1F=>zhāng +6A20=>mán +6A21=>mó +6A22=>niǎo +6A23=>yàng +6A24=>tiáo +6A25=>péng +6A26=>zhù +6A27=>shā +6A28=>xī +6A29=>quán +6A2A=>héng +6A2B=>jiān +6A2C=>cōng +6A2D=>ji +6A2E=>yan +6A2F=>qiáng +6A30=>xue +6A31=>yīng +6A32=>èr +6A33=>xún +6A34=>zhí +6A35=>qiáo +6A36=>zuī +6A37=>cóng +6A38=>pǔ +6A39=>shù +6A3A=>huà +6A3B=>kuì +6A3C=>zhēn +6A3D=>zūn +6A3E=>yuè +6A3F=>shàn +6A40=>xī +6A41=>chūn +6A42=>diàn +6A43=>fá +6A44=>gǎn +6A45=>mó +6A46=>wǔ +6A47=>qiāo +6A48=>ráo +6A49=>lìn +6A4A=>liú +6A4B=>qiáo +6A4C=>xiàn +6A4D=>rùn +6A4E=>fán +6A4F=>zhǎn +6A50=>tuó +6A51=>lǎo +6A52=>yún +6A53=>shùn +6A54=>dūn +6A55=>chēng +6A56=>táng +6A57=>méng +6A58=>jú +6A59=>chéng +6A5A=>sù +6A5B=>jué +6A5C=>jué +6A5D=>diàn +6A5E=>huì +6A5F=>jī +6A60=>nuǒ +6A61=>xiàng +6A62=>tuǒ +6A63=>nǐng +6A64=>ruǐ +6A65=>zhū +6A66=>tóng +6A67=>zēng +6A68=>fén +6A69=>qióng +6A6A=>rǎn +6A6B=>héng +6A6C=>qián +6A6D=>gū +6A6E=>liǔ +6A6F=>lào +6A70=>gāo +6A71=>chú +6A72=>xi +6A73=>sheng +6A74=>zi +6A75=>san +6A76=>jí +6A77=>dōu +6A78=>jing +6A79=>lǔ +6A7A=>jian +6A7B=>chu +6A7C=>yuán +6A7D=>tà +6A7E=>shū +6A7F=>jiāng +6A80=>tán +6A81=>lǐn +6A82=>nóng +6A83=>yǐn +6A84=>xí +6A85=>suì +6A86=>shān +6A87=>zuì +6A88=>xuán +6A89=>chēng +6A8A=>gàn +6A8B=>jú +6A8C=>zuì +6A8D=>yì +6A8E=>qín +6A8F=>pǔ +6A90=>yán +6A91=>léi +6A92=>fēng +6A93=>huǐ +6A94=>dàng +6A95=>jì +6A96=>suì +6A97=>bò +6A98=>píng +6A99=>chéng +6A9A=>chǔ +6A9B=>zhuā +6A9C=>guì +6A9D=>jí +6A9E=>jiě +6A9F=>jiǎ +6AA0=>qíng +6AA1=>zhái +6AA2=>jiǎn +6AA3=>qiáng +6AA4=>dào +6AA5=>yǐ +6AA6=>biǎo +6AA7=>sōng +6AA8=>shē +6AA9=>lǐn +6AAA=>li +6AAB=>chá +6AAC=>méng +6AAD=>yín +6AAE=>táo +6AAF=>tái +6AB0=>mián +6AB1=>qí +6AB2=>tuán +6AB3=>bīn +6AB4=>huò +6AB5=>jì +6AB6=>qiān +6AB7=>nǐ +6AB8=>níng +6AB9=>yī +6ABA=>gǎo +6ABB=>kǎn +6ABC=>yìn +6ABD=>nòu +6ABE=>qǐng +6ABF=>yǎn +6AC0=>qí +6AC1=>mì +6AC2=>zhào +6AC3=>guì +6AC4=>chūn +6AC5=>jī +6AC6=>kuí +6AC7=>pó +6AC8=>dèng +6AC9=>chú +6ACA=>ge +6ACB=>mián +6ACC=>yōu +6ACD=>zhì +6ACE=>huǎng +6ACF=>qiān +6AD0=>lěi +6AD1=>léi +6AD2=>sà +6AD3=>lǔ +6AD4=>lì +6AD5=>cuán +6AD6=>lǜ +6AD7=>miè +6AD8=>huì +6AD9=>ōu +6ADA=>lú +6ADB=>zhì +6ADC=>gāo +6ADD=>dú +6ADE=>yuán +6ADF=>lì +6AE0=>fèi +6AE1=>zhuó +6AE2=>sǒu +6AE3=>lián +6AE4=>jiang +6AE5=>chú +6AE6=>qing +6AE7=>zhū +6AE8=>lú +6AE9=>yán +6AEA=>lì +6AEB=>zhū +6AEC=>chèn +6AED=>jié +6AEE=>è +6AEF=>sū +6AF0=>huái +6AF1=>niè +6AF2=>yù +6AF3=>lóng +6AF4=>lài +6AF5=>jiao +6AF6=>xiǎn +6AF7=>guī +6AF8=>jǔ +6AF9=>xiāo +6AFA=>líng +6AFB=>yīng +6AFC=>jiān +6AFD=>yǐn +6AFE=>yóu +6AFF=>yíng +6B00=>xiāng +6B01=>nóng +6B02=>bó +6B03=>chán +6B04=>lán +6B05=>jǔ +6B06=>shuāng +6B07=>shè +6B08=>wéi +6B09=>cóng +6B0A=>quán +6B0B=>qú +6B0C=>cang +6B0D=>jiu +6B0E=>yù +6B0F=>luó +6B10=>lì +6B11=>cuán +6B12=>luán +6B13=>dǎng +6B14=>jué +6B15=>yan +6B16=>lǎn +6B17=>lán +6B18=>zhú +6B19=>léi +6B1A=>lǐ +6B1B=>bà +6B1C=>náng +6B1D=>yù +6B1E=>líng +6B1F=>guang +6B20=>qiàn +6B21=>cì +6B22=>huan +6B23=>xīn +6B24=>yú +6B25=>yì +6B26=>qiān +6B27=>ōu +6B28=>xū +6B29=>chāo +6B2A=>chù +6B2B=>qì +6B2C=>kài +6B2D=>yì +6B2E=>jué +6B2F=>xì +6B30=>xù +6B31=>hē +6B32=>yù +6B33=>kuì +6B34=>láng +6B35=>kuǎn +6B36=>shuò +6B37=>xī +6B38=>āi +6B39=>yī +6B3A=>qī +6B3B=>chuā +6B3C=>chǐ +6B3D=>qīn +6B3E=>kuǎn +6B3F=>kǎn +6B40=>kuǎn +6B41=>kǎn +6B42=>chuǎn +6B43=>shà +6B44=>guā +6B45=>yīn +6B46=>xīn +6B47=>xiē +6B48=>yú +6B49=>qiàn +6B4A=>xiāo +6B4B=>yè +6B4C=>gē +6B4D=>wū +6B4E=>tàn +6B4F=>jìn +6B50=>ōu +6B51=>hū +6B52=>tì +6B53=>huān +6B54=>xū +6B55=>pēn +6B56=>xǐ +6B57=>xiào +6B58=>chuā +6B59=>shè +6B5A=>shàn +6B5B=>hān +6B5C=>chù +6B5D=>yì +6B5E=>è +6B5F=>yú +6B60=>chuò +6B61=>huan +6B62=>zhǐ +6B63=>zhèng +6B64=>cǐ +6B65=>bù +6B66=>wǔ +6B67=>qí +6B68=>bù +6B69=>bù +6B6A=>wāi +6B6B=>jù +6B6C=>qián +6B6D=>chí +6B6E=>sè +6B6F=>chǐ +6B70=>sè +6B71=>zhǒng +6B72=>suì +6B73=>suì +6B74=>lì +6B75=>cuò +6B76=>yú +6B77=>lì +6B78=>guī +6B79=>dǎi +6B7A=>è +6B7B=>sǐ +6B7C=>jiān +6B7D=>zhé +6B7E=>mò +6B7F=>mò +6B80=>yāo +6B81=>mò +6B82=>cú +6B83=>yāng +6B84=>tiǎn +6B85=>shēng +6B86=>dài +6B87=>shāng +6B88=>xù +6B89=>xùn +6B8A=>shū +6B8B=>cán +6B8C=>jué +6B8D=>piǎo +6B8E=>qià +6B8F=>qiú +6B90=>sù +6B91=>qíng +6B92=>yǔn +6B93=>liàn +6B94=>yì +6B95=>fǒu +6B96=>zhí +6B97=>yè +6B98=>cán +6B99=>hūn +6B9A=>dān +6B9B=>jí +6B9C=>dié +6B9D=>zhēn +6B9E=>yǔn +6B9F=>wēn +6BA0=>chòu +6BA1=>bìn +6BA2=>tì +6BA3=>jìn +6BA4=>shāng +6BA5=>yín +6BA6=>diāo +6BA7=>jiù +6BA8=>huì +6BA9=>cuàn +6BAA=>yì +6BAB=>dān +6BAC=>dù +6BAD=>jiāng +6BAE=>liàn +6BAF=>bìn +6BB0=>dú +6BB1=>jian +6BB2=>jiān +6BB3=>shū +6BB4=>ōu +6BB5=>duàn +6BB6=>zhù +6BB7=>yīn +6BB8=>qìng +6BB9=>yì +6BBA=>shā +6BBB=>qiào +6BBC=>ké +6BBD=>xiáo +6BBE=>xùn +6BBF=>diàn +6BC0=>huǐ +6BC1=>huǐ +6BC2=>gǔ +6BC3=>qiāo +6BC4=>jī +6BC5=>yì +6BC6=>ōu +6BC7=>huǐ +6BC8=>duàn +6BC9=>yī +6BCA=>xiāo +6BCB=>wú +6BCC=>guàn +6BCD=>mǔ +6BCE=>měi +6BCF=>měi +6BD0=>ǎi +6BD1=>jiě +6BD2=>dú +6BD3=>yù +6BD4=>bǐ +6BD5=>bì +6BD6=>bì +6BD7=>pí +6BD8=>pí +6BD9=>bì +6BDA=>chán +6BDB=>máo +6BDC=>háo +6BDD=>cǎi +6BDE=>pí +6BDF=>lie +6BE0=>jiā +6BE1=>zhān +6BE2=>sāi +6BE3=>mù +6BE4=>tuò +6BE5=>xún +6BE6=>ěr +6BE7=>róng +6BE8=>xiǎn +6BE9=>jú +6BEA=>mú +6BEB=>háo +6BEC=>qiú +6BED=>dòu +6BEE=>shā +6BEF=>tǎn +6BF0=>péi +6BF1=>jú +6BF2=>duō +6BF3=>cuì +6BF4=>bī +6BF5=>sān +6BF6=>san +6BF7=>mào +6BF8=>sāi +6BF9=>shū +6BFA=>yū +6BFB=>tuò +6BFC=>hé +6BFD=>jiàn +6BFE=>tà +6BFF=>sān +6C00=>lǘ +6C01=>mú +6C02=>máo +6C03=>tóng +6C04=>rǒng +6C05=>chǎng +6C06=>pǔ +6C07=>lu +6C08=>zhān +6C09=>sào +6C0A=>zhān +6C0B=>méng +6C0C=>lǔ +6C0D=>qú +6C0E=>dié +6C0F=>shì +6C10=>dī +6C11=>mín +6C12=>jué +6C13=>máng +6C14=>qì +6C15=>piē +6C16=>nǎi +6C17=>qì +6C18=>dāo +6C19=>xiān +6C1A=>chuān +6C1B=>fēn +6C1C=>yáng +6C1D=>nèi +6C1E=>bin +6C1F=>fú +6C20=>shēn +6C21=>dōng +6C22=>qīng +6C23=>qì +6C24=>yīn +6C25=>xī +6C26=>hài +6C27=>yǎng +6C28=>ān +6C29=>yà +6C2A=>kè +6C2B=>qīng +6C2C=>yà +6C2D=>dōng +6C2E=>dàn +6C2F=>lǜ +6C30=>qíng +6C31=>yǎng +6C32=>yūn +6C33=>yūn +6C34=>shuǐ +6C35=>shui +6C36=>zhěng +6C37=>bīng +6C38=>yǒng +6C39=>dàng +6C3A=>shui +6C3B=>lè +6C3C=>nì +6C3D=>tǔn +6C3E=>fàn +6C3F=>guǐ +6C40=>tīng +6C41=>zhī +6C42=>qiú +6C43=>bīn +6C44=>zè +6C45=>miǎn +6C46=>cuān +6C47=>huì +6C48=>diāo +6C49=>hàn +6C4A=>chà +6C4B=>zhuó +6C4C=>chuàn +6C4D=>wán +6C4E=>fàn +6C4F=>dà +6C50=>xī +6C51=>tuō +6C52=>máng +6C53=>qiú +6C54=>qì +6C55=>shàn +6C56=>pìn +6C57=>hàn +6C58=>qiān +6C59=>wū +6C5A=>wū +6C5B=>xùn +6C5C=>sì +6C5D=>rǔ +6C5E=>gǒng +6C5F=>jiāng +6C60=>chí +6C61=>wū +6C62=>tu +6C63=>jiu +6C64=>tāng +6C65=>zhī +6C66=>zhǐ +6C67=>qiān +6C68=>mì +6C69=>gǔ +6C6A=>wāng +6C6B=>jǐng +6C6C=>jǐng +6C6D=>ruì +6C6E=>jūn +6C6F=>hóng +6C70=>tài +6C71=>quǎn +6C72=>jí +6C73=>biàn +6C74=>biàn +6C75=>gàn +6C76=>wèn +6C77=>zhōng +6C78=>fāng +6C79=>xiōng +6C7A=>jué +6C7B=>hǔ +6C7C=>niú +6C7D=>qì +6C7E=>fén +6C7F=>xù +6C80=>xù +6C81=>qìn +6C82=>yí +6C83=>wò +6C84=>yún +6C85=>yuán +6C86=>hàng +6C87=>yǎn +6C88=>chén +6C89=>chén +6C8A=>dàn +6C8B=>yóu +6C8C=>dùn +6C8D=>hù +6C8E=>huò +6C8F=>qī +6C90=>mù +6C91=>nǜ +6C92=>méi +6C93=>dá +6C94=>miǎn +6C95=>mì +6C96=>chōng +6C97=>pāng +6C98=>bǐ +6C99=>shā +6C9A=>zhǐ +6C9B=>pèi +6C9C=>pàn +6C9D=>zhuǐ +6C9E=>zā +6C9F=>gōu +6CA0=>liú +6CA1=>méi +6CA2=>zé +6CA3=>fēng +6CA4=>ōu +6CA5=>lì +6CA6=>lún +6CA7=>cāng +6CA8=>fēng +6CA9=>wéi +6CAA=>hù +6CAB=>mò +6CAC=>mèi +6CAD=>shù +6CAE=>jǔ +6CAF=>zǎn +6CB0=>tuō +6CB1=>tuó +6CB2=>tuó +6CB3=>hé +6CB4=>lì +6CB5=>mǐ +6CB6=>yí +6CB7=>fā +6CB8=>fèi +6CB9=>yóu +6CBA=>tián +6CBB=>zhì +6CBC=>zhǎo +6CBD=>gū +6CBE=>zhān +6CBF=>yán +6CC0=>sī +6CC1=>kuàng +6CC2=>jiǒng +6CC3=>jū +6CC4=>xiè +6CC5=>qiú +6CC6=>yì +6CC7=>jiā +6CC8=>zhōng +6CC9=>quán +6CCA=>pō +6CCB=>huì +6CCC=>mì +6CCD=>bēn +6CCE=>zé +6CCF=>zhú +6CD0=>lè +6CD1=>yōu +6CD2=>gū +6CD3=>hóng +6CD4=>gān +6CD5=>fǎ +6CD6=>mǎo +6CD7=>sì +6CD8=>hū +6CD9=>píng +6CDA=>cǐ +6CDB=>fàn +6CDC=>zhī +6CDD=>sù +6CDE=>nìng +6CDF=>chēng +6CE0=>líng +6CE1=>pào +6CE2=>bō +6CE3=>qì +6CE4=>sì +6CE5=>ní +6CE6=>jú +6CE7=>sà +6CE8=>zhù +6CE9=>shēng +6CEA=>lèi +6CEB=>xuàn +6CEC=>jué +6CED=>fú +6CEE=>pàn +6CEF=>mǐn +6CF0=>tài +6CF1=>yāng +6CF2=>jǐ +6CF3=>yǒng +6CF4=>guàn +6CF5=>bèng +6CF6=>xué +6CF7=>lóng +6CF8=>lú +6CF9=>dan +6CFA=>luò +6CFB=>xiè +6CFC=>po +6CFD=>zé +6CFE=>jīng +6CFF=>yín +6D00=>pán +6D01=>jié +6D02=>yì +6D03=>huī +6D04=>huí +6D05=>zài +6D06=>chéng +6D07=>yīn +6D08=>wéi +6D09=>hòu +6D0A=>jiàn +6D0B=>yáng +6D0C=>liè +6D0D=>sì +6D0E=>jì +6D0F=>ér +6D10=>xíng +6D11=>fú +6D12=>sǎ +6D13=>sè +6D14=>zhǐ +6D15=>yìn +6D16=>wú +6D17=>xǐ +6D18=>kǎo +6D19=>zhū +6D1A=>jiàng +6D1B=>luò +6D1C=>luò +6D1D=>àn +6D1E=>dòng +6D1F=>tì +6D20=>móu +6D21=>lèi +6D22=>yī +6D23=>mǐ +6D24=>quán +6D25=>jīn +6D26=>pò +6D27=>wěi +6D28=>xiáo +6D29=>xiè +6D2A=>hóng +6D2B=>xù +6D2C=>sù +6D2D=>kuāng +6D2E=>táo +6D2F=>qiè +6D30=>jù +6D31=>ěr +6D32=>zhōu +6D33=>rù +6D34=>píng +6D35=>xún +6D36=>xiōng +6D37=>zhì +6D38=>guāng +6D39=>huán +6D3A=>míng +6D3B=>huó +6D3C=>wā +6D3D=>qià +6D3E=>pài +6D3F=>wū +6D40=>qū +6D41=>liú +6D42=>yì +6D43=>jiā +6D44=>jìng +6D45=>qiǎn +6D46=>jiāng +6D47=>jiāo +6D48=>zhēn +6D49=>shī +6D4A=>zhuó +6D4B=>cè +6D4C=>fá +6D4D=>huì +6D4E=>jì +6D4F=>liú +6D50=>chǎn +6D51=>hún +6D52=>hǔ +6D53=>nóng +6D54=>xún +6D55=>jìn +6D56=>liè +6D57=>qiú +6D58=>wěi +6D59=>zhè +6D5A=>jùn +6D5B=>hán +6D5C=>bāng +6D5D=>máng +6D5E=>zhuó +6D5F=>yóu +6D60=>xī +6D61=>bó +6D62=>dòu +6D63=>huàn +6D64=>hóng +6D65=>yì +6D66=>pǔ +6D67=>yǐng +6D68=>lǎn +6D69=>hào +6D6A=>làng +6D6B=>hǎn +6D6C=>lǐ +6D6D=>gēng +6D6E=>fú +6D6F=>wú +6D70=>liàn +6D71=>chún +6D72=>féng +6D73=>yì +6D74=>yù +6D75=>tóng +6D76=>láo +6D77=>hǎi +6D78=>jìn +6D79=>jiā +6D7A=>chōng +6D7B=>jiǒng +6D7C=>měi +6D7D=>suī +6D7E=>chēng +6D7F=>pèi +6D80=>xiàn +6D81=>shèn +6D82=>tu +6D83=>kùn +6D84=>pīng +6D85=>niè +6D86=>hàn +6D87=>jīng +6D88=>xiāo +6D89=>shè +6D8A=>niǎn +6D8B=>tū +6D8C=>yǒng +6D8D=>xiào +6D8E=>xián +6D8F=>tǐng +6D90=>é +6D91=>sù +6D92=>tūn +6D93=>juān +6D94=>cén +6D95=>tì +6D96=>lì +6D97=>shuì +6D98=>sì +6D99=>lèi +6D9A=>shuì +6D9B=>tāo +6D9C=>dú +6D9D=>lào +6D9E=>lái +6D9F=>lián +6DA0=>wéi +6DA1=>wō +6DA2=>yún +6DA3=>huàn +6DA4=>dí +6DA5=>heng +6DA6=>rùn +6DA7=>jiàn +6DA8=>zhǎng +6DA9=>sè +6DAA=>fú +6DAB=>guàn +6DAC=>xìng +6DAD=>shòu +6DAE=>shuàn +6DAF=>yá +6DB0=>chuò +6DB1=>zhàng +6DB2=>yè +6DB3=>kōng +6DB4=>wò +6DB5=>hán +6DB6=>tuō +6DB7=>dōng +6DB8=>hé +6DB9=>wō +6DBA=>jū +6DBB=>shè +6DBC=>liáng +6DBD=>hūn +6DBE=>tà +6DBF=>zhuō +6DC0=>diàn +6DC1=>qiè +6DC2=>dé +6DC3=>juàn +6DC4=>zī +6DC5=>xī +6DC6=>xiáo +6DC7=>qí +6DC8=>gǔ +6DC9=>guǒ +6DCA=>yān +6DCB=>lín +6DCC=>tǎng +6DCD=>zhōu +6DCE=>pěng +6DCF=>hào +6DD0=>chāng +6DD1=>shū +6DD2=>qī +6DD3=>fāng +6DD4=>zhí +6DD5=>lù +6DD6=>nào +6DD7=>jú +6DD8=>táo +6DD9=>cóng +6DDA=>lèi +6DDB=>zhè +6DDC=>píng +6DDD=>féi +6DDE=>sōng +6DDF=>tiǎn +6DE0=>pì +6DE1=>dàn +6DE2=>yù +6DE3=>ní +6DE4=>yū +6DE5=>lù +6DE6=>gàn +6DE7=>mì +6DE8=>jìng +6DE9=>líng +6DEA=>lún +6DEB=>yín +6DEC=>cuì +6DED=>qú +6DEE=>huái +6DEF=>yù +6DF0=>niǎn +6DF1=>shēn +6DF2=>biāo +6DF3=>chún +6DF4=>hū +6DF5=>yuān +6DF6=>lái +6DF7=>hùn +6DF8=>qīng +6DF9=>yān +6DFA=>qiǎn +6DFB=>tiān +6DFC=>miǎo +6DFD=>zhǐ +6DFE=>yǐn +6DFF=>mì +6E00=>bèn +6E01=>yuān +6E02=>wèn +6E03=>ruò +6E04=>fēi +6E05=>qīng +6E06=>yuān +6E07=>kě +6E08=>jì +6E09=>shè +6E0A=>yuān +6E0B=>se +6E0C=>lù +6E0D=>zì +6E0E=>dú +6E0F=>qi +6E10=>jiàn +6E11=>miǎn +6E12=>pì +6E13=>xi +6E14=>yú +6E15=>yuān +6E16=>shěn +6E17=>shèn +6E18=>róu +6E19=>huàn +6E1A=>zhǔ +6E1B=>jiǎn +6E1C=>nuǎn +6E1D=>yú +6E1E=>qiú +6E1F=>tíng +6E20=>qú +6E21=>dù +6E22=>fán +6E23=>zhā +6E24=>bó +6E25=>wò +6E26=>wō +6E27=>dì +6E28=>wēi +6E29=>wēn +6E2A=>rú +6E2B=>xiè +6E2C=>cè +6E2D=>wèi +6E2E=>hé +6E2F=>gǎng +6E30=>yǎn +6E31=>hóng +6E32=>xuàn +6E33=>mǐ +6E34=>kě +6E35=>máo +6E36=>yīng +6E37=>yǎn +6E38=>yóu +6E39=>hōng +6E3A=>miǎo +6E3B=>shěng +6E3C=>měi +6E3D=>zāi +6E3E=>hún +6E3F=>nài +6E40=>guǐ +6E41=>chì +6E42=>è +6E43=>pài +6E44=>méi +6E45=>liàn +6E46=>qì +6E47=>qì +6E48=>méi +6E49=>tián +6E4A=>còu +6E4B=>wéi +6E4C=>cān +6E4D=>tuān +6E4E=>miǎn +6E4F=>huì +6E50=>mò +6E51=>xū +6E52=>jí +6E53=>pén +6E54=>jiān +6E55=>jiǎn +6E56=>hú +6E57=>fèng +6E58=>xiāng +6E59=>yì +6E5A=>yìn +6E5B=>zhàn +6E5C=>shí +6E5D=>jiē +6E5E=>chēng +6E5F=>huáng +6E60=>tàn +6E61=>yú +6E62=>bì +6E63=>mǐn +6E64=>shī +6E65=>tū +6E66=>shēng +6E67=>yǒng +6E68=>jú +6E69=>dòng +6E6A=>tuàn +6E6B=>jiǎo +6E6C=>jiǎo +6E6D=>qiú +6E6E=>yān +6E6F=>tāng +6E70=>lóng +6E71=>huò +6E72=>yuán +6E73=>nǎn +6E74=>bàn +6E75=>yǒu +6E76=>quán +6E77=>zhuāng +6E78=>liàng +6E79=>chán +6E7A=>yán +6E7B=>chún +6E7C=>niè +6E7D=>zī +6E7E=>wān +6E7F=>shī +6E80=>mǎn +6E81=>yíng +6E82=>la +6E83=>kuì +6E84=>feng +6E85=>jiàn +6E86=>xù +6E87=>lóu +6E88=>wéi +6E89=>gài +6E8A=>xia +6E8B=>yíng +6E8C=>pō +6E8D=>jìn +6E8E=>yàn +6E8F=>táng +6E90=>yuán +6E91=>suǒ +6E92=>yuán +6E93=>lián +6E94=>yǎo +6E95=>mèng +6E96=>zhǔn +6E97=>chéng +6E98=>kè +6E99=>tài +6E9A=>tǎ +6E9B=>wā +6E9C=>liū +6E9D=>gōu +6E9E=>sāo +6E9F=>míng +6EA0=>zhà +6EA1=>shí +6EA2=>yì +6EA3=>lùn +6EA4=>mǎ +6EA5=>pǔ +6EA6=>wēi +6EA7=>lì +6EA8=>cái +6EA9=>wù +6EAA=>xī +6EAB=>wēn +6EAC=>qiāng +6EAD=>zé +6EAE=>shī +6EAF=>sù +6EB0=>ái +6EB1=>qín +6EB2=>sōu +6EB3=>yún +6EB4=>xiù +6EB5=>yīn +6EB6=>róng +6EB7=>hùn +6EB8=>sù +6EB9=>suò +6EBA=>nì +6EBB=>tā +6EBC=>shī +6EBD=>rù +6EBE=>āi +6EBF=>pàn +6EC0=>chù +6EC1=>chú +6EC2=>pāng +6EC3=>wēng +6EC4=>cāng +6EC5=>miè +6EC6=>gé +6EC7=>diān +6EC8=>hào +6EC9=>huàng +6ECA=>xì +6ECB=>zī +6ECC=>dí +6ECD=>zhì +6ECE=>xíng +6ECF=>fǔ +6ED0=>jié +6ED1=>huá +6ED2=>gē +6ED3=>zǐ +6ED4=>tāo +6ED5=>téng +6ED6=>suī +6ED7=>bì +6ED8=>jiào +6ED9=>huì +6EDA=>gǔn +6EDB=>yín +6EDC=>gāo +6EDD=>lóng +6EDE=>zhì +6EDF=>yàn +6EE0=>shè +6EE1=>mǎn +6EE2=>yíng +6EE3=>chún +6EE4=>lǜ +6EE5=>làn +6EE6=>luán +6EE7=>xiao +6EE8=>bīn +6EE9=>tān +6EEA=>yù +6EEB=>xiǔ +6EEC=>hù +6EED=>bì +6EEE=>biāo +6EEF=>zhì +6EF0=>jiàng +6EF1=>kòu +6EF2=>shèn +6EF3=>shāng +6EF4=>dī +6EF5=>mì +6EF6=>áo +6EF7=>lǔ +6EF8=>hǔ +6EF9=>hū +6EFA=>yōu +6EFB=>chǎn +6EFC=>fàn +6EFD=>yōng +6EFE=>gǔn +6EFF=>mǎn +6F00=>qǐng +6F01=>yú +6F02=>piào +6F03=>jì +6F04=>yá +6F05=>cháo +6F06=>qī +6F07=>xǐ +6F08=>jì +6F09=>lù +6F0A=>lóu +6F0B=>lóng +6F0C=>jǐn +6F0D=>guó +6F0E=>cóng +6F0F=>lòu +6F10=>zhí +6F11=>gài +6F12=>qiáng +6F13=>lí +6F14=>yǎn +6F15=>cáo +6F16=>jiào +6F17=>cōng +6F18=>chún +6F19=>tuán +6F1A=>ōu +6F1B=>téng +6F1C=>yě +6F1D=>xí +6F1E=>mì +6F1F=>táng +6F20=>mò +6F21=>shāng +6F22=>hàn +6F23=>lián +6F24=>lǎn +6F25=>wā +6F26=>chí +6F27=>gān +6F28=>féng +6F29=>xuán +6F2A=>yī +6F2B=>màn +6F2C=>zì +6F2D=>mǎng +6F2E=>kāng +6F2F=>luò +6F30=>pēng +6F31=>shù +6F32=>zhǎng +6F33=>zhāng +6F34=>zhuàng +6F35=>xù +6F36=>huàn +6F37=>huǒ +6F38=>jiàn +6F39=>yān +6F3A=>shuǎng +6F3B=>liáo +6F3C=>cuǐ +6F3D=>tí +6F3E=>yàng +6F3F=>jiāng +6F40=>cóng +6F41=>yǐng +6F42=>hóng +6F43=>xún +6F44=>shù +6F45=>guàn +6F46=>yíng +6F47=>xiāo +6F48=>zong +6F49=>kun +6F4A=>xù +6F4B=>liàn +6F4C=>zhì +6F4D=>wéi +6F4E=>pì +6F4F=>yù +6F50=>jiào +6F51=>po +6F52=>dàng +6F53=>huì +6F54=>jié +6F55=>wǔ +6F56=>pá +6F57=>jí +6F58=>pān +6F59=>wéi +6F5A=>sù +6F5B=>qián +6F5C=>qián +6F5D=>xī +6F5E=>lù +6F5F=>xì +6F60=>xùn +6F61=>dùn +6F62=>huáng +6F63=>mǐn +6F64=>rùn +6F65=>sù +6F66=>lǎo +6F67=>zhēn +6F68=>cóng +6F69=>yì +6F6A=>zhè +6F6B=>wān +6F6C=>shàn +6F6D=>tán +6F6E=>cháo +6F6F=>xún +6F70=>kuì +6F71=>yē +6F72=>shào +6F73=>tú +6F74=>zhū +6F75=>sǎ +6F76=>hēi +6F77=>bì +6F78=>shān +6F79=>chán +6F7A=>chán +6F7B=>shǔ +6F7C=>tóng +6F7D=>pū +6F7E=>lín +6F7F=>wéi +6F80=>sè +6F81=>sè +6F82=>chéng +6F83=>jiǒng +6F84=>chéng +6F85=>huà +6F86=>jiāo +6F87=>lào +6F88=>chè +6F89=>gǎn +6F8A=>cūn +6F8B=>hòng +6F8C=>sī +6F8D=>shù +6F8E=>pēng +6F8F=>hán +6F90=>yún +6F91=>liù +6F92=>hòng +6F93=>fú +6F94=>hào +6F95=>hé +6F96=>xián +6F97=>jiàn +6F98=>shān +6F99=>xì +6F9A=>yu +6F9B=>lu +6F9C=>lán +6F9D=>ning +6F9E=>yú +6F9F=>lǐn +6FA0=>miǎn +6FA1=>zǎo +6FA2=>dāng +6FA3=>huàn +6FA4=>zé +6FA5=>xiè +6FA6=>yù +6FA7=>lǐ +6FA8=>shì +6FA9=>xué +6FAA=>líng +6FAB=>wàn +6FAC=>zī +6FAD=>yōng +6FAE=>huì +6FAF=>càn +6FB0=>liàn +6FB1=>diàn +6FB2=>yè +6FB3=>ào +6FB4=>huán +6FB5=>zhēn +6FB6=>chán +6FB7=>màn +6FB8=>dǎn +6FB9=>dàn +6FBA=>yì +6FBB=>suì +6FBC=>pì +6FBD=>jù +6FBE=>tà +6FBF=>qín +6FC0=>jī +6FC1=>zhuó +6FC2=>lián +6FC3=>nóng +6FC4=>guō +6FC5=>jìn +6FC6=>fén +6FC7=>sè +6FC8=>jí +6FC9=>suī +6FCA=>huì +6FCB=>chǔ +6FCC=>tà +6FCD=>sōng +6FCE=>dǐng +6FCF=>se +6FD0=>zhǔ +6FD1=>lài +6FD2=>bīn +6FD3=>lián +6FD4=>mǐ +6FD5=>shī +6FD6=>shù +6FD7=>mì +6FD8=>nìng +6FD9=>yíng +6FDA=>yíng +6FDB=>méng +6FDC=>jìn +6FDD=>qí +6FDE=>bì +6FDF=>jì +6FE0=>háo +6FE1=>rú +6FE2=>cuì +6FE3=>wò +6FE4=>tāo +6FE5=>yǐn +6FE6=>yǐn +6FE7=>duì +6FE8=>cí +6FE9=>huò +6FEA=>jìng +6FEB=>làn +6FEC=>jùn +6FED=>ǎi +6FEE=>pú +6FEF=>zhuó +6FF0=>wéi +6FF1=>bīn +6FF2=>gǔ +6FF3=>qián +6FF4=>yíng +6FF5=>bin +6FF6=>kuò +6FF7=>fèi +6FF8=>cang +6FF9=>me +6FFA=>jiàn +6FFB=>wěi +6FFC=>luò +6FFD=>zàn +6FFE=>lǜ +6FFF=>lì +7000=>yōu +7001=>yàng +7002=>lǔ +7003=>sì +7004=>zhì +7005=>yíng +7006=>dú +7007=>wǎng +7008=>huī +7009=>xiè +700A=>pán +700B=>shěn +700C=>biāo +700D=>chán +700E=>mò +700F=>liú +7010=>jiān +7011=>pù +7012=>sè +7013=>chéng +7014=>gǔ +7015=>bīn +7016=>huò +7017=>xiàn +7018=>lú +7019=>qìn +701A=>hàn +701B=>yíng +701C=>róng +701D=>lì +701E=>jìng +701F=>xiāo +7020=>yíng +7021=>suǐ +7022=>wěi +7023=>xiè +7024=>huái +7025=>xuè +7026=>zhū +7027=>lóng +7028=>lài +7029=>duì +702A=>fán +702B=>hú +702C=>lài +702D=>shu +702E=>ling +702F=>yíng +7030=>mí +7031=>jì +7032=>liàn +7033=>jiàn +7034=>yíng +7035=>fèn +7036=>lín +7037=>yì +7038=>jiān +7039=>yuè +703A=>chán +703B=>dài +703C=>ráng +703D=>jiǎn +703E=>lán +703F=>fán +7040=>shuàng +7041=>yuān +7042=>zhuó +7043=>fēng +7044=>shè +7045=>lěi +7046=>lán +7047=>cóng +7048=>qú +7049=>yōng +704A=>qián +704B=>fǎ +704C=>guàn +704D=>què +704E=>yàn +704F=>hào +7050=>ying +7051=>sǎ +7052=>zàn +7053=>luán +7054=>yàn +7055=>lí +7056=>mǐ +7057=>shàn +7058=>tān +7059=>dǎng +705A=>jiǎo +705B=>chǎn +705C=>ying +705D=>hào +705E=>bà +705F=>zhú +7060=>lǎn +7061=>lán +7062=>nǎng +7063=>wān +7064=>luán +7065=>xún +7066=>xiǎn +7067=>yàn +7068=>gàn +7069=>yàn +706A=>yù +706B=>huǒ +706C=>biāo +706D=>miè +706E=>guāng +706F=>dēng +7070=>huī +7071=>xiāo +7072=>xiāo +7073=>hui +7074=>hōng +7075=>líng +7076=>zào +7077=>zhuàn +7078=>jiǔ +7079=>zhà +707A=>xiè +707B=>chì +707C=>zhuó +707D=>zāi +707E=>zāi +707F=>càn +7080=>yáng +7081=>qì +7082=>zhōng +7083=>fén +7084=>niǔ +7085=>jiǒng +7086=>wén +7087=>pò +7088=>yì +7089=>lú +708A=>chuī +708B=>pī +708C=>kài +708D=>pàn +708E=>yán +708F=>kài +7090=>pàng +7091=>mù +7092=>chǎo +7093=>liào +7094=>guì +7095=>kàng +7096=>dùn +7097=>guāng +7098=>xīn +7099=>zhì +709A=>guang +709B=>guāng +709C=>wěi +709D=>qiàng +709E=>bian +709F=>dá +70A0=>xiá +70A1=>zhēng +70A2=>zhú +70A3=>kě +70A4=>zhào +70A5=>fú +70A6=>bá +70A7=>xiè +70A8=>duò +70A9=>lìng +70AA=>zhuō +70AB=>xuàn +70AC=>jù +70AD=>tàn +70AE=>pào +70AF=>jiǒng +70B0=>páo +70B1=>tái +70B2=>tái +70B3=>bǐng +70B4=>yǎng +70B5=>tōng +70B6=>hān +70B7=>zhù +70B8=>zhà +70B9=>diǎn +70BA=>wèi +70BB=>shí +70BC=>liàn +70BD=>chì +70BE=>huǎng +70BF=>zhou +70C0=>hū +70C1=>shuò +70C2=>làn +70C3=>tīng +70C4=>jiǎo +70C5=>xù +70C6=>héng +70C7=>quǎn +70C8=>liè +70C9=>huàn +70CA=>yáng +70CB=>xiū +70CC=>xiū +70CD=>xiǎn +70CE=>yín +70CF=>wū +70D0=>zhōu +70D1=>yáo +70D2=>shì +70D3=>wēi +70D4=>tóng +70D5=>miè +70D6=>zāi +70D7=>kài +70D8=>hōng +70D9=>lào +70DA=>xiá +70DB=>zhú +70DC=>xuǎn +70DD=>zhēng +70DE=>pò +70DF=>yān +70E0=>huí +70E1=>guāng +70E2=>chè +70E3=>huī +70E4=>kǎo +70E5=>chen +70E6=>fán +70E7=>shāo +70E8=>yè +70E9=>huì +70EB=>tàng +70EC=>jìn +70ED=>rè +70EE=>lie +70EF=>xī +70F0=>fú +70F1=>jiǒng +70F2=>xiè +70F3=>pǔ +70F4=>tīng +70F5=>zhuó +70F6=>tǐng +70F7=>wán +70F8=>hǎi +70F9=>pēng +70FA=>lǎng +70FB=>yàn +70FC=>xù +70FD=>fēng +70FE=>chì +70FF=>róng +7100=>hú +7101=>xī +7102=>shū +7103=>hè +7104=>xūn +7105=>kù +7106=>juān +7107=>xiāo +7108=>xī +7109=>yān +710A=>hàn +710B=>zhuàng +710C=>jùn +710D=>dì +710E=>xiè +710F=>jí +7110=>wù +7111=>yān +7112=>lü +7113=>hán +7114=>yàn +7115=>huàn +7116=>mèn +7117=>jú +7118=>dào +7119=>bèi +711A=>fén +711B=>lìn +711C=>kūn +711D=>hùn +711E=>tūn +711F=>xī +7120=>cuì +7121=>wú +7122=>hōng +7123=>chǎo +7124=>fǔ +7125=>wò +7126=>jiāo +7127=>cōng +7128=>fèng +7129=>píng +712A=>qióng +712B=>ruò +712C=>xī +712D=>qióng +712E=>xìn +712F=>chāo +7130=>yàn +7131=>yàn +7132=>yì +7133=>jué +7134=>yù +7135=>gàng +7136=>rán +7137=>pí +7138=>xiòng +7139=>wang +713A=>shēng +713B=>chàng +713C=>shāo +713D=>xiǒng +713E=>niǎn +713F=>gēng +7140=>wei +7141=>chén +7142=>hè +7143=>kuǐ +7144=>zhǒng +7145=>duàn +7146=>xiā +7147=>huī +7148=>fèng +7149=>liàn +714A=>xuān +714B=>xīng +714C=>huáng +714D=>jiǎo +714E=>jiān +714F=>bì +7150=>yīng +7151=>zhǔ +7152=>wěi +7153=>tuān +7154=>shǎn +7155=>xī +7156=>nuǎn +7157=>nuǎn +7158=>chán +7159=>yān +715A=>jiǒng +715B=>jiǒng +715C=>yù +715D=>mèi +715E=>shā +715F=>wèi +7160=>zhá +7161=>xìn +7162=>qióng +7163=>róu +7164=>méi +7165=>huàn +7166=>xù +7167=>zhào +7168=>wēi +7169=>fán +716A=>qiú +716B=>suì +716C=>yáng +716D=>liè +716E=>zhǔ +716F=>jiē +7170=>gào +7171=>guā +7172=>bāo +7173=>hú +7174=>yūn +7175=>xiā +7176=>shi +7177=>liang +7178=>biān +7179=>gòu +717A=>tuì +717B=>táng +717C=>chǎo +717D=>shān +717E=>ēn +717F=>bó +7180=>huǎng +7181=>xié +7182=>xì +7183=>wù +7184=>xī +7185=>yùn +7186=>hé +7187=>hè +7188=>xī +7189=>yún +718A=>xióng +718B=>nái +718C=>shǎn +718D=>qiong +718E=>yào +718F=>xūn +7190=>mì +7191=>lián +7192=>yíng +7193=>wǔ +7194=>róng +7195=>gōng +7196=>yan +7197=>qiàng +7198=>liū +7199=>xī +719A=>bì +719B=>biāo +719C=>cōng +719D=>lù +719E=>jiān +719F=>shú +71A0=>yì +71A1=>lóu +71A2=>péng +71A3=>suī +71A4=>yì +71A5=>tēng +71A6=>jué +71A7=>zōng +71A8=>yùn +71A9=>hù +71AA=>yí +71AB=>zhì +71AC=>áo +71AD=>wèi +71AE=>liǔ +71AF=>hàn +71B0=>ōu +71B1=>rè +71B2=>jiǒng +71B3=>màn +71B4=>kun +71B5=>shāng +71B6=>cuàn +71B7=>zēng +71B8=>jiān +71B9=>xī +71BA=>xī +71BB=>xī +71BC=>yì +71BD=>xiào +71BE=>chì +71BF=>huáng +71C0=>chǎn +71C1=>yè +71C2=>tán +71C3=>rán +71C4=>yàn +71C5=>xián +71C6=>qiāo +71C7=>jùn +71C8=>dēng +71C9=>dùn +71CA=>shēn +71CB=>jiāo +71CC=>fén +71CD=>sī +71CE=>liáo +71CF=>yù +71D0=>lín +71D1=>tóng +71D2=>shāo +71D3=>fēn +71D4=>fán +71D5=>yàn +71D6=>xún +71D7=>làn +71D8=>měi +71D9=>tàng +71DA=>yì +71DB=>jǐng +71DC=>mèn +71DD=>jing +71DE=>jiǎo +71DF=>yíng +71E0=>yù +71E1=>yì +71E2=>xué +71E3=>lán +71E4=>tài +71E5=>zào +71E6=>càn +71E7=>suì +71E8=>xī +71E9=>què +71EA=>cōng +71EB=>lián +71EC=>huǐ +71ED=>zhú +71EE=>xiè +71EF=>líng +71F0=>wēi +71F1=>yì +71F2=>xié +71F3=>zhào +71F4=>huì +71F5=>da +71F6=>nóng +71F7=>lán +71F8=>rú +71F9=>xiǎn +71FA=>kǎo +71FB=>xūn +71FC=>jìn +71FD=>chóu +71FE=>dào +71FF=>yào +7200=>hè +7201=>làn +7202=>biāo +7203=>róng +7204=>lì +7205=>mò +7206=>bào +7207=>ruò +7208=>lǜ +7209=>là +720A=>āo +720B=>xùn +720C=>kuàng +720D=>shuò +720E=>liao +720F=>lì +7210=>lú +7211=>jué +7212=>liǎo +7213=>yàn +7214=>xī +7215=>xiè +7216=>lóng +7217=>yè +7218=>can +7219=>rǎng +721A=>yuè +721B=>làn +721C=>cóng +721D=>jué +721E=>chóng +721F=>guàn +7220=>ju +7221=>chè +7222=>mí +7223=>tǎng +7224=>làn +7225=>zhú +7226=>lan +7227=>líng +7228=>cuàn +7229=>yù +722A=>zhǎo +722B=>zhao +722C=>pá +722D=>zhēng +722E=>páo +722F=>chēng +7230=>yuán +7231=>ài +7232=>wèi +7233=>han +7234=>jué +7235=>jué +7236=>fù +7237=>ye +7238=>bà +7239=>diē +723A=>ye +723B=>yáo +723C=>zǔ +723D=>shuǎng +723E=>ěr +723F=>pán +7240=>chuáng +7241=>kē +7242=>zāng +7243=>dié +7244=>qiāng +7245=>yóng +7246=>qiáng +7247=>piàn +7248=>bǎn +7249=>pàn +724A=>cháo +724B=>jiān +724C=>pái +724D=>dú +724E=>chuāng +724F=>yú +7250=>zhá +7251=>biān +7252=>dié +7253=>bǎng +7254=>bó +7255=>chuāng +7256=>yǒu +7257=>you +7258=>dú +7259=>yá +725A=>chēng +725B=>niú +725C=>niu +725D=>pìn +725E=>jiū +725F=>móu +7260=>tā +7261=>mǔ +7262=>láo +7263=>rèn +7264=>māng +7265=>fāng +7266=>máo +7267=>mù +7268=>gāng +7269=>wù +726A=>yàn +726B=>gē +726C=>bèi +726D=>sì +726E=>jiàn +726F=>gǔ +7270=>yòu +7271=>gē +7272=>shēng +7273=>mǔ +7274=>dǐ +7275=>qiān +7276=>quàn +7277=>quán +7278=>zì +7279=>tè +727A=>xī +727B=>máng +727C=>kēng +727D=>qiān +727E=>wǔ +727F=>gù +7280=>xī +7281=>lí +7282=>lí +7283=>pǒu +7284=>jī +7285=>gāng +7286=>zhí +7287=>bēn +7288=>quán +7289=>chún +728A=>dú +728B=>jù +728C=>jiā +728D=>jiān +728E=>fēng +728F=>piān +7290=>kē +7291=>jú +7292=>kào +7293=>chú +7294=>xì +7295=>bèi +7296=>luò +7297=>jiè +7298=>má +7299=>sān +729A=>wèi +729B=>máo +729C=>dūn +729D=>tóng +729E=>qiao +729F=>jiàng +72A0=>xi +72A1=>lì +72A2=>dú +72A3=>liè +72A4=>pái +72A5=>piāo +72A6=>bó +72A7=>xī +72A8=>chōu +72A9=>wéi +72AA=>kuí +72AB=>chōu +72AC=>quǎn +72AD=>quan +72AE=>bá +72AF=>fàn +72B0=>qiú +72B1=>jǐ +72B2=>cái +72B3=>zhuó +72B4=>àn +72B5=>gē +72B6=>zhuàng +72B7=>guǎng +72B8=>mà +72B9=>yóu +72BA=>kàng +72BB=>bó +72BC=>hǒu +72BD=>yà +72BE=>yín +72BF=>huān +72C0=>zhuàng +72C1=>yǔn +72C2=>kuáng +72C3=>niǔ +72C4=>dí +72C5=>qīng +72C6=>zhòng +72C7=>mù +72C8=>bèi +72C9=>pī +72CA=>jú +72CB=>yí +72CC=>shēng +72CD=>páo +72CE=>xiá +72CF=>tuó +72D0=>hú +72D1=>líng +72D2=>fèi +72D3=>pí +72D4=>nǐ +72D5=>yǎo +72D6=>yòu +72D7=>gǒu +72D8=>xuè +72D9=>jū +72DA=>dàn +72DB=>bó +72DC=>kǔ +72DD=>xiǎn +72DE=>níng +72DF=>huán +72E0=>hěn +72E1=>jiǎo +72E2=>hé +72E3=>zhào +72E4=>jí +72E5=>xùn +72E6=>shān +72E7=>tà +72E8=>róng +72E9=>shòu +72EA=>tóng +72EB=>lǎo +72EC=>dú +72ED=>xiá +72EE=>shī +72EF=>kuài +72F0=>zhēng +72F1=>yù +72F2=>sūn +72F3=>yú +72F4=>bì +72F5=>máng +72F6=>xī +72F7=>juàn +72F8=>li +72F9=>xiá +72FA=>yín +72FB=>suān +72FC=>láng +72FD=>bèi +72FE=>zhì +72FF=>yán +7300=>shā +7301=>lì +7302=>hàn +7303=>xiǎn +7304=>jīng +7305=>pái +7306=>fēi +7307=>xiāo +7308=>bài +7309=>qí +730A=>ní +730B=>biāo +730C=>yìn +730D=>lái +730E=>liè +730F=>jiān +7310=>qiāng +7311=>kūn +7312=>yān +7313=>guǒ +7314=>zòng +7315=>mí +7316=>chāng +7317=>yī +7318=>zhì +7319=>zhēng +731A=>yá +731B=>měng +731C=>cāi +731D=>cù +731E=>shē +731F=>lie +7320=>diǎn +7321=>luó +7322=>hú +7323=>zōng +7324=>guì +7325=>wěi +7326=>fēng +7327=>wō +7328=>yuán +7329=>xīng +732A=>zhū +732B=>māo +732C=>wei +732D=>chuān +732E=>xiàn +732F=>tuān +7330=>yà +7331=>náo +7332=>xiē +7333=>jiā +7334=>hóu +7335=>biān +7336=>yóu +7337=>yóu +7338=>méi +7339=>chá +733A=>yáo +733B=>sūn +733C=>bó +733D=>míng +733E=>huá +733F=>yuán +7340=>sōu +7341=>mà +7342=>yuán +7343=>dāi +7344=>yù +7345=>shī +7346=>háo +7347=>qiang +7348=>yì +7349=>zhēn +734A=>cāng +734B=>háo +734C=>màn +734D=>jìng +734E=>jiǎng +734F=>mò +7350=>zhāng +7351=>chán +7352=>áo +7353=>áo +7354=>háo +7355=>cuī +7356=>bèn +7357=>jué +7358=>bì +7359=>bì +735A=>huáng +735B=>pú +735C=>lín +735D=>xù +735E=>tóng +735F=>yào +7360=>liáo +7361=>shuò +7362=>xiāo +7363=>shou +7364=>dūn +7365=>jiào +7366=>gé +7367=>juàn +7368=>dú +7369=>huì +736A=>kuài +736B=>xiǎn +736C=>xiè +736D=>tǎ +736E=>xiǎn +736F=>xūn +7370=>níng +7371=>pín +7372=>huò +7373=>nòu +7374=>měng +7375=>liè +7376=>nǎo +7377=>guǎng +7378=>shòu +7379=>lú +737A=>tǎ +737B=>xiàn +737C=>mí +737D=>ráng +737E=>huān +737F=>nǎo +7380=>luó +7381=>xiǎn +7382=>qí +7383=>jué +7384=>xuán +7385=>miào +7386=>zī +7387=>lǜ +7388=>lú +7389=>yù +738A=>sù +738B=>wáng +738C=>qiú +738D=>gǎ +738E=>dīng +738F=>lè +7390=>bā +7391=>jī +7392=>hóng +7393=>dì +7394=>chuàn +7395=>gān +7396=>jiǔ +7397=>yú +7398=>qǐ +7399=>yú +739A=>chàng +739B=>mǎ +739C=>gōng +739D=>wǔ +739E=>fū +739F=>wén +73A0=>jiè +73A1=>yá +73A2=>bīn +73A3=>biàn +73A4=>bàng +73A5=>yuè +73A6=>jué +73A7=>mén +73A8=>jué +73A9=>wán +73AA=>jiān +73AB=>méi +73AC=>dǎn +73AD=>pín +73AE=>wěi +73AF=>huán +73B0=>xiàn +73B1=>qiāng +73B2=>líng +73B3=>dài +73B4=>yì +73B5=>án +73B6=>píng +73B7=>diàn +73B8=>fú +73B9=>xuán +73BA=>xǐ +73BB=>bō +73BC=>cǐ +73BD=>gǒu +73BE=>jiǎ +73BF=>sháo +73C0=>pò +73C1=>cí +73C2=>kē +73C3=>rǎn +73C4=>shēng +73C5=>shēn +73C6=>yí +73C7=>zǔ +73C8=>jiā +73C9=>mín +73CA=>shān +73CB=>liǔ +73CC=>bì +73CD=>zhēn +73CE=>zhēn +73CF=>jué +73D0=>fà +73D1=>lóng +73D2=>jīn +73D3=>jiào +73D4=>jiàn +73D5=>lì +73D6=>guàng +73D7=>xiān +73D8=>zhōu +73D9=>gǒng +73DA=>yān +73DB=>xiù +73DC=>yáng +73DD=>xǔ +73DE=>luò +73DF=>sù +73E0=>zhū +73E1=>qín +73E2=>yín +73E3=>xún +73E4=>bǎo +73E5=>ěr +73E6=>xiàng +73E7=>yáo +73E8=>xiá +73E9=>háng +73EA=>guī +73EB=>chōng +73EC=>xù +73ED=>bān +73EE=>pèi +73EF=>lao +73F0=>dāng +73F1=>ying +73F2=>huī +73F3=>wén +73F4=>é +73F5=>chéng +73F6=>dì +73F7=>wǔ +73F8=>wú +73F9=>chéng +73FA=>jùn +73FB=>méi +73FC=>bèi +73FD=>tǐng +73FE=>xiàn +73FF=>chù +7400=>hán +7401=>xuán +7402=>yán +7403=>qiú +7404=>xuàn +7405=>láng +7406=>lǐ +7407=>xiù +7408=>fú +7409=>liú +740A=>yá +740B=>xī +740C=>líng +740D=>lí +740E=>jìn +740F=>liǎn +7410=>suǒ +7411=>suo +7412=>feng +7413=>wán +7414=>diàn +7415=>pín +7416=>zhǎn +7417=>sè +7418=>mín +7419=>yù +741A=>jū +741B=>chēn +741C=>lái +741D=>wén +741E=>shèng +741F=>wéi +7420=>tiǎn +7421=>chù +7422=>zuó +7423=>běng +7424=>chēng +7425=>hǔ +7426=>qí +7427=>è +7428=>kūn +7429=>chāng +742A=>qí +742B=>běng +742C=>wǎn +742D=>lù +742E=>cóng +742F=>guǎn +7430=>yǎn +7431=>diāo +7432=>bèi +7433=>lín +7434=>qín +7435=>pí +7436=>pá +7437=>què +7438=>zhuó +7439=>qín +743A=>fà +743B=>jin +743C=>qióng +743D=>dǔ +743E=>jiè +743F=>hún +7440=>yǔ +7441=>mào +7442=>méi +7443=>chūn +7444=>xuān +7445=>tí +7446=>xīng +7447=>dài +7448=>róu +7449=>mín +744A=>jiān +744B=>wěi +744C=>ruǎn +744D=>huàn +744E=>xié +744F=>chuān +7450=>jiǎn +7451=>zhuàn +7452=>chàng +7453=>liàn +7454=>quán +7455=>xiá +7456=>duàn +7457=>yuàn +7458=>yá +7459=>nǎo +745A=>hú +745B=>yīng +745C=>yú +745D=>huáng +745E=>ruì +745F=>sè +7460=>liú +7461=>shī +7462=>róng +7463=>suǒ +7464=>yáo +7465=>wēn +7466=>wǔ +7467=>zhēn +7468=>jìn +7469=>yíng +746A=>mǎ +746B=>tāo +746C=>liú +746D=>táng +746E=>lì +746F=>láng +7470=>guī +7471=>zhèn +7472=>qiāng +7473=>cuō +7474=>jué +7475=>zhǎo +7476=>yáo +7477=>ài +7478=>bīn +7479=>shū +747A=>cháng +747B=>kūn +747C=>zhuān +747D=>cōng +747E=>jǐn +747F=>yī +7480=>cuǐ +7481=>cōng +7482=>qí +7483=>lí +7484=>yǐng +7485=>suǒ +7486=>qiú +7487=>xuán +7488=>áo +7489=>liǎn +748A=>mén +748B=>zhāng +748C=>yín +748D=>hua +748E=>yīng +748F=>wèi +7490=>lù +7491=>wú +7492=>dēng +7493=>xiù +7494=>zēng +7495=>xún +7496=>qú +7497=>dàng +7498=>lín +7499=>liáo +749A=>qióng +749B=>sù +749C=>huáng +749D=>guī +749E=>pú +749F=>jǐng +74A0=>fán +74A1=>jìn +74A2=>liú +74A3=>jī +74A4=>hui +74A5=>jǐng +74A6=>ài +74A7=>bì +74A8=>càn +74A9=>qú +74AA=>zǎo +74AB=>dāng +74AC=>jiǎo +74AD=>gùn +74AE=>tǎn +74AF=>huì +74B0=>huán +74B1=>sè +74B2=>suì +74B3=>tián +74B4=>chu +74B5=>yú +74B6=>jìn +74B7=>lú +74B8=>bīn +74B9=>shú +74BA=>wèn +74BB=>zuǐ +74BC=>lán +74BD=>xǐ +74BE=>zī +74BF=>xuán +74C0=>ruǎn +74C1=>wò +74C2=>gài +74C3=>léi +74C4=>dú +74C5=>lì +74C6=>zhì +74C7=>róu +74C8=>lí +74C9=>zàn +74CA=>qióng +74CB=>tì +74CC=>guī +74CD=>suí +74CE=>là +74CF=>lóng +74D0=>lú +74D1=>lì +74D2=>zàn +74D3=>làn +74D4=>yīng +74D5=>mí +74D6=>xiāng +74D7=>qióng +74D8=>guàn +74D9=>dào +74DA=>zàn +74DB=>huán +74DC=>guā +74DD=>bó +74DE=>dié +74DF=>bó +74E0=>hù +74E1=>zhí +74E2=>piáo +74E3=>bàn +74E4=>ráng +74E5=>lì +74E6=>wǎ +74E8=>xiáng +74E9=>qiān +74EA=>bǎn +74EB=>pén +74EC=>fǎng +74ED=>dǎn +74EE=>wèng +74EF=>ōu +74F2=>wa +74F3=>hú +74F4=>líng +74F5=>yí +74F6=>píng +74F7=>cí +74F8=>bǎi +74F9=>juān +74FA=>cháng +74FB=>chī +74FD=>dàng +74FE=>měng +74FF=>bù +7500=>zhuì +7501=>píng +7502=>biān +7503=>zhòu +7504=>zhēn +7506=>cí +7507=>yīng +7508=>qì +7509=>xián +750A=>lǒu +750B=>dì +750C=>ōu +750D=>méng +750E=>zhuān +750F=>bèng +7510=>lìn +7511=>zèng +7512=>wǔ +7513=>pì +7514=>dān +7515=>wèng +7516=>yīng +7517=>yǎn +7518=>gān +7519=>dài +751A=>shén +751B=>tián +751C=>tián +751D=>hán +751E=>cháng +751F=>shēng +7520=>qíng +7521=>shēn +7522=>chǎn +7523=>chǎn +7524=>ruí +7525=>shēng +7526=>sū +7527=>shēn +7528=>yòng +7529=>shuǎi +752A=>lù +752B=>fu +752C=>yǒng +752D=>béng +752E=>fèng +752F=>níng +7530=>tián +7531=>yóu +7532=>jiǎ +7533=>shēn +7534=>zhá +7535=>diàn +7536=>fú +7537=>nán +7538=>diān +7539=>pīng +753A=>tīng +753B=>huà +753C=>tǐng +753D=>zhèn +753E=>zāi +753F=>méng +7540=>bì +7541=>qí +7542=>liù +7543=>xún +7544=>liú +7545=>chàng +7546=>mǔ +7547=>yún +7548=>fàn +7549=>fú +754A=>gēng +754B=>tián +754C=>jiè +754D=>jiè +754E=>quǎn +754F=>wèi +7550=>fú +7551=>tián +7552=>mǔ +7553=>duō +7554=>pàn +7555=>jiāng +7556=>wā +7557=>dá +7558=>nán +7559=>liú +755A=>běn +755B=>zhěn +755C=>chù +755D=>mǔ +755E=>mǔ +755F=>cè +7560=>tián +7561=>gāi +7562=>bì +7563=>dá +7564=>zhì +7565=>è +7566=>qí +7567=>lüè +7568=>pān +7569=>yi +756A=>fān +756B=>huà +756C=>shē +756D=>yú +756E=>mǔ +756F=>jùn +7570=>yì +7571=>liú +7572=>shē +7573=>dié +7574=>chóu +7575=>huà +7576=>dāng +7577=>zhuì +7578=>jī +7579=>wǎn +757A=>jiāng +757B=>chéng +757C=>chàng +757D=>tǔn +757E=>léi +757F=>jī +7580=>chā +7581=>liú +7582=>die +7583=>tuǎn +7584=>lìn +7585=>jiāng +7586=>jiāng +7587=>chóu +7588=>pì +7589=>dié +758A=>dié +758B=>pǐ +758C=>jié +758D=>dàn +758E=>shū +758F=>shū +7590=>zhì +7591=>yí +7592=>nè +7593=>nǎi +7594=>dīng +7595=>bǐ +7596=>jiē +7597=>liáo +7598=>gāng +7599=>gē +759A=>jiù +759B=>zhǒu +759C=>xià +759D=>shàn +759E=>xū +759F=>nüè +75A0=>lì +75A1=>yáng +75A2=>chèn +75A3=>yóu +75A4=>bā +75A5=>jiè +75A6=>jué +75A7=>qí +75A8=>xiā +75A9=>cuì +75AA=>bì +75AB=>yì +75AC=>lì +75AD=>zòng +75AE=>chuāng +75AF=>fēng +75B0=>zhù +75B1=>pào +75B2=>pí +75B3=>gān +75B4=>kē +75B5=>cī +75B6=>xuē +75B7=>zhī +75B8=>dǎn +75B9=>zhěn +75BA=>fá +75BB=>zhǐ +75BC=>téng +75BD=>jū +75BE=>jí +75BF=>fèi +75C0=>jū +75C1=>shān +75C2=>jiā +75C3=>xuán +75C4=>zhà +75C5=>bìng +75C6=>niè +75C7=>zhèng +75C8=>yōng +75C9=>jìng +75CA=>quán +75CB=>téng +75CC=>tōng +75CD=>yí +75CE=>jiē +75CF=>wěi +75D0=>huí +75D1=>tān +75D2=>yǎng +75D3=>chì +75D4=>zhì +75D5=>hén +75D6=>yǎ +75D7=>mèi +75D8=>dòu +75D9=>jìng +75DA=>xiāo +75DB=>tòng +75DC=>tū +75DD=>máng +75DE=>pǐ +75DF=>xiāo +75E0=>suān +75E1=>fū +75E2=>lì +75E3=>zhì +75E4=>cuó +75E5=>duó +75E6=>wù +75E7=>shā +75E8=>láo +75E9=>shòu +75EA=>huàn +75EB=>xián +75EC=>yì +75ED=>bēng +75EE=>zhàng +75EF=>guǎn +75F0=>tán +75F1=>fèi +75F2=>má +75F3=>lín +75F4=>chī +75F5=>jì +75F6=>tiǎn +75F7=>ān +75F8=>chì +75F9=>bì +75FA=>bì +75FB=>mín +75FC=>gù +75FD=>duī +75FE=>ē +75FF=>wěi +7600=>yū +7601=>cuì +7602=>yǎ +7603=>zhú +7604=>cù +7605=>dān +7606=>shèn +7607=>zhǒng +7608=>chì +7609=>yù +760A=>hóu +760B=>fēng +760C=>là +760D=>yáng +760E=>chén +760F=>tú +7610=>yǔ +7611=>guō +7612=>wén +7613=>huàn +7614=>kù +7615=>jiǎ +7616=>yīn +7617=>yì +7618=>lòu +7619=>sào +761A=>jué +761B=>chì +761C=>xī +761D=>guān +761E=>yì +761F=>wēn +7620=>jí +7621=>chuāng +7622=>bān +7623=>huì +7624=>liú +7625=>chài +7626=>shòu +7627=>nüè +7628=>diān +7629=>da +762A=>biě +762B=>tān +762C=>zhàng +762D=>biāo +762E=>shèn +762F=>cù +7630=>luǒ +7631=>yì +7632=>zòng +7633=>chōu +7634=>zhàng +7635=>zhài +7636=>sòu +7637=>sè +7638=>qué +7639=>diào +763A=>lòu +763B=>lòu +763C=>mò +763D=>qín +763E=>yǐn +763F=>yǐng +7640=>huáng +7641=>fú +7642=>liáo +7643=>lóng +7644=>qiáo +7645=>liú +7646=>láo +7647=>xián +7648=>fèi +7649=>dān +764A=>yìn +764B=>hè +764C=>ái +764D=>bān +764E=>xián +764F=>guān +7650=>guì +7651=>nòng +7652=>yù +7653=>wéi +7654=>yì +7655=>yōng +7656=>pǐ +7657=>lěi +7658=>lì +7659=>shǔ +765A=>dàn +765B=>lǐn +765C=>diàn +765D=>lǐn +765E=>lài +765F=>biě +7660=>jì +7661=>chī +7662=>yǎng +7663=>xuǎn +7664=>jiē +7665=>zhēng +7666=>me +7667=>lì +7668=>huò +7669=>lài +766A=>ji +766B=>diān +766C=>xuǎn +766D=>yǐng +766E=>yǐn +766F=>qú +7670=>yōng +7671=>tān +7672=>diān +7673=>luǒ +7674=>luán +7675=>luán +7676=>bō +7677=>bō +7678=>guǐ +7679=>bá +767A=>fā +767B=>dēng +767C=>fā +767D=>bái +767E=>bǎi +767F=>qié +7680=>jí +7681=>zào +7682=>zào +7683=>mào +7684=>de +7685=>pā +7686=>jiē +7687=>huáng +7688=>guī +7689=>cǐ +768A=>líng +768B=>gāo +768C=>mò +768D=>jí +768E=>jiǎo +768F=>pěng +7690=>gāo +7691=>ái +7692=>é +7693=>hào +7694=>hàn +7695=>bì +7696=>wǎn +7697=>chóu +7698=>qiàn +7699=>xī +769A=>ái +769B=>xiǎo +769C=>hào +769D=>huàng +769E=>hào +769F=>zé +76A0=>cuǐ +76A1=>hào +76A2=>xiǎo +76A3=>yè +76A4=>pó +76A5=>hào +76A6=>jiǎo +76A7=>ài +76A8=>xīng +76A9=>huàng +76AA=>lì +76AB=>piǎo +76AC=>hé +76AD=>jiào +76AE=>pí +76AF=>gǎn +76B0=>pào +76B1=>zhòu +76B2=>jūn +76B3=>qiú +76B4=>cūn +76B5=>què +76B6=>zhā +76B7=>gǔ +76B8=>jūn +76B9=>jūn +76BA=>zhòu +76BB=>zhā +76BC=>gǔ +76BD=>zhāo +76BE=>dú +76BF=>mǐn +76C0=>qǐ +76C1=>yíng +76C2=>yú +76C3=>bēi +76C4=>zhāo +76C5=>zhōng +76C6=>pén +76C7=>hé +76C8=>yíng +76C9=>hé +76CA=>yì +76CB=>bō +76CC=>wǎn +76CD=>hé +76CE=>àng +76CF=>zhǎn +76D0=>yán +76D1=>jiān +76D2=>hé +76D3=>yū +76D4=>kuī +76D5=>fàn +76D6=>gài +76D7=>dào +76D8=>pán +76D9=>fǔ +76DA=>qiú +76DB=>shèng +76DC=>dào +76DD=>lù +76DE=>zhǎn +76DF=>méng +76E0=>lí +76E1=>jǐn +76E2=>xù +76E3=>jiān +76E4=>pán +76E5=>guàn +76E6=>ān +76E7=>lú +76E8=>xǔ +76E9=>zhōu +76EA=>dàng +76EB=>ān +76EC=>gǔ +76ED=>lì +76EE=>mù +76EF=>dīng +76F0=>gàn +76F1=>xū +76F2=>máng +76F3=>wàng +76F4=>zhí +76F5=>qì +76F6=>yuǎn +76F7=>tián +76F8=>xiāng +76F9=>dǔn +76FA=>xīn +76FB=>xì +76FC=>pàn +76FD=>fēng +76FE=>dùn +76FF=>mín +7700=>míng +7701=>shěng +7702=>shì +7703=>yún +7704=>miǎn +7705=>pān +7706=>fǎng +7707=>miǎo +7708=>dān +7709=>méi +770A=>mào +770B=>kàn +770C=>xiàn +770D=>kōu +770E=>shì +770F=>yāng +7710=>zhēng +7711=>yǎo +7712=>shēn +7713=>huò +7714=>dà +7715=>zhěn +7716=>kuàng +7717=>jū +7718=>shèn +7719=>yí +771A=>shěng +771B=>mèi +771C=>mò +771D=>zhù +771E=>zhēn +771F=>zhēn +7720=>mián +7721=>shì +7722=>yuān +7723=>dié +7724=>nì +7725=>zì +7726=>zì +7727=>chǎo +7728=>zhǎ +7729=>xuàn +772A=>bǐng +772B=>mǐ +772C=>lóng +772D=>suī +772E=>tóng +772F=>mī +7730=>diè +7731=>dì +7732=>nè +7733=>míng +7734=>xuàn +7735=>chī +7736=>kuàng +7737=>juàn +7738=>móu +7739=>zhèn +773A=>tiào +773B=>yáng +773C=>yǎn +773D=>mò +773E=>zhòng +773F=>mò +7740=>zhe +7741=>zhēng +7742=>méi +7743=>suō +7744=>shào +7745=>hàn +7746=>huàn +7747=>dì +7748=>chěng +7749=>cuó +774A=>juàn +774B=>é +774C=>mǎn +774D=>xiàn +774E=>xī +774F=>kùn +7750=>lài +7751=>jiǎn +7752=>shǎn +7753=>tiǎn +7754=>gùn +7755=>wǎn +7756=>lèng +7757=>shì +7758=>qióng +7759=>liè +775A=>yá +775B=>jing +775C=>zhēng +775D=>lí +775E=>lài +775F=>suì +7760=>juàn +7761=>shuì +7762=>suī +7763=>dū +7764=>bì +7765=>pì +7766=>mù +7767=>hūn +7768=>nì +7769=>lù +776A=>yì +776B=>jié +776C=>cǎi +776D=>zhǒu +776E=>yú +776F=>hūn +7770=>mà +7771=>xià +7772=>xǐng +7773=>huī +7774=>gùn +7775=>zāi +7776=>chǔn +7777=>jiān +7778=>mèi +7779=>dǔ +777A=>hóu +777B=>xuān +777C=>tiàn +777D=>kuí +777E=>gāo +777F=>ruì +7780=>mào +7781=>xù +7782=>fá +7783=>wò +7784=>miáo +7785=>chǒu +7786=>kuì +7787=>mī +7788=>wěng +7789=>kòu +778A=>dàng +778B=>chēn +778C=>kē +778D=>sǒu +778E=>xiā +778F=>qióng +7790=>mò +7791=>míng +7792=>mán +7793=>shuì +7794=>zé +7795=>zhàng +7796=>yì +7797=>diāo +7798=>kōu +7799=>mò +779A=>shùn +779B=>cōng +779C=>lōu +779D=>chī +779E=>mán +779F=>piǎo +77A0=>chēng +77A1=>guǐ +77A2=>méng +77A3=>huan +77A4=>rún +77A5=>piē +77A6=>xī +77A7=>qiáo +77A8=>pú +77A9=>zhǔ +77AA=>dèng +77AB=>shěn +77AC=>shùn +77AD=>liǎo +77AE=>chè +77AF=>xián +77B0=>kàn +77B1=>yè +77B2=>xù +77B3=>tóng +77B4=>móu +77B5=>lín +77B6=>guì +77B7=>jiàn +77B8=>yè +77B9=>ài +77BA=>huì +77BB=>zhān +77BC=>jiǎn +77BD=>gǔ +77BE=>zhào +77BF=>qú +77C0=>méi +77C1=>chǒu +77C2=>sào +77C3=>nǐng +77C4=>xūn +77C5=>yào +77C6=>huò +77C7=>méng +77C8=>mián +77C9=>pín +77CA=>mián +77CB=>lì +77CC=>kuàng +77CD=>jué +77CE=>xuān +77CF=>mián +77D0=>huò +77D1=>lú +77D2=>méng +77D3=>lóng +77D4=>guàn +77D5=>mǎn +77D6=>xǐ +77D7=>chù +77D8=>tǎng +77D9=>kàn +77DA=>zhǔ +77DB=>máo +77DC=>jīn +77DD=>lín +77DE=>yù +77DF=>shuò +77E0=>zé +77E1=>jué +77E2=>shǐ +77E3=>yǐ +77E4=>shěn +77E5=>zhī +77E6=>hóu +77E7=>shěn +77E8=>yǐng +77E9=>ju +77EA=>zhōu +77EB=>jiǎo +77EC=>cuó +77ED=>duǎn +77EE=>ǎi +77EF=>jiǎo +77F0=>zēng +77F1=>yuē +77F2=>bà +77F3=>shí +77F4=>dìng +77F5=>qì +77F6=>jī +77F7=>zǐ +77F8=>gān +77F9=>wù +77FA=>zhé +77FB=>kū +77FC=>gāng +77FD=>xì +77FE=>fán +77FF=>kuàng +7800=>dàng +7801=>mǎ +7802=>shā +7803=>dān +7804=>jué +7805=>lì +7806=>fū +7807=>mín +7808=>ě +7809=>huò +780A=>kāng +780B=>zhǐ +780C=>qì +780D=>kǎn +780E=>jiè +780F=>bīn +7810=>è +7811=>yà +7812=>pī +7813=>zhé +7814=>yán +7815=>suì +7816=>zhuān +7817=>chē +7818=>dùn +7819=>pān +781A=>yàn +781B=>jin +781C=>fēng +781D=>fá +781E=>mò +781F=>zhǎ +7820=>jū +7821=>yù +7822=>kē +7823=>tuó +7824=>tuó +7825=>dǐ +7826=>zhài +7827=>zhēn +7828=>è +7829=>fú +782A=>mǔ +782B=>zhù +782C=>lá +782D=>biān +782E=>nǔ +782F=>pīng +7830=>pēng +7831=>líng +7832=>pào +7833=>lè +7834=>pò +7835=>bō +7836=>pò +7837=>shēn +7838=>zá +7839=>ài +783A=>lì +783B=>lóng +783C=>tóng +783D=>yong +783E=>lì +783F=>kuang +7840=>chǔ +7841=>kēng +7842=>quán +7843=>zhū +7844=>kuāng +7845=>guī +7846=>è +7847=>náo +7848=>qià +7849=>lù +784A=>wěi +784B=>ài +784C=>gè +784D=>xiàn +784E=>xíng +784F=>yán +7850=>dòng +7851=>pēng +7852=>xī +7853=>lao +7854=>hóng +7855=>shuò +7856=>xiá +7857=>qiāo +7858=>qing +7859=>wéi +785A=>qiáo +785B=>yì +785C=>kēng +785D=>xiāo +785E=>què +785F=>chàn +7860=>láng +7861=>hōng +7862=>yú +7863=>xiāo +7864=>xiá +7865=>mǎng +7866=>luò +7867=>yǒng +7868=>chē +7869=>chè +786A=>wò +786B=>liú +786C=>yìng +786D=>máng +786E=>què +786F=>yàn +7870=>shā +7871=>kǔn +7872=>yù +7873=>chì +7874=>hua +7875=>lǔ +7876=>chěn +7877=>jiǎn +7878=>nüè +7879=>sōng +787A=>zhuó +787B=>kēng +787C=>péng +787D=>yān +787E=>zhuì +787F=>kōng +7880=>chéng +7881=>qí +7882=>zòng +7883=>qìng +7884=>lín +7885=>jūn +7886=>bō +7887=>dìng +7888=>mín +7889=>diāo +788A=>jiān +788B=>hè +788C=>lù +788D=>ài +788E=>suì +788F=>què +7890=>léng +7891=>bēi +7892=>yín +7893=>duì +7894=>wǔ +7895=>qí +7896=>lǔn +7897=>wǎn +7898=>diǎn +7899=>náo +789A=>bèi +789B=>qì +789C=>chěn +789D=>ruǎn +789E=>yán +789F=>dié +78A0=>dìng +78A1=>dú +78A2=>tuó +78A3=>jié +78A4=>yīng +78A5=>biǎn +78A6=>kè +78A7=>bì +78A8=>wèi +78A9=>shuò +78AA=>zhēn +78AB=>duàn +78AC=>xiá +78AD=>dàng +78AE=>tí +78AF=>nǎo +78B0=>pèng +78B1=>jiǎn +78B2=>dì +78B3=>tàn +78B4=>chá +78B5=>tian +78B6=>qì +78B7=>dun +78B8=>fēng +78B9=>xuàn +78BA=>què +78BB=>què +78BC=>mǎ +78BD=>gōng +78BE=>niǎn +78BF=>sù +78C0=>é +78C1=>cí +78C2=>liú +78C3=>sī +78C4=>táng +78C5=>bàng +78C6=>huá +78C7=>pī +78C8=>wěi +78C9=>sǎng +78CA=>lěi +78CB=>cuō +78CC=>tián +78CD=>xiá +78CE=>xī +78CF=>lián +78D0=>pán +78D1=>wéi +78D2=>yǔn +78D3=>duī +78D4=>zhé +78D5=>kē +78D6=>lá +78D7=>zhuān +78D8=>qìng +78D9=>gǔn +78DA=>zhuān +78DB=>chán +78DC=>qì +78DD=>áo +78DE=>pēng +78DF=>liù +78E0=>lǔ +78E1=>kàn +78E2=>chuǎng +78E3=>chěn +78E4=>yǐn +78E5=>lěi +78E6=>biāo +78E7=>qì +78E8=>mó +78E9=>qì +78EA=>cuī +78EB=>zōng +78EC=>qìng +78ED=>chuò +78EE=>lun +78EF=>jī +78F0=>shàn +78F1=>láo +78F2=>qú +78F3=>zēng +78F4=>dèng +78F5=>jiàn +78F6=>xì +78F7=>lín +78F8=>dìng +78F9=>tán +78FA=>huáng +78FB=>pán +78FC=>zá +78FD=>qiāo +78FE=>dī +78FF=>lì +7900=>jian +7901=>jiāo +7902=>xi +7903=>zhǎng +7904=>qiáo +7905=>dūn +7906=>jiǎn +7907=>yù +7908=>zhuì +7909=>hé +790A=>kè +790B=>zé +790C=>léi +790D=>kě +790E=>chǔ +790F=>yè +7910=>què +7911=>dàng +7912=>yǐ +7913=>jiāng +7914=>pī +7915=>pī +7916=>yù +7917=>pīn +7918=>è +7919=>ài +791A=>kē +791B=>jiān +791C=>yù +791D=>ruǎn +791E=>méng +791F=>pào +7920=>cí +7921=>bó +7922=>yang +7923=>mà +7924=>cǎ +7925=>xián +7926=>kuàng +7927=>léi +7928=>lěi +7929=>zhì +792A=>lì +792B=>lì +792C=>fán +792D=>què +792E=>pào +792F=>yīng +7930=>lì +7931=>lóng +7932=>lóng +7933=>mò +7934=>bó +7935=>shuāng +7936=>guàn +7937=>lán +7938=>zǎn +7939=>yán +793A=>shì +793B=>shì +793C=>lǐ +793D=>réng +793E=>shè +793F=>yuè +7940=>sì +7941=>qí +7942=>tā +7943=>mà +7944=>xiè +7945=>yāo +7946=>xiān +7947=>qí +7948=>qí +7949=>zhǐ +794A=>bēng +794B=>duì +794C=>zhòng +794D=>rèn +794E=>yī +794F=>shí +7950=>yòu +7951=>zhì +7952=>tiáo +7953=>fú +7954=>fù +7955=>mì +7956=>zǔ +7957=>zhī +7958=>suàn +7959=>mèi +795A=>zuò +795B=>qū +795C=>hù +795D=>zhù +795E=>shén +795F=>suì +7960=>cí +7961=>chái +7962=>mí +7963=>lǚ +7964=>yǔ +7965=>xiáng +7966=>wú +7967=>tiāo +7968=>piào +7969=>zhù +796A=>guǐ +796B=>xiá +796C=>zhī +796D=>jì +796E=>gào +796F=>zhēn +7970=>gào +7971=>shuì +7972=>jìn +7973=>shèn +7974=>gāi +7975=>kǔn +7976=>dì +7977=>dǎo +7978=>huò +7979=>táo +797A=>qí +797B=>gù +797C=>guàn +797D=>zuì +797E=>líng +797F=>lù +7980=>bǐng +7981=>jìn +7982=>dǎo +7983=>zhí +7984=>lù +7985=>chán +7986=>bēi +7987=>zhě +7988=>huī +7989=>yǒu +798A=>xì +798B=>yīn +798C=>zī +798D=>huò +798E=>zhēn +798F=>fú +7990=>yuàn +7991=>wú +7992=>xiǎn +7993=>yáng +7994=>zhī +7995=>yī +7996=>méi +7997=>sī +7998=>dì +7999=>bei +799A=>zhuó +799B=>zhēn +799C=>yǒng +799D=>jí +799E=>gào +799F=>táng +79A0=>sī +79A1=>mà +79A2=>tà +79A3=>fu +79A4=>xuān +79A5=>qí +79A6=>yù +79A7=>xǐ +79A8=>jī +79A9=>sì +79AA=>chán +79AB=>dàn +79AC=>guì +79AD=>suì +79AE=>lǐ +79AF=>nóng +79B0=>mí +79B1=>dǎo +79B2=>lì +79B3=>ráng +79B4=>yuè +79B5=>tí +79B6=>zàn +79B7=>lèi +79B8=>róu +79B9=>yǔ +79BA=>yú +79BB=>lí +79BC=>xiè +79BD=>qín +79BE=>hé +79BF=>tū +79C0=>xiù +79C1=>sī +79C2=>rén +79C3=>tū +79C4=>zǐ +79C5=>chá +79C6=>gǎn +79C7=>yì +79C8=>xiān +79C9=>bǐng +79CA=>nián +79CB=>qiū +79CC=>qiū +79CD=>zhǒng +79CE=>fèn +79CF=>hào +79D0=>yún +79D1=>kē +79D2=>miǎo +79D3=>zhī +79D4=>jīng +79D5=>bǐ +79D6=>zhī +79D7=>yù +79D8=>mì +79D9=>kù +79DA=>bàn +79DB=>pī +79DC=>ní +79DD=>lì +79DE=>yóu +79DF=>zū +79E0=>pī +79E1=>bó +79E2=>líng +79E3=>mò +79E4=>chèng +79E5=>nián +79E6=>qín +79E7=>yāng +79E8=>zuó +79E9=>zhì +79EA=>zhī +79EB=>shú +79EC=>jù +79ED=>zǐ +79EE=>huó +79EF=>jī +79F0=>chēng +79F1=>tóng +79F2=>zhì +79F3=>huó +79F4=>hé +79F5=>yīn +79F6=>zī +79F7=>zhì +79F8=>jiē +79F9=>rěn +79FA=>dù +79FB=>yí +79FC=>zhū +79FD=>huì +79FE=>nóng +79FF=>fù +7A00=>xī +7A01=>kǎo +7A02=>láng +7A03=>fū +7A04=>xùn +7A05=>shuì +7A06=>lǚ +7A07=>kǔn +7A08=>gǎn +7A09=>jīng +7A0A=>tí +7A0B=>chéng +7A0C=>tú +7A0D=>shāo +7A0E=>shuì +7A0F=>yà +7A10=>lǔn +7A11=>lù +7A12=>gù +7A13=>zuó +7A14=>rěn +7A15=>zhùn +7A16=>bàng +7A17=>bài +7A18=>jī +7A19=>zhī +7A1A=>zhì +7A1B=>kǔn +7A1C=>léng +7A1D=>péng +7A1E=>kē +7A1F=>bǐng +7A20=>chóu +7A21=>zuì +7A22=>yù +7A23=>sū +7A24=>lüè +7A25=>xiāng +7A26=>yī +7A27=>xì +7A28=>biǎn +7A29=>jì +7A2A=>fú +7A2B=>pì +7A2C=>nuò +7A2D=>jiē +7A2E=>zhǒng +7A2F=>zōng +7A30=>xǔ +7A31=>chēng +7A32=>dào +7A33=>wěn +7A34=>xián +7A35=>zī +7A36=>yù +7A37=>jì +7A38=>xù +7A39=>zhěn +7A3A=>zhì +7A3B=>dào +7A3C=>jia +7A3D=>jī +7A3E=>gǎo +7A3F=>gǎo +7A40=>gǔ +7A41=>róng +7A42=>suì +7A43=>rong +7A44=>jì +7A45=>kāng +7A46=>mù +7A47=>cǎn +7A48=>méi +7A49=>zhì +7A4A=>jì +7A4B=>lù +7A4C=>sū +7A4D=>jī +7A4E=>yǐng +7A4F=>wěn +7A50=>qiū +7A51=>sè +7A52=>hè +7A53=>yì +7A54=>huáng +7A55=>qiè +7A56=>jǐ +7A57=>suì +7A58=>xiāo +7A59=>pú +7A5A=>jiāo +7A5B=>zhuō +7A5C=>zhǒng +7A5D=>zui +7A5E=>lǚ +7A5F=>suì +7A60=>nóng +7A61=>sè +7A62=>huì +7A63=>ráng +7A64=>nuò +7A65=>yù +7A66=>pīn +7A67=>jì +7A68=>tuí +7A69=>wěn +7A6A=>chēng +7A6B=>huò +7A6C=>kuàng +7A6D=>lǚ +7A6E=>biāo +7A6F=>se +7A70=>ráng +7A71=>zhuō +7A72=>lí +7A73=>cuán +7A74=>xué +7A75=>wā +7A76=>jiū +7A77=>qióng +7A78=>xī +7A79=>qióng +7A7A=>kōng +7A7B=>yū +7A7C=>shēn +7A7D=>jǐng +7A7E=>yào +7A7F=>chuān +7A80=>zhūn +7A81=>tū +7A82=>láo +7A83=>qiè +7A84=>zhǎi +7A85=>yǎo +7A86=>biǎn +7A87=>báo +7A88=>yǎo +7A89=>bǐng +7A8A=>wā +7A8B=>zhú +7A8C=>jiào +7A8D=>qiào +7A8E=>diào +7A8F=>wū +7A90=>guī +7A91=>yáo +7A92=>zhì +7A93=>chuāng +7A94=>yào +7A95=>tiǎo +7A96=>jiào +7A97=>chuāng +7A98=>jiǒng +7A99=>xiāo +7A9A=>chéng +7A9B=>kòu +7A9C=>cuàn +7A9D=>wō +7A9E=>dàn +7A9F=>kū +7AA0=>kē +7AA1=>zhuó +7AA2=>xū +7AA3=>sū +7AA4=>guān +7AA5=>kuī +7AA6=>dòu +7AA7=>zhuo +7AA8=>xūn +7AA9=>wō +7AAA=>wā +7AAB=>yà +7AAC=>yú +7AAD=>jù +7AAE=>qióng +7AAF=>yáo +7AB0=>yáo +7AB1=>tiǎo +7AB2=>cháo +7AB3=>yǔ +7AB4=>tián +7AB5=>diào +7AB6=>jù +7AB7=>liào +7AB8=>xī +7AB9=>wù +7ABA=>kuī +7ABB=>chuāng +7ABC=>zhāo +7ABD=>kuan +7ABE=>kuǎn +7ABF=>long +7AC0=>chēng +7AC1=>cuì +7AC2=>piáo +7AC3=>zào +7AC4=>cuàn +7AC5=>qiào +7AC6=>qióng +7AC7=>dòu +7AC8=>zào +7AC9=>lǒng +7ACA=>qiè +7ACB=>lì +7ACC=>chù +7ACD=>shi +7ACE=>fù +7ACF=>qian +7AD0=>chù +7AD1=>hóng +7AD2=>qí +7AD3=>hao +7AD4=>sheng +7AD5=>fen +7AD6=>shù +7AD7=>miào +7AD8=>qǔ +7AD9=>zhàn +7ADA=>zhù +7ADB=>líng +7ADC=>lóng +7ADD=>bìng +7ADE=>jìng +7ADF=>jìng +7AE0=>zhāng +7AE1=>bai +7AE2=>sì +7AE3=>jùn +7AE4=>hóng +7AE5=>tóng +7AE6=>sǒng +7AE7=>jìng +7AE8=>diào +7AE9=>yì +7AEA=>shù +7AEB=>jìng +7AEC=>qǔ +7AED=>jié +7AEE=>pīng +7AEF=>duān +7AF0=>sháo +7AF1=>zhuǎn +7AF2=>céng +7AF3=>dēng +7AF4=>cūn +7AF5=>wāi +7AF6=>jìng +7AF7=>kǎn +7AF8=>jìng +7AF9=>zhú +7AFA=>zhú +7AFB=>lè +7AFC=>péng +7AFD=>yú +7AFE=>chí +7AFF=>gān +7B00=>máng +7B01=>zhú +7B02=>wan +7B03=>dǔ +7B04=>jī +7B05=>xiáo +7B06=>ba +7B07=>suàn +7B08=>jí +7B09=>qǐn +7B0A=>zhào +7B0B=>sǔn +7B0C=>yá +7B0D=>zhuì +7B0E=>yuán +7B0F=>hù +7B10=>háng +7B11=>xiào +7B12=>cén +7B13=>bì +7B14=>bǐ +7B15=>jiǎn +7B16=>yǐ +7B17=>dōng +7B18=>shān +7B19=>shēng +7B1A=>dā +7B1B=>dí +7B1C=>zhú +7B1D=>nà +7B1E=>chī +7B1F=>gū +7B20=>lì +7B21=>qiè +7B22=>mǐn +7B23=>bāo +7B24=>tiáo +7B25=>sì +7B26=>fú +7B27=>cè +7B28=>bèn +7B29=>pèi +7B2A=>dá +7B2B=>zǐ +7B2C=>dì +7B2D=>líng +7B2E=>zé +7B2F=>nú +7B30=>fú +7B31=>gǒu +7B32=>fán +7B33=>jiā +7B34=>gǎn +7B35=>fàn +7B36=>shǐ +7B37=>mǎo +7B38=>pǒ +7B39=>ti +7B3A=>jiān +7B3B=>qióng +7B3C=>lóng +7B3D=>min +7B3E=>biān +7B3F=>luò +7B40=>guì +7B41=>qū +7B42=>chí +7B43=>yīn +7B44=>yào +7B45=>xiǎn +7B46=>bǐ +7B47=>qióng +7B48=>kuò +7B49=>děng +7B4A=>xiáo +7B4B=>jīn +7B4C=>quán +7B4D=>sǔn +7B4E=>rú +7B4F=>fá +7B50=>kuāng +7B51=>zhù +7B52=>tǒng +7B53=>jī +7B54=>dá +7B55=>háng +7B56=>cè +7B57=>zhòng +7B58=>kòu +7B59=>lái +7B5A=>bì +7B5B=>shāi +7B5C=>dāng +7B5D=>zhēng +7B5E=>cè +7B5F=>fū +7B60=>yún +7B61=>tú +7B62=>pá +7B63=>lí +7B64=>láng +7B65=>jǔ +7B66=>guǎn +7B67=>jiǎn +7B68=>hán +7B69=>tóng +7B6A=>xiá +7B6B=>zhì +7B6C=>chéng +7B6D=>suàn +7B6E=>shì +7B6F=>zhù +7B70=>zuó +7B71=>xiǎo +7B72=>shāo +7B73=>tíng +7B74=>cè +7B75=>yán +7B76=>gào +7B77=>kuài +7B78=>gān +7B79=>chóu +7B7A=>kuang +7B7B=>gàng +7B7C=>yún +7B7D=>o +7B7E=>qiān +7B7F=>xiǎo +7B80=>jiǎn +7B81=>póu +7B82=>lái +7B83=>zōu +7B84=>bǐ +7B85=>bì +7B86=>bì +7B87=>gè +7B88=>tái +7B89=>guǎi +7B8A=>yū +7B8B=>jiān +7B8C=>dào +7B8D=>gū +7B8E=>chí +7B8F=>zhēng +7B90=>qìng +7B91=>shà +7B92=>zhǒu +7B93=>lù +7B94=>bó +7B95=>jī +7B96=>lín +7B97=>suàn +7B98=>jùn +7B99=>fú +7B9A=>zhá +7B9B=>gū +7B9C=>kōng +7B9D=>qián +7B9E=>qiān +7B9F=>jùn +7BA0=>chuí +7BA1=>guǎn +7BA2=>yuān +7BA3=>cè +7BA4=>zú +7BA5=>bǒ +7BA6=>zé +7BA7=>qiè +7BA8=>tuò +7BA9=>luó +7BAA=>dān +7BAB=>xiāo +7BAC=>ruò +7BAD=>jiàn +7BAE=>xuān +7BAF=>biān +7BB0=>sǔn +7BB1=>xiāng +7BB2=>xiǎn +7BB3=>píng +7BB4=>zhēn +7BB5=>xīng +7BB6=>hú +7BB7=>yí +7BB8=>zhù +7BB9=>yuē +7BBA=>chūn +7BBB=>lǜ +7BBC=>wū +7BBD=>dǒng +7BBE=>shuò +7BBF=>jí +7BC0=>jié +7BC1=>huáng +7BC2=>xīng +7BC3=>mèi +7BC4=>fàn +7BC5=>chuán +7BC6=>zhuàn +7BC7=>piān +7BC8=>fēng +7BC9=>zhú +7BCA=>huáng +7BCB=>qiè +7BCC=>hóu +7BCD=>qiū +7BCE=>miǎo +7BCF=>qiàn +7BD0=>gu +7BD1=>kuì +7BD2=>shi +7BD3=>lǒu +7BD4=>yún +7BD5=>hé +7BD6=>táng +7BD7=>yuè +7BD8=>chōu +7BD9=>gāo +7BDA=>fěi +7BDB=>ruò +7BDC=>zhēng +7BDD=>gōu +7BDE=>niè +7BDF=>qiàn +7BE0=>xiǎo +7BE1=>cuàn +7BE2=>lǒng +7BE3=>péng +7BE4=>dǔ +7BE5=>lì +7BE6=>bì +7BE7=>zhuó +7BE8=>chú +7BE9=>shāi +7BEA=>chí +7BEB=>zhù +7BEC=>qiāng +7BED=>lóng +7BEE=>lán +7BEF=>jiān +7BF0=>bù +7BF1=>lí +7BF2=>huì +7BF3=>bì +7BF4=>dí +7BF5=>cōng +7BF6=>yān +7BF7=>peng +7BF8=>cǎn +7BF9=>zhuàn +7BFA=>pí +7BFB=>piǎo +7BFC=>dōu +7BFD=>yù +7BFE=>miè +7BFF=>tuán +7C00=>zé +7C01=>shāi +7C02=>guì +7C03=>yí +7C04=>hù +7C05=>chǎn +7C06=>kòu +7C07=>cù +7C08=>píng +7C09=>zào +7C0A=>jī +7C0B=>guǐ +7C0C=>sù +7C0D=>lǒu +7C0E=>cè +7C0F=>lù +7C10=>niǎn +7C11=>suō +7C12=>cuàn +7C13=>diao +7C14=>suō +7C15=>lè +7C16=>duàn +7C17=>liang +7C18=>xiāo +7C19=>bó +7C1A=>mì +7C1B=>shāi +7C1C=>dàng +7C1D=>liáo +7C1E=>dān +7C1F=>diàn +7C20=>fǔ +7C21=>jiǎn +7C22=>mǐn +7C23=>kuì +7C24=>dài +7C25=>jiāo +7C26=>dēng +7C27=>huáng +7C28=>sǔn +7C29=>láo +7C2A=>zān +7C2B=>xiāo +7C2C=>lù +7C2D=>shì +7C2E=>zān +7C2F=>qi +7C30=>pái +7C31=>qi +7C32=>pái +7C33=>gǎn +7C34=>jù +7C35=>dù +7C36=>lù +7C37=>yán +7C38=>bǒ +7C39=>dāng +7C3A=>sài +7C3B=>zhuā +7C3C=>lóng +7C3D=>qiān +7C3E=>lián +7C3F=>bù +7C40=>zhòu +7C41=>lài +7C42=>shi +7C43=>lán +7C44=>kuì +7C45=>yú +7C46=>yuè +7C47=>háo +7C48=>zhēn +7C49=>tái +7C4A=>tì +7C4B=>niè +7C4C=>chóu +7C4D=>jí +7C4E=>yi +7C4F=>qi +7C50=>téng +7C51=>zhuàn +7C52=>zhòu +7C53=>fān +7C54=>sǒu +7C55=>zhòu +7C56=>qian +7C57=>zhuó +7C58=>téng +7C59=>lù +7C5A=>lú +7C5B=>jiǎn +7C5C=>tuò +7C5D=>yíng +7C5E=>yù +7C5F=>lài +7C60=>lóng +7C61=>qie +7C62=>lián +7C63=>lán +7C64=>qiān +7C65=>yuè +7C66=>zhōng +7C67=>qú +7C68=>lián +7C69=>biān +7C6A=>duàn +7C6B=>zuǎn +7C6C=>lí +7C6D=>sī +7C6E=>luó +7C6F=>yíng +7C70=>yuè +7C71=>zhuó +7C72=>yù +7C73=>mǐ +7C74=>dí +7C75=>fán +7C76=>shēn +7C77=>zhé +7C78=>shēn +7C79=>nǚ +7C7A=>hé +7C7B=>lèi +7C7C=>xiān +7C7D=>zǐ +7C7E=>ní +7C7F=>cùn +7C80=>zhang +7C81=>qiān +7C82=>zhai +7C83=>bǐ +7C84=>bǎn +7C85=>wù +7C86=>shā +7C87=>kāng +7C88=>rǒu +7C89=>fěn +7C8A=>bì +7C8B=>cuì +7C8C=>yin +7C8D=>zhé +7C8E=>chǐ +7C8F=>tai +7C90=>hu +7C91=>bā +7C92=>lì +7C93=>gān +7C94=>jù +7C95=>pò +7C96=>mò +7C97=>cū +7C98=>zhān +7C99=>zhòu +7C9A=>lí +7C9B=>sù +7C9C=>tiào +7C9D=>lì +7C9E=>xī +7C9F=>sù +7CA0=>hóng +7CA1=>tóng +7CA2=>zī +7CA3=>cè +7CA4=>yuè +7CA5=>zhōu +7CA6=>lín +7CA7=>zhuāng +7CA8=>bǎi +7CA9=>lao +7CAA=>fèn +7CAB=>ér +7CAC=>qū +7CAD=>he +7CAE=>liáng +7CAF=>xiàn +7CB0=>fú +7CB1=>liáng +7CB2=>càn +7CB3=>jīng +7CB4=>lǐ +7CB5=>yuè +7CB6=>lù +7CB7=>jú +7CB8=>qí +7CB9=>cuì +7CBA=>bài +7CBB=>zhāng +7CBC=>lín +7CBD=>zòng +7CBE=>jīng +7CBF=>guǒ +7CC0=>hua +7CC1=>sǎn +7CC2=>sǎn +7CC3=>táng +7CC4=>biǎn +7CC5=>róu +7CC6=>miàn +7CC7=>hóu +7CC8=>xǔ +7CC9=>zòng +7CCA=>hu +7CCB=>jiàn +7CCC=>zān +7CCD=>cí +7CCE=>lí +7CCF=>xiè +7CD0=>fū +7CD1=>nuò +7CD2=>bèi +7CD3=>gǔ +7CD4=>xiǔ +7CD5=>gāo +7CD6=>táng +7CD7=>qiǔ +7CD8=>jia +7CD9=>cāo +7CDA=>zhuāng +7CDB=>táng +7CDC=>mí +7CDD=>sǎn +7CDE=>fèn +7CDF=>zāo +7CE0=>kāng +7CE1=>jiàng +7CE2=>mó +7CE3=>sǎn +7CE4=>sǎn +7CE5=>nuò +7CE6=>xī +7CE7=>liáng +7CE8=>jiàng +7CE9=>kuài +7CEA=>bò +7CEB=>huán +7CEC=>shu +7CED=>zòng +7CEE=>xiàn +7CEF=>nuò +7CF0=>tuán +7CF1=>niè +7CF2=>lì +7CF3=>zuò +7CF4=>dí +7CF5=>niè +7CF6=>tiào +7CF7=>làn +7CF8=>mì +7CF9=>sī +7CFA=>jiū +7CFB=>xì +7CFC=>gōng +7CFD=>zhěng +7CFE=>jiū +7CFF=>yòu +7D00=>jì +7D01=>chà +7D02=>zhòu +7D03=>xún +7D04=>yuē +7D05=>hóng +7D06=>yū +7D07=>hé +7D08=>wán +7D09=>rèn +7D0A=>wěn +7D0B=>wén +7D0C=>qiú +7D0D=>nà +7D0E=>zī +7D0F=>tǒu +7D10=>niǔ +7D11=>fóu +7D12=>jì +7D13=>shū +7D14=>chún +7D15=>pī +7D16=>zhèn +7D17=>shā +7D18=>hóng +7D19=>zhǐ +7D1A=>jí +7D1B=>fēn +7D1C=>yún +7D1D=>rèn +7D1E=>dǎn +7D1F=>jīn +7D20=>sù +7D21=>fǎng +7D22=>suǒ +7D23=>cuì +7D24=>jiǔ +7D25=>zā +7D26=>ba +7D27=>jǐn +7D28=>fū +7D29=>zhì +7D2A=>cǐ +7D2B=>zǐ +7D2C=>chóu +7D2D=>hóng +7D2E=>zā +7D2F=>lèi +7D30=>xì +7D31=>fú +7D32=>xiè +7D33=>shēn +7D34=>bō +7D35=>zhù +7D36=>qū +7D37=>líng +7D38=>zhù +7D39=>shào +7D3A=>gàn +7D3B=>yǎng +7D3C=>fú +7D3D=>tuó +7D3E=>zhěn +7D3F=>dài +7D40=>chù +7D41=>shī +7D42=>zhōng +7D43=>xián +7D44=>zǔ +7D45=>jiōng +7D46=>bàn +7D47=>qú +7D48=>mò +7D49=>shù +7D4A=>zuì +7D4B=>kuang +7D4C=>jīng +7D4D=>rèn +7D4E=>háng +7D4F=>xiè +7D50=>jié +7D51=>zhū +7D52=>chóu +7D53=>guà +7D54=>bǎi +7D55=>jué +7D56=>kuàng +7D57=>hú +7D58=>cì +7D59=>huán +7D5A=>gēng +7D5B=>tāo +7D5C=>jié +7D5D=>kù +7D5E=>jiǎo +7D5F=>quán +7D60=>gǎi +7D61=>luò +7D62=>xuàn +7D63=>bēng +7D64=>xiàn +7D65=>fú +7D66=>gěi +7D67=>dòng +7D68=>róng +7D69=>tiào +7D6A=>yīn +7D6B=>lěi +7D6C=>xiè +7D6D=>juàn +7D6E=>xù +7D6F=>gāi +7D70=>dié +7D71=>tǒng +7D72=>sī +7D73=>jiàng +7D74=>xiáng +7D75=>huì +7D76=>jué +7D77=>zhí +7D78=>jiǎn +7D79=>juàn +7D7A=>chī +7D7B=>miǎn +7D7C=>zhěn +7D7D=>lǚ +7D7E=>chéng +7D7F=>qiú +7D80=>shū +7D81=>bǎng +7D82=>tǒng +7D83=>xiāo +7D84=>huán +7D85=>qīn +7D86=>gěng +7D87=>xiǔ +7D88=>tí +7D89=>tòu +7D8A=>xié +7D8B=>hóng +7D8C=>xì +7D8D=>fú +7D8E=>tīng +7D8F=>suī +7D90=>duì +7D91=>kǔn +7D92=>fū +7D93=>jīng +7D94=>hù +7D95=>zhī +7D96=>yán +7D97=>jiǒng +7D98=>féng +7D99=>jì +7D9A=>xu +7D9B=>ren +7D9C=>zōng +7D9D=>chēn +7D9E=>duǒ +7D9F=>lì +7DA0=>lǜ +7DA1=>liáng +7DA2=>chóu +7DA3=>quǎn +7DA4=>shào +7DA5=>qí +7DA6=>qí +7DA7=>zhǔn +7DA8=>qí +7DA9=>wǎn +7DAA=>qiàn +7DAB=>xiàn +7DAC=>shòu +7DAD=>wéi +7DAE=>qǐ +7DAF=>táo +7DB0=>wǎn +7DB1=>gāng +7DB2=>wǎng +7DB3=>bēng +7DB4=>zhui +7DB5=>cǎi +7DB6=>guǒ +7DB7=>cuì +7DB8=>lún +7DB9=>liǔ +7DBA=>qǐ +7DBB=>zhàn +7DBC=>bì +7DBD=>chuò +7DBE=>líng +7DBF=>mián +7DC0=>qī +7DC1=>qiè +7DC2=>tián +7DC3=>zōng +7DC4=>gǔn +7DC5=>zōu +7DC6=>xī +7DC7=>zī +7DC8=>xìng +7DC9=>liǎng +7DCA=>jǐn +7DCB=>fēi +7DCC=>ruí +7DCD=>mín +7DCE=>yù +7DCF=>zǒng +7DD0=>fán +7DD1=>lǜ +7DD2=>xù +7DD3=>yīng +7DD4=>shàng +7DD5=>qi +7DD6=>xù +7DD7=>xiāng +7DD8=>jiān +7DD9=>kè +7DDA=>xiàn +7DDB=>ruǎn +7DDC=>mián +7DDD=>jī +7DDE=>duàn +7DDF=>chóng +7DE0=>dì +7DE1=>mín +7DE2=>miáo +7DE3=>yuán +7DE4=>xiè +7DE5=>bǎo +7DE6=>sī +7DE7=>qiū +7DE8=>biān +7DE9=>huǎn +7DEA=>gēng +7DEB=>cōng +7DEC=>miǎn +7DED=>wèi +7DEE=>fù +7DEF=>wěi +7DF0=>tóu +7DF1=>gōu +7DF2=>miǎo +7DF3=>xié +7DF4=>liàn +7DF5=>zōng +7DF6=>biàn +7DF7=>yùn +7DF8=>yīn +7DF9=>tí +7DFA=>guā +7DFB=>zhì +7DFC=>yùn +7DFD=>chēng +7DFE=>chán +7DFF=>dài +7E00=>xiá +7E01=>yuán +7E02=>zǒng +7E03=>xū +7E04=>ying +7E05=>wei +7E06=>gēng +7E07=>xuān +7E08=>yíng +7E09=>jìn +7E0A=>yì +7E0B=>zhuì +7E0C=>nì +7E0D=>bāng +7E0E=>gǔ +7E0F=>pán +7E10=>zhòu +7E11=>jiān +7E12=>cī +7E13=>quán +7E14=>shuǎng +7E15=>yūn +7E16=>xiá +7E17=>cuī +7E18=>xī +7E19=>róng +7E1A=>tāo +7E1B=>fù +7E1C=>yún +7E1D=>chēn +7E1E=>gǎo +7E1F=>rù +7E20=>hú +7E21=>zài +7E22=>téng +7E23=>xiàn +7E24=>sù +7E25=>zhěn +7E26=>zòng +7E27=>tāo +7E28=>huang +7E29=>cài +7E2A=>bì +7E2B=>fèng +7E2C=>cù +7E2D=>lí +7E2E=>suō +7E2F=>yǎn +7E30=>xǐ +7E31=>zòng +7E32=>léi +7E33=>juàn +7E34=>qiàn +7E35=>màn +7E36=>zhí +7E37=>lǚ +7E38=>mù +7E39=>piǎo +7E3A=>lián +7E3B=>mí +7E3C=>xuàn +7E3D=>zǒng +7E3E=>jī +7E3F=>shān +7E40=>suì +7E41=>fán +7E42=>lǜ +7E43=>běng +7E44=>yī +7E45=>sāo +7E46=>móu +7E47=>yáo +7E48=>qiǎng +7E49=>hún +7E4A=>xian +7E4B=>jì +7E4C=>sha +7E4D=>xiù +7E4E=>rán +7E4F=>xuàn +7E50=>suì +7E51=>qiāo +7E52=>zēng +7E53=>zuǒ +7E54=>zhī +7E55=>shàn +7E56=>sǎn +7E57=>lín +7E58=>yù +7E59=>fān +7E5A=>liáo +7E5B=>chuò +7E5C=>zūn +7E5D=>jiàn +7E5E=>rào +7E5F=>chǎn +7E60=>ruǐ +7E61=>xiù +7E62=>huì +7E63=>huà +7E64=>zuǎn +7E65=>xī +7E66=>qiǎng +7E67=>yun +7E68=>da +7E69=>shéng +7E6A=>huì +7E6B=>xì +7E6C=>sè +7E6D=>jiǎn +7E6E=>jiāng +7E6F=>huán +7E70=>zǎo +7E71=>cōng +7E72=>xiè +7E73=>jiǎo +7E74=>bì +7E75=>dàn +7E76=>yì +7E77=>nǒng +7E78=>suì +7E79=>yì +7E7A=>shǎi +7E7B=>xū +7E7C=>jì +7E7D=>bīn +7E7E=>qiǎn +7E7F=>lán +7E80=>pú +7E81=>xūn +7E82=>zuǎn +7E83=>qí +7E84=>péng +7E85=>yào +7E86=>mò +7E87=>lèi +7E88=>xié +7E89=>zuǎn +7E8A=>kuàng +7E8B=>yōu +7E8C=>xù +7E8D=>léi +7E8E=>xiān +7E8F=>chán +7E90=>jiao +7E91=>lú +7E92=>chán +7E93=>yīng +7E94=>cái +7E95=>rǎng +7E96=>xiān +7E97=>zuī +7E98=>zuǎn +7E99=>luò +7E9A=>lí +7E9B=>dào +7E9C=>lǎn +7E9D=>léi +7E9E=>liàn +7E9F=>sī +7EA0=>jiū +7EA1=>yū +7EA2=>hóng +7EA3=>zhòu +7EA4=>xiān +7EA5=>gē +7EA6=>yuē +7EA7=>jí +7EA8=>wán +7EA9=>kuàng +7EAA=>jì +7EAB=>rèn +7EAC=>wěi +7EAD=>yún +7EAE=>hóng +7EAF=>chún +7EB0=>pī +7EB1=>shā +7EB2=>gāng +7EB3=>nà +7EB4=>rèn +7EB5=>zòng +7EB6=>lún +7EB7=>fēn +7EB8=>zhǐ +7EB9=>wén +7EBA=>fǎng +7EBB=>zhù +7EBC=>zhèn +7EBD=>niǔ +7EBE=>shū +7EBF=>xiàn +7EC0=>gàn +7EC1=>xiè +7EC2=>fú +7EC3=>liàn +7EC4=>zǔ +7EC5=>shēn +7EC6=>xì +7EC7=>zhī +7EC8=>zhōng +7EC9=>zhòu +7ECA=>bàn +7ECB=>fú +7ECC=>chù +7ECD=>shào +7ECE=>yì +7ECF=>jīng +7ED0=>dài +7ED1=>bǎng +7ED2=>róng +7ED3=>jié +7ED4=>kù +7ED5=>rào +7ED6=>dié +7ED7=>háng +7ED8=>huì +7ED9=>gěi +7EDA=>xuàn +7EDB=>jiàng +7EDC=>luò +7EDD=>jué +7EDE=>jiǎo +7EDF=>tǒng +7EE0=>gěng +7EE1=>xiāo +7EE2=>juàn +7EE3=>xiù +7EE4=>xì +7EE5=>suí +7EE6=>tāo +7EE7=>jì +7EE8=>tí +7EE9=>jī +7EEA=>xù +7EEB=>líng +7EEC=>yīng +7EED=>xù +7EEE=>qǐ +7EEF=>fēi +7EF0=>chuò +7EF1=>shàng +7EF2=>gǔn +7EF3=>shéng +7EF4=>wéi +7EF5=>mián +7EF6=>shòu +7EF7=>běng +7EF8=>chóu +7EF9=>táo +7EFA=>liǔ +7EFB=>quǎn +7EFC=>zōng +7EFD=>zhàn +7EFE=>wǎn +7EFF=>lǜ +7F00=>zhui +7F01=>zī +7F02=>kè +7F03=>xiāng +7F04=>jiān +7F05=>miǎn +7F06=>lǎn +7F07=>tí +7F08=>miǎo +7F09=>jī +7F0A=>yūn +7F0B=>huì +7F0C=>sī +7F0D=>duǒ +7F0E=>duàn +7F0F=>biàn +7F10=>xiàn +7F11=>gōu +7F12=>zhuì +7F13=>huǎn +7F14=>dì +7F15=>lǚ +7F16=>biān +7F17=>mín +7F18=>yuán +7F19=>jìn +7F1A=>fù +7F1B=>rù +7F1C=>zhěn +7F1D=>fèng +7F1E=>cuī +7F1F=>gǎo +7F20=>chán +7F21=>lí +7F22=>yì +7F23=>jiān +7F24=>bīn +7F25=>piāo +7F26=>màn +7F27=>léi +7F28=>yīng +7F29=>suō +7F2A=>móu +7F2B=>sāo +7F2C=>xié +7F2D=>liáo +7F2E=>shàn +7F2F=>zēng +7F30=>jiāng +7F31=>qiǎn +7F32=>qiāo +7F33=>huán +7F34=>jiǎo +7F35=>zuǎn +7F36=>fǒu +7F37=>xiè +7F38=>gāng +7F39=>fǒu +7F3A=>quē +7F3B=>fǒu +7F3C=>qi +7F3D=>bō +7F3E=>píng +7F3F=>xiàng +7F40=>zhao +7F41=>gāng +7F42=>yīng +7F43=>yīng +7F44=>qìng +7F45=>xià +7F46=>guàn +7F47=>zūn +7F48=>tán +7F49=>cang +7F4A=>qì +7F4B=>wèng +7F4C=>yīng +7F4D=>léi +7F4E=>tán +7F4F=>lú +7F50=>guàn +7F51=>wǎng +7F52=>wǎng +7F53=>gāng +7F54=>wǎng +7F55=>hǎn +7F56=>luó +7F57=>luō +7F58=>fú +7F59=>mí +7F5A=>fá +7F5B=>gū +7F5C=>zhǔ +7F5D=>jū +7F5E=>máo +7F5F=>gǔ +7F60=>mín +7F61=>gāng +7F62=>ba +7F63=>guà +7F64=>tí +7F65=>juàn +7F66=>fú +7F67=>shèn +7F68=>yǎn +7F69=>zhào +7F6A=>zuì +7F6B=>guà +7F6C=>zhuó +7F6D=>yù +7F6E=>zhì +7F6F=>ǎn +7F70=>fá +7F71=>lǎn +7F72=>shǔ +7F73=>sī +7F74=>pí +7F75=>mà +7F76=>liǔ +7F77=>ba +7F78=>fá +7F79=>lí +7F7A=>cháo +7F7B=>wèi +7F7C=>bì +7F7D=>jì +7F7E=>zēng +7F7F=>chōng +7F80=>liǔ +7F81=>jī +7F82=>juàn +7F83=>mì +7F84=>zhào +7F85=>luó +7F86=>pí +7F87=>jī +7F88=>jī +7F89=>luán +7F8A=>yáng +7F8B=>mǐ +7F8C=>qiāng +7F8D=>dá +7F8E=>měi +7F8F=>yáng +7F90=>yǒu +7F91=>yǒu +7F92=>fén +7F93=>bā +7F94=>gāo +7F95=>yàng +7F96=>gǔ +7F97=>qiāng +7F98=>zāng +7F99=>gāo +7F9A=>líng +7F9B=>yì +7F9C=>zhù +7F9D=>dī +7F9E=>xiū +7F9F=>qiǎng +7FA0=>yí +7FA1=>xiàn +7FA2=>róng +7FA3=>qún +7FA4=>qún +7FA5=>qiǎng +7FA6=>huán +7FA7=>suō +7FA8=>xiàn +7FA9=>yì +7FAA=>yang +7FAB=>qiāng +7FAC=>qián +7FAD=>yú +7FAE=>gēng +7FAF=>jié +7FB0=>tāng +7FB1=>yuán +7FB2=>xī +7FB3=>fán +7FB4=>shān +7FB5=>fén +7FB6=>shān +7FB7=>liǎn +7FB8=>léi +7FB9=>gēng +7FBA=>nóu +7FBB=>qiàng +7FBC=>chàn +7FBD=>yǔ +7FBE=>gòng +7FBF=>yì +7FC0=>chōng +7FC1=>wēng +7FC2=>fēn +7FC3=>hóng +7FC4=>chì +7FC5=>chì +7FC6=>cuì +7FC7=>fú +7FC8=>xiá +7FC9=>běn +7FCA=>yì +7FCB=>lā +7FCC=>yì +7FCD=>pī +7FCE=>líng +7FCF=>liù +7FD0=>zhì +7FD1=>qú +7FD2=>xí +7FD3=>xié +7FD4=>xiáng +7FD5=>xī +7FD6=>xì +7FD7=>ké +7FD8=>qiào +7FD9=>huì +7FDA=>huī +7FDB=>xiāo +7FDC=>shà +7FDD=>hóng +7FDE=>jiāng +7FDF=>dí +7FE0=>cuì +7FE1=>fěi +7FE2=>dào +7FE3=>shà +7FE4=>chì +7FE5=>zhù +7FE6=>jiǎn +7FE7=>xuān +7FE8=>chì +7FE9=>piān +7FEA=>zōng +7FEB=>wán +7FEC=>huī +7FED=>hóu +7FEE=>hé +7FEF=>hè +7FF0=>hàn +7FF1=>áo +7FF2=>piāo +7FF3=>yì +7FF4=>lián +7FF5=>hóu +7FF6=>ao +7FF7=>lín +7FF8=>pěn +7FF9=>qiào +7FFA=>áo +7FFB=>fān +7FFC=>yì +7FFD=>huì +7FFE=>xuān +7FFF=>dào +8000=>yào +8001=>lǎo +8002=>lǎo +8003=>kǎo +8004=>mào +8005=>zhě +8006=>qí +8007=>gǒu +8008=>gǒu +8009=>gǒu +800A=>diè +800B=>dié +800C=>ér +800D=>shuǎ +800E=>ruǎn +800F=>nài +8010=>nài +8011=>duān +8012=>lěi +8013=>tīng +8014=>zǐ +8015=>gēng +8016=>chào +8017=>hào +8018=>yún +8019=>bà +801A=>pī +801B=>yí +801C=>sì +801D=>qù +801E=>jiā +801F=>jù +8020=>huō +8021=>chú +8022=>lào +8023=>lǔn +8024=>jí +8025=>tāng +8026=>ǒu +8027=>lóu +8028=>nòu +8029=>jiǎng +802A=>pǎng +802B=>zhá +802C=>lóu +802D=>jī +802E=>lào +802F=>huò +8030=>yōu +8031=>mò +8032=>huái +8033=>ěr +8034=>yì +8035=>dīng +8036=>yé +8037=>dā +8038=>sǒng +8039=>qín +803A=>yún +803B=>chǐ +803C=>dān +803D=>dān +803E=>hóng +803F=>gěng +8040=>zhí +8041=>pàn +8042=>niè +8043=>dān +8044=>zhěn +8045=>chè +8046=>líng +8047=>zhēng +8048=>yǒu +8049=>wà +804A=>liáo +804B=>lóng +804C=>zhí +804D=>níng +804E=>tiāo +804F=>ér +8050=>yà +8051=>tiē +8052=>guā +8053=>xu +8054=>lián +8055=>hào +8056=>shèng +8057=>liè +8058=>pìn +8059=>jīng +805A=>jù +805B=>bǐ +805C=>dǐ +805D=>guó +805E=>wén +805F=>xù +8060=>pīng +8061=>cōng +8062=>ding +8063=>ní +8064=>tíng +8065=>jǔ +8066=>cōng +8067=>kuī +8068=>lian +8069=>kuì +806A=>cōng +806B=>lián +806C=>wěng +806D=>kuì +806E=>lián +806F=>lián +8070=>cōng +8071=>áo +8072=>shēng +8073=>sǒng +8074=>tīng +8075=>kuì +8076=>niè +8077=>zhí +8078=>dān +8079=>níng +807A=>qié +807B=>nǐ +807C=>tīng +807D=>tīng +807E=>lóng +807F=>yù +8080=>yù +8081=>zhào +8082=>sì +8083=>sù +8084=>yì +8085=>sù +8086=>sì +8087=>zhào +8088=>zhào +8089=>ròu +808A=>yì +808B=>lē +808C=>jī +808D=>qiú +808E=>kěn +808F=>cào +8090=>gē +8091=>bó +8092=>huàn +8093=>huāng +8094=>yǐ +8095=>rèn +8096=>xiào +8097=>rǔ +8098=>zhǒu +8099=>yuàn +809A=>dù +809B=>gāng +809C=>róng +809D=>gān +809E=>chā +809F=>wò +80A0=>cháng +80A1=>gǔ +80A2=>zhī +80A3=>hán +80A4=>fū +80A5=>féi +80A6=>fén +80A7=>pēi +80A8=>pàng +80A9=>jiān +80AA=>fáng +80AB=>zhūn +80AC=>yóu +80AD=>nà +80AE=>āng +80AF=>kěn +80B0=>rán +80B1=>gōng +80B2=>yù +80B3=>wěn +80B4=>yáo +80B5=>qí +80B6=>pí +80B7=>qiǎn +80B8=>xī +80B9=>xī +80BA=>fèi +80BB=>kěn +80BC=>jǐng +80BD=>tài +80BE=>shèn +80BF=>zhǒng +80C0=>zhàng +80C1=>xié +80C2=>shèn +80C3=>wèi +80C4=>zhòu +80C5=>dié +80C6=>dǎn +80C7=>fèi +80C8=>bá +80C9=>bó +80CA=>qú +80CB=>tián +80CC=>bèi +80CD=>guā +80CE=>tāi +80CF=>zǐ +80D0=>kū +80D1=>zhī +80D2=>nì +80D3=>píng +80D4=>zì +80D5=>fǔ +80D6=>pàng +80D7=>zhēn +80D8=>xián +80D9=>zuò +80DA=>pēi +80DB=>jiǎ +80DC=>shèng +80DD=>zhī +80DE=>bāo +80DF=>mǔ +80E0=>qū +80E1=>hú +80E2=>kē +80E3=>chǐ +80E4=>yìn +80E5=>xū +80E6=>yāng +80E7=>lóng +80E8=>dòng +80E9=>kǎ +80EA=>lú +80EB=>jìng +80EC=>nǔ +80ED=>yān +80EE=>pāng +80EF=>kuà +80F0=>yí +80F1=>guāng +80F2=>hǎi +80F3=>gē +80F4=>dòng +80F5=>chī +80F6=>jiāo +80F7=>xiōng +80F8=>xiōng +80F9=>ér +80FA=>àn +80FB=>héng +80FC=>pián +80FD=>néng +80FE=>zì +80FF=>guī +8100=>chéng +8101=>tiǎo +8102=>zhī +8103=>cuì +8104=>méi +8105=>xié +8106=>cuì +8107=>xié +8108=>mài +8109=>mài +810A=>jí +810B=>xie +810C=>nin +810D=>kuài +810E=>sà +810F=>zàng +8110=>qí +8111=>nǎo +8112=>mǐ +8113=>nóng +8114=>luán +8115=>wàn +8116=>bó +8117=>wěn +8118=>wǎn +8119=>xiū +811A=>jiǎo +811B=>jìng +811C=>yǒu +811D=>hēng +811E=>cuǒ +811F=>liè +8120=>shān +8121=>tǐng +8122=>méi +8123=>chún +8124=>shèn +8125=>qiǎn +8126=>de +8127=>juān +8128=>cù +8129=>xiū +812A=>xìn +812B=>tuō +812C=>pāo +812D=>chéng +812E=>něi +812F=>pú +8130=>dòu +8131=>tuō +8132=>niào +8133=>nao +8134=>pǐ +8135=>gǔ +8136=>luó +8137=>lì +8138=>liǎn +8139=>zhàng +813A=>cuì +813B=>jiē +813C=>liǎng +813D=>shuí +813E=>pí +813F=>biāo +8140=>lún +8141=>pián +8142=>lěi +8143=>kuì +8144=>chuí +8145=>dàn +8146=>tiǎn +8147=>něi +8148=>jīng +8149=>nái +814A=>là +814B=>yè +814C=>yān +814D=>rèn +814E=>shèn +814F=>chuò +8150=>fǔ +8151=>fǔ +8152=>jū +8153=>féi +8154=>qiāng +8155=>wàn +8156=>dòng +8157=>pí +8158=>guó +8159=>zōng +815A=>dìng +815B=>wò +815C=>měi +815D=>ní +815E=>zhuàn +815F=>chì +8160=>còu +8161=>luó +8162=>ǒu +8163=>dì +8164=>ān +8165=>xīng +8166=>nǎo +8167=>shù +8168=>shuàn +8169=>nǎn +816A=>yùn +816B=>zhǒng +816C=>ròu +816D=>è +816E=>sāi +816F=>tú +8170=>yāo +8171=>jiàn +8172=>wěi +8173=>jiǎo +8174=>yú +8175=>jiā +8176=>duàn +8177=>bì +8178=>cháng +8179=>fù +817A=>xiàn +817B=>nì +817C=>miǎn +817D=>wà +817E=>téng +817F=>tuǐ +8180=>bǎng +8181=>qiǎn +8182=>lǚ +8183=>wà +8184=>sòu +8185=>táng +8186=>sù +8187=>zhuì +8188=>gé +8189=>yì +818A=>bo +818B=>liáo +818C=>jí +818D=>pí +818E=>xié +818F=>gāo +8190=>lǚ +8191=>bìn +8192=>óu +8193=>cháng +8194=>lù +8195=>guó +8196=>pāng +8197=>chuái +8198=>biāo +8199=>jiǎng +819A=>fū +819B=>táng +819C=>mó +819D=>xī +819E=>zhuān +819F=>lǜ +81A0=>jiāo +81A1=>yìng +81A2=>lǘ +81A3=>zhì +81A4=>xue +81A5=>chūn +81A6=>lìn +81A7=>tóng +81A8=>péng +81A9=>nì +81AA=>chuài +81AB=>liáo +81AC=>cuì +81AD=>guī +81AE=>xiāo +81AF=>tēng +81B0=>fán +81B1=>zhí +81B2=>jiāo +81B3=>shàn +81B4=>hū +81B5=>cuì +81B6=>rùn +81B7=>xiāng +81B8=>suǐ +81B9=>fèn +81BA=>yīng +81BB=>shān +81BC=>zhuā +81BD=>dǎn +81BE=>kuài +81BF=>nóng +81C0=>tún +81C1=>lián +81C2=>bì +81C3=>yōng +81C4=>jué +81C5=>chù +81C6=>yì +81C7=>juǎn +81C8=>là +81C9=>liǎn +81CA=>sāo +81CB=>tún +81CC=>gǔ +81CD=>qí +81CE=>cuì +81CF=>bìn +81D0=>xūn +81D1=>nào +81D2=>wò +81D3=>zàng +81D4=>xiàn +81D5=>biāo +81D6=>xìng +81D7=>kuān +81D8=>là +81D9=>yān +81DA=>lú +81DB=>huò +81DC=>zā +81DD=>luǒ +81DE=>qú +81DF=>zàng +81E0=>luán +81E1=>ní +81E2=>zā +81E3=>chén +81E4=>qiān +81E5=>wò +81E6=>guàng +81E7=>zāng +81E8=>lín +81E9=>guǎng +81EA=>zì +81EB=>jiǎo +81EC=>niè +81ED=>chòu +81EE=>jì +81EF=>gāo +81F0=>chòu +81F1=>mián +81F2=>niè +81F3=>zhì +81F4=>zhì +81F5=>gé +81F6=>jiàn +81F7=>dié +81F8=>zhī +81F9=>xiū +81FA=>tái +81FB=>zhēn +81FC=>jiù +81FD=>xiàn +81FE=>yú +81FF=>chā +8200=>yǎo +8201=>yú +8202=>chōng +8203=>xì +8204=>xì +8205=>jiù +8206=>yú +8207=>yǔ +8208=>xìng +8209=>jǔ +820A=>jiù +820B=>xìn +820C=>shé +820D=>shě +820E=>she +820F=>jiǔ +8210=>shì +8211=>tān +8212=>shū +8213=>shì +8214=>tiǎn +8215=>tàn +8216=>pù +8217=>pù +8218=>guǎn +8219=>huà +821A=>tiàn +821B=>chuǎn +821C=>shùn +821D=>xiá +821E=>wǔ +821F=>zhōu +8220=>dāo +8221=>chuán +8222=>shān +8223=>yǐ +8224=>fan +8225=>pā +8226=>tài +8227=>fán +8228=>bǎn +8229=>chuán +822A=>háng +822B=>fǎng +822C=>bān +822D=>bǐ +822E=>lu +822F=>zhōng +8230=>jiàn +8231=>cāng +8232=>líng +8233=>zhú +8234=>zé +8235=>duò +8236=>bó +8237=>xián +8238=>gě +8239=>chuán +823A=>xiá +823B=>lú +823C=>qióng +823D=>páng +823E=>xī +823F=>kua +8240=>fú +8241=>zào +8242=>féng +8243=>lí +8244=>shāo +8245=>yú +8246=>láng +8247=>tǐng +8248=>yù +8249=>wěi +824A=>bó +824B=>měng +824C=>niàn +824D=>jū +824E=>huáng +824F=>shǒu +8250=>kè +8251=>biàn +8252=>mù +8253=>dié +8254=>dou +8255=>bàng +8256=>chā +8257=>yì +8258=>sōu +8259=>cāng +825A=>cáo +825B=>lóu +825C=>dài +825D=>xue +825E=>yào +825F=>chōng +8260=>deng +8261=>dāng +8262=>qiáng +8263=>lǔ +8264=>yǐ +8265=>jí +8266=>jiàn +8267=>huò +8268=>méng +8269=>qí +826A=>lǔ +826B=>lú +826C=>chán +826D=>shuāng +826E=>gěn +826F=>liáng +8270=>jiān +8271=>jiān +8272=>sè +8273=>yàn +8274=>fú +8275=>pīng +8276=>yàn +8277=>yàn +8278=>cǎo +8279=>cao +827A=>yì +827B=>lè +827C=>tīng +827D=>jiāo +827E=>ài +827F=>nǎi +8280=>tiáo +8281=>jiāo +8282=>jié +8283=>péng +8284=>wán +8285=>yì +8286=>chāi +8287=>mián +8288=>mǐ +8289=>gān +828A=>qiān +828B=>yù +828C=>yù +828D=>sháo +828E=>qiōng +828F=>dù +8290=>hù +8291=>qǐ +8292=>máng +8293=>zì +8294=>huì +8295=>suī +8296=>zhì +8297=>xiāng +8298=>pí +8299=>fú +829A=>tún +829B=>wěi +829C=>wú +829D=>zhī +829E=>qì +829F=>shān +82A0=>wén +82A1=>qiàn +82A2=>rén +82A3=>fú +82A4=>kōu +82A5=>jiè +82A6=>lú +82A7=>xù +82A8=>jī +82A9=>qín +82AA=>qí +82AB=>yán +82AC=>fēn +82AD=>bā +82AE=>ruì +82AF=>xīn +82B0=>jì +82B1=>huā +82B2=>huā +82B3=>fāng +82B4=>wù +82B5=>jué +82B6=>gǒu +82B7=>zhǐ +82B8=>yún +82B9=>qín +82BA=>ǎo +82BB=>chú +82BC=>mào +82BD=>yá +82BE=>fèi +82BF=>rèng +82C0=>háng +82C1=>cōng +82C2=>yín +82C3=>yǒu +82C4=>biàn +82C5=>yì +82C6=>qie +82C7=>wěi +82C8=>lì +82C9=>pǐ +82CA=>è +82CB=>xiàn +82CC=>cháng +82CD=>cāng +82CE=>zhù +82CF=>sū +82D0=>tí +82D1=>yuàn +82D2=>rǎn +82D3=>líng +82D4=>tái +82D5=>sháo +82D6=>dí +82D7=>miáo +82D8=>qǐng +82D9=>lì +82DA=>yòng +82DB=>kē +82DC=>mù +82DD=>bèi +82DE=>bāo +82DF=>gǒu +82E0=>mín +82E1=>yǐ +82E2=>yǐ +82E3=>jù +82E4=>piě +82E5=>ruò +82E6=>kǔ +82E7=>níng +82E8=>nǐ +82E9=>bó +82EA=>bǐng +82EB=>shān +82EC=>xiú +82ED=>yǎo +82EE=>xiān +82EF=>běn +82F0=>hóng +82F1=>yīng +82F2=>zhǎ +82F3=>dōng +82F4=>jū +82F5=>dié +82F6=>nié +82F7=>gān +82F8=>hū +82F9=>píng +82FA=>méi +82FB=>fú +82FC=>shēng +82FD=>gū +82FE=>bì +82FF=>wèi +8300=>fú +8301=>zhuó +8302=>mào +8303=>fàn +8304=>jiā +8305=>máo +8306=>máo +8307=>bá +8308=>cí +8309=>mò +830A=>zī +830B=>dǐ +830C=>chí +830D=>jì +830E=>jīng +830F=>lóng +8310=>cong +8311=>niǎo +8312=>yuán +8313=>xué +8314=>yíng +8315=>qióng +8316=>gé +8317=>míng +8318=>lì +8319=>róng +831A=>yìn +831B=>gèn +831C=>qiàn +831D=>chǎi +831E=>chén +831F=>yù +8320=>hāo +8321=>zì +8322=>liè +8323=>wú +8324=>jì +8325=>guī +8326=>cì +8327=>jiǎn +8328=>cí +8329=>gòu +832A=>guāng +832B=>máng +832C=>chá +832D=>jiāo +832E=>jiāo +832F=>fú +8330=>yú +8331=>zhū +8332=>zī +8333=>jiāng +8334=>huí +8335=>yīn +8336=>chá +8337=>fá +8338=>rōng +8339=>rú +833A=>chōng +833B=>mǎng +833C=>tóng +833D=>zhòng +833E=>qiān +833F=>zhú +8340=>xún +8341=>huán +8342=>fū +8343=>quán +8344=>gāi +8345=>dā +8346=>jīng +8347=>xìng +8348=>chuǎn +8349=>cǎo +834A=>jīng +834B=>ér +834C=>àn +834D=>qiáo +834E=>chí +834F=>rěn +8350=>jiàn +8351=>tí +8352=>huāng +8353=>píng +8354=>lì +8355=>jīn +8356=>lǎo +8357=>shù +8358=>zhuāng +8359=>dá +835A=>jiá +835B=>ráo +835C=>bì +835D=>zé +835E=>qiáo +835F=>huì +8360=>jì +8361=>dàng +8362=>yu +8363=>róng +8364=>hūn +8365=>xíng +8366=>luò +8367=>yíng +8368=>xún +8369=>jìn +836A=>sūn +836B=>yīn +836C=>mǎi +836D=>hóng +836E=>zhòu +836F=>yào +8370=>dù +8371=>wěi +8372=>lí +8373=>dòu +8374=>fū +8375=>rěn +8376=>yín +8377=>hé +8378=>bí +8379=>bù +837A=>yǔn +837B=>dí +837C=>tú +837D=>suī +837E=>suī +837F=>chéng +8380=>chén +8381=>wú +8382=>bié +8383=>xī +8384=>gěng +8385=>lì +8386=>pú +8387=>zhù +8388=>mò +8389=>lì +838A=>zhuāng +838B=>zuó +838C=>tuō +838D=>qiú +838E=>shā +838F=>suō +8390=>chén +8391=>péng +8392=>jǔ +8393=>méi +8394=>méng +8395=>xìng +8396=>jīng +8397=>chē +8398=>shēn +8399=>jūn +839A=>yán +839B=>tíng +839C=>yóu +839D=>cuò +839E=>guǎn +839F=>hàn +83A0=>yǒu +83A1=>cuò +83A2=>jiá +83A3=>wáng +83A4=>sù +83A5=>niǔ +83A6=>shāo +83A7=>xiàn +83A8=>làng +83A9=>fú +83AA=>é +83AB=>mò +83AC=>wèn +83AD=>jié +83AE=>nán +83AF=>mù +83B0=>kǎn +83B1=>lái +83B2=>lián +83B3=>shí +83B4=>wō +83B5=>tu +83B6=>xiān +83B7=>huò +83B8=>yóu +83B9=>yíng +83BA=>yīng +83BB=>gòng +83BC=>chún +83BD=>mǎng +83BE=>mǎng +83BF=>cì +83C0=>wǎn +83C1=>jīng +83C2=>dì +83C3=>qú +83C4=>dōng +83C5=>jiān +83C6=>zōu +83C7=>gu +83C8=>lā +83C9=>lù +83CA=>jú +83CB=>wèi +83CC=>jūn +83CD=>niè +83CE=>kūn +83CF=>hé +83D0=>pú +83D1=>zāi +83D2=>gǎo +83D3=>guǒ +83D4=>fú +83D5=>lún +83D6=>chāng +83D7=>chóu +83D8=>sōng +83D9=>chuí +83DA=>zhàn +83DB=>mén +83DC=>cài +83DD=>bá +83DE=>lí +83DF=>tú +83E0=>bō +83E1=>hàn +83E2=>bào +83E3=>qìn +83E4=>juǎn +83E5=>xī +83E6=>qín +83E7=>dǐ +83E8=>jiē +83E9=>pú +83EA=>dàng +83EB=>jǐn +83EC=>qiáo +83ED=>tái +83EE=>gēng +83EF=>huá +83F0=>gū +83F1=>líng +83F2=>fēi +83F3=>qín +83F4=>ān +83F5=>wǎng +83F6=>běng +83F7=>zhǒu +83F8=>yān +83F9=>jū +83FA=>jiān +83FB=>lǐn +83FC=>tǎn +83FD=>shū +83FE=>tián +83FF=>dào +8400=>hǔ +8401=>qí +8402=>hé +8403=>cuì +8404=>táo +8405=>chūn +8406=>bì +8407=>cháng +8408=>huán +8409=>fèi +840A=>lái +840B=>qī +840C=>méng +840D=>píng +840E=>wēi +840F=>dàn +8410=>shà +8411=>huán +8412=>yǎn +8413=>yí +8414=>tiáo +8415=>qí +8416=>wǎn +8417=>cè +8418=>nài +8419=>zhen +841A=>tuò +841B=>jiū +841C=>tiē +841D=>luó +841E=>bi +841F=>yi +8420=>méng +8421=>bo +8422=>pao +8423=>ding +8424=>yíng +8425=>yíng +8426=>yíng +8427=>xiāo +8428=>sà +8429=>qiū +842A=>kē +842B=>xiàng +842C=>wàn +842D=>yǔ +842E=>yú +842F=>fù +8430=>liàn +8431=>xuān +8432=>xuān +8433=>nǎn +8434=>cè +8435=>wō +8436=>chǔn +8437=>xiāo +8438=>yú +8439=>biǎn +843A=>mào +843B=>ān +843C=>è +843D=>luò +843E=>yíng +843F=>kuò +8440=>kuò +8441=>jiāng +8442=>miǎn +8443=>zuò +8444=>zuò +8445=>zū +8446=>bǎo +8447=>róu +8448=>xǐ +8449=>yè +844A=>ān +844B=>qú +844C=>jiān +844D=>fú +844E=>lǜ +844F=>jīng +8450=>pén +8451=>fēng +8452=>hóng +8453=>hóng +8454=>hóu +8455=>yàn +8456=>tū +8457=>zhe +8458=>zī +8459=>xiāng +845A=>rèn +845B=>gé +845C=>qiā +845D=>qíng +845E=>mǐ +845F=>huáng +8460=>shēn +8461=>pú +8462=>gài +8463=>dǒng +8464=>zhòu +8465=>jiàn +8466=>wěi +8467=>bó +8468=>wēi +8469=>pā +846A=>jì +846B=>hú +846C=>zàng +846D=>jiā +846E=>duàn +846F=>yào +8470=>suī +8471=>cōng +8472=>quán +8473=>wēi +8474=>zhēn +8475=>kuí +8476=>tíng +8477=>hūn +8478=>xǐ +8479=>shī +847A=>qì +847B=>lán +847C=>zōng +847D=>yāo +847E=>yuān +847F=>méi +8480=>yūn +8481=>shù +8482=>dì +8483=>zhuàn +8484=>guān +8485=>ran +8486=>xuē +8487=>chǎn +8488=>kǎi +8489=>kuì +848A=>huā +848B=>jiǎng +848C=>lóu +848D=>wěi +848E=>pài +848F=>you +8490=>sōu +8491=>yìn +8492=>shī +8493=>chún +8494=>shí +8495=>yūn +8496=>zhēn +8497=>làng +8498=>rú +8499=>méng +849A=>lì +849B=>quē +849C=>suàn +849D=>yuán +849E=>lì +849F=>jǔ +84A0=>xī +84A1=>bàng +84A2=>chú +84A3=>xú +84A4=>tú +84A5=>liú +84A6=>huò +84A7=>diǎn +84A8=>qiàn +84A9=>zū +84AA=>pò +84AB=>cuó +84AC=>yuān +84AD=>chú +84AE=>yù +84AF=>kuǎi +84B0=>pán +84B1=>pú +84B2=>pú +84B3=>nà +84B4=>shuò +84B5=>xí +84B6=>fén +84B7=>yún +84B8=>zhēng +84B9=>jiān +84BA=>jí +84BB=>ruò +84BC=>cāng +84BD=>ēn +84BE=>mí +84BF=>hāo +84C0=>sūn +84C1=>zhēn +84C2=>míng +84C3=>sōu +84C4=>xù +84C5=>liú +84C6=>xí +84C7=>gǔ +84C8=>láng +84C9=>róng +84CA=>wěng +84CB=>gài +84CC=>cuò +84CD=>shī +84CE=>táng +84CF=>luǒ +84D0=>rù +84D1=>suō +84D2=>xuān +84D3=>bèi +84D4=>yǎo +84D5=>guì +84D6=>bì +84D7=>zǒng +84D8=>gǔn +84D9=>zuo +84DA=>tiáo +84DB=>cè +84DC=>pei +84DD=>lán +84DE=>dàn +84DF=>jì +84E0=>lí +84E1=>shēn +84E2=>lǎng +84E3=>yù +84E4=>ling +84E5=>yíng +84E6=>mò +84E7=>diào +84E8=>tiáo +84E9=>mǎo +84EA=>tōng +84EB=>chù +84EC=>péng +84ED=>ān +84EE=>lián +84EF=>cōng +84F0=>xǐ +84F1=>píng +84F2=>qiū +84F3=>jǐn +84F4=>chún +84F5=>jié +84F6=>wéi +84F7=>tuī +84F8=>cáo +84F9=>yù +84FA=>yì +84FB=>zí +84FC=>liǎo +84FD=>bì +84FE=>lǔ +84FF=>xu +8500=>bù +8501=>zhāng +8502=>léi +8503=>qiáng +8504=>màn +8505=>yán +8506=>líng +8507=>jì +8508=>biāo +8509=>gǔn +850A=>hǎn +850B=>dí +850C=>sù +850D=>lù +850E=>shè +850F=>shāng +8510=>dí +8511=>miè +8512=>xūn +8513=>màn +8514=>bó +8515=>dì +8516=>cuó +8517=>zhe +8518=>shēn +8519=>xuàn +851A=>wèi +851B=>hú +851C=>áo +851D=>mǐ +851E=>lóu +851F=>cù +8520=>zhōng +8521=>cài +8522=>pó +8523=>jiǎng +8524=>mì +8525=>cōng +8526=>niǎo +8527=>huì +8528=>juàn +8529=>yín +852A=>jiàn +852B=>niān +852C=>shū +852D=>yīn +852E=>guó +852F=>chén +8530=>hù +8531=>shā +8532=>kòu +8533=>qiàn +8534=>má +8535=>zāng +8536=>ze +8537=>qiáng +8538=>dōu +8539=>liǎn +853A=>lìn +853B=>kòu +853C=>ǎi +853D=>bì +853E=>lí +853F=>wěi +8540=>jí +8541=>qián +8542=>shèng +8543=>fān +8544=>méng +8545=>ǒu +8546=>chǎn +8547=>diǎn +8548=>xùn +8549=>jiāo +854A=>ruǐ +854B=>ruǐ +854C=>lěi +854D=>yú +854E=>qiáo +854F=>chú +8550=>huá +8551=>jiān +8552=>mǎi +8553=>yún +8554=>bāo +8555=>yóu +8556=>qú +8557=>lù +8558=>ráo +8559=>huì +855A=>è +855B=>tí +855C=>fěi +855D=>jué +855E=>zuì +855F=>fà +8560=>rú +8561=>fén +8562=>kuì +8563=>shùn +8564=>ruí +8565=>yǎ +8566=>xū +8567=>fù +8568=>jué +8569=>dàng +856A=>wú +856B=>dǒng +856C=>sī +856D=>xiāo +856E=>xì +856F=>lóng +8570=>wēn +8571=>shao +8572=>qí +8573=>jiān +8574=>yùn +8575=>sūn +8576=>líng +8577=>yù +8578=>xiá +8579=>wèng +857A=>jí +857B=>hóng +857C=>sì +857D=>nóng +857E=>lěi +857F=>xuān +8580=>yùn +8581=>yù +8582=>xí +8583=>hào +8584=>báo +8585=>hāo +8586=>ài +8587=>wēi +8588=>huì +8589=>huì +858A=>jì +858B=>cí +858C=>xiāng +858D=>wàn +858E=>miè +858F=>yì +8590=>léng +8591=>jiāng +8592=>càn +8593=>shēn +8594=>qiáng +8595=>lián +8596=>kē +8597=>yuán +8598=>dá +8599=>tì +859A=>tāng +859B=>xuē +859C=>bì +859D=>zhān +859E=>sūn +859F=>xiān +85A0=>fán +85A1=>dǐng +85A2=>xiè +85A3=>gǔ +85A4=>xiè +85A5=>shǔ +85A6=>jiàn +85A7=>hāo +85A8=>hōng +85A9=>sà +85AA=>xīn +85AB=>xūn +85AC=>yào +85AD=>bai +85AE=>sǒu +85AF=>shǔ +85B0=>xūn +85B1=>duì +85B2=>pín +85B3=>wěi +85B4=>níng +85B5=>chóu +85B6=>mái +85B7=>rú +85B8=>piáo +85B9=>tái +85BA=>jì +85BB=>zǎo +85BC=>chén +85BD=>zhēn +85BE=>ěr +85BF=>nǐ +85C0=>yíng +85C1=>gǎo +85C2=>cóng +85C3=>xiāo +85C4=>qí +85C5=>fá +85C6=>jiǎn +85C7=>xù +85C8=>kuí +85C9=>jí +85CA=>biǎn +85CB=>diào +85CC=>mì +85CD=>lán +85CE=>jìn +85CF=>cáng +85D0=>miǎo +85D1=>qióng +85D2=>qiè +85D3=>xiǎn +85D4=>liáo +85D5=>ǒu +85D6=>xián +85D7=>sù +85D8=>lǘ +85D9=>yì +85DA=>xù +85DB=>xiě +85DC=>lí +85DD=>yì +85DE=>lǎ +85DF=>lěi +85E0=>jiào +85E1=>dí +85E2=>zhǐ +85E3=>bēi +85E4=>téng +85E5=>yào +85E6=>mò +85E7=>huàn +85E8=>biāo +85E9=>fān +85EA=>sǒu +85EB=>tán +85EC=>tuī +85ED=>qióng +85EE=>qiáo +85EF=>wèi +85F0=>liú +85F1=>huì +85F2=>ou +85F3=>gǎo +85F4=>yùn +85F5=>bao +85F6=>lì +85F7=>shǔ +85F8=>chú +85F9=>ǎi +85FA=>lìn +85FB=>zǎo +85FC=>xuān +85FD=>qìn +85FE=>lài +85FF=>huò +8600=>tuò +8601=>wù +8602=>ruǐ +8603=>ruǐ +8604=>qí +8605=>héng +8606=>lú +8607=>sū +8608=>tuí +8609=>méng +860A=>yùn +860B=>píng +860C=>yǔ +860D=>xūn +860E=>jì +860F=>jiōng +8610=>xuān +8611=>mó +8612=>qiu +8613=>sū +8614=>jiōng +8615=>feng +8616=>niè +8617=>bò +8618=>ráng +8619=>yì +861A=>xiǎn +861B=>yú +861C=>jú +861D=>liàn +861E=>liǎn +861F=>yǐn +8620=>qiáng +8621=>yīng +8622=>lóng +8623=>tǒu +8624=>wěi +8625=>yuè +8626=>líng +8627=>qú +8628=>yáo +8629=>fán +862A=>méi +862B=>hàn +862C=>kuī +862D=>lán +862E=>jì +862F=>dàng +8630=>man +8631=>lèi +8632=>léi +8633=>huī +8634=>fēng +8635=>zhī +8636=>wèi +8637=>kuí +8638=>zhàn +8639=>huái +863A=>lí +863B=>jì +863C=>mí +863D=>lěi +863E=>huài +863F=>luó +8640=>jī +8641=>kuí +8642=>lù +8643=>jiān +8644=>sà +8645=>teng +8646=>léi +8647=>quǎn +8648=>xiāo +8649=>yì +864A=>luán +864B=>mén +864C=>biē +864D=>hū +864E=>hǔ +864F=>lǔ +8650=>nüè +8651=>lǜ +8652=>sī +8653=>xiāo +8654=>qián +8655=>chù +8656=>hū +8657=>xū +8658=>cuó +8659=>fú +865A=>xū +865B=>xū +865C=>lǔ +865D=>hǔ +865E=>yú +865F=>hào +8660=>jiāo +8661=>jù +8662=>guó +8663=>bào +8664=>yán +8665=>zhàn +8666=>zhàn +8667=>kuī +8668=>bīn +8669=>xì +866A=>shù +866B=>chóng +866C=>qiú +866D=>diāo +866E=>jǐ +866F=>qiú +8670=>dīng +8671=>shī +8672=>xiā +8673=>jué +8674=>zhé +8675=>shé +8676=>yū +8677=>hán +8678=>zǐ +8679=>hóng +867A=>huī +867B=>méng +867C=>gè +867D=>suī +867E=>xiā +867F=>chài +8680=>shí +8681=>yǐ +8682=>mǎ +8683=>xiàng +8684=>fāng +8685=>è +8686=>bā +8687=>chǐ +8688=>qiān +8689=>wén +868A=>wén +868B=>ruì +868C=>bàng +868D=>pí +868E=>yuè +868F=>yuè +8690=>jūn +8691=>qí +8692=>tóng +8693=>yǐn +8694=>qí +8695=>cán +8696=>yuán +8697=>jué +8698=>huí +8699=>qín +869A=>qí +869B=>zhòng +869C=>yá +869D=>háo +869E=>mù +869F=>wáng +86A0=>fén +86A1=>fén +86A2=>háng +86A3=>gong +86A4=>zǎo +86A5=>fù +86A6=>rán +86A7=>jiè +86A8=>fú +86A9=>chī +86AA=>dǒu +86AB=>bào +86AC=>xiǎn +86AD=>ní +86AE=>tè +86AF=>qiū +86B0=>yóu +86B1=>zhà +86B2=>píng +86B3=>chí +86B4=>yòu +86B5=>hé +86B6=>hān +86B7=>jù +86B8=>lì +86B9=>fù +86BA=>rán +86BB=>zhá +86BC=>gǒu +86BD=>pí +86BE=>pí +86BF=>xián +86C0=>zhù +86C1=>diāo +86C2=>bié +86C3=>bǐng +86C4=>gū +86C5=>zhān +86C6=>qū +86C7=>shé +86C8=>tiě +86C9=>líng +86CA=>gǔ +86CB=>dàn +86CC=>gǔ +86CD=>yíng +86CE=>lì +86CF=>chēng +86D0=>qū +86D1=>móu +86D2=>gé +86D3=>cì +86D4=>huí +86D5=>huí +86D6=>máng +86D7=>fù +86D8=>yáng +86D9=>wā +86DA=>liè +86DB=>zhū +86DC=>yī +86DD=>xián +86DE=>kuò +86DF=>jiāo +86E0=>lì +86E1=>yì +86E2=>píng +86E3=>qī +86E4=>há +86E5=>shé +86E6=>yí +86E7=>wǎng +86E8=>mò +86E9=>qióng +86EA=>qiè +86EB=>guǐ +86EC=>qióng +86ED=>zhì +86EE=>mán +86EF=>lao +86F0=>zhé +86F1=>jiá +86F2=>náo +86F3=>sī +86F4=>qí +86F5=>xīng +86F6=>jiè +86F7=>qiú +86F8=>shāo +86F9=>yǒng +86FA=>jiá +86FB=>tuì +86FC=>chē +86FD=>bài +86FE=>é +86FF=>hàn +8700=>shǔ +8701=>xuán +8702=>fēng +8703=>shèn +8704=>shèn +8705=>fǔ +8706=>xiàn +8707=>zhē +8708=>wú +8709=>fú +870A=>lí +870B=>láng +870C=>bì +870D=>chú +870E=>yuān +870F=>yǒu +8710=>jié +8711=>dàn +8712=>yán +8713=>tíng +8714=>diàn +8715=>tuì +8716=>huí +8717=>wō +8718=>zhī +8719=>sōng +871A=>fēi +871B=>jū +871C=>mì +871D=>qí +871E=>qí +871F=>yù +8720=>jùn +8721=>là +8722=>měng +8723=>qiāng +8724=>sī +8725=>xī +8726=>lún +8727=>lì +8728=>dié +8729=>tiáo +872A=>táo +872B=>kūn +872C=>hán +872D=>hàn +872E=>yù +872F=>bàng +8730=>féi +8731=>pí +8732=>wēi +8733=>dūn +8734=>yì +8735=>yuān +8736=>suò +8737=>quán +8738=>qiǎn +8739=>ruì +873A=>ní +873B=>qīng +873C=>wèi +873D=>liǎng +873E=>guǒ +873F=>wān +8740=>dōng +8741=>è +8742=>bǎn +8743=>dì +8744=>wǎng +8745=>cán +8746=>yǎng +8747=>ying +8748=>guō +8749=>chán +874A=>dìng +874B=>là +874C=>kē +874D=>jié +874E=>xiē +874F=>tíng +8750=>mào +8751=>xū +8752=>mián +8753=>yú +8754=>jiē +8755=>shí +8756=>xuān +8757=>huáng +8758=>yǎn +8759=>biān +875A=>róu +875B=>wēi +875C=>fù +875D=>yuán +875E=>mèi +875F=>wei +8760=>fú +8761=>rú +8762=>xié +8763=>yóu +8764=>qiú +8765=>máo +8766=>xiā +8767=>yīng +8768=>shī +8769=>chóng +876A=>tāng +876B=>zhū +876C=>zōng +876D=>tí +876E=>fù +876F=>yuán +8770=>kuí +8771=>méng +8772=>là +8773=>dú +8774=>hú +8775=>qiū +8776=>dié +8777=>lì +8778=>wō +8779=>yūn +877A=>qǔ +877B=>nǎn +877C=>lóu +877D=>chūn +877E=>róng +877F=>yíng +8780=>jiāng +8781=>ban +8782=>láng +8783=>páng +8784=>sī +8785=>xī +8786=>cì +8787=>xī +8788=>yuán +8789=>wēng +878A=>lián +878B=>sōu +878C=>bān +878D=>róng +878E=>róng +878F=>jí +8790=>wū +8791=>xiù +8792=>hàn +8793=>qín +8794=>yí +8795=>bī +8796=>huá +8797=>táng +8798=>yǐ +8799=>dù +879A=>nài +879B=>hé +879C=>hú +879D=>guī +879E=>mǎ +879F=>míng +87A0=>yì +87A1=>wén +87A2=>yíng +87A3=>tè +87A4=>zhōng +87A5=>cāng +87A6=>sao +87A7=>qi +87A8=>mǎn +87A9=>tiao +87AA=>shāng +87AB=>shì +87AC=>cáo +87AD=>chī +87AE=>dì +87AF=>áo +87B0=>lù +87B1=>wèi +87B2=>zhì +87B3=>táng +87B4=>chén +87B5=>piāo +87B6=>qú +87B7=>pí +87B8=>yú +87B9=>jiàn +87BA=>luó +87BB=>lóu +87BC=>qǐn +87BD=>zhōng +87BE=>yǐn +87BF=>jiāng +87C0=>shuài +87C1=>wén +87C2=>xiāo +87C3=>wàn +87C4=>zhé +87C5=>zhè +87C6=>ma +87C7=>má +87C8=>guō +87C9=>liú +87CA=>máo +87CB=>xī +87CC=>cōng +87CD=>lí +87CE=>mǎn +87CF=>xiāo +87D0=>chang +87D1=>zhāng +87D2=>mǎng +87D3=>xiàng +87D4=>mò +87D5=>zuī +87D6=>sī +87D7=>qiū +87D8=>tè +87D9=>zhí +87DA=>péng +87DB=>péng +87DC=>jiǎo +87DD=>qú +87DE=>biē +87DF=>liáo +87E0=>pán +87E1=>guǐ +87E2=>xǐ +87E3=>jǐ +87E4=>zhuān +87E5=>huáng +87E6=>féi +87E7=>láo +87E8=>jué +87E9=>jué +87EA=>huì +87EB=>yín +87EC=>chán +87ED=>jiāo +87EE=>shàn +87EF=>náo +87F0=>xiāo +87F1=>wú +87F2=>chóng +87F3=>xún +87F4=>sī +87F5=>chu +87F6=>chēng +87F7=>dāng +87F8=>lǐ +87F9=>xiè +87FA=>shàn +87FB=>yǐ +87FC=>jǐng +87FD=>dá +87FE=>chán +87FF=>qì +8800=>cī +8801=>xiǎng +8802=>shè +8803=>luǒ +8804=>qín +8805=>ying +8806=>chài +8807=>lì +8808=>zéi +8809=>xuān +880A=>lián +880B=>zhú +880C=>zé +880D=>xiē +880E=>mǎng +880F=>xiè +8810=>qí +8811=>róng +8812=>jiǎn +8813=>měng +8814=>háo +8815=>rú +8816=>huò +8817=>zhuó +8818=>jié +8819=>pín +881A=>hē +881B=>miè +881C=>fán +881D=>léi +881E=>jié +881F=>là +8820=>mǐn +8821=>lí +8822=>chǔn +8823=>lì +8824=>qiū +8825=>niè +8826=>lú +8827=>dù +8828=>xiāo +8829=>zhū +882A=>lóng +882B=>lì +882C=>lóng +882D=>fēng +882E=>yē +882F=>bèng +8830=>náng +8831=>gǔ +8832=>juān +8833=>yīng +8834=>shu +8835=>xī +8836=>cán +8837=>qú +8838=>quán +8839=>dù +883A=>cán +883B=>mán +883C=>qú +883D=>jié +883E=>zhú +883F=>zhuō +8840=>xuè +8841=>huāng +8842=>niù +8843=>pēi +8844=>nǜ +8845=>xìn +8846=>zhòng +8847=>mài +8848=>èr +8849=>kā +884A=>miè +884B=>xì +884C=>xíng +884D=>yǎn +884E=>kàn +884F=>yuàn +8850=>qu +8851=>líng +8852=>xuàn +8853=>shù +8854=>xián +8855=>tòng +8856=>xiàng +8857=>jiē +8858=>xián +8859=>yá +885A=>hú +885B=>wèi +885C=>dào +885D=>chōng +885E=>wèi +885F=>dào +8860=>zhūn +8861=>héng +8862=>qú +8863=>yī +8864=>yi +8865=>bǔ +8866=>gǎn +8867=>yú +8868=>biǎo +8869=>chǎ +886A=>yí +886B=>shān +886C=>chèn +886D=>fū +886E=>gǔn +886F=>fēn +8870=>shuāi +8871=>jié +8872=>nà +8873=>zhōng +8874=>dǎn +8875=>yì +8876=>zhòng +8877=>zhōng +8878=>jiè +8879=>zhǐ +887A=>xié +887B=>rán +887C=>zhī +887D=>rèn +887E=>qīn +887F=>jīn +8880=>jūn +8881=>yuán +8882=>mèi +8883=>chài +8884=>ǎo +8885=>niǎo +8886=>huī +8887=>rán +8888=>jiā +8889=>tuó +888A=>lǐng +888B=>dài +888C=>bào +888D=>páo +888E=>yào +888F=>zuò +8890=>bì +8891=>shào +8892=>tǎn +8893=>jù +8894=>hè +8895=>xué +8896=>xiù +8897=>zhěn +8898=>yí +8899=>pà +889A=>bō +889B=>dī +889C=>wà +889D=>fù +889E=>gǔn +889F=>zhì +88A0=>zhì +88A1=>rán +88A2=>pàn +88A3=>yì +88A4=>mào +88A5=>tuō +88A6=>nà +88A7=>gōu +88A8=>xuàn +88A9=>zhé +88AA=>qū +88AB=>bèi +88AC=>gǔn +88AD=>xí +88AE=>ni +88AF=>bó +88B0=>bō +88B1=>fu +88B2=>chǐ +88B3=>chǐ +88B4=>kù +88B5=>rèn +88B6=>jiàng +88B7=>jiá +88B8=>jiàn +88B9=>bó +88BA=>jié +88BB=>ér +88BC=>gē +88BD=>rú +88BE=>zhū +88BF=>guī +88C0=>yīn +88C1=>cái +88C2=>liè +88C3=>ka +88C4=>xing +88C5=>zhuāng +88C6=>dāng +88C7=>xū +88C8=>kūn +88C9=>kèn +88CA=>niǎo +88CB=>shù +88CC=>jiá +88CD=>kǔn +88CE=>chéng +88CF=>lǐ +88D0=>juān +88D1=>shēn +88D2=>póu +88D3=>gé +88D4=>yì +88D5=>yù +88D6=>zhěn +88D7=>liú +88D8=>qiú +88D9=>qún +88DA=>jì +88DB=>yì +88DC=>bǔ +88DD=>zhuāng +88DE=>shuì +88DF=>shā +88E0=>qún +88E1=>li +88E2=>lián +88E3=>liǎn +88E4=>kù +88E5=>jiǎn +88E6=>fóu +88E7=>chān +88E8=>bì +88E9=>kūn +88EA=>táo +88EB=>yuàn +88EC=>líng +88ED=>chǐ +88EE=>chāng +88EF=>chóu +88F0=>duō +88F1=>biǎo +88F2=>liǎng +88F3=>shang +88F4=>péi +88F5=>péi +88F6=>fēi +88F7=>yuān +88F8=>luǒ +88F9=>guǒ +88FA=>yǎn +88FB=>dú +88FC=>tì +88FD=>zhì +88FE=>jū +88FF=>yǐ +8900=>jì +8901=>zhí +8902=>guà +8903=>kèn +8904=>qi +8905=>tì +8906=>tí +8907=>fù +8908=>chóng +8909=>xiè +890A=>biǎn +890B=>dié +890C=>kūn +890D=>duān +890E=>xiù +890F=>xiù +8910=>hè +8911=>yuàn +8912=>bāo +8913=>bǎo +8914=>fù +8915=>yú +8916=>tuàn +8917=>yǎn +8918=>huī +8919=>bèi +891A=>chǔ +891B=>lǚ +891C=>pao +891D=>dān +891E=>yǔn +891F=>tā +8920=>gōu +8921=>dā +8922=>huái +8923=>róng +8924=>yuàn +8925=>rù +8926=>nài +8927=>jiǒng +8928=>suǒ +8929=>bān +892A=>tuì +892B=>chǐ +892C=>sǎng +892D=>niǎo +892E=>yīng +892F=>jiè +8930=>qiān +8931=>huái +8932=>kù +8933=>lián +8934=>lán +8935=>lí +8936=>zhě +8937=>shī +8938=>lǚ +8939=>yì +893A=>diē +893B=>xiè +893C=>xiān +893D=>wèi +893E=>biǎo +893F=>cáo +8940=>jī +8941=>qiǎng +8942=>sēn +8943=>bāo +8944=>xiāng +8945=>bi +8946=>fú +8947=>jiǎn +8948=>zhuàn +8949=>jiǎn +894A=>cuì +894B=>jí +894C=>dān +894D=>zá +894E=>fán +894F=>bó +8950=>xiàng +8951=>xín +8952=>bié +8953=>ráo +8954=>mǎn +8955=>lán +8956=>ǎo +8957=>zé +8958=>guì +8959=>cào +895A=>suì +895B=>nóng +895C=>chān +895D=>liǎn +895E=>bì +895F=>jīn +8960=>dāng +8961=>shǔ +8962=>tǎn +8963=>bì +8964=>lán +8965=>pú +8966=>rú +8967=>zhǐ +8968=>dùi +8969=>shǔ +896A=>wà +896B=>shì +896C=>bǎi +896D=>xié +896E=>bó +896F=>chèn +8970=>lài +8971=>lóng +8972=>xí +8973=>xiān +8974=>lán +8975=>zhě +8976=>dài +8977=>ju +8978=>zàn +8979=>shī +897A=>jiǎn +897B=>pàn +897C=>yì +897D=>lan +897E=>yà +897F=>xi +8980=>xī +8981=>yào +8982=>fěng +8983=>tán +8984=>fu +8985=>fiào +8986=>fù +8987=>bà +8988=>hé +8989=>jī +898A=>jī +898B=>jiàn +898C=>guān +898D=>biàn +898E=>yàn +898F=>guī +8990=>jué +8991=>piǎn +8992=>mào +8993=>mì +8994=>mì +8995=>miè +8996=>shì +8997=>sì +8998=>chān +8999=>luó +899A=>jué +899B=>mì +899C=>tiào +899D=>lián +899E=>yào +899F=>zhì +89A0=>jūn +89A1=>xí +89A2=>shǎn +89A3=>wēi +89A4=>xì +89A5=>tiǎn +89A6=>yú +89A7=>lǎn +89A8=>è +89A9=>dǔ +89AA=>qīn +89AB=>pǎng +89AC=>jì +89AD=>míng +89AE=>yíng +89AF=>gòu +89B0=>qū +89B1=>zhàn +89B2=>jìn +89B3=>guān +89B4=>dēng +89B5=>jiàn +89B6=>luó +89B7=>qù +89B8=>jiān +89B9=>wéi +89BA=>jué +89BB=>qū +89BC=>luó +89BD=>lǎn +89BE=>shěn +89BF=>dí +89C0=>guān +89C1=>jiàn +89C2=>guān +89C3=>yàn +89C4=>guī +89C5=>mì +89C6=>shì +89C7=>chān +89C8=>lǎn +89C9=>jué +89CA=>jì +89CB=>xí +89CC=>dí +89CD=>tiǎn +89CE=>yú +89CF=>gòu +89D0=>jìn +89D1=>qù +89D2=>jiǎo +89D3=>qiú +89D4=>jīn +89D5=>cū +89D6=>jué +89D7=>zhì +89D8=>chào +89D9=>jí +89DA=>gū +89DB=>dàn +89DC=>zī +89DD=>dǐ +89DE=>shāng +89DF=>huà +89E0=>quán +89E1=>gé +89E2=>shì +89E3=>jiě +89E4=>guǐ +89E5=>gōng +89E6=>chù +89E7=>jiě +89E8=>hùn +89E9=>qiú +89EA=>xīng +89EB=>sù +89EC=>ní +89ED=>jī +89EE=>lù +89EF=>zhì +89F0=>zhā +89F1=>bì +89F2=>xīng +89F3=>hú +89F4=>shāng +89F5=>gōng +89F6=>zhì +89F7=>xué +89F8=>chù +89F9=>xī +89FA=>yí +89FB=>lì +89FC=>jué +89FD=>xī +89FE=>yàn +89FF=>xī +8A00=>yán +8A01=>yan +8A02=>dìng +8A03=>fù +8A04=>qiú +8A05=>qiú +8A06=>jiào +8A07=>hōng +8A08=>jì +8A09=>fān +8A0A=>xùn +8A0B=>diào +8A0C=>hòng +8A0D=>chài +8A0E=>tǎo +8A0F=>xū +8A10=>jié +8A11=>yí +8A12=>rèn +8A13=>xun +8A14=>yín +8A15=>shàn +8A16=>qì +8A17=>tuō +8A18=>jì +8A19=>xùn +8A1A=>yín +8A1B=>é +8A1C=>fēn +8A1D=>yà +8A1E=>yāo +8A1F=>sòng +8A20=>shěn +8A21=>yín +8A22=>xīn +8A23=>jué +8A24=>xiáo +8A25=>nè +8A26=>chén +8A27=>yóu +8A28=>zhǐ +8A29=>xiōng +8A2A=>fǎng +8A2B=>xìn +8A2C=>chāo +8A2D=>shè +8A2E=>xiān +8A2F=>sǎ +8A30=>zhùn +8A31=>xǔ +8A32=>yì +8A33=>yì +8A34=>su +8A35=>chī +8A36=>hē +8A37=>shēn +8A38=>hé +8A39=>xù +8A3A=>zhěn +8A3B=>zhù +8A3C=>zhèng +8A3D=>gòu +8A3E=>zī +8A3F=>zǐ +8A40=>zhān +8A41=>gǔ +8A42=>fù +8A43=>jiǎn +8A44=>dié +8A45=>líng +8A46=>dǐ +8A47=>yàng +8A48=>lì +8A49=>náo +8A4A=>pàn +8A4B=>zhòu +8A4C=>gàn +8A4D=>yì +8A4E=>jù +8A4F=>yào +8A50=>zhà +8A51=>yí +8A52=>yí +8A53=>qǔ +8A54=>zhào +8A55=>píng +8A56=>bì +8A57=>xiòng +8A58=>qū +8A59=>bá +8A5A=>dá +8A5B=>zǔ +8A5C=>tāo +8A5D=>zhǔ +8A5E=>cí +8A5F=>zhé +8A60=>yǒng +8A61=>xǔ +8A62=>xún +8A63=>yì +8A64=>huǎng +8A65=>hé +8A66=>shì +8A67=>chá +8A68=>xiào +8A69=>shī +8A6A=>hěn +8A6B=>chà +8A6C=>gòu +8A6D=>guǐ +8A6E=>quán +8A6F=>huì +8A70=>jié +8A71=>huà +8A72=>gāi +8A73=>xiáng +8A74=>wēi +8A75=>shēn +8A76=>zhòu +8A77=>tóng +8A78=>mí +8A79=>zhān +8A7A=>mìng +8A7B=>è +8A7C=>huī +8A7D=>yán +8A7E=>xiōng +8A7F=>guà +8A80=>èr +8A81=>bìng +8A82=>tiǎo +8A83=>yí +8A84=>lěi +8A85=>zhū +8A86=>kuāng +8A87=>kuā +8A88=>wú +8A89=>yù +8A8A=>téng +8A8B=>jì +8A8C=>zhì +8A8D=>rèn +8A8E=>cù +8A8F=>lǎng +8A90=>é +8A91=>kuáng +8A92=>éi +8A93=>shì +8A94=>tǐng +8A95=>dàn +8A96=>bèi +8A97=>chán +8A98=>yòu +8A99=>kēng +8A9A=>qiào +8A9B=>qīn +8A9C=>shuà +8A9D=>ān +8A9E=>yǔ +8A9F=>xiào +8AA0=>chéng +8AA1=>jiè +8AA2=>xiàn +8AA3=>wū +8AA4=>wù +8AA5=>gào +8AA6=>sòng +8AA7=>bū +8AA8=>huì +8AA9=>jìng +8AAA=>shuō +8AAB=>zhèn +8AAC=>shuō +8AAD=>dú +8AAE=>hua +8AAF=>chàng +8AB0=>shuí +8AB1=>jié +8AB2=>kè +8AB3=>qū +8AB4=>cóng +8AB5=>xiáo +8AB6=>suì +8AB7=>wǎng +8AB8=>xián +8AB9=>fěi +8ABA=>chī +8ABB=>tà +8ABC=>yì +8ABD=>nì +8ABE=>yín +8ABF=>diào +8AC0=>pǐ +8AC1=>zhuó +8AC2=>chǎn +8AC3=>chēn +8AC4=>zhūn +8AC5=>jì +8AC6=>qī +8AC7=>tán +8AC8=>zhuì +8AC9=>wěi +8ACA=>jú +8ACB=>qǐng +8ACC=>dǒng +8ACD=>zhèng +8ACE=>zé +8ACF=>zōu +8AD0=>qiān +8AD1=>zhuó +8AD2=>liàng +8AD3=>jiàn +8AD4=>chù +8AD5=>háo +8AD6=>lùn +8AD7=>shěn +8AD8=>biǎo +8AD9=>huài +8ADA=>pián +8ADB=>yú +8ADC=>dié +8ADD=>xū +8ADE=>piǎn +8ADF=>shì +8AE0=>xuān +8AE1=>shì +8AE2=>hùn +8AE3=>huà +8AE4=>è +8AE5=>zhòng +8AE6=>dì +8AE7=>xié +8AE8=>fú +8AE9=>pǔ +8AEA=>tíng +8AEB=>jiàn +8AEC=>qǐ +8AED=>yù +8AEE=>zī +8AEF=>zhuān +8AF0=>xǐ +8AF1=>huì +8AF2=>yīn +8AF3=>ān +8AF4=>xián +8AF5=>nán +8AF6=>chén +8AF7=>fěng +8AF8=>zhū +8AF9=>yáng +8AFA=>yàn +8AFB=>huáng +8AFC=>xuān +8AFD=>gé +8AFE=>nuò +8AFF=>qī +8B00=>móu +8B01=>yè +8B02=>wèi +8B03=>xing +8B04=>téng +8B05=>zhōu +8B06=>shàn +8B07=>jiǎn +8B08=>pó +8B09=>kuì +8B0A=>huǎng +8B0B=>huò +8B0C=>gē +8B0D=>yíng +8B0E=>mí +8B0F=>xiǎo +8B10=>mì +8B11=>xǐ +8B12=>qiāng +8B13=>chēn +8B14=>xuè +8B15=>tí +8B16=>sù +8B17=>bàng +8B18=>chí +8B19=>qiān +8B1A=>shì +8B1B=>jiǎng +8B1C=>yuán +8B1D=>xiè +8B1E=>hè +8B1F=>tāo +8B20=>yáo +8B21=>yáo +8B22=>zhi +8B23=>yú +8B24=>biāo +8B25=>còng +8B26=>qìng +8B27=>lí +8B28=>mó +8B29=>mò +8B2A=>shāng +8B2B=>zhé +8B2C=>miù +8B2D=>jiǎn +8B2E=>zé +8B2F=>jiē +8B30=>lián +8B31=>lóu +8B32=>càn +8B33=>ōu +8B34=>gùn +8B35=>xí +8B36=>zhuó +8B37=>áo +8B38=>áo +8B39=>jǐn +8B3A=>zhé +8B3B=>yí +8B3C=>hū +8B3D=>jiàng +8B3E=>mán +8B3F=>cháo +8B40=>hàn +8B41=>huá +8B42=>chǎn +8B43=>xū +8B44=>zēng +8B45=>sè +8B46=>xī +8B47=>zhā +8B48=>duì +8B49=>zhèng +8B4A=>náo +8B4B=>lán +8B4C=>é +8B4D=>yīng +8B4E=>jué +8B4F=>jī +8B50=>zǔn +8B51=>jiǎo +8B52=>bò +8B53=>huì +8B54=>zhuàn +8B55=>wú +8B56=>zèn +8B57=>zhá +8B58=>shi +8B59=>qiào +8B5A=>tán +8B5B=>zèn +8B5C=>pǔ +8B5D=>shéng +8B5E=>xuān +8B5F=>zào +8B60=>tán +8B61=>dǎng +8B62=>suì +8B63=>xiǎn +8B64=>jī +8B65=>jiào +8B66=>jǐng +8B67=>zhàn +8B68=>náng +8B69=>yī +8B6A=>ài +8B6B=>zhān +8B6C=>pì +8B6D=>huǐ +8B6E=>huà +8B6F=>yì +8B70=>yì +8B71=>shàn +8B72=>ràng +8B73=>nòu +8B74=>qiǎn +8B75=>zhuì +8B76=>tà +8B77=>hù +8B78=>zhōu +8B79=>háo +8B7A=>ài +8B7B=>yīng +8B7C=>jiàn +8B7D=>yù +8B7E=>jiǎn +8B7F=>huì +8B80=>dú +8B81=>zhé +8B82=>xuàn +8B83=>zàn +8B84=>lěi +8B85=>shěn +8B86=>wèi +8B87=>chǎn +8B88=>lì +8B89=>yí +8B8A=>biàn +8B8B=>zhé +8B8C=>yàn +8B8D=>è +8B8E=>chóu +8B8F=>wèi +8B90=>chóu +8B91=>yào +8B92=>chán +8B93=>ràng +8B94=>yǐn +8B95=>lán +8B96=>chèn +8B97=>xié +8B98=>niè +8B99=>huān +8B9A=>zàn +8B9B=>yì +8B9C=>dǎng +8B9D=>zhán +8B9E=>yàn +8B9F=>dú +8BA0=>yán +8BA1=>jì +8BA2=>dìng +8BA3=>fù +8BA4=>rèn +8BA5=>jī +8BA6=>jié +8BA7=>hòng +8BA8=>tǎo +8BA9=>ràng +8BAA=>shàn +8BAB=>qì +8BAC=>tuō +8BAD=>xun +8BAE=>yì +8BAF=>xùn +8BB0=>jì +8BB1=>rèn +8BB2=>jiǎng +8BB3=>huì +8BB4=>ōu +8BB5=>jù +8BB6=>yà +8BB7=>nè +8BB8=>xǔ +8BB9=>é +8BBA=>lùn +8BBB=>xiōng +8BBC=>sòng +8BBD=>fěng +8BBE=>shè +8BBF=>fǎng +8BC0=>jué +8BC1=>zhèng +8BC2=>gǔ +8BC3=>hē +8BC4=>píng +8BC5=>zǔ +8BC6=>shi +8BC7=>xiòng +8BC8=>zhà +8BC9=>su +8BCA=>zhěn +8BCB=>dǐ +8BCC=>zhōu +8BCD=>cí +8BCE=>qū +8BCF=>zhào +8BD0=>bì +8BD1=>yì +8BD2=>yí +8BD3=>kuāng +8BD4=>lěi +8BD5=>shì +8BD6=>guà +8BD7=>shī +8BD8=>jí +8BD9=>huī +8BDA=>chéng +8BDB=>zhū +8BDC=>shēn +8BDD=>huà +8BDE=>dàn +8BDF=>gòu +8BE0=>quán +8BE1=>guǐ +8BE2=>xún +8BE3=>yì +8BE4=>zhēng +8BE5=>gāi +8BE6=>xiáng +8BE7=>chà +8BE8=>hùn +8BE9=>xǔ +8BEA=>zhōu +8BEB=>jiè +8BEC=>wū +8BED=>yǔ +8BEE=>qiào +8BEF=>wù +8BF0=>gào +8BF1=>yòu +8BF2=>huì +8BF3=>kuáng +8BF4=>shuō +8BF5=>sòng +8BF6=>éi +8BF7=>qǐng +8BF8=>zhū +8BF9=>zōu +8BFA=>nuò +8BFB=>dú +8BFC=>zhuó +8BFD=>fěi +8BFE=>kè +8BFF=>wěi +8C00=>yú +8C01=>shuí +8C02=>shěn +8C03=>diào +8C04=>chǎn +8C05=>liàng +8C06=>zhūn +8C07=>suì +8C08=>tán +8C09=>shěn +8C0A=>yì +8C0B=>móu +8C0C=>chén +8C0D=>dié +8C0E=>huǎng +8C0F=>jiàn +8C10=>xié +8C11=>xuè +8C12=>yè +8C13=>wèi +8C14=>è +8C15=>yù +8C16=>xuān +8C17=>chán +8C18=>zī +8C19=>ān +8C1A=>yàn +8C1B=>dì +8C1C=>mí +8C1D=>piǎn +8C1E=>xū +8C1F=>mó +8C20=>dǎng +8C21=>sù +8C22=>xiè +8C23=>yáo +8C24=>bàng +8C25=>shì +8C26=>qiān +8C27=>mì +8C28=>jǐn +8C29=>mán +8C2A=>zhé +8C2B=>jiǎn +8C2C=>miù +8C2D=>tán +8C2E=>zèn +8C2F=>qiáo +8C30=>lán +8C31=>pǔ +8C32=>jué +8C33=>yàn +8C34=>qiǎn +8C35=>zhān +8C36=>chèn +8C37=>gǔ +8C38=>qiān +8C39=>hóng +8C3A=>xiā +8C3B=>jí +8C3C=>hóng +8C3D=>hān +8C3E=>hōng +8C3F=>xī +8C40=>xī +8C41=>huō +8C42=>liáo +8C43=>hǎn +8C44=>dú +8C45=>lóng +8C46=>dòu +8C47=>jiāng +8C48=>qǐ +8C49=>shì +8C4A=>lǐ +8C4B=>dēng +8C4C=>wān +8C4D=>bī +8C4E=>shù +8C4F=>xiàn +8C50=>fēng +8C51=>zhì +8C52=>zhì +8C53=>yàn +8C54=>yàn +8C55=>shǐ +8C56=>chù +8C57=>huī +8C58=>tún +8C59=>yì +8C5A=>tún +8C5B=>yì +8C5C=>jiān +8C5D=>bā +8C5E=>hòu +8C5F=>è +8C60=>chú +8C61=>xiàng +8C62=>huàn +8C63=>jiān +8C64=>kěn +8C65=>gāi +8C66=>jù +8C67=>fū +8C68=>xī +8C69=>bīn +8C6A=>háo +8C6B=>yù +8C6C=>zhū +8C6D=>jiā +8C6E=>fén +8C6F=>xī +8C70=>bó +8C71=>wēn +8C72=>huán +8C73=>bīn +8C74=>dí +8C75=>zōng +8C76=>fén +8C77=>yì +8C78=>zhì +8C79=>bào +8C7A=>chái +8C7B=>àn +8C7C=>pí +8C7D=>nà +8C7E=>pī +8C7F=>gǒu +8C80=>nà +8C81=>yòu +8C82=>diāo +8C83=>mò +8C84=>sì +8C85=>xiū +8C86=>huán +8C87=>kūn +8C88=>hé +8C89=>háo +8C8A=>mò +8C8B=>hàn +8C8C=>mào +8C8D=>lí +8C8E=>ní +8C8F=>bǐ +8C90=>yǔ +8C91=>jiā +8C92=>tuān +8C93=>māo +8C94=>pí +8C95=>xī +8C96=>è +8C97=>jù +8C98=>mò +8C99=>chū +8C9A=>tán +8C9B=>huān +8C9C=>jué +8C9D=>bèi +8C9E=>zhēn +8C9F=>yuán +8CA0=>fù +8CA1=>cái +8CA2=>gòng +8CA3=>tè +8CA4=>yí +8CA5=>háng +8CA6=>wàn +8CA7=>pín +8CA8=>huò +8CA9=>fàn +8CAA=>tān +8CAB=>guàn +8CAC=>zé +8CAD=>zhí +8CAE=>èr +8CAF=>zhù +8CB0=>shì +8CB1=>bì +8CB2=>zī +8CB3=>èr +8CB4=>guì +8CB5=>piǎn +8CB6=>biǎn +8CB7=>mǎi +8CB8=>dài +8CB9=>shèng +8CBA=>kuàng +8CBB=>fèi +8CBC=>tiē +8CBD=>yí +8CBE=>chí +8CBF=>mào +8CC0=>hè +8CC1=>bì +8CC2=>lù +8CC3=>lìn +8CC4=>huì +8CC5=>gāi +8CC6=>pián +8CC7=>zī +8CC8=>jiǎ +8CC9=>xù +8CCA=>zéi +8CCB=>jiǎo +8CCC=>gài +8CCD=>zāng +8CCE=>jiàn +8CCF=>yīng +8CD0=>xùn +8CD1=>zhèn +8CD2=>shē +8CD3=>bīn +8CD4=>bīn +8CD5=>qiú +8CD6=>shē +8CD7=>chuàn +8CD8=>zāng +8CD9=>zhōu +8CDA=>lài +8CDB=>zàn +8CDC=>cì +8CDD=>chēn +8CDE=>shǎng +8CDF=>tiǎn +8CE0=>péi +8CE1=>gēng +8CE2=>xián +8CE3=>mài +8CE4=>jiàn +8CE5=>suì +8CE6=>fù +8CE7=>tàn +8CE8=>cóng +8CE9=>cóng +8CEA=>zhì +8CEB=>jī +8CEC=>zhàng +8CED=>dǔ +8CEE=>jìn +8CEF=>xiōng +8CF0=>chǔn +8CF1=>yǔn +8CF2=>bǎo +8CF3=>zāi +8CF4=>lài +8CF5=>fèng +8CF6=>càng +8CF7=>jī +8CF8=>shèng +8CF9=>yì +8CFA=>zhuàn +8CFB=>fù +8CFC=>gòu +8CFD=>sài +8CFE=>zé +8CFF=>liáo +8D00=>yì +8D01=>bài +8D02=>chěn +8D03=>wàn +8D04=>zhì +8D05=>zhuì +8D06=>biāo +8D07=>yūn +8D08=>zèng +8D09=>dàn +8D0A=>zàn +8D0B=>yàn +8D0C=>pu +8D0D=>shàn +8D0E=>wàn +8D0F=>yíng +8D10=>jìn +8D11=>gàn +8D12=>xián +8D13=>zāng +8D14=>bì +8D15=>dú +8D16=>shú +8D17=>yàn +8D18=>shǎng +8D19=>xuàn +8D1A=>lòng +8D1B=>gàn +8D1C=>zāng +8D1D=>bèi +8D1E=>zhēn +8D1F=>fù +8D20=>yuán +8D21=>gòng +8D22=>cái +8D23=>zé +8D24=>xián +8D25=>bài +8D26=>zhàng +8D27=>huò +8D28=>zhì +8D29=>fàn +8D2A=>tān +8D2B=>pín +8D2C=>biǎn +8D2D=>gòu +8D2E=>zhù +8D2F=>guàn +8D30=>èr +8D31=>jiàn +8D32=>bēn +8D33=>shì +8D34=>tiē +8D35=>guì +8D36=>kuàng +8D37=>dài +8D38=>mào +8D39=>fèi +8D3A=>hè +8D3B=>yí +8D3C=>zéi +8D3D=>zhì +8D3E=>jiǎ +8D3F=>huì +8D40=>zī +8D41=>lìn +8D42=>lù +8D43=>zāng +8D44=>zī +8D45=>gāi +8D46=>jìn +8D47=>qiú +8D48=>zhèn +8D49=>lài +8D4A=>shē +8D4B=>fù +8D4C=>dǔ +8D4D=>jī +8D4E=>shú +8D4F=>shǎng +8D50=>cì +8D51=>bì +8D52=>zhōu +8D53=>gēng +8D54=>péi +8D55=>dǎn +8D56=>lài +8D57=>fèng +8D58=>zhuì +8D59=>fù +8D5A=>zhuàn +8D5B=>sài +8D5C=>zé +8D5D=>yàn +8D5E=>zàn +8D5F=>yūn +8D60=>zèng +8D61=>shàn +8D62=>yíng +8D63=>gàn +8D64=>chì +8D65=>xī +8D66=>shè +8D67=>nǎn +8D68=>tóng +8D69=>xì +8D6A=>chēng +8D6B=>hè +8D6C=>chēng +8D6D=>zhě +8D6E=>xiá +8D6F=>táng +8D70=>zǒu +8D71=>zǒu +8D72=>lì +8D73=>jiū +8D74=>fù +8D75=>zhào +8D76=>gǎn +8D77=>qǐ +8D78=>shàn +8D79=>qióng +8D7A=>yǐn +8D7B=>xiǎn +8D7C=>cī +8D7D=>jué +8D7E=>qǐn +8D7F=>chí +8D80=>cī +8D81=>chèn +8D82=>chèn +8D83=>dié +8D84=>jū +8D85=>chāo +8D86=>dī +8D87=>xì +8D88=>zhān +8D89=>jué +8D8A=>yuè +8D8B=>qū +8D8C=>jí +8D8D=>chí +8D8E=>chú +8D8F=>guā +8D90=>xuè +8D91=>zī +8D92=>tiáo +8D93=>duǒ +8D94=>liè +8D95=>gǎn +8D96=>suō +8D97=>cù +8D98=>xí +8D99=>zhào +8D9A=>sù +8D9B=>yǐn +8D9C=>jú +8D9D=>jiàn +8D9E=>què +8D9F=>tàng +8DA0=>chuò +8DA1=>cuǐ +8DA2=>lù +8DA3=>qù +8DA4=>dàng +8DA5=>qiū +8DA6=>zī +8DA7=>tí +8DA8=>qū +8DA9=>chì +8DAA=>huáng +8DAB=>qiáo +8DAC=>qiāo +8DAD=>jiào +8DAE=>zào +8DAF=>tì +8DB0=>ěr +8DB1=>zǎn +8DB2=>zǎn +8DB3=>zú +8DB4=>pā +8DB5=>bào +8DB6=>kù +8DB7=>kē +8DB8=>dǔn +8DB9=>jué +8DBA=>fū +8DBB=>chěn +8DBC=>jiǎn +8DBD=>fàng +8DBE=>zhǐ +8DBF=>tā +8DC0=>yuè +8DC1=>bà +8DC2=>qí +8DC3=>yuè +8DC4=>qiāng +8DC5=>tuò +8DC6=>tái +8DC7=>yì +8DC8=>niǎn +8DC9=>líng +8DCA=>mèi +8DCB=>bá +8DCC=>diē +8DCD=>kū +8DCE=>tuó +8DCF=>jiā +8DD0=>cī +8DD1=>pǎo +8DD2=>qiǎ +8DD3=>zhù +8DD4=>jū +8DD5=>diǎn +8DD6=>zhí +8DD7=>fū +8DD8=>pán +8DD9=>jù +8DDA=>shān +8DDB=>bǒ +8DDC=>ní +8DDD=>jù +8DDE=>lì +8DDF=>gēn +8DE0=>yí +8DE1=>jī +8DE2=>duò +8DE3=>xiǎn +8DE4=>jiāo +8DE5=>duò +8DE6=>zhū +8DE7=>quán +8DE8=>kuà +8DE9=>zhuǎi +8DEA=>guì +8DEB=>qióng +8DEC=>kuǐ +8DED=>xiáng +8DEE=>chì +8DEF=>lù +8DF0=>pián +8DF1=>zhì +8DF2=>jiá +8DF3=>tiào +8DF4=>cǎi +8DF5=>jiàn +8DF6=>tà +8DF7=>qiāo +8DF8=>bì +8DF9=>xiān +8DFA=>duò +8DFB=>jī +8DFC=>jú +8DFD=>jì +8DFE=>shū +8DFF=>tú +8E00=>chù +8E01=>jìng +8E02=>niè +8E03=>xiāo +8E04=>bù +8E05=>xué +8E06=>cūn +8E07=>mǔ +8E08=>shū +8E09=>liáng +8E0A=>yǒng +8E0B=>jiǎo +8E0C=>chóu +8E0D=>qiāo +8E0E=>móu +8E0F=>tà +8E10=>jiàn +8E11=>qí +8E12=>wō +8E13=>wěi +8E14=>chuō +8E15=>jié +8E16=>jí +8E17=>niè +8E18=>jū +8E19=>jū +8E1A=>lún +8E1B=>lù +8E1C=>lèng +8E1D=>huái +8E1E=>jù +8E1F=>chí +8E20=>wǎn +8E21=>quán +8E22=>tī +8E23=>bó +8E24=>zú +8E25=>qiè +8E26=>yǐ +8E27=>cù +8E28=>zōng +8E29=>cǎi +8E2A=>zōng +8E2B=>pèng +8E2C=>zhì +8E2D=>zhēng +8E2E=>diǎn +8E2F=>zhí +8E30=>yú +8E31=>duó +8E32=>dùn +8E33=>chuǎn +8E34=>yǒng +8E35=>zhǒng +8E36=>dì +8E37=>zhǎ +8E38=>chěn +8E39=>chuài +8E3A=>jiàn +8E3B=>guā +8E3C=>táng +8E3D=>jǔ +8E3E=>fú +8E3F=>zú +8E40=>dié +8E41=>pián +8E42=>róu +8E43=>nuò +8E44=>tí +8E45=>chǎ +8E46=>tuǐ +8E47=>jiǎn +8E48=>dǎo +8E49=>cuō +8E4A=>qī +8E4B=>tà +8E4C=>qiāng +8E4D=>niǎn +8E4E=>diān +8E4F=>tí +8E50=>jí +8E51=>niè +8E52=>pán +8E53=>liū +8E54=>zàn +8E55=>bì +8E56=>chōng +8E57=>lù +8E58=>liáo +8E59=>cù +8E5A=>tāng +8E5B=>dài +8E5C=>sù +8E5D=>xǐ +8E5E=>kuǐ +8E5F=>jī +8E60=>zhí +8E61=>qiāng +8E62=>dí +8E63=>pán +8E64=>zōng +8E65=>lián +8E66=>bèng +8E67=>zāo +8E68=>niǎn +8E69=>bié +8E6A=>tuí +8E6B=>jú +8E6C=>dēng +8E6D=>cèng +8E6E=>xiān +8E6F=>fán +8E70=>chú +8E71=>zhōng +8E72=>dūn +8E73=>bō +8E74=>cù +8E75=>cù +8E76=>jué +8E77=>jué +8E78=>lìn +8E79=>tá +8E7A=>qiāo +8E7B=>juē +8E7C=>pǔ +8E7D=>liāo +8E7E=>dūn +8E7F=>cuān +8E80=>kuàng +8E81=>zào +8E82=>dá +8E83=>bì +8E84=>bì +8E85=>zhú +8E86=>jù +8E87=>chú +8E88=>qiào +8E89=>dǔn +8E8A=>chóu +8E8B=>jī +8E8C=>wǔ +8E8D=>yuè +8E8E=>niǎn +8E8F=>lìn +8E90=>liè +8E91=>zhí +8E92=>lì +8E93=>zhì +8E94=>chán +8E95=>chú +8E96=>duàn +8E97=>wèi +8E98=>lóng +8E99=>lìn +8E9A=>xiān +8E9B=>wèi +8E9C=>zuān +8E9D=>lán +8E9E=>xiè +8E9F=>ráng +8EA0=>sǎ +8EA1=>niè +8EA2=>tà +8EA3=>qú +8EA4=>jiè +8EA5=>cuān +8EA6=>cuó +8EA7=>xǐ +8EA8=>kuí +8EA9=>jué +8EAA=>lìn +8EAB=>shēn +8EAC=>gōng +8EAD=>dān +8EAE=>fen +8EAF=>qū +8EB0=>tǐ +8EB1=>duǒ +8EB2=>duǒ +8EB3=>gōng +8EB4=>láng +8EB5=>ren +8EB6=>luǒ +8EB7=>ǎi +8EB8=>jī +8EB9=>jú +8EBA=>tǎng +8EBB=>kong +8EBC=>lào +8EBD=>yǎn +8EBE=>mei +8EBF=>kāng +8EC0=>qū +8EC1=>lóu +8EC2=>lào +8EC3=>duǒ +8EC4=>zhí +8EC5=>yan +8EC6=>tǐ +8EC7=>dào +8EC8=>ying +8EC9=>yù +8ECA=>chē +8ECB=>yà +8ECC=>guǐ +8ECD=>jūn +8ECE=>wèi +8ECF=>yuè +8ED0=>xìn +8ED1=>dài +8ED2=>xuān +8ED3=>fàn +8ED4=>rèn +8ED5=>shān +8ED6=>kuáng +8ED7=>shū +8ED8=>tún +8ED9=>chén +8EDA=>dài +8EDB=>è +8EDC=>nà +8EDD=>qí +8EDE=>máo +8EDF=>ruǎn +8EE0=>rèn +8EE1=>qián +8EE2=>zhuǎn +8EE3=>hōng +8EE4=>hū +8EE5=>qú +8EE6=>kuàng +8EE7=>dǐ +8EE8=>líng +8EE9=>dài +8EEA=>āo +8EEB=>zhěn +8EEC=>fàn +8EED=>kuāng +8EEE=>yǎng +8EEF=>pēng +8EF0=>bèi +8EF1=>gū +8EF2=>gū +8EF3=>páo +8EF4=>zhù +8EF5=>rǒng +8EF6=>è +8EF7=>bá +8EF8=>zhóu +8EF9=>zhǐ +8EFA=>yáo +8EFB=>kē +8EFC=>yì +8EFD=>zhì +8EFE=>shì +8EFF=>píng +8F00=>ér +8F01=>gǒng +8F02=>jú +8F03=>jiào +8F04=>guāng +8F05=>hé +8F06=>kǎi +8F07=>quán +8F08=>zhōu +8F09=>zài +8F0A=>zhì +8F0B=>shē +8F0C=>liàng +8F0D=>yù +8F0E=>shāo +8F0F=>yóu +8F10=>wàn +8F11=>yǐn +8F12=>zhé +8F13=>wǎn +8F14=>fǔ +8F15=>qīng +8F16=>zhōu +8F17=>ní +8F18=>léng +8F19=>zhé +8F1A=>zhàn +8F1B=>liàng +8F1C=>zī +8F1D=>huī +8F1E=>wǎng +8F1F=>chuò +8F20=>guǒ +8F21=>kǎn +8F22=>yǐ +8F23=>péng +8F24=>qiàn +8F25=>gǔn +8F26=>niǎn +8F27=>píng +8F28=>guǎn +8F29=>bèi +8F2A=>lún +8F2B=>pái +8F2C=>liáng +8F2D=>ruǎn +8F2E=>róu +8F2F=>ji +8F30=>yáng +8F31=>xián +8F32=>chuán +8F33=>còu +8F34=>chūn +8F35=>gé +8F36=>yóu +8F37=>hōng +8F38=>shū +8F39=>fù +8F3A=>zī +8F3B=>fú +8F3C=>wēn +8F3D=>bèn +8F3E=>zhǎn +8F3F=>yú +8F40=>wēn +8F41=>tāo +8F42=>gǔ +8F43=>zhēn +8F44=>xiá +8F45=>yuán +8F46=>lù +8F47=>jiāo +8F48=>cháo +8F49=>zhuǎn +8F4A=>wèi +8F4B=>hún +8F4C=>xue +8F4D=>zhé +8F4E=>jiào +8F4F=>zhàn +8F50=>bú +8F51=>lǎo +8F52=>fén +8F53=>fān +8F54=>lín +8F55=>gé +8F56=>sè +8F57=>kǎn +8F58=>huán +8F59=>yǐ +8F5A=>jí +8F5B=>zhuì +8F5C=>ér +8F5D=>yù +8F5E=>jiàn +8F5F=>hōng +8F60=>léi +8F61=>pèi +8F62=>lì +8F63=>lì +8F64=>lú +8F65=>lìn +8F66=>chē +8F67=>yà +8F68=>guǐ +8F69=>xuān +8F6A=>dài +8F6B=>rèn +8F6C=>zhuǎn +8F6D=>è +8F6E=>lún +8F6F=>ruǎn +8F70=>hōng +8F71=>gū +8F72=>kē +8F73=>lú +8F74=>zhóu +8F75=>zhǐ +8F76=>yì +8F77=>hū +8F78=>zhěn +8F79=>lì +8F7A=>yáo +8F7B=>qīng +8F7C=>shì +8F7D=>zài +8F7E=>zhì +8F7F=>jiào +8F80=>zhōu +8F81=>quán +8F82=>lù +8F83=>jiào +8F84=>zhé +8F85=>fǔ +8F86=>liàng +8F87=>niǎn +8F88=>bèi +8F89=>huī +8F8A=>gǔn +8F8B=>wǎng +8F8C=>liáng +8F8D=>chuò +8F8E=>zī +8F8F=>còu +8F90=>fú +8F91=>ji +8F92=>wēn +8F93=>shū +8F94=>pèi +8F95=>yuán +8F96=>xiá +8F97=>niǎn +8F98=>lù +8F99=>zhé +8F9A=>lín +8F9B=>xīn +8F9C=>gū +8F9D=>cí +8F9E=>cí +8F9F=>pì +8FA0=>zuì +8FA1=>biàn +8FA2=>là +8FA3=>là +8FA4=>cí +8FA5=>xuē +8FA6=>bàn +8FA7=>biàn +8FA8=>biàn +8FA9=>biàn +8FAA=>xuē +8FAB=>biàn +8FAC=>bān +8FAD=>cí +8FAE=>biàn +8FAF=>biàn +8FB0=>chén +8FB1=>rǔ +8FB2=>nóng +8FB3=>nóng +8FB4=>chǎn +8FB5=>chuò +8FB6=>chuò +8FB7=>yi +8FB8=>réng +8FB9=>biān +8FBA=>biān +8FBB=>shí +8FBC=>ru +8FBD=>liáo +8FBE=>dá +8FBF=>chān +8FC0=>gān +8FC1=>qiān +8FC2=>yū +8FC3=>yū +8FC4=>qì +8FC5=>xùn +8FC6=>yí +8FC7=>guò +8FC8=>mài +8FC9=>qī +8FCA=>zā +8FCB=>wàng +8FCC=>tù +8FCD=>zhūn +8FCE=>yíng +8FCF=>tì +8FD0=>yùn +8FD1=>jìn +8FD2=>háng +8FD3=>yà +8FD4=>fǎn +8FD5=>wù +8FD6=>dá +8FD7=>é +8FD8=>hái +8FD9=>zhè +8FDA=>zhong +8FDB=>jìn +8FDC=>yuǎn +8FDD=>wéi +8FDE=>lián +8FDF=>chí +8FE0=>chè +8FE1=>nì +8FE2=>tiáo +8FE3=>zhì +8FE4=>yí +8FE5=>jiǒng +8FE6=>jiā +8FE7=>chén +8FE8=>dài +8FE9=>ěr +8FEA=>dí +8FEB=>pò +8FEC=>zhù +8FED=>dié +8FEE=>zé +8FEF=>táo +8FF0=>shù +8FF1=>tuó +8FF2=>qu +8FF3=>jìng +8FF4=>huí +8FF5=>dòng +8FF6=>yòu +8FF7=>mí +8FF8=>bèng +8FF9=>jī +8FFA=>nǎi +8FFB=>yí +8FFC=>jié +8FFD=>zhuī +8FFE=>liè +8FFF=>xùn +9000=>tuì +9001=>sòng +9002=>shì +9003=>táo +9004=>páng +9005=>hòu +9006=>nì +9007=>dùn +9008=>jiǒng +9009=>xuǎn +900A=>xùn +900B=>bū +900C=>yōu +900D=>xiāo +900E=>qiú +900F=>tòu +9010=>zhú +9011=>qiú +9012=>dì +9013=>dì +9014=>tú +9015=>jìng +9016=>tì +9017=>dòu +9018=>yǐ +9019=>zhè +901A=>tōng +901B=>guàng +901C=>wù +901D=>shì +901E=>chěng +901F=>sù +9020=>zào +9021=>qūn +9022=>féng +9023=>lián +9024=>suò +9025=>huí +9026=>lǐ +9027=>gu +9028=>lái +9029=>bèn +902A=>cuò +902B=>jué +902C=>bèng +902D=>huàn +902E=>dǎi +902F=>lù +9030=>yóu +9031=>zhōu +9032=>jìn +9033=>yù +9034=>chuō +9035=>kuí +9036=>wēi +9037=>tì +9038=>yì +9039=>dá +903A=>yuǎn +903B=>luó +903C=>bī +903D=>nuò +903E=>yú +903F=>dàng +9040=>suí +9041=>dùn +9042=>suì +9043=>yǎn +9044=>chuán +9045=>chí +9046=>tí +9047=>yù +9048=>shí +9049=>zhēn +904A=>yóu +904B=>yùn +904C=>è +904D=>biàn +904E=>guò +904F=>è +9050=>xiá +9051=>huáng +9052=>qiú +9053=>dào +9054=>dá +9055=>wéi +9056=>nan +9057=>yí +9058=>gòu +9059=>yáo +905A=>chòu +905B=>liú +905C=>xùn +905D=>tà +905E=>dì +905F=>chí +9060=>yuǎn +9061=>sù +9062=>tà +9063=>qiǎn +9064=>ma +9065=>yáo +9066=>guàn +9067=>zhāng +9068=>áo +9069=>shì +906A=>cà +906B=>chì +906C=>sù +906D=>zāo +906E=>zhē +906F=>dùn +9070=>dì +9071=>lóu +9072=>chí +9073=>cuō +9074=>lín +9075=>zūn +9076=>rào +9077=>qiān +9078=>xuǎn +9079=>yù +907A=>yí +907B=>wù +907C=>liáo +907D=>jù +907E=>shì +907F=>bì +9080=>yāo +9081=>mài +9082=>xiè +9083=>suì +9084=>hái +9085=>zhān +9086=>téng +9087=>ěr +9088=>miǎo +9089=>biān +908A=>biān +908B=>lā +908C=>lí +908D=>yuán +908E=>yáo +908F=>luó +9090=>lǐ +9091=>yì +9092=>tíng +9093=>dèng +9094=>qǐ +9095=>yōng +9096=>shān +9097=>hán +9098=>yú +9099=>máng +909A=>rú +909B=>qióng +909C=>wan +909D=>kuàng +909E=>fū +909F=>kàng +90A0=>bīn +90A1=>fāng +90A2=>xíng +90A3=>nà +90A4=>xīn +90A5=>shěn +90A6=>bāng +90A7=>yuán +90A8=>cūn +90A9=>huǒ +90AA=>xié +90AB=>bāng +90AC=>wū +90AD=>jù +90AE=>yóu +90AF=>hán +90B0=>tái +90B1=>qiū +90B2=>bì +90B3=>pī +90B4=>bǐng +90B5=>shào +90B6=>bèi +90B7=>wǎ +90B8=>dǐ +90B9=>zōu +90BA=>yè +90BB=>lín +90BC=>kuāng +90BD=>guī +90BE=>zhū +90BF=>shī +90C0=>kū +90C1=>yù +90C2=>gāi +90C3=>hé +90C4=>qiè +90C5=>zhì +90C6=>jí +90C7=>huán +90C8=>hòu +90C9=>xíng +90CA=>jiāo +90CB=>xí +90CC=>guī +90CD=>nuó +90CE=>láng +90CF=>jiá +90D0=>kuài +90D1=>zhèng +90D2=>lang +90D3=>yùn +90D4=>yán +90D5=>chéng +90D6=>dòu +90D7=>xī +90D8=>lǘ +90D9=>fǔ +90DA=>wú +90DB=>fú +90DC=>gào +90DD=>hǎo +90DE=>láng +90DF=>jiá +90E0=>gěng +90E1=>jùn +90E2=>yǐng +90E3=>bó +90E4=>xì +90E5=>bèi +90E6=>lì +90E7=>yún +90E8=>bù +90E9=>xiáo +90EA=>qī +90EB=>pí +90EC=>qīng +90ED=>guō +90EE=>zhōu +90EF=>tán +90F0=>zōu +90F1=>píng +90F2=>lái +90F3=>ní +90F4=>chēn +90F5=>yóu +90F6=>bù +90F7=>xiāng +90F8=>dān +90F9=>jú +90FA=>yōng +90FB=>qiāo +90FC=>yī +90FD=>dōu +90FE=>yǎn +90FF=>méi +9100=>ruò +9101=>bèi +9102=>è +9103=>shū +9104=>juàn +9105=>yǔ +9106=>yùn +9107=>hóu +9108=>kuí +9109=>xiāng +910A=>xiāng +910B=>sōu +910C=>táng +910D=>míng +910E=>xī +910F=>rǔ +9110=>chù +9111=>zī +9112=>zōu +9113=>yè +9114=>wū +9115=>xiāng +9116=>yún +9117=>hào +9118=>yōng +9119=>bǐ +911A=>mào +911B=>cháo +911C=>fū +911D=>liǎo +911E=>yín +911F=>zhuān +9120=>hù +9121=>qiāo +9122=>yān +9123=>zhāng +9124=>màn +9125=>qiāo +9126=>xǔ +9127=>dèng +9128=>bì +9129=>xún +912A=>bì +912B=>zēng +912C=>wéi +912D=>zhèng +912E=>mào +912F=>shàn +9130=>lín +9131=>pó +9132=>dān +9133=>méng +9134=>yè +9135=>cào +9136=>kuài +9137=>fēng +9138=>méng +9139=>zōu +913A=>kuàng +913B=>liǎn +913C=>zàn +913D=>chán +913E=>yōu +913F=>jī +9140=>yàn +9141=>chán +9142=>cuó +9143=>líng +9144=>huān +9145=>xī +9146=>fēng +9147=>zàn +9148=>lì +9149=>yǒu +914A=>dīng +914B=>qiú +914C=>zhuó +914D=>pèi +914E=>zhòu +914F=>yǐ +9150=>gān +9151=>yú +9152=>jiǔ +9153=>yǎn +9154=>zuì +9155=>máo +9156=>zhèn +9157=>xù +9158=>dòu +9159=>zhēn +915A=>fēn +915B=>yuan +915C=>fu +915D=>yùn +915E=>tài +915F=>tiān +9160=>qiǎ +9161=>tuó +9162=>cù +9163=>hān +9164=>gū +9165=>sū +9166=>fā +9167=>chóu +9168=>zài +9169=>mǐng +916A=>lào +916B=>chuò +916C=>chou +916D=>yòu +916E=>tóng +916F=>zhǐ +9170=>xiān +9171=>jiàng +9172=>chéng +9173=>yìn +9174=>tú +9175=>jiào +9176=>méi +9177=>kù +9178=>suān +9179=>lèi +917A=>pú +917B=>zuì +917C=>hǎi +917D=>yàn +917E=>shāi +917F=>niàng +9180=>wéi +9181=>lù +9182=>lǎn +9183=>yān +9184=>táo +9185=>pēi +9186=>zhǎn +9187=>chún +9188=>tán +9189=>zuì +918A=>zhuì +918B=>cù +918C=>kūn +918D=>tí +918E=>xián +918F=>dū +9190=>hú +9191=>xǔ +9192=>xǐng +9193=>tǎn +9194=>qiú +9195=>chún +9196=>yùn +9197=>pò +9198=>kē +9199=>sōu +919A=>mí +919B=>quán +919C=>chǒu +919D=>cuō +919E=>yùn +919F=>yòng +91A0=>àng +91A1=>zhà +91A2=>hǎi +91A3=>táng +91A4=>jiàng +91A5=>piǎo +91A6=>chěn +91A7=>yù +91A8=>lí +91A9=>zāo +91AA=>láo +91AB=>yī +91AC=>jiàng +91AD=>bú +91AE=>jiào +91AF=>xī +91B0=>tán +91B1=>fā +91B2=>nóng +91B3=>yì +91B4=>lǐ +91B5=>jù +91B6=>yàn +91B7=>yì +91B8=>niàng +91B9=>rú +91BA=>xūn +91BB=>chóu +91BC=>yàn +91BD=>líng +91BE=>mí +91BF=>mí +91C0=>niàng +91C1=>xìn +91C2=>jiào +91C3=>shāi +91C4=>mí +91C5=>yàn +91C6=>biàn +91C7=>cǎi +91C8=>shì +91C9=>yòu +91CA=>shì +91CB=>shì +91CC=>lǐ +91CD=>zhòng +91CE=>yě +91CF=>liàng +91D0=>lí +91D1=>jīn +91D2=>jin +91D3=>qiú +91D4=>yǐ +91D5=>liǎo +91D6=>dāo +91D7=>zhāo +91D8=>dīng +91D9=>pò +91DA=>qiú +91DB=>bā +91DC=>fǔ +91DD=>zhēn +91DE=>zhí +91DF=>bā +91E0=>luàn +91E1=>fǔ +91E2=>nǎi +91E3=>diào +91E4=>shàn +91E5=>qiǎo +91E6=>kòu +91E7=>chuàn +91E8=>zǐ +91E9=>fǎn +91EA=>huá +91EB=>huá +91EC=>hàn +91ED=>gāng +91EE=>qí +91EF=>máng +91F0=>rì +91F1=>dì +91F2=>sì +91F3=>xì +91F4=>yì +91F5=>chāi +91F6=>shī +91F7=>tǔ +91F8=>xī +91F9=>nǚ +91FA=>qiān +91FB=>qiu +91FC=>jiàn +91FD=>pì +91FE=>yé +91FF=>jīn +9200=>bǎ +9201=>fāng +9202=>chén +9203=>xíng +9204=>dǒu +9205=>yuè +9206=>qiān +9207=>fū +9208=>pī +9209=>nà +920A=>xīn +920B=>é +920C=>jué +920D=>dùn +920E=>gōu +920F=>yǐn +9210=>qián +9211=>bǎn +9212=>sà +9213=>rén +9214=>chāo +9215=>niǔ +9216=>fēn +9217=>yǔn +9218=>jǐ +9219=>qín +921A=>pī +921B=>guō +921C=>hóng +921D=>yín +921E=>jūn +921F=>shī +9220=>yì +9221=>zhōng +9222=>xǐ +9223=>gài +9224=>rì +9225=>huǒ +9226=>tài +9227=>kàng +9228=>yuan +9229=>lu +922A=>è +922B=>wen +922C=>duó +922D=>zī +922E=>nǐ +922F=>tú +9230=>shì +9231=>mín +9232=>gū +9233=>kē +9234=>líng +9235=>bǐng +9236=>sì +9237=>gǔ +9238=>bó +9239=>pī +923A=>yù +923B=>sì +923C=>zuó +923D=>bū +923E=>yóu +923F=>tián +9240=>jiǎ +9241=>zhēn +9242=>shǐ +9243=>shì +9244=>zhí +9245=>jù +9246=>chān +9247=>shī +9248=>shī +9249=>xuàn +924A=>zhāo +924B=>bào +924C=>hé +924D=>bì +924E=>shēng +924F=>chú +9250=>shí +9251=>bó +9252=>zhù +9253=>chì +9254=>zā +9255=>pō +9256=>tóng +9257=>qián +9258=>fú +9259=>zhǎi +925A=>liǔ +925B=>qiān +925C=>fú +925D=>lì +925E=>yuè +925F=>pī +9260=>yāng +9261=>bàn +9262=>bō +9263=>jié +9264=>gōu +9265=>shù +9266=>zhēng +9267=>mǔ +9268=>xǐ +9269=>xǐ +926A=>dì +926B=>jiā +926C=>mù +926D=>tǎn +926E=>huán +926F=>yǐ +9270=>sī +9271=>kuàng +9272=>kǎ +9273=>běi +9274=>jiàn +9275=>tóng +9276=>xíng +9277=>hóng +9278=>jiǎo +9279=>chǐ +927A=>èr +927B=>luò +927C=>bǐng +927D=>shì +927E=>móu +927F=>jiā +9280=>yín +9281=>jūn +9282=>zhōu +9283=>chòng +9284=>xiǎng +9285=>tóng +9286=>mò +9287=>lèi +9288=>jī +9289=>yù +928A=>xù +928B=>rén +928C=>zùn +928D=>zhì +928E=>qióng +928F=>shàn +9290=>chì +9291=>xiǎn +9292=>xíng +9293=>quán +9294=>pī +9295=>tiě +9296=>zhū +9297=>xiàng +9298=>míng +9299=>kuǎ +929A=>yáo +929B=>xiān +929C=>xián +929D=>xiū +929E=>jūn +929F=>chā +92A0=>lǎo +92A1=>jí +92A2=>pǐ +92A3=>rú +92A4=>mǐ +92A5=>yī +92A6=>yīn +92A7=>guāng +92A8=>ǎn +92A9=>diū +92AA=>yǒu +92AB=>sè +92AC=>kào +92AD=>qián +92AE=>luán +92AF=>si +92B0=>āi +92B1=>diào +92B2=>hàn +92B3=>ruì +92B4=>shì +92B5=>kēng +92B6=>qiú +92B7=>xiāo +92B8=>zhé +92B9=>xiù +92BA=>zàng +92BB=>tí +92BC=>cuò +92BD=>guā +92BE=>hòng +92BF=>zhōng +92C0=>tōu +92C1=>lǚ +92C2=>méi +92C3=>láng +92C4=>wǎn +92C5=>xīn +92C6=>yún +92C7=>bèi +92C8=>wù +92C9=>sù +92CA=>yù +92CB=>chán +92CC=>dìng +92CD=>bó +92CE=>hàn +92CF=>jiá +92D0=>hóng +92D1=>cuān +92D2=>fēng +92D3=>chān +92D4=>wǎn +92D5=>zhì +92D6=>sī +92D7=>xuān +92D8=>huá +92D9=>yǔ +92DA=>tiáo +92DB=>gǒng +92DC=>zhuó +92DD=>lüè +92DE=>xíng +92DF=>qǐn +92E0=>shèn +92E1=>hán +92E2=>lüè +92E3=>yé +92E4=>chú +92E5=>zèng +92E6=>jū +92E7=>xiàn +92E8=>tiě +92E9=>máng +92EA=>pù +92EB=>lí +92EC=>pàn +92ED=>ruì +92EE=>chéng +92EF=>gào +92F0=>lǐ +92F1=>tè +92F2=>bing +92F3=>zhù +92F4=>zhen +92F5=>tū +92F6=>liǔ +92F7=>zuì +92F8=>jù +92F9=>chǎng +92FA=>yuǎn +92FB=>jiàn +92FC=>gāng +92FD=>diào +92FE=>táo +92FF=>cháng +9300=>lún +9301=>guǒ +9302=>líng +9303=>bēi +9304=>lù +9305=>lí +9306=>qiāng +9307=>póu +9308=>juǎn +9309=>mín +930A=>zuì +930B=>péng +930C=>àn +930D=>pī +930E=>xiàn +930F=>yā +9310=>zhuī +9311=>lèi +9312=>kē +9313=>kōng +9314=>tà +9315=>kūn +9316=>dú +9317=>nèi +9318=>chuí +9319=>zī +931A=>zhēng +931B=>bēn +931C=>niè +931D=>zòng +931E=>chún +931F=>tán +9320=>dìng +9321=>qí +9322=>qián +9323=>zhuì +9324=>jī +9325=>yù +9326=>jǐn +9327=>guǎn +9328=>máo +9329=>chāng +932A=>tiǎn +932B=>xī +932C=>liàn +932D=>táo +932E=>gù +932F=>cuò +9330=>shù +9331=>zhēn +9332=>lù +9333=>měng +9334=>lù +9335=>huā +9336=>biǎo +9337=>gá +9338=>lái +9339=>kěn +933A=>fang +933B=>wu +933C=>nài +933D=>wàn +933E=>zàn +933F=>hu +9340=>dé +9341=>xiān +9342=>piān +9343=>huō +9344=>liàng +9345=>fa +9346=>mén +9347=>kǎi +9348=>yīng +9349=>dī +934A=>liàn +934B=>guō +934C=>xiǎn +934D=>dù +934E=>tú +934F=>wéi +9350=>zōng +9351=>fù +9352=>róu +9353=>jí +9354=>è +9355=>jūn +9356=>chěn +9357=>tí +9358=>zhá +9359=>hù +935A=>yáng +935B=>duàn +935C=>xiá +935D=>yú +935E=>kēng +935F=>xīng +9360=>huáng +9361=>wěi +9362=>fù +9363=>zhāo +9364=>chā +9365=>qiè +9366=>shī +9367=>hōng +9368=>kuí +9369=>tiǎn +936A=>móu +936B=>qiāo +936C=>qiāo +936D=>hóu +936E=>tōu +936F=>cōng +9370=>huán +9371=>yè +9372=>mín +9373=>jiàn +9374=>duān +9375=>jiàn +9376=>sōng +9377=>kuí +9378=>hú +9379=>xuān +937A=>duǒ +937B=>jié +937C=>zhēn +937D=>biān +937E=>zhōng +937F=>zī +9380=>xiū +9381=>yé +9382=>měi +9383=>pài +9384=>āi +9385=>jiè +9386=>qian +9387=>méi +9388=>suǒ +9389=>dá +938A=>bàng +938B=>xiá +938C=>lián +938D=>suǒ +938E=>kài +938F=>liú +9390=>yáo +9391=>yè +9392=>nòu +9393=>wēng +9394=>róng +9395=>táng +9396=>suǒ +9397=>qiāng +9398=>lì +9399=>shuò +939A=>chuí +939B=>bó +939C=>pán +939D=>dā +939E=>bī +939F=>sǎng +93A0=>gāng +93A1=>zī +93A2=>wū +93A3=>yíng +93A4=>huàng +93A5=>tiáo +93A6=>liú +93A7=>kǎi +93A8=>sǔn +93A9=>shā +93AA=>sōu +93AB=>wàn +93AC=>hào +93AD=>zhèn +93AE=>zhèn +93AF=>láng +93B0=>yì +93B1=>yuán +93B2=>tǎng +93B3=>niè +93B4=>xí +93B5=>jiā +93B6=>gē +93B7=>mǎ +93B8=>juān +93B9=>song +93BA=>zu +93BB=>suǒ +93BC=>xià +93BD=>feng +93BE=>wen +93BF=>ná +93C0=>lǔ +93C1=>suǒ +93C2=>ōu +93C3=>zú +93C4=>tuán +93C5=>xiū +93C6=>guàn +93C7=>xuàn +93C8=>liàn +93C9=>shòu +93CA=>ào +93CB=>mǎn +93CC=>mò +93CD=>luó +93CE=>bì +93CF=>wèi +93D0=>liú +93D1=>dí +93D2=>sǎn +93D3=>zǒng +93D4=>yí +93D5=>lù +93D6=>áo +93D7=>kēng +93D8=>qiāng +93D9=>cuī +93DA=>qī +93DB=>cháng +93DC=>tāng +93DD=>màn +93DE=>yōng +93DF=>chǎn +93E0=>fēng +93E1=>jìng +93E2=>biāo +93E3=>shù +93E4=>lòu +93E5=>xiù +93E6=>cōng +93E7=>lóng +93E8=>zàn +93E9=>jiàn +93EA=>cáo +93EB=>lí +93EC=>xià +93ED=>xī +93EE=>kāng +93EF=>shuang +93F0=>bèng +93F1=>zhang +93F2=>qian +93F3=>chēng +93F4=>lù +93F5=>huá +93F6=>jí +93F7=>pú +93F8=>huì +93F9=>qiǎng +93FA=>pō +93FB=>lín +93FC=>sè +93FD=>xiù +93FE=>sǎn +93FF=>chēng +9400=>kuì +9401=>sī +9402=>liù +9403=>náo +9404=>huáng +9405=>piě +9406=>suì +9407=>fán +9408=>qiáo +9409=>quān +940A=>yáng +940B=>tāng +940C=>xiàng +940D=>jué +940E=>jiāo +940F=>zūn +9410=>liáo +9411=>qiè +9412=>láo +9413=>duì +9414=>xín +9415=>zān +9416=>jī +9417=>jiǎn +9418=>zhōng +9419=>dèng +941A=>yā +941B=>yìng +941C=>duī +941D=>jué +941E=>nòu +941F=>zān +9420=>pǔ +9421=>tiě +9422=>fán +9423=>zhang +9424=>dǐng +9425=>shàn +9426=>kāi +9427=>jiān +9428=>fèi +9429=>suì +942A=>lǔ +942B=>juān +942C=>huì +942D=>yù +942E=>lián +942F=>zhuó +9430=>qiāo +9431=>jiàn +9432=>zhuó +9433=>léi +9434=>bì +9435=>tiě +9436=>huán +9437=>yè +9438=>duó +9439=>guǒ +943A=>dang +943B=>jù +943C=>fén +943D=>dá +943E=>bèi +943F=>yì +9440=>ài +9441=>zōng +9442=>xùn +9443=>diào +9444=>zhù +9445=>héng +9446=>zhuì +9447=>jī +9448=>niè +9449=>hé +944A=>huò +944B=>qīng +944C=>bīn +944D=>yīng +944E=>kuì +944F=>níng +9450=>xū +9451=>jiàn +9452=>jiàn +9453=>qian +9454=>chǎ +9455=>zhì +9456=>miè +9457=>lí +9458=>léi +9459=>jī +945A=>zuàn +945B=>kuàng +945C=>shǎng +945D=>péng +945E=>là +945F=>dú +9460=>shuò +9461=>chuò +9462=>lǜ +9463=>biāo +9464=>bào +9465=>lǔ +9466=>xian +9467=>kuan +9468=>lóng +9469=>è +946A=>lú +946B=>xīn +946C=>jiàn +946D=>làn +946E=>bó +946F=>jiān +9470=>yào +9471=>chán +9472=>xiāng +9473=>jiàn +9474=>xī +9475=>guàn +9476=>cáng +9477=>niè +9478=>lěi +9479=>cuān +947A=>qú +947B=>pàn +947C=>luó +947D=>zuān +947E=>luán +947F=>záo +9480=>niè +9481=>jué +9482=>tǎng +9483=>shǔ +9484=>lán +9485=>jīn +9486=>gá +9487=>yǐ +9488=>zhēn +9489=>dīng +948A=>zhāo +948B=>pō +948C=>liǎo +948D=>tǔ +948E=>qiān +948F=>chuàn +9490=>shān +9491=>jí +9492=>fán +9493=>diào +9494=>mén +9495=>nǚ +9496=>yáng +9497=>chāi +9498=>xíng +9499=>gài +949A=>bù +949B=>tài +949C=>jù +949D=>dùn +949E=>chāo +949F=>zhōng +94A0=>nà +94A1=>bèi +94A2=>gāng +94A3=>bǎn +94A4=>qián +94A5=>yào +94A6=>qīn +94A7=>jūn +94A8=>wū +94A9=>gōu +94AA=>kàng +94AB=>fāng +94AC=>huǒ +94AD=>tǒu +94AE=>niǔ +94AF=>bǎ +94B0=>yù +94B1=>qián +94B2=>zhēng +94B3=>qián +94B4=>gǔ +94B5=>bō +94B6=>ē +94B7=>pǒ +94B8=>bù +94B9=>bó +94BA=>yuè +94BB=>zuān +94BC=>mù +94BD=>tǎn +94BE=>jiǎ +94BF=>diàn +94C0=>yóu +94C1=>tiě +94C2=>bó +94C3=>líng +94C4=>shuò +94C5=>qiān +94C6=>mǎo +94C7=>bào +94C8=>shì +94C9=>xuàn +94CA=>tā +94CB=>bì +94CC=>ní +94CD=>pī +94CE=>duó +94CF=>xíng +94D0=>kào +94D1=>lǎo +94D2=>ěr +94D3=>máng +94D4=>yà +94D5=>yǒu +94D6=>chéng +94D7=>jiá +94D8=>yé +94D9=>náo +94DA=>zhì +94DB=>dang +94DC=>tóng +94DD=>lǚ +94DE=>diào +94DF=>yīn +94E0=>kǎi +94E1=>zhá +94E2=>zhū +94E3=>xǐ +94E4=>dìng +94E5=>diū +94E6=>xiān +94E7=>huá +94E8=>quán +94E9=>shā +94EA=>hā +94EB=>diào +94EC=>gè +94ED=>míng +94EE=>zhēng +94EF=>sè +94F0=>jiǎo +94F1=>yī +94F2=>chǎn +94F3=>chòng +94F4=>tāng +94F5=>ǎn +94F6=>yín +94F7=>rú +94F8=>zhù +94F9=>láo +94FA=>pù +94FB=>wú +94FC=>lái +94FD=>tè +94FE=>liàn +94FF=>kēng +9500=>xiāo +9501=>suǒ +9502=>lǐ +9503=>zèng +9504=>chú +9505=>guō +9506=>gào +9507=>é +9508=>xiù +9509=>cuò +950A=>lüè +950B=>fēng +950C=>xīn +950D=>liǔ +950E=>kāi +950F=>jiǎn +9510=>ruì +9511=>tī +9512=>láng +9513=>qǐn +9514=>jū +9515=>ā +9516=>qiāng +9517=>zhě +9518=>nuò +9519=>cuò +951A=>máo +951B=>bēn +951C=>qí +951D=>dé +951E=>kè +951F=>kūn +9520=>chāng +9521=>xī +9522=>gù +9523=>luó +9524=>chuí +9525=>zhuī +9526=>jǐn +9527=>zhì +9528=>xiān +9529=>juǎn +952A=>huō +952B=>péi +952C=>tán +952D=>dìng +952E=>jiàn +952F=>jù +9530=>měng +9531=>zī +9532=>qiè +9533=>yīng +9534=>kǎi +9535=>qiāng +9536=>sī +9537=>è +9538=>chā +9539=>qiāo +953A=>zhōng +953B=>duàn +953C=>sōu +953D=>huáng +953E=>huán +953F=>āi +9540=>dù +9541=>měi +9542=>lòu +9543=>zī +9544=>fèi +9545=>méi +9546=>mò +9547=>zhèn +9548=>bó +9549=>gé +954A=>niè +954B=>tǎng +954C=>juān +954D=>niè +954E=>ná +954F=>liú +9550=>gǎo +9551=>bàng +9552=>yì +9553=>jiā +9554=>bīn +9555=>róng +9556=>biāo +9557=>tāng +9558=>màn +9559=>luó +955A=>bèng +955B=>yōng +955C=>jìng +955D=>dī +955E=>zú +955F=>xuàn +9560=>liú +9561=>chán +9562=>jué +9563=>liào +9564=>pú +9565=>lǔ +9566=>duì +9567=>lán +9568=>pǔ +9569=>cuān +956A=>qiāng +956B=>dèng +956C=>huò +956D=>léi +956E=>huán +956F=>zhuó +9570=>lián +9571=>yì +9572=>chǎ +9573=>biāo +9574=>là +9575=>chán +9576=>xiāng +9577=>zhǎng +9578=>cháng +9579=>jiǔ +957A=>ǎo +957B=>dié +957C=>qū +957D=>liǎo +957E=>mí +957F=>zhǎng +9580=>mén +9581=>mà +9582=>shuān +9583=>shǎn +9584=>huò +9585=>mén +9586=>yán +9587=>bì +9588=>hàn +9589=>bì +958A=>shan +958B=>kāi +958C=>kàng +958D=>bēng +958E=>hóng +958F=>rùn +9590=>sàn +9591=>xián +9592=>xián +9593=>jiān +9594=>mǐn +9595=>xiā +9596=>shui +9597=>dòu +9598=>zhá +9599=>nào +959A=>zhān +959B=>pēng +959C=>xiǎ +959D=>líng +959E=>biàn +959F=>bì +95A0=>rùn +95A1=>ài +95A2=>guān +95A3=>gé +95A4=>gé +95A5=>fá +95A6=>chù +95A7=>hòng +95A8=>guī +95A9=>mǐn +95AA=>sē +95AB=>kǔn +95AC=>làng +95AD=>lǘ +95AE=>tíng +95AF=>shà +95B0=>jú +95B1=>yuè +95B2=>yuè +95B3=>chǎn +95B4=>qù +95B5=>lìn +95B6=>chāng +95B7=>shài +95B8=>kǔn +95B9=>yān +95BA=>wén +95BB=>yán +95BC=>è +95BD=>hūn +95BE=>yù +95BF=>wén +95C0=>xiàng +95C1=>bāo +95C2=>hòng +95C3=>qù +95C4=>yǎo +95C5=>wén +95C6=>bǎn +95C7=>àn +95C8=>wéi +95C9=>yīn +95CA=>kuò +95CB=>què +95CC=>lán +95CD=>dū +95CE=>quan +95CF=>fēng +95D0=>tián +95D1=>niè +95D2=>tà +95D3=>kǎi +95D4=>hé +95D5=>què +95D6=>chuǎng +95D7=>guān +95D8=>dòu +95D9=>qǐ +95DA=>kuī +95DB=>táng +95DC=>guān +95DD=>piáo +95DE=>kàn +95DF=>xì +95E0=>huì +95E1=>chǎn +95E2=>pì +95E3=>dàng +95E4=>huán +95E5=>tà +95E6=>wén +95E7=>tā +95E8=>mén +95E9=>shuān +95EA=>shǎn +95EB=>yàn +95EC=>hàn +95ED=>bì +95EE=>wèn +95EF=>chuǎng +95F0=>rùn +95F1=>wéi +95F2=>xián +95F3=>hóng +95F4=>jiān +95F5=>mǐn +95F6=>kāng +95F7=>mèn +95F8=>zhá +95F9=>nào +95FA=>guī +95FB=>wén +95FC=>tà +95FD=>mǐn +95FE=>lǘ +95FF=>kǎi +9600=>fá +9601=>gé +9602=>hé +9603=>kǔn +9604=>jiū +9605=>yuè +9606=>láng +9607=>dū +9608=>yù +9609=>yān +960A=>chāng +960B=>xì +960C=>wén +960D=>hūn +960E=>yán +960F=>è +9610=>chǎn +9611=>lán +9612=>qù +9613=>huì +9614=>kuò +9615=>què +9616=>hé +9617=>tián +9618=>dá +9619=>quē +961A=>hǎn +961B=>huán +961C=>fù +961D=>fù +961E=>lè +961F=>duì +9620=>xìn +9621=>qiān +9622=>wù +9623=>gài +9624=>zhì +9625=>yīn +9626=>yáng +9627=>dǒu +9628=>è +9629=>shēng +962A=>bǎn +962B=>péi +962C=>kēng +962D=>yǔn +962E=>ruǎn +962F=>zhǐ +9630=>pí +9631=>jǐng +9632=>fáng +9633=>yáng +9634=>yīn +9635=>zhèn +9636=>jiē +9637=>chēng +9638=>è +9639=>qū +963A=>dǐ +963B=>zǔ +963C=>zuò +963D=>diàn +963E=>lǐng +963F=>ā +9640=>tuó +9641=>tuó +9642=>bēi +9643=>bǐng +9644=>fù +9645=>jì +9646=>lù +9647=>lǒng +9648=>chén +9649=>xíng +964A=>duò +964B=>lòu +964C=>mò +964D=>jiàng +964E=>shū +964F=>duò +9650=>xiàn +9651=>ér +9652=>guǐ +9653=>yū +9654=>gāi +9655=>shǎn +9656=>jùn +9657=>qiào +9658=>xíng +9659=>chún +965A=>fù +965B=>bì +965C=>xiá +965D=>shǎn +965E=>shēng +965F=>zhì +9660=>pū +9661=>dǒu +9662=>yuàn +9663=>zhèn +9664=>chú +9665=>xiàn +9666=>dao +9667=>niè +9668=>yǔn +9669=>xiǎn +966A=>péi +966B=>fèi +966C=>zōu +966D=>yì +966E=>duì +966F=>lún +9670=>yīn +9671=>jū +9672=>chuí +9673=>chén +9674=>pí +9675=>líng +9676=>táo +9677=>xiàn +9678=>lù +9679=>shēng +967A=>xiǎn +967B=>yīn +967C=>zhǔ +967D=>yáng +967E=>réng +967F=>xiá +9680=>chóng +9681=>yàn +9682=>yīn +9683=>shù +9684=>dī +9685=>yú +9686=>lóng +9687=>wēi +9688=>wēi +9689=>niè +968A=>duì +968B=>suí +968C=>ǎn +968D=>huáng +968E=>jiē +968F=>suí +9690=>yǐn +9691=>gài +9692=>yǎn +9693=>huī +9694=>gé +9695=>yǔn +9696=>wù +9697=>kuí +9698=>ài +9699=>xì +969A=>táng +969B=>jì +969C=>zhàng +969D=>dǎo +969E=>áo +969F=>xì +96A0=>yǐn +96A1=>sa +96A2=>rǎo +96A3=>lín +96A4=>tuí +96A5=>dèng +96A6=>jiǎo +96A7=>suì +96A8=>suí +96A9=>ào +96AA=>xiǎn +96AB=>fén +96AC=>nǐ +96AD=>ér +96AE=>jī +96AF=>dǎo +96B0=>xí +96B1=>yǐn +96B2=>é +96B3=>huī +96B4=>lǒng +96B5=>xī +96B6=>lì +96B7=>lì +96B8=>lì +96B9=>zhuī +96BA=>hú +96BB=>zhī +96BC=>sǔn +96BD=>juàn +96BE=>nán +96BF=>yì +96C0=>què +96C1=>yàn +96C2=>qín +96C3=>qiān +96C4=>xióng +96C5=>yǎ +96C6=>jí +96C7=>gù +96C8=>huán +96C9=>zhì +96CA=>gòu +96CB=>juàn +96CC=>cí +96CD=>yōng +96CE=>jū +96CF=>chú +96D0=>hū +96D1=>zá +96D2=>luò +96D3=>yú +96D4=>chóu +96D5=>diāo +96D6=>suī +96D7=>hàn +96D8=>wò +96D9=>shuāng +96DA=>guàn +96DB=>chú +96DC=>zá +96DD=>yōng +96DE=>jī +96DF=>xī +96E0=>chóu +96E1=>liù +96E2=>lí +96E3=>nán +96E4=>xué +96E5=>zá +96E6=>jí +96E7=>jí +96E8=>yǔ +96E9=>yú +96EA=>xuě +96EB=>nǎ +96EC=>fǒu +96ED=>sè +96EE=>mù +96EF=>wén +96F0=>fēn +96F1=>pāng +96F2=>yún +96F3=>lì +96F4=>chì +96F5=>yāng +96F6=>líng +96F7=>léi +96F8=>án +96F9=>báo +96FA=>wù +96FB=>diàn +96FC=>dàng +96FD=>hù +96FE=>wù +96FF=>diào +9700=>xū +9701=>jì +9702=>mù +9703=>chén +9704=>xiāo +9705=>zhà +9706=>tíng +9707=>zhèn +9708=>pèi +9709=>méi +970A=>líng +970B=>qī +970C=>zhōu +970D=>huò +970E=>shà +970F=>fēi +9710=>hóng +9711=>zhān +9712=>yīn +9713=>ní +9714=>zhù +9715=>tún +9716=>lín +9717=>ling +9718=>dòng +9719=>yīng +971A=>wù +971B=>líng +971C=>shuāng +971D=>líng +971E=>xiá +971F=>hóng +9720=>yīn +9721=>mài +9722=>mài +9723=>yǔn +9724=>liù +9725=>mèng +9726=>bīn +9727=>wù +9728=>wèi +9729=>kuò +972A=>yín +972B=>xí +972C=>yì +972D=>ǎi +972E=>dàn +972F=>tèng +9730=>sǎn +9731=>yù +9732=>lù +9733=>lóng +9734=>dài +9735=>jí +9736=>pāng +9737=>yáng +9738=>bà +9739=>pī +973A=>wéi +973B=>fēng +973C=>xì +973D=>jì +973E=>mái +973F=>méng +9740=>méng +9741=>léi +9742=>lì +9743=>huò +9744=>ǎi +9745=>fèi +9746=>dài +9747=>lóng +9748=>líng +9749=>ài +974A=>fēng +974B=>lì +974C=>bǎo +974D=>he +974E=>hè +974F=>hè +9750=>bìng +9751=>qīng +9752=>qīng +9753=>jìng +9754=>tiān +9755=>zhēn +9756=>jìng +9757=>chēng +9758=>qìng +9759=>jìng +975A=>jìng +975B=>diàn +975C=>jìng +975D=>tiān +975E=>fēi +975F=>fēi +9760=>kào +9761=>mí +9762=>miàn +9763=>miàn +9764=>bào +9765=>yè +9766=>tiǎn +9767=>huì +9768=>yè +9769=>gé +976A=>dīng +976B=>chá +976C=>qián +976D=>rèn +976E=>dí +976F=>dù +9770=>wù +9771=>rèn +9772=>qín +9773=>jìn +9774=>xuē +9775=>niǔ +9776=>bǎ +9777=>yǐn +9778=>sǎ +9779=>nà +977A=>mò +977B=>zǔ +977C=>dá +977D=>bàn +977E=>yì +977F=>yào +9780=>táo +9781=>bèi +9782=>jiá +9783=>hóng +9784=>páo +9785=>yāng +9786=>bing +9787=>yīn +9788=>gé +9789=>táo +978A=>jié +978B=>xié +978C=>ān +978D=>ān +978E=>hén +978F=>gǒng +9790=>qia +9791=>dá +9792=>qiáo +9793=>tīng +9794=>mán +9795=>yìng +9796=>suī +9797=>tiáo +9798=>qiào +9799=>xuàn +979A=>kòng +979B=>běng +979C=>tà +979D=>shàng +979E=>bǐng +979F=>kuò +97A0=>jū +97A1=>la +97A2=>xiè +97A3=>róu +97A4=>bāng +97A5=>ēng +97A6=>qiū +97A7=>qiū +97A8=>hé +97A9=>xiào +97AA=>mù +97AB=>jū +97AC=>jiān +97AD=>biān +97AE=>dī +97AF=>jiān +97B0=>wēn +97B1=>tāo +97B2=>gōu +97B3=>tà +97B4=>bèi +97B5=>xié +97B6=>pán +97B7=>gé +97B8=>bì +97B9=>kuò +97BA=>tāng +97BB=>lóu +97BC=>guì +97BD=>qiáo +97BE=>xuē +97BF=>jī +97C0=>jiān +97C1=>jiāng +97C2=>chàn +97C3=>dá +97C4=>hù +97C5=>xiǎn +97C6=>qiān +97C7=>dú +97C8=>wà +97C9=>jiān +97CA=>lán +97CB=>wéi +97CC=>rèn +97CD=>fú +97CE=>mèi +97CF=>quàn +97D0=>gé +97D1=>wěi +97D2=>qiào +97D3=>hán +97D4=>chàng +97D5=>kuo +97D6=>rǒu +97D7=>yùn +97D8=>shè +97D9=>wěi +97DA=>gé +97DB=>bài +97DC=>tāo +97DD=>gōu +97DE=>yùn +97DF=>gao +97E0=>bì +97E1=>wěi +97E2=>suì +97E3=>dú +97E4=>wà +97E5=>dú +97E6=>wéi +97E7=>rèn +97E8=>fú +97E9=>hán +97EA=>wěi +97EB=>yùn +97EC=>tāo +97ED=>jiǔ +97EE=>jiǔ +97EF=>xiān +97F0=>xiè +97F1=>xiān +97F2=>jī +97F3=>yīn +97F4=>zá +97F5=>yùn +97F6=>sháo +97F7=>lè +97F8=>péng +97F9=>huáng +97FA=>yīng +97FB=>yùn +97FC=>péng +97FD=>ān +97FE=>yīn +97FF=>xiǎng +9800=>hù +9801=>yè +9802=>dǐng +9803=>qǐng +9804=>kuí +9805=>xiàng +9806=>shùn +9807=>hān +9808=>xū +9809=>yí +980A=>xū +980B=>ě +980C=>sòng +980D=>kuǐ +980E=>qí +980F=>háng +9810=>yù +9811=>wán +9812=>bān +9813=>dùn +9814=>dí +9815=>dān +9816=>pàn +9817=>pō +9818=>lǐng +9819=>chè +981A=>jǐng +981B=>lèi +981C=>hé +981D=>qiāo +981E=>è +981F=>é +9820=>wěi +9821=>xié +9822=>kuò +9823=>shěn +9824=>yí +9825=>shěn +9826=>hái +9827=>duǐ +9828=>yǔ +9829=>pīng +982A=>lèi +982B=>fǔ +982C=>jiá +982D=>tóu +982E=>huì +982F=>kuí +9830=>jiá +9831=>luō +9832=>tǐng +9833=>chēng +9834=>yǐng +9835=>yūn +9836=>hú +9837=>hàn +9838=>jǐng +9839=>tuí +983A=>tuí +983B=>pín +983C=>lài +983D=>tuí +983E=>zī +983F=>zī +9840=>chuí +9841=>dìng +9842=>lài +9843=>tán +9844=>hàn +9845=>qiān +9846=>kē +9847=>cuì +9848=>xuǎn +9849=>qīn +984A=>yí +984B=>sāi +984C=>tí +984D=>é +984E=>è +984F=>yán +9850=>wèn +9851=>kǎn +9852=>yóng +9853=>zhuān +9854=>yán +9855=>xiǎn +9856=>xìn +9857=>yǐ +9858=>yuàn +9859=>sǎng +985A=>diān +985B=>diān +985C=>jiǎng +985D=>kuī +985E=>lèi +985F=>láo +9860=>piǎo +9861=>wài +9862=>mán +9863=>cù +9864=>yáo +9865=>hào +9866=>qiáo +9867=>gù +9868=>xùn +9869=>yǎn +986A=>huì +986B=>chàn +986C=>rú +986D=>méng +986E=>bīn +986F=>xiǎn +9870=>pín +9871=>lú +9872=>lǎn +9873=>niè +9874=>quán +9875=>yè +9876=>dǐng +9877=>qǐng +9878=>hān +9879=>xiàng +987A=>shùn +987B=>xū +987C=>xū +987D=>wán +987E=>gù +987F=>dùn +9880=>qí +9881=>bān +9882=>sòng +9883=>háng +9884=>yù +9885=>lú +9886=>lǐng +9887=>pō +9888=>jǐng +9889=>jié +988A=>jiá +988B=>tǐng +988C=>hé +988D=>yǐng +988E=>jiǒng +988F=>kē +9890=>yí +9891=>pín +9892=>huì +9893=>tuí +9894=>hàn +9895=>yǐng +9896=>yǐng +9897=>kē +9898=>tí +9899=>yóng +989A=>è +989B=>zhuān +989C=>yán +989D=>é +989E=>niè +989F=>mān +98A0=>diān +98A1=>sǎng +98A2=>hào +98A3=>lèi +98A4=>chàn +98A5=>rú +98A6=>pín +98A7=>quán +98A8=>fēng +98A9=>biāo +98AA=>gua +98AB=>fú +98AC=>xiā +98AD=>zhǎn +98AE=>biāo +98AF=>sà +98B0=>bá +98B1=>tái +98B2=>liè +98B3=>guā +98B4=>xuàn +98B5=>shāo +98B6=>jù +98B7=>biāo +98B8=>sī +98B9=>wěi +98BA=>yáng +98BB=>yáo +98BC=>sōu +98BD=>kǎi +98BE=>sōu +98BF=>fān +98C0=>liú +98C1=>xí +98C2=>liù +98C3=>piāo +98C4=>piāo +98C5=>liú +98C6=>biāo +98C7=>biāo +98C8=>biāo +98C9=>liáo +98CA=>biao +98CB=>sè +98CC=>fēng +98CD=>xiū +98CE=>fēng +98CF=>yáng +98D0=>zhǎn +98D1=>biāo +98D2=>sà +98D3=>jù +98D4=>sī +98D5=>sōu +98D6=>yáo +98D7=>liú +98D8=>piāo +98D9=>biāo +98DA=>biāo +98DB=>fēi +98DC=>fān +98DD=>fēi +98DE=>fēi +98DF=>shí +98E0=>shí +98E1=>cān +98E2=>jī +98E3=>dìng +98E4=>sì +98E5=>tuō +98E6=>zhān +98E7=>sūn +98E8=>xiǎng +98E9=>tún +98EA=>rèn +98EB=>yù +98EC=>juàn +98ED=>chì +98EE=>yǐn +98EF=>fàn +98F0=>fàn +98F1=>sūn +98F2=>yǐn +98F3=>tǒu +98F4=>yí +98F5=>zuò +98F6=>bì +98F7=>jiě +98F8=>tāo +98F9=>liǔ +98FA=>cí +98FB=>tiè +98FC=>sì +98FD=>bǎo +98FE=>shì +98FF=>duò +9900=>hài +9901=>rèn +9902=>tiǎn +9903=>jiǎo +9904=>jiá +9905=>bǐng +9906=>yáo +9907=>tóng +9908=>cí +9909=>xiǎng +990A=>yǎng +990B=>juàn +990C=>ěr +990D=>yàn +990E=>le +990F=>xī +9910=>cān +9911=>bō +9912=>něi +9913=>è +9914=>bù +9915=>jùn +9916=>dòu +9917=>sù +9918=>yú +9919=>shì +991A=>yáo +991B=>hún +991C=>guǒ +991D=>shì +991E=>jiàn +991F=>zhuì +9920=>bǐng +9921=>xiàn +9922=>bù +9923=>yè +9924=>tán +9925=>fēi +9926=>zhāng +9927=>wèi +9928=>guǎn +9929=>è +992A=>nuǎn +992B=>yùn +992C=>hú +992D=>huáng +992E=>tiè +992F=>huì +9930=>jiān +9931=>hóu +9932=>ài +9933=>táng +9934=>fēn +9935=>wèi +9936=>gǔ +9937=>chā +9938=>sòng +9939=>táng +993A=>bó +993B=>gāo +993C=>xì +993D=>kuì +993E=>liù +993F=>sōu +9940=>táo +9941=>yè +9942=>yún +9943=>mó +9944=>táng +9945=>mán +9946=>bì +9947=>yù +9948=>xiū +9949=>jǐn +994A=>sǎn +994B=>kuì +994C=>zhuàn +994D=>shàn +994E=>chì +994F=>dàn +9950=>yì +9951=>jī +9952=>ráo +9953=>chēng +9954=>yōng +9955=>tāo +9956=>wèi +9957=>xiǎng +9958=>zhān +9959=>fēn +995A=>hài +995B=>méng +995C=>yàn +995D=>mó +995E=>chán +995F=>xiǎng +9960=>luó +9961=>zàn +9962=>náng +9963=>shí +9964=>dìng +9965=>jī +9966=>tuō +9967=>táng +9968=>tún +9969=>xì +996A=>rèn +996B=>yù +996C=>chì +996D=>fàn +996E=>yǐn +996F=>jiàn +9970=>shì +9971=>bǎo +9972=>sì +9973=>duò +9974=>yí +9975=>ěr +9976=>ráo +9977=>xiǎng +9978=>hé +9979=>le +997A=>jiǎo +997B=>xī +997C=>bǐng +997D=>bō +997E=>dòu +997F=>è +9980=>yú +9981=>něi +9982=>jùn +9983=>guǒ +9984=>hún +9985=>xiàn +9986=>guǎn +9987=>chā +9988=>kuì +9989=>gǔ +998A=>sōu +998B=>chán +998C=>yè +998D=>mó +998E=>bó +998F=>liú +9990=>xiū +9991=>jǐn +9992=>mán +9993=>sǎn +9994=>zhuàn +9995=>náng +9996=>shǒu +9997=>kuí +9998=>guó +9999=>xiāng +999A=>fén +999B=>bó +999C=>nǐ +999D=>bì +999E=>bó +999F=>tú +99A0=>hān +99A1=>fēi +99A2=>jiān +99A3=>ān +99A4=>ài +99A5=>fù +99A6=>xiān +99A7=>yūn +99A8=>xīn +99A9=>fén +99AA=>pīn +99AB=>xīn +99AC=>mǎ +99AD=>yù +99AE=>féng +99AF=>hàn +99B0=>dí +99B1=>tuó +99B2=>zhé +99B3=>chí +99B4=>xún +99B5=>zhù +99B6=>zhī +99B7=>pèi +99B8=>xìn +99B9=>rì +99BA=>sà +99BB=>yǔn +99BC=>wén +99BD=>zhí +99BE=>dàn +99BF=>lǘ +99C0=>yóu +99C1=>bó +99C2=>bǎo +99C3=>jué +99C4=>tuó +99C5=>yì +99C6=>qū +99C7=>pu +99C8=>qū +99C9=>jiōng +99CA=>pǒ +99CB=>zhāo +99CC=>yuān +99CD=>péi +99CE=>zhòu +99CF=>jù +99D0=>zhù +99D1=>nú +99D2=>jū +99D3=>pī +99D4=>zǎng +99D5=>jià +99D6=>líng +99D7=>zhěn +99D8=>tái +99D9=>fù +99DA=>yǎng +99DB=>shǐ +99DC=>bì +99DD=>tuo +99DE=>tuó +99DF=>sì +99E0=>liú +99E1=>mà +99E2=>pián +99E3=>táo +99E4=>zhì +99E5=>róng +99E6=>téng +99E7=>dòng +99E8=>xūn +99E9=>quān +99EA=>shēn +99EB=>jiōng +99EC=>ěr +99ED=>hài +99EE=>bó +99EF=>zhū +99F0=>yīn +99F1=>luò +99F2=>zhou +99F3=>dàn +99F4=>xiè +99F5=>liú +99F6=>jú +99F7=>sǒng +99F8=>qīn +99F9=>máng +99FA=>láng +99FB=>hàn +99FC=>tú +99FD=>xuān +99FE=>tuì +99FF=>jùn +9A00=>ě +9A01=>chěng +9A02=>xīng +9A03=>ái +9A04=>lù +9A05=>zhuī +9A06=>zhōu +9A07=>shè +9A08=>pián +9A09=>kūn +9A0A=>táo +9A0B=>lái +9A0C=>zōng +9A0D=>kè +9A0E=>qí +9A0F=>qí +9A10=>yàn +9A11=>fēi +9A12=>sāo +9A13=>yǎn +9A14=>gé +9A15=>yǎo +9A16=>wù +9A17=>piàn +9A18=>cōng +9A19=>piàn +9A1A=>qián +9A1B=>fēi +9A1C=>huáng +9A1D=>qián +9A1E=>huō +9A1F=>yú +9A20=>tí +9A21=>quán +9A22=>xiá +9A23=>zōng +9A24=>kuí +9A25=>róu +9A26=>sī +9A27=>guā +9A28=>tuó +9A29=>guī +9A2A=>sōu +9A2B=>qiān +9A2C=>chéng +9A2D=>zhì +9A2E=>liú +9A2F=>péng +9A30=>téng +9A31=>xí +9A32=>cǎo +9A33=>dú +9A34=>yàn +9A35=>yuán +9A36=>zōu +9A37=>sāo +9A38=>shàn +9A39=>lí +9A3A=>zhì +9A3B=>shuāng +9A3C=>lù +9A3D=>xí +9A3E=>luó +9A3F=>zhāng +9A40=>mò +9A41=>ào +9A42=>cān +9A43=>biāo +9A44=>cōng +9A45=>qū +9A46=>bì +9A47=>zhì +9A48=>yù +9A49=>xū +9A4A=>huá +9A4B=>bō +9A4C=>sù +9A4D=>xiāo +9A4E=>lín +9A4F=>zhàn +9A50=>dūn +9A51=>liú +9A52=>tuó +9A53=>céng +9A54=>diàn +9A55=>jiāo +9A56=>tiě +9A57=>yàn +9A58=>luó +9A59=>zhān +9A5A=>jīng +9A5B=>yì +9A5C=>yè +9A5D=>tuō +9A5E=>pīn +9A5F=>zhòu +9A60=>yàn +9A61=>lóng +9A62=>lǘ +9A63=>téng +9A64=>xiāng +9A65=>jì +9A66=>shuāng +9A67=>jú +9A68=>xí +9A69=>huān +9A6A=>lí +9A6B=>biāo +9A6C=>mǎ +9A6D=>yù +9A6E=>tuó +9A6F=>xún +9A70=>chí +9A71=>qū +9A72=>rì +9A73=>bó +9A74=>lǘ +9A75=>zǎng +9A76=>shǐ +9A77=>sì +9A78=>fù +9A79=>jū +9A7A=>zōu +9A7B=>zhù +9A7C=>tuo +9A7D=>nú +9A7E=>jià +9A7F=>yì +9A80=>dài +9A81=>xiāo +9A82=>mà +9A83=>yīn +9A84=>jiāo +9A85=>huá +9A86=>luò +9A87=>hài +9A88=>pián +9A89=>biāo +9A8A=>lí +9A8B=>chěng +9A8C=>yàn +9A8D=>xīng +9A8E=>qīn +9A8F=>jùn +9A90=>qí +9A91=>qí +9A92=>kè +9A93=>zhuī +9A94=>zōng +9A95=>sù +9A96=>cān +9A97=>piàn +9A98=>zhì +9A99=>kuí +9A9A=>sāo +9A9B=>wù +9A9C=>ào +9A9D=>liú +9A9E=>qiān +9A9F=>shàn +9AA0=>biāo +9AA1=>luó +9AA2=>cōng +9AA3=>chǎn +9AA4=>zhòu +9AA5=>jì +9AA6=>shuāng +9AA7=>xiāng +9AA8=>gǔ +9AA9=>wěi +9AAA=>wěi +9AAB=>wěi +9AAC=>yú +9AAD=>gàn +9AAE=>yì +9AAF=>āng +9AB0=>tóu +9AB1=>jiè +9AB2=>bào +9AB3=>bèi +9AB4=>cī +9AB5=>tǐ +9AB6=>dǐ +9AB7=>kū +9AB8=>hái +9AB9=>qiāo +9ABA=>hóu +9ABB=>kuà +9ABC=>gé +9ABD=>tuǐ +9ABE=>gěng +9ABF=>pián +9AC0=>bì +9AC1=>kē +9AC2=>qià +9AC3=>yú +9AC4=>suǐ +9AC5=>lóu +9AC6=>bó +9AC7=>xiāo +9AC8=>bǎng +9AC9=>bó +9ACA=>cī +9ACB=>kuān +9ACC=>bìn +9ACD=>mó +9ACE=>liáo +9ACF=>lóu +9AD0=>xiāo +9AD1=>dú +9AD2=>zāng +9AD3=>suǐ +9AD4=>tǐ +9AD5=>bìn +9AD6=>kuān +9AD7=>lú +9AD8=>gāo +9AD9=>gāo +9ADA=>qiào +9ADB=>kāo +9ADC=>qiǎo +9ADD=>láo +9ADE=>sào +9ADF=>biāo +9AE0=>kūn +9AE1=>kūn +9AE2=>dí +9AE3=>fǎng +9AE4=>xiū +9AE5=>rán +9AE6=>máo +9AE7=>dàn +9AE8=>kūn +9AE9=>bìn +9AEA=>fà +9AEB=>tiáo +9AEC=>pī +9AED=>zī +9AEE=>fà +9AEF=>rán +9AF0=>tì +9AF1=>bào +9AF2=>bì +9AF3=>máo +9AF4=>fú +9AF5=>ér +9AF6=>róng +9AF7=>qū +9AF8=>gōng +9AF9=>xiū +9AFA=>kuò +9AFB=>jì +9AFC=>péng +9AFD=>zhuā +9AFE=>shāo +9AFF=>suō +9B00=>tì +9B01=>lì +9B02=>bìn +9B03=>zōng +9B04=>dí +9B05=>péng +9B06=>sōng +9B07=>zhēng +9B08=>quán +9B09=>zōng +9B0A=>shùn +9B0B=>jiǎn +9B0C=>tuǒ +9B0D=>hú +9B0E=>là +9B0F=>jiū +9B10=>qí +9B11=>lián +9B12=>zhěn +9B13=>bìn +9B14=>péng +9B15=>mà +9B16=>sān +9B17=>mán +9B18=>mán +9B19=>sēng +9B1A=>xū +9B1B=>liè +9B1C=>qiān +9B1D=>qiān +9B1E=>náng +9B1F=>huán +9B20=>kuò +9B21=>níng +9B22=>bìn +9B23=>liè +9B24=>ráng +9B25=>dòu +9B26=>dòu +9B27=>nào +9B28=>hòng +9B29=>xì +9B2A=>dòu +9B2B=>hǎn +9B2C=>dòu +9B2D=>dòu +9B2E=>jiū +9B2F=>chàng +9B30=>yù +9B31=>yù +9B32=>gé +9B33=>yàn +9B34=>fǔ +9B35=>qín +9B36=>guī +9B37=>zōng +9B38=>liù +9B39=>guī +9B3A=>shāng +9B3B=>yù +9B3C=>guǐ +9B3D=>mèi +9B3E=>jì +9B3F=>qí +9B40=>gà +9B41=>kuí +9B42=>hún +9B43=>bá +9B44=>pò +9B45=>mèi +9B46=>xū +9B47=>yǎn +9B48=>xiāo +9B49=>liǎng +9B4A=>yù +9B4B=>tuí +9B4C=>qī +9B4D=>wǎng +9B4E=>liǎng +9B4F=>wèi +9B50=>gān +9B51=>chī +9B52=>piāo +9B53=>bì +9B54=>mó +9B55=>jǐ +9B56=>xū +9B57=>chǒu +9B58=>yǎn +9B59=>zhān +9B5A=>yú +9B5B=>dāo +9B5C=>rén +9B5D=>jié +9B5E=>ba +9B5F=>hóng +9B60=>tuō +9B61=>diào +9B62=>jǐ +9B63=>xù +9B64=>é +9B65=>è +9B66=>shā +9B67=>háng +9B68=>tún +9B69=>mò +9B6A=>jiè +9B6B=>shěn +9B6C=>bǎn +9B6D=>yuán +9B6E=>pí +9B6F=>lǔ +9B70=>wén +9B71=>hú +9B72=>lú +9B73=>zā +9B74=>fáng +9B75=>fén +9B76=>nà +9B77=>yóu +9B78=>pian +9B79=>mo +9B7A=>hé +9B7B=>xiá +9B7C=>qū +9B7D=>hán +9B7E=>pī +9B7F=>líng +9B80=>tuó +9B81=>bō +9B82=>qiú +9B83=>píng +9B84=>fú +9B85=>bì +9B86=>cǐ +9B87=>wèi +9B88=>jū +9B89=>diāo +9B8A=>bà +9B8B=>yóu +9B8C=>gǔn +9B8D=>pī +9B8E=>nián +9B8F=>xīng +9B90=>tái +9B91=>bào +9B92=>fù +9B93=>zhǎ +9B94=>jù +9B95=>gū +9B96=>shi +9B97=>dong +9B98=>dai +9B99=>tà +9B9A=>jié +9B9B=>shū +9B9C=>hòu +9B9D=>xiǎng +9B9E=>ér +9B9F=>àn +9BA0=>wéi +9BA1=>zhào +9BA2=>zhū +9BA3=>yìn +9BA4=>liè +9BA5=>luò +9BA6=>tóng +9BA7=>tǐ +9BA8=>yì +9BA9=>bìng +9BAA=>wěi +9BAB=>jiāo +9BAC=>kū +9BAD=>guī +9BAE=>xiān +9BAF=>gé +9BB0=>huí +9BB1=>lao +9BB2=>fu +9BB3=>kào +9BB4=>xiu +9BB5=>duó +9BB6=>jūn +9BB7=>tí +9BB8=>miǎn +9BB9=>shāo +9BBA=>zhǎ +9BBB=>suō +9BBC=>qīn +9BBD=>yú +9BBE=>něi +9BBF=>zhé +9BC0=>gǔn +9BC1=>gěng +9BC2=>su +9BC3=>wú +9BC4=>qiú +9BC5=>shān +9BC6=>pū +9BC7=>huàn +9BC8=>tiáo +9BC9=>lǐ +9BCA=>shā +9BCB=>shā +9BCC=>kào +9BCD=>méng +9BCE=>cheng +9BCF=>li +9BD0=>zou +9BD1=>xi +9BD2=>yǒng +9BD3=>ní +9BD4=>zī +9BD5=>qí +9BD6=>zhēng +9BD7=>xiǎng +9BD8=>něi +9BD9=>chún +9BDA=>jì +9BDB=>diāo +9BDC=>qiè +9BDD=>gù +9BDE=>zhǒu +9BDF=>dōng +9BE0=>lái +9BE1=>fèi +9BE2=>ní +9BE3=>yì +9BE4=>kūn +9BE5=>lù +9BE6=>jiù +9BE7=>chāng +9BE8=>jīng +9BE9=>lún +9BEA=>líng +9BEB=>zōu +9BEC=>lí +9BED=>měng +9BEE=>zōng +9BEF=>zhì +9BF0=>nián +9BF1=>hu +9BF2=>yu +9BF3=>di +9BF4=>shī +9BF5=>shēn +9BF6=>hǔn +9BF7=>tí +9BF8=>hóu +9BF9=>xīng +9BFA=>zhū +9BFB=>là +9BFC=>zōng +9BFD=>zéi +9BFE=>biān +9BFF=>biān +9C00=>huàn +9C01=>quán +9C02=>zéi +9C03=>wēi +9C04=>wēi +9C05=>yú +9C06=>chūn +9C07=>róu +9C08=>dié +9C09=>huáng +9C0A=>liàn +9C0B=>yǎn +9C0C=>qiū +9C0D=>qiū +9C0E=>jiǎn +9C0F=>bī +9C10=>è +9C11=>yáng +9C12=>fù +9C13=>sāi +9C14=>gǎn +9C15=>xiā +9C16=>tuǒ +9C17=>hú +9C18=>shi +9C19=>ruò +9C1A=>xuan +9C1B=>wēn +9C1C=>qiàn +9C1D=>hào +9C1E=>wū +9C1F=>fáng +9C20=>sāo +9C21=>liú +9C22=>mǎ +9C23=>shí +9C24=>shī +9C25=>guān +9C26=>zī +9C27=>téng +9C28=>tǎ +9C29=>yáo +9C2A=>é +9C2B=>yóng +9C2C=>qián +9C2D=>qí +9C2E=>wēn +9C2F=>ruò +9C30=>shen +9C31=>lián +9C32=>áo +9C33=>lè +9C34=>huī +9C35=>mǐn +9C36=>jì +9C37=>tiáo +9C38=>qū +9C39=>jiān +9C3A=>shēn +9C3B=>mán +9C3C=>xí +9C3D=>qiú +9C3E=>biào +9C3F=>jì +9C40=>jì +9C41=>zhú +9C42=>jiāng +9C43=>xiū +9C44=>zhuān +9C45=>yōng +9C46=>zhāng +9C47=>kāng +9C48=>xuě +9C49=>biē +9C4A=>yù +9C4B=>qū +9C4C=>xiàng +9C4D=>bō +9C4E=>jiǎo +9C4F=>xún +9C50=>sù +9C51=>huáng +9C52=>zūn +9C53=>shàn +9C54=>shàn +9C55=>fān +9C56=>guì +9C57=>lín +9C58=>xún +9C59=>miáo +9C5A=>xǐ +9C5B=>zeng +9C5C=>xiang +9C5D=>fèn +9C5E=>guān +9C5F=>hòu +9C60=>kuài +9C61=>zéi +9C62=>sāo +9C63=>zhān +9C64=>gǎn +9C65=>guì +9C66=>yìng +9C67=>lǐ +9C68=>cháng +9C69=>lei +9C6A=>shu +9C6B=>ai +9C6C=>rú +9C6D=>jì +9C6E=>xù +9C6F=>hù +9C70=>shu +9C71=>lì +9C72=>liè +9C73=>lì +9C74=>miè +9C75=>zhēn +9C76=>xiǎng +9C77=>è +9C78=>lú +9C79=>guàn +9C7A=>lí +9C7B=>xiān +9C7C=>yú +9C7D=>dāo +9C7E=>jǐ +9C7F=>yóu +9C80=>tún +9C81=>lǔ +9C82=>fáng +9C83=>bā +9C84=>hé +9C85=>bà +9C86=>píng +9C87=>nián +9C88=>lú +9C89=>yóu +9C8A=>zhǎ +9C8B=>fù +9C8C=>bà +9C8D=>bào +9C8E=>hòu +9C8F=>pí +9C90=>tái +9C91=>guī +9C92=>jié +9C93=>kǎo +9C94=>wěi +9C95=>ér +9C96=>tóng +9C97=>zéi +9C98=>hòu +9C99=>kuài +9C9A=>jì +9C9B=>jiāo +9C9C=>xiān +9C9D=>zhǎ +9C9E=>xiǎng +9C9F=>xún +9CA0=>gěng +9CA1=>lí +9CA2=>lián +9CA3=>jiān +9CA4=>lǐ +9CA5=>shí +9CA6=>tiáo +9CA7=>gǔn +9CA8=>shā +9CA9=>huàn +9CAA=>jūn +9CAB=>jì +9CAC=>yǒng +9CAD=>qīng +9CAE=>líng +9CAF=>qí +9CB0=>zōu +9CB1=>fēi +9CB2=>kūn +9CB3=>chāng +9CB4=>gù +9CB5=>ní +9CB6=>nián +9CB7=>diāo +9CB8=>jīng +9CB9=>shēn +9CBA=>shī +9CBB=>zī +9CBC=>fèn +9CBD=>dié +9CBE=>bī +9CBF=>cháng +9CC0=>tí +9CC1=>wēn +9CC2=>wēi +9CC3=>sāi +9CC4=>è +9CC5=>qiū +9CC6=>fù +9CC7=>huáng +9CC8=>quán +9CC9=>jiāng +9CCA=>biān +9CCB=>sāo +9CCC=>áo +9CCD=>qí +9CCE=>tǎ +9CCF=>guān +9CD0=>yáo +9CD1=>páng +9CD2=>jiān +9CD3=>lè +9CD4=>biào +9CD5=>xuě +9CD6=>biē +9CD7=>mán +9CD8=>mǐn +9CD9=>yōng +9CDA=>wèi +9CDB=>xí +9CDC=>guì +9CDD=>shàn +9CDE=>lín +9CDF=>zūn +9CE0=>hù +9CE1=>gǎn +9CE2=>lǐ +9CE3=>zhān +9CE4=>guǎn +9CE5=>niǎo +9CE6=>yǐ +9CE7=>fú +9CE8=>lì +9CE9=>jiū +9CEA=>bú +9CEB=>yàn +9CEC=>fǔ +9CED=>diāo +9CEE=>jī +9CEF=>fèng +9CF0=>ru +9CF1=>gān +9CF2=>shī +9CF3=>fèng +9CF4=>míng +9CF5=>bǎo +9CF6=>yuān +9CF7=>zhī +9CF8=>hù +9CF9=>qín +9CFA=>fū +9CFB=>bān +9CFC=>wén +9CFD=>jiān +9CFE=>shī +9CFF=>yù +9D00=>fǒu +9D01=>yāo +9D02=>jué +9D03=>jué +9D04=>pǐ +9D05=>huān +9D06=>zhèn +9D07=>bǎo +9D08=>yàn +9D09=>yā +9D0A=>zhèng +9D0B=>fāng +9D0C=>fèng +9D0D=>wén +9D0E=>ōu +9D0F=>dài +9D10=>gē +9D11=>rú +9D12=>líng +9D13=>miè +9D14=>fú +9D15=>tuó +9D16=>mín +9D17=>lì +9D18=>biǎn +9D19=>zhì +9D1A=>gē +9D1B=>yuān +9D1C=>cí +9D1D=>qú +9D1E=>xiāo +9D1F=>chī +9D20=>dàn +9D21=>jū +9D22=>yǎo +9D23=>gū +9D24=>dōng +9D25=>yù +9D26=>yāng +9D27=>ròng +9D28=>yā +9D29=>tiě +9D2A=>yù +9D2B=>tian +9D2C=>yīng +9D2D=>duī +9D2E=>wū +9D2F=>ér +9D30=>guā +9D31=>ài +9D32=>zhī +9D33=>yàn +9D34=>héng +9D35=>xiāo +9D36=>jiá +9D37=>liè +9D38=>zhū +9D39=>yáng +9D3A=>tí +9D3B=>hóng +9D3C=>luò +9D3D=>rú +9D3E=>móu +9D3F=>gē +9D40=>rén +9D41=>jiāo +9D42=>xiū +9D43=>zhōu +9D44=>zhī +9D45=>luò +9D46=>heng +9D47=>nian +9D48=>e +9D49=>luán +9D4A=>jiá +9D4B=>jì +9D4C=>tú +9D4D=>huān +9D4E=>tuǒ +9D4F=>bǔ +9D50=>wú +9D51=>juān +9D52=>yù +9D53=>bó +9D54=>jùn +9D55=>xùn +9D56=>bī +9D57=>xī +9D58=>jùn +9D59=>jú +9D5A=>tū +9D5B=>jīng +9D5C=>tí +9D5D=>é +9D5E=>é +9D5F=>kuáng +9D60=>hú +9D61=>wǔ +9D62=>shēn +9D63=>lài +9D64=>jiao +9D65=>pan +9D66=>lù +9D67=>pí +9D68=>shū +9D69=>fú +9D6A=>ān +9D6B=>zhuó +9D6C=>péng +9D6D=>qín +9D6E=>qiān +9D6F=>bēi +9D70=>diāo +9D71=>lù +9D72=>que +9D73=>jiān +9D74=>jú +9D75=>tù +9D76=>yā +9D77=>yuān +9D78=>qí +9D79=>lí +9D7A=>yè +9D7B=>zhuī +9D7C=>kōng +9D7D=>duò +9D7E=>kūn +9D7F=>shēng +9D80=>qí +9D81=>jīng +9D82=>yì +9D83=>yì +9D84=>jīng +9D85=>zī +9D86=>lái +9D87=>dōng +9D88=>qī +9D89=>chun +9D8A=>gēng +9D8B=>jū +9D8C=>jué +9D8D=>yi +9D8E=>zun +9D8F=>jī +9D90=>shù +9D91=>yīng +9D92=>chì +9D93=>miáo +9D94=>róu +9D95=>ān +9D96=>qiū +9D97=>tí +9D98=>hú +9D99=>tí +9D9A=>è +9D9B=>jiē +9D9C=>máo +9D9D=>fú +9D9E=>chūn +9D9F=>tú +9DA0=>yǎn +9DA1=>hé +9DA2=>yuán +9DA3=>piān +9DA4=>kūn +9DA5=>méi +9DA6=>hú +9DA7=>yīng +9DA8=>chuàn +9DA9=>wù +9DAA=>jú +9DAB=>dong +9DAC=>cāng +9DAD=>fǎng +9DAE=>hè +9DAF=>yīng +9DB0=>yuán +9DB1=>xiān +9DB2=>wēng +9DB3=>shī +9DB4=>hè +9DB5=>chú +9DB6=>táng +9DB7=>xiá +9DB8=>ruò +9DB9=>liú +9DBA=>jí +9DBB=>gú +9DBC=>jiān +9DBD=>sǔn +9DBE=>hàn +9DBF=>cí +9DC0=>cí +9DC1=>yì +9DC2=>yào +9DC3=>yàn +9DC4=>jī +9DC5=>lì +9DC6=>tián +9DC7=>kòu +9DC8=>tī +9DC9=>tī +9DCA=>yì +9DCB=>tú +9DCC=>mǎ +9DCD=>jiāo +9DCE=>gāo +9DCF=>tián +9DD0=>chén +9DD1=>jí +9DD2=>tuán +9DD3=>zhè +9DD4=>áo +9DD5=>yǎo +9DD6=>yī +9DD7=>ōu +9DD8=>chì +9DD9=>zhì +9DDA=>liù +9DDB=>yōng +9DDC=>lǘ +9DDD=>bì +9DDE=>shuāng +9DDF=>zhuó +9DE0=>yú +9DE1=>wú +9DE2=>jué +9DE3=>yín +9DE4=>tí +9DE5=>sī +9DE6=>jiāo +9DE7=>yì +9DE8=>huá +9DE9=>bì +9DEA=>yīng +9DEB=>sù +9DEC=>huáng +9DED=>fán +9DEE=>jiāo +9DEF=>liáo +9DF0=>yàn +9DF1=>gāo +9DF2=>jiù +9DF3=>xián +9DF4=>xián +9DF5=>tú +9DF6=>mǎi +9DF7=>zūn +9DF8=>yù +9DF9=>yīng +9DFA=>lù +9DFB=>tuán +9DFC=>xián +9DFD=>xué +9DFE=>yì +9DFF=>pì +9E00=>chǔ +9E01=>luó +9E02=>xī +9E03=>yí +9E04=>jī +9E05=>zé +9E06=>yú +9E07=>zhān +9E08=>yè +9E09=>yáng +9E0A=>pì +9E0B=>níng +9E0C=>hù +9E0D=>mí +9E0E=>yīng +9E0F=>méng +9E10=>dí +9E11=>yuè +9E12=>yù +9E13=>lěi +9E14=>bào +9E15=>lú +9E16=>hè +9E17=>lóng +9E18=>shuāng +9E19=>yuè +9E1A=>yīng +9E1B=>guàn +9E1C=>qú +9E1D=>lí +9E1E=>luán +9E1F=>niǎo +9E20=>jiū +9E21=>jī +9E22=>yuān +9E23=>míng +9E24=>shī +9E25=>ōu +9E26=>yā +9E27=>cāng +9E28=>bǎo +9E29=>zhèn +9E2A=>gū +9E2B=>dōng +9E2C=>lú +9E2D=>yā +9E2E=>xiāo +9E2F=>yāng +9E30=>líng +9E31=>chī +9E32=>qú +9E33=>yuān +9E34=>xué +9E35=>tuó +9E36=>sī +9E37=>zhì +9E38=>ér +9E39=>guā +9E3A=>xiū +9E3B=>héng +9E3C=>zhōu +9E3D=>gē +9E3E=>luán +9E3F=>hóng +9E40=>wú +9E41=>bó +9E42=>lí +9E43=>juān +9E44=>gǔ +9E45=>é +9E46=>yù +9E47=>xián +9E48=>tí +9E49=>wǔ +9E4A=>que +9E4B=>miáo +9E4C=>ān +9E4D=>kūn +9E4E=>bēi +9E4F=>péng +9E50=>qiān +9E51=>chun +9E52=>gēng +9E53=>yuān +9E54=>sù +9E55=>hú +9E56=>hé +9E57=>è +9E58=>gǔ +9E59=>qiū +9E5A=>cí +9E5B=>méi +9E5C=>wù +9E5D=>yì +9E5E=>yào +9E5F=>wēng +9E60=>liú +9E61=>jí +9E62=>yì +9E63=>jiān +9E64=>hè +9E65=>yī +9E66=>yīng +9E67=>zhè +9E68=>liù +9E69=>liáo +9E6A=>jiāo +9E6B=>jiù +9E6C=>yù +9E6D=>lù +9E6E=>huán +9E6F=>zhān +9E70=>yīng +9E71=>hù +9E72=>méng +9E73=>guàn +9E74=>shuāng +9E75=>lǔ +9E76=>jīn +9E77=>líng +9E78=>jiǎn +9E79=>xián +9E7A=>cuó +9E7B=>jiǎn +9E7C=>jiǎn +9E7D=>yán +9E7E=>cuó +9E7F=>lù +9E80=>yōu +9E81=>cū +9E82=>jǐ +9E83=>páo +9E84=>cū +9E85=>páo +9E86=>zhù +9E87=>jūn +9E88=>zhǔ +9E89=>jiān +9E8A=>mí +9E8B=>mí +9E8C=>yǔ +9E8D=>liú +9E8E=>chén +9E8F=>jūn +9E90=>lín +9E91=>ní +9E92=>qí +9E93=>lù +9E94=>jiù +9E95=>jūn +9E96=>jīng +9E97=>lì +9E98=>xiāng +9E99=>xián +9E9A=>jiā +9E9B=>mí +9E9C=>lì +9E9D=>shè +9E9E=>zhāng +9E9F=>lín +9EA0=>jīng +9EA1=>qí +9EA2=>líng +9EA3=>yán +9EA4=>cū +9EA5=>mài +9EA6=>mài +9EA7=>hé +9EA8=>chǎo +9EA9=>fū +9EAA=>miàn +9EAB=>miǎn +9EAC=>fū +9EAD=>pào +9EAE=>qù +9EAF=>qū +9EB0=>móu +9EB1=>fū +9EB2=>xiàn +9EB3=>lái +9EB4=>qū +9EB5=>miàn +9EB6=>chi +9EB7=>fēng +9EB8=>fū +9EB9=>qū +9EBA=>miàn +9EBB=>má +9EBC=>me +9EBD=>mó +9EBE=>huī +9EBF=>mo +9EC0=>zōu +9EC1=>nún +9EC2=>fén +9EC3=>huáng +9EC4=>huáng +9EC5=>jīn +9EC6=>guāng +9EC7=>tiān +9EC8=>tǒu +9EC9=>hóng +9ECA=>huà +9ECB=>kuàng +9ECC=>hóng +9ECD=>shǔ +9ECE=>lí +9ECF=>nián +9ED0=>chī +9ED1=>hēi +9ED2=>hēi +9ED3=>yì +9ED4=>qián +9ED5=>dǎn +9ED6=>xì +9ED7=>tūn +9ED8=>mò +9ED9=>mò +9EDA=>qián +9EDB=>dài +9EDC=>chù +9EDD=>yǒu +9EDE=>diǎn +9EDF=>yī +9EE0=>xiá +9EE1=>yǎn +9EE2=>qū +9EE3=>měi +9EE4=>yǎn +9EE5=>qíng +9EE6=>yuè +9EE7=>lí +9EE8=>dǎng +9EE9=>dú +9EEA=>cǎn +9EEB=>yān +9EEC=>yán +9EED=>yǎn +9EEE=>dǎn +9EEF=>àn +9EF0=>zhěn +9EF1=>dài +9EF2=>cǎn +9EF3=>yī +9EF4=>méi +9EF5=>zhǎn +9EF6=>yǎn +9EF7=>dú +9EF8=>lú +9EF9=>zhǐ +9EFA=>fěn +9EFB=>fú +9EFC=>fǔ +9EFD=>miǎn +9EFE=>miǎn +9EFF=>yuán +9F00=>cù +9F01=>qù +9F02=>cháo +9F03=>wā +9F04=>zhū +9F05=>zhī +9F06=>méng +9F07=>áo +9F08=>biē +9F09=>tuó +9F0A=>bì +9F0B=>yuán +9F0C=>cháo +9F0D=>tuó +9F0E=>dǐng +9F0F=>mì +9F10=>nài +9F11=>dǐng +9F12=>zī +9F13=>gǔ +9F14=>gǔ +9F15=>dōng +9F16=>fén +9F17=>táo +9F18=>yuān +9F19=>pí +9F1A=>chāng +9F1B=>gāo +9F1C=>qì +9F1D=>yuān +9F1E=>tāng +9F1F=>tēng +9F20=>shǔ +9F21=>shǔ +9F22=>fén +9F23=>fèi +9F24=>wén +9F25=>bá +9F26=>diāo +9F27=>tuó +9F28=>zhōng +9F29=>qú +9F2A=>shēng +9F2B=>shí +9F2C=>yòu +9F2D=>shí +9F2E=>tíng +9F2F=>wú +9F30=>niàn +9F31=>jīng +9F32=>hún +9F33=>jú +9F34=>yǎn +9F35=>tū +9F36=>sī +9F37=>xī +9F38=>xiàn +9F39=>yǎn +9F3A=>léi +9F3B=>bí +9F3C=>yǎo +9F3D=>qiú +9F3E=>hān +9F3F=>wù +9F40=>wù +9F41=>hōu +9F42=>xiè +9F43=>è +9F44=>zhā +9F45=>xiù +9F46=>wèng +9F47=>zhā +9F48=>nòng +9F49=>nàng +9F4A=>qí +9F4B=>zhāi +9F4C=>jì +9F4D=>zī +9F4E=>jī +9F4F=>jī +9F50=>qí +9F51=>jī +9F52=>chǐ +9F53=>chèn +9F54=>chèn +9F55=>hé +9F56=>yá +9F57=>yín +9F58=>xiè +9F59=>bāo +9F5A=>zé +9F5B=>xiè +9F5C=>chái +9F5D=>chī +9F5E=>yǎn +9F5F=>jǔ +9F60=>tiáo +9F61=>líng +9F62=>líng +9F63=>chū +9F64=>quán +9F65=>xiè +9F66=>kěn +9F67=>niè +9F68=>jiù +9F69=>yǎo +9F6A=>chuò +9F6B=>kǔn +9F6C=>yǔ +9F6D=>chǔ +9F6E=>yǐ +9F6F=>ní +9F70=>zé +9F71=>zōu +9F72=>qǔ +9F73=>yǔn +9F74=>yǎn +9F75=>óu +9F76=>è +9F77=>wò +9F78=>yì +9F79=>cī +9F7A=>zōu +9F7B=>diān +9F7C=>chǔ +9F7D=>jìn +9F7E=>yà +9F7F=>chǐ +9F80=>chèn +9F81=>hé +9F82=>yín +9F83=>jǔ +9F84=>líng +9F85=>bāo +9F86=>tiáo +9F87=>zī +9F88=>kěn +9F89=>yǔ +9F8A=>chuò +9F8B=>qǔ +9F8C=>wò +9F8D=>lóng +9F8E=>páng +9F8F=>gōng +9F90=>páng +9F91=>yǎn +9F92=>lóng +9F93=>lǒng +9F94=>gōng +9F95=>kān +9F96=>dá +9F97=>líng +9F98=>dá +9F99=>lóng +9F9A=>gōng +9F9B=>kān +9F9C=>guī +9F9D=>qiū +9F9E=>biē +9F9F=>guī +9FA0=>yuè +9FA1=>chuì +9FA2=>hé +9FA3=>jué +9FA4=>xié +9FA5=>yù +9FC3=>shǎn +20000=>hē +20001=>qī +20003=>qiě +20005=>hài +20009=>qiū +2000A=>cāo +2000D=>shì +20013=>sī +20014=>jué +2001B=>yù +2001D=>kōng +20022=>zī +20026=>xíng +20031=>mǒu +20037=>jī +20038=>yè +20039=>jūn +2003C=>qián +2003D=>lù +20049=>chū +20057=>shì +20060=>qiè +20065=>gǎ +2006D=>qí +20077=>chǎn +20084=>huān +20086=>yì +20087=>zuǒ +20088=>jié +20091=>zōu +20094=>zǐ +2009F=>jīn +200A2=>pài +200A4=>duī +200A5=>cóng +200A7=>shèn +200B8=>huáng +200CA=>yǐn +200CC=>gǔn +200D6=>jiū +200EB=>shēn +200FA=>jiù +20105=>yè +20109=>dòng +2010C=>jué +2010D=>jié +2010F=>diǎo +20111=>jué +20112=>chuí +20116=>líng +2011A=>tīng +20123=>gèn +2012E=>yà +20131=>yí +2013F=>wéi +20142=>jié +2014C=>yí +20157=>diè +2015A=>qí +2016C=>bāo +20171=>xiè +20179=>zhàng +2018C=>yōng +20190=>xù +20199=>diè +2019B=>dān +2019F=>wěi +201A3=>guǎ +201A9=>fàn +201AE=>mò +201B1=>xī +201B2=>yǎn +201B5=>ní +201B6=>dàn +201CB=>dǎn +201CF=>tāo +201D2=>gōng +201D7=>kuā +201D8=>chù +201EF=>qù +201F1=>mò +201F3=>shī +201F5=>gǎn +201F7=>shēng +20201=>tuō +20205=>shōu +2020A=>niě +20224=>yùn +20225=>guǎ +2022C=>xiāo +2022D=>láo +20230=>dàn +20231=>suō +20235=>mǎng +20236=>yí +20238=>tè +2023A=>bì +20242=>tà +20257=>luò +20262=>xǐ +20263=>hūn +20264=>dá +20267=>jù +20269=>dú +2026C=>ǎn +20289=>mèi +2028C=>rán +2028E=>ái +2028F=>yù +20292=>jiàn +20294=>qì +2029F=>mǐn +202A3=>zhòu +202A4=>zhì +202A5=>zhǒng +202A6=>nǎo +202A7=>bìng +202A9=>zhuàn +202AA=>shù +202AB=>xùn +202AC=>jué +202AD=>qiǎn +202B0=>guǎ +202B2=>tū +202B6=>yìng +202B7=>zhì +202BE=>kuí +202C6=>chèn +202D6=>liàn +202D7=>yā +202DC=>guò +202DD=>miǎo +202DE=>shé +202DF=>yǔ +202E1=>sì +202E2=>sǒu +202E4=>zhì +202E7=>qiē +202E9=>fù +202EC=>jú +202ED=>bèi +202EF=>bì +202F2=>suǒ +202F5=>qiǎn +202F6=>mǐng +202F7=>chǎn +202FA=>sāo +202FB=>jī +20315=>gòng +20316=>qióng +2031A=>ròng +2031E=>sǒu +2031F=>sǒu +20320=>yáo +2032A=>chōu +2032D=>shuài +2032E=>zhē +2032F=>lì +20330=>gài +20331=>suī +20332=>zhān +20334=>zhuàng +2033D=>fù +20343=>jī +20344=>dōu +20357=>huì +2035A=>jiǎn +2035B=>yǎn +2035C=>zhì +20368=>měi +20369=>yào +2036A=>dī +2036B=>yí +2036F=>bié +20372=>qú +20373=>yì +20375=>yàng +20379=>zhá +2037D=>shà +20399=>lái +203AE=>jué +203B0=>qī +203B3=>yú +203B6=>zǎi +203B7=>sà +203B8=>sè +203BB=>dùn +203BF=>jiě +203C0=>kē +203C3=>yuē +203C7=>jiǎn +203C8=>yáo +203D3=>xiān +203D5=>xiào +203D6=>qiāo +203DA=>yù +203DB=>qú +203E1=>xiān +203E2=>luò +203E4=>guǎng +203E7=>chēng +203E8=>chuǎng +203E9=>yí +203EB=>zhěng +203ED=>zòng +203EE=>duì +203F0=>zhǎi +203FF=>fěi +20400=>yí +20401=>méng +20408=>biān +20409=>jié +2040A=>shù +2040B=>liáo +2040C=>bǐ +2040D=>sú +20411=>dì +20421=>bèi +20422=>wèn +20427=>méng +20429=>chǎn +20435=>dǎo +2043A=>pín +2043B=>jiǎn +2043C=>lìn +2043D=>guì +2043E=>qī +2043F=>hōng +20443=>jí +20444=>xiè +20445=>zhēng +20446=>chǎn +20450=>yáo +20451=>chǎn +20458=>diān +20459=>chòng +2045A=>néi +2045B=>néi +2045E=>zhài +2045F=>biān +20461=>chǎn +2046A=>xiāo +2046F=>cù +20470=>xīn +20471=>jǐng +20472=>qiān +20474=>qīng +20479=>gǔ +20484=>wù +2049C=>yuǎn +2049D=>bǐng +204A2=>wán +204B0=>niǎo +204B5=>liàn +204B8=>rǎo +204BE=>fàn +204BF=>dí +204CA=>huī +204CB=>yì +204CC=>xián +204D6=>lán +204D7=>fù +204D9=>xiòng +204DC=>liǎng +204DD=>tāo +204DE=>jí +204E2=>jiè +204E3=>zhá +204E4=>shī +204EA=>qí +204EB=>biǎn +204ED=>lǎn +204EE=>lǐn +204F6=>zhì +204F7=>bì +204F8=>shèng +204FD=>shèng +204FF=>qín +20502=>biāo +20503=>xī +20509=>juàn +2050B=>jī +2050D=>xī +2050E=>qǐn +20511=>hài +20515=>lún +20520=>yuè +20528=>lián +2052F=>bān +20532=>héng +20536=>qī +2053A=>qiān +2053B=>zhèng +2053C=>mǎo +20541=>cóng +20544=>nà +2054A=>tǐng +2054C=>zōng +20555=>jiōng +20556=>zhǎo +2055F=>niǎn +20560=>chéng +20563=>qià +20566=>yù +20567=>jiǎo +2056D=>zhào +20573=>dí +20574=>jiū +20578=>suǐ +2057B=>yāo +2057F=>wāng +20582=>liáo +20584=>tóng +20586=>mèng +2058B=>yǒu +20593=>sī +2059B=>lòu +2059F=>yīn +205A5=>chǒng +205AB=>gǎn +205AC=>jiū +205B6=>qìn +205B7=>jiǒng +205B9=>xié +205C2=>hè +205C6=>tāo +205C8=>qiú +205C9=>xié +205CA=>jìng +205CB=>niǎn +205CC=>jìng +205CF=>jí +205D8=>tiǎn +205DA=>cuì +205DB=>dié +205DD=>qǐng +205E5=>pìng +205E6=>píng +205E8=>dié +205E9=>lòu +205F3=>liǎn +205F4=>hán +205F5=>pāng +205F6=>táng +205FA=>yí +205FB=>xuán +205FC=>suò +205FD=>liú +205FE=>shuǎng +205FF=>shèn +20601=>bù +20602=>sōu +20605=>qín +20606=>shěn +2060A=>nòng +2060B=>tǐng +2060C=>jiāng +20615=>xī +20616=>zhì +2061D=>lài +2061E=>lì +2061F=>lì +20622=>hé +20623=>jiào +20625=>yán +20627=>shū +2062A=>shǐ +20631=>zhěn +20633=>yōu +2063A=>suò +2063B=>wú +20641=>cháng +20642=>cóng +20646=>jù +2064E=>shū +20654=>jiù +20655=>wéi +2065E=>huò +20664=>jiē +2066C=>zǎo +20676=>ǒu +2067C=>guǎ +20683=>háo +20684=>lǐ +20685=>zhì +20686=>xiàn +20689=>bū +2068A=>chàng +20693=>yūn +20694=>hé +2069C=>tāo +206A0=>biāo +206A5=>diāo +206A7=>èr +206A8=>jiū +206AD=>dì +206AE=>yì +206AF=>kūn +206B1=>zhé +206B3=>kuò +206B4=>zhōu +206B5=>jù +206B9=>shàn +206BA=>shà +206BB=>diāo +206BC=>bān +206BD=>jī +206C0=>zhōng +206C3=>yí +206C5=>kōu +206C6=>wū +206CA=>gē +206CB=>bā +206CE=>gōu +206D1=>xián +206D2=>guā +206D3=>liǔ +206D4=>chǐ +206D5=>guāi +206D6=>chuān +206D8=>lí +206D9=>cù +206DA=>shuā +206E1=>bǐ +206E5=>bǐng +206E6=>lì +206E9=>jiǔ +206EA=>tiāo +206EB=>duǒ +206ED=>yān +206EE=>quān +206F1=>liè +206F3=>kè +206F5=>gēn +206F6=>zhēn +206F8=>fén +20701=>yí +20703=>jiù +20704=>xù +20705=>jiǎo +20708=>lǜ +20709=>jiǔ +2070B=>chǒu +2070E=>xiàn +20710=>kuài +20711=>duì +20716=>luō +20717=>xī +20718=>qìn +20719=>bù +20724=>qià +20731=>pī +20732=>yā +20733=>bēng +20734=>guǒ +20735=>guā +20739=>jú +2073C=>qiā +2073E=>jué +20744=>lì +20750=>huā +20751=>jiāo +20758=>qià +2075A=>zhá +2075B=>qiā +2075D=>zhé +2075E=>chā +2075F=>yǐng +20762=>yān +20764=>chōng +20768=>chǐ +2076A=>wān +2076C=>sōu +20772=>kǎn +20773=>yuán +2077D=>chóu +2077F=>suǒ +20780=>tū +20783=>zhé +20784=>tī +20786=>wū +20788=>dā +20789=>lì +2078A=>chā +20795=>róng +20796=>gòng +20797=>què +20799=>lí +2079E=>tāo +207A4=>lì +207A7=>mí +207A9=>chì +207AC=>gùn +207AD=>lóu +207AE=>chuǎng +207AF=>suǒ +207B0=>jiǎo +207B1=>jìn +207B5=>fá +207B6=>zhāi +207BE=>jìn +207BF=>cuì +207C2=>cèng +207C3=>zǔn +207C5=>zhào +207C8=>piē +207C9=>zhǎn +207CA=>xī +207CB=>yào +207CC=>fǔ +207CD=>chōng +207D3=>cuì +207D7=>guā +207E3=>jī +207E6=>sè +207E7=>zhān +207E8=>lìng +207E9=>sè +207EA=>yè +207F0=>jū +207F6=>tū +207FA=>rú +207FB=>zé +207FC=>huán +20801=>xiǎn +20803=>qiān +20804=>zhào +2080B=>cán +2080E=>kuò +2080F=>lì +20810=>róu +20814=>dú +20817=>liè +2081C=>yīng +2081D=>lì +20820=>dú +20822=>líng +2082A=>wān +2082F=>dié +20833=>jiū +20835=>lì +20836=>kū +20837=>kēng +20839=>zhěn +20840=>hè +20842=>bì +20844=>pī +2084A=>hāng +20851=>zhuó +20852=>duǐ +20854=>yì +2085C=>kè +2085D=>yì +2085E=>mò +20861=>cán +20863=>gěng +20864=>kè +20865=>shì +2086D=>líng +2086E=>bēng +20871=>duàn +20876=>juān +20877=>nǎo +20878=>zǐ +2087B=>zòng +20883=>táng +20886=>xiá +20887=>hàn +2088C=>lüè +2088D=>qián +20893=>mò +20894=>ōu +20895=>háo +20899=>zhá +2089A=>juàn +2089B=>cóng +208A0=>lì +208A1=>zhá +208A2=>yǒu +208A3=>diàn +208A4=>jué +208A5=>bèi +208A9=>yǎo +208AA=>piē +208B1=>jìn +208B2=>kǎi +208B3=>sè +208B4=>yǎng +208B5=>jìn +208B9=>kè +208C4=>chān +208C7=>niǎn +208C9=>wàn +208CA=>lǜ +208D0=>yún +208D1=>yāo +208D2=>bāo +208D5=>jūn +208D6=>xuán +208D8=>zhōu +208E0=>kuì +208E1=>fèng +208EA=>qú +208EB=>shào +208EC=>sǔn +208F0=>dū +208F2=>kuǎi +208F3=>pào +208FA=>bào +208FE=>fù +208FF=>jiù +20900=>rán +20904=>jū +2090A=>qióng +2090D=>zhōu +2090E=>huà +2090F=>bǎo +20915=>yí +20917=>yí +20918=>yí +2091D=>mào +20926=>ruǎn +2092B=>cí +2092E=>hán +20930=>cóng +20934=>xì +20939=>quán +2093A=>tiáo +2093C=>diào +2093E=>hán +20947=>yě +2094D=>ē +2094E=>wéi +20950=>cāng +20951=>diào +20955=>è +20956=>dì +20958=>suǎn +20959=>quán +2095C=>è +2095D=>ōu +2095E=>xuán +20962=>wǔ +20966=>yì +20968=>móu +20970=>hū +20974=>hán +2097F=>shí +20983=>sà +20988=>bì +2098A=>hán +2098B=>jìng +2098E=>qìn +2098F=>cuó +20990=>cì +20992=>bān +20997=>duī +2099C=>xì +209A7=>zhī +209A8=>luàn +209AA=>hū +209AB=>jí +209AC=>guāi +209B2=>pāng +209C0=>zhū +209C5=>bǐ +209C7=>yú +209D2=>qǐ +209D5=>hé +209D6=>chǔ +209D9=>shào +209DA=>chì +209DB=>bó +209DF=>réng +209E0=>yóu +209E4=>nǎi +209E9=>huì +209EA=>tiáo +209EB=>bǎn +209F0=>xū +209F4=>yóu +209F5=>chì +209FF=>héng +20A03=>wài +20A06=>xiè +20A0A=>jué +20A0C=>suī +20A0D=>qīng +20A0E=>zhuàn +20A15=>jì +20A18=>bì +20A1A=>xī +20A20=>jí +20A22=>jùn +20A25=>liáo +20A26=>yōu +20A2D=>jú +20A32=>yuè +20A35=>bàng +20A38=>pí +20A3B=>zè +20A3E=>yì +20A3F=>dǐ +20A42=>qiè +20A44=>suǒ +20A46=>cì +20A48=>zhù +20A49=>yuè +20A4F=>jiāo +20A54=>shí +20A57=>yí +20A58=>xiá +20A60=>yuán +20A65=>guó +20A67=>kè +20A6A=>cuì +20A6B=>yì +20A75=>lì +20A77=>diǎn +20A7A=>xī +20A7F=>bì +20A82=>biǎn +20A83=>méi +20A84=>lì +20A87=>sǒu +20A90=>liú +20A91=>guì +20A92=>kè +20A97=>yí +20A99=>xǐ +20A9A=>yín +20A9F=>kè +20AA3=>shè +20AA7=>wǒ +20AAE=>pì +20AB6=>yuè +20AB7=>hóng +20ABA=>lì +20ABB=>fù +20AC3=>jué +20AC4=>xiān +20AC9=>diān +20ACC=>lì +20AD3=>tū +20AD8=>jiān +20ADB=>bǎi +20ADC=>dì +20ADD=>zhǎng +20AE3=>yù +20AE8=>duì +20AED=>cān +20AEE=>tú +20AF6=>tān +20AF7=>jí +20AF8=>qí +20AF9=>shàn +20AFA=>nián +20B06=>guàn +20B08=>bǐ +20B0B=>xīng +20B13=>zhěn +20B19=>sā +20B1B=>mò +20B1D=>fú +20B22=>tāo +20B23=>bàng +20B2A=>biào +20B2C=>xī +20B2E=>jié +20B36=>jìn +20B3E=>qiān +20B48=>sì +20B49=>jǐng +20B4B=>chǐ +20B57=>jǐng +20B65=>suì +20B6F=>zhā +20B70=>lí +20B74=>zhuō +20B79=>biàn +20B7F=>tún +20B83=>bì +20B86=>fèi +20B8A=>dé +20B8C=>zhú +20B91=>jū +20B99=>yǐ +20B9C=>yà +20B9F=>chì +20BA0=>guǎ +20BA1=>zhǐ +20BA8=>réng +20BAB=>yōu +20BAD=>bó +20BAF=>jǐ +20BB0=>pǐn +20BB3=>yīng +20BB4=>yāng +20BB5=>màng +20BBD=>lòng +20BBE=>ǹ +20BBF=>sa +20BC0=>chuān +20BC2=>cí +20BC3=>wǔ +20BC4=>rèn +20BC8=>dài +20BC9=>jí +20BCB=>yǐ +20BCD=>rán +20BD0=>huò +20BD1=>guā +20BD3=>zhé +20BD4=>pì +20BD7=>zā +20BD8=>bàn +20BD9=>jié +20BDC=>hōu +20BDF=>xiàn +20BE0=>huī +20BE9=>zhā +20BEA=>dāi +20BEB=>gē +20BED=>pì +20BEF=>piàn +20BF0=>shí +20BF1=>liǎng +20BF2=>yuè +20BF3=>hù +20BF4=>biàn +20BF7=>réng +20BF9=>réng +20C04=>yī +20C05=>zhī +20C07=>jīn +20C08=>wēng +20C09=>chāo +20C0B=>qiū +20C0D=>zhǔ +20C0F=>zhá +20C10=>pǒ +20C11=>àn +20C13=>hé +20C15=>chū +20C16=>yán +20C1A=>shì +20C1B=>hù +20C1C=>è +20C34=>shí +20C39=>tuō +20C3A=>dài +20C3B=>wài +20C3C=>pō +20C3D=>rǒng +20C3E=>jū +20C40=>bō +20C50=>yǔ +20C51=>dōu +20C53=>guǐ +20C54=>shòu +20C57=>suō +20C58=>nì +20C59=>zhōu +20C5A=>lòng +20C5B=>bǐng +20C5C=>zùn +20C5D=>yè +20C5E=>rǎn +20C60=>líng +20C61=>sà +20C64=>lěi +20C65=>è +20C67=>zhòng +20C68=>jǐ +20C6B=>è +20C6F=>zuò +20C72=>nà +20C73=>yǔn +20C8A=>xiè +20C8B=>zuǐ +20C8C=>shù +20C8D=>diū +20C8E=>fa +20C8F=>rěn +20C91=>bāng +20C92=>hán +20C93=>hóng +20C94=>yī +20C96=>yī +20C99=>kē +20C9A=>yì +20C9B=>huí +20C9C=>zhēng +20CAE=>jìng +20CB1=>gé +20CB4=>nóu +20CB5=>qiè +20CB7=>dié +20CB9=>jì +20CBA=>yì +20CBB=>yí +20CBD=>fú +20CBE=>shuò +20CBF=>shuò +20CC0=>yǒng +20CC1=>kěn +20CC2=>huá +20CC3=>hòng +20CC7=>hé +20CCA=>hē +20CCB=>qiǎn +20CCC=>qià +20CCE=>sì +20CD0=>bāng +20CEC=>jīng +20CED=>kè +20CF3=>āi +20CF4=>lóu +20CF6=>tū +20CF9=>chuáng +20CFC=>sòng +20CFD=>chéng +20CFF=>wēi +20D02=>nǔ +20D04=>jiǔ +20D07=>bīn +20D21=>xiào +20D22=>shēng +20D23=>hǒu +20D26=>zhù +20D28=>guān +20D29=>jī +20D2B=>jì +20D2D=>xī +20D2F=>shè +20D30=>ǒu +20D31=>hú +20D32=>tà +20D33=>xiáo +20D35=>zào +20D38=>bò +20D39=>qì +20D3A=>wā +20D3B=>tuō +20D3C=>dào +20D3E=>nà +20D60=>zhāi +20D63=>yà +20D66=>wǔ +20D67=>zhén +20D68=>de +20D69=>hē +20D6B=>āng +20D6C=>pí +20D6D=>sè +20D6E=>fěn +20D6F=>guā +20D73=>pǒ +20D77=>xuàn +20D78=>hān +20D79=>gāng +20D7A=>bā +20D7B=>zōng +20D7C=>mèng +20D7E=>huò +20DA7=>diān +20DA8=>xī +20DAB=>dà +20DAC=>nàng +20DB0=>diāo +20DB1=>luò +20DB2=>kè +20DB7=>yì +20DB8=>jué +20DB9=>hé +20DBB=>jí +20DBE=>hè +20DBF=>niè +20DC0=>rǔn +20DC1=>qián +20DC2=>dài +20DC3=>shāo +20DC4=>kè +20DC5=>zhú +20DC7=>shī +20DC8=>lǜ +20DC9=>jiā +20DCA=>pián +20DCB=>hòu +20DCC=>jī +20DCD=>tà +20DCE=>chóu +20DCF=>wō +20DD0=>jìng +20DD1=>pō +20DD2=>zhāi +20DD3=>xīn +20DD6=>biàn +20DD9=>xù +20DDE=>gū +20DDF=>jiè +20DE2=>xián +20DF8=>é +20DFA=>bó +20DFB=>piāo +20DFF=>zǎ +20E01=>pài +20E02=>tū +20E04=>yīng +20E2E=>xiǎng +20E31=>nuò +20E32=>gē +20E33=>bó +20E34=>xiè +20E38=>zhēn +20E39=>yú +20E3A=>nì +20E40=>xùn +20E41=>wà +20E43=>àng +20E44=>hàn +20E45=>hōng +20E46=>dān +20E48=>nuó +20E4A=>cǎo +20E4B=>jí +20E4C=>něng +20E4D=>yǒng +20E4E=>xiāo +20E50=>chuǎ +20E51=>yào +20E53=>gé +20E54=>táng +20E55=>bào +20E56=>chǎn +20E58=>xù +20E5B=>hái +20E5D=>chóu +20E5F=>jiǎn +20E60=>zuō +20E64=>wèi +20E65=>dā +20E66=>pī +20E90=>huàn +20E92=>xī +20E94=>pèn +20E95=>liū +20E96=>mǔ +20E97=>miē +20E98=>làng +20E99=>tuì +20E9A=>bān +20E9D=>gē +20E9F=>kù +20EA2=>jiā +20EA3=>bō +20ECD=>huàn +20ECF=>zú +20ED0=>luò +20ED7=>lí +20ED9=>hé +20EDA=>mó +20EDC=>shuì +20EDD=>shēn +20EDE=>kǎng +20EDF=>chì +20EE0=>líng +20EE1=>luǒ +20EE4=>yǎn +20EE5=>zhào +20EE6=>chuǎ +20EE7=>gǔ +20EE8=>qǐn +20EEA=>tán +20EEB=>fèn +20EEC=>tú +20EF1=>líng +20EF4=>lǎng +20F16=>lán +20F17=>zàn +20F18=>wù +20F1D=>lí +20F1E=>ā +20F1F=>lüè +20F20=>zhǐ +20F21=>chóu +20F22=>jiàng +20F24=>jiān +20F29=>lún +20F2A=>yí +20F2C=>shāng +20F3B=>jī +20F5C=>yì +20F5D=>nín +20F61=>huì +20F63=>zhā +20F66=>hǎn +20F68=>yǐn +20F69=>bì +20F6A=>ān +20F6B=>xiā +20F6C=>ní +20F70=>dī +20F71=>jiǎn +20F72=>pán +20F75=>yù +20F76=>chuài +20F77=>zā +20F79=>chá +20F7B=>zhé +20F7C=>sè +20F7E=>pēn +20F7F=>gū +20F80=>zhé +20F86=>lí +20F87=>dōu +20F89=>chóu +20F8B=>zuǐ +20F8C=>pò +20F8F=>shē +20F90=>lóng +20FA2=>shù +20FA4=>jìn +20FA5=>líng +20FA8=>kāng +20FA9=>là +20FAB=>xū +20FAC=>jìn +20FAE=>chuān +20FB2=>yuè +20FC6=>mǎi +20FC7=>xiè +20FC8=>jiū +20FC9=>jì +20FCB=>yuè +20FCF=>jiān +20FD1=>hán +20FD3=>sà +20FD4=>huì +20FD5=>qiào +20FD7=>sè +20FD8=>zuǐ +20FDB=>lǔ +20FDC=>huà +20FDD=>chū +20FDE=>shǎn +20FDF=>wò +20FE0=>jí +20FE1=>zhuó +20FE2=>xián +20FE3=>yī +20FE4=>guó +20FE5=>kuì +21011=>zhōu +21014=>lù +21016=>bō +21017=>shí +21018=>yìng +21019=>kū +21039=>zhì +2103A=>xié +2103D=>yè +2103E=>è +2103F=>lǜ +21040=>hàn +21041=>yè +21046=>luò +21047=>chuò +21048=>fàn +21049=>zhí +2104A=>yìng +2104B=>wěn +2104C=>wā +2104D=>ài +2104E=>yú +21051=>huā +21053=>liè +21054=>jīng +21055=>zá +21067=>zāng +21068=>duì +2106A=>jì +2106E=>wō +21070=>jí +21071=>xī +21073=>zhàn +21074=>tuán +2108A=>yú +2108F=>liè +21092=>zhì +21093=>shī +21095=>lǎo +21096=>lài +21097=>wěi +21098=>páo +21099=>chí +2109A=>yǐng +2109B=>dòu +2109D=>dòu +2109F=>bào +210A0=>qiè +210A1=>shù +210A3=>zhí +210A9=>liè +210AB=>péng +210AD=>zhē +210BF=>ōu +210C2=>xiè +210C3=>jí +210C4=>lài +210C5=>yíng +210C6=>cēng +210D6=>lē +210DD=>lùn +210E1=>lóng +210E2=>xì +210E6=>lìn +210E9=>guī +210F3=>xīng +210F7=>lí +210F8=>cī +21107=>qǐng +21111=>jiān +21112=>dào +21113=>jiǎn +21114=>qìng +21115=>xiè +21116=>yìng +2111F=>há +21121=>zhe +21122=>shē +21123=>mí +21124=>huán +21131=>cù +21132=>rú +21133=>sǎ +21134=>huò +21135=>yī +21137=>dī +21139=>luàn +2113B=>yì +21142=>bò +21143=>páng +21144=>tán +21145=>é +21146=>zāng +21147=>cóng +21153=>zhāi +21155=>xǐ +21156=>mǎng +21158=>là +21159=>yùn +21161=>è +21165=>dié +2116D=>guān +21171=>huàn +21175=>shì +21176=>jiǎn +21179=>zhān +2117A=>jí +2117B=>huàn +21185=>wàn +21186=>luǒ +2118F=>dòu +21195=>liàn +211A3=>niè +211A4=>nǎn +211A5=>jiù +211A6=>yuè +211A9=>yāo +211AA=>chuāng +211AE=>cǎn +211AF=>lǐ +211B0=>dùn +211B1=>nǎn +211B2=>nǎn +211B8=>rì +211BD=>yuè +211C0=>yóu +211C2=>yīn +211C4=>guó +211C8=>dàng +211D1=>zhēn +211D2=>mí +211D3=>dié +211D6=>zhēn +211DA=>kuā +211DC=>hán +211DD=>sòng +211DE=>hé +211DF=>jī +211E0=>zhé +211E4=>bǐng +211E6=>wéi +211E7=>tōu +211E9=>tú +211EC=>gāng +211ED=>lóu +211EE=>quán +211EF=>hùn +211F0=>zhuǎn +211F1=>què +211F3=>hóng +211F5=>dàng +211F6=>hé +211F7=>tài +211F8=>guāi +211FA=>yù +211FC=>yà +211FF=>wān +21200=>qūn +21205=>jué +21206=>ōu +21209=>quān +2120A=>zhí +2120D=>líng +2120E=>wū +2120F=>xìn +21210=>dá +21212=>yuān +21213=>yuàn +21217=>mò +21219=>yóu +2121E=>wǔ +21220=>zhāng +21223=>xuān +21226=>rǎo +21227=>gǔn +21228=>yù +2122E=>xiá +2122F=>biǎn +21230=>yóu +21232=>yīn +21234=>xuán +21235=>yóu +21236=>léi +2123C=>tǐng +2123F=>zhēn +21244=>zài +21245=>gā +21246=>lá +21249=>què +2124E=>jú +21250=>chūn +21251=>dā +21252=>tún +21253=>āi +21257=>zǐ +2125A=>huáng +2125B=>yì +21269=>bào +2126A=>chí +2126D=>rì +21274=>lú +21277=>jié +21278=>shì +2127A=>zuān +21281=>yì +21284=>fèn +21285=>fèn +21289=>mò +2128D=>shù +2129B=>áo +2129D=>pǐ +2129E=>píng +2129F=>pō +212A0=>jiá +212A1=>zhóu +212A3=>qiū +212A7=>yǒu +212A8=>tán +212AB=>rǒng +212AD=>mì +212B6=>yì +212B8=>rǒng +212BB=>liè +212BC=>qióng +212D9=>huí +212DA=>jì +212DF=>gào +212E7=>yóu +212E8=>chā +212E9=>dé +212EA=>yīn +212EC=>yù +212ED=>bèi +212EF=>bó +21314=>qiāo +2131A=>chǎ +2131C=>xīn +2131E=>chí +21323=>zào +21324=>kuí +21326=>fèi +21329=>tā +2132A=>guài +2132D=>duō +21332=>guī +21334=>zhí +2134C=>chǎn +2134D=>nǎo +21350=>hú +21352=>táo +21361=>yì +21364=>niè +21365=>zhài +21366=>huán +21368=>dù +2136A=>qì +2136B=>cè +2136E=>chuí +21372=>dā +21376=>zhì +21377=>gèng +2137B=>wèng +21389=>dù +2138D=>chí +21391=>àn +21392=>kuò +21394=>wò +21398=>yīng +2139A=>piǎn +213AB=>zhá +213AC=>zhuǎ +213AE=>sù +213B3=>nì +213BA=>zhú +213BB=>chán +213BE=>bèng +213BF=>ní +213C0=>zhí +213C1=>huì +213D8=>xià +213DA=>zhì +213DB=>xī +213DE=>jiǎng +213E9=>duī +213EA=>fū +213ED=>jiāo +213EE=>cháo +213EF=>bài +213F5=>liè +213FC=>áo +2140B=>zāo +2140C=>chù +2140F=>tuǒ +21412=>háo +21413=>kāng +21414=>yín +21416=>xiàn +2141D=>fù +2141E=>biē +21420=>kuī +21424=>qiè +21425=>sà +2143F=>dā +21440=>yě +21444=>zhǎng +21446=>liáng +21448=>duǐ +2144D=>láo +2144E=>xūn +21458=>zhì +2145A=>kū +2145E=>suì +2145F=>wō +21463=>kū +2146F=>jiǎn +21476=>jiǎng +2147B=>zhuì +2147D=>shuǎng +2147E=>yú +21481=>sà +21483=>yù +21484=>lǎn +2148A=>yù +2148C=>qiǎn +2148D=>jù +2148F=>liè +21492=>shú +21493=>xiàn +21496=>gài +214A2=>tái +214A7=>tiǎn +214AF=>mèng +214B1=>dí +214B3=>mián +214BE=>huī +214C9=>duò +214CD=>liè +214D2=>lài +214D3=>yín +214D4=>lǎn +214D6=>jiāo +214D8=>huò +214E3=>guō +214E6=>zhàn +214ED=>mǐ +214F0=>kuī +214F7=>duò +214FF=>yín +21507=>lèi +21515=>gòng +2151B=>tǐng +2151C=>yáo +2151E=>wǎng +21523=>jié +21528=>xiū +2152A=>shù +21531=>wèi +21534=>yù +21541=>zhān +21549=>āng +2154F=>sǎng +21550=>chóu +21552=>kuà +21556=>jǔ +21557=>hài +21562=>miǎn +21567=>hàng +2156A=>chóu +2156E=>líng +21570=>zōng +21589=>kūn +2158C=>zhōng +2158E=>zhāo +21590=>diě +21591=>gǒu +21592=>yún +21593=>dān +21594=>nuǒ +2159B=>bǐng +2159D=>rán +2159E=>chān +215A2=>rǒng +215A3=>yīn +215A4=>chān +215A7=>zhì +215AA=>guài +215AB=>nuó +215AC=>shēn +215AF=>sù +215B2=>wǒ +215B3=>chǐ +215BA=>miè +215BB=>zhí +215BE=>qī +215C1=>gōu +215C6=>lǒu +215C8=>zī +215CD=>dǎng +215CF=>xiǎn +215D1=>rǒu +215D7=>pěng +215DE=>xī +215E2=>kuā +215E4=>guì +215E5=>chún +215E6=>jiè +215F2=>jiè +215F3=>xī +215F5=>kū +215F7=>gū +215F8=>zhà +215F9=>fàn +215FC=>xiè +2160D=>huán +2160F=>niǎo +21610=>xì +2161B=>cū +2161D=>gǔn +21621=>xī +21627=>qiá +2162A=>māng +2162D=>zhé +21630=>juàn +21634=>biē +21640=>biē +21645=>quán +2164B=>xì +2164E=>jiǎo +21650=>quán +21651=>zhǐ +21652=>tiān +21653=>kāi +21658=>sǎn +2165B=>zī +21663=>jié +2166A=>bié +2166C=>dòu +2166D=>zuī +21676=>yǎn +21681=>bì +21685=>kuǎi +21687=>yàn +21688=>wéi +2168A=>huān +2168C=>hào +21691=>gōng +21694=>méng +21697=>lěi +21699=>dì +2169B=>bǐng +2169C=>huān +2169F=>wā +216A0=>jué +216A8=>chì +216AD=>bā +216AE=>jiǔ +216B7=>dì +216B9=>zhàng +216BB=>dà +216BC=>shí +216BD=>hào +216CC=>yè +216D7=>bì +216D8=>pǐ +216D9=>yǎo +216DC=>dī +216DD=>càn +216DE=>pín +216DF=>yuè +216E0=>qiē +216E1=>pī +216F5=>tuǒ +216F6=>xiè +216FD=>yè +21700=>fàn +21701=>guā +21702=>hù +21703=>rǔ +21709=>rǎn +2170A=>fǒu +2170B=>huāng +2171A=>rú +21722=>mǎo +21725=>duī +21726=>huì +21727=>xì +21728=>xiū +2172B=>rǎn +2172C=>yī +2172F=>zhé +21731=>jì +21732=>gào +21733=>yòu +21735=>pū +21748=>chù +21749=>cū +2174A=>zhé +2174B=>niǎo +2174D=>qiè +21750=>chá +21752=>niǎo +21753=>suī +21759=>chá +2175A=>chéng +2175B=>yáo +2175C=>dù +2175D=>wāng +2175F=>niàn +21760=>mí +21766=>nǒu +21767=>xì +21769=>yāo +2176B=>chān +21798=>xiè +21799=>miè +2179A=>kěng +2179C=>cù +2179E=>shěng +2179F=>pàn +217A0=>hù +217A2=>kè +217A3=>xiàn +217A5=>hóu +217A6=>qióng +217A7=>zōng +217AA=>fú +217AB=>nài +217AD=>nì +217AF=>kǔ +217BE=>nèn +217CD=>gē +217D1=>hóu +217D3=>āi +217D5=>shī +217DE=>xiū +217DF=>cōng +217E0=>jiāo +217E2=>zhá +217E3=>xiāo +217E4=>liàn +217E5=>qǔ +217E8=>shǎn +217E9=>xiè +217EB=>gòng +217EC=>miè +217ED=>chái +217EF=>ēn +217F3=>dòu +21806=>kòu +2180A=>tiáo +2180B=>shī +2180F=>sāng +21812=>guān +21816=>hào +21817=>zhì +21818=>yàng +21819=>tōng +2181A=>bì +2181C=>mó +2181E=>fú +21825=>qiáng +21839=>zhì +2183C=>sōu +2183F=>niǎo +21840=>juàn +21842=>yàng +21844=>huāng +21848=>bēng +21849=>mó +2184A=>cháo +2184E=>lǚ +2184F=>shāo +21850=>bǔ +21851=>zēng +21852=>sī +21854=>zuì +21855=>yuē +21856=>zān +21857=>luǎn +21865=>qú +2187A=>miǎo +21880=>zhuàn +21888=>dàng +2188A=>yuān +21892=>jǔ +21895=>huǐ +21896=>qì +21898=>yùn +2189A=>màn +2189C=>mǒ +218B1=>piāo +218B3=>jìn +218B9=>yāo +218C0=>chì +218C1=>nì +218C2=>sōu +218C8=>shù +218CB=>piāo +218D4=>hàn +218E0=>yāo +218E2=>néi +218EA=>shì +218EC=>yuān +218EE=>cài +218EF=>jié +218F9=>xiè +218FD=>yán +218FE=>xiāo +2190B=>xiè +2190C=>lì +2190E=>fàn +21917=>zhù +21919=>nà +2191B=>zhuǎn +2191E=>kuī +21922=>luó +2192B=>qiā +21936=>wān +2193D=>shǔ +2193F=>chèng +21941=>yì +21946=>hǎo +21948=>jiào +2194B=>huì +2194D=>xiào +2194E=>cí +2195E=>jì +21966=>nǐ +21968=>nǐ +21969=>tǐ +21976=>jù +21978=>mìng +2197D=>lí +2197F=>zhòng +21981=>xù +21983=>qióng +21984=>fú +21986=>bìn +2198A=>jì +2198D=>qí +2198E=>xì +21994=>dèng +21995=>ér +2199B=>shú +2199C=>tóng +2199D=>xiáo +2199F=>pí +219A8=>dǎn +219AA=>jí +219B3=>xiào +219B7=>cóng +219BB=>bīn +219BC=>rǒng +219CD=>miàn +219D2=>miàn +219D4=>shū +219D5=>xiáo +219D6=>bǎo +219D7=>wà +219D9=>pào +219E3=>gǎi +219E5=>hū +219E6=>héng +219E8=>zhú +219E9=>guāi +219ED=>guì +219F9=>dài +219FC=>bīn +219FD=>huǎng +21A00=>chá +21A04=>xià +21A05=>jú +21A07=>yǎo +21A16=>fěn +21A17=>zào +21A1B=>fēng +21A22=>jū +21A23=>yù +21A29=>hūn +21A32=>jié +21A33=>xiòng +21A35=>nài +21A3B=>nǒu +21A3D=>shěng +21A3F=>yù +21A42=>huán +21A43=>gěng +21A44=>wǎn +21A46=>tuó +21A47=>qiāo +21A58=>yìn +21A5A=>jiā +21A61=>suǒ +21A63=>jié +21A64=>xī +21A65=>wěng +21A69=>máng +21A76=>yáng +21A78=>yáo +21A7D=>máng +21A7E=>ōu +21A81=>án +21A85=>lòu +21A91=>è +21A92=>zǐ +21A97=>è +21A99=>àn +21A9E=>huò +21AA0=>céng +21AB0=>xiòng +21AB1=>jì +21AB3=>zuó +21AB5=>qí +21ABA=>zhēng +21AC0=>jī +21AC1=>qī +21AC2=>juǎn +21AC3=>níng +21ADF=>sè +21AE5=>hè +21AE6=>rǒng +21AE7=>qǐn +21AEC=>jū +21AEF=>lì +21AF5=>shí +21AF8=>nì +21AF9=>xián +21AFA=>fū +21AFD=>rǔ +21B01=>xiòng +21B02=>guì +21B04=>jì +21B06=>měng +21B07=>fū +21B09=>sài +21B0A=>yù +21B0B=>jiào +21B0C=>mèng +21B0D=>lóng +21B0E=>qiāng +21B10=>mí +21B13=>yí +21B16=>hān +21B17=>nì +21B18=>lào +21B19=>sèng +21B1C=>lǐn +21B1E=>yù +21B25=>nuó +21B2B=>wù +21B2F=>biǎn +21B32=>biǎn +21B33=>xuān +21B35=>jiān +21B38=>biǎn +21B42=>dé +21B47=>zhuān +21B4B=>rǒng +21B50=>shuàn +21B58=>jiā +21B5B=>huǐ +21B5E=>zhān +21B62=>bài +21B63=>liè +21B65=>xiē +21B6D=>jiǎn +21B6E=>shǒu +21B73=>kào +21B77=>guān +21B78=>luàn +21B7E=>nǒu +21B7F=>chǎng +21B8E=>liáng +21B99=>nài +21B9A=>rǔ +21B9E=>zhì +21BA6=>cáo +21BB0=>lì +21BBB=>lán +21BBF=>chān +21BC1=>wāng +21BC4=>lì +21BC7=>wù +21BC8=>páo +21BC9=>yòu +21BCB=>gān +21BCF=>ān +21BD0=>xiū +21BD1=>shuǐ +21BD2=>ruǐ +21BD8=>bǎn +21BD9=>yóu +21BE2=>huó +21BE5=>huī +21BE8=>zuò +21BE9=>xiāo +21BEB=>mián +21BF0=>gà +21BF1=>yuǎn +21BF3=>bò +21BF4=>chào +21BF5=>tuǐ +21BF7=>bò +21BFD=>gà +21BFF=>tiāo +21C00=>ná +21C05=>hú +21C06=>niè +21C0B=>huí +21C0C=>lǒu +21C0E=>tí +21C10=>qiào +21C11=>qiáo +21C12=>zhǒng +21C16=>dī +21C1A=>lín +21C1D=>quán +21C1E=>zhuān +21C20=>léi +21C22=>xié +21C25=>rén +21C28=>dāng +21C2A=>dū +21C2B=>niǎn +21C2F=>shǐ +21C32=>xián +21C39=>zhí +21C3D=>ài +21C3E=>cī +21C3F=>pú +21C41=>shǐ +21C45=>qū +21C46=>shǔ +21C47=>diān +21C49=>xiǎo +21C4A=>shuǐ +21C4C=>huán +21C50=>yí +21C51=>juān +21C54=>zhǐ +21C5C=>zhào +21C63=>xù +21C6F=>lòng +21C71=>zhù +21C73=>suǒ +21C77=>dié +21C7A=>qú +21C7C=>kè +21C7D=>hū +21C7E=>jū +21C80=>qǐng +21C8D=>bīng +21C95=>tì +21C97=>jué +21C9A=>qiú +21CA3=>jiàng +21CAA=>yùn +21CAD=>mèi +21CAE=>pī +21CB0=>qú +21CBC=>mì +21CBF=>tì +21CC2=>kài +21CC4=>bǐ +21CC6=>qū +21CCF=>tiāo +21CD1=>chù +21CD8=>jú +21CDA=>xī +21CDE=>lìn +21CED=>chǐ +21CEE=>jī +21CF4=>lú +21CF8=>lì +21CFE=>jué +21D05=>zhū +21D06=>lù +21D0E=>niè +21D14=>quán +21D2D=>yà +21D2F=>è +21D31=>hù +21D40=>máng +21D49=>wù +21D4C=>chā +21D51=>qīn +21D52=>jié +21D53=>hóng +21D55=>dān +21D56=>ěn +21D57=>zè +21D58=>hù +21D59=>àng +21D5A=>jiè +21D5B=>fù +21D5C=>yòng +21D5E=>fēng +21D6C=>mù +21D76=>sè +21D77=>cóng +21D7B=>kāng +21D82=>yào +21D83=>ài +21D84=>bāo +21D86=>pǒ +21D88=>shǐ +21D89=>fàn +21D8B=>jú +21D8C=>pí +21D8E=>wèi +21D8F=>kū +21D90=>qié +21D91=>gān +21DA2=>kuàng +21DA3=>suì +21DA4=>bēng +21DA5=>jiā +21DA6=>yà +21DAA=>kàn +21DAB=>niè +21DAD=>xíng +21DAF=>xì +21DB1=>lìn +21DB2=>duǒ +21DB4=>chǎn +21DC8=>shì +21DCB=>duì +21DCD=>jiāng +21DCE=>yǔ +21DCF=>lù +21DD0=>ěn +21DD3=>gǔ +21DD5=>wěi +21DD6=>chē +21DD7=>huàn +21DD8=>bié +21DDB=>hàn +21DDC=>tuí +21DDD=>nà +21DDE=>qǐ +21DE0=>tóu +21DE1=>yuān +21DE2=>wáng +21DE4=>wú +21DE5=>gào +21DE8=>kēng +21DEA=>yí +21DF8=>xiāo +21DFA=>guǐ +21DFB=>yà +21DFC=>suì +21DFD=>sǒng +21DFF=>zhuó +21E02=>tū +21E03=>xiǎn +21E08=>zè +21E09=>lì +21E0C=>zhù +21E0E=>jié +21E11=>tì +21E14=>xié +21E15=>qióng +21E17=>yà +21E18=>jū +21E1B=>yín +21E1C=>zhí +21E1E=>kǎn +21E1F=>zī +21E21=>kē +21E23=>niè +21E24=>qiáng +21E25=>wǎn +21E26=>zé +21E28=>jū +21E2A=>zì +21E44=>yà +21E47=>lín +21E49=>qí +21E4E=>huí +21E53=>qì +21E55=>yáng +21E56=>suì +21E58=>qǐ +21E59=>guī +21E62=>qìn +21E63=>ē +21E65=>zuò +21E68=>zè +21E69=>qì +21E6A=>jí +21E6C=>tuó +21E6D=>dié +21E6F=>huì +21E70=>máo +21E72=>xǔ +21E75=>hóu +21E76=>yǎn +21E77=>xiáng +21E78=>cōng +21E79=>hú +21E7C=>àn +21E7E=>bǐng +21E87=>duǒ +21E90=>zhǔ +21E91=>dié +21E92=>yōu +21E93=>qǐ +21E94=>shí +21E95=>xūn +21E96=>yōu +21E97=>kān +21E98=>qiǎo +21E9B=>qiāng +21E9C=>pén +21E9F=>quán +21EA1=>yíng +21EA7=>shā +21EAB=>tāo +21EAD=>hòng +21EAE=>pǐ +21EAF=>yáo +21EB4=>tú +21EB5=>chái +21EB7=>xià +21EB8=>qí +21EBA=>qióng +21EBD=>jìn +21EC8=>zhēn +21ECC=>zhū +21ECE=>xī +21ED0=>wēng +21ED1=>zhǒng +21ED5=>suì +21ED8=>kē +21ED9=>kuò +21EDA=>kǎng +21EDD=>cháo +21EDE=>bì +21EDF=>mò +21EE0=>zhù +21EE1=>hàn +21EE2=>yǔ +21EE3=>yí +21EE4=>má +21EE7=>qì +21EE8=>gùn +21EE9=>màn +21EEA=>liáo +21EEB=>lín +21EEC=>zú +21EED=>lěi +21EEE=>hù +21EEF=>chuǎng +21EF0=>qì +21EF1=>léi +21F01=>chī +21F03=>pó +21F04=>dié +21F0A=>lěi +21F0E=>yǐ +21F13=>diàn +21F16=>dūn +21F17=>gāo +21F18=>hū +21F1A=>xiāo +21F1B=>gá +21F1C=>pēng +21F2C=>shěn +21F31=>wéi +21F3B=>duì +21F3C=>cháo +21F3D=>yǐn +21F3E=>kuài +21F3F=>kū +21F41=>zuì +21F42=>gǔ +21F45=>yùn +21F46=>zhì +21F49=>jì +21F4A=>chēng +21F56=>xiè +21F5B=>zuǐ +21F5C=>án +21F5D=>hāo +21F60=>pǒ +21F62=>dí +21F63=>yè +21F67=>náo +21F71=>jié +21F72=>bàng +21F73=>lǎn +21F74=>cáng +21F76=>bì +21F7B=>zhǎn +21F7C=>qì +21F82=>náo +21F85=>lǜ +21F87=>kuàng +21F89=>mó +21F8B=>lěi +21F8C=>páo +21F92=>lì +21F93=>céng +21F95=>dàng +21F96=>lěi +21F99=>è +21F9B=>bèng +21F9C=>jué +21FA5=>xuán +21FA6=>niè +21FA8=>hài +21FAE=>xiǎn +21FB0=>jiǎn +21FB1=>mí +21FB2=>niè +21FBB=>cáng +21FBC=>sǒng +21FBD=>zēng +21FBE=>yì +21FC2=>chóng +21FC4=>cáng +21FC9=>lěi +21FCA=>nuó +21FCB=>lì +21FCE=>lí +21FCF=>luó +21FD3=>tǎng +21FD6=>niè +21FD7=>niè +21FD9=>jī +21FDB=>lěi +21FDD=>nàng +21FE0=>lín +21FE1=>líng +21FE4=>xián +21FE5=>yù +21FE7=>zāi +21FE8=>quǎn +21FE9=>liè +21FEF=>yù +21FF0=>huāng +21FFA=>nǎo +21FFC=>xùn +21FFE=>jú +21FFF=>huò +22001=>yì +2200A=>xī +2200B=>sè +2200C=>jiǎo +2200D=>yōng +22015=>shī +22016=>jīng +22017=>wàn +22018=>yě +22019=>jiū +2201C=>gǒng +22021=>huī +2202A=>ěr +22035=>hàn +2203C=>fú +22040=>fú +22041=>zhuó +22042=>jī +2204F=>bāng +22052=>qí +22053=>shǐ +22055=>diǎo +22056=>pèi +22057=>xiǎn +22058=>sān +2205D=>cháng +2205E=>yuē +22060=>gōng +22062=>wū +22064=>fēn +22067=>chǎn +22069=>nèi +2206A=>jué +2206C=>zhǎo +2206E=>qián +22071=>ǎo +22076=>wǎng +22077=>zhōng +22079=>huāng +2207B=>bù +2207C=>zhǔ +2207D=>bì +2207E=>chāo +2207F=>zhēng +22080=>fú +22081=>kōu +22083=>zuó +22084=>xuàn +22086=>fù +2208A=>yǎo +2208D=>bō +2208F=>bèi +22090=>xié +22091=>shì +22092=>yí +22094=>hóng +22095=>cuì +22097=>yì +22098=>zhuān +2209D=>chì +220A4=>pō +220A8=>yín +220B1=>yuàn +220B6=>jiōng +220B9=>mào +220BA=>qiàn +220BC=>yì +220C0=>wú +220CD=>bēi +220CE=>huò +220CF=>cóng +220D0=>kōng +220D5=>tà +220D7=>hàn +220D8=>qiàn +220DC=>zhí +220E2=>sè +220E5=>qiān +220E6=>guǒ +220E9=>gǔn +220EC=>jiān +220ED=>zhōng +220EE=>miǎn +220EF=>guǐ +220F0=>shì +220F1=>móu +220F2=>è +220F3=>bǎ +220F4=>là +220F8=>zhòu +220FA=>jí +22100=>zǎo +22104=>zhā +22105=>yì +22107=>gǒu +2210A=>guī +2210B=>yīng +2210C=>shǎi +2210D=>hé +2210E=>bàng +2210F=>mò +22110=>méng +22113=>wù +22114=>dài +22117=>jiǒng +2211C=>hàn +2211F=>tōng +22120=>kōu +22121=>lí +22122=>zhì +22123=>huì +22124=>zǎn +22126=>diǎo +22127=>cù +22131=>zhì +22133=>kuǎ +22135=>xiàng +22136=>huà +22137=>liáo +22138=>cuì +22139=>qiāo +2213A=>jiǎo +2213C=>xū +2213D=>èr +2213F=>tuō +22140=>tán +22141=>zhì +22148=>nǎo +22149=>mào +2214A=>dì +2214B=>céng +2214E=>jiǎo +2214F=>lián +22151=>shā +22152=>dàn +22155=>suì +22156=>lián +22157=>guò +2215A=>biǎo +2215C=>cì +2215D=>diàn +2215E=>lǜ +2215F=>nǐ +22160=>yǎn +22161=>lán +22164=>gài +22165=>chú +22169=>bì +2216A=>zú +2216B=>huì +2216D=>lǎi +2216E=>xián +2216F=>fèn +22170=>hè +22179=>yào +2217A=>zhǎn +2217C=>néi +2217E=>luǒ +22180=>yuán +22182=>néng +22189=>rěn +2219C=>gé +2219E=>jiǎn +2219F=>píng +221A3=>biè +221A6=>jiàn +221A9=>bìng +221AF=>mì +221B0=>hù +221B4=>diǎo +221B6=>yōu +221B7=>yāo +221B8=>bēng +221BA=>chén +221BB=>jī +221BD=>yāo +221C7=>guān +221C8=>yàn +221D5=>chǐ +221D7=>shà +221D8=>yǎn +221D9=>yì +221DA=>yì +221DB=>chè +221DE=>hàn +221DF=>huāng +221E4=>shuì +221E5=>suì +221E6=>rén +221E7=>tán +221E8=>zhǐ +221EA=>fàn +221EB=>fěng +221F0=>tán +221F2=>mí +221F3=>pí +221F4=>bù +221F5=>nà +221F6=>tián +221F7=>bá +221F8=>yì +22202=>yǎn +22204=>tiāo +22206=>yáo +22207=>shěn +22208=>kē +22209=>tóng +2220B=>xuǎn +22213=>yòu +22215=>bài +22219=>xiá +2221A=>lǚ +2221B=>kùn +2221C=>zāng +2221D=>qiú +22220=>cù +22221=>zuī +22222=>lǒu +22224=>xiá +2222F=>shēn +22232=>pú +22234=>jīng +22235=>qiāng +22236=>yì +22238=>niè +22239=>duī +2223B=>jié +2223C=>suì +2223D=>zhàn +2223E=>cōu +22241=>bēng +22242=>guān +22243=>shě +22245=>jìn +22246=>dì +22251=>dān +22253=>nǎi +22255=>nóu +22257=>jí +22258=>yán +2225A=>nòu +2225C=>dù +2225D=>wèi +2225E=>piān +22262=>hú +22264=>jià +22265=>yè +22266=>jǔn +22267=>lán +22268=>là +22269=>yīn +2226D=>tuí +22275=>nǎo +2227A=>zǔ +2227F=>mà +22280=>sī +22281=>zhì +22284=>huī +22285=>zhuì +22287=>huì +2228D=>chú +2228F=>chè +22292=>xiū +22293=>lán +22295=>cōng +22296=>shèn +22297=>mò +22298=>yī +22299=>yáo +2229A=>xǐ +2229B=>zuǐ +2229C=>bìng +222A7=>yú +222A9=>lù +222AE=>tuí +222AF=>wěi +222B1=>fén +222B2=>shěn +222BB=>liáo +222C2=>shǔ +222C3=>dǎn +222C4=>juǎn +222C5=>yú +222C6=>xìn +222C7=>yáo +222C8=>sū +222D2=>huó +222D4=>qiān +222DA=>má +222DD=>kǎi +222E1=>lǔ +222E3=>yōu +222EE=>xiàn +222F9=>wú +222FB=>yǐn +222FC=>xī +222FF=>zhāi +22300=>xiè +22304=>qú +22308=>lí +2230D=>qiān +22314=>líng +22315=>luán +2231A=>chān +22326=>zhèng +22328=>yán +22332=>yìn +22333=>kuí +22337=>qū +22339=>fú +2233B=>yù +22341=>qí +22346=>qì +22347=>jì +22348=>yuān +2234E=>gào +2234F=>juàn +22351=>qí +22353=>gǎi +22355=>quàn +2235A=>wèi +22367=>zhì +2236B=>jiǎn +2236D=>sì +22370=>yì +22371=>qiān +2237C=>lì +2237F=>zāng +22380=>yì +22382=>cái +22383=>yì +22384=>gē +22386=>dié +22388=>zhī +22389=>yì +2238B=>zāi +2238C=>dài +2238E=>sù +22394=>jié +22395=>chèn +22396=>qú +22398=>hàn +22399=>xián +223A0=>quán +223A1=>jié +223A5=>juàn +223AA=>dàn +223AD=>jīn +223B4=>bīng +223B5=>hú +223B9=>jué +223BB=>yú +223C3=>lǐ +223C4=>qiáng +223C5=>shuǐ +223C6=>kū +223C8=>zhěn +223CD=>fú +223CE=>shēn +223D2=>chuí +223D5=>tóng +223D7=>yì +223D9=>yáng +223DC=>tuó +223DD=>zhōu +223DE=>jí +223E4=>xùn +223E6=>shěn +223E7=>xuān +223ED=>liú +223EE=>yuān +223EF=>hú +223F0=>zhèng +223F3=>pēng +223F7=>jué +22402=>zhì +22403=>piān +22404=>yuàn +22406=>jiān +2240A=>páng +2240E=>zhuàn +22410=>xián +22412=>bēng +22414=>cōng +22416=>mò +2241A=>guó +2241E=>chéng +2241F=>qiāo +22426=>bì +22429=>qiǎng +2242B=>zhōu +22432=>fán +22433=>biē +2243E=>bó +2243F=>rǒng +22445=>dǐng +22446=>quán +22447=>jiù +22448=>yáo +22453=>xiá +22456=>zǎo +2245D=>dān +2245F=>wǔ +22460=>tuó +22462=>hū +22467=>xī +2246C=>lái +2246E=>fēi +22479=>hú +22486=>xiān +22489=>shǎn +2248D=>fèi +22490=>cuò +22492=>fú +22494=>chù +2249D=>diū +2249E=>làn +224A9=>xǐ +224AF=>biāo +224B0=>yù +224B1=>suì +224B2=>xǐ +224B7=>póu +224BE=>jiào +224C0=>yì +224C3=>wán +224C4=>jǐ +224C6=>wán +224C7=>tuì +224CB=>àng +224CD=>tiān +224CE=>chí +224D2=>rán +224D4=>sà +224D5=>yín +224D6=>pī +224D7=>cǐ +224D8=>tóng +224D9=>yǐn +224DC=>gé +224DD=>tiāo +224DE=>zhēng +224DF=>zhòu +224E1=>yí +224E2=>kuà +224E3=>sōng +224E7=>dì +224EC=>xié +224EE=>xiāo +224EF=>guàng +224F0=>tuǒ +224F1=>fēng +224F2=>wú +224F5=>xiù +224FF=>yóu +22501=>líng +22502=>yàn +22505=>dōng +22506=>qì +22507=>táo +22508=>hán +2250A=>chí +2250B=>sōng +22511=>quǎn +22514=>hàn +2251F=>rǒu +22520=>qì +22521=>kāi +22522=>yú +22523=>chā +22524=>chèng +22525=>yù +22527=>bìng +22529=>cōng +2252A=>zhū +2252C=>yù +22531=>jué +22532=>liù +22533=>sāo +22534=>yù +22545=>shuài +2254B=>yuàn +2254E=>zhāng +22551=>shuài +22553=>chǔ +22554=>zhāng +22555=>sǎn +22556=>xiān +22558=>cuī +22559=>měng +2255A=>dí +2255E=>zhì +2255F=>ào +22566=>xiū +22568=>pián +2256A=>jiào +2256B=>kuǎn +2256C=>sà +2256D=>xiàn +2256E=>zhà +2256F=>diàn +22577=>yí +2257A=>huì +2257B=>shàn +22584=>chóng +22585=>yí +22586=>xiè +22587=>zhì +22588=>tiào +2258A=>pīng +2258B=>xián +2258E=>xiān +2258F=>sù +22591=>cuán +22597=>sǒng +2259B=>hēi +2259D=>xiàn +2259F=>yóu +225A1=>yù +225A4=>tái +225A6=>jué +225A7=>nàng +225A9=>diān +225AB=>yì +225AC=>bì +225B3=>xū +225B4=>yì +225B5=>rù +225B7=>gōng +225BA=>yì +225BF=>zhì +225C0=>xīn +225C2=>jì +225C4=>xià +225C8=>zhāo +225C9=>nè +225CA=>xiè +225CE=>yì +225EB=>fǔ +225ED=>shè +225EF=>yuán +225F0=>fǎn +225F2=>fū +225F3=>wù +225F4=>xī +225F5=>hǒng +225F9=>jì +225FA=>chàng +225FF=>mò +22600=>pèi +22603=>mú +22604=>qiú +22605=>mào +22607=>dá +22609=>xiá +2260A=>shēn +2260B=>tè +2260C=>hóng +2260D=>bì +2261D=>nǐ +2261F=>qiáo +22627=>ruǎn +22638=>jiàng +22639=>chā +2263A=>mǐ +2263D=>yì +2263F=>suō +22641=>wù +22642=>xuān +22645=>xí +22647=>yǐ +22650=>náo +22653=>wèi +2266E=>kàn +22671=>lòng +22672=>lǚ +22673=>zhuǎng +2267A=>zhì +2267C=>xìng +2267E=>gěng +2267F=>jìn +22680=>xiàn +22681=>jì +22682=>cuò +22684=>láo +22685=>fěn +22686=>jù +2268B=>miào +2268C=>xiá +22691=>sù +226A8=>zhì +226AA=>hù +226AB=>kòu +226AD=>suǒ +226AE=>nì +226BA=>tēng +226BB=>zhù +226C1=>dá +226C3=>qiú +226C4=>yà +226C6=>xián +226C9=>nèi +226CD=>zhǐ +226CE=>bié +226D2=>chǒng +226D3=>lán +226D4=>dōng +226D5=>qūn +226D6=>xiàng +226D8=>xiáo +226D9=>wǎn +226DA=>rù +226DB=>wàng +226DC=>nì +226DE=>bāi +226DF=>yà +226E5=>sī +226E6=>yǐn +226E8=>yù +226EE=>lí +226EF=>huò +22717=>bàng +22723=>xī +22725=>jiū +22728=>xiè +22729=>qiān +2272A=>nuò +2272B=>xǐng +2272C=>duó +2272D=>jǐ +2272E=>wǔ +2272F=>mú +22730=>yàn +22731=>qì +22732=>ná +22733=>chì +22734=>hóu +22736=>sào +22738=>náo +2273B=>chěng +2273C=>chěng +2273D=>kuǐ +2273F=>jià +22740=>tú +22742=>dú +22745=>xiá +22746=>zhòng +22747=>huò +22748=>chóng +22749=>dá +2274C=>mào +2274D=>yào +22753=>juān +2276C=>shì +2276F=>yín +22773=>gǔ +22774=>wù +22778=>guò +22779=>tì +2277B=>hōng +22787=>rě +22789=>yí +2278B=>tǔn +2278F=>qióng +22790=>hài +22792=>qì +22795=>huò +22796=>tì +22797=>pī +2279A=>gěng +2279C=>xiè +2279E=>mì +2279F=>gào +227A0=>tā +227A1=>xiǎng +227A3=>shū +227A6=>fú +227AC=>zhuān +227AD=>liù +227C5=>yóu +227CA=>chěng +227CB=>duī +227E2=>lí +227E3=>yàng +227E4=>lí +227E7=>lǔ +227E8=>mǔ +227E9=>suì +227EA=>ài +227ED=>kòu +227EF=>zhé +227F0=>ài +227F1=>téng +227F3=>lǜ +227F4=>tuí +227F5=>bī +227FE=>huì +227FF=>huán +2281B=>kuò +2281D=>xīn +22821=>sào +2282B=>shù +2282C=>què +2282D=>bā +2282E=>tuì +22832=>fù +22833=>biē +22835=>tǎng +22837=>xiàng +22839=>sī +2283A=>bó +2283C=>mái +2283D=>dàng +2283F=>guì +22840=>hēi +22841=>xī +22842=>dàng +22843=>yì +22845=>bī +22847=>gū +22848=>cuì +22849=>sè +2284D=>gé +2284E=>yù +2284F=>nǎ +22851=>lì +22852=>zhì +22870=>zhào +22874=>jī +22875=>ruǎn +22879=>chòng +22882=>jié +2288C=>chàng +2288D=>zhé +22892=>sù +22893=>yōng +22896=>qì +22897=>zhuó +2289A=>kài +2289C=>yè +2289E=>qì +228B9=>xiòng +228C9=>yī +228CA=>chǒu +228CE=>tuǎn +228CF=>ài +228D0=>pīn +228D3=>liè +228D4=>mián +228D5=>ài +228D7=>mǒ +228D8=>wèi +228D9=>yìng +228DA=>nǐ +228DE=>bó +228E0=>liù +228F3=>ruì +228FB=>lǘ +228FC=>chá +228FF=>chù +22901=>sào +22902=>lí +22904=>sōng +22906=>lì +2290B=>xì +2290D=>yān +2290E=>cuō +22910=>liú +22918=>méng +2291A=>zhàn +22924=>zhuàng +22927=>miǎo +22929=>lì +2292B=>jǔ +2292F=>xiè +22930=>xiè +22931=>lǒng +22932=>lóng +22942=>téng +22943=>zhù +2294B=>chán +2294C=>xiǎn +2294F=>yíng +22950=>pèi +22958=>xié +2295A=>jiào +2295E=>chōng +22973=>hē +2297D=>tǔn +22985=>hǒng +22988=>mán +2298A=>jīn +2298C=>qú +2298D=>dǒu +2298E=>qiú +2298F=>zāi +22991=>shēng +22992=>zāi +22995=>yǐ +2299A=>huà +2299F=>kān +229B0=>yuè +229B1=>nì +229B2=>sī +229B4=>wǒ +229B8=>cán +229BA=>jiān +229BC=>miè +229BD=>sháo +229BF=>rǒng +229C0=>gān +229C5=>qiáng +229C7=>shú +229C8=>zhuó +229CF=>shī +229D1=>tì +229D6=>zhá +229D7=>zhān +229DD=>fèn +229DE=>miè +229E0=>zè +229E4=>zhì +229E5=>qiān +229E6=>hàn +229E7=>gé +229EE=>cán +229F0=>guó +229F1=>jiāo +229F3=>yōng +229F4=>áo +229FB=>zhá +229FD=>xì +22A01=>xū +22A02=>wǔ +22A0F=>jué +22A10=>jī +22A12=>chì +22A14=>wǎn +22A16=>miè +22A17=>zéi +22A1C=>jié +22A1D=>shí +22A1F=>xī +22A21=>è +22A25=>hù +22A26=>hù +22A28=>lì +22A2B=>chù +22A2E=>yī +22A2F=>mǎo +22A30=>xū +22A31=>zhōng +22A33=>yì +22A3A=>liáo +22A3F=>jiān +22A40=>jiǎn +22A41=>jú +22A44=>zhù +22A48=>wǔ +22A4F=>kè +22A50=>kě +22A51=>lì +22A52=>bǐ +22A53=>gé +22A55=>xū +22A56=>shā +22A57=>líng +22A58=>kē +22A5E=>bó +22A5F=>biān +22A60=>shuān +22A61=>qí +22A62=>shàn +22A66=>jī +22A68=>qiǎo +22A6E=>yì +22A6F=>jué +22A70=>zhǎng +22A72=>xìn +22A77=>tuō +22A78=>hài +22A79=>xià +22A7B=>tuó +22A7C=>yí +22A83=>cù +22A87=>jiāng +22A88=>nán +22A8B=>pěng +22A8D=>jié +22A8E=>xuē +22A8F=>hú +22AA5=>yǒu +22AA6=>nǔ +22AA7=>yè +22AAA=>yìn +22AAC=>kǒng +22AB6=>xiāo +22AB7=>xiāng +22ABC=>náo +22ABE=>zhàng +22AD0=>jié +22AD3=>nǔ +22AD4=>shàn +22AE2=>jiá +22AE7=>zhǒu +22AE8=>rǒng +22AEB=>lù +22AEC=>sà +22AED=>nù +22AEF=>bó +22AF0=>zhé +22AF2=>qǐn +22AF4=>cī +22AF5=>zú +22AF7=>wǒ +22AF8=>wǔ +22AFB=>nié +22AFF=>xiān +22B00=>hóng +22B2B=>tìng +22B2C=>jǐn +22B31=>jié +22B32=>hè +22B33=>tū +22B34=>zhé +22B35=>pīn +22B36=>jìn +22B37=>nàn +22B3C=>dùn +22B3E=>xī +22B3F=>xiè +22B41=>xì +22B42=>láo +22B43=>duǎn +22B44=>jì +22B45=>chā +22B46=>chōu +22B48=>gāng +22B4E=>xiáng +22B4F=>dǎo +22B65=>biàn +22B66=>xiāo +22B67=>xīn +22B81=>yǔ +22B82=>xián +22B83=>lí +22B84=>qiǎn +22B87=>měi +22B89=>qiāo +22B8A=>yà +22B8C=>qiā +22B8D=>qiòng +22B8F=>bàng +22B90=>zhēng +22B9A=>zè +22B9B=>shuàn +22B9E=>sào +22BC5=>lù +22BC9=>xié +22BCB=>fǔ +22BCC=>zhài +22BE9=>zè +22BEB=>duàn +22BED=>dèng +22BEE=>yù +22BF0=>lǜ +22BF2=>wàn +22BF3=>xué +22BF4=>jiǎo +22BF5=>yuě +22BF6=>zhì +22BF7=>wěi +22BF9=>gé +22BFA=>jǔ +22BFC=>yǎn +22BFD=>cuò +22BFE=>mào +22C06=>fú +22C07=>āi +22C0A=>xuān +22C0C=>gāng +22C0D=>ān +22C12=>jí +22C18=>pí +22C19=>zhǐ +22C1C=>nuó +22C3F=>pàn +22C41=>yí +22C44=>jié +22C46=>zī +22C48=>jià +22C49=>wǎi +22C4C=>jià +22C5F=>chǎn +22C61=>suǒ +22C62=>suǒ +22C63=>jí +22C64=>sǒng +22C66=>tī +22C67=>pī +22C68=>pó +22C6E=>mì +22C74=>yè +22C76=>qìn +22C77=>jìn +22C7A=>juē +22C7D=>yuān +22C7E=>ruán +22C94=>bàn +22CB0=>bīn +22CB4=>wèi +22CB5=>zào +22CB6=>qiè +22CB7=>sōu +22CB8=>lǔ +22CBC=>dié +22CBD=>chuāi +22CBE=>bì +22CBF=>zhú +22CC0=>mā +22CC1=>fèi +22CC2=>piē +22CC3=>yìn +22CC4=>xuàn +22CC6=>ào +22CC7=>zhuó +22CC8=>zú +22CCB=>bǐ +22CD1=>làng +22CD3=>tì +22CD9=>tiǎo +22CDA=>jiān +22CDF=>tǒng +22CFD=>duō +22CFE=>dòng +22D02=>biǎn +22D20=>zhì +22D22=>fén +22D26=>káng +22D27=>zhì +22D28=>zhāi +22D29=>bì +22D2A=>kuǎn +22D2C=>bàn +22D2D=>juē +22D2E=>qū +22D30=>qī +22D31=>léi +22D32=>xié +22D33=>tāng +22D3C=>sōu +22D3E=>bèi +22D47=>yàng +22D48=>jiǎn +22D65=>zào +22D80=>zhuài +22D83=>fán +22D85=>shé +22D87=>qióng +22D89=>pò +22D8B=>tiě +22D8C=>shā +22D8D=>zá +22D91=>niǎo +22D92=>guài +22D93=>cuǐ +22DA1=>qiào +22DA3=>dié +22DB3=>pīn +22DB4=>cí +22DB6=>bàng +22DCD=>yìn +22DD1=>xiǎn +22DD4=>yǐ +22DD5=>miǎo +22DD6=>duǎn +22DD7=>zhòu +22DD9=>kōng +22DE2=>zhāng +22DF6=>liú +22DF8=>zhǐ +22DF9=>chǎn +22DFA=>dú +22DFB=>yuán +22DFE=>suò +22DFF=>jié +22E00=>lì +22E01=>gǒng +22E0C=>bāng +22E17=>guó +22E18=>liáo +22E19=>shěn +22E23=>niǎo +22E25=>cuàn +22E26=>wěi +22E28=>tuō +22E2B=>sū +22E2D=>lóng +22E33=>xiāo +22E34=>yǎn +22E43=>qǐng +22E4D=>xī +22E4F=>yú +22E51=>zhèng +22E52=>xiè +22E53=>chāi +22E54=>fèn +22E56=>guó +22E58=>jǐng +22E59=>làn +22E5A=>xiān +22E5D=>líng +22E6E=>lěi +22E72=>jùn +22E73=>xiào +22E7C=>zá +22E84=>guān +22E85=>qiè +22E86=>luò +22E87=>yào +22E88=>luán +22E89=>tà +22E91=>luò +22E9E=>bǎ +22E9F=>chàn +22EA1=>zhuó +22EAB=>tiǎo +22EAF=>wān +22EB0=>líng +22EB4=>yù +22EB5=>qì +22EB7=>qí +22EBC=>jì +22EBD=>bó +22EBF=>shī +22EC0=>fǔ +22EC2=>guī +22EC5=>diǎn +22EC7=>hāo +22EC9=>gǎi +22ECB=>qí +22ED3=>chéng +22ED4=>huì +22ED7=>xiá +22ED8=>shí +22ED9=>zhì +22EDA=>qí +22EDC=>hài +22EDF=>jiǎo +22EE0=>lì +22EE2=>liǎo +22EE4=>qiāo +22EE8=>sà +22EEA=>qī +22EEB=>shī +22EEE=>jié +22EF5=>bèi +22EF6=>biān +22EF7=>bā +22EF8=>jūn +22EF9=>pī +22EFC=>dǎn +22EFF=>táng +22F00=>kuǐ +22F01=>kū +22F03=>kǒu +22F09=>shī +22F0A=>shī +22F0B=>jī +22F0C=>bào +22F10=>kě +22F11=>kuāng +22F16=>mǐn +22F19=>liáo +22F1A=>è +22F1B=>gé +22F1F=>wǎng +22F20=>duó +22F23=>qià +22F24=>huá +22F26=>hǒng +22F29=>pēng +22F2B=>jiào +22F30=>qū +22F31=>zì +22F32=>zhòu +22F33=>kuāng +22F35=>shā +22F37=>jì +22F38=>wēi +22F39=>pū +22F3A=>xué +22F3C=>shāo +22F42=>láng +22F43=>zhǐ +22F44=>tǐng +22F47=>dà +22F55=>yáng +22F56=>jìn +22F57=>zhǐ +22F5A=>zhuó +22F5C=>zá +22F5D=>chán +22F62=>mào +22F66=>kōng +22F67=>zhōu +22F68=>hū +22F69=>pēng +22F6D=>jiù +22F78=>chuò +22F79=>mǐn +22F7E=>xiào +22F80=>dǔ +22F81=>wéi +22F83=>cán +22F84=>yú +22F85=>dù +22F86=>kāi +22F87=>pì +22F8A=>chéng +22F8E=>chǔn +22F90=>shǎo +22F91=>yǎn +22F92=>kuài +22F94=>yuē +22FA6=>qí +22FA7=>zhēng +22FA9=>kè +22FAA=>qí +22FAB=>zhǐ +22FAC=>lù +22FB1=>pī +22FB2=>nuò +22FB3=>pǎo +22FBA=>fěi +22FBF=>wén +22FC2=>méng +22FC8=>shǎn +22FCC=>xiòng +22FCE=>duò +22FCF=>biào +22FDA=>yōu +22FDC=>màn +22FDE=>liǎo +22FE1=>xié +22FE2=>luàn +22FE3=>qiāo +22FE4=>dèng +22FE6=>chéng +22FE7=>chéng +22FED=>chuò +22FF8=>cè +23000=>léi +23001=>zhǎn +23002=>lǐ +23003=>lián +23004=>qún +2300D=>chén +2300F=>chéng +23010=>gū +23012=>zòng +23013=>chóu +23014=>chuàn +2301C=>lèi +2301D=>shuò +2301E=>lǜ +23023=>fú +23025=>lì +23027=>sàn +2302B=>sān +2302F=>sà +23033=>niè +23036=>zuān +23037=>lǐ +2303B=>shǔ +2303E=>fú +23049=>bì +2304D=>dào +23052=>shī +23056=>gàn +23057=>tàn +2305C=>màn +2305F=>lí +23062=>bì +23066=>pán +23068=>yōu +2306D=>jiū +2306F=>guō +23070=>liáo +23073=>wò +23074=>qià +23075=>dǒu +23077=>liè +23079=>jiǎo +2307B=>liè +23081=>tiāo +23084=>guō +23086=>pāng +23087=>qiāo +23089=>dí +2308A=>yùn +23092=>lè +23096=>sī +23097=>xīn +2309C=>xīn +2309D=>xiàng +2309E=>luǒ +230A4=>bēng +230A5=>tiāo +230AC=>xiào +230AE=>dōu +230B3=>dàng +230B4=>tíng +230B5=>zhuàn +230BB=>ōu +230BD=>wò +230C4=>xīn +230C5=>ruǎn +230C8=>zhuó +230C9=>dàng +230CD=>cuì +230D1=>zhuó +230D7=>cóng +230D8=>chǎn +230DD=>yǎng +230E7=>yǎn +230F3=>yǎn +230F5=>zhèn +230FD=>nuǒ +230FE=>yàn +23105=>fǎng +23109=>yǎn +2310A=>yú +2310D=>tí +2310E=>fù +2310F=>běn +23111=>yǎn +23113=>huī +23119=>huǎng +2311C=>guì +2311D=>yàn +2311F=>hú +23120=>biāo +23127=>suì +2312E=>zì +2312F=>jì +23130=>ě +23131=>jì +23132=>kuǐ +23134=>liàng +23138=>huò +2313A=>wéi +2313B=>zhuō +2313F=>tǐng +23143=>zǎi +23144=>yòu +23149=>rèn +2314D=>miàn +2315A=>nà +2315D=>tū +2315F=>dān +23161=>jué +23164=>xū +23165=>dī +23170=>xiàng +23177=>xiòng +2317A=>yǒu +2317B=>guǎ +2317E=>xī +23188=>hè +2318D=>dǐng +23190=>lú +23192=>xú +23194=>zhòu +23195=>xiàn +23196=>huāng +23197=>chā +23198=>shǐ +23199=>gàn +2319A=>nuǒ +2319B=>àn +2319F=>xiē +231A7=>hào +231B2=>qīn +231B3=>gěng +231B4=>shān +231B5=>fú +231BD=>zè +231C7=>dàn +231D6=>diǎn +231D7=>shēn +231D9=>zǔ +231E2=>biē +231E6=>chuí +231E7=>zhè +231E8=>dài +231EB=>wǒ +231EC=>qióng +231F0=>lín +231F2=>hūn +231F3=>jī +23205=>cáo +2320A=>mù +2320D=>dié +2320E=>wèi +23220=>biàn +23221=>tǐ +23225=>tú +23236=>gèng +23244=>chí +23245=>còu +23246=>tǐ +23252=>huò +23253=>qī +23254=>sāo +23255=>sàng +23256=>xuǎn +23257=>àng +23258=>nài +2325A=>yáng +2325B=>shū +2325C=>shā +23261=>tǐng +23269=>yà +2326A=>huǎng +2326E=>bīn +2327E=>òu +2327F=>cáo +23281=>áo +23283=>mào +23294=>méng +23296=>tiān +2329D=>sàng +2329E=>xù +2329F=>kàn +232A7=>lǎng +232B6=>biē +232B7=>cóng +232BA=>xián +232C4=>tūn +232C9=>yù +232CA=>dàn +232CB=>yìng +232CD=>zhāo +232CF=>pù +232D8=>huì +232DE=>ài +232DF=>mǒ +232E2=>jīng +232E3=>lán +232F2=>liè +232F3=>piǎo +232F5=>bó +232F6=>qióng +232F9=>bì +232FF=>yōng +23305=>lì +2330D=>niè +2330F=>dé +23313=>huān +23317=>yuè +2331A=>chūn +2331C=>lì +2331E=>zhāng +2331F=>líng +23320=>chún +23327=>cè +23328=>xún +2332C=>jǔ +2332D=>hui +2333E=>tōng +23346=>níng +23347=>jù +2334F=>chà +23356=>zāo +2335B=>yù +2335F=>kěn +23366=>kuàng +23367=>fěi +2336F=>yùn +23370=>qiǎn +23374=>quán +23378=>pò +2337A=>pěi +23384=>gèng +23385=>yì +23386=>luò +23391=>kuān +23393=>xuǎn +23394=>niàn +2339A=>hú +2339B=>jú +233A9=>yè +233AE=>xī +233B1=>yuè +233B2=>tǎng +233B3=>pìn +233B4=>dǔn +233B5=>bèi +233B8=>liǎo +233C0=>yǒng +233CE=>yā +233D1=>jiǎo +233D4=>kùn +233D6=>zhèn +233D7=>shù +233DA=>shí +233DE=>yóu +233DF=>pài +233E0=>xiáo +233E1=>jí +233F6=>qī +233F7=>hé +233FA=>kǒng +23402=>yè +23403=>chì +2340A=>kǎo +2340B=>yuè +2340E=>wǎ +2340F=>niǎn +23411=>cí +23413=>yí +23424=>jiu +2342B=>yāng +2342C=>lí +2342E=>dāi +2342F=>chóng +23435=>yí +2343A=>hàn +2343F=>yī +23441=>chòng +23442=>hù +23443=>zhuǎ +23466=>qióng +23467=>duò +23478=>tóng +23479=>xiān +2347F=>fú +23482=>diàn +23483=>xí +23484=>xiē +23485=>zhèn +23486=>qiào +23487=>tū +234B7=>hàn +234B8=>kuàng +234B9=>suō +234BB=>shòu +234BC=>tiáo +234C0=>zhēn +234C3=>nèi +234C5=>qiǎn +234C6=>yín +234C8=>liǎng +234C9=>shà +234CA=>zì +234CB=>pí +234CC=>gāo +234CF=>jìn +234D0=>yóu +234D2=>shàn +234D4=>mì +234D5=>òu +234D7=>hū +234DB=>yòu +234DD=>měng +23510=>zhǐ +23513=>bǐ +23517=>shēn +23518=>qì +23519=>xiān +2351A=>pán +2351B=>kǎng +2352B=>shuān +2352C=>pí +2352E=>zāi +2352F=>zhǔ +23531=>sōu +23532=>jiǒng +23535=>chán +23536=>fán +23537=>xiáo +23538=>yǐn +23539=>hóu +2353A=>mào +2353B=>tú +2353D=>jì +23541=>yí +23543=>yù +23544=>jiōng +23545=>pào +23547=>xiāo +23549=>gǒu +2354C=>gōu +2354D=>sǔn +2354E=>xiǎn +2354F=>zhuǎn +2357E=>chóu +23584=>qiāo +23585=>tí +23586=>yún +23589=>shān +2358A=>liè +2358C=>zhǐ +23590=>pāi +235A3=>jú +235A4=>lái +235A8=>zǐ +235AA=>qú +235AB=>gǔ +235AC=>jué +235AD=>zhí +235AE=>àng +235AF=>qìn +235B0=>pí +235B1=>zuī +235B3=>qián +235B5=>cuó +235B7=>jí +235B8=>tí +235B9=>rú +235BB=>hǎi +235BC=>xún +235BE=>bèi +235BF=>zhí +235C1=>dùn +235CB=>dǎng +235D0=>réng +235F2=>gān +235F5=>gàng +235F6=>tà +235F8=>tuò +235F9=>yàng +235FA=>kū +235FB=>zhì +23616=>jiān +23617=>nì +23618=>shēn +23619=>bàng +2361A=>shuài +2361B=>dōu +2361D=>qiān +2361E=>hán +2361F=>qiā +23620=>gǎn +23623=>chún +23624=>chá +23625=>bì +23626=>yī +23627=>fū +23628=>ě +2362A=>láo +2362B=>háo +2362C=>lí +23631=>tè +23632=>shēn +23634=>yín +23637=>jiān +2363B=>chá +23657=>niè +23658=>còu +2365B=>yí +2365F=>táng +23662=>juàn +23670=>chì +23671=>gǒu +23674=>jié +23675=>zhé +23676=>hú +23677=>máng +2367B=>zōu +2367C=>sì +2367F=>fèi +23680=>zī +23681=>zī +23683=>jié +23684=>sī +23686=>chūn +23687=>pào +2368B=>yé +2368C=>dī +2368E=>léi +2368F=>xū +23690=>rú +23692=>pá +23693=>juàn +23694=>xì +23695=>yè +23696=>ān +23698=>yì +23699=>jiān +2369C=>sōng +2369D=>wǒ +2369F=>sè +236A0=>zhǐ +236A1=>bī +236A2=>zhuàn +236A6=>jiàng +236A7=>hào +236A9=>chì +236AA=>dùn +236D3=>bó +236D4=>jí +236D5=>chuǎ +236D7=>luò +236DA=>ruǐ +236EB=>hú +236F1=>dàn +236F4=>hǎn +236F5=>què +236F6=>shā +236F7=>zhǎn +236F8=>zé +236F9=>chuán +236FA=>qī +236FB=>dié +236FD=>zhà +236FE=>tòu +23701=>cī +23702=>sà +23704=>luó +23707=>jí +23722=>luǒ +23723=>qín +23727=>qióng +23728=>juàn +2372C=>ài +2372D=>jiǎn +23739=>tì +2373A=>wén +2373D=>qiāo +23741=>pái +23742=>hún +23745=>ài +23747=>shuò +23748=>lián +23749=>duì +2374B=>tà +2374C=>jǐn +2374D=>bì +2374E=>yǎn +2374F=>gào +23750=>piáo +23751=>yù +23752=>shè +23755=>jiān +23757=>hú +2375A=>liè +2375C=>biàn +2375D=>sù +2375E=>jiāo +23778=>zhuì +2377D=>hān +23787=>dùn +23790=>xiě +23791=>méng +23792=>fū +23793=>lù +23794=>tàn +23797=>liú +23798=>xiān +23799=>sǎng +2379C=>còu +2379D=>zhuāng +2379F=>chēn +237B0=>liàn +237B4=>lí +237C0=>pèng +237C1=>tuǒ +237C4=>tuò +237C6=>liáo +237C7=>xiào +237C8=>chuì +237C9=>huài +237CA=>niǎo +237CB=>qiān +237CC=>lì +237CF=>pāo +237D0=>tiáo +237D1=>liú +237D2=>wú +237E4=>yǐng +237E6=>zhá +237F0=>yú +237F2=>xiǎn +237F3=>xuán +237F4=>shuān +237F5=>xī +237F8=>méi +237F9=>sēn +237FA=>liàn +237FC=>jiū +237FD=>lào +2380E=>xiāo +2380F=>zōu +2381A=>liú +2381C=>zhào +2381E=>zhé +23820=>lěi +2382D=>duǎn +23837=>jiǎn +23838=>shuān +23839=>zuó +2383A=>qiè +2383C=>lǎo +23849=>yù +2384A=>yì +2384B=>nǐ +2384E=>cén +23855=>yàn +23857=>ruǎn +2385E=>yán +2385F=>dié +23860=>mián +23867=>léi +23869=>wān +23870=>nǎ +23876=>yán +2387A=>lěi +2387D=>shā +2387E=>hū +23881=>xī +23882=>xī +23884=>yǒu +23885=>hān +23887=>hāi +23889=>wā +2388A=>xù +2388B=>pī +2388C=>tān +2388D=>xī +2388E=>xī +2388F=>bīn +23890=>qīn +23891=>xī +23892=>yú +23893=>xì +23895=>cì +23896=>qiàn +23897=>xiā +2389A=>wá +2389B=>è +2389C=>yǒu +2389D=>xìng +2389E=>ní +2389F=>hán +238A0=>bì +238A1=>shēng +238A4=>zhān +238A5=>diàn +238A6=>yǔ +238A8=>ǒu +238AA=>guǐ +238AB=>wǎng +238AC=>qiān +238AD=>yí +238B0=>zú +238B2=>qiān +238B3=>dìng +238B4=>kēng +238B6=>chù +238B7=>yī +238BA=>hān +238BB=>kuǎn +238C8=>diàn +238C9=>xì +238CA=>zī +238CB=>líng +238CC=>zì +238CE=>yù +238CF=>hūn +238D1=>sǐ +238D2=>kǎn +238DA=>àn +238DC=>yǒu +238DD=>jí +238DE=>hùn +238DF=>qiā +238E0=>hóu +238E1=>hóu +238E3=>diàn +238E9=>xiē +238ED=>shè +238EE=>shà +238F2=>xié +238F3=>yáo +238F4=>dà +238F6=>xiè +238F7=>chī +238F8=>yǒu +238F9=>hē +238FA=>shà +238FF=>tái +23901=>zhú +23903=>ǎi +23907=>què +23908=>zé +2390A=>lā +2390B=>lòu +2390C=>chuài +2390E=>yǒu +23916=>tì +23918=>shī +23921=>xiào +23922=>xì +23928=>huò +23929=>chì +2392A=>yì +2392F=>shú +23930=>yuè +23931=>chán +23932=>è +23933=>xī +23934=>xī +23935=>yǐng +23936=>zú +23937=>zā +2393A=>zā +23942=>tà +23943=>wàn +23947=>xìn +2394A=>wàng +2394B=>fǔ +23950=>lǔ +2395E=>jiǎn +23961=>yán +23963=>bì +23964=>kěn +23965=>guàn +23968=>zī +2396E=>kuǐ +2396F=>zhǒu +23970=>zhì +23973=>tú +23977=>tà +23979=>chù +2397A=>chēng +2397B=>chěng +2397C=>zhù +2397E=>dà +23987=>bì +23989=>jiǎ +2398C=>yì +2398F=>yuè +23990=>gāng +23996=>gān +2399C=>qiāo +239A0=>chú +239A1=>chú +239A2=>bì +239A6=>guì +239A9=>gǔ +239AA=>bǐng +239AB=>yìn +239AC=>zhuì +239AD=>gǔ +239AF=>lì +239B5=>è +239B6=>dǎi +239BC=>cán +239C2=>tì +239C3=>dù +239C4=>yì +239C8=>dié +239CA=>niǔ +239CC=>xuè +239CD=>nè +239CE=>guì +239CF=>kǎo +239D2=>chuǎn +239D6=>zhá +239D7=>yóu +239D9=>bài +239DA=>shí +239DB=>diàn +239DC=>pā +239DD=>qiú +239E1=>xuè +239E3=>mò +239E4=>kē +239E5=>yǒu +239E6=>jiǎo +239E7=>bó +239EC=>xiǔ +239F2=>mǐ +239F3=>luò +239F5=>xuè +239F7=>duò +239F9=>èr +239FA=>shān +239FC=>kuì +239FD=>nào +239FE=>miǎn +239FF=>lì +23A00=>luàn +23A02=>dié +23A04=>qià +23A05=>lèi +23A07=>mào +23A09=>hēng +23A0A=>chè +23A0B=>zhì +23A0D=>gǔ +23A0E=>cuō +23A13=>wù +23A14=>tào +23A17=>xī +23A18=>yāo +23A19=>wěi +23A1B=>zú +23A1C=>mà +23A1D=>yǔ +23A1E=>pěng +23A1F=>yì +23A20=>qìn +23A21=>yuè +23A22=>juè +23A23=>jiàng +23A24=>xù +23A25=>bēng +23A2A=>luǒ +23A2B=>zhuī +23A32=>dù +23A33=>xiàng +23A36=>huì +23A3A=>gǔ +23A3B=>kǎo +23A3E=>xīng +23A3F=>hún +23A40=>biān +23A44=>kè +23A45=>kǎo +23A48=>cuó +23A4F=>lù +23A51=>zuì +23A52=>zāo +23A53=>jiǎo +23A54=>guàn +23A59=>yān +23A5A=>ér +23A5C=>qíng +23A5F=>dèng +23A60=>sì +23A61=>suì +23A62=>liào +23A67=>shàn +23A69=>bì +23A6A=>wèi +23A6B=>yè +23A6D=>zhài +23A6F=>yé +23A70=>diào +23A71=>ài +23A74=>jiàng +23A77=>sū +23A79=>huài +23A7A=>yù +23A7D=>rǎng +23A80=>diān +23A81=>zuān +23A82=>bān +23A84=>qín +23A87=>jiā +23A89=>pí +23A8C=>tóu +23A90=>chóu +23A95=>guǐ +23AA0=>jī +23AA8=>xuè +23AAA=>diàn +23AAD=>biàn +23AAE=>zǎi +23AAF=>tóng +23AB6=>shǎn +23AB8=>gù +23AB9=>què +23AC0=>gǔ +23AC8=>hú +23AC9=>kuǎi +23ACC=>gòu +23ACE=>sù +23AD0=>chóu +23AD2=>kēng +23AD4=>dū +23AD9=>yì +23ADC=>dào +23ADD=>qiāng +23AE3=>lóng +23AE5=>lí +23AE7=>lì +23AE8=>qīng +23AEA=>wēi +23AEC=>móu +23AF1=>qì +23AF3=>jiǎng +23AF4=>xié +23AF9=>dài +23AFB=>lóu +23B02=>guàn +23B06=>péi +23B09=>pí +23B0B=>juàn +23B0D=>bēi +23B0E=>jué +23B0F=>juàn +23B10=>shì +23B15=>xiě +23B18=>ruí +23B19=>jìng +23B1A=>pò +23B1B=>sān +23B20=>jī +23B29=>fēn +23B2A=>bèi +23B2B=>jiè +23B2C=>sā +23B2E=>pī +23B34=>dì +23B35=>máo +23B36=>ba +23B37=>ba +23B38=>tiáo +23B39=>líng +23B3A=>shēng +23B3B=>zhěn +23B3C=>pī +23B3D=>wù +23B3F=>zè +23B40=>bào +23B47=>lǚ +23B56=>hāo +23B57=>dǒu +23B58=>fú +23B59=>ní +23B5D=>gé +23B60=>rú +23B61=>xiǎn +23B64=>bì +23B6E=>máo +23B72=>rǒng +23B73=>qiú +23B77=>bó +23B79=>hāo +23B7A=>nǎo +23B7B=>yán +23B83=>páo +23B84=>suī +23B86=>tuò +23B88=>qū +23B89=>lí +23B8A=>dé +23B8C=>jié +23B8D=>jié +23B8E=>gǔn +23B8F=>jiān +23B90=>bì +23BA0=>sàn +23BA1=>bāng +23BA2=>chún +23BA6=>nài +23BA7=>bǎng +23BAA=>róng +23BAB=>jiā +23BAC=>sōu +23BB0=>dé +23BBE=>xiān +23BBF=>zhān +23BC0=>mào +23BC3=>zī +23BC5=>jì +23BC6=>qí +23BCB=>rù +23BCC=>suō +23BCD=>rǒng +23BCE=>wù +23BCF=>róng +23BD0=>róng +23BDA=>tà +23BDC=>sōu +23BE4=>lí +23BE7=>cuǐ +23BE8=>zōng +23BE9=>mén +23BEA=>xǐ +23BEC=>mǎng +23BED=>niè +23BEF=>suī +23BF1=>péi +23BF4=>bì +23BF5=>dì +23BF8=>qú +23BF9=>qiáo +23BFB=>fēn +23BFC=>sù +23C03=>xū +23C07=>rǒng +23C08=>jī +23C0B=>qú +23C0C=>liè +23C15=>sào +23C18=>kùn +23C1A=>cuì +23C1B=>yè +23C1C=>bìng +23C1E=>jié +23C20=>qú +23C21=>qú +23C25=>méng +23C26=>rán +23C28=>bīn +23C29=>cháo +23C2C=>dú +23C36=>ráng +23C37=>xiān +23C3A=>táo +23C3B=>qú +23C3C=>niè +23C3F=>shū +23C40=>lǔ +23C42=>kùn +23C48=>mín +23C49=>mǐn +23C4D=>dàn +23C50=>yìn +23C53=>xiào +23C57=>jì +23C5C=>yīn +23C66=>fēn +23C67=>zhòng +23C6B=>gǔ +23C71=>chá +23C73=>liú +23C76=>bǔ +23C7A=>pā +23C7B=>sì +23C7C=>dāo +23C7D=>zhěn +23C80=>shān +23C82=>chuǎi +23C84=>jiǔ +23C8A=>kè +23C8B=>chí +23C91=>hù +23C92=>lì +23C93=>shā +23C96=>pài +23C97=>wéi +23C98=>wǔ +23C9C=>yíng +23CA1=>shā +23CA2=>dī +23CA5=>dān +23CB1=>tū +23CB2=>hé +23CB3=>pǒ +23CB5=>zhǐ +23CB6=>niǔ +23CB7=>nì +23CBD=>rǒng +23CBE=>guài +23CC0=>zhí +23CC3=>jí +23CDC=>fàn +23CDF=>jié +23CE0=>hǎi +23CE4=>zhàn +23CE6=>xì +23CE9=>zī +23CEC=>xí +23CED=>piào +23CF0=>bēn +23CF2=>jiǎn +23D13=>jiàn +23D16=>zá +23D1E=>bèn +23D1F=>mào +23D22=>zào +23D23=>zhuàng +23D25=>kuáng +23D28=>bí +23D2A=>pài +23D3C=>mào +23D3D=>tàn +23D5E=>tǔn +23D5F=>luǒ +23D62=>tān +23D71=>án +23D77=>hán +23D78=>zhú +23D7A=>duò +23D7B=>duò +23D7C=>gàn +23D86=>qiòng +23D88=>wǎng +23D8A=>mò +23D8B=>zhè +23D8C=>wěn +23D8D=>zhuàng +23D8F=>jiē +23D90=>pào +23D98=>sù +23D9D=>jù +23DA0=>qī +23DA1=>càn +23DA3=>tuán +23DA4=>shā +23DA6=>tuó +23DA9=>huà +23DAB=>yì +23DE0=>mín +23DE1=>zhōng +23DE5=>shuò +23DE9=>yì +23DEA=>wǎng +23DEB=>áo +23DF6=>sǔ +23DFE=>guǐ +23DFF=>tuǒ +23E00=>huǐ +23E03=>xù +23E04=>zǎn +23E06=>zǐ +23E07=>biàn +23E09=>dá +23E0A=>yīn +23E0B=>quǎn +23E0E=>huài +23E0F=>ná +23E10=>zá +23E12=>tí +23E18=>yí +23E19=>tān +23E1A=>shé +23E1B=>shuò +23E1D=>xíng +23E20=>yǒu +23E23=>fén +23E47=>kè +23E4B=>fú +23E52=>mǐn +23E5A=>pì +23E5C=>jí +23E5D=>qiào +23E5E=>zhǒng +23E5F=>gàn +23E60=>yuān +23E61=>chí +23E65=>qiàn +23E67=>zuó +23E69=>xié +23E6A=>máo +23E6C=>hú +23E6E=>pì +23E6F=>xùn +23E71=>xiá +23E72=>tí +23E75=>nà +23E76=>chuǎ +23E80=>wǔ +23EAC=>huāng +23EAD=>xuè +23EAE=>tào +23EB0=>qiào +23EB3=>jiāo +23EBC=>dǎng +23EBD=>bài +23ECD=>dàng +23ECE=>kòu +23ED0=>jū +23ED1=>shā +23ED2=>jīng +23ED5=>mó +23ED6=>nóu +23ED8=>shuò +23EDA=>shù +23EDB=>zhuāng +23EDC=>fú +23EDF=>zāng +23EE0=>xié +23EE1=>làng +23EE2=>tōng +23EE9=>zhé +23EEC=>càn +23EEE=>yuè +23EF1=>zhòu +23F1A=>tān +23F1E=>yán +23F1F=>lù +23F20=>yǎn +23F26=>zé +23F27=>shuài +23F45=>guō +23F46=>zhú +23F48=>rú +23F49=>rú +23F4C=>kǎn +23F4D=>jì +23F4E=>gāo +23F52=>xiè +23F55=>òu +23F56=>jiān +23F5A=>zhí +23F5B=>zhá +23F5D=>hǒng +23F5F=>kuǎn +23F61=>bó +23F64=>sè +23F65=>àn +23F66=>jiàn +23F68=>téng +23F6B=>sōng +23F6D=>mèng +23F6E=>yín +23F6F=>tān +23F70=>guō +23F73=>ruán +23F74=>wèi +23F77=>sì +23FA4=>qì +23FA6=>zhǎng +23FC5=>dǒng +23FC6=>fú +23FC7=>shěn +23FC8=>sù +23FC9=>yì +23FCA=>liàn +23FCC=>hé +23FCE=>zhēn +23FD0=>zé +23FD2=>cuǐ +23FD3=>cuǐ +23FDD=>fèng +23FDE=>lǐ +23FDF=>kòu +23FE3=>xiào +23FE4=>yǒu +24003=>háo +24009=>hàn +2400A=>kěn +2401D=>yù +24023=>huǎn +24024=>suō +24026=>là +24028=>dòu +24029=>jiàn +2402A=>pō +2402B=>biǎn +24030=>xuè +24032=>biàn +24037=>wèi +24061=>dàn +24062=>jié +24063=>bài +24065=>niǎn +24066=>xiàn +24067=>sè +2406A=>huá +2406B=>chuā +2406E=>òu +2406F=>liè +24070=>dí +24071=>cài +24073=>zhá +24075=>lǘ +24079=>huò +2407C=>lì +2407D=>yǐng +2407F=>wěi +24080=>bì +24081=>guó +24083=>pì +24086=>biāo +240A0=>yǎn +240A4=>zhuàn +240B2=>hóng +240B6=>lìn +240B7=>è +240B9=>yǐn +240BA=>làn +240BC=>yào +240BF=>xuàn +240C0=>lì +240E8=>làn +240E9=>líng +240EA=>xī +240EB=>hōng +240ED=>jiǎo +240EE=>zhuó +240F2=>zhí +240F5=>bó +240F6=>tēng +240F7=>ǎn +240FA=>xún +240FB=>lěi +240FC=>zāng +240FD=>huǐ +2410E=>xì +2410F=>hóng +24111=>fàn +24112=>jiǎn +24113=>cóng +24114=>zá +24116=>cā +24118=>yōu +2411B=>duì +2411C=>pān +24125=>tà +24127=>pàn +2412B=>fān +2412C=>xī +24136=>yào +24137=>luó +2413A=>biān +2413C=>jìn +2413D=>lì +2414A=>yàn +2414B=>dòu +2414E=>màn +24150=>gōng +24151=>rǎng +24152=>càn +24163=>mén +24171=>gǔ +24172=>shuàn +24178=>yán +24179=>bì +24180=>biāo +24181=>chéng +24182=>kuì +24184=>huǒ +2418D=>chì +2418F=>wò +24191=>còu +24192=>zhì +24199=>shuǐ +2419C=>guà +2419D=>pū +2419E=>xù +2419F=>sī +241A1=>wǔ +241AE=>fū +241B0=>shì +241B3=>huì +241B4=>huāng +241B5=>pā +241BC=>zhǔ +241BE=>yí +241C3=>lì +241C4=>shǎn +241DC=>mín +241DE=>gē +241E0=>hū +241EF=>ēn +241F0=>fá +241F3=>xù +241F4=>yí +241FE=>yìng +24214=>chí +24219=>yí +24225=>dí +24226=>huǐ +24227=>hé +24229=>zhǎ +24236=>yún +24237=>xiān +2424C=>xián +2424D=>lào +2424E=>shào +2424F=>shì +24250=>zhuó +24264=>biē +24265=>jiǔ +24266=>wō +24267=>jiǎo +24268=>fú +2426A=>xiāng +2426B=>kài +242B2=>nǎo +242B4=>huò +242B5=>jí +242B6=>là +242BB=>fōu +242BC=>shǎn +242BD=>liào +242BE=>miè +242BF=>chè +242C2=>mó +242CF=>lóu +242E8=>duò +242EB=>nǎo +242ED=>jī +242F0=>zhù +24302=>sù +24303=>duò +24307=>jiǒng +2430A=>zǎi +2430B=>huǐ +2430C=>yǐng +2430D=>hú +2430E=>lìn +2430F=>wěng +24310=>hàn +24314=>nán +24337=>xì +24339=>gàn +2433E=>hè +2433F=>jī +24340=>xiǎng +24341=>shā +24350=>tuì +24352=>zhāo +24353=>shù +24355=>yǒu +24356=>jiān +2435C=>zào +24364=>zhāng +2437D=>ruò +24384=>yān +2438B=>cuì +24397=>jí +24398=>shāng +243A3=>è +243A4=>láo +243A5=>tǎn +243A7=>zhù +243AD=>lǐn +243AF=>zēng +243B1=>juǎn +243B2=>hū +243D7=>shěn +243D8=>huò +243DC=>kuì +243F1=>chù +243F2=>zhòu +243F6=>āo +243F8=>zhuó +243FD=>xīng +243FF=>miè +24400=>hū +24414=>tán +24419=>bì +24423=>dǐng +24429=>kài +2442B=>biāo +24430=>huò +24431=>liè +24432=>cuàn +24443=>xiàn +24444=>rè +24453=>yuè +24455=>xūn +24457=>liǎo +24463=>shā +24466=>shì +2446A=>xiè +24473=>xiāo +24477=>yé +24478=>lǎn +24479=>yì +2447F=>liǎn +24494=>bó +24495=>cāo +2449D=>yào +244A6=>liàn +244BB=>tà +244D1=>jì +244D4=>xī +244D5=>zhì +244DA=>xī +244DD=>yuè +244E4=>xiǎn +244E6=>zhuò +244EF=>zhǎng +244F5=>zǔ +244F7=>ná +244FE=>dào +244FF=>liè +24500=>ná +24509=>páo +2450B=>jù +24516=>luǒ +24519=>shuǎ +2451A=>shàng +2451D=>luǒ +2451F=>fēn +24523=>bào +24528=>lì +2452B=>xiòng +24536=>dāng +24540=>chèng +24544=>zhǎng +24547=>sǒu +2454A=>shén +24552=>gě +24558=>yū +2455A=>huī +2455B=>chè +2455D=>jiào +2455E=>zhù +2455F=>shū +24562=>xiáo +24566=>níng +2456D=>jiāng +2456F=>jiāng +24577=>diào +2457D=>qiáng +2457E=>qiú +24580=>fēng +24586=>zhàn +24587=>kē +24592=>dié +24593=>zé +24596=>guāng +24597=>sè +24598=>fèn +2459B=>jiǎng +2459D=>yán +2459E=>zhì +245A2=>lì +245A6=>líng +245AA=>yí +245AC=>qǔ +245AD=>pán +245AE=>gōu +245B0=>jiǎ +245B1=>hé +245B3=>pèng +245B5=>jù +245B7=>chè +245BA=>liè +245BB=>shì +245BC=>pò +245BD=>xiàng +245BF=>pì +245C0=>luǒ +245C1=>cù +245C3=>yǔ +245C7=>kòng +245C8=>xiè +245CD=>wǎn +245CE=>yǎn +245CF=>péi +245D3=>chéng +245D8=>tí +245D9=>chè +245DA=>bì +245DB=>liàn +245DC=>jiǎ +245DE=>tíng +245E2=>tī +245E8=>dié +245EA=>shù +245EB=>lí +245EC=>lǘ +245ED=>xiā +245EF=>cuī +245F3=>bō +245F4=>tuí +245F5=>pú +245F7=>lìn +245F8=>fèn +245FA=>bó +245FB=>chàn +245FE=>dāng +245FF=>tǎi +24600=>dào +24603=>lì +24605=>yá +24606=>yá +24607=>zhān +2460A=>yí +2460C=>qī +24614=>hù +24616=>tīng +24618=>kǒu +2461B=>chún +2461C=>yóu +2461D=>fèn +2461F=>nuó +24620=>tiàn +24621=>jìn +24622=>pí +24623=>chén +24624=>pì +24626=>jiè +24627=>guǐ +24632=>zhuàng +24635=>hú +24636=>chǒu +24637=>shù +24638=>tāo +24639=>pí +2463A=>rǒng +2463B=>rǒng +2463D=>hǒu +2463E=>pēng +24645=>bài +24647=>xiá +2464B=>qǐn +2464C=>nǐ +2464E=>tāo +2464F=>qù +24652=>xié +24654=>zhào +24655=>huā +24656=>xīn +24658=>shōu +2465B=>tú +2465D=>liáng +2465E=>bì +2465F=>chū +24661=>xīng +24663=>xīn +24664=>fū +24669=>jiè +2466D=>fǔ +24670=>tè +24671=>shè +24674=>chāo +24675=>chuī +2467C=>rán +2467D=>hǒu +2467E=>bēng +24680=>cǎi +24685=>mú +24689=>xū +2468A=>dié +2468D=>chǎn +2468E=>yú +2468F=>zhòng +24693=>lí +24694=>shōu +2469A=>dú +2469C=>māo +2469D=>huáng +2469F=>táo +246A1=>dù +246A2=>tí +246A3=>shēng +246A4=>méi +246A8=>zhēn +246A9=>qín +246AA=>pì +246AB=>táng +246AC=>cāng +246AD=>yáo +246AF=>xiù +246B0=>bāng +246B1=>gǔ +246B5=>bù +246BC=>gòu +246BD=>bó +246C1=>wèn +246C4=>jì +246CA=>lā +246CD=>cuī +246CE=>mǐn +246CF=>cǔ +246D0=>ōu +246D1=>yōng +246D6=>máo +246D7=>kè +246D8=>māng +246D9=>dǐng +246DA=>huān +246DB=>duǒ +246DC=>jiāng +246DD=>sù +246E2=>céng +246E3=>tà +246E5=>huáng +246E6=>jué +246E7=>xún +246EA=>xiòng +246EC=>mì +246ED=>qún +246EE=>láo +246F1=>zhì +246F2=>wěi +246F7=>sè +246FB=>zāng +24701=>ǎn +24702=>wèi +24704=>huài +24707=>zhàn +24709=>yīng +2470A=>gē +2470B=>huì +2470D=>quán +24713=>liè +24714=>jú +24715=>bà +24716=>léi +24718=>mán +24719=>líng +2471C=>lì +2471D=>jǐ +24721=>huí +24722=>xìn +24723=>shì +24724=>zhé +24727=>bō +2472B=>chā +2472F=>chā +24730=>jīng +24731=>bā +24732=>bèi +24735=>yàn +24737=>hù +24739=>yú +2473B=>bì +2473C=>chuán +2473E=>jǐ +24742=>mù +24744=>máo +24745=>zhōng +24747=>yè +24748=>dōu +24749=>yě +2474D=>rì +2474E=>yīn +24750=>hào +24752=>nà +24753=>tiè +24754=>fù +24755=>mǔ +24756=>zǎi +24758=>hú +2475A=>chēn +2475B=>tuó +2475E=>chù +2475F=>fú +24767=>bào +2476C=>dǐ +2476D=>cǎi +2476E=>lù +2476F=>pǒ +24770=>dá +24771=>yè +24773=>yǐ +24777=>xiáng +24778=>bī +24779=>zhū +2477B=>yí +2477D=>lǜ +2477F=>kuāng +24782=>zhì +24787=>wá +24788=>dī +24789=>shù +2478A=>liè +2478B=>zǎo +2478C=>zhì +2478D=>náo +24797=>chái +2479A=>xiāo +2479B=>zàng +2479E=>yù +2479F=>dòu +247A0=>chà +247A1=>xié +247A2=>yáng +247A4=>xiǎn +247A5=>bǎo +247AE=>zhāi +247B0=>qiú +247B2=>hú +247B3=>zài +247B4=>jué +247B6=>hān +247BF=>àn +247C0=>zào +247C3=>shà +247C5=>xiàn +247C6=>chǐ +247C7=>yǎn +247C9=>àn +247CD=>zhé +247CE=>jué +247D1=>lì +247D3=>lè +247D6=>cǎi +247D8=>lù +247DA=>jiā +247DD=>xià +247DE=>xiào +247DF=>yān +247E0=>xū +247E2=>dùn +247E3=>yíng +247E4=>huī +247E5=>tí +247E6=>nóu +247E7=>xǐ +247EA=>tú +247F7=>wāi +247F8=>chēn +247FC=>hōng +247FE=>tí +247FF=>xuān +24800=>zá +24807=>gé +2480B=>lóu +2480C=>chái +2480D=>pán +2480E=>jí +24810=>tà +24813=>xī +24816=>xiāo +24818=>sāo +24819=>jiā +2481A=>sù +2481B=>huāng +2481D=>cuō +2481F=>tà +24820=>shuāi +2482A=>fú +2482B=>lì +2482D=>shè +2482F=>táng +24836=>diān +2483A=>bì +2483C=>gòu +2483D=>cù +2483F=>qiān +24842=>léi +24843=>sù +24846=>zòng +24847=>hāo +2484F=>chì +24850=>cáo +24853=>wò +24854=>xiāo +24855=>liè +24856=>yān +2485D=>bì +2485F=>huàn +24861=>xī +24862=>chī +24863=>xū +24864=>náo +24865=>yán +24867=>xiè +24868=>zhá +2486A=>suì +2486C=>xì +2486D=>bēng +2486E=>rán +2486F=>shuò +24870=>bān +24871=>guì +24872=>kāi +24873=>chēn +24876=>xù +2487E=>è +2487F=>lì +24880=>xī +24881=>huàn +24882=>sù +24884=>chǎng +2488A=>lù +2488B=>yán +2488E=>dāng +2488F=>dǎn +24890=>yāng +24892=>zhǎi +24893=>jù +24895=>duó +24896=>sāo +24897=>lái +24898=>sù +2489F=>zé +248A3=>bì +248A6=>yìn +248A8=>hāo +248AA=>liè +248AD=>háo +248AE=>yáng +248B4=>shuò +248B5=>ài +248B6=>qióng +248B9=>lěi +248BA=>xié +248BC=>shì +248C3=>lǔ +248C5=>què +248C6=>lián +248CC=>xiào +248CE=>yīng +248D1=>xié +248D8=>líng +248D9=>yōu +248DE=>dǎng +248DF=>lǎn +248E0=>xiāo +248E8=>yì +248EC=>wū +248EE=>yì +248EF=>tuō +248F0=>bǔ +248F2=>xìn +248F5=>sī +248F6=>jīn +248F8=>bā +248F9=>fǎ +248FB=>mò +248FC=>ruò +2490A=>dà +2490B=>jì +24910=>sù +24911=>qióng +24912=>bā +24926=>tián +24927=>yóu +24929=>tuó +2492B=>wài +2492C=>yòu +2492E=>dōng +24931=>xǐ +24932=>kǒng +24936=>qióng +24937=>duī +24938=>duò +2493A=>yì +24952=>xī +24953=>qīn +24954=>sù +24957=>liú +24959=>wán +2496D=>chē +2496E=>zhū +24970=>mào +24977=>quán +2497D=>yū +2497F=>yì +24980=>mí +24983=>lái +24984=>zhì +249A4=>ní +249A6=>bān +249AA=>dōng +249AE=>zhì +249D5=>yì +249D8=>líng +249D9=>yú +249DA=>cōng +249DB=>dì +249DC=>zhì +249E0=>ruǎn +249E3=>jiàn +249E9=>wàn +249EB=>jìn +249ED=>páng +24A0D=>lù +24A0E=>qú +24A10=>xǐ +24A11=>dá +24A16=>hù +24A17=>luǒ +24A19=>lè +24A36=>gǒng +24A3B=>lìng +24A42=>láo +24A44=>zhuàn +24A68=>zǎo +24A69=>hào +24A6A=>xiàng +24A6D=>hào +24A6E=>lì +24A71=>diàn +24A72=>gé +24A7D=>huán +24A84=>è +24A86=>xiá +24A8B=>jiān +24A8C=>qí +24A8D=>xiá +24A8E=>yǒu +24AA1=>zhēng +24AAA=>zhuàn +24AAE=>chàn +24AC9=>xiè +24AD5=>náo +24ADD=>jì +24ADE=>tián +24AE3=>yǎn +24AE7=>hǎo +24AE8=>xín +24AE9=>líng +24AEB=>bān +24AEC=>běng +24AF1=>gōu +24AF2=>líng +24AF5=>kuò +24AF6=>qià +24AF7=>jiào +24AF9=>ēn +24AFA=>yáo +24AFB=>dū +24B01=>huǒ +24B02=>dǔ +24B03=>pēi +24B0C=>yuán +24B0F=>lóu +24B10=>xíng +24B13=>lián +24B14=>yáo +24B15=>xī +24B16=>yáo +24B18=>xī +24B1B=>lú +24B1D=>yàn +24B20=>quán +24B25=>ráng +24B26=>wà +24B27=>zú +24B28=>fàn +24B29=>yì +24B2A=>dù +24B2B=>suì +24B2D=>pī +24B2F=>hán +24B31=>xù +24B33=>gǒng +24B35=>dì +24B37=>nà +24B3E=>duò +24B3F=>wā +24B42=>niè +24B48=>diào +24B49=>huāng +24B4C=>tí +24B4D=>fàn +24B51=>wú +24B52=>áng +24B54=>píng +24B59=>hán +24B5B=>gāng +24B5C=>lí +24B5E=>dūn +24B5F=>fù +24B60=>nà +24B62=>cèi +24B67=>jiē +24B69=>qìng +24B6B=>yīng +24B6C=>xiáng +24B71=>hú +24B74=>sù +24B7B=>gē +24B7C=>è +24B7D=>xù +24B86=>xī +24B8A=>kāng +24B8B=>guó +24B8C=>jiē +24B8D=>chuán +24B8E=>léi +24B8F=>héng +24B90=>zūn +24B95=>piè +24B98=>dēng +24B99=>xī +24B9A=>léi +24B9C=>shàn +24BA7=>lú +24BA9=>duì +24BAA=>jùn +24BAD=>chàn +24BAF=>xié +24BB0=>wā +24BB1=>zhé +24BB3=>zhuān +24BB7=>liù +24BB8=>léi +24BBC=>dài +24BBD=>gān +24BC4=>shì +24BC7=>yǎn +24BCC=>gān +24BD0=>yán +24BD6=>suī +24BDA=>zhōng +24BDC=>shì +24BE1=>shèng +24BE5=>chǎn +24BF7=>huáng +24BF8=>yìn +24BFB=>měng +24C02=>ráng +24C05=>xiáng +24C08=>bèi +24C0C=>chuán +24C11=>pú +24C19=>kē +24C1A=>lā +24C1D=>quǎn +24C1F=>hàng +24C20=>chì +24C21=>máng +24C26=>zhà +24C2A=>fèn +24C2C=>chào +24C33=>jǐng +24C43=>liè +24C45=>nà +24C46=>nà +24C47=>tóng +24C4B=>rán +24C4C=>zǔ +24C4D=>pī +24C4E=>yǒu +24C50=>shū +24C5B=>liè +24C5C=>shōu +24C5D=>tuǎn +24C5F=>gǎo +24C60=>sháo +24C61=>tuó +24C63=>nán +24C67=>tuǒ +24C68=>gōng +24C69=>diào +24C74=>měng +24C75=>bāng +24C77=>xié +24C78=>sì +24C79=>tǐng +24C7A=>guì +24C7D=>fú +24C7E=>guì +24C89=>guì +24C91=>zhǔ +24C93=>lái +24C95=>lǔn +24C96=>tiǎn +24C97=>rǎn +24C9A=>dōng +24CA8=>juàn +24CA9=>yán +24CAC=>ruán +24CAD=>dǎn +24CB0=>mào +24CB6=>luán +24CB8=>xù +24CBA=>xī +24CC2=>má +24CC3=>qī +24CC5=>chà +24CC8=>shāng +24CC9=>hàn +24CCA=>píng +24CCE=>jī +24CD3=>lì +24CD5=>yù +24CD6=>bān +24CD8=>tēng +24CDD=>chóu +24CE0=>chóu +24CE4=>qī +24CE5=>xī +24CE6=>bèi +24CEA=>yè +24CED=>guǎng +24CEF=>zhù +24CF3=>léi +24CF4=>léi +24CF5=>chā +24D00=>guǎng +24D0D=>dié +24D13=>yǎ +24D18=>niè +24D19=>shū +24D1B=>zhì +24D1F=>zhì +24D22=>zhì +24D23=>pǐ +24D25=>jiū +24D26=>jiū +24D27=>yì +24D28=>yòu +24D2A=>jiū +24D2F=>huàn +24D31=>dù +24D3B=>táo +24D3C=>qiè +24D3D=>qín +24D3E=>xìn +24D3F=>chān +24D40=>jì +24D42=>qìn +24D4A=>dù +24D4B=>zhī +24D4E=>ǒu +24D50=>wù +24D52=>wén +24D58=>bì +24D5B=>bēi +24D5D=>mǔ +24D5E=>jìn +24D5F=>táo +24D60=>liáo +24D65=>cáo +24D66=>zhá +24D6C=>chǐ +24D6D=>yā +24D6E=>kuí +24D6F=>yìn +24D78=>lóng +24D79=>qià +24D7B=>hāng +24D7C=>shàng +24D7D=>hài +24D7E=>chā +24D80=>jiǎo +24D81=>lǎo +24D88=>xī +24D8B=>bó +24D93=>zhǐ +24D95=>tùn +24D96=>fú +24D98=>hū +24D9A=>niè +24D9B=>yì +24D9C=>zhuàng +24DA0=>chá +24DA4=>suān +24DA7=>yùn +24DAE=>dù +24DB0=>xī +24DB1=>chuàn +24DB2=>xíng +24DB3=>jiǎo +24DB4=>shēn +24DC0=>wāng +24DC1=>bēi +24DC2=>féi +24DC3=>jiàn +24DC4=>quán +24DC5=>yì +24DC6=>dōng +24DC7=>xù +24DC8=>nà +24DC9=>jí +24DCC=>zhěn +24DCD=>qí +24DCE=>duī +24DCF=>yín +24DD1=>jiù +24DD2=>pí +24DD3=>xìn +24DD4=>lún +24DD5=>cǎi +24DD6=>lìng +24DD7=>biē +24DD8=>dào +24DD9=>dé +24DDF=>la +24DE1=>xī +24DE2=>jù +24DE4=>xiáo +24DE6=>jīng +24DF9=>wài +24DFB=>nǎo +24DFC=>xiāng +24DFD=>què +24DFE=>qiè +24DFF=>tū +24E00=>xǔ +24E01=>huì +24E05=>mín +24E06=>wěi +24E08=>yóu +24E09=>tuí +24E0A=>dài +24E0E=>kě +24E0F=>nà +24E11=>fù +24E12=>yù +24E13=>zhǐ +24E15=>hān +24E16=>āi +24E17=>fù +24E21=>yāng +24E24=>shí +24E26=>chán +24E2A=>chì +24E2B=>yùn +24E2C=>shuāi +24E2E=>sù +24E2F=>sǎng +24E31=>è +24E32=>zhěng +24E33=>ái +24E34=>suǒ +24E35=>bù +24E37=>qún +24E38=>yì +24E39=>yǎn +24E3B=>nà +24E3C=>wǔ +24E47=>lì +24E48=>lì +24E4A=>xī +24E4B=>jué +24E4C=>shī +24E4E=>yǎ +24E5B=>chén +24E5C=>yíng +24E5D=>bì +24E5E=>chè +24E61=>zhā +24E62=>tuǒ +24E63=>hù +24E64=>téng +24E65=>yìng +24E66=>bǐ +24E67=>níng +24E68=>liàn +24E69=>xìn +24E6A=>yǔ +24E72=>bèi +24E74=>mó +24E75=>duī +24E77=>dǎo +24E78=>qí +24E80=>shuāi +24E83=>xiāo +24E84=>zhǒng +24E85=>zhuì +24E87=>biàn +24E89=>wěi +24E8A=>xī +24E8C=>dēng +24E8E=>xiē +24E8F=>pān +24E90=>niè +24E93=>bié +24E94=>shè +24E95=>fèi +24E96=>mǐn +24E97=>qì +24EAA=>shàn +24EAB=>suǒ +24EB7=>jí +24EBA=>dǎn +24EBB=>juàn +24EBC=>lù +24EBE=>ào +24EC2=>yì +24EC3=>shǔ +24EC4=>suì +24EC5=>wèi +24EC6=>wán +24EC7=>chǔ +24ECC=>wò +24ED6=>bì +24ED8=>yǐn +24ED9=>huó +24EDC=>kài +24EDD=>níng +24EE2=>ài +24EE4=>lì +24EE6=>zhāi +24EF1=>lù +24EF6=>biàn +24EF7=>pán +24EFF=>guì +24F00=>sū +24F01=>méng +24F02=>xiǎn +24F03=>lòng +24F05=>qì +24F0B=>chàn +24F0C=>yì +24F0D=>háng +24F0F=>liǎn +24F10=>guàn +24F12=>wěi +24F17=>jué +24F18=>léi +24F19=>luán +24F1A=>lì +24F1C=>pí +24F22=>huǎn +24F2E=>guī +24F33=>jú +24F36=>dēng +24F3A=>fèi +24F41=>zhī +24F43=>mèi +24F45=>huàn +24F49=>pā +24F4A=>bǐ +24F4C=>pō +24F53=>ér +24F55=>huàn +24F63=>chàng +24F65=>luò +24F66=>fǒu +24F6F=>chóu +24F71=>zú +24F72=>nán +24F73=>xiǎo +24F79=>bài +24F7A=>lù +24F7C=>luò +24F7F=>niàn +24F80=>zé +24F84=>zhù +24F85=>hú +24F88=>huī +24F89=>tǎng +24F8A=>chóu +24F91=>huáng +24F92=>dōu +24F9B=>miào +24F9D=>bó +24FA0=>dì +24FA2=>děng +24FA3=>pū +24FA5=>sōng +24FA6=>chóu +24FAB=>yào +24FAC=>měng +24FAD=>lóng +24FB2=>lián +24FB5=>bié +24FBA=>lǚ +24FBF=>sè +24FC0=>zuó +24FC4=>cún +24FC5=>líng +24FC6=>zhěng +24FC7=>pǐ +24FC8=>báo +24FCB=>què +24FCE=>pī +24FCF=>nàn +24FD0=>pī +24FD1=>bǒ +24FD2=>bèi +24FD3=>fā +24FD5=>mǐn +24FD6=>mò +24FD7=>wà +24FD8=>zhāo +24FD9=>zhì +24FDA=>cū +24FDF=>xún +24FE0=>jí +24FE1=>guì +24FE3=>chéng +24FE7=>hàn +24FE8=>xiào +24FE9=>què +24FEB=>chuò +24FED=>fǔ +24FF3=>qǐn +24FF4=>lù +24FF5=>què +24FF6=>diǎn +24FF7=>qiān +24FFC=>chǎng +24FFD=>tà +24FFE=>bēi +25001=>dù +25002=>běng +25003=>hòu +25008=>zhǎ +25009=>zhǎ +2500E=>què +2500F=>má +25010=>hán +25013=>liú +25014=>lù +25016=>zī +25018=>pǐ +25019=>zhòu +2501B=>zāo +2501D=>niǔ +25020=>huì +25023=>xué +25025=>là +2502B=>nóu +2502C=>yǎn +2502D=>rǎn +2502E=>nǎo +25030=>là +25031=>guǎng +25032=>dú +25035=>lú +25039=>jiǎn +2503A=>xiè +2503B=>qì +2503E=>xiàng +25041=>guǒ +25042=>jié +25043=>màng +25046=>xiā +25047=>kuī +2504E=>yòng +25050=>hǎi +25051=>mì +25052=>yào +25055=>wēn +2505F=>lì +25060=>juàn +25061=>wū +25062=>qiáo +2506E=>diào +2506F=>chù +25072=>suō +25075=>chōng +25078=>quān +25079=>shè +25082=>měng +25083=>jù +2508B=>tú +25092=>nóng +25093=>mó +25099=>fèn +250A2=>áo +250A3=>guō +250A4=>hú +250A5=>cán +250A6=>dūn +250A7=>hǎi +250A8=>jiǎo +250B0=>gū +250B5=>jīn +250B8=>yáng +250C0=>chà +250CC=>huī +250D4=>qú +250D5=>kē +250DF=>qīng +250E0=>yì +250E3=>kǎi +250E4=>jiǎo +250E7=>chōu +250E8=>bǔ +250E9=>gèn +250EA=>jiāo +250EB=>zhī +250EE=>wèn +250F0=>bīn +250F4=>xiòng +250F5=>fàn +250F8=>yí +250F9=>chuàn +250FA=>yào +250FD=>yāng +250FE=>dù +250FF=>yǎn +25101=>méng +25107=>chī +25108=>mù +25109=>jiāo +2510B=>nǜ +2510D=>guó +2510E=>xuè +25111=>fú +25112=>xuē +25113=>fū +25114=>pèi +25115=>mò +25116=>xī +25117=>wò +25118=>shǎn +2511B=>xī +2511C=>qì +2511D=>miàn +25126=>dǎn +25128=>chǒu +25131=>fèi +25132=>mié +25134=>xuè +25135=>xù +25136=>sī +25137=>jǔ +25138=>mǎo +25139=>bào +2513B=>yí +2513C=>guā +2513D=>nì +2513F=>yí +25141=>zuò +25144=>nǔ +25151=>diàn +25152=>fàn +25153=>yì +25154=>shì +25157=>cū +25158=>zhěn +2515E=>shì +2515F=>jiǎo +25160=>hòu +25161=>ér +25166=>lèi +25167=>xuè +25168=>gèng +2516A=>shōu +2516C=>juān +25174=>jié +25175=>wéi +25177=>shǒu +25178=>jìng +2517A=>xú +2517B=>chòng +25185=>jiāng +25186=>mòu +25189=>yù +2518C=>jué +25191=>tìng +25194=>xiāo +25196=>dōu +25198=>guó +25199=>máng +2519A=>wāng +2519B=>xù +2519C=>wàng +2519D=>suō +2519E=>juàn +2519F=>yuè +251A1=>hán +251A3=>shēn +251A5=>xié +251A6=>liú +251A7=>rún +251AF=>bì +251B2=>nào +251B6=>wàn +251B7=>jiù +251B8=>quē +251C4=>nì +251C6=>mí +251C7=>suō +251C9=>qiǎng +251CC=>hàn +251CD=>zhuó +251CE=>mí +251CF=>xù +251D1=>lǎng +251D2=>jié +251D3=>dìng +251D4=>chàng +251D5=>zhì +251D6=>fēi +251D7=>jiá +251D8=>jùn +251D9=>huò +251DA=>qī +251DB=>jū +251DC=>zhūn +251DE=>diàn +251DF=>jiǎo +251E0=>yā +251E2=>zhǎn +251ED=>zhī +251EF=>mài +251F0=>hū +251F1=>xiè +251F2=>shí +251F3=>guī +251FF=>xù +25202=>jí +25204=>chuàng +25206=>mào +25207=>ruán +25208=>xū +25209=>huàn +2520A=>shà +2520B=>jǔ +2520F=>kuàng +25211=>hóu +25212=>guān +25213=>guā +25215=>mí +25216=>dié +25217=>bì +25218=>liǎng +25219=>là +2521A=>shǎn +2521B=>lù +2521C=>xì +2521F=>sǒu +2522C=>ōu +2522E=>léng +25237=>kū +25238=>guī +2523B=>xī +2523C=>pán +2523D=>sè +2523E=>juè +2523F=>hòng +25240=>guàn +25241=>jù +25243=>nài +25244=>huá +25245=>gé +25246=>lì +25247=>gòu +25248=>tì +2524A=>mà +2524B=>téng +2524C=>dá +25250=>qī +25251=>yù +25252=>jiǎo +25253=>miè +25254=>gěng +25255=>mèng +25256=>wèi +25258=>tí +25259=>qí +2525C=>chén +2525D=>dōu +2525F=>pán +25270=>hàn +25274=>mì +25275=>má +25276=>lù +25277=>qī +25278=>kēng +2527A=>dié +2527B=>qì +2527C=>jiāo +2527D=>kāng +2527E=>qiāo +2527F=>mì +25280=>shān +25287=>jiān +25288=>lí +25289=>kè +2528A=>xù +25291=>mán +25292=>fèng +25293=>chàn +25294=>huǐ +252A7=>kòu +252AA=>wěi +252AB=>guàn +252AC=>jí +252AD=>zùn +252AE=>huò +252AF=>xié +252B4=>suì +252B6=>ruǎn +252B8=>tè +252BC=>zhèng +252BD=>kūn +252BE=>xiǎng +252BF=>mián +252C1=>xì +252CC=>sā +252D9=>è +252DA=>miè +252DB=>zhǔ +252DC=>zōu +252DD=>měng +252DF=>xī +252E1=>táng +252E3=>jià +252E4=>cháng +252E5=>jí +252EE=>zhuó +252FF=>hè +25300=>chá +25301=>qì +25302=>mián +25303=>zhěn +25304=>kū +25305=>yè +25306=>zhōu +25308=>jiān +2530A=>pàn +2530D=>huī +2530F=>míng +25310=>liù +25318=>shuì +2531A=>mài +2531B=>lí +2531E=>shuò +2531F=>yí +25324=>lì +25328=>xiē +25329=>tè +2532A=>xiū +2532D=>xuàn +2532E=>lì +2532F=>méng +25330=>wéi +25331=>méng +2533A=>yào +2533B=>lán +2533C=>líng +2533D=>yīng +2533E=>yīng +2533F=>lì +25340=>jiǎn +25341=>guī +25345=>guān +25346=>xiè +25349=>shè +2534B=>zuī +25353=>kàn +25354=>léi +2535A=>biàn +2535D=>shǔ +2535E=>nǜ +2535F=>xù +25363=>hào +25368=>guǐ +2536A=>zhài +2536B=>láng +2536C=>cuān +2536D=>zhì +2536E=>féng +2536F=>qīn +25371=>zé +25372=>nà +25373=>niǔ +25374=>yì +25377=>cōng +25378=>shī +25379=>jiǎn +2537A=>zōng +2537B=>yǎn +2537C=>yīng +25380=>ruǎn +25382=>róng +25383=>xì +25385=>guān +25386=>kài +25388=>wù +2538A=>qín +2538B=>cōng +2538D=>zé +2538E=>xiè +25390=>yù +25391=>zàn +25392=>chuāng +25393=>lǐ +25394=>lǐ +25395=>xù +25396=>mí +25397=>xù +25398=>ruǎn +2539B=>guì +2539C=>rǒng +2539F=>máo +253A1=>qín +253A2=>cuàn +253A3=>cuàn +253A4=>cuàn +253AE=>wū +253B0=>fǎ +253B1=>bá +253B8=>qià +253B9=>zhì +253BA=>tiào +253C4=>zhì +253C5=>zhí +253C7=>huàn +253C8=>chóu +253CA=>zhì +253CE=>yǐng +253D2=>wù +253D3=>bēi +253D5=>hóng +253D6=>shěn +253D8=>jué +253D9=>kuì +253DC=>yǐ +253DD=>yà +253E0=>bī +253E4=>kuà +253E5=>qiān +253E8=>zhāo +253EA=>kǎi +253EB=>shāng +253EE=>àn +253EF=>zhé +253F0=>zhì +253F7=>zhì +253F9=>jiǎo +25400=>sī +25401=>pú +25402=>ǒu +2540A=>zhuó +25411=>yīng +25413=>huān +25415=>yà +25418=>shí +25419=>pā +2541A=>pǔ +2541E=>máng +2541F=>chāi +25429=>yún +2542C=>gǔ +25439=>dǎn +2543B=>náo +2543D=>zhé +2543F=>hú +25445=>kēng +25447=>dié +25448=>tīng +2544B=>guài +2544E=>qiōng +2544F=>shǐ +25450=>jiǎ +25451=>ào +25452=>nǎ +25453=>pǐn +25454=>jiá +25461=>zhè +25462=>bù +25463=>wǒ +25465=>chǎ +2546A=>náo +2546B=>kǎn +2546F=>dú +25470=>guài +25471=>qióng +25473=>róng +25474=>yǐ +25475=>duī +25476=>lěi +25478=>zhōu +25479=>kuā +2547A=>ē +2547B=>xiān +2547C=>diàn +2547D=>nuò +2547E=>è +2547F=>yōng +25480=>wù +25481=>kēng +25493=>zhì +25497=>zhǐ +25498=>xún +2549B=>zhèng +2549E=>yáng +254A0=>huò +254A1=>jí +254A2=>nǎo +254A7=>yà +254A8=>lù +254AB=>fū +254AC=>sǎn +254AD=>chù +254AE=>wěi +254B0=>fǔ +254B1=>kēng +254B2=>sì +254B3=>kàng +254B5=>yì +254B6=>huà +254BE=>yǔ +254C3=>lì +254C6=>lǐn +254C7=>dǔ +254C8=>è +254CC=>qiǎng +254CD=>dú +254D0=>jié +254D1=>chuò +254D2=>xiàn +254D6=>gǎo +254EC=>dào +254F0=>hōng +254FB=>zōng +254FE=>qì +254FF=>tuó +25500=>hōng +25501=>pǐ +25502=>gèng +25504=>niè +25507=>kōng +2550A=>zhǐ +25511=>xiǎo +25521=>shè +25522=>yú +25523=>jiāng +25529=>qǐ +2552A=>chěn +2552B=>sǎng +2552D=>suǒ +2552E=>qián +2552F=>huì +25531=>shàn +25532=>è +2553B=>qiū +2553D=>kè +25540=>wēng +25541=>zī +25542=>jí +25547=>dǎ +25549=>cuò +2554D=>lǒu +2554E=>kāng +2554F=>kuò +25550=>dí +25551=>qiē +25553=>mò +25556=>guǒ +25557=>hōng +25558=>cháo +25559=>hēi +25562=>cáo +25563=>zhé +25566=>gǔn +25570=>xū +25571=>péng +25572=>jué +25575=>gǎn +25576=>sī +25578=>suì +25579=>què +2557B=>wú +2557C=>yán +2557D=>pèng +2557E=>xiǎo +2557F=>pān +2558D=>là +25597=>bèng +25598=>zhěn +25599=>jí +2559C=>jǐn +2559D=>lián +2559E=>kěn +255A0=>zhóu +255A8=>zào +255AA=>lè +255AB=>qī +255AC=>bìng +255B5=>yǐn +255B6=>pīn +255BB=>sǒu +255BC=>lǜ +255BE=>dí +255BF=>dú +255C0=>liǎo +255C1=>zhuó +255CA=>chǎng +255D2=>chèn +255D3=>tà +255D9=>què +255DA=>dào +255DD=>rǎng +255DF=>pò +255E6=>zhōng +255E7=>xiē +255EA=>jiāng +255EB=>qú +255EC=>lěi +255ED=>cà +255EE=>quē +255F5=>xiàng +255F6=>lèi +255FA=>làn +255FF=>lǎ +25601=>lǎ +25604=>yù +2560A=>jiào +2560B=>qín +2560C=>jī +2560F=>gǎn +25612=>yì +25620=>yì +25621=>zhī +25624=>biǎo +25625=>shēng +25626=>jiù +2562B=>hē +2562C=>fú +2562E=>jū +25640=>zuǒ +25641=>yí +25646=>xiàn +25647=>yí +25649=>sì +2564B=>chuì +2564E=>mò +25661=>zhān +25663=>xún +25666=>rú +25668=>huò +2566C=>shāo +25670=>shòu +2567E=>yòu +2567F=>yù +25682=>jùn +25689=>zī +2568A=>lù +2569A=>chǐ +2569B=>kūn +256A0=>zhùn +256A6=>hóu +256A9=>xǔ +256BE=>zōng +256BF=>yìng +256C2=>zhū +256C5=>liù +256D1=>nù +256D8=>bì +256DA=>chì +256DC=>zǔ +256DD=>féng +256DE=>lù +256DF=>pǔ +256E5=>zhuàn +256E7=>zhé +256E8=>shī +256E9=>yǔ +256EA=>lù +256EB=>liáng +256EF=>jué +256F0=>liào +256F1=>bēng +25703=>yì +25704=>guān +2570C=>ǎo +2570F=>guì +25710=>mǐn +25712=>yǎn +25713=>lán +25716=>bó +25719=>zàn +2571A=>yǒu +25725=>yì +25726=>nǐ +2572C=>nǐ +2572D=>guǒ +2572E=>jùn +25730=>shī +25732=>xiǎn +25734=>qiān +25735=>què +25736=>kuí +25740=>shé +25742=>huò +25744=>wàn +2574A=>fèi +2574B=>fèi +2574D=>yù +25751=>zhī +25752=>guà +25754=>jié +25755=>máng +25756=>hé +25758=>yǒu +2575F=>dù +25760=>sī +25762=>lì +25765=>jié +25766=>niǔ +25767=>bà +25768=>yú +2576E=>zhī +25778=>hé +25779=>kē +2577E=>dù +2577F=>jiā +25781=>chēn +25783=>chuì +25784=>hé +25785=>zhǎi +2578A=>mèi +2578D=>hé +2578E=>zǐ +2578F=>zhú +25792=>tuó +25798=>zùn +2579A=>rú +2579B=>duò +2579C=>jiàng +257A7=>héng +257A9=>bēng +257AA=>mò +257AF=>zú +257B2=>biē +257B4=>kù +257B5=>jiá +257BA=>zhuō +257BC=>xiū +257C3=>hé +257C5=>qiāo +257CD=>fěi +257CE=>shēng +257D2=>zhuì +257D3=>kuǎn +257D4=>zè +257D5=>xiān +257D7=>bì +257D8=>yì +257DA=>chàng +257EA=>mào +257F6=>wǎn +257FD=>wū +257FE=>kū +257FF=>wǒ +25800=>xīng +25801=>kē +25803=>jiū +25804=>duān +25805=>huàn +25808=>zhì +25809=>cè +2580A=>róu +2580B=>jí +2580D=>yè +2581B=>jīng +2581C=>yàng +25821=>zǒng +25829=>cǎn +25831=>sī +25832=>lì +25833=>gǔ +25834=>chàng +25836=>fěi +25837=>liú +25839=>jié +2583A=>yūn +2583D=>zhì +25840=>chóu +25841=>biē +25852=>jī +2585C=>luó +2585D=>jiān +2585F=>chuāng +25860=>shuǎng +25862=>lǜ +25863=>jùn +25864=>jiào +25866=>tì +25867=>zhā +2586A=>yì +2586C=>cōng +2586D=>něi +2586E=>jiā +25874=>jì +2587D=>ài +25887=>jiǎn +2588A=>bèn +2588C=>fán +2588D=>suì +2588E=>zùn +25890=>gāo +25891=>gǎo +25892=>láo +25894=>zhuó +2589F=>hù +258A2=>tuí +258A6=>bì +258A7=>jú +258AE=>huá +258B2=>chéng +258B6=>kuài +258B7=>dāng +258B8=>gé +258B9=>xié +258BB=>jié +258BD=>cān +258C6=>zú +258C8=>pú +258CB=>shǔ +258CC=>bǔ +258D7=>níng +258D8=>yǎn +258D9=>zhòu +258DB=>méng +258DD=>biǎn +258DF=>xiàng +258E4=>lù +258E5=>lí +258E9=>jì +258EB=>miè +258EC=>lèi +258EE=>zhì +258EF=>yōu +258F0=>biǎn +258F8=>mù +258F9=>ràn +25902=>niǎo +2590A=>quán +2590B=>zhé +25910=>lèi +25917=>dǎng +25918=>jué +2591C=>líng +2591E=>líng +2591F=>yán +25923=>yǎo +25924=>zhèn +25925=>qī +25926=>ài +25928=>nú +25929=>mǎng +25931=>kǎn +25933=>jiū +25934=>yǎn +25935=>miàn +25937=>yín +25938=>wán +25939=>yào +2593A=>wā +2593B=>pí +2593C=>suì +25945=>kǒng +25948=>hóng +2594A=>mǐng +2594B=>líng +2594C=>yì +2594D=>shēn +2594F=>zuò +2595B=>tū +2595D=>yòng +2595F=>wà +25960=>guǐ +25961=>hòng +25965=>shì +25967=>xiòng +25969=>ā +25971=>chéng +25973=>kēng +25974=>yì +25975=>yàng +25976=>tíng +25977=>dòu +25978=>chá +25979=>liù +2597D=>qiú +2597E=>xuǎn +2597F=>shēn +25980=>kuān +25981=>tòng +25983=>qiǎn +25985=>chòu +2598A=>wěn +2598C=>lòng +2598D=>ǎn +25994=>kǎn +25996=>yǎo +25998=>fú +2599C=>bèng +2599D=>lǎn +2599E=>qià +2599F=>diàn +259A2=>jiào +259A3=>guī +259A5=>xiòng +259A8=>kè +259B6=>xiàn +259B7=>wòng +259C2=>gǒng +259C6=>ǒu +259C7=>kē +259CB=>kū +259D1=>tián +259D2=>gòu +259D3=>mǎ +259D5=>liù +259D9=>wèi +259DA=>wěn +259E1=>gòng +259E3=>tú +259E4=>níng +259E7=>mì +259EB=>láng +259EC=>qiǎn +259ED=>mán +259EE=>zhé +259F0=>huà +259F1=>yōng +259F2=>jìn +259F4=>mèi +259F7=>fú +259FB=>qú +25A0C=>liù +25A0D=>fù +25A0E=>dàn +25A10=>gǒng +25A12=>cuì +25A15=>xǐng +25A1C=>tū +25A1D=>shòu +25A2A=>qióng +25A33=>róng +25A3B=>lì +25A3F=>jī +25A40=>tuò +25A4C=>tóng +25A52=>tán +25A54=>líng +25A56=>yì +25A57=>ruǎn +25A59=>pǎ +25A5D=>cà +25A61=>yuè +25A62=>què +25A63=>zhù +25A64=>hài +25A71=>fá +25A72=>hài +25A80=>bū +25A81=>pīng +25A82=>liè +25A8A=>kuǐ +25A8B=>fú +25A8C=>tiǎn +25A8D=>wò +25A8F=>jū +25A98=>zhēn +25A9A=>fú +25AA2=>lóng +25AA6=>xì +25AA7=>tián +25AAB=>jì +25AAF=>yào +25AB1=>cù +25AB4=>pàng +25AB5=>qiè +25ABB=>lóng +25ABC=>jǐ +25AC2=>tóng +25AC3=>yí +25AC5=>chāng +25ACB=>gōng +25ACE=>dòng +25AD6=>xiāng +25AD9=>tǐng +25ADB=>zhuān +25ADC=>yǐ +25ADD=>yì +25ADE=>zǐ +25ADF=>qǐ +25AE2=>chǎ +25AEC=>dùn +25AEF=>chōng +25AF0=>lù +25AF1=>dùn +25AF3=>fāng +25AF4=>shì +25AF5=>tì +25AF6=>jī +25AF7=>qiū +25AF8=>shuǐ +25AF9=>chén +25AFC=>huàng +25AFD=>shi +25B00=>yún +25B06=>lóng +25B08=>mǎn +25B09=>gōu +25B0D=>xiān +25B0E=>mò +25B10=>shěn +25B12=>pō +25B13=>yào +25B14=>qū +25B15=>rǎn +25B19=>jù +25B1C=>yǐn +25B1D=>bái +25B1E=>niè +25B20=>chōu +25B2A=>róng +25B2B=>chuǎn +25B2C=>niè +25B2D=>lì +25B2E=>jiāng +25B2F=>kǎo +25B30=>cè +25B31=>chòng +25B32=>zhuā +25B33=>zǐ +25B34=>yáng +25B3C=>wěn +25B4B=>jì +25B4C=>jì +25B50=>lǜ +25B51=>qiú +25B52=>dùn +25B53=>báo +25B54=>chān +25B56=>bó +25B58=>chī +25B59=>zhè +25B5A=>màng +25B5C=>jì +25B5D=>miào +25B5E=>yuàn +25B60=>wú +25B61=>zhì +25B62=>pīng +25B65=>chōng +25B6B=>mí +25B6C=>féi +25B6D=>cuō +25B6E=>méng +25B8D=>yín +25B8E=>mǎng +25B8F=>diǎn +25B90=>diāo +25B92=>qián +25B95=>hàng +25B96=>zhí +25B97=>jú +25B98=>niàn +25B9C=>mí +25B9D=>gǔ +25BA3=>zhuā +25BA4=>niè +25BA5=>zhuó +25BA7=>yè +25BA8=>còng +25BAA=>xū +25BAC=>xì +25BAF=>bō +25BBE=>cǎn +25BC3=>yǎn +25BD1=>jǐn +25BD4=>jǔ +25BD5=>dàng +25BD6=>dù +25BD8=>yé +25BD9=>jìng +25BDA=>kè +25BDB=>luò +25BDC=>wěi +25BDD=>tū +25BDE=>yóu +25BDF=>pài +25BE1=>pí +25BE2=>dìng +25BE4=>wěi +25BE5=>chè +25BE6=>jiàn +25BE8=>sī +25BE9=>zhuó +25BEA=>sòu +25BEC=>ruǎn +25BEE=>yú +25BF3=>è +25BF6=>kǔ +25BF8=>zhù +25BFE=>xiá +25C1B=>fú +25C1C=>táo +25C1D=>xī +25C1E=>chōu +25C1F=>gǎn +25C20=>lǘ +25C21=>cè +25C22=>shàn +25C23=>liú +25C25=>xì +25C26=>jī +25C27=>yǐ +25C28=>tán +25C2A=>hú +25C2D=>cuō +25C2E=>gě +25C30=>shì +25C31=>sāo +25C32=>hòng +25C33=>xiàn +25C36=>xiá +25C3B=>mù +25C3C=>suǒ +25C3E=>zhài +25C40=>fū +25C41=>sè +25C42=>nú +25C43=>yì +25C67=>qín +25C68=>qìng +25C75=>huì +25C76=>shuǎng +25C77=>dǎn +25C78=>ōu +25C79=>mò +25C7A=>qiān +25C7B=>chì +25C7C=>pái +25C7D=>juàn +25C80=>cháo +25C81=>liè +25C82=>bīng +25C83=>kòu +25C84=>dàn +25C85=>chóu +25C86=>tōng +25C87=>dàn +25C88=>mǎn +25C89=>hù +25C8A=>liáo +25C8B=>xián +25C8D=>cáo +25C8E=>lù +25C8F=>chuàn +25C90=>wú +25C91=>mán +25C95=>zǐ +25C97=>dù +25C9A=>shuàng +25C9B=>fù +25C9C=>jù +25C9D=>zhòu +25C9F=>diào +25CA0=>wàng +25CA1=>chuāng +25CA2=>qiān +25CA3=>tuì +25CA5=>lián +25CA6=>biāo +25CA7=>lí +25CAA=>lí +25CC6=>bì +25CC7=>fù +25CC8=>cuì +25CC9=>dū +25CCB=>zàn +25CCC=>lóng +25CCD=>xún +25CCE=>qióng +25CCF=>jī +25CD0=>qiǎn +25CD2=>jiǎn +25CD3=>shāo +25CD4=>duò +25CD5=>shū +25CD6=>bù +25CD7=>xū +25CD8=>dǒng +25CDA=>rán +25CDC=>yáng +25CDD=>ruǐ +25CDE=>lìn +25CDF=>jiǎn +25CE0=>dì +25CE1=>fén +25CE2=>diàn +25CE3=>zuì +25CE5=>nǐng +25CEA=>suàn +25CEB=>tiǎn +25CEC=>àn +25CEF=>cè +25CF0=>dìng +25CF1=>shēn +25CF2=>dù +25CF3=>tí +25CF4=>jiǎo +25CF5=>zuì +25CF6=>zhǎng +25CF7=>jiǎn +25CF8=>dàn +25CF9=>dǎn +25CFA=>sǒng +25D10=>zhǎn +25D11=>tíng +25D12=>zhì +25D15=>yóu +25D16=>pái +25D21=>lǐ +25D24=>qián +25D26=>suì +25D27=>jǔ +25D28=>ài +25D29=>gé +25D2A=>jù +25D2B=>tún +25D2C=>bì +25D2D=>qià +25D2E=>bó +25D2F=>huì +25D31=>jiàn +25D34=>gōu +25D35=>suàn +25D3A=>cí +25D3B=>qiàng +25D3F=>yán +25D4F=>diàn +25D52=>miè +25D5C=>pò +25D5D=>lǐng +25D5E=>jié +25D5F=>zhù +25D60=>gǔ +25D63=>duān +25D64=>zhào +25D66=>shǎo +25D67=>qǐn +25D68=>mí +25D6A=>píng +25D6B=>cóng +25D6C=>chōu +25D6F=>sà +25D76=>tiǎn +25D85=>liú +25D86=>lǘ +25D87=>lǔ +25D88=>zōu +25D8C=>lǜ +25D8D=>huǎn +25D8F=>tiáo +25D90=>tuí +25D91=>qiǎng +25D92=>lìn +25D93=>bēi +25D94=>páo +25D95=>zhān +25D97=>lì +25D9B=>tí +25D9C=>hú +25DA2=>liè +25DB5=>huǐ +25DB6=>qū +25DB7=>xuǎn +25DB9=>jìng +25DBA=>dié +25DBB=>suí +25DBD=>wèi +25DBF=>yán +25DC0=>yān +25DC1=>bàn +25DC3=>jiǎng +25DC4=>nǐ +25DC5=>lì +25DC6=>hú +25DC7=>qì +25DC8=>zhōng +25DD1=>bì +25DD4=>yú +25DD5=>dié +25DD6=>lìn +25DD7=>lì +25DD8=>zhuó +25DD9=>jì +25DDA=>jū +25DDC=>fēng +25DDE=>yù +25DE8=>liè +25DE9=>zá +25DEA=>qián +25DEB=>jiē +25DEC=>guān +25DEE=>zhuó +25DF1=>fù +25DF9=>sè +25DFC=>cù +25E03=>huǐ +25E08=>dàng +25E09=>lóng +25E0A=>yì +25E17=>sǎ +25E18=>yuè +25E1A=>dí +25E21=>gǎn +25E22=>zān +25E23=>shàn +25E24=>yù +25E25=>bǒ +25E27=>dìng +25E28=>fán +25E2A=>yù +25E2C=>shēn +25E32=>gōng +25E34=>miè +25E35=>tún +25E38=>liè +25E41=>zhā +25E42=>pēi +25E44=>mí +25E46=>míng +25E47=>fàn +25E49=>nà +25E4A=>sì +25E4B=>yí +25E4C=>jiā +25E4D=>zhù +25E53=>bān +25E54=>yù +25E56=>pǒ +25E5A=>huān +25E5B=>càn +25E5C=>jiāo +25E60=>tán +25E69=>zhì +25E6B=>mǐ +25E6C=>kǎo +25E71=>yāo +25E72=>duì +25E73=>quǎn +25E74=>bù +25E75=>chù +25E76=>qiǎo +25E77=>liú +25E78=>bó +25E7A=>kāng +25E7B=>fèn +25E85=>dào +25E89=>dòu +25E8A=>gé +25E99=>líng +25E9A=>xí +25E9C=>nì +25E9D=>zhōu +25E9E=>zhōu +25EA3=>chōu +25EB4=>niān +25EB5=>jī +25EB7=>qū +25EC4=>kāi +25EC7=>xiàn +25EC9=>hé +25ECB=>lín +25ECD=>zī +25ED1=>ǒu +25ED2=>cù +25ED7=>chá +25EDD=>zhòng +25EDE=>bú +25EE4=>chōu +25EE5=>xì +25EE6=>sà +25EE7=>xián +25EE8=>sè +25EE9=>miàn +25EEB=>fán +25EEC=>zhī +25EEE=>cuì +25EF4=>xià +25EFE=>nuò +25EFF=>lí +25F00=>zú +25F02=>cuī +25F03=>zé +25F05=>lí +25F18=>qí +25F1A=>zhuō +25F1B=>cuì +25F1C=>pū +25F1E=>fán +25F1F=>tán +25F29=>zī +25F2A=>zǔ +25F2B=>zhōu +25F2C=>róng +25F2D=>lín +25F2E=>tán +25F36=>shì +25F3A=>cuǐ +25F3B=>zī +25F3C=>fū +25F41=>xiào +25F48=>fēng +25F4F=>xiàn +25F50=>jiàn +25F52=>fèn +25F57=>lì +25F58=>mò +25F5F=>yōu +25F65=>huò +25F67=>qū +25F6C=>niàng +25F70=>mí +25F73=>qì +25F76=>hé +25F78=>liàn +25F7F=>zuò +25F82=>líng +25F85=>zhú +25F87=>niǎo +25F8A=>jǐ +25F8B=>réng +25F8C=>jié +25F8D=>gǎn +25F90=>yì +25F93=>zhóu +25F95=>wù +25F9A=>gěng +25F9B=>cù +25F9D=>miè +25FA1=>xún +25FA3=>zhī +25FA4=>xiáo +25FA7=>fú +25FA8=>hú +25FAC=>dī +25FAE=>jué +25FAF=>diào +25FB9=>shǒu +25FBC=>wǎng +25FC3=>nà +25FC4=>dī +25FC5=>shì +25FC6=>cí +25FC7=>shū +25FC9=>wà +25FCA=>chè +25FCB=>fán +25FCD=>gū +25FCE=>yuān +25FD1=>guān +25FDA=>qiè +25FDC=>zhǎn +25FDD=>dài +25FDE=>shē +25FE6=>zhōu +25FE7=>xiǎng +25FE8=>míng +25FE9=>zì +25FEA=>huāng +25FEB=>mí +25FED=>xì +25FEE=>zhì +25FEF=>pài +25FF0=>duǒ +25FF4=>cì +25FF5=>móu +25FF7=>chào +25FF9=>yì +25FFA=>gōu +26007=>jīng +26013=>zēng +26014=>pīng +26015=>yè +26016=>jié +26018=>pī +2601B=>shā +2601C=>zhuàng +2601D=>jiǒng +26020=>liú +26021=>yǔ +26023=>jū +26028=>nuò +26038=>mào +26044=>chēn +26046=>zhuàn +26047=>niàn +26048=>kòng +26049=>jiē +2604A=>huà +2604D=>xīn +2604E=>zuó +2604F=>yàn +26050=>jué +26055=>hū +26056=>zhòu +26057=>shè +26059=>yǎn +2605B=>xiè +2605C=>dié +2605F=>chēn +26072=>jiǎn +26073=>jì +26076=>chuò +26077=>hóng +26080=>dá +26084=>kāi +26085=>xīng +26086=>huì +26087=>jiǎn +26088=>zhòu +26089=>zhǎ +2608A=>fù +2608B=>chì +2608C=>běng +2608D=>nuò +26091=>jì +26092=>qián +26094=>wàn +26095=>óu +26096=>bì +26097=>shuò +260A0=>jīng +260A1=>yè +260C4=>fěi +260C7=>lí +260CA=>lì +260CB=>pí +260D2=>suì +260D3=>liú +260D4=>hé +260D5=>hǔn +260D6=>tǎn +260D7=>shuò +260D8=>zhì +260D9=>bó +260DD=>xì +260E1=>pó +260E2=>qǔn +260E4=>mù +260FD=>yōng +26102=>dài +2610A=>qǐ +2610B=>diǎo +2610C=>niè +2610D=>shuǎng +2610F=>shāo +26110=>kǔn +26111=>suì +26113=>dōu +26114=>dié +2611C=>gōng +2612F=>zhuǎn +26130=>guó +2613C=>xū +2613D=>qú +26140=>xún +26143=>jiāo +26144=>zhé +26146=>diàn +26147=>sāng +26148=>bēng +2614A=>suǒ +2614B=>qiǎn +2614F=>xū +26151=>xún +26154=>mò +26175=>suì +26176=>là +26177=>zhǔ +26178=>zhòu +2617A=>lì +2617C=>dān +2617D=>jú +2617F=>yùn +26180=>chǎn +26181=>luó +26184=>sè +26186=>lián +26188=>zuǎn +2618B=>lài +2618C=>shuǎng +2618D=>qiè +26198=>dōu +2619E=>wù +2619F=>méng +261A1=>jì +261A4=>chī +261A6=>nǐ +261B8=>yáo +261BB=>là +261BE=>lǜ +261C0=>suì +261C1=>fū +261C4=>lěi +261C5=>wěi +261CE=>cōng +261D4=>lì +261D6=>pín +261D8=>jūn +261D9=>jǔ +261DB=>là +261E7=>jì +261EA=>miè +261EC=>yào +261ED=>biān +261F1=>cóng +261F2=>sī +261F5=>sī +261F8=>hé +26203=>nàng +26205=>dié +26208=>chè +26209=>yùn +2620B=>xiǔ +2620C=>shū +2620E=>chǎn +2620F=>mín +26210=>lián +26211=>yīn +26212=>xīng +26213=>wēi +26214=>gǔ +26215=>tóu +26216=>tā +26217=>fěi +26218=>dā +26219=>niè +2621A=>cù +2621B=>zuǒ +2621C=>jié +2621D=>xuàn +2621E=>bó +2621F=>jīn +26220=>yǐn +26221=>xū +26223=>yú +26224=>xiòng +26226=>qì +26227=>bēi +26228=>xíng +26229=>gǒng +2622C=>zuǐ +26230=>jiē +26232=>kāi +26235=>xíng +26236=>bēi +26237=>shū +26238=>yù +2623A=>zhǒu +2623B=>zhǎn +26242=>zhōng +26246=>chá +26248=>chuí +26249=>liù +2624E=>suī +26250=>zhǔ +26259=>biàn +2625D=>xìn +2625F=>yà +26262=>líng +26267=>yà +2626C=>tīng +26279=>dí +26281=>pí +26282=>hù +26283=>cén +2628A=>tiān +2628B=>mǒu +2628C=>juǎn +2628E=>mǒu +26290=>jù +26291=>liǔ +26293=>lǐng +26297=>liǔ +26298=>hù +262A6=>fú +262A7=>hú +262AA=>è +262AB=>gōng +262AC=>gū +262B1=>guà +262B9=>lüè +262BB=>fán +262BC=>lǜ +262BD=>méng +262BE=>fú +262BF=>liú +262C5=>xié +262C6=>gū +262C8=>xiàn +262C9=>bó +262CB=>jì +262D3=>quān +262D4=>lù +262DE=>shuò +262E1=>mǒu +262E2=>yù +262E3=>hàn +262E9=>yuè +262EA=>dàn +262EF=>yú +262F0=>jiān +262F3=>gāng +262FF=>cáo +26300=>shèn +26301=>liǔ +26306=>jiāo +26309=>sù +2630A=>sù +2630B=>zhòng +26312=>liào +26314=>xuǎn +26315=>lù +26317=>jì +2631A=>yán +2631F=>lù +26321=>mǐn +26322=>tí +26326=>huàn +26329=>yì +2632A=>tǎn +2632C=>wǔ +26330=>jī +26337=>dú +26338=>kūn +2633A=>jūn +2633F=>shī +26340=>nàn +26341=>pò +26344=>shū +26345=>quàn +2634C=>rèn +2634F=>fén +26352=>tà +26353=>tún +26355=>yáng +26366=>duō +26367=>cī +26369=>gǔ +2636A=>fén +2636D=>róu +26371=>gāo +26372=>xiáng +26374=>xiáng +26375=>hǒu +26377=>tāo +26378=>shàn +26379=>yáng +2637A=>zì +2637C=>yuán +26384=>sú +26387=>chuàn +26388=>xiáng +2638A=>bān +2638C=>mǎn +2638E=>fǔ +2638F=>lǎ +26390=>lǐ +26392=>jié +26393=>yōu +26398=>yù +2639A=>chì +2639C=>chuàn +2639D=>yì +2639E=>shān +263A2=>jí +263A3=>yān +263A6=>wù +263A7=>chún +263A8=>máng +263AD=>fú +263AE=>jiā +263AF=>gòu +263B0=>gú +263B1=>jiá +263B5=>xián +263B7=>jìn +263B8=>zì +263B9=>lóu +263BC=>gòu +263C0=>rén +263C2=>shān +263C5=>jué +263C6=>tóng +263C7=>yǒu +263D4=>jiān +263D5=>dú +263D7=>hú +263DB=>sāo +263DC=>yù +263E2=>mài +263E4=>zhī +263E5=>yān +263E6=>gāo +263E8=>huài +263EE=>quán +263F1=>yǎng +263F3=>zuǐ +263F7=>xiāo +263F8=>yì +263F9=>yǎn +263FA=>hóng +263FB=>yú +263FF=>chì +26401=>chí +26404=>háng +26405=>sè +26406=>pā +26407=>tà +26408=>fēn +26409=>chī +2640C=>hóng +2640D=>xuè +26416=>zhǐ +2641B=>qú +26420=>xī +26421=>fú +26423=>shū +26424=>hài +26426=>pò +26428=>cǐ +26430=>chài +26433=>hōng +26438=>pǎo +26439=>shēn +2643A=>xiāo +2643D=>xuān +2643E=>cǐ +2643F=>tíng +26440=>pò +26447=>tà +26448=>chā +2644B=>zú +2644C=>huò +2644D=>xù +2644E=>yàn +2644F=>chài +26451=>tuó +26458=>xián +26459=>xuān +2645A=>hóu +2645B=>huǎn +2645C=>gé +2645D=>chǒng +2645E=>bì +2645F=>hōng +26460=>hōng +26461=>chí +26463=>chá +2646F=>zhǎ +26471=>zhái +26472=>tà +26475=>pò +26476=>tà +26478=>yóu +26479=>fú +2647A=>cī +2647B=>dá +2647C=>tǎ +2647E=>liú +26481=>cī +26483=>hōng +26485=>hàn +26486=>lā +26488=>shī +2648D=>tóng +2648E=>huì +2648F=>hé +26490=>piē +26491=>yù +2649C=>xiān +2649D=>hǎn +2649F=>pò +264A6=>là +264A7=>huò +264B0=>tài +264B4=>lǎo +264B6=>shù +264BA=>dào +264BB=>diǎn +264C8=>xiòng +264CB=>wàng +264CD=>chě +264CE=>nài +264D0=>jué +264D3=>ér +264D4=>ér +264D5=>nǘ +264D6=>nǜ +264DD=>zhuǎn +264E2=>nuò +264E4=>liè +264E5=>lěi +264E7=>bā +264EC=>chēng +264EF=>guī +264F0=>quán +264F1=>gè +264F3=>gǒng +264F4=>shào +264F9=>lái +264FA=>zhēng +264FB=>yì +264FC=>gǔn +264FD=>wēi +264FE=>lǔn +26502=>shí +26503=>yīng +26504=>shěng +26505=>tú +26506=>bì +26508=>zé +26509=>zhòng +2650B=>rǒng +2650C=>qí +2650D=>fù +2650E=>cè +26513=>lí +26514=>mán +26516=>lián +26517=>biāo +2651B=>chuáng +2651C=>yì +26520=>pài +26525=>yì +26526=>kuài +26529=>biāo +2652B=>chì +2652C=>qú +2652D=>mò +2652E=>zhé +2652F=>shà +26530=>shà +26537=>yāo +26538=>gōng +26539=>nài +2653C=>xiè +2653F=>tiàn +26546=>yé +26549=>shā +2654F=>sào +26552=>diān +26553=>xù +26559=>qú +26560=>hōng +26561=>shèng +26562=>tìng +26570=>duo +26575=>liáo +26577=>hòng +26578=>lǐ +2657A=>xiǎng +2657D=>shèn +26580=>fū +26588=>yǎn +26589=>wǎng +2658A=>qī +2658B=>duǒ +2658D=>huà +2658E=>qiān +26590=>xiè +2659D=>cì +2659E=>shēng +265A2=>èr +265A4=>xīng +265A6=>tuì +265A7=>yàn +265A9=>liè +265AC=>mí +265B8=>zòng +265BA=>zī +265BC=>hú +265BD=>yíng +265BE=>lián +265BF=>dā +265C0=>tián +265C1=>tiàn +265CB=>róng +265CD=>ài +265D0=>ài +265D1=>zhé +265D2=>guō +265D3=>lù +265D4=>zhāo +265D5=>mí +265D6=>liáo +265D7=>zhé +265DB=>qǔ +265DC=>cōng +265DF=>tīng +265E1=>tán +265E2=>zhǎn +265E3=>hú +265E5=>piē +265E7=>dā +265E8=>róng +265EE=>nǎo +265F3=>náng +265F4=>dāng +265F5=>jiǎo +265FB=>jù +265FC=>ěr +2660A=>lì +2660C=>guō +2660D=>wài +26612=>niè +26614=>jīn +26629=>pǐ +2662A=>chì +26632=>pǐ +26633=>yì +26634=>dū +26635=>wǎ +26636=>xūn +26638=>qì +26639=>shàn +2663C=>xū +2663F=>hē +26640=>pàn +26642=>pēi +26644=>xiōng +26646=>chǐ +26647=>tān +26648=>zuì +26649=>zuǎn +2664A=>qì +2664B=>dū +26659=>shuǐ +2665C=>nǎ +2665D=>xī +26667=>chǎo +26668=>yì +2666B=>zhēng +2666E=>jú +2666F=>dài +26671=>sān +26674=>zhù +26675=>wàn +26678=>sān +26679=>bàn +2667A=>jià +2667B=>mài +26688=>tuò +2668A=>qì +2668F=>zhuāng +26690=>tuó +26693=>píng +2669D=>pēng +2669E=>kuāng +2669F=>yí +266A1=>xiè +266A2=>yuē +266A3=>hén +266A5=>hóu +266A6=>zhēng +266A7=>chǔn +266A8=>shì +266A9=>wǎ +266AB=>xié +266B8=>gèng +266C5=>è +266CF=>kú +266D0=>nà +266D3=>jū +266D4=>xuàn +266D5=>qū +266D6=>chè +266D7=>lǚ +266D8=>hé +266D9=>shèng +266DA=>nàn +266DC=>hé +266DD=>chá +266DE=>yān +266DF=>gěng +266E0=>niè +266E2=>guó +266E3=>yán +266E4=>guǎn +266E7=>zhì +266E8=>lao +266EF=>dǔ +266F0=>qì +266F1=>qū +266F2=>jué +26701=>fēng +26703=>xù +26704=>tuì +26706=>hán +26707=>kū +2670A=>shēn +2670B=>zhì +2670D=>pàng +2670E=>zhēng +2670F=>lì +26710=>wǎn +26712=>fǎn +26713=>xìn +26716=>yà +2671B=>jū +2671C=>shèn +2672D=>mǎng +2672F=>tǔn +26730=>zhuó +26731=>xī +26732=>yìn +26733=>jīng +26734=>tún +26737=>gèng +26738=>jì +2674F=>zhuǎn +26752=>tiē +26754=>zhī +26756=>jí +2675A=>yíng +2675B=>wèi +2675D=>huàn +2675E=>tíng +2675F=>chán +26762=>kuí +26763=>qià +26764=>bàn +26765=>chā +26766=>tuǒ +26767=>nǎn +26768=>jiē +2676A=>yān +2676C=>tú +2676E=>wěn +26770=>cōng +26773=>xù +26774=>yìn +26777=>bèng +2677C=>lǘ +26781=>zāi +26782=>dā +26786=>niè +26787=>jǔ +26788=>hóu +2678C=>gèng +26795=>hóu +26796=>kān +26797=>gōng +26799=>huǐ +2679A=>xiè +2679D=>xì +2679E=>hán +2679F=>mí +267A1=>wěng +267A2=>hùn +267A3=>sāo +267A4=>xìn +267A5=>zhé +267A6=>huò +267A8=>gōng +267AB=>sài +267AC=>jīn +267AD=>wā +267B1=>duǐ +267B2=>chī +267BD=>xī +267C2=>mí +267C3=>zāng +267C4=>sǎng +267D3=>tún +267D4=>zhì +267D5=>wěn +267D8=>yín +267D9=>tǔn +267DB=>chōng +267DC=>zé +267DE=>xiāo +267DF=>mó +267E0=>cù +267E3=>biǎn +267E4=>xiū +267E7=>yí +267EE=>huǎng +267F0=>zhā +267F1=>suō +267F2=>hún +267F3=>jù +26801=>cù +26804=>jī +26805=>xún +26806=>sǔn +26807=>céng +26809=>yì +2680E=>biāo +26812=>jué +26813=>lì +26816=>pào +2681B=>zā +2681C=>yè +2681E=>bì +2681F=>zhè +26820=>zhè +26822=>jiù +26823=>zhé +26826=>shù +2682A=>xī +26837=>xǔ +26838=>nǎi +26839=>xián +2683A=>gǔn +2683B=>wèi +2683E=>jí +2683F=>sà +26842=>dǒng +26843=>nuó +26844=>dù +26845=>zhēng +26846=>kū +26849=>míng +26855=>báo +26856=>huì +26859=>zōng +26868=>sàn +2686A=>tēng +2686B=>yí +2686D=>yù +26871=>yào +26872=>nǐng +26874=>chóu +26875=>hùn +26877=>duì +26879=>qì +2687A=>yǐng +2687B=>bìng +2687C=>níng +2687D=>huáng +26886=>yǐng +2688A=>báo +2688E=>guàng +2688F=>lěi +26890=>zǔn +26899=>chǎn +268A3=>jiǎn +268A7=>méng +268A9=>xiào +268AF=>xìn +268B1=>lí +268BA=>qiǎo +268BF=>wěi +268C0=>nà +268C2=>pāng +268C4=>léi +268C7=>luó +268CB=>luán +268CD=>gēng +268CF=>luán +268D2=>qú +268D6=>luó +268D8=>náng +268DB=>luó +268DC=>yuè +268E2=>shuì +268E5=>mì +268E6=>wáng +268E7=>cè +268E8=>jiān +268E9=>wǎng +268EF=>jiā +268F4=>huán +268F8=>liàn +268F9=>zì +268FA=>bái +268FB=>shǒu +268FE=>wǎn +26902=>shū +26907=>guī +26908=>xī +2690A=>rú +2690B=>yào +2690E=>gāo +26915=>yuè +26918=>yōng +26919=>wà +2691A=>bó +2691F=>xìn +26922=>pì +26923=>bó +26926=>hài +26927=>zhài +26928=>wò +2692A=>yè +2692B=>bì +2692C=>hài +26938=>chì +2693B=>zhì +2693D=>ní +26941=>wú +26942=>ǎi +26948=>ǎi +26949=>yǔ +2694A=>chì +2694D=>jìng +2694E=>zhì +2694F=>zhì +26950=>zhì +26951=>jú +26956=>hán +2695A=>pīng +2695D=>yǎo +26963=>yóu +26964=>pīng +26966=>mò +2696C=>zuò +2696D=>pò +2696F=>xué +26970=>kuáng +26971=>yì +26972=>pò +2697B=>zhuì +26983=>ní +26984=>qiǔ +26985=>còu +2698C=>yǎo +26991=>fén +26995=>xiá +26997=>jiāng +26998=>chā +2699B=>xiào +2699C=>chā +269A2=>chéng +269A3=>cuì +269A7=>qióng +269A9=>yù +269AB=>yú +269AF=>wèn +269B1=>chā +269B2=>yǔ +269B9=>zuó +269BA=>dǎo +269BD=>juàn +269BE=>dǎo +269BF=>yīng +269C1=>fěng +269C5=>wèng +269C8=>jìn +269C9=>qì +269CB=>qìn +269CD=>kuò +269CF=>tān +269D0=>xiān +269D2=>tiān +269D4=>kuò +269D6=>tiàn +269D8=>hú +269D9=>zhū +269DA=>zhān +269DB=>tà +269DD=>tiān +269DE=>tà +269DF=>tà +269E0=>huá +269E1=>yǎn +269E2=>tiè +269E4=>tiè +269E5=>tà +269EC=>huài +269EE=>jiá +269EF=>qì +269F1=>tà +269F4=>tān +269F5=>huà +269F8=>zhuàn +269F9=>huā +269FC=>lán +26A06=>zūn +26A07=>yì +26A08=>fú +26A09=>wù +26A0B=>fú +26A0D=>dīng +26A0E=>tà +26A16=>chào +26A19=>rì +26A1A=>quǎn +26A1C=>gē +26A21=>fú +26A22=>dì +26A23=>diāo +26A24=>yǒng +26A26=>jià +26A29=>lóng +26A2C=>yǒng +26A2D=>pí +26A2F=>huó +26A30=>qióng +26A32=>fán +26A33=>wú +26A34=>tóng +26A35=>háng +26A38=>tān +26A3E=>hēng +26A44=>tiāo +26A48=>zhōu +26A4B=>bài +26A4C=>xiè +26A4D=>dāo +26A4F=>jīn +26A55=>hū +26A56=>bēi +26A58=>dìng +26A5C=>nuó +26A5D=>wèi +26A5E=>yú +26A60=>xīng +26A61=>fú +26A62=>xiàn +26A63=>qì +26A64=>tū +26A67=>jí +26A69=>yìng +26A6B=>dèng +26A6C=>wēi +26A6D=>xī +26A6F=>pái +26A71=>shéng +26A72=>yǒu +26A74=>ái +26A75=>jiàn +26A77=>gōu +26A78=>ruò +26A7C=>gòng +26A7F=>shà +26A80=>táng +26A87=>lù +26A88=>áo +26A8A=>qì +26A8B=>xiū +26A8D=>dāi +26A91=>fá +26A92=>wèi +26A94=>dùn +26A95=>liáo +26A96=>fān +26A97=>huáng +26A98=>jué +26A99=>tà +26A9A=>zùn +26A9B=>ráo +26A9C=>cān +26A9D=>téng +26AA0=>huà +26AA1=>xū +26AA3=>zhān +26AA7=>gǎn +26AAA=>péng +26AAB=>cān +26AAC=>xiē +26AAD=>dá +26AB1=>jì +26AB6=>lǐ +26AB9=>pán +26ABD=>lóng +26ABE=>lì +26ABF=>xí +26AC0=>téng +26AC3=>líng +26AC8=>lǐ +26AC9=>rán +26ACA=>líng +26ACE=>gǔn +26AD4=>pō +26AD5=>mò +26AD6=>pāi +26AD9=>bà +26AE1=>qí +26AE4=>yán +26AEA=>wà +26AEB=>ǎng +26AED=>mìng +26AEE=>mǐn +26AEF=>xùn +26AF0=>méng +26AF3=>guǎi +26AF6=>jiāo +26AFB=>gǎi +26B01=>cái +26B02=>wù +26B03=>zhé +26B04=>rěn +26B05=>kōu +26B14=>zhǎo +26B15=>zhōng +26B16=>qiú +26B17=>guō +26B18=>gōng +26B19=>pū +26B1A=>hù +26B1B=>miǎn +26B1E=>tiān +26B23=>wǎng +26B38=>zhú +26B39=>dá +26B3A=>xiòng +26B3B=>ná +26B3E=>juān +26B41=>niǎn +26B48=>hù +26B49=>shā +26B5C=>zhī +26B5F=>tā +26B61=>sī +26B65=>yì +26B6D=>qióng +26B6E=>zhì +26B6F=>lǚ +26B70=>rú +26B72=>qí +26B73=>yǔ +26B74=>zhōu +26B75=>yáng +26B76=>xiǎn +26B77=>móu +26B78=>chóu +26B79=>huī +26B7A=>jiū +26B7B=>jiù +26B7C=>piǎo +26B81=>jiào +26B83=>guāi +26B85=>mò +26B90=>xī +26B91=>pú +26BAF=>jì +26BB6=>wěn +26BB7=>bèi +26BB8=>yǐ +26BB9=>fú +26BBA=>sī +26BBB=>juān +26BBC=>jì +26BBE=>nì +26BC0=>bèn +26BC5=>xù +26BC8=>qǐn +26BC9=>bó +26BCC=>wáng +26BCD=>zhè +26BCF=>wò +26BD0=>sháo +26BD1=>zào +26BD2=>yǎng +26BD5=>sòng +26BD6=>niè +26BDB=>bì +26BE3=>cú +26BE4=>qiāng +26BEA=>xiào +26BEB=>zhī +26BEC=>shé +26BEF=>zhì +26BF0=>pēng +26C0F=>diào +26C16=>wò +26C18=>zhǐ +26C19=>bì +26C1B=>fén +26C25=>bāng +26C2A=>qiú +26C2B=>nǐ +26C2C=>bó +26C2D=>dùn +26C2F=>shǐ +26C30=>xū +26C31=>cháng +26C32=>xū +26C33=>yé +26C34=>mí +26C38=>xīn +26C39=>zhuó +26C3A=>fù +26C3D=>pǐ +26C3E=>xuè +26C40=>yù +26C41=>xián +26C42=>yù +26C43=>yú +26C45=>jū +26C46=>tā +26C47=>kōng +26C4A=>zhēng +26C4B=>méng +26C4C=>gāng +26C52=>mù +26C53=>xǐ +26C54=>bì +26C56=>fù +26C5C=>xiào +26C60=>jiū +26C63=>gǒu +26C70=>chí +26C71=>jiū +26C72=>jiū +26C75=>shā +26C77=>fēi +26CAB=>fú +26CAF=>wàn +26CB0=>xū +26CB1=>bō +26CC1=>hào +26CC3=>xié +26CC4=>pián +26CC5=>yǔ +26CC7=>tián +26CC8=>pí +26CCA=>shǐ +26CCB=>kuǎi +26CCC=>jī +26CCF=>zhā +26CD0=>nài +26CD1=>mǒu +26CD3=>fú +26CD4=>dù +26CD7=>shěng +26CD8=>chá +26CDA=>chí +26CDB=>guǐ +26CDC=>mín +26CDD=>tāng +26CDE=>bài +26CDF=>qiāng +26CE1=>zhuó +26CE2=>wèi +26CE3=>xún +26CE5=>miǎo +26CE6=>zāi +26CE7=>yóu +26CE9=>yòu +26CEB=>shān +26CEC=>hé +26CED=>lǚ +26CEE=>zhí +26CF2=>jìng +26CF3=>zhēn +26CF6=>méng +26CF7=>yóu +26CF9=>wò +26CFA=>bá +26CFD=>juàn +26CFE=>rú +26CFF=>còu +26D00=>zhī +26D09=>hú +26D0A=>yāng +26D0C=>jùn +26D0D=>shé +26D0E=>kòu +26D11=>qián +26D14=>méng +26D1A=>tiáo +26D50=>niè +26D5F=>chí +26D61=>xiōng +26D63=>hùn +26D66=>dí +26D67=>láng +26D69=>zāo +26D6A=>cè +26D6B=>suǒ +26D6C=>zù +26D6D=>suī +26D6F=>xiá +26D71=>xiè +26D74=>jié +26D75=>yóu +26D77=>gòu +26D78=>gěng +26D7C=>jùn +26D7D=>huǎng +26D7E=>jí +26D7F=>pōu +26D80=>wū +26D82=>yì +26D85=>nǎi +26D87=>rǒng +26D88=>nán +26D8A=>píng +26D8B=>shàn +26D8C=>diāo +26D8D=>jí +26D8E=>huā +26D8F=>duì +26D90=>kǒng +26D91=>tà +26D93=>hòng +26D95=>shū +26D99=>héng +26D9A=>fěn +26DB2=>kòu +26DD9=>nián +26DDD=>chú +26DE6=>qiàng +26DF2=>xì +26DF3=>hú +26DF4=>sòng +26DF5=>wò +26DF7=>hài +26DF8=>rú +26DF9=>méng +26DFB=>sǎn +26DFD=>wú +26DFF=>yóu +26E01=>tān +26E02=>shēn +26E06=>qǐ +26E08=>guó +26E09=>qià +26E0A=>xiān +26E0F=>suī +26E10=>lù +26E13=>qī +26E14=>diāo +26E17=>qí +26E18=>jiá +26E19=>yóu +26E1A=>xí +26E1B=>cháo +26E21=>mì +26E22=>lòu +26E23=>bǐ +26E2A=>péi +26E2E=>zhēn +26E2F=>shēn +26E30=>chǎn +26E31=>fù +26E36=>qū +26E37=>sī +26E3A=>zuī +26E6B=>zhào +26E7D=>pí +26E80=>còu +26E86=>gāo +26E87=>dú +26E89=>fū +26E8A=>guān +26E8B=>sǎo +26E8C=>sǒu +26E8D=>jiǎn +26E8E=>póu +26E90=>cán +26E91=>bèng +26E92=>mòu +26E93=>zhāo +26E94=>xiáo +26E96=>jú +26E97=>shū +26E98=>jiǎn +26E99=>lí +26E9B=>chuàn +26E9C=>lào +26E9E=>hè +26E9F=>hú +26EA0=>gū +26EA1=>zhǎng +26EA2=>jié +26EA3=>xiàng +26EA5=>dū +26EA6=>hán +26EA7=>jiá +26EA8=>xiàng +26EA9=>jí +26EAA=>shǔ +26EAB=>làng +26EAC=>jī +26EAD=>shān +26EB0=>tāo +26EB1=>zī +26EB2=>shuàn +26EB4=>jí +26EB5=>chù +26EB6=>jì +26EB7=>shēn +26EB8=>lìn +26EB9=>liáo +26EBB=>sǎn +26EBD=>ǎn +26EBE=>ruǎn +26EC0=>tí +26EC1=>dàn +26EC3=>huán +26EC5=>sà +26F06=>ruí +26F07=>wū +26F08=>jù +26F09=>huán +26F0A=>léng +26F0B=>lù +26F0E=>tān +26F0F=>zēng +26F13=>qián +26F17=>xī +26F21=>cǐ +26F22=>shé +26F27=>sà +26F2A=>mào +26F2B=>qú +26F2D=>bó +26F2E=>gǎn +26F30=>qiè +26F31=>juàn +26F32=>dāng +26F33=>cháng +26F34=>yáng +26F35=>hé +26F37=>jī +26F39=>bǐng +26F3B=>méi +26F3F=>dūn +26F40=>ǎo +26F41=>jīng +26F42=>lù +26F43=>miàn +26F44=>diàn +26F45=>hè +26F47=>jiān +26F4A=>huá +26F4B=>gōu +26F4E=>lù +26F4F=>fú +26F50=>huǐ +26F52=>zéi +26F54=>jìn +26F55=>sī +26F56=>qūn +26F5C=>dàn +26F5E=>wàn +26F5F=>biǎn +26F64=>jiá +26F6B=>dǎn +26F6C=>jiū +26F6D=>xián +26F6E=>bó +26F8F=>xiá +26F91=>biāo +26F95=>pò +26F98=>sǎo +26F99=>bèi +26F9A=>shà +26F9B=>wěi +26F9D=>cāng +26F9E=>lù +26FA9=>dàn +26FAB=>gǔ +26FAC=>zā +26FAD=>bǎng +26FAE=>gàn +26FB1=>chāo +26FB2=>jì +26FB3=>liē +26FB5=>qióng +26FB6=>jiàn +26FB7=>lù +26FB8=>duān +26FB9=>suān +26FBA=>yáo +26FBB=>yǐn +26FBD=>tà +26FBE=>yáo +26FBF=>jīng +26FC0=>chú +26FC1=>fú +26FC2=>yuán +26FC3=>shǎo +26FC5=>bìng +26FC6=>dàng +26FC7=>shì +26FCA=>lú +26FCB=>qiè +26FCC=>luó +26FCD=>pò +26FCF=>méng +26FD0=>jié +26FD3=>jī +26FD6=>lù +27004=>chàng +27005=>miè +27006=>méng +27007=>jiǎn +2700A=>cǎi +2700C=>sù +27014=>hè +27015=>sà +27017=>zī +27018=>kēng +27019=>gěng +2701A=>sī +27020=>tí +27021=>zhàn +27022=>xiè +27023=>shuí +27024=>chǐ +27025=>yōu +27026=>lǔ +27027=>mèng +27028=>liè +27029=>sì +2702C=>xī +2702D=>fán +2702E=>fū +2702F=>shěn +27030=>tí +27031=>chài +27032=>yuè +27034=>fū +27035=>jiàn +27036=>dì +2703A=>xié +2703B=>dān +2703F=>zhí +27043=>xù +27048=>niè +27049=>fàn +2704A=>méng +2704B=>mǐn +2707E=>lóu +2707F=>dú +27081=>zhàn +27082=>jiàn +27083=>hàn +27084=>dàn +27085=>sēn +27086=>jiàn +27087=>tán +27088=>jiǎo +27089=>pó +2708B=>píng +2708D=>zhuàn +2708F=>liáo +27090=>zì +27092=>zhuó +27094=>hù +27099=>xì +2709B=>méng +2709C=>jù +2709D=>miè +2709E=>xián +270A0=>kuì +270A1=>méng +270A2=>jiān +270A6=>nóu +270A8=>dì +270A9=>sāo +270CF=>chù +270D0=>zhí +270D1=>qián +270D2=>lǚ +270D4=>zhuó +270D8=>zuò +270D9=>hán +270DA=>suǐ +270DB=>gòu +270DD=>chǒu +270DE=>jì +270DF=>yì +270E0=>yú +270E8=>nóu +270E9=>nǐ +270EA=>ruò +270EE=>lín +270F1=>níng +2710D=>qiáo +2710E=>yáo +2710F=>fù +27110=>shuāng +27111=>kuì +27112=>qú +27113=>dǒng +27114=>shǔ +2711A=>lí +2711B=>jú +2711C=>ruǐ +27120=>zhá +27124=>xiāo +27138=>mén +27139=>shí +2713A=>diān +2713B=>lì +2713C=>dèng +2713D=>zàn +2713F=>luó +27140=>cán +27143=>āo +27146=>jiǎn +27148=>diào +2714B=>yíng +27156=>yì +27157=>dǎng +27158=>nóu +2715A=>yuè +2716E=>lǐ +2716F=>lí +27170=>hù +27172=>yòu +2717A=>nàng +27182=>chèn +27189=>fēng +2718A=>biē +2718F=>mǎn +27190=>gàn +27191=>huò +27193=>cū +27195=>yǒu +27198=>yòu +2719C=>xū +271A1=>xù +271A2=>hǔ +271A3=>lú +271A5=>xiá +271A6=>yì +271AE=>hǔ +271AF=>hù +271B0=>zǐ +271B7=>gōng +271B8=>tuī +271B9=>wū +271BA=>líng +271BB=>gū +271BC=>zhōng +271C4=>lú +271C8=>zù +271CC=>tóng +271CD=>xiā +271CE=>hé +271D3=>yuè +271D9=>nán +271DA=>bó +271DB=>hū +271DC=>qì +271DD=>shú +271DE=>qiāng +271DF=>zhōu +271E0=>yào +271E1=>gū +271E5=>bān +271E6=>kǎn +271EE=>hé +271EF=>jì +271F0=>hú +271F1=>yán +271F6=>chūn +271F7=>dǐng +271F8=>qiū +271F9=>hóu +271FC=>hào +271FF=>zù +27201=>xián +27204=>xià +27205=>xì +27208=>sè +2720C=>gé +2720D=>xì +27211=>gé +27214=>lǚ +27216=>gé +27217=>kè +27219=>shòu +2721A=>zhù +2721C=>téng +2721D=>yà +2721E=>nì +27226=>luò +27227=>suī +2722A=>chǎn +2722D=>wù +2722F=>yū +27239=>zǎo +2723B=>yì +2723C=>xī +2723D=>hóng +2723E=>quán +2723F=>wǎng +27240=>chǐ +27241=>xì +27242=>tiǎn +27243=>yǔn +27245=>yī +27246=>jí +27247=>huī +27248=>fóu +2724A=>fǔ +2724D=>jí +2724E=>xuán +27251=>tài +27253=>dù +27257=>yuán +2725B=>dì +2725E=>zhǔ +2725F=>tāi +27261=>rǒng +27262=>xué +27263=>yù +27264=>fàn +27265=>běi +27267=>qǔ +27269=>bù +2726A=>jiā +2726B=>zhá +2726D=>nǔ +2726E=>shé +27272=>lì +27284=>guǐ +27285=>guǎi +27287=>dài +2728F=>gāi +27292=>cì +27294=>yǎn +27295=>sōng +27296=>shì +27298=>kù +27299=>zhǐ +2729A=>tóng +2729B=>qú +2729C=>è +2729E=>xíng +2729F=>rú +272A0=>yú +272A3=>yì +272A4=>yì +272A5=>xù +272A6=>fǒu +272A7=>gé +272AC=>hé +272AD=>yīn +272AF=>hòng +272B1=>duǒ +272BD=>xíng +272BE=>fán +272C9=>qī +272CA=>shā +272CC=>dù +272CD=>dì +272CE=>lí +272CF=>yì +272D0=>xí +272D1=>gěng +272D2=>tóng +272D3=>kào +272D4=>hòng +272D5=>kǔn +272D6=>niè +272D7=>chí +272D8=>tí +272DA=>tóng +272E0=>lí +272E1=>nà +272F1=>zhān +272F2=>běi +27301=>tiáo +27303=>zā +27304=>è +27305=>shòu +27306=>kōng +27307=>péng +27308=>fù +27309=>lù +2730A=>xiè +2730B=>xiè +2730C=>xiū +2730D=>lù +2730E=>tiǎn +2730F=>tà +27310=>cì +27311=>qū +27313=>fù +27314=>zhī +27316=>xiè +27317=>zǒu +27318=>fèi +27319=>mín +2731A=>xīng +2731D=>tóng +2731E=>qí +27320=>piāo +27322=>suì +27323=>ěr +27327=>hǔ +2733B=>sōng +2733D=>biē +2733E=>dīng +2733F=>bǎn +27340=>shī +27341=>xiè +27342=>xiáo +27343=>fěi +27352=>chuǎn +27353=>shuài +27354=>yāo +27355=>jué +27356=>shěng +27358=>yōu +27359=>fàn +2735C=>kuí +2735D=>dì +2735F=>máo +27360=>jié +27362=>yán +27365=>wēi +27368=>sāng +27369=>jié +2736A=>yú +2736B=>wèi +2736C=>è +2736D=>quán +2736E=>jiǒng +2736F=>féng +27370=>lóng +27371=>dié +27372=>pián +27374=>liàn +27375=>hú +27376=>lǜ +2737F=>diàn +27383=>cuì +27384=>móu +27395=>wáng +27396=>juān +27397=>kē +27398=>yán +27399=>jiǎo +273A1=>gōng +273A3=>róng +273A4=>sūn +273A5=>shàn +273A8=>chí +273AA=>qí +273AB=>suǒ +273AD=>yè +273AE=>zǎo +273AF=>quē +273B0=>zhǎn +273B1=>bā +273B2=>zú +273B3=>suǒ +273B4=>zhé +273B5=>xì +273B7=>chǔ +273B8=>jiǎo +273B9=>zuì +273BA=>gē +273BB=>wù +273BE=>lüè +273BF=>jí +273C2=>xié +273C3=>xié +273C6=>dǒu +273CB=>qiū +273D1=>píng +273D3=>liú +273E5=>jié +273E7=>huì +273EB=>shà +273F8=>zhí +273F9=>ài +273FA=>xù +273FB=>bì +273FD=>yē +273FE=>nì +273FF=>zhú +27401=>sù +27403=>xié +27404=>yù +27405=>qū +27408=>zú +27409=>zhī +2740A=>zhāng +2740B=>lüè +2740C=>wěi +2740D=>chōng +2740E=>mì +27410=>jī +27412=>sù +27413=>yě +27414=>xí +27415=>tuán +27416=>lián +27417=>xuán +27419=>wù +2741F=>máo +2742C=>hóng +2742F=>lüè +27430=>dú +27431=>cóng +27432=>chán +27433=>lù +27434=>sù +27440=>lüè +27446=>zhōng +27447=>lí +27448=>fèi +2744A=>jǐng +2744B=>kuì +2744C=>yì +2744D=>huá +2744E=>cuì +27450=>yù +27451=>běng +27452=>tūn +27453=>shǔ +27454=>dài +27455=>wū +27456=>cì +27457=>nìng +27458=>dàng +27459=>zú +2745A=>hán +2745C=>pí +2745D=>chuàn +27460=>dù +27461=>pá +27464=>zhū +27466=>xié +27467=>zhé +27468=>qiè +27469=>xuān +2746B=>sào +27480=>bì +27482=>fù +27488=>lì +2748E=>é +27490=>yē +27491=>shǔ +27493=>sè +27495=>qī +27496=>guò +27497=>sè +27499=>fù +2749A=>máo +2749C=>léi +2749D=>zhān +274A8=>chài +274AD=>wèi +274BD=>léi +274BF=>zéi +274C0=>yīng +274C1=>ài +274C2=>xiē +274C4=>bì +274CB=>chán +274CE=>pí +274CF=>cóng +274D0=>liè +274D1=>qí +274D3=>jì +274D4=>jīng +274D5=>dōng +274D6=>féi +274D7=>yí +274D8=>tuán +274E8=>měng +274E9=>cán +274EA=>yá +274F2=>yǎng +274F4=>tíng +274F8=>zhí +274FA=>xiè +274FB=>lǜ +274FD=>lì +274FF=>máo +27502=>xiá +27505=>sòu +27516=>sū +27517=>xuè +2751D=>lì +2751E=>yuán +27521=>zhǎn +27523=>tà +27524=>xuán +27525=>wèi +27526=>yè +27527=>páng +27528=>máo +27529=>tí +2752A=>pín +2752C=>dù +2752D=>qiú +2752E=>yǐ +27533=>tuó +27534=>chài +27537=>jìn +2753C=>é +27543=>chán +27544=>yīng +27545=>líng +27547=>xiǎn +27549=>qī +2754B=>yuè +2754C=>lüè +2754D=>yíng +2754E=>qú +27552=>fěi +27553=>zī +27559=>qīng +2755D=>níng +2755E=>wèi +2755F=>shuāng +27561=>fù +27564=>mò +27565=>mò +27566=>tuó +27567=>chài +27568=>zàng +2756E=>lí +2756F=>lí +27571=>xiá +27572=>juǎn +27574=>nán +27575=>mì +27578=>huáng +2757A=>shuàng +2757C=>xǔ +2757F=>fěi +27581=>xiè +27586=>tà +27587=>yǒng +27589=>zhǎn +27591=>qiáng +27592=>náng +27594=>lìn +27598=>luán +27599=>xiǎn +2759A=>fú +2759C=>líng +275A0=>sāo +275A2=>huì +275A8=>tíng +275AA=>qíng +275AC=>huāng +275AE=>àn +275B5=>mǎn +275B7=>nì +275BB=>guó +275BC=>ǒu +275BF=>xiàng +275C1=>jīn +275C6=>zhēng +275C8=>n +275CB=>sàn +275CC=>hù +275CE=>zú +275CF=>huǐ +275D2=>jī +275D6=>yè +275E6=>xíng +275E9=>là +275EA=>yù +275EB=>jué +275F1=>shù +275F2=>zhēng +275F4=>yǒng +275F6=>gē +275F8=>jiàn +275F9=>xìn +275FC=>huī +275FF=>shuài +27602=>chōng +27603=>háng +27608=>liǎo +2760D=>jiāng +2760F=>gōng +27611=>zhuó +27617=>qǐ +2761C=>qiān +2761E=>dǒu +2761F=>pō +27622=>hù +27625=>niǔ +27627=>qì +27628=>diāo +27629=>diāo +2762B=>lì +2762E=>xiōng +2763D=>ná +2763F=>zhēng +27640=>là +27641=>zhì +27643=>ě +27644=>bō +27645=>pō +27646=>xū +27647=>yòng +27648=>cí +27649=>lì +2764C=>páo +2764F=>xiù +2765B=>pù +2765D=>ché +2765E=>qì +27661=>yì +27663=>tí +27664=>duǒ +27665=>lóng +27667=>jiàn +2766D=>zhàn +2766E=>yuàn +27676=>yú +27678=>gēng +2767A=>hòu +2767E=>qǐ +27680=>mù +27681=>huàn +27682=>lòng +27683=>xì +27684=>é +27685=>lǎng +27686=>fèi +27687=>wǎn +27689=>cūn +2768B=>péng +2768F=>cuò +27690=>wēng +276A1=>gǎo +276A5=>cuì +276A8=>qì +276A9=>lí +276AA=>qiè +276AB=>qiàn +276AC=>kōng +276AD=>běng +276AF=>shòu +276B7=>wēi +276C4=>shān +276CF=>zī +276D2=>tì +276D3=>qiān +276D4=>dú +276D7=>tú +276DA=>wēi +276DE=>hú +276DF=>xīng +276E1=>shān +276E2=>zhǐ +276E7=>chǐ +276F8=>zhòu +276F9=>wēng +276FA=>chí +276FB=>suǒ +276FC=>xiè +276FE=>kè +27701=>shài +27702=>shī +27703=>shòu +27705=>jiè +27709=>gǎo +2770A=>lǚ +27714=>xiè +2771A=>zhǐ +2771E=>mán +27720=>shuài +27721=>kè +27723=>diǎo +27724=>yī +27726=>sù +27727=>chuāng +27731=>cuì +27732=>tuò +27735=>xiè +2773D=>xuán +27742=>hè +27743=>jué +27746=>tì +27747=>fèi +27749=>zhǐ +2774A=>shì +2774B=>tuí +2774E=>chōng +27750=>tì +27751=>zhàn +27752=>héng +27754=>qú +27755=>wéi +27757=>dūn +27758=>bào +2775C=>liáo +27764=>sī +2776A=>biǎo +2776B=>xiè +2776C=>bié +2776E=>cǒng +27772=>jù +27773=>hé +27777=>kuì +27778=>yōng +27780=>shù +2778D=>niè +2778F=>yú +27790=>zhuó +27791=>méng +27792=>hú +27795=>liè +2779D=>jiē +2779E=>xióng +277A3=>yǎn +277A9=>jié +277AA=>là +277AB=>shù +277AC=>jié +277AD=>léi +277B0=>zú +277B2=>shì +277B8=>wéi +277B9=>dū +277BA=>sù +277C3=>xié +277C4=>ráng +277CC=>luò +277D1=>qiān +277D8=>nàng +277D9=>líng +277DC=>jì +277E0=>mìng +277E3=>gǔ +277E8=>xuán +277EC=>xū +277F1=>bó +277FC=>wēi +27802=>kū +27806=>wǎn +27808=>chà +2780A=>mào +2780B=>kè +2780E=>cì +27812=>xiàn +27813=>mò +2781A=>hūn +2781B=>chàn +2781C=>shī +2781D=>zhěn +2781E=>è +2781F=>mí +27821=>shī +27822=>qū +27823=>shū +27825=>cī +27826=>yǎn +27829=>hū +2782A=>qī +2782B=>zhì +2782C=>huāng +27834=>zhǐ +27836=>yǒu +2783C=>gào +2783D=>yǎo +2783E=>pōu +27847=>yí +27848=>chèng +27849=>jì +2784B=>ǎi +2784D=>dòng +2784F=>suì +27851=>jiù +27858=>qì +27859=>lián +2785A=>xuǎn +2785C=>liǎo +27861=>yùn +27862=>xuǎn +27863=>cóu +27864=>piān +27866=>kuí +27868=>tí +27869=>huǎn +2786A=>dān +2786B=>guì +2786C=>chēn +2786E=>shǎng +2786F=>jì +27874=>liàn +27875=>kān +27876=>shèng +27878=>dōu +27879=>yóu +2787A=>qí +2787C=>xiǎo +27882=>yì +27883=>lóu +27886=>chuāng +2788B=>lào +2788C=>gāo +27890=>zēng +27892=>wéi +27896=>jiān +2789B=>yīng +2789C=>fán +2789D=>lì +2789E=>qiān +278A2=>yào +278A6=>kuī +278A7=>wéi +278A9=>què +278AC=>xiǎo +278AD=>què +278B0=>hū +278B5=>duō +278B6=>chù +278B9=>shēn +278BC=>zhuó +278BD=>é +278BE=>jì +278C1=>tán +278C3=>pā +278CB=>jiè +278CC=>qiào +278D1=>qián +278D2=>jù +278D5=>qiú +278D6=>tuó +278DA=>nuò +278DB=>sì +278DF=>yí +278E1=>gǔ +278E2=>hùn +278E3=>pá +278E4=>zī +278E6=>jiāo +278E9=>xǐ +278EA=>shǎo +278EC=>yí +278ED=>zhì +278F5=>lùn +278F7=>zhōu +278F8=>jué +278F9=>tán +278FA=>nuò +278FB=>jù +278FC=>hú +278FE=>zhì +27903=>bī +2790D=>chì +2790E=>xuān +2790F=>jí +27910=>guǎ +27911=>jú +27912=>wò +27913=>tuó +27915=>qiú +27916=>wēi +27917=>duān +27919=>shòu +2791B=>zhěn +2791C=>nè +2791F=>xì +27920=>zhé +27921=>zhì +27923=>ná +27928=>jiān +2792E=>yáo +2792F=>guó +27932=>dǐ +27934=>huò +27935=>jīng +2793C=>jué +2793D=>yuè +27944=>jí +27946=>sù +27948=>jiān +2794A=>kūn +2794B=>wò +2794C=>kuàng +2794D=>biāo +2794E=>jué +27951=>bì +27953=>chán +27955=>zī +27956=>lì +2795A=>fó +2795B=>qiǎn +2795C=>yǎn +2795E=>tàn +2795F=>mò +27963=>kòu +27964=>xī +2796E=>hù +2796F=>hù +27971=>fú +27974=>yàng +27975=>guò +27977=>rén +27978=>yìn +27979=>fēng +2797A=>jùn +2797C=>yún +2797F=>xùn +27981=>xì +2798E=>xiā +27991=>háng +2799A=>hù +2799D=>hū +2799E=>pù +2799F=>fān +279A4=>jiā +279A7=>yí +279AD=>tuō +279AE=>ná +279B8=>yín +279B9=>yìn +279C3=>jì +279C4=>wàng +279C5=>shì +279C6=>duī +279C7=>duò +279C9=>tuó +279CA=>wā +279CB=>lì +279CF=>rè +279D2=>cì +279D3=>xù +279D4=>zhōu +279D5=>zì +279DC=>wǎng +279DD=>yǎ +279DF=>jì +279E0=>chǎo +279E9=>jí +279F5=>shǎn +279F6=>tú +279F8=>bié +279F9=>xì +279FA=>pī +279FB=>zhà +279FE=>huì +27A00=>suō +27A02=>hè +27A04=>yuē +27A06=>wū +27A08=>líng +27A0A=>zhà +27A0B=>huá +27A17=>chán +27A1F=>è +27A21=>chén +27A27=>suì +27A29=>tiǎn +27A30=>zhì +27A31=>tì +27A32=>āo +27A33=>zhuó +27A34=>zì +27A35=>kē +27A37=>sè +27A38=>tián +27A39=>lù +27A3E=>shán +27A3F=>zhǎ +27A43=>chōng +27A45=>yàn +27A52=>mǔ +27A53=>hū +27A5A=>chī +27A5D=>sù +27A63=>nǎo +27A66=>jí +27A67=>duó +27A68=>hòu +27A6A=>còng +27A6B=>zhā +27A6C=>yín +27A6E=>xiǎo +27A70=>biàn +27A71=>bèng +27A72=>là +27A74=>chī +27A76=>qià +27A78=>ān +27A79=>shī +27A7C=>chì +27A85=>nù +27A87=>jì +27A93=>ǒu +27A95=>xiā +27A98=>chài +27A9A=>ái +27A9D=>shèng +27A9E=>hé +27AA0=>jí +27AA1=>chī +27AA2=>xì +27AA3=>zhēng +27AA6=>tā +27AA8=>mà +27AAB=>pī +27AAE=>xū +27AAF=>qiǎn +27AB9=>xià +27ACA=>yù +27AD1=>jié +27AD2=>xià +27AD3=>lǔ +27AD5=>qiè +27AD7=>chà +27ADB=>yàng +27ADC=>jì +27ADD=>shǎ +27ADE=>lòu +27AE0=>jī +27AE1=>zhì +27AE2=>wàng +27AE4=>bì +27AE5=>ān +27AE6=>yī +27AE7=>ān +27AEC=>lí +27AF9=>xiān +27AFE=>jiù +27AFF=>tǎn +27B01=>hào +27B02=>hè +27B05=>zhā +27B06=>zhǎn +27B07=>yì +27B08=>xì +27B0A=>xì +27B0B=>fà +27B0C=>yán +27B0F=>mǔ +27B15=>gū +27B1E=>yún +27B24=>zhòng +27B26=>chǎn +27B27=>chuáng +27B28=>huì +27B29=>zá +27B2A=>gùn +27B2B=>jiǎn +27B2C=>yá +27B30=>xiàng +27B31=>hè +27B43=>dàn +27B47=>mián +27B48=>níng +27B4A=>méng +27B4C=>liè +27B4D=>zhòu +27B4E=>pū +27B4F=>tāi +27B53=>yíng +27B54=>téng +27B55=>guó +27B5A=>qiáng +27B5C=>lǜ +27B5D=>sà +27B5E=>liè +27B5F=>chí +27B60=>xiě +27B63=>guó +27B64=>bào +27B65=>luò +27B66=>juàn +27B6A=>è +27B73=>hé +27B75=>mèi +27B78=>xiè +27B79=>pín +27B7B=>hān +27B7C=>chèn +27B7D=>shàn +27B7E=>huì +27B86=>yīng +27B88=>jiǎn +27B8D=>ān +27B91=>tà +27B92=>yī +27B93=>tuí +27B97=>liú +27B99=>zuó +27B9B=>lí +27B9D=>pín +27B9E=>xuè +27BA0=>nèn +27BA1=>dòu +27BA4=>lǎn +27BAA=>zhān +27BAB=>jué +27BAC=>zhēn +27BAD=>jí +27BAE=>qiān +27BB0=>hān +27BB1=>fén +27BB3=>hān +27BB4=>hóng +27BB5=>hé +27BB6=>hóu +27BBA=>zhàn +27BBB=>chóu +27BBC=>tài +27BBD=>qiàn +27BBF=>shè +27BC0=>yīng +27BC3=>qīn +27BC6=>huò +27BC8=>xì +27BC9=>hè +27BCA=>xì +27BCB=>xiā +27BCC=>hāo +27BCD=>lào +27BCF=>lì +27BD2=>chēng +27BD6=>jùn +27BD7=>xī +27BD8=>hǎn +27BDE=>dòu +27BE0=>dōu +27BE1=>wān +27BE4=>dōu +27BE5=>zài +27BE6=>juàn +27BE8=>lǒu +27BE9=>chù +27BEB=>zhēng +27BEF=>qí +27BF0=>kàn +27BF1=>huò +27BF2=>lái +27BFA=>gāi +27BFC=>shòu +27BFE=>dōng +27C03=>lóu +27C04=>tuān +27C07=>yú +27C08=>wù +27C0A=>tián +27C12=>guó +27C18=>tán +27C19=>qí +27C20=>liè +27C21=>lì +27C23=>xūn +27C28=>gèng +27C29=>tīng +27C2A=>hàn +27C2B=>chù +27C2D=>tún +27C2F=>xióng +27C30=>yóu +27C31=>mò +27C32=>chǐ +27C34=>hǔ +27C35=>dū +27C37=>mǔ +27C39=>nà +27C3B=>líng +27C3F=>ài +27C40=>xiān +27C44=>kǎn +27C45=>sì +27C46=>sān +27C4A=>yì +27C4F=>yì +27C50=>xiào +27C52=>zhī +27C53=>dòu +27C58=>mài +27C5C=>lún +27C5D=>jué +27C61=>qiāng +27C62=>líng +27C69=>pián +27C6A=>còu +27C6B=>duò +27C6C=>yǔ +27C70=>zhuō +27C72=>xì +27C73=>huài +27C74=>míng +27C75=>táng +27C79=>pū +27C7B=>mì +27C7C=>mán +27C7E=>guāi +27C80=>qiān +27C82=>lín +27C83=>mǐn +27C84=>wěi +27C85=>céng +27C87=>hù +27C88=>suí +27C8B=>jù +27C8C=>shà +27C8D=>méng +27C97=>wéi +27C98=>xī +27C99=>lìng +27C9C=>bì +27C9D=>wèi +27CA1=>lì +27CA2=>zhé +27CA4=>yóng +27CA5=>hú +27CA6=>wán +27CA7=>bā +27CA8=>jiān +27CAD=>zuǒ +27CAE=>zhǎn +27CAF=>bō +27CB0=>qiū +27CB1=>yāng +27CB4=>dōng +27CB5=>qú +27CBA=>pí +27CBB=>zhǎi +27CBE=>shān +27CBF=>gòu +27CC0=>biào +27CC1=>yí +27CC2=>fú +27CC4=>xìn +27CC5=>shì +27CC6=>tōng +27CC9=>dīng +27CCC=>tū +27CCD=>xiāo +27CCE=>wú +27CCF=>péi +27CD0=>huī +27CD5=>lái +27CD9=>sì +27CDA=>cuǐ +27CDB=>shà +27CDC=>zhǒu +27CDD=>zhào +27CDE=>wéi +27CDF=>lái +27CE0=>bì +27CE3=>dǒng +27CE6=>nǎo +27CE7=>xiē +27CE8=>rǎo +27CE9=>tuàn +27CEA=>wèi +27CEB=>yóu +27CEC=>méi +27CED=>yuán +27CEE=>zhòng +27CF6=>sōu +27CF8=>gú +27CF9=>shào +27CFB=>zhǎo +27CFC=>pí +27CFF=>tōng +27D01=>chī +27D02=>péng +27D03=>chán +27D04=>yōng +27D05=>shuǎng +27D07=>wǔ +27D09=>pí +27D0A=>huàn +27D0C=>fú +27D0E=>biào +27D13=>náo +27D15=>biào +27D16=>wèi +27D17=>yōng +27D19=>nǎo +27D1A=>guài +27D20=>lì +27D22=>xìn +27D23=>yán +27D24=>pò +27D25=>péi +27D2A=>suǒ +27D2C=>rèn +27D2D=>shǎn +27D32=>suǒ +27D38=>dān +27D3A=>mèn +27D43=>shǒu +27D48=>gòu +27D4A=>hān +27D4B=>shì +27D4C=>yǎng +27D4E=>gǔ +27D5B=>kē +27D5E=>jū +27D60=>pài +27D61=>cè +27D62=>bāo +27D63=>xiōng +27D64=>cái +27D67=>lǐn +27D68=>ài +27D6C=>mì +27D6D=>lǎi +27D71=>xiāo +27D73=>shé +27D7B=>huó +27D7C=>nì +27D84=>zhèng +27D86=>lìn +27D87=>zhá +27D8A=>yún +27D8D=>xù +27D94=>chéng +27D95=>wǒ +27D96=>xī +27D99=>bèi +27D9C=>shāng +27DA0=>yù +27DA1=>mì +27DB2=>duǎn +27DB5=>chà +27DB7=>zé +27DB8=>chèng +27DBA=>tíng +27DC5=>yí +27DCB=>yāo +27DCE=>kū +27DD0=>fén +27DD1=>xié +27DD2=>chèng +27DDB=>kuì +27DDF=>bīn +27DE1=>lóu +27DE5=>yì +27DE6=>mì +27DE7=>xiè +27DF1=>guī +27DF3=>luó +27DF6=>shàn +27DFE=>jú +27DFF=>dū +27E02=>xiān +27E05=>zhǐ +27E08=>bìn +27E15=>zhǐ +27E16=>zhuàn +27E17=>xué +27E18=>liàn +27E19=>suì +27E26=>làn +27E27=>jù +27E28=>mián +27E29=>xùn +27E2A=>zhàn +27E2B=>gùn +27E32=>zhì +27E3D=>wèi +27E3E=>quǎn +27E3F=>chài +27E48=>réng +27E4A=>yuè +27E4C=>zī +27E50=>luò +27E51=>guì +27E53=>chéng +27E55=>jū +27E56=>tiǎn +27E57=>wàn +27E5B=>zhī +27E5E=>nǎn +27E63=>hān +27E68=>xī +27E69=>lín +27E6C=>yān +27E6D=>xù +27E72=>hù +27E73=>gàn +27E74=>xù +27E76=>xì +27E7A=>cuì +27E7D=>xì +27E7E=>hú +27E85=>yān +27E8E=>yì +27E8F=>chí +27E90=>jué +27E92=>zú +27E9C=>jiào +27E9D=>yì +27E9F=>tǎn +27EA0=>chì +27EA1=>bá +27EA2=>tòu +27EA3=>zōng +27EA4=>qiú +27EA7=>chì +27EA8=>xǐ +27EB0=>nì +27EB2=>cū +27EB4=>wǔ +27EB6=>chù +27EB7=>sū +27EB8=>yóng +27EB9=>jǔ +27EBA=>bá +27EBC=>cǐ +27EBD=>dì +27EBE=>pǎn +27EBF=>chì +27EC1=>qiǔ +27EC3=>yán +27ECD=>zhǎi +27ED2=>xiàn +27ED3=>bèng +27ED4=>kuāng +27ED5=>qì +27ED6=>zhōu +27ED7=>jú +27ED8=>qiè +27ED9=>mò +27EDA=>yuán +27EDC=>guì +27EDD=>zuī +27EE7=>qiè +27EF0=>hú +27EF1=>qiú +27EF2=>hái +27EF3=>fù +27EF4=>làng +27EF5=>shà +27EF6=>xī +27EF7=>bū +27EF8=>shì +27EF9=>yǒng +27EFA=>guāng +27EFC=>niè +27EFF=>hǒu +27F0A=>mì +27F0E=>è +27F0F=>xián +27F10=>yǔn +27F11=>xù +27F12=>qǐn +27F13=>dōng +27F14=>léng +27F15=>qì +27F16=>lán +27F17=>fú +27F18=>qǐ +27F19=>chǒng +27F1C=>cù +27F1F=>mò +27F20=>bēi +27F24=>dào +27F28=>jié +27F29=>chòng +27F2A=>chì +27F2B=>yù +27F2C=>cuī +27F2D=>sù +27F2E=>tì +27F2F=>shù +27F30=>zhá +27F31=>fú +27F33=>chè +27F34=>fó +27F35=>hóu +27F36=>zhá +27F44=>jié +27F45=>zhá +27F46=>zhān +27F49=>yǎn +27F4A=>hái +27F4B=>wǔ +27F4C=>huá +27F4D=>diān +27F4E=>yáo +27F4F=>sōu +27F50=>qiān +27F51=>jí +27F52=>xiòng +27F53=>qì +27F54=>jūn +27F56=>hái +27F5E=>yǎn +27F5F=>jié +27F60=>cuī +27F62=>tuán +27F63=>zhāng +27F64=>piāo +27F65=>lù +27F66=>zhī +27F67=>chù +27F68=>mì +27F69=>qiāng +27F6B=>liàn +27F72=>lì +27F76=>é +27F77=>sù +27F78=>jué +27F7B=>jú +27F7C=>tán +27F7D=>liáo +27F7E=>sān +27F7F=>dòng +27F81=>zá +27F82=>zhí +27F86=>xuàn +27F87=>líng +27F8A=>dēng +27F8D=>zhān +27F8E=>xuān +27F8F=>qǐn +27F90=>jiào +27F91=>pì +27F94=>hǎn +27F9A=>yú +27F9B=>guó +27F9D=>xún +27FA0=>xún +27FA1=>chán +27FA2=>jié +27FA3=>jú +27FA4=>yǎn +27FA5=>dú +27FA7=>hòng +27FA8=>xiàn +27FA9=>xún +27FAE=>líng +27FAF=>jié +27FB0=>yì +27FB1=>qú +27FB2=>gān +27FB3=>fēng +27FB5=>jué +27FB6=>qū +27FBB=>jiù +27FBD=>jì +27FBE=>jǐ +27FC5=>xí +27FC6=>pāng +27FC8=>kuàng +27FC9=>kù +27FCB=>kù +27FCC=>zhà +27FCF=>bà +27FD2=>chěn +27FD3=>hù +27FD4=>nù +27FD5=>é +27FD6=>xiōng +27FD7=>dǔn +27FD8=>shēng +27FD9=>wán +27FDA=>fēn +27FDD=>xī +27FDE=>zī +27FE0=>hù +27FE5=>bié +27FE7=>tuò +27FE8=>bǎn +27FE9=>gé +27FEB=>kē +27FF2=>zhuì +27FF3=>fú +27FF4=>mò +27FF5=>jiá +27FF6=>tuó +27FF7=>yù +27FF9=>mǔ +27FFA=>jué +27FFB=>jú +27FFC=>guā +27FFD=>pǒ +28000=>nǐ +28004=>wǎ +28005=>yǎn +28014=>chǒu +28015=>kuāng +28016=>hài +28018=>xiáng +28019=>xī +2801B=>cún +2801C=>tōng +2801D=>ruò +2801F=>duó +28020=>chè +28024=>lèi +28025=>zī +28027=>zhěng +28028=>zuǒ +2802B=>kāng +2802C=>zài +2802E=>yuān +2802F=>qióng +28033=>fá +28034=>xún +28036=>jì +28038=>chā +28040=>shū +28041=>xuàn +28042=>xié +28043=>tī +28044=>hàn +28045=>xiān +28046=>shān +28047=>tùn +28048=>háng +28049=>kǔn +2804A=>cén +2804B=>dōu +2804C=>nuó +2804D=>yàn +2804E=>chéng +2804F=>pū +28050=>qì +28051=>yuè +28052=>fū +28057=>tǐng +2805F=>wǒ +28060=>shēng +28061=>tuǒ +28074=>tǎn +28076=>yǎ +28077=>zhì +28078=>lù +28079=>yǎn +2807A=>jū +2807D=>dé +2807F=>chù +28080=>zǔ +28081=>è +28082=>zhí +28083=>péng +28085=>biē +28087=>dǐ +28090=>lái +28092=>yè +2809C=>háo +2809D=>pán +2809E=>tàn +2809F=>kāng +280A0=>xū +280A1=>zòu +280A2=>jì +280A3=>wù +280A6=>chuàn +280A9=>pò +280AA=>yǎn +280AB=>tuò +280AD=>dú +280AF=>pián +280B0=>chì +280B1=>hùn +280B2=>pīng +280B4=>cōng +280B5=>zhǎ +280BA=>wān +280BF=>wǎi +280C3=>è +280C4=>wèi +280C5=>bāi +280C7=>jiāng +280D3=>chá +280D5=>chù +280D6=>kuà +280D7=>téng +280D8=>zōu +280D9=>lì +280DA=>tà +280DB=>sà +280DE=>pán +280DF=>pán +280E3=>sào +280E4=>qiāo +280ED=>zú +280EF=>zhì +280F0=>yǎn +280F2=>jié +280F3=>néng +28104=>luán +28105=>qū +28107=>dèng +28108=>liáng +28109=>chǎn +2810A=>qiè +2810B=>lòu +2810C=>dié +2810D=>cuī +28110=>jǐ +28113=>cháo +28114=>shuàn +28115=>zú +28117=>kāng +2811A=>qiāng +2811B=>lí +2812E=>shuāi +2812F=>yù +28130=>zhāng +28131=>lěi +28145=>pó +2814A=>zhé +2814B=>xiào +2814D=>tǎn +2814E=>cuì +2814F=>lán +28151=>xū +28152=>shù +28153=>zhǎ +28154=>cán +28157=>bǐ +28158=>pèng +2815D=>chéng +28163=>qiáo +28164=>jī +2816A=>zhāi +2816C=>lán +28181=>tiǎn +28182=>sà +28183=>jīn +28184=>zhù +28185=>duò +28187=>chà +28188=>juàn +28189=>táng +2818A=>bèng +2818C=>fán +2818D=>liè +2818E=>zéi +2818F=>suì +28199=>sè +281A7=>zhì +281A8=>tuí +281AA=>qīng +281AC=>chuò +281B0=>tà +281B1=>bìng +281B2=>wěn +281B5=>pǒ +281BD=>mó +281BE=>cā +281C1=>kuàng +281C3=>cuó +281C4=>rǎo +281C5=>bào +281C6=>lài +281CD=>niǎn +281CE=>lí +281D5=>jiǎo +281D6=>lú +281D7=>lì +281D8=>lóng +281D9=>guì +281DD=>chǎn +281E4=>xiān +281E6=>chàn +281E8=>xiè +281E9=>zhàn +281EF=>shuāng +281FB=>mǐ +281FC=>luán +281FD=>luò +28200=>diān +28208=>dié +2820A=>wān +2820B=>yuè +2820C=>luán +2820E=>luán +28213=>léng +28215=>wǎi +28216=>dìn +28217=>nèn +28218=>shǎo +28219=>xiè +2821A=>pí +28225=>máo +28227=>yǐn +28229=>bó +2822B=>zhù +2822E=>chōng +28236=>mǔ +28237=>tuó +28239=>tǒng +2823A=>yé +28241=>huàng +28243=>rèn +28245=>yè +2824B=>tuó +28256=>zuān +28257=>yù +2825A=>ā +2825C=>zhōu +2825D=>wān +28261=>duǒ +28262=>zhòng +28263=>hā +28264=>huáng +28265=>miàn +28269=>chūn +2826A=>qiè +2826B=>gōng +2826C=>tíng +2826D=>méi +28271=>tàng +28274=>róng +28277=>róng +28278=>qí +28279=>guó +2827D=>xiàng +2827E=>tián +28285=>xiāo +28288=>zhān +28289=>cuì +28294=>lán +28298=>shēn +2829A=>lěi +2829B=>lì +2829D=>chān +2829E=>niè +2829F=>luán +282A1=>tīng +282A2=>huì +282A7=>gōng +282B0=>qì +282B1=>yú +282B3=>xīn +282B8=>yuè +282B9=>bā +282BA=>dài +282BB=>jī +282BC=>xuàn +282BF=>jué +282C0=>niǔ +282C8=>dù +282C9=>jí +282D0=>pā +282D1=>gǒng +282D2=>bèn +282D4=>kēng +282D5=>yàng +282D6=>liǔ +282D7=>ní +282D8=>zhà +282D9=>yìn +282DA=>niǎn +282DB=>pào +282DD=>gōng +282DE=>bù +282DF=>hé +282E0=>rǒng +282E1=>guì +282E5=>bì +282E6=>xī +282E7=>jú +282E8=>hún +282E9=>bì +282EB=>tiāo +282EC=>zhěng +282EF=>yì +282F0=>cì +282F2=>bìng +282F7=>gōng +282FA=>fá +282FD=>yáng +282FE=>xǔ +28301=>hōng +28304=>zàng +28305=>chái +28306=>hóng +28308=>tián +2830C=>zhī +2830D=>xīng +2830E=>xú +28311=>zhèn +28314=>wǎn +28318=>jùn +2831D=>wò +28320=>lù +28322=>zhēng +28323=>rǒng +28324=>chéng +28325=>fú +28327=>è +28328=>tāo +28329=>táng +2832B=>juān +2832C=>chào +2832D=>tà +2832E=>dǐ +28330=>zōng +28333=>kēng +28334=>tuī +28336=>kēng +28345=>rǒng +28346=>yūn +28347=>hé +28348=>zǒng +28349=>cōng +2834A=>qiū +2834E=>mù +2834F=>duó +28350=>xǔ +28351=>kēng +28352=>xiàn +2835B=>dú +2835C=>kǎn +2835E=>yīng +28362=>zī +28367=>huáng +28369=>péng +2836B=>lì +2836D=>bó +2836E=>gé +2836F=>jú +28370=>kē +28372=>hú +28373=>yáo +28374=>táng +28376=>qióng +28377=>rǒng +28378=>liǔ +28379=>huì +2837A=>jī +28389=>zhì +2838B=>táng +2838C=>zhǐ +2838D=>kāng +28394=>yàng +28396=>tǎng +28397=>hōng +2839B=>liáng +2839D=>cáo +283A1=>nǎi +283A2=>zǒng +283A4=>dèng +283A6=>jiāo +283A7=>péng +283A9=>guāng +283AA=>ér +283AB=>jiàn +283AC=>jiào +283AD=>nuó +283AE=>zǎo +283B3=>péng +283B4=>dāng +283B6=>qú +283B7=>lián +283B8=>mù +283B9=>lǎn +283BE=>fén +283C2=>hún +283C6=>kuāng +283C8=>yǐn +283C9=>shuàn +283CA=>jiàn +283D2=>luò +283D4=>lù +283DA=>gé +283DB=>rǎng +283DE=>pín +283E0=>lóng +283E4=>zhěn +283E5=>xiàn +283E8=>lìn +283E9=>lián +283EA=>shān +283EB=>bó +283EC=>lì +283F3=>xié +283F4=>gé +283F5=>mǐn +283F6=>lián +283F9=>jué +283FA=>zhōu +283FF=>kē +28401=>dié +28403=>zhé +28405=>shū +28406=>jī +28407=>lóng +28408=>guāng +28409=>zǎo +2840A=>xiàn +2840B=>qiān +2840D=>shēn +28410=>yǐn +28411=>jiè +28414=>shēn +28415=>shēn +28416=>sǎ +2841B=>xì +28421=>kù +28423=>qú +28425=>gé +28426=>bàn +28428=>bì +28429=>qiān +28430=>bīn +28431=>bàn +28433=>zuò +28434=>pì +28436=>huò +2843E=>bàn +2844A=>nóng +2844C=>chén +2844E=>pēng +28451=>fǔ +28452=>tú +2845C=>pǐ +2845D=>pò +28460=>chǐ +28463=>xuè +28464=>qì +28465=>wù +28468=>zhì +28469=>dì +2846A=>cōng +2846B=>yóu +28479=>cōng +2847C=>dì +2847D=>zhuó +2847F=>zǒu +28480=>cóng +28483=>pàn +28484=>yǎn +28485=>qì +28486=>rǒng +28487=>jiá +28489=>zhì +2848A=>qiú +2848B=>yuè +2848D=>shì +28491=>háo +28499=>tuō +2849C=>bié +2849E=>kàn +284A2=>chuò +284A4=>cǐ +284A6=>yǐn +284A7=>shì +284A8=>nài +284A9=>ruǎn +284AB=>yáng +284AC=>chī +284AE=>cī +284B1=>gōng +284B2=>mí +284B4=>jǐ +284BC=>gèn +284BD=>zào +284C1=>běng +284C7=>xǐn +284C8=>kuò +284CA=>dié +284CD=>tíng +284DA=>shuì +284DE=>dài +284E6=>lǐ +284E8=>yǒng +284E9=>jiāo +284EC=>tá +284ED=>qǔ +284EE=>yín +284EF=>yuān +284F0=>jié +284F2=>qiān +284F3=>yāo +284F4=>yà +284F7=>qīng +284FF=>péi +28517=>jiā +28519=>tòu +2851B=>tī +28521=>dùn +28522=>chǎn +28523=>jiā +28524=>chì +28525=>jiān +28526=>shù +2852F=>tà +28555=>zhī +28557=>yuán +2855A=>hū +2855C=>liè +28560=>zé +28562=>chù +28566=>qiù +28567=>bēng +28579=>huán +2857A=>kuā +2857B=>shēng +2857D=>jié +2857F=>wǎng +28583=>hū +2858A=>zé +2858B=>zǎn +2858C=>yàng +2858E=>chǐ +2858F=>jiù +2859A=>liáo +2859B=>yū +285A0=>biǎn +285A2=>kuáng +285AC=>chòu +285AD=>yá +285AE=>zhuó +285B0=>qiè +285B1=>xiàn +285B3=>yuān +285B4=>wǔ +285B5=>jiǎo +285B6=>xiàng +285B7=>shà +285B9=>zhì +285BC=>chòng +285BE=>biān +285BF=>wēi +285D3=>dào +285DD=>yù +285DE=>tuí +285E1=>chào +285E5=>huì +285E6=>qiǎn +285E8=>wěi +285F0=>yóu +285FC=>dì +285FE=>dà +28601=>yóu +28602=>jiù +28603=>tuí +28604=>zǎn +28607=>huì +28609=>shà +2860C=>huò +28614=>yáo +28619=>xiàn +2861E=>xiàn +2862C=>dì +2862E=>jiù +28632=>huì +28634=>kào +28635=>yóu +28638=>lì +2863C=>chuán +2863E=>chí +28640=>huò +28642=>yóu +28644=>yuè +2864E=>tà +2864F=>zàn +28653=>niè +28654=>zhù +28661=>xiǎn +28669=>shí +2866B=>kǒu +2866C=>qǐ +2866D=>tǔ +2866E=>fán +2866F=>cūn +28672=>tún +28673=>chā +28674=>cái +28675=>xiàng +28676=>pèi +28677=>jǐng +28678=>qí +28679=>shǎo +2867A=>niǔ +2867B=>nà +2867D=>qín +2868D=>bì +28693=>bì +28694=>bāo +28695=>biàn +28696=>zī +28697=>nà +28698=>wèi +28699=>háo +286A1=>jǐn +286A3=>zhèng +286A7=>qié +286AE=>hào +286AF=>tóng +286B0=>zǎo +286B1=>shèng +286B2=>cún +286B3=>huāng +286B4=>rú +286B5=>zài +286B6=>nián +286BE=>xiān +286C8=>quán +286C9=>jì +286CA=>yín +286CB=>lǐ +286CC=>máng +286CD=>shào +286CE=>hàn +286CF=>cuò +286D0=>jùn +286D1=>jì +286D2=>bù +286D3=>lòng +286D4=>fǒu +286D5=>yóu +286D6=>kuài +286DC=>xiàng +286E1=>yún +286E3=>qín +286E4=>huí +286E5=>pú +286EB=>lí +286EC=>péi +286ED=>shū +286EE=>jū +286EF=>yí +286F0=>zhēng +286F1=>chóng +286F3=>xí +286F5=>hǔ +286F6=>róu +2870C=>huàn +2870D=>qiào +2870E=>zhī +2870F=>yíng +28710=>xǐ +28711=>qiāo +28712=>jì +28713=>zhēng +28714=>huáng +28716=>yú +28717=>zōu +28718=>méi +2871C=>shěng +28729=>quán +28730=>jiāng +28731=>hé +28733=>tóng +28734=>hé +28735=>wēn +28736=>yì +28737=>páng +2873A=>wēng +2873B=>qián +2873C=>lì +2873D=>yí +2873E=>chuàng +2873F=>xù +28740=>wěi +28746=>gē +28748=>yǔ +2874B=>zhài +2874C=>gān +2874D=>qiān +2874E=>kāng +2874F=>lí +28750=>shēn +28751=>guàn +28753=>piáo +28756=>lí +28758=>hǔ +2875B=>tú +2875C=>shùn +2875E=>hù +2875F=>lí +28762=>lòu +28766=>dàng +28768=>zuò +28769=>shān +2876B=>shè +2876D=>féng +2876E=>jù +2876F=>tóng +28770=>jiǎo +28771=>qiáo +28772=>gāo +28773=>zī +28774=>huáng +28775=>shān +28778=>tán +2878C=>tuō +2878E=>lìng +28790=>chéng +28791=>wèng +28792=>zuó +28793=>yù +28795=>zhú +28797=>qún +28798=>xǐ +28799=>qú +2879B=>gé +287A2=>qī +287A3=>xū +287A8=>gài +287A9=>què +287AA=>chóu +287AB=>méng +287B2=>shēn +287B3=>qú +287B6=>qiāo +287B7=>cán +287BA=>lì +287BC=>wàn +287BD=>léi +287BE=>xīng +287BF=>láng +287C2=>shì +287C3=>zhēng +287C4=>fán +287CA=>zhì +287CF=>yín +287D1=>lì +287D6=>mó +287D7=>wěi +287D9=>yīng +287DA=>ráng +287E0=>quān +287E5=>luǒ +287F2=>dài +287F4=>yìn +287F5=>bǐ +287F6=>gē +287F8=>wèn +287F9=>yǎn +287FA=>miǎn +287FC=>gǎng +287FD=>qiú +287FE=>zhī +2880B=>gū +2880C=>tóng +2880E=>líng +2880F=>tí +28810=>cí +28811=>yí +28812=>fàn +28813=>pō +28814=>bì +28816=>bào +2881F=>pēng +28821=>suān +28824=>sōng +28825=>wéi +28826=>xiáo +2882C=>hào +2882D=>yǎn +28836=>yí +28837=>zāo +28838=>yǐng +28839=>nǎn +2883F=>zā +28841=>tiǎn +28842=>xī +28843=>jiào +28844=>yán +2884C=>néi +2884D=>tǎn +2884E=>yàn +2884F=>tiǎn +28850=>zhì +28851=>chōu +28852=>táo +28857=>zhà +2885E=>miǎn +28861=>wǔ +28862=>yǐn +28863=>yàn +28864=>lǎo +28869=>pō +2886B=>hùn +2886C=>hǎi +2886D=>mú +2886E=>cōng +28871=>kù +28872=>chōu +28874=>yǒu +28878=>zhuó +2887B=>sōu +28882=>yìn +28885=>zuì +28886=>sāng +28887=>liù +28888=>hàn +28889=>wèi +2888A=>méng +2888B=>hú +2888C=>lì +2888E=>mì +28890=>bāng +28891=>jiǎn +2889C=>què +288A0=>méng +288A2=>mú +288A3=>hǒng +288A4=>hù +288A5=>mí +288A6=>shài +288A9=>shāng +288AA=>chào +288AC=>zhuó +288AE=>zhī +288AF=>niàn +288B5=>jì +288B8=>kē +288B9=>zhēng +288BF=>dān +288C0=>liǎo +288C1=>zhǎn +288C2=>gǒng +288C3=>láo +288C4=>huā +288C5=>chuài +288C7=>jiǎn +288C8=>kuì +288CD=>shē +288D4=>chěn +288D5=>tǎn +288D7=>hú +288D8=>méng +288D9=>pào +288DA=>zhǎn +288DB=>cháng +288DD=>gǎn +288E0=>yì +288E2=>suì +288E6=>xù +288E7=>jì +288E8=>làn +288EC=>yí +288EF=>mì +288F1=>miè +288F5=>cuán +288F8=>lǎn +288FB=>yān +288FE=>mí +28902=>yǒng +28903=>cáng +28904=>jiǎn +28907=>sōu +2890E=>yán +28911=>juàn +28915=>è +28918=>fèn +2891A=>fèn +28921=>guàng +28922=>mái +28924=>liě +28929=>chōng +2892B=>lí +28931=>zhí +28934=>xiè +28937=>chóu +28939=>jí +2893D=>pī +28942=>jié +28947=>zhǒu +2894D=>xiōng +28951=>kuàng +28959=>jǐng +2895B=>hù +2895E=>qián +28963=>cén +28966=>qí +28967=>wǎn +28968=>máo +2896A=>dǒu +28974=>kǒu +28976=>dài +28978=>náo +2897A=>hóng +28982=>lǎi +28983=>duǒ +28984=>qiān +28986=>yín +28996=>lòu +28997=>huī +2899B=>fù +2899C=>máo +2899E=>zhōu +289A1=>yóng +289AD=>láo +289AE=>jí +289AF=>yì +289B0=>liú +289B1=>cōng +289B3=>nǎn +289D0=>tūn +289D1=>xiàng +289D5=>biàn +289D6=>chuáng +289D7=>wù +289D9=>jū +289E5=>xiē +289E6=>pī +289E7=>zhuó +289E8=>ruì +289EA=>sào +289EB=>zì +289ED=>zhèng +289F0=>zú +289F1=>qū +289F3=>chì +289F5=>zhì +28A17=>quàn +28A18=>qiān +28A19=>yā +28A1A=>chào +28A1B=>hé +28A1C=>rǔ +28A20=>jū +28A21=>wù +28A2C=>chì +28A2D=>kuàng +28A2F=>còu +28A30=>ruàn +28A31=>kuò +28A32=>chí +28A33=>zú +28A34=>jiāo +28A36=>yú +28A37=>tú +28A38=>méng +28A39=>dā +28A3A=>shuò +28A65=>fēng +28A66=>gǒu +28A67=>dōng +28A68=>chǎ +28A69=>mào +28A6A=>chǎn +28A6B=>biān +28A6C=>yù +28A6F=>wán +28A70=>zú +28A72=>zī +28A74=>chuān +28A75=>wǎn +28A76=>wā +28A78=>quān +28A7B=>wǎn +28A7D=>xià +28A84=>yìng +28A85=>jiàn +28A88=>wěi +28A89=>tí +28A8A=>sāo +28A8C=>qí +28A8D=>shā +28A8E=>yù +28A8F=>jí +28A90=>dòu +28A91=>chǎn +28A92=>tuán +28A95=>liú +28A97=>zhuì +28AB3=>ruàn +28AB6=>yàn +28AB7=>gǔ +28AB9=>lì +28ABA=>chā +28ABE=>dì +28AC0=>zhǎn +28AC1=>pō +28AD2=>lòu +28AD4=>zhì +28B01=>lián +28B05=>luǒ +28B0D=>duò +28B10=>jué +28B11=>lì +28B12=>lán +28B14=>ruàn +28B15=>gū +28B16=>chán +28B17=>xū +28B1A=>zhǐ +28B41=>xuè +28B42=>bō +28B43=>chēng +28B45=>zhù +28B46=>hēi +28B49=>bān +28B53=>dié +28B56=>zhǎn +28B57=>guó +28B5A=>biāo +28B5B=>là +28B7A=>jīn +28B82=>gǎi +28B92=>mèng +28B94=>yù +28BAA=>xǐ +28BAC=>piāo +28BAD=>sī +28BB4=>dèng +28BB8=>chuō +28BB9=>dí +28BBA=>jī +28BBB=>chán +28BBF=>zhuó +28BD3=>cài +28BDE=>jiàng +28BF2=>tóu +28BFD=>lí +28C02=>qiàn +28C06=>chuō +28C0F=>tà +28C11=>diào +28C13=>jiǎn +28C1B=>zhǐ +28C1C=>jué +28C1E=>mó +28C20=>luó +28C26=>bǎo +28C2D=>zuǎn +28C35=>zhē +28C38=>yú +28C3B=>bǎo +28C3E=>mǎ +28C3F=>xì +28C40=>hù +28C41=>yì +28C42=>é +28C43=>gū +28C44=>tú +28C45=>zhēn +28C47=>qiú +28C48=>sù +28C49=>liàng +28C4A=>qū +28C4B=>líng +28C4C=>guàn +28C4D=>láng +28C4E=>tōu +28C4F=>dā +28C50=>lòu +28C51=>huáng +28C52=>shòu +28C53=>jiāo +28C54=>zūn +28C55=>gǎi +28C56=>wéi +28C59=>kūn +28C5A=>duàn +28C5B=>sōng +28C5C=>qí +28C5D=>yǎng +28C61=>shì +28C63=>gǎi +28C66=>dào +28C67=>yǎo +28C6B=>qián +28C6D=>shāo +28C6E=>cháng +28C6F=>miǔ +28C71=>mó +28C75=>nǎo +28C78=>cōng +28C7A=>niè +28C7B=>zhāo +28C7C=>cén +28C7F=>sōng +28C80=>niè +28C81=>cì +28C84=>jùn +28C86=>shāo +28C88=>zhú +28C89=>duǒ +28C8A=>àn +28C8B=>bī +28C8E=>tì +28C90=>pǐ +28C91=>xiá +28C92=>qiú +28C93=>shěng +28C97=>tāng +28C9B=>mán +28C9C=>piān +28C9E=>tì +28C9F=>róng +28CA7=>cōng +28CAA=>jī +28CAB=>féng +28CAC=>wù +28CAD=>jiào +28CAE=>láo +28CAF=>zēng +28CB0=>péng +28CB1=>cǎn +28CB3=>nóng +28CB5=>chǎn +28CBE=>mán +28CBF=>guì +28CC0=>niào +28CC1=>chōng +28CC2=>chàn +28CC6=>nàng +28CC9=>xiā +28CCA=>jiū +28CCB=>jǐ +28CCC=>zhèn +28CD1=>tǐng +28CD4=>mén +28CD5=>yuè +28CD7=>zhōng +28CD8=>tún +28CD9=>ruì +28CDA=>xiè +28CDB=>xī +28CDD=>tǐng +28CDE=>niǔ +28CE0=>wǎng +28CE1=>jiān +28CE3=>fēn +28CF2=>biàn +28CF7=>yí +28CFA=>dié +28CFB=>jī +28CFC=>gǎn +28CFF=>jiān +28D00=>jiōng +28D06=>kāi +28D0A=>què +28D0C=>nán +28D0D=>móu +28D0E=>xù +28D0F=>sǒng +28D10=>shèn +28D11=>kuāng +28D12=>què +28D13=>wéi +28D17=>dié +28D18=>nán +28D1A=>ruò +28D1B=>gōng +28D1C=>dòu +28D1E=>niǎn +28D21=>chāo +28D22=>hé +28D23=>yàn +28D29=>tú +28D2A=>bǔ +28D2C=>hú +28D2D=>yǒng +28D2F=>shǐ +28D30=>chù +28D39=>xiāo +28D3A=>mén +28D3B=>lǐ +28D3C=>tí +28D3E=>jiān +28D42=>zhǐ +28D43=>guā +28D44=>guǎn +28D46=>qì +28D48=>fēi +28D49=>yǔ +28D4A=>zhé +28D4B=>wěi +28D4C=>ě +28D4D=>chān +28D4E=>xī +28D50=>gǔ +28D57=>què +28D58=>huì +28D5A=>xié +28D5B=>yīng +28D5D=>tà +28D5E=>wāi +28D5F=>fú +28D60=>jiè +28D61=>pì +28D65=>shěng +28D66=>yú +28D67=>kuā +28D69=>pì +28D6A=>xié +28D6B=>nüè +28D6C=>xiàn +28D6D=>jiàn +28D6E=>xù +28D70=>bì +28D74=>nán +28D76=>liáng +28D78=>pián +28D7C=>jìng +28D80=>tǎ +28D81=>yàn +28D82=>ài +28D85=>xiāo +28D86=>qiāng +28D87=>wǔ +28D88=>táng +28D8A=>jùn +28D90=>kuò +28D97=>làng +28D99=>něng +28D9C=>dòu +28D9D=>shú +28D9F=>jiǎo +28DA0=>niè +28DA2=>yú +28DA8=>cè +28DAA=>jiǎo +28DAC=>huà +28DAD=>wén +28DAE=>yē +28DAF=>é +28DB0=>guāng +28DB1=>huā +28DB2=>jiāo +28DBA=>lèi +28DBC=>shāng +28DBD=>yòng +28DBF=>dēng +28DC0=>guān +28DC1=>niú +28DC3=>suì +28DC4=>xiàng +28DC6=>sà +28DC7=>chāng +28DCE=>rùn +28DD0=>yūn +28DD2=>fēn +28DD3=>jiàn +28DD4=>xù +28DD8=>xì +28DD9=>shú +28DE5=>xié +28DE6=>lì +28DE9=>tóu +28DEC=>mǐ +28DED=>chǎn +28DEE=>huō +28DF1=>zhuǎn +28DF2=>yuè +28DFB=>lán +28DFD=>yán +28DFE=>dàng +28DFF=>xiàng +28E00=>yuè +28E01=>tǐng +28E02=>bēng +28E03=>sàn +28E04=>xiàn +28E05=>dié +28E06=>pì +28E07=>pián +28E09=>tǎ +28E0B=>jiāo +28E0C=>yē +28E0E=>yuè +28E10=>réng +28E11=>qiǎo +28E12=>qí +28E13=>diāo +28E14=>qí +28E17=>hàn +28E18=>yuán +28E19=>yóu +28E1A=>jí +28E1B=>gài +28E1C=>hāi +28E1D=>shì +28E1F=>qū +28E29=>wèn +28E2C=>zhèn +28E2D=>pō +28E2E=>yán +28E2F=>gū +28E30=>jù +28E31=>tiàn +28E37=>è +28E3A=>yā +28E3B=>lìn +28E3C=>bì +28E40=>zǐ +28E41=>hóng +28E43=>duǒ +28E45=>duì +28E46=>xuàn +28E48=>shǎn +28E4A=>shǎn +28E4B=>yáo +28E4C=>rǎn +28E54=>tuó +28E57=>bīng +28E58=>xù +28E59=>tūn +28E5A=>chéng +28E5C=>dòu +28E5D=>yì +28E61=>chè +28E75=>juǎn +28E76=>jī +28E78=>zhào +28E79=>bēng +28E7B=>tiǎn +28E80=>pēng +28E85=>fù +28E96=>tuǒ +28E98=>xián +28E99=>nì +28E9A=>lóng +28E9D=>zhuó +28E9F=>zhēng +28EA0=>shǔn +28EA1=>zōng +28EA2=>fēng +28EA3=>duàn +28EA4=>pì +28EA5=>yǎn +28EA6=>sǒu +28EA7=>qiú +28EA8=>è +28EA9=>qián +28EAB=>qiǎn +28EAD=>cā +28EAE=>xùn +28EB5=>zhuì +28EB8=>mǎo +28EB9=>jiǎo +28EBF=>zhǎn +28EC0=>pí +28EC1=>xī +28EC2=>yàn +28EC3=>fèi +28EC4=>niè +28EC6=>zhì +28EC8=>suǒ +28ECA=>yì +28ECC=>lěi +28ECD=>xù +28ECF=>yì +28ED2=>wēi +28ED5=>jī +28ED6=>chēn +28ED7=>dié +28EE3=>yuán +28EE5=>xí +28EE7=>liú +28EE8=>suǒ +28EF1=>bēng +28EF2=>xià +28EF3=>yàn +28EF5=>cuī +28EF7=>kāng +28EFA=>qīng +28EFB=>lóu +28EFC=>bī +28F08=>zhàn +28F09=>cuàn +28F0A=>wú +28F0B=>xū +28F0C=>chēn +28F0D=>háo +28F0E=>jué +28F10=>chèn +28F11=>chá +28F12=>chǎn +28F13=>zhí +28F14=>xún +28F23=>gé +28F24=>chén +28F25=>yè +28F2A=>chǔ +28F2B=>qú +28F2C=>xiè +28F2E=>zhàn +28F2F=>kěn +28F31=>jué +28F3D=>qú +28F3F=>méng +28F40=>yè +28F41=>zōu +28F42=>pú +28F44=>shì +28F49=>shǔ +28F4A=>chán +28F4D=>dú +28F4F=>guō +28F50=>lù +28F51=>yān +28F56=>niǎo +28F57=>bīn +28F5F=>tuí +28F66=>nì +28F67=>huān +28F68=>qián +28F6F=>xià +28F72=>líng +28F77=>lián +28F79=>yì +28F7B=>lì +28F7C=>sì +28F7F=>dài +28F82=>wèi +28F85=>cì +28F89=>jiǔ +28F8A=>hóng +28F8C=>yú +28F8E=>kuí +28F92=>háng +28F93=>gē +28F94=>fàng +28F97=>kuí +28F9A=>guī +28F9B=>chǐ +28F9E=>jiǔ +28FA1=>suī +28FA4=>dié +28FAC=>suǐ +28FB0=>qín +28FB4=>guī +28FBB=>zhuī +28FBE=>tiào +28FC1=>yuè +28FC7=>zuǐ +28FCF=>wú +28FD0=>cuǐ +28FDB=>zhì +28FE0=>shuì +28FE2=>dōng +28FED=>wéi +28FFF=>chǒng +2900B=>rún +29016=>jí +2901C=>diāo +2901E=>cāng +29020=>kòu +29023=>wéi +29027=>cán +2902A=>má +2902B=>òu +29032=>sǎn +29036=>wéi +2903C=>sǎn +2903F=>jīn +2904C=>wéi +2905E=>cài +2905F=>lí +2906F=>yuè +29074=>yūn +29077=>chēng +2907A=>shān +29082=>hū +29083=>shài +29084=>tún +29086=>fǒu +29088=>qìn +29089=>xū +2908D=>chuān +2908E=>fù +29092=>yì +29093=>dōng +29094=>fú +29095=>fú +29096=>zé +29097=>pù +29099=>líng +2909D=>shài +2909E=>pào +290A2=>yín +290A3=>luò +290A4=>huà +290A5=>yìn +290A6=>bèng +290A7=>yū +290A8=>shè +290AA=>xiè +290AB=>chǔ +290B4=>shè +290B5=>diàn +290B9=>yì +290BB=>chè +290BC=>gěng +290BD=>lóng +290BE=>píng +290BF=>yǔn +290C0=>yàn +290C1=>mò +290C3=>suī +290CB=>jìng +290CD=>sòng +290CE=>páng +290D0=>yá +290D1=>sè +290D2=>duǒ +290D5=>chuáng +290D6=>xiè +290D8=>tuán +290D9=>gōng +290DA=>xuàn +290DC=>lā +290DE=>líng +290E0=>dài +290E1=>zhá +290EC=>yīn +290ED=>sōng +290EF=>yǔ +290F0=>tuó +290F1=>tuó +290F4=>bà +290F5=>rǎn +290F6=>bó +290F7=>dài +290F9=>zhá +290FA=>hóu +290FE=>huǐ +29105=>lú +2910A=>lìng +2910B=>rú +29115=>dàn +29116=>méng +29117=>xià +29118=>wěng +29119=>hán +2911A=>zī +2911B=>zhèn +2911C=>sè +2911D=>cuó +2911E=>lì +29120=>diān +29121=>lián +29122=>gòu +29126=>péng +2912A=>yīng +2912C=>hòu +2912E=>duì +2912F=>wù +29137=>piào +29138=>hè +2913A=>lóng +2913B=>mò +2913C=>fěi +2913D=>lǚ +2913E=>zé +2913F=>bó +29140=>diàn +29141=>mǎng +29143=>zhuàng +29144=>lù +29145=>pāng +29146=>duì +29147=>bù +2914C=>chēn +2914D=>màn +29156=>xī +2915D=>ǎn +2915E=>zhōng +29160=>nàn +29161=>tuò +29162=>hé +29165=>duì +29166=>wān +29167=>zhōng +29168=>cén +29169=>lì +2916A=>shuāng +2916E=>cén +29170=>sī +29172=>duì +29174=>hūn +2917C=>jiān +2917D=>nóng +2917E=>dàn +2917F=>fù +29180=>huò +29181=>huì +29182=>cí +29184=>yǒng +29185=>sà +29186=>tíng +2918E=>liù +29191=>suān +29192=>líng +29193=>mán +29194=>diàn +29198=>pāo +2919A=>líng +2919D=>lì +2919F=>nóu +291A3=>liè +291A4=>shǎn +291A6=>fèi +291AB=>shǎn +291AE=>líng +291AF=>zhàn +291B1=>bīn +291B2=>lí +291B5=>sī +291B6=>ráng +291B7=>jiān +291B8=>zhuó +291BB=>líng +291BC=>líng +291BD=>mèng +291BF=>shuāng +291C4=>líng +291C7=>hùn +291CE=>líng +291CF=>jiān +291D0=>qú +291D4=>nóng +291D5=>jìng +291D6=>chēn +291DC=>zhēn +291DD=>qìng +291DF=>qìng +291E0=>è +291E3=>sè +291E9=>bèi +291EB=>fēi +291EE=>fèi +291EF=>féi +291F4=>fāng +291F5=>kǔ +291FA=>zá +291FB=>huì +291FD=>féi +29201=>duì +29206=>pā +29207=>niǔ +29208=>pàng +29209=>dàn +2920A=>dān +2920B=>ài +2920D=>tiǎn +2920E=>chǎo +2920F=>ǎo +29210=>mèi +29211=>nǎn +29214=>bò +29215=>yù +29216=>xiān +29217=>mài +2921A=>pīng +2921C=>duī +2921E=>dào +29221=>xìng +29222=>nì +29223=>hān +29224=>chù +29225=>shuǎ +29226=>mǎn +2922C=>wàn +2922D=>yì +2922E=>diào +2922F=>yān +29231=>wò +29232=>suàn +29234=>ǎn +29235=>lán +29236=>nǎn +29238=>qiǔ +29239=>miàn +2923A=>nuǒ +2923B=>cán +2923C=>cǎn +29240=>làn +29241=>tiǎn +29242=>yè +29244=>niǎn +29246=>shuǎ +2924B=>cí +2924D=>jiǎn +29250=>gàn +29254=>jiàn +29255=>guó +29257=>zhān +29259=>luǒ +2925C=>jī +2925D=>guì +29261=>jiá +29262=>jǐ +29265=>xuàn +29267=>fēng +2926B=>bì +2926C=>qí +2926F=>yuán +29270=>àng +29271=>dī +29274=>è +29275=>fén +29278=>jù +29279=>nǐ +2927A=>tuó +2927C=>shēn +2927D=>fú +2927E=>xiá +2927F=>qú +29280=>pò +29281=>wǎn +29282=>líng +29283=>mà +29284=>zhòu +29285=>bào +29287=>yù +2928C=>běng +2928D=>mài +2928F=>jiā +29291=>yǎng +29293=>kuǎ +29294=>jiào +29296=>bǐng +2929A=>luò +2929B=>guǐ +2929C=>duò +2929D=>zhì +292A1=>zhèn +292A2=>è +292A3=>zhū +292A4=>bá +292A8=>zhèn +292A9=>fēng +292AA=>dòu +292AB=>niǎn +292AC=>bù +292AD=>duì +292AE=>shā +292AF=>sè +292B0=>bì +292B4=>zhì +292B5=>zhé +292B6=>bù +292BA=>jué +292BB=>xùn +292BF=>xì +292C1=>zhuó +292C2=>bài +292C3=>yáo +292C4=>chǒu +292C5=>tà +292C6=>qiān +292C8=>nào +292C9=>yù +292CA=>è +292CB=>jiān +292CC=>yì +292CD=>xiāo +292CF=>niè +292D2=>bīng +292D7=>guǒ +292D8=>xié +292D9=>diào +292DC=>jū +292DD=>suǒ +292DE=>dié +292DF=>fú +292E0=>miǎn +292E1=>shì +292E2=>xuàn +292E3=>tí +292E4=>yù +292E7=>xié +292E8=>fú +292E9=>zhì +292EA=>nǐ +292EB=>xuàn +292EC=>yáng +292EE=>fěng +292EF=>zòng +292F0=>zhòu +292F1=>xuān +292F5=>zhū +292F7=>la +292F9=>yìng +292FA=>gào +292FB=>kuò +292FD=>é +292FE=>wéi +292FF=>méi +29303=>huái +29304=>chǒu +29306=>suǒ +29307=>tà +29308=>suǒ +29309=>tà +2930A=>xuè +2930C=>gǒng +2930D=>jiǎ +2930F=>bó +29310=>tà +29311=>yuǎn +29318=>tà +2931D=>chuí +29320=>xiōng +29321=>hé +29322=>suō +29327=>mò +29328=>chóng +29329=>suī +2932A=>zé +2932B=>lù +2932C=>zhāng +2932D=>luò +2932E=>xù +2932F=>jiān +29330=>shān +29332=>xù +2933E=>jiǎng +29342=>bào +29343=>mái +29345=>tóng +29346=>xì +29349=>róng +2934B=>shéng +2934C=>zhòu +2934E=>jiān +2934F=>fù +29350=>dèng +29353=>yōng +29354=>jū +29356=>yì +29357=>bāng +29359=>sè +2935A=>suì +2935C=>duó +2935D=>xiè +29361=>huán +29365=>rǔ +29366=>nǐ +29367=>zhòu +29368=>guì +2936A=>luò +29372=>zhī +29373=>xù +29375=>zhī +29377=>jué +29378=>jū +2937B=>yuán +2937C=>lú +2937F=>bó +29382=>róng +29383=>xiè +29389=>xǐ +2938A=>luó +2938E=>gé +29391=>zuān +29392=>hàn +29394=>jiāo +29395=>sǎ +29396=>qín +29397=>qūn +29398=>páo +29399=>yuè +2939A=>chè +2939B=>fú +2939C=>pēi +2939F=>mèi +293A2=>tāo +293A4=>kēn +293A5=>xì +293AB=>duò +293AD=>yì +293B0=>suì +293B2=>xiá +293B3=>juān +293B5=>wéi +293B7=>yì +293B9=>yù +293BB=>bài +293BC=>tuó +293BD=>tà +293BE=>páo +293C2=>bǐng +293C5=>yùn +293C6=>yùn +293C7=>duàn +293C8=>ruǎn +293C9=>wéi +293CF=>wěi +293D0=>guì +293D2=>dá +293D3=>xiá +293D6=>hùn +293D7=>juǎn +293D8=>suī +293DA=>suì +293DD=>lóu +293DE=>bài +293DF=>yù +293E0=>zhèng +293E1=>guì +293E3=>kuī +293E4=>gāo +293E5=>dān +293E9=>xiǎn +293EA=>zhái +293EB=>sè +293ED=>kē +293EE=>bǔ +293EF=>bó +293F2=>suì +293F4=>yù +293F5=>bǔ +293F6=>jiū +293F7=>jiū +293F9=>juàn +293FA=>jué +293FC=>nà +293FD=>zhái +293FE=>tāo +293FF=>wěi +29400=>xiá +29401=>xiè +29405=>sà +29406=>jī +29409=>xiè +2940C=>duì +2940D=>zǐ +29418=>yuǎn +29419=>qìn +2941A=>fú +2941B=>péng +2941C=>páo +2941E=>yìn +29420=>hōng +29421=>zú +29423=>gōng +29424=>dòng +29425=>hē +29426=>wò +29428=>pāng +2942B=>sù +2942C=>kǎn +2942D=>niè +2942E=>háo +2942F=>fèng +29430=>è +29431=>yè +29434=>tíng +29435=>dòng +29436=>zhé +29437=>sāng +2943B=>mò +2943C=>sù +2943E=>lè +29440=>pǔ +29441=>é +29442=>zhuó +29443=>yè +29447=>xiāng +29448=>guàng +29449=>rěn +2944A=>líng +2944D=>ào +29450=>chāi +29452=>duó +29453=>qióng +29454=>kū +29455=>xū +29456=>huán +29457=>yāo +29458=>zhèn +29459=>tǐng +2945A=>běng +2945D=>áng +2945F=>kān +29461=>kū +29462=>péi +29463=>yòu +29464=>ǎo +29465=>mén +29466=>mò +2946C=>fǔ +2946D=>qīng +2946E=>là +2946F=>dǒu +29470=>tǎn +29473=>qiǎn +29474=>yào +29475=>wèi +29476=>hú +29477=>mò +29478=>hē +29479=>xuàn +2947B=>bì +2947C=>pō +2947E=>dī +29480=>zhěn +29482=>shī +29483=>kǎn +29484=>cè +29487=>xū +29488=>zhěn +2948A=>zhǔ +2948F=>huì +29490=>chǐ +29493=>hǒng +29494=>nóu +29495=>niè +29496=>yàn +29498=>chǒng +29499=>fǔ +2949A=>guāng +2949B=>qī +2949D=>gěn +2949E=>tǐng +294A2=>tǎn +294A3=>qiǎn +294A6=>jiù +294A7=>xū +294A8=>qǐ +294AA=>zhèn +294AE=>qiú +294B0=>ě +294B3=>huì +294B4=>hòng +294B5=>qǐng +294B7=>chē +294BA=>fù +294BC=>hōng +294BD=>xī +294BE=>wú +294BF=>máng +294C2=>tī +294C5=>hōng +294D0=>bó +294D2=>qǐn +294D3=>gěn +294D6=>fú +294D7=>kuǐ +294DD=>bié +294DE=>jìng +294DF=>kǎn +294E0=>guī +294E2=>gǎo +294E3=>xū +294E4=>àn +294E5=>yuè +294E6=>wù +294E7=>yí +294E8=>jīng +294EA=>lù +294EB=>quán +294EC=>tuí +294EE=>jì +294FA=>jiǒng +294FB=>jué +294FC=>piē +294FD=>kūn +29500=>wài +29501=>huì +29502=>dùn +29503=>yuǎn +29504=>jié +29506=>guì +29507=>gǎo +29508=>pò +29509=>mén +2950A=>zhuàn +2950B=>hàng +29514=>yóng +29515=>qiú +29517=>lèi +29518=>áng +29519=>pǐ +2951A=>wēng +2951D=>qìn +2951F=>qǐn +29520=>miè +29521=>dōu +29522=>mí +29523=>zhān +29525=>qǐng +29526=>yí +2952E=>bān +29531=>juān +29533=>zé +29534=>xù +29535=>lán +29536=>má +29537=>má +29538=>ōu +29539=>bēi +2953B=>póu +2953C=>xù +29540=>ào +29546=>hǒng +29549=>hǒng +2954A=>zhǎn +2954C=>sěn +2954D=>gǎo +2954F=>pó +29550=>liào +29555=>wài +29556=>xuān +2955C=>kuí +2955F=>è +29560=>hàn +29561=>sè +29564=>dàn +2956A=>xuān +2956C=>è +2956D=>gài +2956F=>dāo +29571=>měng +29572=>yī +29573=>nǐng +29575=>pín +29579=>cāng +2957E=>yuàn +29580=>è +29581=>niè +29584=>yǐn +29587=>qiāo +29589=>hōng +2958A=>líng +2958C=>chān +2958D=>yǐng +29592=>guān +29594=>niǎo +29595=>xū +29596=>tán +29597=>jìn +2959B=>péng +2959D=>liáo +295A0=>bèi +295A3=>xín +295A4=>tún +295A5=>chāo +295A6=>gān +295A8=>hū +295A9=>wǎng +295AC=>fú +295AD=>pèi +295AF=>náo +295B0=>xún +295B1=>xuè +295B4=>liǔ +295B5=>líng +295B6=>xuè +295B7=>qū +295B8=>háo +295B9=>yí +295BA=>hàn +295BC=>fú +295BD=>bá +295BE=>yí +295C0=>bó +295C4=>hōng +295C5=>lì +295C9=>sà +295CA=>xī +295CE=>shì +295CF=>piāo +295D0=>huà +295D1=>yí +295D2=>bó +295D3=>bó +295D4=>něi +295D5=>qiú +295D8=>wěi +295D9=>chè +295DA=>yóu +295DC=>wèi +295DD=>huǐ +295DE=>sà +295E2=>hòng +295E3=>sōu +295E4=>hàn +295E5=>páo +295E7=>fáng +295E9=>liú +295EA=>zhòu +295EB=>pí +295ED=>lì +295F0=>chuí +295F1=>xī +295F2=>zhēng +295F4=>bèng +295F5=>zhěng +295F6=>suì +295F7=>yǎn +295FC=>qīng +295FD=>wù +295FE=>liǎng +29600=>zhào +29601=>liáng +29605=>jiē +29607=>hōng +29608=>yōu +2960A=>là +2960B=>hòu +2960D=>yuàn +2960E=>hóng +2960F=>yè +29611=>yǐng +29612=>xuǎn +29613=>yóu +29618=>quán +2961C=>táng +2961D=>suǒ +2961F=>lì +29620=>sōu +29621=>lì +29624=>yù +29627=>yì +2962D=>xiū +2962E=>áo +2962F=>tuán +29630=>sù +29631=>shuài +29633=>yù +29635=>fēng +29639=>sù +2963A=>tuí +2963B=>yù +2963C=>zhēng +2963D=>zhēng +2963F=>táo +29644=>liú +29646=>chéng +29647=>suí +29648=>sāo +2964F=>gǔ +29650=>fēng +29651=>liè +29652=>piāo +29656=>lì +29658=>lóng +29659=>chū +2965A=>xiāo +2965B=>hōng +2965C=>xiè +2965D=>shè +29660=>lóng +29661=>hōu +29662=>xuán +29663=>fēng +29665=>bá +29666=>bó +29667=>táo +29668=>sù +29669=>zhào +2966A=>biāo +2966B=>sōu +2966C=>tuí +2966D=>suǒ +2966E=>xiāo +2966F=>héng +29670=>sāo +29672=>fēi +29677=>niù +29678=>mǎng +2967D=>huán +2967E=>zhī +29682=>yì +29684=>yù +29687=>yí +29688=>yuē +29689=>chí +29695=>yǐn +29696=>niù +29697=>rǒng +2969B=>nà +296A3=>tián +296A5=>bā +296AA=>ěr +296AB=>zhēng +296AC=>è +296AD=>póu +296AE=>jī +296AF=>ní +296B1=>jiǒng +296B2=>jiá +296B5=>gān +296B9=>líng +296BB=>zuì +296BE=>bèi +296C5=>shū +296C6=>yǐ +296C7=>pāi +296CB=>nǎo +296CC=>shì +296CE=>mǎn +296CF=>shì +296D1=>tí +296D8=>gōng +296DD=>lèi +296DE=>bǎo +296DF=>yuān +296E0=>zuō +296E1=>láng +296E2=>xiū +296E5=>zài +296E6=>chèng +296E7=>jiān +296E8=>mào +296E9=>jiá +296EA=>yù +296ED=>yù +296EE=>yí +296F2=>māng +296F3=>zài +296F5=>zhuì +296F6=>tí +296F9=>xì +296FA=>jú +296FB=>zàn +296FC=>lù +296FD=>táo +29700=>zhuì +29701=>líng +29703=>jù +29706=>jī +29707=>juǎn +2970A=>zī +2970C=>yuē +2970D=>dōng +29712=>nǎng +29716=>chóng +2971F=>àng +29723=>gēng +29725=>bō +29726=>dìng +29727=>wěi +2972C=>quán +2972D=>kē +29730=>pì +29731=>kǎn +29732=>fú +29733=>yǒng +29735=>tuán +29736=>tǒu +29737=>yòu +29738=>yāo +2973A=>yē +2973D=>yàn +29748=>xián +2974A=>tí +2974C=>suì +29750=>cí +29754=>xǔ +29755=>wù +29756=>cān +29757=>yù +2975A=>chǎn +2975B=>xiá +2975D=>kào +2975E=>cāng +2975F=>chā +29760=>qiǔ +29763=>dā +29765=>sù +29768=>huā +29777=>wū +29778=>yuān +2977D=>jiàng +2977E=>xiǎng +2977F=>zhāi +29780=>sǎn +29781=>mó +29783=>shǎng +29784=>cáo +29785=>suī +29786=>chuáng +29787=>mí +29788=>zhú +29789=>chóng +2978A=>jì +2978B=>chóng +29799=>lián +2979E=>hài +297A4=>dūn +297A5=>xiǎng +297A6=>chēng +297A7=>shǎng +297A8=>lì +297A9=>huáng +297AC=>dèng +297AF=>liáng +297B6=>zā +297BA=>huò +297BB=>lín +297BE=>dú +297BF=>hàn +297C0=>yōng +297C1=>yuàn +297C2=>guò +297C3=>líng +297C5=>liǎn +297C7=>ào +297C8=>dāng +297C9=>yì +297CA=>nóng +297CB=>shàn +297CD=>xìn +297D0=>dá +297D1=>yù +297D2=>cān +297D3=>wò +297D4=>chá +297D5=>bó +297D7=>jiǎn +297DE=>méng +297DF=>wěi +297E0=>mó +297E5=>shuì +297E6=>jié +297E7=>shuò +297E8=>huò +297EB=>chuò +297ED=>lóng +297EE=>huài +297F0=>tuō +297F3=>yú +297F6=>chàn +297F7=>yōng +297F8=>huò +297FA=>lǎn +297FF=>nà +29800=>bā +29801=>gān +29802=>yǐ +29803=>jiá +29805=>dá +29806=>dìng +29807=>xùn +29808=>rěn +29809=>juǎn +2980A=>tuán +2980B=>xǔ +2980C=>sòng +2980E=>cáo +2980F=>chēng +29811=>dǐng +2981A=>hái +2981F=>wǔ +29826=>qǐ +29828=>jī +2982E=>kuí +2982F=>wéi +29836=>shǒu +29837=>fú +29839=>tuán +2983B=>bié +2983D=>tán +2983E=>hāng +2983F=>piē +29843=>yú +29844=>tán +2984C=>xiāng +2984E=>xiū +29853=>wěng +29854=>hài +29855=>péng +2985D=>tán +2985F=>bié +29860=>xiāng +29863=>yǐ +29866=>piáo +29867=>huán +29868=>mǔ +29869=>bā +2986B=>fàn +2986F=>dīng +29877=>fēn +2987A=>jiè +2987E=>suó +29884=>wàn +29885=>gē +29888=>fēn +2988A=>tuó +2988C=>wén +2988D=>guā +2988E=>duō +29890=>zhé +29891=>cǐ +29892=>yǎo +29894=>bàn +29895=>bù +29896=>mò +29898=>pǒ +2989B=>gé +2989E=>liú +298A1=>rǎn +298A8=>gān +298AA=>hú +298AB=>móu +298AE=>xiū +298AF=>huāng +298B0=>fú +298B1=>huí +298B3=>qú +298B4=>jié +298B5=>tuō +298B6=>yú +298B7=>mò +298B8=>zhōu +298B9=>jiù +298BB=>shú +298BC=>kuāng +298BD=>qióng +298BE=>liè +298BF=>fù +298CA=>xù +298D6=>lìn +298D8=>niè +298DA=>pī +298DC=>fù +298DD=>bù +298DE=>yì +298E1=>bó +298E3=>é +298E9=>zhé +298EB=>lì +298EE=>tù +298EF=>dá +298F1=>lù +298F2=>yān +298F3=>dōng +298F4=>qiè +298F5=>wǎn +298F6=>mǐng +298F7=>zuī +298F8=>fù +298F9=>qū +298FA=>bēn +298FB=>ǎo +298FC=>qiāng +29901=>qūn +29908=>què +29909=>huá +2990A=>xiàn +2990B=>kùn +2990F=>cuì +29912=>yí +29916=>chī +29917=>zòng +29918=>nǎo +29919=>chéng +2991A=>duān +2991B=>yóng +2991C=>zhě +2991E=>tàn +2991F=>yáng +29920=>xié +29921=>xuān +29923=>duàn +29924=>shuǎ +29925=>xián +29926=>xián +29929=>é +29932=>lā +29938=>wèi +29939=>yōu +2993A=>yú +2993D=>tī +2993F=>jīn +29941=>táng +29942=>qí +29944=>diān +29945=>tāo +29946=>lǜ +29947=>zhàn +29948=>wēn +29949=>jì +2994A=>āo +2994B=>òu +2994C=>qià +29950=>shī +29951=>tǎ +29954=>mò +29958=>yóu +29960=>zhá +29963=>yáo +2996B=>chōng +2996C=>lí +2996D=>yú +2996E=>chǎn +2996F=>yī +29972=>chì +29974=>lí +2997D=>tú +2997F=>zú +29982=>xián +29987=>xì +29989=>bié +2998A=>hán +2998B=>qí +2998C=>sāng +2998E=>fēi +29990=>shàn +29998=>huān +299A0=>bàng +299A1=>yú +299A2=>yú +299A4=>jí +299B1=>kuǎi +299B2=>zōng +299B9=>xiàn +299BA=>méng +299C3=>lì +299C4=>zhì +299C5=>fán +299C6=>liè +299C7=>cài +299C8=>dú +299C9=>guāng +299CA=>xiòng +299CB=>lí +299CC=>qì +299CF=>jué +299D0=>tuō +299D2=>jù +299D3=>xiāo +299D8=>qú +299DC=>zhuǎn +299E1=>jué +299E6=>jiè +299E8=>zhòu +299E9=>xiàn +299EA=>lóng +299EB=>yǎng +299EC=>rǎn +299ED=>yì +299EE=>liè +299EF=>bō +299F0=>hún +299F1=>jì +299F2=>dòng +299F3=>zhōu +299F4=>quān +299F5=>jié +299FA=>jú +299FC=>bēn +299FF=>bī +29A00=>gé +29A01=>chǔn +29A03=>qián +29A04=>sōu +29A05=>wèi +29A06=>chéng +29A07=>lóu +29A08=>yú +29A09=>lā +29A0A=>qián +29A0B=>diān +29A0C=>tǎ +29A0D=>zhàn +29A0F=>fán +29A10=>liè +29A11=>tīng +29A12=>jī +29A13=>qiān +29A14=>hú +29A17=>yú +29A18=>qì +29A19=>yú +29A1A=>wā +29A1C=>bà +29A1D=>qí +29A1E=>sǎ +29A1F=>qiāo +29A20=>yà +29A21=>xiǎn +29A28=>cī +29A29=>fàn +29A2B=>kǔn +29A2C=>gǔn +29A2D=>quē +29A2E=>è +29A2F=>qióng +29A32=>mà +29A33=>kū +29A34=>yǎo +29A37=>quē +29A38=>chū +29A39=>jiǎ +29A3B=>zhǔ +29A3D=>duī +29A3E=>wá +29A40=>nǎo +29A44=>yán +29A45=>tóng +29A4B=>xíng +29A4C=>gǔn +29A4D=>pīng +29A51=>yǔ +29A52=>hè +29A54=>zhuó +29A57=>shē +29A58=>yǔ +29A5B=>jì +29A5D=>qiāng +29A5E=>shuì +29A5F=>chuò +29A60=>zú +29A61=>léng +29A62=>ní +29A64=>wā +29A65=>zhá +29A67=>dàn +29A6E=>dù +29A6F=>biàn +29A70=>jiē +29A71=>qià +29A72=>hé +29A73=>chòng +29A74=>yán +29A76=>yàn +29A7A=>sóng +29A7B=>téng +29A7C=>yǎo +29A7E=>kāo +29A80=>zhuī +29A81=>guì +29A82=>ái +29A83=>hài +29A88=>suǒ +29A89=>xù +29A8A=>biāo +29A8C=>fèng +29A8D=>qū +29A8E=>mǎng +29A90=>guó +29A96=>bì +29A97=>jué +29A98=>chuáng +29A9B=>pú +29A9F=>yì +29AA2=>qiān +29AA3=>yì +29AA4=>è +29AA5=>líng +29AA7=>bì +29AAD=>huò +29AAE=>mǒ +29AB1=>xūn +29AB4=>yàn +29AB8=>lì +29ABA=>tán +29ABE=>luán +29AC0=>kài +29AC1=>mào +29AC2=>xiāo +29AC7=>ǎi +29ACA=>tǎ +29ACD=>mèi +29ACF=>guō +29AD3=>gǎo +29AD4=>náo +29AD5=>háo +29AE0=>quē +29AE5=>cáo +29AE6=>sào +29AEB=>pí +29AF2=>xiē +29AF3=>xiāo +29AF4=>jú +29AF9=>chéng +29AFA=>nǎo +29B00=>nèi +29B0D=>mǔ +29B0F=>shāo +29B11=>diān +29B14=>líng +29B16=>zhěn +29B17=>yǎo +29B19=>fù +29B1A=>qián +29B1B=>qióng +29B1C=>jú +29B1D=>bìng +29B1E=>máo +29B1F=>zhà +29B20=>tāi +29B24=>chōng +29B2B=>zhǎi +29B2D=>shī +29B2E=>yòng +29B30=>qióng +29B31=>dào +29B32=>tì +29B33=>zhuǐ +29B35=>yìn +29B37=>nǎo +29B38=>bō +29B39=>kuāng +29B3A=>zhǐ +29B3B=>duǒ +29B3C=>cōng +29B3D=>bǎo +29B47=>lí +29B4A=>jú +29B4B=>wén +29B4C=>liè +29B4F=>wǒ +29B50=>shǐ +29B51=>niǎo +29B52=>máng +29B53=>jiū +29B58=>xiū +29B5D=>wō +29B5F=>dào +29B61=>xī +29B62=>àn +29B63=>dá +29B64=>zǒng +29B65=>hàn +29B66=>chuí +29B67=>bī +29B69=>dòng +29B6B=>zhǎng +29B6F=>yā +29B72=>dí +29B73=>huō +29B77=>mín +29B7A=>fù +29B7C=>bǎo +29B7D=>kè +29B7E=>máo +29B7F=>rè +29B80=>zōng +29B81=>qià +29B82=>xiā +29B83=>sōu +29B84=>xiū +29B85=>nà +29B89=>mán +29B8E=>zhā +29B8F=>chán +29B90=>shè +29B91=>wǒ +29B96=>ái +29B97=>bàng +29B98=>hāo +29B9A=>sāo +29B9B=>suǒ +29B9C=>tì +29B9D=>yà +29B9F=>bìng +29BA0=>róng +29BAB=>shā +29BAC=>wěng +29BAF=>áo +29BB1=>zhuāng +29BB3=>piào +29BB4=>suī +29BB5=>yī +29BB6=>sōu +29BB7=>dōu +29BB8=>sōu +29BB9=>luó +29BC3=>fèi +29BC4=>zùn +29BC6=>nào +29BC7=>dēng +29BC8=>zhí +29BC9=>cuō +29BCA=>liáo +29BCB=>jǐ +29BCC=>bō +29BCD=>cóng +29BCE=>chéng +29BCF=>bǔ +29BD1=>sān +29BD2=>zàn +29BD8=>jiào +29BDB=>yào +29BDC=>lǔ +29BDE=>càn +29BE8=>nǐ +29BF0=>jié +29BF1=>pú +29BF2=>zhuàng +29BF3=>zàn +29BFA=>lì +29BFD=>là +29C00=>chōng +29C03=>zhàn +29C0D=>biàn +29C0E=>wēng +29C13=>hòng +29C17=>pīn +29C19=>sè +29C1E=>nǐ +29C1F=>fēn +29C20=>xǔ +29C22=>shǐ +29C24=>jù +29C28=>jué +29C2A=>yù +29C2C=>guō +29C2D=>guō +29C2F=>hú +29C32=>lì +29C33=>xié +29C34=>ér +29C35=>yuán +29C36=>hái +29C39=>jìng +29C3B=>kè +29C3D=>zōng +29C3E=>fèi +29C40=>pēng +29C41=>gēng +29C43=>jiān +29C44=>ní +29C46=>xián +29C47=>lì +29C48=>chǎo +29C4A=>ér +29C4B=>gēng +29C4C=>yù +29C4D=>hú +29C4E=>fèi +29C4F=>áo +29C53=>ěr +29C58=>kè +29C59=>kù +29C5A=>bó +29C5D=>yè +29C5E=>jiào +29C66=>chǎo +29C67=>gēng +29C68=>rù +29C6A=>yuè +29C6C=>lín +29C71=>yù +29C72=>yuè +29C73=>zhāi +29C74=>xiāo +29C77=>miè +29C7B=>guǐ +29C7C=>jiū +29C7E=>tuò +29C81=>xí +29C82=>wěi +29C83=>zhuó +29C84=>wèi +29C85=>kuí +29C88=>mèi +29C8A=>hào +29C8B=>hāng +29C8C=>fāng +29C8D=>niú +29C8E=>yòu +29C8F=>huà +29C92=>làng +29CA0=>zhú +29CA1=>guǐ +29CA2=>bì +29CA3=>jiǎ +29CA4=>tiáo +29CA6=>lǜ +29CA7=>kǒng +29CA8=>zuǐ +29CA9=>líng +29CAA=>qí +29CAC=>zhú +29CB1=>gǔ +29CB2=>zù +29CB4=>yāng +29CB5=>sū +29CB7=>kuí +29CB9=>chāng +29CBB=>yáo +29CBE=>yù +29CC5=>shū +29CC6=>lài +29CC7=>yì +29CC8=>dōu +29CCC=>wú +29CCD=>yǐng +29CCE=>fú +29CCF=>zhuàn +29CD0=>fǔ +29CD2=>sù +29CD3=>lǐ +29CD4=>yào +29CD5=>tuì +29CDD=>guì +29CE1=>lǜ +29CE2=>yàn +29CE3=>qí +29CE4=>làng +29CE5=>zhú +29CE7=>guǐ +29CE8=>hū +29CEF=>jīng +29CF2=>chǐ +29CF5=>jú +29CF6=>zhá +29CF8=>miáo +29D00=>zhū +29D01=>gān +29D02=>xiōng +29D03=>jí +29D07=>shài +29D08=>mèi +29D09=>yùn +29D0D=>shòu +29D10=>lǜ +29D11=>yòu +29D12=>jiàng +29D13=>nuó +29D18=>jù +29D19=>yòu +29D1C=>yì +29D1D=>téng +29D1E=>wéi +29D1F=>chě +29D20=>lìn +29D21=>gù +29D23=>lì +29D24=>liào +29D27=>jiāo +29D28=>yáng +29D29=>biāo +29D2A=>qí +29D2E=>yì +29D31=>bīn +29D32=>méng +29D33=>chà +29D35=>gān +29D39=>qú +29D3A=>dí +29D3B=>léi +29D40=>líng +29D44=>huān +29D45=>qú +29D47=>luó +29D49=>kuí +29D4D=>qiú +29D4E=>yǔ +29D4F=>huà +29D53=>lèi +29D55=>rèn +29D56=>xiǎo +29D57=>sì +29D5A=>dù +29D5B=>biē +29D60=>niú +29D62=>hè +29D63=>pēi +29D65=>fèi +29D66=>mù +29D69=>fū +29D6C=>hú +29D6D=>wáng +29D6E=>shā +29D70=>jiāo +29D71=>wǔ +29D79=>fù +29D81=>bǐng +29D82=>zhù +29D84=>zhú +29D85=>chī +29D87=>shěn +29D88=>hū +29D89=>bū +29D8E=>rǎn +29D96=>mù +29D98=>lì +29D9B=>jiā +29D9E=>mà +29DA1=>méng +29DA2=>móu +29DA3=>zhōu +29DA4=>xiǎn +29DA5=>huǐ +29DA6=>guài +29DA7=>jiù +29DA9=>mù +29DAB=>rù +29DAD=>wú +29DAF=>rú +29DB1=>zhà +29DC1=>nuǒ +29DC2=>xié +29DC4=>jiàng +29DCB=>lǐ +29DCC=>shū +29DCD=>yì +29DCE=>dí +29DCF=>qíng +29DD0=>jú +29DD3=>zhì +29DD5=>láng +29DD6=>bù +29DD7=>kuáng +29DD8=>yì +29DDA=>bó +29DE7=>chì +29DED=>jiàng +29DEF=>wò +29DF0=>xùn +29DF5=>tūn +29DF6=>máng +29DF8=>fáng +29DF9=>zhuó +29DFB=>qià +29DFD=>tǎ +29DFE=>qí +29E00=>pèng +29E01=>biē +29E02=>fèn +29E03=>tù +29E04=>huà +29E07=>è +29E0B=>è +29E0E=>dìng +29E10=>rú +29E16=>è +29E1E=>yàn +29E1F=>sì +29E25=>yíng +29E26=>ní +29E27=>ní +29E28=>yí +29E39=>mí +29E3E=>yé +29E3F=>pō +29E40=>còu +29E42=>wèi +29E44=>hài +29E45=>yīng +29E47=>tíng +29E48=>zhì +29E49=>fēi +29E4A=>yóu +29E4D=>kuí +29E4E=>àn +29E4F=>bà +29E51=>hàn +29E5E=>nán +29E5F=>nài +29E62=>jīng +29E65=>wēi +29E71=>chù +29E73=>suǒ +29E74=>tāo +29E75=>qí +29E76=>táng +29E77=>wěi +29E78=>gǎn +29E7A=>gé +29E7C=>hàn +29E7E=>nà +29E7F=>gé +29E84=>zhēng +29E97=>tǎ +29E9B=>sī +29E9D=>nì +29E9E=>sǎng +29EAB=>xié +29EAF=>zú +29EB0=>yú +29EB1=>nì +29EB2=>qī +29EB5=>shēn +29EBC=>bū +29ECB=>kūn +29ECC=>lí +29ECE=>guā +29ED6=>yǎn +29ED7=>bù +29ED8=>jiàn +29EDA=>wú +29EDB=>cén +29EDC=>lín +29EDD=>zhuàn +29EDF=>huī +29EE1=>tóng +29EE2=>zhǎ +29EE4=>hēi +29EE7=>guǒ +29EF1=>jǐng +29EF5=>dié +29EF7=>yíng +29EFC=>zhì +29F02=>wěi +29F04=>jì +29F05=>rǒng +29F08=>ào +29F09=>dāng +29F0A=>luó +29F0B=>yè +29F0C=>wēi +29F12=>qiáng +29F19=>gé +29F1A=>jì +29F26=>zòu +29F28=>yí +29F2B=>zhǎ +29F2D=>liè +29F34=>yè +29F3C=>zhān +29F40=>chóu +29F41=>biāo +29F46=>xù +29F47=>yōu +29F4D=>xiè +29F4E=>wéi +29F4F=>lì +29F5B=>bó +29F5C=>jiǎn +29F5D=>chán +29F5E=>kūn +29F61=>qíng +29F67=>shuāng +29F68=>xī +29F69=>qú +29F70=>luó +29F73=>dǎng +29F74=>nián +29F75=>lǐ +29F77=>bà +29F79=>è +29F7A=>fū +29F7B=>fù +29F7C=>hǔn +29F7D=>zhà +29F7E=>ān +29F81=>qiú +29F82=>chóu +29F83=>miǎn +29F84=>xùn +29F85=>tù +29F86=>ní +29F87=>hu +29F88=>shū +29F8A=>xū +29F8B=>zhòng +29F8C=>kāng +29F92=>xiāo +29F93=>xiāo +29F94=>cì +29F95=>chì +29F97=>diāo +29F98=>yì +29F9A=>dīng +29F9D=>hàn +29F9E=>wán +29FA0=>yǐ +29FA1=>bào +29FA2=>yì +29FA7=>xùn +29FAC=>xiáng +29FB3=>bí +29FB6=>jié +29FB7=>gē +29FB8=>zè +29FBA=>zhèn +29FBB=>hú +29FBC=>xī +29FBD=>xīn +29FBE=>xiāo +29FBF=>fù +29FC0=>zhòng +29FC2=>mào +29FC3=>xīn +29FC4=>qiāng +29FC8=>fén +29FC9=>bān +29FCA=>huān +29FD1=>jiāo +29FD3=>bào +29FD4=>yā +29FD5=>yáo +29FDB=>xì +29FDD=>jù +29FDF=>qù +29FE0=>yuè +29FE1=>tái +29FE2=>tǒu +29FE3=>mò +29FE4=>zhá +29FE5=>qú +29FE7=>fū +29FE9=>qú +29FEA=>chì +29FEC=>yóu +29FF7=>tí +29FFA=>wā +29FFD=>tuó +29FFF=>chú +2A001=>gē +2A008=>yuān +2A009=>gē +2A00A=>qú +2A00F=>jù +2A012=>dié +2A013=>yí +2A014=>shī +2A015=>yì +2A017=>guǐ +2A018=>jiàng +2A01A=>sōng +2A01B=>qióng +2A01D=>è +2A01E=>huāng +2A01F=>huí +2A020=>xún +2A023=>jú +2A025=>zhái +2A026=>chì +2A027=>lǎo +2A029=>qí +2A02A=>xiū +2A02C=>huī +2A02D=>tóng +2A03A=>fù +2A03D=>xún +2A03E=>jié +2A03F=>mǐ +2A040=>yù +2A048=>zhuàng +2A049=>jiāo +2A04A=>zhì +2A04B=>chéng +2A04D=>jié +2A04E=>xiāo +2A04F=>chén +2A050=>lí +2A051=>yuè +2A053=>zhì +2A054=>láo +2A055=>wò +2A056=>qú +2A058=>wāng +2A05A=>yī +2A05B=>yì +2A05C=>láng +2A05E=>tóu +2A05F=>ān +2A060=>jué +2A061=>yàn +2A065=>jù +2A067=>zhèn +2A069=>zhì +2A06A=>mǎng +2A06E=>xiù +2A071=>chuáng +2A072=>chū +2A078=>qiāng +2A079=>fēi +2A07A=>cháng +2A07C=>mián +2A07D=>sù +2A07E=>ǎo +2A080=>fǔ +2A084=>wèi +2A085=>zhī +2A086=>mín +2A087=>chāng +2A088=>yán +2A089=>yù +2A08B=>fù +2A08C=>tà +2A08D=>jǐ +2A08F=>fèi +2A092=>hú +2A093=>jū +2A095=>yǔ +2A09B=>qí +2A09C=>méi +2A09F=>biē +2A0A0=>guǒ +2A0A4=>mìng +2A0A6=>wǎn +2A0A7=>wǎn +2A0B4=>jīng +2A0B5=>yù +2A0B6=>xián +2A0B9=>chūn +2A0BA=>jí +2A0BC=>xiāng +2A0BD=>pén +2A0BE=>fù +2A0C2=>liú +2A0C4=>sāi +2A0C5=>xuē +2A0C6=>zòu +2A0C8=>jié +2A0CB=>zhān +2A0CD=>yú +2A0CE=>yú +2A0CF=>méi +2A0D0=>miǎo +2A0D1=>mào +2A0D2=>duó +2A0D3=>fù +2A0DB=>jiàn +2A0E6=>miáo +2A0E8=>āo +2A0ED=>kè +2A0F6=>hóu +2A0FA=>gòu +2A0FC=>xī +2A0FE=>róng +2A0FF=>gē +2A100=>pán +2A101=>yuán +2A102=>xià +2A105=>shā +2A106=>pī +2A108=>qíng +2A109=>yōng +2A10A=>qú +2A10C=>gòng +2A10E=>gé +2A10F=>xiān +2A111=>sù +2A115=>bān +2A116=>qí +2A117=>hòu +2A11B=>xī +2A11D=>wū +2A12D=>qī +2A12E=>hù +2A12F=>guī +2A131=>dí +2A132=>shāng +2A133=>mài +2A134=>mǐn +2A135=>jì +2A136=>xí +2A137=>xiān +2A138=>jí +2A139=>cháng +2A13A=>kòu +2A13B=>chōng +2A142=>zhāng +2A143=>piǎo +2A144=>sù +2A145=>lüè +2A146=>lí +2A147=>mèng +2A148=>chōng +2A149=>tiān +2A14B=>líng +2A14D=>chì +2A156=>chōng +2A159=>chì +2A15D=>niǎo +2A15F=>yóng +2A16E=>mì +2A170=>shū +2A172=>xì +2A174=>è +2A175=>zī +2A178=>jié +2A179=>jī +2A17A=>hōu +2A17B=>shèng +2A17C=>lì +2A17E=>qī +2A180=>zhōu +2A181=>sī +2A182=>qú +2A18B=>xié +2A197=>sī +2A19B=>xū +2A1A0=>fù +2A1AF=>nóng +2A1B0=>yà +2A1B1=>liú +2A1B2=>jiǎ +2A1B3=>guī +2A1B4=>kuí +2A1B5=>chì +2A1B6=>càn +2A1B7=>chú +2A1B9=>guō +2A1BB=>dǎn +2A1BF=>jiàn +2A1C1=>dāng +2A1C2=>hòu +2A1C4=>kòu +2A1C6=>chù +2A1C7=>qiān +2A1C8=>ài +2A1CA=>pì +2A1D1=>xùn +2A1D2=>jīng +2A1D3=>mèng +2A1D5=>bīn +2A1D6=>lán +2A1D7=>gǔ +2A1D8=>chóu +2A1DB=>yōng +2A1DC=>guá +2A1DD=>yú +2A1DE=>zhòu +2A1ED=>cài +2A1EF=>liú +2A1F0=>bǔ +2A1F1=>luò +2A1F2=>jié +2A1F3=>zhēn +2A1F4=>miè +2A1F5=>guǎng +2A1F7=>jiá +2A1F9=>là +2A200=>shòu +2A203=>guō +2A206=>mèng +2A207=>qián +2A208=>lài +2A20A=>hé +2A20B=>tuán +2A211=>huī +2A218=>hōng +2A21C=>lǚ +2A21F=>jiá +2A225=>guī +2A228=>yī +2A229=>huān +2A230=>luó +2A234=>jué +2A238=>guàn +2A23B=>quán +2A23C=>niǎo +2A23F=>mán +2A242=>yùn +2A243=>wén +2A244=>chì +2A245=>chì +2A246=>zhī +2A248=>cí +2A249=>zhuàng +2A24A=>huá +2A24B=>jié +2A24C=>qú +2A24D=>tū +2A24E=>mín +2A24F=>méi +2A250=>yú +2A251=>áo +2A252=>bān +2A254=>pī +2A255=>zhēn +2A256=>lǔ +2A257=>chì +2A258=>tóu +2A25A=>jiē +2A25C=>zhān +2A262=>jīn +2A263=>lǔ +2A266=>jiàn +2A267=>tàn +2A268=>chāng +2A26A=>cì +2A26D=>wāi +2A26E=>còu +2A26F=>kàn +2A271=>biàn +2A278=>wēn +2A27B=>qiān +2A27F=>gàn +2A282=>huì +2A284=>gǎn +2A286=>jì +2A287=>gàn +2A289=>huái +2A28D=>sì +2A290=>fū +2A295=>pí +2A297=>cā +2A29C=>bèn +2A2A2=>shǐ +2A2A5=>huán +2A2A7=>guī +2A2AA=>ǒu +2A2B3=>páo +2A2B5=>yǐng +2A2B6=>tǐng +2A2B7=>xiào +2A2B9=>zhù +2A2BB=>yú +2A2C1=>jiàn +2A2C4=>qǔ +2A2C5=>wǎn +2A2C6=>kūn +2A2C7=>zhuī +2A2C9=>yù +2A2CA=>guǒ +2A2CB=>píng +2A2CC=>zuǐ +2A2CD=>zú +2A2CF=>zhū +2A2D0=>nuàn +2A2D1=>zhū +2A2D6=>piāo +2A2D7=>mí +2A2DC=>bì +2A2DD=>sù +2A2E1=>pú +2A2E2=>mí +2A2EB=>yè +2A2EC=>yǔ +2A2EE=>yù +2A2F0=>zhǔ +2A2F3=>líng +2A2FA=>nòu +2A2FE=>líng +2A300=>liǎo +2A302=>tuō +2A304=>bǐ +2A305=>nà +2A306=>qú +2A308=>pí +2A309=>dǒu +2A30A=>niè +2A30B=>tún +2A30D=>jī +2A30F=>líng +2A313=>kù +2A314=>sù +2A318=>tǒu +2A31E=>nái +2A31F=>zé +2A322=>tǒng +2A323=>gé +2A324=>duī +2A327=>jié +2A329=>tián +2A32A=>tiào +2A32B=>chí +2A32C=>qū +2A32E=>shā +2A330=>bó +2A331=>lí +2A333=>luò +2A335=>liáo +2A336=>shù +2A337=>děng +2A339=>chī +2A33A=>miè +2A33C=>táo +2A33D=>hún +2A33F=>nié +2A341=>jùn +2A342=>hù +2A344=>lù +2A345=>yè +2A347=>mò +2A348=>chào +2A34C=>suò +2A34E=>kē +2A34F=>fù +2A351=>chǎo +2A354=>suǒ +2A357=>qiū +2A35B=>sù +2A35D=>yùn +2A35F=>suǒ +2A360=>kū +2A361=>bó +2A363=>lǒu +2A364=>mò +2A366=>liǎn +2A367=>xuàn +2A368=>suǒ +2A369=>mán +2A36A=>bì +2A372=>tì +2A374=>lián +2A375=>tán +2A376=>shàn +2A378=>qú +2A379=>dú +2A37A=>huán +2A37B=>sào +2A37F=>kuàng +2A383=>niè +2A385=>niè +2A386=>luó +2A387=>zuó +2A388=>yì +2A389=>xiàn +2A38A=>chǎo +2A38B=>tiè +2A392=>shuò +2A394=>mǐ +2A397=>mí +2A39B=>wǎn +2A39D=>bèn +2A39E=>qiāng +2A3A0=>mǒ +2A3A3=>liú +2A3A4=>wò +2A3A6=>měi +2A3A8=>tóu +2A3AB=>mǔ +2A3AD=>méi +2A3B2=>zuò +2A3B4=>tún +2A3B5=>kàng +2A3B6=>tún +2A3BA=>chè +2A3BB=>zhèng +2A3BD=>chōng +2A3BE=>tiān +2A3C0=>zhì +2A3C1=>chán +2A3C2=>chán +2A3C5=>qīng +2A3C6=>tūn +2A3C7=>huǐ +2A3C8=>què +2A3C9=>zhān +2A3CA=>jiān +2A3CB=>chán +2A3CD=>huáng +2A3CF=>huī +2A3D0=>chí +2A3D2=>huáng +2A3D3=>héng +2A3D4=>yǔn +2A3D6=>tuān +2A3D7=>biān +2A3D9=>huáng +2A3DA=>yǔn +2A3DF=>mò +2A3E0=>gōng +2A3E2=>gōng +2A3E4=>guì +2A3E6=>chán +2A3E8=>què +2A3E9=>ruì +2A3EA=>kuàng +2A3EB=>piào +2A3EE=>rǔ +2A3F2=>niǔ +2A3F3=>hù +2A3F4=>jǐn +2A3F5=>nì +2A3F6=>bào +2A3F8=>nǐ +2A3FA=>bì +2A3FB=>hú +2A3FC=>lí +2A3FF=>zhū +2A400=>nǎ +2A402=>quǎn +2A403=>fěng +2A404=>bǐ +2A405=>lí +2A406=>bié +2A407=>nián +2A408=>dǒng +2A40B=>lián +2A40C=>nì +2A40D=>lián +2A40E=>má +2A40F=>zhé +2A413=>jiā +2A414=>yí +2A416=>lǒng +2A418=>yì +2A41D=>dài +2A41E=>dù +2A423=>yǐ +2A425=>tài +2A426=>hāng +2A427=>shù +2A42C=>wán +2A42E=>sù +2A42F=>yǎo +2A430=>èr +2A432=>zhèn +2A43A=>dòu +2A43B=>jiān +2A43F=>pāng +2A440=>huī +2A442=>chà +2A443=>shān +2A444=>lú +2A446=>yù +2A448=>yàn +2A449=>wǎn +2A44A=>qiào +2A44B=>luō +2A44C=>yù +2A44F=>tú +2A450=>wèi +2A452=>tùn +2A455=>hǔn +2A456=>bēn +2A457=>qiè +2A459=>jīn +2A45A=>lái +2A45C=>zhǐ +2A45D=>yú +2A45F=>cì +2A466=>yè +2A467=>dié +2A468=>chà +2A469=>diàn +2A46A=>mán +2A46C=>dèng +2A46D=>wēi +2A46E=>niǎn +2A46F=>lèi +2A470=>bīng +2A471=>wū +2A473=>zhěn +2A476=>róu +2A477=>wài +2A478=>mì +2A479=>jiè +2A47B=>hóu +2A47D=>zhài +2A47E=>rǔ +2A47F=>zī +2A480=>pán +2A482=>mò +2A484=>mì +2A486=>qī +2A487=>mò +2A48A=>zhī +2A48B=>bān +2A48D=>miè +2A48F=>lù +2A491=>qī +2A492=>chōng +2A494=>lí +2A495=>yì +2A498=>dèng +2A499=>cuō +2A49B=>duì +2A49C=>mà +2A49D=>yǎn +2A49F=>zèng +2A4A0=>yǎn +2A4A1=>duì +2A4A2=>pū +2A4A5=>yuè +2A4A9=>huò +2A4AA=>mài +2A4AB=>jiǎn +2A4AC=>nóng +2A4AD=>qín +2A4AF=>qín +2A4B2=>yè +2A4B4=>tái +2A4B9=>jiān +2A4BC=>chá +2A4BE=>dàn +2A4BF=>téng +2A4C0=>lì +2A4C3=>niǎng +2A4C4=>chán +2A4C5=>zāng +2A4CA=>yù +2A4CC=>zuì +2A4CD=>biān +2A4D0=>chǔ +2A4D8=>rán +2A4DA=>rán +2A4DB=>yāng +2A4DC=>bǒ +2A4E1=>cù +2A4EC=>mí +2A4EE=>kě +2A4F0=>cù +2A4F7=>xí +2A4F9=>má +2A4FB=>shī +2A4FC=>diān +2A4FF=>shī +2A502=>dǐng +2A503=>jiōng +2A505=>yuán +2A506=>gān +2A50A=>huì +2A50B=>jī +2A50D=>péng +2A50F=>dēng +2A511=>bèng +2A514=>pāng +2A515=>tà +2A517=>yuān +2A518=>gāo +2A519=>yuān +2A51F=>jiā +2A523=>kōng +2A526=>dòng +2A529=>xián +2A52A=>qì +2A52C=>sāng +2A530=>yìn +2A533=>lóng +2A536=>tēng +2A537=>lóng +2A53A=>rèn +2A53D=>yìn +2A53E=>píng +2A53F=>pū +2A540=>yuán +2A541=>rǒng +2A543=>fāng +2A547=>hāng +2A548=>mí +2A549=>hú +2A54A=>zī +2A54C=>líng +2A54D=>jiōng +2A54E=>rǒng +2A552=>píng +2A553=>guāng +2A554=>ěr +2A55D=>cù +2A55E=>jùn +2A566=>xiǔ +2A568=>ér +2A569=>tì +2A56B=>yáng +2A56D=>ài +2A56E=>hú +2A56F=>xí +2A571=>hú +2A573=>sī +2A574=>lǐ +2A576=>yì +2A577=>gǔ +2A579=>táng +2A580=>què +2A581=>zōng +2A582=>lí +2A584=>jiào +2A587=>fán +2A588=>pú +2A589=>sī +2A58B=>jié +2A58C=>lú +2A58D=>lì +2A58E=>chán +2A590=>yào +2A595=>huī +2A599=>hōu +2A59A=>diān +2A59B=>qiù +2A59C=>jué +2A59E=>pì +2A5A2=>kuī +2A5A5=>xǐ +2A5A6=>tī +2A5A9=>xù +2A5AF=>biǎn +2A5B2=>hē +2A5B3=>lián +2A5B6=>sù +2A5B7=>liào +2A5BC=>jīn +2A5C1=>lì +2A5C2=>chán +2A5C5=>qí +2A5C6=>qí +2A5C9=>zī +2A5CB=>zī +2A5CD=>qí +2A5CF=>qí +2A5D0=>zī +2A5D2=>zhāi +2A5D3=>zhāi +2A5D4=>pà +2A5D6=>jū +2A5D9=>yǎn +2A5DC=>háng +2A5DD=>nà +2A5E4=>yǎn +2A5E6=>zhàn +2A5E7=>shǐ +2A5E8=>zhí +2A5ED=>zhā +2A5F4=>rǒng +2A5F5=>zhā +2A5F7=>yì +2A5F8=>míng +2A5F9=>yá +2A5FB=>zhì +2A5FD=>kuò +2A5FE=>xiá +2A600=>pián +2A601=>tà +2A603=>yǐ +2A606=>xiū +2A607=>zhāi +2A609=>duǒ +2A60A=>è +2A60E=>yín +2A610=>è +2A611=>suān +2A612=>ān +2A613=>cuó +2A615=>tuó +2A617=>tuó +2A618=>xiá +2A61B=>chuò +2A61D=>suān +2A625=>jì +2A626=>qiǎn +2A627=>zú +2A628=>zhāi +2A629=>yǔn +2A62A=>zhàn +2A62C=>yí +2A632=>yá +2A633=>yuē +2A639=>hé +2A63A=>qià +2A63E=>chā +2A643=>óu +2A648=>hú +2A64A=>yàn +2A64C=>qiè +2A64D=>bó +2A64E=>qiāng +2A64F=>jiè +2A65B=>nì +2A65E=>chǎn +2A65F=>qǐn +2A661=>zāo +2A664=>yǐn +2A665=>xiè +2A667=>qí +2A668=>jiàn +2A66B=>xū +2A66D=>zèng +2A66F=>è +2A673=>zū +2A674=>yǐ +2A679=>zhí +2A67A=>lì +2A67D=>lì +2A67E=>yín +2A681=>lián +2A683=>chán +2A685=>jué +2A687=>zá +2A68E=>zhāi +2A68F=>pián +2A691=>lóng +2A693=>lóng +2A698=>lóng +2A69D=>lóng +2A6A0=>lóng +2A6A2=>mǎng +2A6A5=>zhé +2A6AC=>gàn +2A6AD=>gōu +2A6AE=>rán +2A6AF=>cù +2A6B0=>jiāo +2A6B7=>bǒ +2A6B9=>zhù +2A6BA=>qiū +2A6BB=>yāng +2A6C0=>xiào +2A6C2=>huí +2A6C3=>qū +2A6C8=>líng +2A6CA=>yín +2A6CE=>pì +2A6D2=>lián +2A79D=>duó +2A848=>bái +2A84F=>zhān +2A8AE=>luán +2AA0A=>sóng +2AA17=>juē +2AA9D=>yōng +2AEB9=>nǔ +2AED0=>cōng +2AFA2=>xiàn +2B061=>lì +2B088=>fèi +2B099=>sù +2B0DC=>kòu +2B128=>chī +2B138=>xūn +2B230=>qià +2B2D0=>gǒng +2B300=>jī +2B328=>luó +2B359=>yì +2B35F=>yí +2B362=>náo +2B370=>xǐ +2B372=>xiǎo +2B3CB=>juē +2B404=>yuè +2B406=>kuài +2B409=>líng +2B410=>ní +2B413=>bù +2B4B6=>hán +2B4E7=>fū +2B4E9=>cōng +2B50E=>jué +2B5E0=>zhāng +2B5E6=>bù +2B5E7=>sù +2B5EE=>huáng +2B5F4=>zhān +2B61D=>jué +2B623=>hàn +2B624=>ái +2B628=>tí +2B688=>xù +2B689=>hóng +2B692=>fú +2B694=>huí +2B695=>shī +2B699=>pū +2B6DB=>zhī +2B6DE=>jué +2B6E2=>níng +2B6F6=>chì +2B6F8=>tí \ No newline at end of file diff --git a/pkg/common/pinyin/pinyin_test.go b/pkg/common/pinyin/pinyin_test.go new file mode 100644 index 0000000..d2e71f0 --- /dev/null +++ b/pkg/common/pinyin/pinyin_test.go @@ -0,0 +1,9 @@ +package pinyin + +import "testing" + +func TestTo_Py(t *testing.T) { + LoadingPYFile("./pinyin.txt") + s, _ := PY("3425另264325一4个44平444台") + println(s) +} diff --git a/pkg/common/req/req.go b/pkg/common/req/req.go new file mode 100644 index 0000000..1042f4b --- /dev/null +++ b/pkg/common/req/req.go @@ -0,0 +1,30 @@ +package req + +const ( + defaultPage = 1 + defaultSize = 10 +) + +type Page struct { + Page int64 `json:"page" form:"page" uri:"page"` + Size int64 `json:"size" form:"size" uri:"size"` +} + +func (p *Page) check() { + if p.Page < 1 { + p.Page = defaultPage + } + if p.Size <= 0 { + p.Size = defaultSize + } +} + +func (p *Page) Offset() int { + p.check() + return int(p.Page*p.Size - p.Size) +} + +func (p *Page) Limit() int { + p.check() + return int(p.Size) +} diff --git a/pkg/common/util/string_util.go b/pkg/common/util/string_util.go new file mode 100644 index 0000000..09a6d43 --- /dev/null +++ b/pkg/common/util/string_util.go @@ -0,0 +1,154 @@ +package util + +import ( + "crypto/md5" + "encoding/hex" + "encoding/json" + "fmt" + "net/url" + "sort" + "strconv" + "strings" + "time" +) + +const ( + PhotoDomainUrl = "https://photo-app.ddegame.cn/" + TimeLayout = "2006-01-02 15:04:05" + DateLayout = "2006-01-02" + DateLayoutShort = "20060102" +) + +func FullPhotoUrl(path string) string { + if len(path) == 0 { + return "" + } + if strings.Index(path, "http") == 0 { + return path + } + return PhotoDomainUrl + path +} + +func Md5ForList(s ...string) string { + sort.Strings(s) + h := md5.New() + h.Write([]byte(strings.Join(s, ""))) + return hex.EncodeToString(h.Sum(nil)) +} + +func StringToInt(source string) int { + target, _ := strconv.Atoi(source) + return target +} + +func StringToFloat(source string) float64 { + target, _ := strconv.ParseFloat(source, 64) + return target +} + +func StringIntPlus(s1, s2 string) string { + return strconv.Itoa(StringToInt(s1) + StringToInt(s2)) +} + +func StringIntMultiply(s1, s2 string) string { + return strconv.Itoa(StringToInt(s1) * StringToInt(s2)) +} + +func StringIntSub(s1, s2 string) string { + return strconv.Itoa(StringToInt(s1) - StringToInt(s2)) +} + +func StringFloatSub(s1, s2 string) string { + return strconv.FormatFloat(StringToFloat(s1)-StringToFloat(s2), 'f', -1, 64) +} + +func ListToSet(list []string) (set []string) { + m := make(map[string]bool, 0) + for i := range list { + m[list[i]] = true + } + for k := range m { + set = append(set, k) + } + return +} + +func ToJson(source interface{}) []byte { + b, _ := json.Marshal(source) + return b +} + +func ToJsonString(source interface{}) string { + return string(ToJson(source)) +} + +func NowTimeToString() string { + return time.Now().Format(TimeLayout) +} + +func NowTimeIncreaseString(t time.Duration) string { + return time.Now().Add(t).Format(TimeLayout) +} + +func NowDateToString() string { + return time.Now().Format(DateLayout) +} + +func NowDateToStringShort() string { + return time.Now().Format(DateLayoutShort) +} + +func DateToString(source time.Time) string { + return source.Format(TimeLayout) +} + +func Md5(s string) string { + h := md5.New() + h.Write([]byte(s)) + return hex.EncodeToString(h.Sum(nil)) +} + +func ProcessTimeStr(s string) (string, error) { + // 定义两种时间格式 + layout1 := "2006-01-02 15:04:05" // 无时区的格式 + layout2 := "2006-01-02 15:04:05 -0700 MST" // 带时区的格式(包含偏移和时区名称) + + // 尝试解析为无时区格式 + _, err1 := time.Parse(layout1, s) + if err1 == nil { + return s, nil // 直接返回原字符串 + } + + // 尝试解析为带时区格式 + t2, err2 := time.Parse(layout2, s) + if err2 == nil { + // 格式化为无时区格式 + return t2.Format(layout1), nil + } + + // 两种格式都不匹配 + return "", fmt.Errorf("invalid time format: %s", s) +} + +// 解析url里的参数为map +func ParseUrlParameter(fullUrl string) (result map[string]string) { + + result = make(map[string]string) + + // 解析URL + parsedURL, err := url.Parse(fullUrl) + if err != nil { + fmt.Printf("解析URL失败: %v\n", err) + return + } + + // 解析查询参数 + queryParams := parsedURL.Query() + + // 输出所有参数 + for key, values := range queryParams { + result[key] = values[0] + } + + return +} diff --git a/pkg/common/util/string_util_test.go b/pkg/common/util/string_util_test.go new file mode 100644 index 0000000..9346136 --- /dev/null +++ b/pkg/common/util/string_util_test.go @@ -0,0 +1,17 @@ +package util + +import ( + "servicebase/pkg/common" + "fmt" + "testing" +) + +func Test_processTimeStr(t *testing.T) { + tmp, e := ProcessTimeStr("2025-05-29 09:08:38 +0800 CST") + fmt.Printf("%v %v\n", tmp, e) +} + +func TestParseUrlParameter(t *testing.T) { + // assets/img/op_1754967614.png?c=#000000&s=160 + ParseUrlParameter(common.FullPhotoUrl("assets/img/op_1754967614.png?c=%23000000&s=160")) +} diff --git a/pkg/constant/content.go b/pkg/constant/content.go new file mode 100644 index 0000000..9e08b2c --- /dev/null +++ b/pkg/constant/content.go @@ -0,0 +1,18 @@ +package constant + +const ( + JxApiToken = "8056be17be26d7e8f4" + + ContentSmsTemplateTypeLogin = "LOGIN" + ContentSmsTemplateTypeRegDriver = "REG-DRIVER" + ContentSmsTemplateTypeRegPassenger = "REG-PASSENGER" + + ContentSmsRecordSendSuccess = 2 + ContentSmsRecordSendFailed = 1 +) + +var ContentSmsTemplateType map[string]string + +func init() { + ContentSmsTemplateType = map[string]string{} +} diff --git a/pkg/constant/exam_order/order_status.go b/pkg/constant/exam_order/order_status.go new file mode 100644 index 0000000..141f116 --- /dev/null +++ b/pkg/constant/exam_order/order_status.go @@ -0,0 +1,170 @@ +package exam_order + +type OrderStatus string + +const ( + // 订单原始状态 已下单待支付 + ORDER_ORIGIN_STATUS_CREATED_WAIT_PAY OrderStatus = "1" + + // 订单原始状态 已支付待接单 + ORDER_ORIGIN_STATUS_PAID_WAIT_SELLER_AGREE OrderStatus = "2" + // 订单原始状态 已接单 + ORDER_ORIGIN_STATUS_SELLER_AGREED OrderStatus = "3" + // 订单原始状态 已完成 + ORDER_ORIGIN_STATUS_FINISHED OrderStatus = "4" + // 订单原始状态 退款中 + ORDER_ORIGIN_STATUS_REFUNDING OrderStatus = "5" + // 订单原始状态 售后中(申诉中) + ORDER_ORIGIN_STATUS_IN_APPEAL OrderStatus = "6" + // 订单原始状态 申诉失败 订单完成 + ORDER_ORIGIN_STATUS_APPEAL_FAILED OrderStatus = "8" + // 订单原始状态 售后完成(申诉完成) + ORDER_ORIGIN_STATUS_APPEAL_DONE OrderStatus = "9" + // 订单原始状态 支付前买家取消 + ORDER_ORIGIN_STATUS_UNPAY_BUYER_CANCELED OrderStatus = "20" + + // 订单原始状态 10分钟未支付自动过期 + ORDER_ORIGIN_STATUS_UNPAY_AUTO_EXPISED OrderStatus = "21" + // 订单原始状态 支付后买家取消 + ORDER_ORIGIN_STATUS_PAID_BUYER_CANCELED OrderStatus = "22" + // 订单原始状态 支付后卖家未接单 自动取消 + ORDER_ORIGIN_STATUS_PAID_SELLER_NOT_AGREE_AUTO_CANCELED OrderStatus = "23" + // 订单原始状态 卖家拒绝接单 + ORDER_ORIGIN_STATUS_SELLER_REJECTED_ORDER OrderStatus = "24" + // 订单原始状态 卖家同意退款 + ORDER_ORIGIN_STATUS_SELLER_AGREE_REFUND OrderStatus = "25" + // 订单原始状态 (售后成功)申诉成功,并免单退款 + ORDER_ORIGIN_STATUS_APPEAL_SUCCESS_CANCELED OrderStatus = "26" + // 订单原始状态 买家申请退款卖家超时未处理自动取消 + ORDER_ORIGIN_STATUS_REFUNDING_EXPIRED_AUTO_CANCELED OrderStatus = "27" +) + +func (o OrderStatus) String() string { + return string(o) +} + +type PayStatus string + +const ( + // 订单支付状态 未支付 + ORDER_PAY_STATUS_UNPAY PayStatus = "0" + // 订单支付状态 已支付 + ORDER_PAY_STATUS_PAID PayStatus = "1" + // 订单支付状态 已退款 + ORDER_PAY_STATUS_REFUND PayStatus = "2" +) + +func (o PayStatus) String() string { + return string(o) +} + +type ExaminerOrderStatus string + +const ( + ExaminerIdle ExaminerOrderStatus = "idle" // 空闲 + ExaminerAccept ExaminerOrderStatus = "accept" // 空闲 +) + +func (o ExaminerOrderStatus) String() string { + return string(o) +} + +type ExamSkillStatus string + +const ( + ExamSkillNormal ExamSkillStatus = "normal" + ExamSkillDown ExamSkillStatus = "down" +) + +func (o ExamSkillStatus) String() string { + return string(o) +} + +type OrderAction string + +const ( + //PayOrder = 支付订单 CancelOrder = 取消订单 AgreeOrder= 同意接单 RefuseOrder=拒绝接单 FinishOrder = 确认完成 RequestRefund=请求退款 AgreeRefund=同意退款 RefuseRefund=拒绝退款 + // 订单操作 创建订单 + ORDER_ACTION_CREATE_ORDER OrderAction = "CreateOrder" + // 订单操作 支付订单 + ORDER_ACTION_PAY_ORDER OrderAction = "PayOrder" + // 订单操作 取消订单 + ORDER_ACTION_CANCEL_ORDER OrderAction = "CancelOrder" + // 订单操作 卖家同意接单 + ORDER_ACTION_AGREE_ORDER OrderAction = "AgreeOrder" + // 订单操作 卖家完成一局 + ORDER_ACTION_SUB_COMPLETE_ORDER OrderAction = "SubCompleteOrder" + // 订单操作 买家续单 + ORDER_ACTION_RENEW_ORDER OrderAction = "RenewOrder" + // 订单操作 卖家开始陪玩 + ORDER_ACTION_START_ORDER OrderAction = "StartOrder" + // 订单操作 卖家拒绝接单 + ORDER_ACTION_REJECT_ORDER OrderAction = "RejectOrder" + // 订单操作 买家完成订单 + ORDER_ACTION_FINISH_ORDER OrderAction = "FinishOrder" + // 订单操作 提前结束 + ORDER_ACTION_EARLY_END_ORDER OrderAction = "EarlyEndOrder" + // 订单操作 按局订单 陪玩结束 + ORDER_ACTION_SELLER_END_ORDER OrderAction = "SellerEndOrderByCount" + // 订单操作 买家请求退款 + ORDER_ACTION_REQUEST_REFUND OrderAction = "RequestRefund" + // 订单操作 卖家同意退款 + ORDER_ACTION_AGREE_REFUND OrderAction = "AgreeRefund" + // 订单操作 卖家拒绝退款 + ORDER_ACTION_REJECT_REFUND OrderAction = "RejectRefund" + // 订单操作 评价订单 + ORDER_ACTION_RATE_ORDER OrderAction = "RateOrder" + // 订单操作 再次下单 + ORDER_ACTION_ORDER_AGAIN OrderAction = "ReCreateOrder" + // 订单操作 申请售后 + ORDER_ACTION_ORDER_SUPPORT OrderAction = "ApplySupportOrder" + // 订单操作 删除订单 + ORDER_ACTION_ORDER_DEL OrderAction = "DeleteOrder" + // 订单操作 订单免单 + ORDER_ACTION_ORDER_FREE OrderAction = "FreeOrder" + // 订单操作 联系售后 + ORDER_ACTION_CONTACT_SUPPORT OrderAction = "ContactSupport" + // 订单操作 删除评价订单 + ORDER_ACTION_DELETE_ORDER_RATE OrderAction = "DeleteOrderRate" + // 订单操作 删除订单 + ORDER_ACTION_DELETE_ORDER OrderAction = "DeleteOrder" + // 订单操作 申诉 + ORDER_ACTION_APPEAL_SUCCESS OrderAction = "AppealSuccess" + // 订单操作 申诉失败 + ORDER_ACTION_APPEAL_FAIL OrderAction = "AppealFail" + //订单操作 增加单量 + ORDER_ACTION_ADD_ORDER_COUNT OrderAction = "AddOrderCount" + //订单操作 减少单量 + ORDER_ACTION_REDUCE_ORDER_COUNT OrderAction = "ReduceOrderCount" + //订单操作 进入房间 + ORDER_ACTION_ENTER_ROOM OrderAction = "EnterRoom" + // 订单操作 提交审核 + ORDER_ACTION_SUBMIT_REVIEW OrderAction = "SubmitReview" +) + +func (o OrderAction) String() string { + return string(o) +} + +type OrderReviewStatus string + +const ( + OrderReviewInit OrderReviewStatus = "init" + OrderReviewAccept OrderReviewStatus = "accept" + OrderReviewDeny OrderReviewStatus = "deny" +) + +func (o OrderReviewStatus) String() string { + return string(o) +} + +type OrderSupportStatus string + +const ( + OrderSupportInit OrderSupportStatus = "init" + OrderSupportDone OrderSupportStatus = "done" +) + +func (o OrderSupportStatus) String() string { + return string(o) +} diff --git a/pkg/constant/p_vars.go b/pkg/constant/p_vars.go new file mode 100644 index 0000000..36c403c --- /dev/null +++ b/pkg/constant/p_vars.go @@ -0,0 +1,24 @@ +package constant + +const ( + PhotoDomainUrl = "https://photo-app.ddegame.cn/" + API_SECRET = "c9ca017f078a4cd1ba5ccb9d02d4869a" + HTTP_METHOD_POST = "POST" + LOG_QUOTE_STRING = "#" + + // 验证码类型 + SMS_CODE_TYPE_SIGN_IN = "signIn" //登录验证码 + + // 未登录 需要跳登录页 + ErrorCodeNeedLogin int = 7031 + ErrorCodeSignError int = 7032 + + // APP登录方式 + AppLoginTypePwd = "1" //密码登录 + AppLoginTypeSmsCode = "2" //验证码登录 + + CustomerProductId = "CUSTOMER" // 自定义充值的产品ID + + WeekStarGiftGrantToReward = "TO_REWARD" // 给周星名气榜用户发放的礼物列表key + WeekStarGiftGrantToReceive = "TO_RECEIVE" // 给周星人气榜用户发放的礼物列表key +) diff --git a/pkg/constant/sys_vars.go b/pkg/constant/sys_vars.go new file mode 100644 index 0000000..7bd7316 --- /dev/null +++ b/pkg/constant/sys_vars.go @@ -0,0 +1,15 @@ +package constant + +// 资源类型 +type ResourceTypeEnum int + +const ( + Image ResourceTypeEnum = iota // = 0 + Video // = 1 + Audio +) + +func (actionType ResourceTypeEnum) String() string { + names := []string{"图片", "视频", "音频"} + return names[actionType] +} diff --git a/pkg/constant/tenant.go b/pkg/constant/tenant.go new file mode 100644 index 0000000..2ffe1e5 --- /dev/null +++ b/pkg/constant/tenant.go @@ -0,0 +1,7 @@ +package constant + +const ( + HeaderUserId = "USER-ID" + TenantId = "TENANT-ID" + ScopeId = "SCOPE-ID" +) diff --git a/pkg/constant/withdraw_status.go b/pkg/constant/withdraw_status.go new file mode 100644 index 0000000..4a1af93 --- /dev/null +++ b/pkg/constant/withdraw_status.go @@ -0,0 +1,21 @@ +package constant + +const ( + WithdrawStatusReview = "1" + WithdrawStatusApproved = "2" + WithdrawStatusReject = "3" + WithdrawStatusPayFailed = "4" + WithdrawStatusPaySuccess = "5" +) + +var WithdrawStatusCon map[string]string + +func init() { + WithdrawStatusCon = map[string]string{ + WithdrawStatusReview: "审核中", + WithdrawStatusApproved: "审核通过", + WithdrawStatusReject: "审核失败", + WithdrawStatusPayFailed: "打款失败", + WithdrawStatusPaySuccess: "打款成功", + } +} diff --git a/pkg/datasource/fields/field.go b/pkg/datasource/fields/field.go new file mode 100644 index 0000000..df2e45e --- /dev/null +++ b/pkg/datasource/fields/field.go @@ -0,0 +1,185 @@ +package fields + +import ( + "bytes" + "context" + "database/sql/driver" + "encoding/binary" + "errors" + "fmt" + "math" + "time" + + "gorm.io/gorm" + "gorm.io/gorm/clause" +) + +const ( + timeFormat = "2006-01-02 15:04:05" + dateFormat = "2006-01-02" +) + +type STPoint struct { + Lng float64 + Lat float64 +} + +type Time time.Time + +func (t *Time) UnmarshalJSON(data []byte) (err error) { + now, err := time.ParseInLocation(`"`+timeFormat+`"`, string(data), time.Local) + *t = Time(now) + return +} + +func (t *Time) MarshalJSON() ([]byte, error) { + b := make([]byte, 0, len(timeFormat)+2) + b = append(b, '"') + b = time.Time(*t).AppendFormat(b, timeFormat) + b = append(b, '"') + return b, nil +} + +func (t *Time) String() string { + return time.Time(*t).Format(timeFormat) +} + +func (t *Time) Value() (driver.Value, error) { + return time.Time(*t).Format(timeFormat), nil +} + +func (t *Time) Time() time.Time { + return time.Time(*t) +} + +func NowTime() Time { + return Time(time.Now()) +} + +type Date time.Time + +func (t *Date) UnmarshalJSON(data []byte) (err error) { + now, err := time.ParseInLocation(`"`+dateFormat+`"`, string(data), time.Local) + *t = Date(now) + return +} + +func (t *Date) MarshalJSON() ([]byte, error) { + b := make([]byte, 0, len(dateFormat)+2) + b = append(b, '"') + b = time.Time(*t).AppendFormat(b, dateFormat) + b = append(b, '"') + return b, nil +} + +func (t *Date) String() string { + return time.Time(*t).Format(dateFormat) +} + +func (t *Date) FromStr(s string) error { + now, err := time.ParseInLocation(dateFormat, string(s), time.Local) + *t = Date(now) + return err +} + +func (t *Date) Time() time.Time { + return time.Time(*t) +} + +type Month time.Time + +const ( + monthFormat = "2006-01" +) + +func (t *Month) UnmarshalJSON(data []byte) (err error) { + if len(data) <= 2 { + return nil + } + now, err := time.ParseInLocation(`"`+monthFormat+`"`, string(data), time.Local) + *t = Month(now) + return +} + +func (t *Month) MarshalJSON() ([]byte, error) { + b := make([]byte, 0, len(monthFormat)+2) + b = append(b, '"') + b = time.Time(*t).AppendFormat(b, monthFormat) + b = append(b, '"') + return b, nil +} + +func (t *Month) String() string { + return time.Time(*t).Format(monthFormat) +} + +type Point struct { + Lat float64 `json:"lat"` + Lng float64 `json:"lng"` +} + +func (p Point) Value() (driver.Value, error) { + return fmt.Sprintf("POINT(%f %f)", p.Lng, p.Lat), nil +} + +func (p *Point) Scan(src interface{}) error { + switch src.(type) { + case []byte: + var b = src.([]byte) + if len(b) != 25 { + return errors.New(fmt.Sprintf("Expected []bytes with length 25, got %d", len(b))) + } + var longitude float64 + var latitude float64 + buf := bytes.NewReader(b[9:17]) + err := binary.Read(buf, binary.LittleEndian, &longitude) + if err != nil { + return err + } + buf = bytes.NewReader(b[17:25]) + err = binary.Read(buf, binary.LittleEndian, &latitude) + if err != nil { + return err + } + p.Lng = longitude + p.Lat = latitude + default: + return errors.New(fmt.Sprintf("Expected []byte for Location type, got %T", src)) + } + return nil +} + +func (loc Point) GormDataType() string { + return "point" +} + +func (loc Point) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { + return clause.Expr{ + SQL: "ST_PointFromText(?)", + Vars: []interface{}{fmt.Sprintf("POINT(%f %f)", loc.Lng, loc.Lat)}, + } +} + +func (p Point) DistanceTo(other Point) float64 { + const earthRadius = 6371000 // 地球半径,单位为米 + + lat1 := p.Lat * math.Pi / 180 + lng1 := p.Lng * math.Pi / 180 + lat2 := other.Lat * math.Pi / 180 + lng2 := other.Lng * math.Pi / 180 + + dlat := lat2 - lat1 + dlng := lng2 - lng1 + + a := math.Sin(dlat/2)*math.Sin(dlat/2) + + math.Cos(lat1)*math.Cos(lat2)*math.Sin(dlng/2)*math.Sin(dlng/2) + c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a)) + + distance := earthRadius * c + // point1 := Point{Lat: 40.7128, Lng: -74.0060} + // point2 := Point{Lat: 34.0522, Lng: -118.2437} + // distance := point1.DistanceTo(point2) + // fmt.Printf("Distance between points: %.2f km\n", distance) + // fmt.Printf("Distance between points: %d meters\n", distance) + return distance +} diff --git a/pkg/datasource/mysql.go b/pkg/datasource/mysql.go new file mode 100644 index 0000000..da0504c --- /dev/null +++ b/pkg/datasource/mysql.go @@ -0,0 +1,128 @@ +package datasource + +import ( + "servicebase/pkg/log" + "servicebase/pkg/repo" + "servicebase/pkg/utils" + "strings" + "time" + + "github.com/spf13/viper" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/schema" + "gorm.io/plugin/dbresolver" +) + +type BaseModel struct { + ID int `gorm:"primaryKey" json:"id"` + CreateTime utils.Time `gorm:"type:datetime;index;not null" json:"createTime"` +} + +func (model *BaseModel) BeforeCreate(tx *gorm.DB) (err error) { + model.CreateTime.Time = time.Now() + return +} + +var DB *gorm.DB + +type MySQLStarter struct { +} + +func (s *MySQLStarter) Init() error { + InitMySQl() + return nil +} + +func InitMySQl() { + dsn := viper.GetString("db.connectString") + log.InfoF("init db config with: %s", dsn) + var e error + if DB, e = gorm.Open(mysql.New(mysql.Config{ + DriverName: "", + ServerVersion: "", + DSN: dsn, + Conn: nil, + SkipInitializeWithVersion: false, + DefaultStringSize: 255, + DefaultDatetimePrecision: nil, + DisableDatetimePrecision: true, + DontSupportRenameIndex: false, + DontSupportRenameColumn: true, + DontSupportForShareClause: false, + // DontSupportNullAsDefaultValue: false, + }), &gorm.Config{ + SkipDefaultTransaction: false, + NamingStrategy: schema.NamingStrategy{ + TablePrefix: "", // table name prefix, table for `User` would be `t_users` + SingularTable: true, // use singular table name, table for `User` would be `user` with this option enabled + NoLowerCase: false, // skip the snake_casing of names + NameReplacer: strings.NewReplacer("PID", "pid"), // use name replacer to change struct/field name before convert it to db name + }, + FullSaveAssociations: false, + Logger: &log.GLog{}, // + NowFunc: func() time.Time { + return time.Now().Local() + }, + DryRun: false, + PrepareStmt: false, // 执行任何 SQL 时都会创建一个 prepared statement 并将其缓存,以提高后续的效率 + DisableAutomaticPing: false, // 在完成初始化后,GORM 会自动 ping 数据库以检查数据库的可用性 + DisableForeignKeyConstraintWhenMigrating: true, // 在 AutoMigrate 或 CreateTable 时,GORM 会自动创建外键约束,若要禁用该特性,可将其设置为 true + DisableNestedTransaction: false, // 嵌套事务 + AllowGlobalUpdate: false, // true = 启用全局 update/delete + QueryFields: false, + CreateBatchSize: 0, + ClauseBuilders: nil, + ConnPool: nil, + Dialector: nil, + Plugins: nil, + }); e != nil { + panic("failed to connect database") + } + + _ = DB.Use(dbresolver.Register(dbresolver.Config{ + Replicas: []gorm.Dialector{mysql.Open(dsn)}, + Policy: dbresolver.RandomPolicy{}, + }).Register(dbresolver.Config{ + Replicas: []gorm.Dialector{mysql.Open(dsn)}, + } /* &model.User{} */)) + + sqlDB, _ := DB.DB() + // SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。 + sqlDB.SetMaxIdleConns(20) + // SetMaxOpenConns 设置打开数据库连接的最大数量。 + sqlDB.SetMaxOpenConns(100) + // SetConnMaxLifetime 设置了连接可复用的最大时间。 + sqlDB.SetConnMaxLifetime(time.Hour * 24) + + // log.InfoF("gorm metrics at: %d", viper.GetUint32("db.metrics.port")) + // _ = DB.Use(prometheus.New(prometheus.Config{ + // DBName: "db_data-front", // 使用 `DBName` 作为指标 label + // RefreshInterval: 10, // 指标刷新频率(默认为 15 秒) + // PushAddr: "", // 如果配置了 `PushAddr`,则推送指标 + // StartServer: false, // 启用一个 http 服务来暴露指标 + // //HTTPServerPort: viper.GetUint32("db.metrics.port"), // 配置 http 服务监听端口,默认端口为 8080 (如果您配置了多个,只有第一个 `HTTPServerPort` 会被使用) + // MetricsCollector: []prometheus.MetricsCollector{ + // &prometheus.MySQL{ + // // 指标名前缀,默认为 `gorm_status_` + // // 例如: Threads_running 的指标名就是 `gorm_status_Threads_running` + // Prefix: "gorm_status_", + // // 拉取频率,默认使用 Prometheus 的 RefreshInterval + // Interval: 30, + // // 从 SHOW STATUS 选择变量变量,如果不设置,则使用全部的状态变量 + // VariableNames: []string{"Threads_running"}, + // }, + // }, // 用户自定义指标 + // })) + + //_ = DB.Use(tracing.NewPlugin(tracing.WithoutMetrics())) + + autoMigrate() + + repo.SetDefault(DB) +} + +func autoMigrate() { + //_ = DB.AutoMigrate(&model.User{}) + //_ = DB.AutoMigrate(&model.LeaseType{}) +} diff --git a/pkg/helper/AliAudio.go b/pkg/helper/AliAudio.go new file mode 100644 index 0000000..076d64a --- /dev/null +++ b/pkg/helper/AliAudio.go @@ -0,0 +1,144 @@ +package helper + +import ( + "encoding/json" + "errors" + "fmt" + "time" + + "github.com/aliyun/alibaba-cloud-sdk-go/sdk" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" + "github.com/spf13/viper" +) + +func TransAudioToText(fileUrl string) (result string, err error) { + + // 地域ID,固定值。 + const REGION_ID string = "cn-shanghai" + const ENDPOINT_NAME string = "cn-shanghai" + const PRODUCT string = "nls-filetrans" + const DOMAIN string = "filetrans.cn-shanghai.aliyuncs.com" + const API_VERSION string = "2018-08-17" + const POST_REQUEST_ACTION string = "SubmitTask" + const GET_REQUEST_ACTION string = "GetTaskResult" + // 请求参数 + const KEY_APP_KEY string = "appkey" //此处appkey无需替换。 + const KEY_FILE_LINK string = "file_link" + const KEY_VERSION string = "version" + const KEY_ENABLE_WORDS string = "enable_words" + // 响应参数 + const KEY_TASK string = "Task" + const KEY_TASK_ID string = "TaskId" + const KEY_STATUS_TEXT string = "StatusText" + const KEY_RESULT string = "Result" + // 状态值 + const STATUS_SUCCESS string = "SUCCESS" + const STATUS_RUNNING string = "RUNNING" + const STATUS_QUEUEING string = "QUEUEING" + var accessKeyId string = viper.GetString("aliyun.audio.accessKeyId") + var accessKeySecret string = viper.GetString("aliyun.audio.accessKeySecret") + var appKey string = viper.GetString("aliyun.audio.appKey") + var fileLink string = fileUrl + c := sdk.NewConfig() + credential := credentials.NewAccessKeyCredential(accessKeyId, accessKeySecret) + client, err := sdk.NewClientWithOptions(REGION_ID, c, credential) + if err != nil { + panic(err) + } + postRequest := requests.NewCommonRequest() + postRequest.Domain = DOMAIN + postRequest.Version = API_VERSION + postRequest.Product = PRODUCT + postRequest.ApiName = POST_REQUEST_ACTION + postRequest.Method = "POST" + mapTask := make(map[string]string) + mapTask[KEY_APP_KEY] = appKey + mapTask[KEY_FILE_LINK] = fileLink + // 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置。 + mapTask[KEY_VERSION] = "4.0" + // 设置是否输出词信息,默认为false。开启时需要设置version为4.0。 + mapTask[KEY_ENABLE_WORDS] = "false" + mapTask["enable_sample_rate_adaptive"] = "true" //大于 + task, err := json.Marshal(mapTask) + if err != nil { + panic(err) + } + postRequest.FormParams[KEY_TASK] = string(task) + postResponse, err := client.ProcessCommonRequest(postRequest) + if err != nil { + panic(err) + } + postResponseContent := postResponse.GetHttpContentString() + fmt.Println(postResponseContent) + if postResponse.GetHttpStatus() != 200 { + fmt.Println("录音文件识别请求失败,Http错误码: ", postResponse.GetHttpStatus()) + return + } + var postMapResult map[string]interface{} + err = json.Unmarshal([]byte(postResponseContent), &postMapResult) + if err != nil { + panic(err) + } + var taskId string = "" + var statusText string = "" + statusText = postMapResult[KEY_STATUS_TEXT].(string) + if statusText == STATUS_SUCCESS { + fmt.Println("录音文件识别请求成功响应!") + taskId = postMapResult[KEY_TASK_ID].(string) + } else { + fmt.Println("录音文件识别请求失败!") + err = errors.New("录音文件识别请求失败") + return + } + getRequest := requests.NewCommonRequest() + getRequest.Domain = DOMAIN + getRequest.Version = API_VERSION + getRequest.Product = PRODUCT + getRequest.ApiName = GET_REQUEST_ACTION + getRequest.Method = "GET" + getRequest.QueryParams[KEY_TASK_ID] = taskId + statusText = "" + + for { + getResponse, err := client.ProcessCommonRequest(getRequest) + if err != nil { + panic(err) + } + getResponseContent := getResponse.GetHttpContentString() + fmt.Println("识别查询结果:", getResponseContent) + if getResponse.GetHttpStatus() != 200 { + fmt.Println("识别结果查询请求失败,Http错误码:", getResponse.GetHttpStatus()) + break + } + var getMapResult map[string]interface{} + err = json.Unmarshal([]byte(getResponseContent), &getMapResult) + if err != nil { + panic(err) + } + statusText = getMapResult[KEY_STATUS_TEXT].(string) + if statusText == STATUS_RUNNING || statusText == STATUS_QUEUEING { + time.Sleep(10 * time.Second) + } else if statusText == STATUS_SUCCESS { + var resResult = getMapResult[KEY_RESULT].(map[string]interface{}) + fmt.Println("result:", resResult["Sentences"].([]interface{})) + ss := resResult["Sentences"].([]interface{}) + for _, seg := range ss { + item := seg.(map[string]interface{}) + result += item["Text"].(string) + } + break + } else { + break + } + } + if statusText == STATUS_SUCCESS { + + fmt.Println("录音文件识别成功!", result) + } else { + fmt.Println("录音文件识别失败!") + } + + return + +} diff --git a/pkg/helper/AliAudio_test.go b/pkg/helper/AliAudio_test.go new file mode 100644 index 0000000..74efda9 --- /dev/null +++ b/pkg/helper/AliAudio_test.go @@ -0,0 +1,11 @@ +package helper + +import ( + "fmt" + "testing" +) + +func TestTransAudioToText(t *testing.T) { + gotResult, err := TransAudioToText("https://check.dongdongdianjing.com/videos/20250606/d69960523fe2756076f1f8d7c37fa742.mp4") + fmt.Sprintf("%+v %+v", gotResult, err) +} diff --git a/pkg/helper/Helper.go b/pkg/helper/Helper.go new file mode 100644 index 0000000..22b14ab --- /dev/null +++ b/pkg/helper/Helper.go @@ -0,0 +1,156 @@ +package helper + +import ( + "crypto/md5" + "crypto/sha1" + "encoding/base64" + "encoding/hex" + "encoding/json" + "io" + "io/ioutil" + "net/http" + "sort" + "strconv" + "strings" + "time" + + "github.com/spf13/viper" +) + +// 生成header +func GenerateApiHeader(jsonBody string) map[string]string { + + sign := GenerateSign(jsonBody) + + headerMap := getCommonHeaderMap() + + headerMap["Signature"] = sign + + return headerMap +} + +// 根据body生成签名 +func GenerateSign(jsonBody string) string { + + var mapRequest map[string]string + + err := json.Unmarshal([]byte(jsonBody), &mapRequest) + if err != nil { + return "" + } + commonHeaderMap := getCommonHeaderMap() + + for k, v := range commonHeaderMap { + mapRequest[k] = v + } + sign := createSign(mapRequest) + return sign +} + +// 获取公共的header字段 +func getCommonHeaderMap() map[string]string { + + headerMap := make(map[string]string, 0) + headerMap["ClientVersion"] = "1.0.1" + headerMap["DeviceId"] = "MWEB" + headerMap["Platform"] = "H5" + headerMap["MarketChannel"] = "" + headerMap["DeviceModel"] = "MWEB" + headerMap["ApiVersionNum"] = viper.GetString("api-num") + headerMap["TimeStamp"] = strconv.Itoa(time.Now().Second()) + headerMap["BundleId"] = "meetalkH5" + headerMap["OsVersion"] = "10.01" + headerMap["INNER-TOKEN"] = "b028c52286c95de48a1c773d7ed02d04" + + return headerMap +} + +func createSign(params map[string]string) string { + + keys := make([]string, 20) + + for key, _ := range params { + if key == "Signature" { + continue + } + keys = append(keys, key) + } + //按key升序 + sort.Strings(keys) + + //把KEY值合并为字符串 + waitSignString := "" + for _, value := range keys { + + waitSignString += base64.StdEncoding.EncodeToString([]byte(params[value])) + } + + //加上密钥 + appSecret := "x63363eacf804b4394a120aea240fd9a" + waitSignString += appSecret + + //sha1加密 + t := sha1.New() + io.WriteString(t, waitSignString) + sign := t.Sum(nil) + + return hex.EncodeToString(sign) + +} + +// 复杂http请求 +func HttpDo(httpMethod string, url string, headerMap map[string]string, rawBody string) (remoteResponse string, err error) { + + client := &http.Client{} + + req, err0 := http.NewRequest(httpMethod, url, strings.NewReader(rawBody)) + + if err0 != nil { + + err = err0 + return + } + + if len(headerMap) > 0 { + for k, v := range headerMap { + req.Header.Set(k, v) + } + } + + resp, err1 := client.Do(req) + + if err1 != nil { + err = err1 + return + } + + defer resp.Body.Close() + + body, err2 := ioutil.ReadAll(resp.Body) + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(body) + + return + +} + +func StringToMD5(waitMD5string string) string { + h := md5.New() + h.Write([]byte(waitMD5string)) + cipherStr := h.Sum(nil) + result := hex.EncodeToString(cipherStr) + return result +} + +// SHA1加密 +func StringToSHA1(waitMD5string string) string { + h := sha1.New() + h.Write([]byte(waitMD5string)) + cipherStr := h.Sum(nil) + result := hex.EncodeToString(cipherStr) + return result +} diff --git a/pkg/helper/NetHelper.go b/pkg/helper/NetHelper.go new file mode 100644 index 0000000..b60a3fc --- /dev/null +++ b/pkg/helper/NetHelper.go @@ -0,0 +1,68 @@ +package helper + +import ( + "bytes" + "encoding/json" + "io" + "io/ioutil" + "net/http" + "time" + + "github.com/spf13/viper" +) + +func Url(url string) string { + return viper.GetString("service.host.api") + url +} + +// 发送GET请求 +// url:请求地址 +// response:请求返回的内容 +func Get(url string) (response string) { + client := http.Client{Timeout: 30 * time.Second} + resp, e := client.Get(url) + if e != nil { + panic(e) + } + defer resp.Body.Close() + var buffer [512]byte + result := bytes.NewBuffer(nil) + for { + n, err := resp.Body.Read(buffer[0:]) + result.Write(buffer[0:n]) + if err != nil && err == io.EOF { + break + } else if err != nil { + panic(err) + } + } + + response = result.String() + return +} + +// 发送POST请求 +// url:请求地址,data:POST请求提交的数据,contentType:请求体格式,如:application/json +// response:请求返回的内容 +func Post(url string, data interface{}, header map[string]string) (response string) { + jsonStr, _ := json.Marshal(data) + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr)) + if err != nil { + panic(err) + } + req.Header.Add("content-type", "application/json") + for key := range header { + req.Header.Add(key, header[key]) + } + defer req.Body.Close() + + client := &http.Client{Timeout: 30 * time.Second} + resp, err := client.Do(req) + if err != nil { + panic(err) + } + defer resp.Body.Close() + result, _ := ioutil.ReadAll(resp.Body) + response = string(result) + return +} diff --git a/pkg/helper/NumberHelper.go b/pkg/helper/NumberHelper.go new file mode 100644 index 0000000..a06d7e4 --- /dev/null +++ b/pkg/helper/NumberHelper.go @@ -0,0 +1,371 @@ +package helper + +import ( + "encoding/json" + "github.com/anxpp/beego/logs" + "strconv" + "strings" +) + +type NumberInfo struct { + Level int + Rule map[string]bool +} + +// 计算号码的登记 +func Calc(src int64) NumberInfo { + level := 0 + rule := make(map[string]bool) + number := strconv.FormatInt(src, 10) + length := len(number) + // 尾号AAA + checkEndAAA := length >= 3 && number[length-1] == number[length-2] && number[length-2] == number[length-3] + if checkEndAAA { + level++ + } + rule["EndAAA"] = checkEndAAA + // 尾号ABAB + checkABAB := length >= 4 && number[length-4] == number[length-2] && number[length-3] == number[length-1] + if checkABAB { + level++ + } + rule["EndABAB"] = checkABAB + // 尾号AABB + checkAABB := length >= 4 && number[length-4] == number[length-3] && number[length-2] == number[length-1] + if checkAABB { + level++ + } + rule["EndAABB"] = checkAABB + // 520 + check520 := strings.HasSuffix(number, "520") + if check520 { + level++ + } + rule["520"] = check520 + // 1314 + check1314 := strings.HasSuffix(number, "1314") + if check1314 { + level++ + } + rule["1314"] = check1314 + // 5201314 + check5201314 := strings.HasSuffix(number, "5201314") + if check5201314 { + level++ + } + rule["5201314"] = check5201314 + // AAA + checkAAA := _checkRepeat(number, 3) + if checkAAA { + level++ + } + rule["AAA"] = checkAAA + // AAAA + checkAAAA := _checkRepeat(number, 4) + if checkAAAA { + level++ + } + rule["AAAA"] = checkAAAA + // AAAAA + checkAAAAA := _checkRepeat(number, 5) + if checkAAAAA { + level++ + level++ + } + rule["AAAAA"] = checkAAAAA + // AAAAAA + checkAAAAAA := _checkRepeat(number, 6) + if checkAAAAAA { + level++ + } + rule["AAAAAA"] = checkAAAAAA + // AAAAAAA + checkAAAAAAA := _checkRepeat(number, 7) + if checkAAAAAAA { + level++ + } + rule["AAAAAAA"] = checkAAAAAAA + // AAAAAAA + checkAAAAAAAA := _checkRepeat(number, 8) + if checkAAAAAAAA { + level++ + } + rule["AAAAAAAA"] = checkAAAAAAAA + // ABCABC + checkABCABC := _checkABCABC(number) + if checkABCABC { + level++ + } + rule["ABCABC"] = checkABCABC + // AABBCC + checkAABBCC := _checkAABBCC(number) + if checkAABBCC { + level++ + } + rule["AABBCC"] = checkAABBCC + // ABABAB + checkABABAB := _checkABABAB(number) + if checkABABAB { + level++ + } + rule["ABABAB"] = checkABABAB + // AAABBB + checkAAABBB := _checkAAABBB(number) + if checkAAABBB { + level++ + } + rule["AAABBB"] = checkAAABBB + // ABBABB + checkABBABB := _checkABBABB(number) + if checkABBABB { + level++ + } + rule["ABBABB"] = checkABBABB + // ABBCBB + checkABBCBB := _checkABBCBB(number) + if checkABBCBB { + level++ + } + rule["ABBCBB"] = checkABBCBB + // BBCBBA + checkBBCBBA := _checkBBCBBA(number) + if checkBBCBBA { + level++ + } + rule["BBCBBA"] = checkBBCBBA + // AABAAB + checkAABAAB := _checkAABAAB(number) + if checkAABAAB { + level++ + } + rule["AABAAB"] = checkAABAAB + // 102030 + check102030 := _check102030(number) + if check102030 { + level++ + } + rule["102030"] = check102030 + // 010203 + check010203 := _check010203(number) + if check010203 { + level++ + } + rule["010203"] = check010203 + // AABBB + checkAABBB := _checkAABBB(number) + if checkAABBB { + level++ + } + rule["AABBB"] = checkAABBB + // 123 + check123 := _checkIncrease(number, 3) + if check123 { + level++ + } + rule["123"] = check123 + // 123 + check1234 := _checkIncrease(number, 4) + if check1234 { + level++ + } + rule["1234"] = check1234 + // 123 + check12345 := _checkIncrease(number, 5) + if check12345 { + level++ + } + rule["12345"] = check12345 + // 123 + check123456 := _checkIncrease(number, 6) + if check123456 { + level++ + } + rule["123456"] = check123456 + // 123 + check1234567 := _checkIncrease(number, 7) + if check1234567 { + level++ + } + rule["1234567"] = check1234567 + info := NumberInfo{level, rule} + bytes, _ := json.Marshal(info) + if src%100000 == 0 { + logs.Info(number + ": " + string(bytes)) + } + return info +} + +func _checkRepeat(number string, length int) bool { + count := 1 + old := ' ' + for _, ch := range number { + if ch == old { + count++ + if count == length { + return true + } + continue + } + old = ch + count = 1 + } + return false +} + +func _checkIncrease(number string, length int) bool { + count := 0 + old := ' ' + for _, ch := range number { + if count <= 0 { + count++ + if count == length { + return true + } + old = ch + continue + } + if ch == old+1 { + count++ + if count == length { + return true + } + old = ch + continue + } + old = ch + count = 0 + } + return false +} + +func _checkABCABC(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-3] == number[i] && number[i-2] == number[i+1] && number[i-1] == number[i+2] { + return true + } + } + } + return false +} + +func _checkABBABB(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-3] == number[i] && number[i-2] == number[i+1] && number[i-1] == number[i+2] && number[i-2] == number[i-1] { + return true + } + } + } + return false +} + +func _checkABBCBB(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-2] == number[i-1] && number[i-1] == number[i+1] && number[i+1] == number[i+2] { + return true + } + } + } + return false +} + +func _checkBBCBBA(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-3] == number[i-2] && number[i-2] == number[i] && number[i] == number[i+1] { + return true + } + } + } + return false +} + +func _checkAABAAB(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-3] == number[i] && number[i-3] == number[i-2] && number[i-2] == number[i+1] && number[i-1] == number[i+2] { + return true + } + } + } + return false +} + +func _check102030(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-2] == number[i] && number[i] == number[i+2] && number[i-3]-number[i-1] == number[i-1]-number[i+1] { + return true + } + } + } + return false +} + +func _check010203(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-2]-number[i] == number[i]-number[i+2] && number[i-3] == number[i-1] && number[i-1] == number[i+1] { + return true + } + } + } + return false +} + +func _checkAABBCC(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-3] == number[i-2] && number[i-1] == number[i] && number[i+1] == number[i+2] { + return true + } + } + } + return false +} + +func _checkABABAB(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-3] == number[i-1] && number[i-1] == number[i+1] && number[i-2] == number[i] && number[i] == number[i+2] { + return true + } + } + } + return false +} + +func _checkAAABBB(number string) bool { + length := len(number) + if length >= 6 { + for i := 3; i < length-2; i++ { + if number[i-3] == number[i-2] && number[i-2] == number[i-1] && number[i] == number[i+1] && number[i+1] == number[i+2] { + return true + } + } + } + return false +} + +func _checkAABBB(number string) bool { + length := len(number) + if length >= 5 { + for i := 3; i < length-2; i++ { + if number[i-3] == number[i-2] && number[i-1] == number[i] && number[i] == number[i+1] { + return true + } + } + } + return false +} diff --git a/pkg/helper/QiNiuHelper.go b/pkg/helper/QiNiuHelper.go new file mode 100644 index 0000000..5447669 --- /dev/null +++ b/pkg/helper/QiNiuHelper.go @@ -0,0 +1,85 @@ +package helper + +import ( + "encoding/base64" + "fmt" + "strings" + + "github.com/anxpp/beego/logs" + "github.com/qiniu/go-sdk/v7/auth" + "github.com/qiniu/go-sdk/v7/storage" + "github.com/spf13/viper" +) + +//{"id":"z0.0A2234420A3600F3365DD1FA282B440D","pipeline":"1381904061.XZVideoToImagesQueue","code":0, +// "desc":"The fop was completed successfully","reqid":"Ry0AAMB45er_HtgV","inputBucket":"media","inputKey":"shot/xingzuan_appstore_video.mp4_000001.jpg", +// "items":[{"cmd":"animate/duration/5/merge/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDAyLmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDAzLmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDA0LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDA1LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDA2LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDA3LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDA4LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDA5LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDEwLmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDExLmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDEyLmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDEzLmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDE0LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDE1LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDE2LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDE3LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDE4LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDE5LmpwZw==/key/c2hvdC94aW5nenVhbl9hcHBzdG9yZV92aWRlby5tcDRfMDAwMDIwLmpwZw==/effect/0", +// "code":0,"desc":"The fop was completed successfully","hash":"lmW7N4-x40al165ufZj2SJGbut6L","key":"-KqubldLD_opMcwnpcOJ2FOml7M=/Ftq7oAVtIsQ-hOdz1amflU4f0mxO","returnOld":0}]} + +type QiNiuVideoToImagesParam struct { + Id string `json:"id"` + Pipeline string `json:"pipeline"` + Code int `json:"code"` + Desc string `json:"desc"` + Reqid string `json:"reqid"` + InputBucket string `json:"inputBucket"` + InputKey string `json:"inputKey"` + Items []QiNiuVideoToImagesParamItem `json:"items"` +} + +type QiNiuVideoToImagesParamItem struct { + Cmd string `json:"cmd"` + Code int `json:"code"` + Desc string `json:"desc"` + Keys []string `json:"keys"` + Key string `json:"key"` + Hash string `json:"hash"` + ReturnOld int `json:"returnOld"` +} + +// 获取视频抽帧的token +// 第2秒开始,每秒10张,抽20张 +func QiNiuVideoToImages(key string) (persistentId string) { + + mac := auth.New(viper.GetString("qiniu.key"), viper.GetString("qiniu.secret")) + cfg := storage.Config{UseHTTPS: true} + operationManager := storage.NewOperationManager(mac, &cfg) + saveBucket := "dddjmedia" + // 处理指令集合 + // vsample//ss//t//s//rotate//interval//pattern/ + // /ss/ 是 指定截取视频的开始时刻,单位:秒,精度为 100ms。例如 /ss/1.1 + // /t/ 是 采样总时长,单位:秒,精度为 100ms。例如 t/1.1 + // /s/ 缩略图分辨率,单位:像素(px),格式:x,宽度取值范围为1-1920,高度取值范围为1-1080。 默认为原始视频分辨率。 + // /rotate/ 指定顺时针旋转的度数,可取值为90、180、270、auto。 默认为不旋转。 + // /interval/ 指定采样间隔,单元:秒。 默认为5秒,精度为 100ms,例如/interval/0.1 + // /pattern/ 是 指定各张截图的资源名格式,支持如下魔法变量: $(count) :六个占位符的数字串,不足位的填充前导零即%06d,如 000001 + fopVSample := fmt.Sprintf("vsample/png/ss/2/t/2/interval/0.1/pattern/%s", base64.URLEncoding.EncodeToString([]byte("shot/"+key+"_$(count).jpg"))) + fopBatch := []string{fopVSample} + fops := strings.Join(fopBatch, ";") + persistentId, err := operationManager.Pfop(saveBucket, key, fops, "FYVideoToImagesQueue", viper.GetString("open.notify.qiniuVideoShot"), true) + if err != nil { + logs.Error(err.Error(), " ", persistentId, "", key) + } + return persistentId +} + +func QiNiuImagesToGif(keys []string) (persistentId string) { + mac := auth.New(viper.GetString("qiniu.key"), viper.GetString("qiniu.secret")) + cfg := storage.Config{UseHTTPS: true} + operationManager := storage.NewOperationManager(mac, &cfg) + saveBucket := "dddjmedia" + an := "animate/duration/5/merge" + for i := 1; i < len(keys); i++ { + an += "/key/" + base64.URLEncoding.EncodeToString([]byte(keys[i])) + } + an += "/effect/0" + logs.Info("result of img merge", an) + fopBatch := []string{an} + fops := strings.Join(fopBatch, ";") + persistentId, err := operationManager.Pfop(saveBucket, keys[0], fops, "FYVideoToImagesQueue", viper.GetString("open.notify.qiniuImgMergeShot"), true) + if err != nil { + fmt.Println(err) + logs.Error(err.Error()) + } + return persistentId +} diff --git a/pkg/helper/WxHelper.go b/pkg/helper/WxHelper.go new file mode 100644 index 0000000..89105ce --- /dev/null +++ b/pkg/helper/WxHelper.go @@ -0,0 +1,13 @@ +package helper + +import "strings" + +//是否使用微信打开 +func IsWeiXinBrowser(httpUserAgent string) bool { + wxAgentKey := "MicroMessenger" + + if strings.Contains(httpUserAgent, wxAgentKey) { + return true + } + return false +} diff --git a/pkg/helper/passwordHelper.go b/pkg/helper/passwordHelper.go new file mode 100644 index 0000000..505070f --- /dev/null +++ b/pkg/helper/passwordHelper.go @@ -0,0 +1,23 @@ +package helper + +import ( + "crypto/md5" + "encoding/hex" + "math/rand" + "strconv" + "time" +) + +// 获取随机盐值 +func PasswordSalt() string { + randInt := rand.New(rand.NewSource(time.Now().UnixNano())) + return strconv.Itoa(randInt.Int() % 10000) +} + +// 计算加密后的密码 +func PasswordWithMd5(password, salt string) string { + h := md5.New() + h.Write([]byte(password + salt)) + cipherStr := h.Sum(nil) + return hex.EncodeToString(cipherStr) +} diff --git a/pkg/helper/string_util.go b/pkg/helper/string_util.go new file mode 100644 index 0000000..1113b85 --- /dev/null +++ b/pkg/helper/string_util.go @@ -0,0 +1,144 @@ +package helper + +import ( + "crypto/md5" + "encoding/hex" + "encoding/json" + "fmt" + "regexp" + "sort" + "strconv" + "strings" + "time" +) + +const ( + PhotoDomainUrl = "https://photo-app.ddegame.cn/" + TimeLayout = "2006-01-02 15:04:05" + DateLayout = "2006-01-02" + DateLayoutShort = "20060102" +) + +func FullPhotoUrl(path string) string { + if len(path) == 0 { + return "" + } + if strings.Index(path, "http") == 0 { + return path + } + return PhotoDomainUrl + path +} + +func Md5ForList(s ...string) string { + sort.Strings(s) + h := md5.New() + h.Write([]byte(strings.Join(s, ""))) + return hex.EncodeToString(h.Sum(nil)) +} + +func StringToInt(source string) int { + target, _ := strconv.Atoi(source) + return target +} + +func StringToInt64(source string) int64 { + target, _ := strconv.Atoi(source) + return int64(target) +} + +func StringToFloat(source string) float64 { + target, _ := strconv.ParseFloat(source, 64) + return target +} + +func StringIntPlus(s1, s2 string) string { + return strconv.Itoa(StringToInt(s1) + StringToInt(s2)) +} + +func StringIntMultiply(s1, s2 string) string { + return strconv.Itoa(StringToInt(s1) * StringToInt(s2)) +} + +func StringIntSub(s1, s2 string) string { + return strconv.Itoa(StringToInt(s1) - StringToInt(s2)) +} + +func StringFloatSub(s1, s2 string) string { + return strconv.FormatFloat(StringToFloat(s1)-StringToFloat(s2), 'f', -1, 64) +} + +func ListToSet(list []string) (set []string) { + m := make(map[string]bool, 0) + for i := range list { + m[list[i]] = true + } + for k := range m { + set = append(set, k) + } + return +} + +func ToJson(source interface{}) []byte { + b, _ := json.Marshal(source) + return b +} + +func NowTimeToString() string { + return time.Now().Format(TimeLayout) +} + +func NowTimeIncreaseString(t time.Duration) string { + now := time.Now() + now.Add(t) + return now.Format(TimeLayout) +} + +func NowDateToString() string { + return time.Now().Format(DateLayout) +} + +func NowDateToStringShort() string { + return time.Now().Format(DateLayoutShort) +} + +func Md5(s string) string { + h := md5.New() + h.Write([]byte(s)) + return hex.EncodeToString(h.Sum(nil)) +} + +func ZeroFillByStr(str string, resultLen int, reverse bool) string { + if len(str) > resultLen || resultLen <= 0 { + return str + } + if reverse { + return fmt.Sprintf("%0*s", resultLen, str) //不足前置补零 + } + result := str + for i := 0; i < resultLen-len(str); i++ { + result += "0" + } + return result + +} + +func IsMobile(no string) bool { + return regexp.MustCompile("^1[3456789]\\d{9}$").MatchString(no) +} + +func IsEmail(email string) bool { + pattern := `^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$` + return regexp.MustCompile(pattern).MatchString(email) +} + +func LegalUsername(source string) bool { + return regexp.MustCompile("^\\D[\\w-]{5,17}$").MatchString(source) +} + +func LegalShortUsername(source string) bool { + return regexp.MustCompile("^[a-zA-Z][\\w-]{2,17}$").MatchString(source) +} + +func LegalPassword(source string) bool { + return regexp.MustCompile("^[a-zA-Z0-9,.!@#$%^&*()_-]{6,18}$").MatchString(source) +} diff --git a/pkg/htools/HttpClient.go b/pkg/htools/HttpClient.go new file mode 100644 index 0000000..cf9a9af --- /dev/null +++ b/pkg/htools/HttpClient.go @@ -0,0 +1,71 @@ +package htools + +import ( + "io/ioutil" + "net/http" + "strings" +) + +// 调用POST请求 +func HttpPost(url string, body string) (remoteResponse string, err error) { + + bodyReader := strings.NewReader(body) + //application/x-www-form-urlencoded + //application/json + response, err1 := http.Post(url, "application/x-www-form-urlencoded", bodyReader) + + if err1 != nil { + err = err1 + return + } + defer response.Body.Close() + + resBody, err2 := ioutil.ReadAll(response.Body) + + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(resBody) + + return +} + +// 复杂http请求 +func HttpDo(httpMethod string, url string, headerMap map[string]string, rawBody string) (remoteResponse string, err error) { + + client := &http.Client{} + + req, err0 := http.NewRequest(httpMethod, url, strings.NewReader(rawBody)) + + if err0 != nil { + err = err0 + return + } + + if len(headerMap) > 0 { + for k, v := range headerMap { + req.Header.Set(k, v) + } + } + + resp, err1 := client.Do(req) + + if err1 != nil { + err = err1 + return + } + + defer resp.Body.Close() + + body, err2 := ioutil.ReadAll(resp.Body) + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(body) + return + +} diff --git a/pkg/htools/Random.go b/pkg/htools/Random.go new file mode 100644 index 0000000..c3ba91a --- /dev/null +++ b/pkg/htools/Random.go @@ -0,0 +1,47 @@ +package htools + +import ( + "math/rand" + "time" +) + +func GetVericode() string { + + result := RandNumber() + + return result + +} + +func RandInt64(min, max int64) int64 { + if min >= max || min == 0 || max == 0 { + return max + } + return rand.Int63n(max-min) + min +} + +func RandNumber() string { + + str := "0123456789" + bytes := []byte(str) + result := []byte{} + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := 0; i < 4; i++ { + result = append(result, bytes[r.Intn(len(bytes))]) + } + return string(result) + +} + +// 生成随机字符串 +func GetRandomString(l int) string { + + str := "0123456789abcdefghijklmnopqrstuvwxyz" + bytes := []byte(str) + result := []byte{} + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := 0; i < l; i++ { + result = append(result, bytes[r.Intn(len(bytes))]) + } + return string(result) +} diff --git a/pkg/htools/RsaUtils.go b/pkg/htools/RsaUtils.go new file mode 100644 index 0000000..8ff0437 --- /dev/null +++ b/pkg/htools/RsaUtils.go @@ -0,0 +1,146 @@ +package htools + +import ( + "bytes" + "crypto" + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/x509" + "encoding/base64" + "encoding/pem" + "errors" +) + +// RSA加密 +func RsaEncrypt(origData string, publicKey string) (string, error) { + + block, _ := pem.Decode([]byte(publicKey)) // 将密钥解析成公钥实例 + if block == nil { + return "", errors.New("public key error") + } + + pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) // 解析pem.Decode()返回的Block指针实例 + if err != nil { + return "", err + } + + pub := pubInterface.(*rsa.PublicKey) + + partLen := pub.N.BitLen()/8 - 11 + + chunks := ByteSplit([]byte(origData), partLen) + + buffer := bytes.NewBufferString("") + + for _, chunk := range chunks { + + bytes, err := rsa.EncryptPKCS1v15(rand.Reader, pub, chunk) + + if err != nil { + return "", err + } + + buffer.Write(bytes) + } + + return base64.StdEncoding.EncodeToString(buffer.Bytes()), nil + +} + +// RSA解密 +func RsaDecrypt(ciphertext string, privateKey string) (string, error) { + + block, _ := pem.Decode([]byte(privateKey)) + + if block == nil { + + return "", errors.New("private key error!") + } + priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return "", err + } + + partLen := priv.N.BitLen() / 8 + + raw, err := base64.StdEncoding.DecodeString(ciphertext) + + chunks := ByteSplit([]byte(raw), partLen) + + buffer := bytes.NewBufferString("") + + for _, chunk := range chunks { + + decrypted, err := rsa.DecryptPKCS1v15(rand.Reader, priv, chunk) + + if err != nil { + + return "", err + + } + + buffer.Write(decrypted) + + } + + return buffer.String(), err +} + +// RSA SHA1加签 +func RsaSHA1Sign(data string, privateKey string) (string, error) { + + block, _ := pem.Decode([]byte(privateKey)) + if block == nil { + return "", errors.New("Sign private key decode error") + } + + prk8, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return "", err + } + + h := sha1.New() + h.Write([]byte(data)) + hashed := h.Sum(nil) + + sign, err := rsa.SignPKCS1v15(rand.Reader, prk8, crypto.SHA1, hashed) + + if err != nil { + return "", err + } + + return base64.StdEncoding.EncodeToString(sign), err + +} + +// RSA SHA1验签 +func RsaSHA1Verify(data string, sign string, publicKey string) error { + + h := sha1.New() + h.Write([]byte(data)) + hashed := h.Sum(nil) + + decodedSign, err := base64.StdEncoding.DecodeString(sign) + + if err != nil { + + return err + + } + + block, _ := pem.Decode([]byte(publicKey)) + if block == nil { + return errors.New("Sign public key decode error") + } + + pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) // 解析pem.Decode()返回的Block指针实例 + if err != nil { + return err + } + + pub := pubInterface.(*rsa.PublicKey) + + return rsa.VerifyPKCS1v15(pub, crypto.SHA1, hashed, decodedSign) + +} diff --git a/pkg/htools/StringBuilder.go b/pkg/htools/StringBuilder.go new file mode 100644 index 0000000..fe4127a --- /dev/null +++ b/pkg/htools/StringBuilder.go @@ -0,0 +1,23 @@ +package htools + +import ( + "bytes" + "fmt" +) + +type StringBuilder struct { + buf bytes.Buffer +} + +func NewStringBuilder() *StringBuilder { + return &StringBuilder{buf: bytes.Buffer{}} +} + +func (this *StringBuilder) Append(obj interface{}) *StringBuilder { + this.buf.WriteString(fmt.Sprintf("%v", obj)) + return this +} + +func (this *StringBuilder) ToString() string { + return this.buf.String() +} diff --git a/pkg/htools/Tools.go b/pkg/htools/Tools.go new file mode 100644 index 0000000..4bbe49e --- /dev/null +++ b/pkg/htools/Tools.go @@ -0,0 +1,335 @@ +package htools + +import ( + "bytes" + "crypto/hmac" + "crypto/md5" + "crypto/sha1" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "math/rand" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +// MD5加密 +func StringToMD5(waitMD5string string) string { + + h := md5.New() + h.Write([]byte(waitMD5string)) + cipherStr := h.Sum(nil) + + result := hex.EncodeToString(cipherStr) + + return result +} + +// SHA1加密 +func StringToSHA1(waitMD5string string) string { + + h := sha1.New() + h.Write([]byte(waitMD5string)) + cipherStr := h.Sum(nil) + + result := hex.EncodeToString(cipherStr) + + return result +} + +// HMAC SHA1 +func StringToHmacSha1(waitShaString, keyStr string) string { + + key := []byte(keyStr) + mac := hmac.New(sha1.New, key) + mac.Write([]byte(waitShaString)) + + result := hex.EncodeToString(mac.Sum(nil)) + return result +} + +// 字符串转int64 +func StringToInt64(waitString string) int64 { + + stringInt64, err := strconv.ParseInt(waitString, 10, 64) + + if err != nil { + return 0 + } + return stringInt64 +} + +// 字符串转int32 +func StringToInt(waitString string) int { + if waitString == "" { + return 0 + } + stringInt, err := strconv.Atoi(waitString) + if err != nil { + return 0 + } + return stringInt +} + +func StringNumPlus(v1, v2 string) string { + return strconv.Itoa(StringToInt(v1) + StringToInt(v2)) +} + +// 字符串转float64 +func StringToFloat64(waitString string) float64 { + + stringInt64, err := strconv.ParseFloat(waitString, 64) + + if err != nil { + return 0 + } + return stringInt64 +} + +// float64保留2位 +func Float64Decimal(waitFloatValue float64) float64 { + + value, err := strconv.ParseFloat(fmt.Sprintf("%.2f", waitFloatValue), 64) + + if err != nil { + return 0 + } + return value +} + +// strconv.FormatFloat(float64, 'E', -1, 64) +// float64转字符串 +func Float64ToString(waitFloat64 float64) string { + + stringInt64 := strconv.FormatFloat(waitFloat64, 'f', -1, 64) + + return stringInt64 +} + +// 截取字符串 +func Substr(str string, start int, length int) string { + rs := []rune(str) + rl := len(rs) + end := 0 + + if start < 0 { + start = rl - 1 + start + } + end = start + length + + if start > end { + start, end = end, start + } + + if start < 0 { + start = 0 + } + if start > rl { + start = rl + } + if end < 0 { + end = 0 + } + if end > rl { + end = rl + } + + return string(rs[start:end]) +} + +// map转html +func MapToXML(mapData map[string]string) string { + + if len(mapData) == 0 { + return "" + } + sb := NewStringBuilder() + sb.Append("") + for key, val := range mapData { + sb.Append("<" + key + ">") + sb.Append(val) + sb.Append("") + + } + sb.Append("") + + return sb.ToString() +} + +// 获取当前年周 +func GetCurrentYearWeek() string { + + year, week := time.Now().ISOWeek() + + return strconv.Itoa(year) + strconv.Itoa(week) +} + +// 字符串转time类型 +func StringToTime(dateString string) time.Time { + + // 获取本地location + toBeCharge := dateString // 待转化为时间戳的字符串 注意 这里的小时和分钟还要秒必须写 因为是跟着模板走的 修改模板的话也可以不写 + timeLayout := "2006-01-02 15:04:05" // 转化所需模板 + loc, _ := time.LoadLocation("Local") // 重要:获取时区 + theTime, _ := time.ParseInLocation(timeLayout, toBeCharge, loc) // 使用模板在对应时区转化为time.time类型 + //sr := theTime.Unix() // 转化为时间戳 类型是int64 + + // 时间戳转日期 + //dataTimeStr := time.Unix(sr, 0).Format(timeLayout) // 设置时间戳 使用模板格式化为日期字符串 + + return theTime +} + +// 判断数组是否包含某个元素 +func CheckStringIsInArray(arrayList []string, element string) bool { + + if len(arrayList) == 0 { + return false + } + + isInArray := false + for _, data := range arrayList { + + if data == element { + isInArray = true + break + } + } + + return isInArray +} + +// slice to 字符串 +func StringListToString(stringList []string, split string) string { + if len(split) == 0 { + split = "," + } + return strings.Replace(strings.Trim(fmt.Sprint(stringList), "[]"), " ", split, -1) +} + +// map 转 url参数 +func MapToUrlParams(mapData map[string]string) string { + + mapLen := len(mapData) + if mapLen == 0 { + return "" + } + sb := NewStringBuilder() + + i := 0 + for k, v := range mapData { + + sb.Append(k + "=" + v) + if i < mapLen-1 { + sb.Append("&") + } + + i++ + } + return sb.ToString() +} + +// []byte 合并 +func BytesCombine(pBytes ...[]byte) []byte { + return bytes.Join(pBytes, []byte("")) +} + +// 获取当前UTC时间 秒数 +func GetCurrentUtcTimeSecond() int64 { + return time.Now().UTC().Unix() +} + +// byte数组分组 +func ByteSplit(buf []byte, lim int) [][]byte { + + var chunk []byte + + chunks := make([][]byte, 0, len(buf)/lim+1) + + for len(buf) >= lim { + + chunk, buf = buf[:lim], buf[lim:] + + chunks = append(chunks, chunk) + + } + + bufLen := len(buf) + if bufLen > 0 { + + chunks = append(chunks, buf[:bufLen]) + + } + + return chunks + +} + +// 强类型数组转为interface类型的数组 +func ToSlice(arr interface{}) []interface{} { + v := reflect.ValueOf(arr) + if v.Kind() != reflect.Slice { + panic("toslice arr not slice") + } + l := v.Len() + ret := make([]interface{}, l) + for i := 0; i < l; i++ { + ret[i] = v.Index(i).Interface() + } + return ret +} + +// 从字符串数组随机获取一个数组 +func GetRandArrayFromArray(sourceArr []interface{}, resultCount int) (resultArr []interface{}) { + + // 结果 + resultArr = make([]interface{}, 0) + + if len(sourceArr) < resultCount { + return + } + + r1 := rand.New(rand.NewSource(time.Now().UnixNano())) + for _, k := range r1.Perm(len(sourceArr)) { + + if len(resultArr) >= resultCount { + break + } + val := sourceArr[k] + resultArr = append(resultArr, val) + } + + return + +} + +func RelationKey(userIds ...string) (key string) { + sort.Strings(userIds) + return strings.Join(userIds, "") +} + +func ApplyKey(userIds ...string) (key string) { + return strings.Join(userIds, "") +} + +func IPToUint32(ip string) (uint32, error) { + ips := strings.Split(ip, ".") + if len(ips) != 4 { + return 0, errors.New("ip error") + } + num := uint64(0) + for i, item := range ips { + n, _ := strconv.ParseUint(item, 10, 32) + num += n << (8 * uint(3-i)) + } + return uint32(num), nil +} + +func JsonStr(v interface{}) string { + b, _ := json.Marshal(v) + return string(b) +} diff --git a/pkg/htools/UUID.go b/pkg/htools/UUID.go new file mode 100644 index 0000000..d07b743 --- /dev/null +++ b/pkg/htools/UUID.go @@ -0,0 +1,102 @@ +package htools + +import ( + crand "crypto/rand" + "encoding/hex" + "errors" + "fmt" + mrand "math/rand" + "regexp" + "strings" +) + +// seeded indicates if math/rand has been seeded +var seeded bool = false + +// uuidRegex matches the UUID string +var uuidRegex *regexp.Regexp = regexp.MustCompile(`^\{?([a-fA-F0-9]{8})-?([a-fA-F0-9]{4})-?([a-fA-F0-9]{4})-?([a-fA-F0-9]{4})-?([a-fA-F0-9]{12})\}?$`) + +// UUID type. +type UUID [16]byte + +// Hex returns a hex string representation of the UUID in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx format. +func (this UUID) Hex() string { + + x := [16]byte(this) + + return fmt.Sprintf("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + x[0], x[1], x[2], x[3], x[4], + x[5], x[6], + x[7], x[8], + x[9], x[10], x[11], x[12], x[13], x[14], x[15]) +} + +// Rand generates a new version 4 UUID. +func Rand() UUID { + var x [16]byte + randBytes(x[:]) + x[6] = (x[6] & 0x0F) | 0x40 + x[8] = (x[8] & 0x3F) | 0x80 + return x +} + +// FromStr returns a UUID based on a string. +// The string could be in the following format: +// +// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +// +// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +// +// {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} +// +// If the string is not in one of these formats, it'll return an error. +func FromStr(s string) (id UUID, err error) { + if s == "" { + err = errors.New("Empty string") + return + } + + parts := uuidRegex.FindStringSubmatch(s) + if parts == nil { + err = errors.New("Invalid string format") + return + } + + var array [16]byte + slice, _ := hex.DecodeString(strings.Join(parts[1:], "")) + copy(array[:], slice) + id = array + return +} + +// MustFromStr behaves similarly to FromStr except that it'll panic instead of +// returning an error. +func MustFromStr(s string) UUID { + id, err := FromStr(s) + if err != nil { + panic(err) + } + return id +} + +// randBytes uses crypto random to get random numbers. If fails then it uses math random. +func randBytes(x []byte) { + + length := len(x) + n, err := crand.Read(x) + + if n != length || err != nil { + for length > 0 { + length-- + x[length] = byte(mrand.Int31n(256)) + } + } +} + +func GetUUID() string { + + var uuid UUID = Rand() + + return uuid.Hex() + +} diff --git a/pkg/log/zap.go b/pkg/log/zap.go new file mode 100644 index 0000000..72222f3 --- /dev/null +++ b/pkg/log/zap.go @@ -0,0 +1,195 @@ +package log + +import ( + "context" + "fmt" + "os" + "strings" + "time" + + "github.com/natefinch/lumberjack" + "github.com/spf13/viper" + "go.opentelemetry.io/otel/trace" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "gorm.io/gorm/logger" +) + +var Log *zap.Logger + +type ZapStarter struct { +} + +func (s *ZapStarter) Init() error { + Init() + return nil +} + +func Init() { + // 编码器 + encoderConfig := zap.NewProductionEncoderConfig() // NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式 + encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 指定时间格式 + encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder // 按级别显示不同颜色,不需要的话取值 CapitalLevelEncoder 就可以了 + encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder // 是否显示完整文件路径 + encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05.000") + env := viper.GetString("env") + //encoder := zapcore.NewJSONEncoder(encoderConfig) + encoder := zapcore.NewConsoleEncoder(encoderConfig) // todo + if env != "dev" { + fmt.Printf("zap log with %s env\n", env) + encoder = zapcore.NewConsoleEncoder(encoderConfig) + } + normalPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { // info 级别 + return lev < zap.ErrorLevel && lev >= zap.InfoLevel + }) + + errorPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { // info 级别 + return lev > zap.InfoLevel + }) + + normalWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ + Filename: viper.GetString("log.normal.file"), // 日志文件存放目录 + MaxSize: viper.GetInt("log.normal.size"), // 文件大小限制,单位MB + MaxBackups: viper.GetInt("log.normal.backups"), // 最大保留日志文件数量 + MaxAge: viper.GetInt("log.normal.age"), // 日志文件保留天数 + Compress: viper.GetBool("log.normal.compress"), // 是否压缩处理 + LocalTime: true, + }) + + errorWriteSyncer := zapcore.AddSync(&lumberjack.Logger{ + Filename: viper.GetString("log.error.file"), + MaxSize: viper.GetInt("log.error.size"), + MaxBackups: viper.GetInt("log.error.backups"), + MaxAge: viper.GetInt("log.error.age"), + Compress: viper.GetBool("log.error.compress"), + LocalTime: true, + }) + + Log = zap.New(zapcore.NewTee( + []zapcore.Core{ + zapcore.NewCore( + encoder, + zapcore.NewMultiWriteSyncer(normalWriteSyncer, zapcore.AddSync(os.Stdout)), + normalPriority, + ), + zapcore.NewCore( + encoder, + zapcore.NewMultiWriteSyncer(errorWriteSyncer, zapcore.AddSync(os.Stdout)), + errorPriority, + ), + }..., + ), zap.AddCaller(), zap.AddCallerSkip(1)) +} + +func traceID(ctx context.Context, fields ...zap.Field) []zap.Field { + sp := trace.SpanContextFromContext(ctx) + traceID := zap.String("trace_id", sp.TraceID().String()) + fields = append(fields, traceID) + return fields +} + +func InfoWithCtx(ctx context.Context, msg string, fields ...zap.Field) { + Info(msg, traceID(ctx, fields...)...) +} + +func Info(msg string, fields ...zap.Field) { + if strings.Contains(msg, "SHOW STATUS") { + return + } + if strings.Contains(msg, "GET _health") { + return + } + if strings.Contains(msg, "GET url: /health") { + return + } + Log.Info(msg, fields...) +} + +func WarnWithCtx(ctx context.Context, msg string, fields ...zap.Field) { + Warn(msg, traceID(ctx, fields...)...) +} + +func Warn(msg string, fields ...zap.Field) { + Log.Warn(msg, fields...) +} + +func ErrorWithCtx(ctx context.Context, msg string, fields ...zap.Field) { + Log.Error(msg, traceID(ctx, fields...)...) +} + +func Error(msg string, fields ...zap.Field) { + Log.Error(msg, fields...) +} + +func InfoFWithCtx(ctx context.Context, msg string, args ...interface{}) { + Log.Info(fmt.Sprintf(msg, args...), traceID(ctx)...) +} + +func InfoF(msg string, args ...interface{}) { + msg = fmt.Sprintf(msg, args...) + Info(msg) +} + +func WarnFWithCtx(ctx context.Context, msg string, args ...interface{}) { + Log.Warn(fmt.Sprintf(msg, args...), traceID(ctx)...) +} + +func WarnF(msg string, args ...interface{}) { + Log.Warn(fmt.Sprintf(msg, args...)) +} + +func ErrorFWithCtx(ctx context.Context, msg string, args ...interface{}) { + Log.Warn(fmt.Sprintf(msg, args...), traceID(ctx)...) +} + +func ErrorF(msg string, args ...interface{}) { + Log.Error(fmt.Sprintf(msg, args...)) +} + +type GLog struct { +} + +func (g GLog) LogMode(_ logger.LogLevel) logger.Interface { + return &g +} + +func (g GLog) Info(_ context.Context, msg string, args ...interface{}) { + Info(fmt.Sprintf(msg, args...)) +} + +func (g GLog) Warn(_ context.Context, msg string, args ...interface{}) { + Warn(fmt.Sprintf(msg, args...)) +} + +func (g GLog) Error(_ context.Context, msg string, args ...interface{}) { + Error(fmt.Sprintf(msg, args...)) +} + +func (g GLog) Trace(_ context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { + sql, ra := fc() + if sql == "SHOW STATUS" { + return + } + Info("gorm callback trace", zap.String("sql", sql), zap.Int64("rows", ra), zap.Error(err)) +} + +func (g GLog) Printf(msg string, args ...interface{}) { + Info(fmt.Sprintf(msg, args...)) +} + +// CLog cron logger +type CLog struct { +} + +func (c CLog) Info(msg string, keysAndValues ...interface{}) { + InfoF(msg, keysAndValues...) +} + +// Error logs an error condition. +func (c CLog) Error(err error, msg string, keysAndValues ...interface{}) { + ErrorF(msg, keysAndValues...) +} + +func (c CLog) Printf(msg string, args ...interface{}) { + InfoF(msg, args...) +} diff --git a/pkg/middleware/authorize.go b/pkg/middleware/authorize.go new file mode 100644 index 0000000..7839d87 --- /dev/null +++ b/pkg/middleware/authorize.go @@ -0,0 +1,30 @@ +package middleware + +import ( + "github.com/anxpp/common-utils/logg" + "github.com/anxpp/common-utils/net" + "github.com/gin-gonic/gin" + "net/http" + "net/url" +) + +func Authorize() gin.HandlerFunc { + return func(c *gin.Context) { + inputToken := c.Request.Header.Get("X-Token") + if len(inputToken) == 0 { + c.JSON(http.StatusOK, net.Custom(500, "缺少授权token")) + c.Abort() + } + + c.Next() + } +} + +func LogRequest() gin.HandlerFunc { + return func(c *gin.Context) { + decodedStr, _ := url.QueryUnescape(c.Request.RequestURI) + logg.Info("request:", c.Request.RemoteAddr, decodedStr) + + c.Next() + } +} diff --git a/pkg/middleware/cors.go b/pkg/middleware/cors.go new file mode 100644 index 0000000..c50e84b --- /dev/null +++ b/pkg/middleware/cors.go @@ -0,0 +1,25 @@ +package middleware + +import ( + "github.com/gin-gonic/gin" + "net/http" +) + +// 处理跨域请求,支持options访问 +func Cors() gin.HandlerFunc { + return func(c *gin.Context) { + method := c.Request.Method + c.Header("Access-Control-Allow-Origin", "*") // 可将将 * 替换为指定的域名 + c.Header("Access-Control-Allow-Headers", "Content-Type,X-TOKEN") //你想放行的header也可以在后面自行添加 + c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS") //我自己只使用 get post 所以只放行它 + c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") + c.Header("Access-Control-Allow-Credentials", "true") + + // 放行所有OPTIONS方法 + if method == "OPTIONS" { + c.AbortWithStatus(http.StatusNoContent) + } + // 处理请求 + c.Next() + } +} diff --git a/pkg/middleware/global_panic.go b/pkg/middleware/global_panic.go new file mode 100644 index 0000000..31d48ee --- /dev/null +++ b/pkg/middleware/global_panic.go @@ -0,0 +1,35 @@ +package middleware + +import ( + "github.com/gin-gonic/gin" + "net/http" + "runtime/debug" +) + +func Recover(c *gin.Context) { + defer func() { + if r := recover(); r != nil { + debug.PrintStack() + + c.JSON(http.StatusOK, gin.H{ + "code": 500, + "message": "系统异常", + "detailError": errorToString(r), + "data": nil, + }) + + c.Abort() + } + }() + + c.Next() +} + +func errorToString(r interface{}) string { + switch v := r.(type) { + case error: + return v.Error() + default: + return r.(string) + } +} diff --git a/pkg/model/admin_privilege.gen.go b/pkg/model/admin_privilege.gen.go new file mode 100644 index 0000000..24bee59 --- /dev/null +++ b/pkg/model/admin_privilege.gen.go @@ -0,0 +1,38 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameAdminPrivilege = "admin_privilege" + +// AdminPrivilege 租户-权限表 +type AdminPrivilege struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + TenantID string `gorm:"column:tenant_id;type:char(32);not null;default:system;comment:企业ID" json:"tenant_id"` // 企业ID + ScopeID string `gorm:"column:scope_id;type:char(32);not null;comment:范围" json:"scope_id"` // 范围 + ParentID string `gorm:"column:parent_id;type:char(32);not null;comment:父ID" json:"parent_id"` // 父ID + Code string `gorm:"column:code;type:varchar(64);not null;comment:代码" json:"code"` // 代码 + Name string `gorm:"column:name;type:varchar(64);not null;index:idx_name,priority:1;comment:权限名称" json:"name"` // 权限名称 + Level int32 `gorm:"column:level;type:int;not null;comment:权限级别" json:"level"` // 权限级别 + SourceType string `gorm:"column:source_type;type:varchar(64);not null;comment:类型:resource、interface等" json:"source_type"` // 类型:resource、interface等 + TargetType string `gorm:"column:target_type;type:varchar(255);not null" json:"target_type"` + Target string `gorm:"column:target;type:varchar(255);not null;comment:权限值 resource:菜单路径; api=url-pre" json:"target"` // 权限值 resource:菜单路径; api=url-pre + Desc string `gorm:"column:desc;type:varchar(64);not null;comment:描述" json:"desc"` // 描述 + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;index:idx_delete_at,priority:1;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;index:idx_delete_at,priority:2;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName AdminPrivilege's table name +func (*AdminPrivilege) TableName() string { + return TableNameAdminPrivilege +} diff --git a/pkg/model/admin_role.gen.go b/pkg/model/admin_role.gen.go new file mode 100644 index 0000000..e4f738a --- /dev/null +++ b/pkg/model/admin_role.gen.go @@ -0,0 +1,33 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameAdminRole = "admin_role" + +// AdminRole 租户-角色表 +type AdminRole struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + TenantID string `gorm:"column:tenant_id;type:char(32);not null;default:system;comment:企业ID" json:"tenant_id"` // 企业ID + ScopeID string `gorm:"column:scope_id;type:char(32);not null;comment:角色范围" json:"scope_id"` // 角色范围 + Code string `gorm:"column:code;type:varchar(64);not null;comment:代码" json:"code"` // 代码 + Name string `gorm:"column:name;type:varchar(64);not null;index:idx_name,priority:1" json:"name"` + Desc string `gorm:"column:desc;type:varchar(64);not null;comment:描述" json:"desc"` // 描述 + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;index:idx_delete_at,priority:1;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;index:idx_delete_at,priority:2;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName AdminRole's table name +func (*AdminRole) TableName() string { + return TableNameAdminRole +} diff --git a/pkg/model/admin_role_privilege.gen.go b/pkg/model/admin_role_privilege.gen.go new file mode 100644 index 0000000..f11424e --- /dev/null +++ b/pkg/model/admin_role_privilege.gen.go @@ -0,0 +1,32 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameAdminRolePrivilege = "admin_role_privilege" + +// AdminRolePrivilege 租户角色-权限表 +type AdminRolePrivilege struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + TenantID string `gorm:"column:tenant_id;type:char(32);not null;default:system;comment:企业ID" json:"tenant_id"` // 企业ID + ScopeID string `gorm:"column:scope_id;type:char(32);not null;comment:范围" json:"scope_id"` // 范围 + RoleID string `gorm:"column:role_id;type:char(32);not null;uniqueIndex:idx_uk,priority:1;comment:角色ID" json:"role_id"` // 角色ID + PrivilegeID string `gorm:"column:privilege_id;type:char(32);not null;uniqueIndex:idx_uk,priority:2;comment:权限ID" json:"privilege_id"` // 权限ID + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;index:idx_delete_at,priority:1;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;index:idx_delete_at,priority:2;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName AdminRolePrivilege's table name +func (*AdminRolePrivilege) TableName() string { + return TableNameAdminRolePrivilege +} diff --git a/pkg/model/admin_user.gen.go b/pkg/model/admin_user.gen.go new file mode 100644 index 0000000..9811abc --- /dev/null +++ b/pkg/model/admin_user.gen.go @@ -0,0 +1,39 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameAdminUser = "admin_user" + +// AdminUser 用户表 +type AdminUser struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + TenantID string `gorm:"column:tenant_id;type:char(32);not null;default:system;comment:企业ID" json:"tenant_id"` // 企业ID + Username string `gorm:"column:username;type:varchar(64);not null;uniqueIndex:idx_name,priority:1;comment:用户名" json:"username"` // 用户名 + Channel string `gorm:"column:channel;type:varchar(64);not null;comment:渠道:ADMIN=后台维护 LDAP=统一管理获取 REGISTER=注册" json:"channel"` // 渠道:ADMIN=后台维护 LDAP=统一管理获取 REGISTER=注册 + ChannelCode string `gorm:"column:channel_code;type:varchar(255);not null;default:auth-center.prod" json:"channel_code"` + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` // 昵称 + Desc string `gorm:"column:desc;type:varchar(255);not null" json:"desc"` + State int32 `gorm:"column:state;type:int;not null;default:1;comment:1=启用 2=禁用" json:"state"` // 1=启用 2=禁用 + Password string `gorm:"column:password;type:varchar(64);not null;comment:密码" json:"password"` // 密码 + PassCipher string `gorm:"column:pass_cipher;type:varchar(64);not null;default:MD5;comment:加密方式" json:"pass_cipher"` // 加密方式 + PassSalt string `gorm:"column:pass_salt;type:varchar(64);not null;comment:密码盐" json:"pass_salt"` // 密码盐 + ExtID string `gorm:"column:ext_id;type:varchar(64);not null;comment:外部ID" json:"ext_id"` // 外部ID + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;index:idx_delete_at,priority:1;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;index:idx_delete_at,priority:2;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName AdminUser's table name +func (*AdminUser) TableName() string { + return TableNameAdminUser +} diff --git a/pkg/model/admin_user_role.gen.go b/pkg/model/admin_user_role.gen.go new file mode 100644 index 0000000..e692373 --- /dev/null +++ b/pkg/model/admin_user_role.gen.go @@ -0,0 +1,32 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameAdminUserRole = "admin_user_role" + +// AdminUserRole 租户用户-角色表 +type AdminUserRole struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + TenantID string `gorm:"column:tenant_id;type:char(32);not null;default:system;comment:企业ID" json:"tenant_id"` // 企业ID + ScopeID string `gorm:"column:scope_id;type:char(32);not null;comment:范围" json:"scope_id"` // 范围 + UserID string `gorm:"column:user_id;type:char(32);not null;uniqueIndex:idx_uk,priority:1;comment:用户ID" json:"user_id"` // 用户ID + RoleID string `gorm:"column:role_id;type:char(32);not null;uniqueIndex:idx_uk,priority:2;comment:角色ID" json:"role_id"` // 角色ID + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;index:idx_delete_at,priority:1;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;index:idx_delete_at,priority:2;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName AdminUserRole's table name +func (*AdminUserRole) TableName() string { + return TableNameAdminUserRole +} diff --git a/pkg/model/data_attach.gen.go b/pkg/model/data_attach.gen.go new file mode 100644 index 0000000..f6a34eb --- /dev/null +++ b/pkg/model/data_attach.gen.go @@ -0,0 +1,43 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameDataAttach = "data_attach" + +// DataAttach 通用附件 +type DataAttach struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + TenantID string `gorm:"column:tenant_id;type:char(32);not null;default:system;comment:企业ID" json:"tenant_id"` // 企业ID + PartUploadID string `gorm:"column:part_upload_id;type:char(32);not null;comment:分片上传upload id" json:"part_upload_id"` // 分片上传upload id + TotalChunks int32 `gorm:"column:total_chunks;type:int;not null;comment:分片总数" json:"total_chunks"` // 分片总数 + PartSize int32 `gorm:"column:part_size;type:int;not null;comment:分片大小-单位M" json:"part_size"` // 分片大小-单位M + Md5 string `gorm:"column:md5;type:char(32);not null;comment:文件md5" json:"md5"` // 文件md5 + DataType string `gorm:"column:data_type;type:varchar(64);not null;comment:数据类型:SATELLITE=卫星图,其他请使用时完善定义" json:"data_type"` // 数据类型:SATELLITE=卫星图,其他请使用时完善定义 + DataID string `gorm:"column:data_id;type:char(32);not null;comment:数据ID" json:"data_id"` // 数据ID + CommonType string `gorm:"column:common_type;type:varchar(64);not null;comment:通用类型:IMAGE = 图片(jfif、png、jpg等),DOC = 文档(excel、docs、ppt、pdf等),BINARY = 二进制文件(exe等)" json:"common_type"` // 通用类型:IMAGE = 图片(jfif、png、jpg等),DOC = 文档(excel、docs、ppt、pdf等),BINARY = 二进制文件(exe等) + FileType string `gorm:"column:file_type;type:varchar(64);not null;comment:文件类型" json:"file_type"` // 文件类型 + FileSize int32 `gorm:"column:file_size;type:int;not null;comment:文件大小" json:"file_size"` // 文件大小 + FileName string `gorm:"column:file_name;type:varchar(255);not null;comment:文件名称" json:"file_name"` // 文件名称 + FilePath string `gorm:"column:file_path;type:varchar(255);not null;comment:文件路径" json:"file_path"` // 文件路径 + FileThumbPath string `gorm:"column:file_thumb_path;type:varchar(255);not null;comment:缩略文件路径" json:"file_thumb_path"` // 缩略文件路径 + FileThumbType string `gorm:"column:file_thumb_type;type:varchar(64);not null;comment:缩略图文件类型" json:"file_thumb_type"` // 缩略图文件类型 + UploadState *int32 `gorm:"column:upload_state;type:int;default:1;comment:0未上传,1上传" json:"upload_state"` // 0未上传,1上传 + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;index:idx_delete_at,priority:1;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;index:idx_data_time,priority:1;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;index:idx_delete_at,priority:2;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName DataAttach's table name +func (*DataAttach) TableName() string { + return TableNameDataAttach +} diff --git a/pkg/model/game.gen.go b/pkg/model/game.gen.go new file mode 100644 index 0000000..cadaa47 --- /dev/null +++ b/pkg/model/game.gen.go @@ -0,0 +1,34 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameGame = "game" + +// Game 交易游戏 +type Game struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + Name string `gorm:"column:name;type:varchar(255);not null;comment:游戏名称" json:"name"` // 游戏名称 + Desc string `gorm:"column:desc;type:varchar(255);not null;comment:描述" json:"desc"` // 描述 + Icon string `gorm:"column:icon;type:varchar(255);not null;comment:图标" json:"icon"` // 图标 + Logo string `gorm:"column:logo;type:varchar(255);not null;comment:logo" json:"logo"` // logo + Sort int32 `gorm:"column:sort;type:int;not null;default:9999;comment:排序" json:"sort"` // 排序 + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName Game's table name +func (*Game) TableName() string { + return TableNameGame +} diff --git a/pkg/model/trade_commodity.gen.go b/pkg/model/trade_commodity.gen.go new file mode 100644 index 0000000..3a787ea --- /dev/null +++ b/pkg/model/trade_commodity.gen.go @@ -0,0 +1,36 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameTradeCommodity = "trade_commodity" + +// TradeCommodity 交易的商品 +type TradeCommodity struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + CommodityType string `gorm:"column:commodity_type;type:varchar(255);not null;comment:GAME_ROLE=游戏角色" json:"commodity_type"` // GAME_ROLE=游戏角色 + UserID string `gorm:"column:user_id;type:char(32);not null;comment:用户ID" json:"user_id"` // 用户ID + CommodityID string `gorm:"column:commodity_id;type:char(32);not null;comment:如游戏角色ID(user_game_role的ID)" json:"commodity_id"` // 如游戏角色ID(user_game_role的ID) + Desc string `gorm:"column:desc;type:varchar(255);not null;comment:描述" json:"desc"` // 描述 + Price int32 `gorm:"column:price;type:int;not null;comment:价格,单位为分" json:"price"` // 价格,单位为分 + Icon string `gorm:"column:icon;type:varchar(255);not null;comment:图标" json:"icon"` // 图标 + Logo string `gorm:"column:logo;type:varchar(255);not null;comment:logo" json:"logo"` // logo + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName TradeCommodity's table name +func (*TradeCommodity) TableName() string { + return TableNameTradeCommodity +} diff --git a/pkg/model/user.gen.go b/pkg/model/user.gen.go new file mode 100644 index 0000000..78c1648 --- /dev/null +++ b/pkg/model/user.gen.go @@ -0,0 +1,34 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameUser = "user" + +// User 用户 +type User struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` // ID + No string `gorm:"column:no;type:varchar(64);not null;index:uk,priority:1;comment:用户号、用户名" json:"no"` // 用户号、用户名 + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` // 昵称 + Sign string `gorm:"column:sign;type:varchar(255);not null;comment:签名" json:"sign"` // 签名 + Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"avatar"` // 头像 + Password string `gorm:"column:password;type:varchar(64);not null;comment:密码" json:"password"` // 密码 + PassSalt string `gorm:"column:pass_salt;type:varchar(32);not null;comment:密码盐" json:"pass_salt"` // 密码盐 + WxOpenID string `gorm:"column:wx_open_id;type:varchar(64);not null;comment:OPEN ID" json:"wx_open_id"` // OPEN ID + WxUnionID string `gorm:"column:wx_union_id;type:varchar(64);not null;comment:UNION ID" json:"wx_union_id"` // UNION ID + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 +} + +// TableName User's table name +func (*User) TableName() string { + return TableNameUser +} diff --git a/pkg/model/user_game_role.gen.go b/pkg/model/user_game_role.gen.go new file mode 100644 index 0000000..98b295d --- /dev/null +++ b/pkg/model/user_game_role.gen.go @@ -0,0 +1,35 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameUserGameRole = "user_game_role" + +// UserGameRole 用户的游戏角色 +type UserGameRole struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + GameID string `gorm:"column:game_id;type:char(32);not null;comment:游戏" json:"game_id"` // 游戏 + GameRoleName string `gorm:"column:game_role_name;type:varchar(255);not null;comment:角色名称" json:"game_role_name"` // 角色名称 + GameRoleID string `gorm:"column:game_role_id;type:varchar(255);not null;comment:角色ID" json:"game_role_id"` // 角色ID + Desc string `gorm:"column:desc;type:varchar(255);not null;comment:描述" json:"desc"` // 描述 + Icon string `gorm:"column:icon;type:varchar(255);not null;comment:图标" json:"icon"` // 图标 + Logo string `gorm:"column:logo;type:varchar(255);not null;comment:logo" json:"logo"` // logo + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName UserGameRole's table name +func (*UserGameRole) TableName() string { + return TableNameUserGameRole +} diff --git a/pkg/model/user_game_role_prop.gen.go b/pkg/model/user_game_role_prop.gen.go new file mode 100644 index 0000000..ec95595 --- /dev/null +++ b/pkg/model/user_game_role_prop.gen.go @@ -0,0 +1,38 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package model + +import ( + "time" + + "gorm.io/gorm" +) + +const TableNameUserGameRoleProp = "user_game_role_prop" + +// UserGameRoleProp 用户的游戏角色属性 +type UserGameRoleProp struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + UserID string `gorm:"column:user_id;type:char(32);not null;comment:用户ID" json:"user_id"` // 用户ID + GameID string `gorm:"column:game_id;type:char(32);not null;comment:游戏" json:"game_id"` // 游戏 + RoleID string `gorm:"column:role_id;type:varchar(255);not null;comment:角色ID,user_game_role的ID" json:"role_id"` // 角色ID,user_game_role的ID + Type string `gorm:"column:type;type:varchar(255);not null;comment:TEXT=文字 SKIN=皮肤" json:"type"` // TEXT=文字 SKIN=皮肤 + Title string `gorm:"column:title;type:varchar(255);not null;comment:标题" json:"title"` // 标题 + Content string `gorm:"column:content;type:varchar(255);not null;comment:内容" json:"content"` // 内容 + URL string `gorm:"column:url;type:varchar(255);not null;comment:链接" json:"url"` // 链接 + Ext string `gorm:"column:ext;type:varchar(255);not null;comment:扩展字段" json:"ext"` // 扩展字段 + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + Sort int32 `gorm:"column:sort;type:int;not null;default:9999;comment:排序" json:"sort"` // 排序 + DeleteAt *gorm.DeletedAt `gorm:"column:delete_at;type:datetime;comment:del标志" json:"delete_at"` // del标志 + CreateAt time.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt time.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} + +// TableName UserGameRoleProp's table name +func (*UserGameRoleProp) TableName() string { + return TableNameUserGameRoleProp +} diff --git a/pkg/partner/Apple/AppleClient.go b/pkg/partner/Apple/AppleClient.go new file mode 100644 index 0000000..e41b753 --- /dev/null +++ b/pkg/partner/Apple/AppleClient.go @@ -0,0 +1,166 @@ +package Apple + +import ( + "crypto/ecdsa" + "crypto/x509" + "encoding/json" + "encoding/pem" + "errors" + "fmt" + "net/http" + "servicebase/pkg/common/HyTools" + "time" + + "github.com/anxpp/beego/logs" + "github.com/dgrijalva/jwt-go" + "github.com/spf13/viper" +) + +const ( + AppleServerApiUrl = "https://appleid.apple.com/auth/token" +) + +// 苹果登录 +type AppleClient struct { +} + +func NewAppleClient() *AppleClient { + return &AppleClient{} +} + +type Claims struct { + jwt.StandardClaims + Iss string `json:"iss"` + Aud string `json:"aud"` + Exp int64 `json:"exp"` + Iat int64 `json:"iat"` + Sub string `json:"sub"` + AtHash string `json:"at_hash"` + Email string `json:"email"` + EmailVerified string `json:"email_verified"` + AuthTime int64 `json:"auth_time"` + NonceSupported bool `json:"nonce_supported"` +} + +type ResJwt struct { + Token string `json:"access_token"` + Type string `json:"token_type"` + ExpiresIn int64 `json:"expires_in"` + RefreshToken string `json:"refresh_token"` + IdToken string `json:"id_token"` +} + +// 验证code +func (client *AppleClient) VerifyAppleAuthCode(authCode string) (appleUserId string, resultErr error) { + + apiUrl := AppleServerApiUrl + + clientId := viper.GetString("apple.IOSBundleId") + + param := make(map[string]string, 0) + param["client_id"] = clientId + param["code"] = authCode + param["grant_type"] = viper.GetString("apple.GrantType") + + // 生成密钥 + secret := client.GenerateClientSecret() + + if len(secret) == 0 { + resultErr = errors.New("生成密钥出错") + return + } + param["client_secret"] = secret + + paramString := "" + for k, v := range param { + kv := k + "=" + v + "&" + paramString += kv + } + + if len(paramString) > 0 { + paramString = HyTools.Substr(paramString, 0, len(paramString)-1) + } + + logs.Info("signWithApple params:" + paramString) + + headerMap := make(map[string]string, 0) + headerMap["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8" + + result, err := HyTools.HttpDo(http.MethodPost, apiUrl, headerMap, paramString) + if err != nil { + logs.Error("苹果登录失败,请求API失败:" + err.Error()) + resultErr = err + return + } + logs.Info("signWithApple result:" + result) + var resultDTO ResJwt + e := json.Unmarshal([]byte(result), &resultDTO) + if e != nil { + logs.Error("苹果登录失败,JSON:" + e.Error()) + resultErr = err + return + } + token, _ := jwt.ParseWithClaims(resultDTO.IdToken, &Claims{}, func(token *jwt.Token) (interface{}, error) { + // Don't forget to validate the alg is what you expect: + if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { + return nil, fmt.Errorf("Unexpected signing method: %v ", token.Header["alg"]) + } + return token, nil + }) + if claims, ok := token.Claims.(*Claims); ok { + appleUserId = claims.Sub + } else { + resultErr = errors.New("jwt error, token not correct") + } + return +} + +// 生成jwt密钥 +func (client *AppleClient) GenerateClientSecret() (secret string) { + + token := &jwt.Token{ + Header: map[string]interface{}{ + "alg": "ES256", + "kid": viper.GetString("apple.KeyId"), + }, + Claims: jwt.MapClaims{ + "iss": viper.GetString("apple.TeamId"), + "iat": time.Now().Unix(), + // constraint: exp - iat <= 180 days + "exp": time.Now().Add(24 * time.Hour).Unix(), + "aud": "https://appleid.apple.com", + "sub": viper.GetString("apple.IOSBundleId"), + }, + Method: jwt.SigningMethodES256, + } + + ecdsaKey, _ := AuthKeyFromBytes([]byte(viper.GetString("apple.PrivateKey"))) + ss, _ := token.SignedString(ecdsaKey) + + secret = ss + return +} + +func AuthKeyFromBytes(key []byte) (*ecdsa.PrivateKey, error) { + var err error + + // Parse PEM block + var block *pem.Block + if block, _ = pem.Decode(key); block == nil { + return nil, errors.New("token: AuthKey must be a valid .p8 PEM file") + } + + // Parse the key + var parsedKey interface{} + if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { + return nil, err + } + + var pkey *ecdsa.PrivateKey + var ok bool + if pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { + return nil, errors.New("token: AuthKey must be of type ecdsa.PrivateKey") + } + + return pkey, nil +} diff --git a/pkg/partner/Apple/AppleClient_test.go b/pkg/partner/Apple/AppleClient_test.go new file mode 100644 index 0000000..21a0cdf --- /dev/null +++ b/pkg/partner/Apple/AppleClient_test.go @@ -0,0 +1,32 @@ +package Apple + +import ( + "encoding/json" + "fmt" + "github.com/anxpp/beego/logs" + "github.com/dgrijalva/jwt-go" + "testing" +) + +func TestAppleClient_VerifyAppleAuthCode(t *testing.T) { + result := `{"access_token":"a43aca909b09c47e7ab17cf65f2f87d5a.0.mrwxs.NGHQpX4Dp1mHUeGiC7UF7A","token_type":"Bearer","expires_in":3600,"refresh_token":"r472107c8150844c0995604692008d3c5.0.mrwxs.WE3wQnwhQpVVX77-U6169A","id_token":"eyJraWQiOiI4NkQ4OEtmIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY24ubWVldGFsay5lbmVuIiwiZXhwIjoxNTk4MTA1NDE2LCJpYXQiOjE1OTgxMDQ4MTYsInN1YiI6IjAwMTY3Mi43NTQyNGFiMGRjYWM0YTM2YTkxMmI5NDNmMzg5MmQ4ZC4xMDUzIiwiYXRfaGFzaCI6IlUwVUM5QTdnRWc4cnFfOHVORWxocVEiLCJlbWFpbCI6IjgzNDA3NzA2NUBxcS5jb20iLCJlbWFpbF92ZXJpZmllZCI6InRydWUiLCJhdXRoX3RpbWUiOjE1OTgxMDQ4MTMsIm5vbmNlX3N1cHBvcnRlZCI6dHJ1ZX0.G1GwHu5qWW1Hj8-E2BObM3BIwi0ntDeoX0ymHR2EufgXxWcBI7rePadO2vGqJIRFpzsoN7ixRT1-ChpvUT7X37izDqCMHRTsBgEEKqh15gvgB-siYfssBmojcJx4W_DcKx24-4Z_mi4_BejPU6_kstJrlOPzh33dOPiUZJcY0pAWpynaTPFR3WkdbLd7RB9N-s5Z9jY2VF2SQLA8kkTcdRZQsfagErGcawJK6zttkR8EwK3D0wo_cfXoJ9Q49fayzAwkyhqfMrAWZZVwzDDtdNq4dmXfnPxNG1pootRF4PZE1IkJKteN0262xp4XZEBuWsMBeUwwjHlpu4gr77Re9w"}` + + var resultDTO ResJwt + e := json.Unmarshal([]byte(result), &resultDTO) + if e != nil { + logs.Error("JSON:" + e.Error()) + return + } + secret := NewAppleClient().GenerateClientSecret() + token, jwtError := jwt.ParseWithClaims(resultDTO.IdToken, &Claims{}, func(token *jwt.Token) (interface{}, error) { + // Don't forget to validate the alg is what you expect: + if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { + return nil, fmt.Errorf("Unexpected signing method: %v ", token.Header["alg"]) + } + return []byte(secret), nil + }) + logs.Info(jwtError) + logs.Info(token.Valid) + logs.Info(token.SigningString()) + logs.Info(token.Claims.(*Claims).Sub) +} diff --git a/pkg/partner/WxPay/WxPayClient.go b/pkg/partner/WxPay/WxPayClient.go new file mode 100644 index 0000000..25f129b --- /dev/null +++ b/pkg/partner/WxPay/WxPayClient.go @@ -0,0 +1,456 @@ +package WxPay + +import ( + "context" + "encoding/json" + "encoding/xml" + "errors" + "net/http" + "servicebase/pkg/common" + "servicebase/pkg/htools" + "servicebase/pkg/log" + "servicebase/pkg/partner/wxpay_utility" + "sort" + "strconv" + "strings" + "time" + + "github.com/spf13/viper" + "github.com/wechatpay-apiv3/wechatpay-go/core" + "github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers" + "github.com/wechatpay-apiv3/wechatpay-go/core/downloader" + "github.com/wechatpay-apiv3/wechatpay-go/core/option" + "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" + "github.com/wechatpay-apiv3/wechatpay-go/utils" + + "github.com/anxpp/beego/logs" + + "github.com/wechatpay-apiv3/wechatpay-go/core/notify" +) + +const () + +type WxPayClient struct { + AppId string + MchId string + Secret string + CertificateSerialNo string + MchAPIv3Key string + PrivateKeyPath string +} + +// 支付对象 +type WxPayModel struct { + DeviceInfo string // 自定义参数,可以为终端设备号 + Body string // 商品简单描述 + Detail string // 商品详细描述,对于使用单品优惠的商户,改字段必须按照规范上传,详见“单品优惠参数说明” + Attach string // 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用 + OutTradeNo string // 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。详见商户订单号 + TotalFee string // 订单总金额,单位为分,详见支付金额 + SpbillCreateIp string //APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP + NotifyUrl string // 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 + Openid string //trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识 + TradeType string // 交易类型 JSAPI=公众号支付 NATIVE=扫码支付 APP=APP支付 MWEB=H5支付 +} + +// 统一下单返回结果对象 +type WxCreatePayOrderResult struct { + ReturnCode string `xml:"return_code"` + ReturnMsg string `xml:"return_msg"` + AppId string `xml:"appid"` + MchId string `xml:"mch_id"` + NonceStr string `xml:"nonce_str"` + ResultCode string `xml:"result_code"` + Sign string `xml:"sign"` + PrepayId string `xml:"prepay_id"` + TradeType string `xml:"trade_type"` + ErrCode string `xml:"err_code"` + ErrCodeDes string `xml:"err_code_des"` + MwebUrl string `xml:"mweb_url"` + CodeUrl string `xml:"code_url"` +} + +type RefundModel struct { + TransactionId string // wx支付单号 + OutRefundNo string // 退款单号,DD Game内部退款唯一单号 + Reason string // 退款原因 1、该退款原因参数的长度不得超过80个字节;2、当订单退款金额小于等于1元且为部分退款时,退款原因将不会在消息中体现。 + NotifyUrl string // 退款回调url + RefundAmount int64 // 退款金额,单位是分 + PayAmount int64 // 原支付订单的金额 +} + +func (r *RefundModel) CheckParam() error { + if len(r.Reason) > 80 { + return errors.New("该退款原因参数的长度不得超过80个字节") + } + return nil +} + +// 微信通知对象 +type WxNotifyDataModel struct { + Appid string `xml:"appid" json:"appid"` + BankType string `xml:"bank_type" json:"bank_type"` + CashFee string `xml:"cash_fee" json:"cash_fee"` + CouponCount string `xml:"coupon_count" json:"coupon_count"` + CouponFee string `xml:"coupon_fee" json:"coupon_fee"` + CouponFee0 string `xml:"coupon_fee_0" json:"coupon_fee_0"` + CouponId0 string `xml:"coupon_id_0" json:"coupon_id_0"` + CouponFee1 string `xml:"coupon_fee_1" json:"coupon_fee_1"` + CouponId1 string `xml:"coupon_id_1" json:"coupon_id_1"` + CouponFee2 string `xml:"coupon_fee_2" json:"coupon_fee_2"` + CouponId2 string `xml:"coupon_id_2" json:"coupon_id_2"` + FeeType string `xml:"fee_type" json:"fee_type"` + IsSubscribe string `xml:"is_subscribe" json:"is_subscribe"` + MchId string `xml:"mch_id" json:"mch_id"` + NonceStr string `xml:"nonce_str" json:"nonce_str"` + Openid string `xml:"openid" json:"openid"` + OutTradeNo string `xml:"out_trade_no" json:"out_trade_no"` + ResultCode string `xml:"result_code" json:"result_code"` + ReturnCode string `xml:"return_code" json:"return_code"` + Sign string `xml:"sign" json:"sign"` + SignType string `xml:"sign_type" json:"sign_type"` + TimeEnd string `xml:"time_end" json:"time_end"` + TotalFee string `xml:"total_fee" json:"total_fee"` + TradeType string `xml:"trade_type" json:"trade_type"` + TransactionId string `xml:"transaction_id" json:"transaction_id"` + Attach string `xml:"attach" json:"attach"` +} + +type Resource struct { + Algorithm string `json:"algorithm"` // AEAD_AES_256_GCM + OriginalType string `json:"original_type"` + Ciphertext string `json:"ciphertext"` + AssociatedData string `json:"associated_data"` + Nonce string `json:"nonce"` +} + +type WxRefundNotifyDataModel struct { + MchID string `json:"mchid"` + TransactionID string `json:"transaction_id"` + OutTradeNo string `json:"out_trade_no"` + RefundID string `json:"refund_id"` + OutRefundNo string `json:"out_refund_no"` + RefundStatus string `json:"refund_status"` + SuccessTime time.Time `json:"success_time"` + UserReceivedAccount string `json:"user_received_account"` + Amount refunddomestic.Amount `json:"amount"` +} + +type RefundAmount struct { + Total int `json:"total"` + Refund int `json:"refund"` + PayerTotal int `json:"payer_total"` + PayerRefund int `json:"payer_refund"` +} + +func NewWxpayClient(appid, mch_id, secret string) *WxPayClient { + return &WxPayClient{ + AppId: appid, + MchId: mch_id, + Secret: secret, + CertificateSerialNo: viper.GetString("tencent.wxPay.CertificateSerialNo"), + MchAPIv3Key: viper.GetString("tencent.wxPay.MchAPIv3Key"), + PrivateKeyPath: viper.GetString("tencent.wxPay.PrivateKeyPath"), + } +} + +// 生成微信支付参数 +func (client *WxPayClient) generatePayRequest(payModel WxPayModel) map[string]string { + + result := make(map[string]string) + result["appid"] = client.AppId //appID + result["mch_id"] = client.MchId // 商户号 + result["device_info"] = payModel.DeviceInfo + result["nonce_str"] = htools.GetRandomString(8) // 随机字符串 + result["sign_type"] = "MD5" // 签名类型,默认为MD5,支持HMAC-SHA256和MD5。 + result["body"] = payModel.Body + result["detail"] = payModel.Detail + result["attach"] = payModel.Attach + result["out_trade_no"] = payModel.OutTradeNo + result["fee_type"] = "CNY" // 符合ISO 4217标准的三位字母代码,默认人民币:CNY,详细列表请参见货币类型 + result["total_fee"] = payModel.TotalFee + result["spbill_create_ip"] = payModel.SpbillCreateIp + result["notify_url"] = payModel.NotifyUrl + result["trade_type"] = payModel.TradeType // 取值如下:JSAPI,NATIVE,APP等,说明详见参数规定 + + // 公众号支付 + if payModel.TradeType == common.WEIXIN_PAY_TRADER_TYPE_GONGZHONGHAO { + result["openid"] = payModel.Openid + } + + //H5支付 + if payModel.TradeType == common.WEIXIN_PAY_TRADER_TYPE_H5 { + // 场景 + result["scene_info"] = `{"h5_info":{"type":"Wap","wap_url":"https://www.enen.tech","wap_name":"东东电竞"}}` + } + + // 生成签名 + result["sign"] = client.generateSign(result) // 签名 + + return result + +} + +// 生成微信支付签名 +func (client *WxPayClient) generateSign(parameterMap map[string]string) string { + + // 生成待签名字符串 + sb := getWaitSignString(parameterMap) + + // 拼上key + sb.Append("&key=" + client.Secret) + + result := htools.StringToMD5(sb.ToString()) + + result = strings.ToUpper(result) + + return result +} + +// map转待签名字符串 ,按key值asc升序,空值不参与计算 +func getWaitSignString(m map[string]string) *htools.StringBuilder { + keys := make([]string, 0) + + for key, val := range m { + if key == "sign" { + continue + } + + if len(val) == 0 { + continue + } + keys = append(keys, key) + } + // 按key升序 + sort.Strings(keys) + + // 拼接字符串 + sb := htools.NewStringBuilder() + + keysCount := len(keys) + i := 0 + for _, value := range keys { + k := value + v := m[k] + sb.Append(k + "=" + v) + if i < keysCount-1 { + sb.Append("&") + } + i++ + } + return sb +} + +// 验证签名 +func (client *WxPayClient) CheckSign(result map[string]string) error { + + inputSign, ok := result["sign"] + + if !ok { + return errors.New("待验证参数中缺少sign") + } + + calSign := client.generateSign(result) + + if inputSign != calSign { + return errors.New("签名验证失败") + } + + return nil +} + +func (client *WxPayClient) CheckRefundNotifySign(request *http.Request) (*WxRefundNotifyDataModel, error) { + + privateKey, err := utils.LoadPrivateKeyWithPath(client.PrivateKeyPath) + if err != nil { + return nil, err + } + + ctx := context.Background() + // 1. 使用 `RegisterDownloaderWithPrivateKey` 注册下载器 + err = downloader.MgrInstance().RegisterDownloaderWithPrivateKey(ctx, privateKey, client.CertificateSerialNo, client.MchId, client.MchAPIv3Key) + if err != nil { + return nil, err + } + // 2. 获取商户号对应的微信支付平台证书访问器 + certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(client.MchId) + // 3. 使用证书访问器初始化 `notify.Handler` + handler, err := notify.NewRSANotifyHandler(client.MchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor)) + if err != nil { + return nil, err + } + content := new(map[string]interface{}) + notifyReq, err := handler.ParseNotifyRequest(context.Background(), request, &content) + // 如果验签未通过,或者解密失败 + if err != nil { + return nil, err + } + var rst WxRefundNotifyDataModel + log.InfoF("回调通知数据: %s", notifyReq.Resource.Plaintext) + err = json.Unmarshal([]byte(notifyReq.Resource.Plaintext), &rst) + if err != nil { + return nil, err + } + log.InfoF("notifyReq : %+v", notifyReq) + return &rst, nil +} + +// 微信统一下单 +func (client *WxPayClient) CreatePayOrder(payModel WxPayModel) (resultMap map[string]string, resultErr error) { + + url := "https://api.mch.weixin.qq.com/pay/unifiedorder" + + payRequestMap := client.generatePayRequest(payModel) + + payXml := htools.MapToXML(payRequestMap) + result, err := htools.HttpPost(url, payXml) + + if err != nil { + logs.Error("统一下单失败:" + err.Error()) + resultErr = err + return + } + + logs.Info("统一下单OK:%s, params: %+v", result, payModel) + + var resultModel WxCreatePayOrderResult + + err2 := xml.Unmarshal([]byte(result), &resultModel) + + if err2 != nil { + logs.Error("统一下单解析返回结果失败:" + err2.Error()) + resultErr = err2 + return + } + + if resultModel.ReturnCode != "SUCCESS" { + logs.Error("统一下单返回失败:" + resultModel.ReturnCode + "-" + resultModel.ReturnMsg) + resultErr = errors.New("统一下单返回失败:" + resultModel.ReturnCode + "-" + resultModel.ReturnMsg) + return + } + + if resultModel.ResultCode != "SUCCESS" { + logs.Error("统一下单交易失败:" + resultModel.ResultCode + "-" + resultModel.ErrCode + resultModel.ErrCodeDes) + resultErr = errors.New("统一下单交易失败:" + resultModel.ReturnCode + "-" + resultModel.ReturnMsg) + return + } + + switch payModel.TradeType { + case common.WEIXIN_PAY_TRADER_TYPE_GONGZHONGHAO: + // 生成公众号需要的支付对象 + resultMap = client.GenerateGongZhongHaoPayMap(resultModel) + return + case common.WEIXIN_PAY_TRADER_TYPE_APP: + // 生成app需要的支付对象 + resultMap = client.GenerateAppPayMap(resultModel) + + return + case common.WEIXIN_PAY_TRADER_TYPE_H5: + // 生成app需要的支付对象 + resultMap = client.GenerateWxH5PayMap(resultModel) + return + case common.WEIXIN_PAY_TRADER_TYPE_NATIVE: + // 生成native + resultMap = client.GenerateWxNativePayMap(resultModel) + return + default: + resultErr = errors.New("只支持APP和公众号支付") + return + } + +} + +// 生成app的支付对象 +func (client *WxPayClient) GenerateAppPayMap(createPayOrderResult WxCreatePayOrderResult) map[string]string { + + result := make(map[string]string) + result["appid"] = createPayOrderResult.AppId + result["partnerid"] = createPayOrderResult.MchId + result["prepayid"] = createPayOrderResult.PrepayId + result["package"] = "Sign=WXPay" + result["noncestr"] = htools.GetRandomString(6) + result["timestamp"] = strconv.FormatInt(time.Now().Unix(), 10) + // 生成签名 + sign := client.generateSign(result) + result["sign"] = sign + result["pack"] = "Sign=WXPay" // java因为package是关键字 增加这个字段替代 + + return result +} + +// 生成公众号的支付对象 +func (client *WxPayClient) GenerateGongZhongHaoPayMap(createPayOrderResult WxCreatePayOrderResult) map[string]string { + + result := make(map[string]string) + result["appId"] = createPayOrderResult.AppId + result["package"] = "prepay_id=" + createPayOrderResult.PrepayId + result["nonceStr"] = htools.GetRandomString(6) + result["timeStamp"] = strconv.FormatInt(time.Now().Unix(), 10) + result["signType"] = "MD5" + // 生成签名 + sign := client.generateSign(result) + result["paySign"] = sign + + return result +} + +// 生成H5的支付对象 +func (client *WxPayClient) GenerateWxH5PayMap(createPayOrderResult WxCreatePayOrderResult) map[string]string { + + result := make(map[string]string) + result["appId"] = createPayOrderResult.AppId + result["wxH5PayUrl"] = createPayOrderResult.MwebUrl + + return result +} + +// 生成Native的支付对象 +func (client *WxPayClient) GenerateWxNativePayMap(createPayOrderResult WxCreatePayOrderResult) map[string]string { + + result := make(map[string]string) + result["codeUrl"] = createPayOrderResult.CodeUrl + + return result +} + +// GenerateWxRefund 生成Native的支付对象 +func (client *WxPayClient) GenerateWxRefund(model *RefundModel) (*refunddomestic.Refund, error) { + err := model.CheckParam() + if err != nil { + return nil, err + } + mchPrivateKey, err := utils.LoadPrivateKeyWithPath(client.PrivateKeyPath) + if err != nil { + return nil, err + } + + ctx := context.Background() + // 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力 + opts := []core.ClientOption{ + option.WithWechatPayAutoAuthCipher(client.MchId, client.CertificateSerialNo, mchPrivateKey, client.MchAPIv3Key), + } + newClient, err := core.NewClient(ctx, opts...) + if err != nil { + return nil, err + } + svc := refunddomestic.RefundsApiService{ + Client: newClient, + } + refund, _, err := svc.Create(context.Background(), refunddomestic.CreateRequest{ + TransactionId: wxpay_utility.String(model.TransactionId), + OutRefundNo: wxpay_utility.String(model.OutRefundNo), + Reason: wxpay_utility.String(model.Reason), + NotifyUrl: wxpay_utility.String(model.NotifyUrl), + FundsAccount: refunddomestic.REQFUNDSACCOUNT_AVAILABLE.Ptr(), + Amount: &refunddomestic.AmountReq{ + Refund: wxpay_utility.Int64(model.RefundAmount), + Total: wxpay_utility.Int64(model.PayAmount), + Currency: wxpay_utility.String("CNY"), + }, + }) + if err != nil { + return nil, err + } + + return refund, nil +} diff --git a/pkg/partner/YiDun/YiDunClient.go b/pkg/partner/YiDun/YiDunClient.go new file mode 100644 index 0000000..5a43f66 --- /dev/null +++ b/pkg/partner/YiDun/YiDunClient.go @@ -0,0 +1,122 @@ +package YiDun + +import ( + "bytes" + "crypto/md5" + "encoding/json" + "errors" + "fmt" + "net/http" + "servicebase/pkg/common/HyTools" + "sort" + "strconv" + "time" + + "github.com/anxpp/beego/logs" + "github.com/spf13/viper" +) + +const () + +// 易盾API 一键登录等 +type YiDunClient struct { + SecretId string + SecretKey string +} + +func NewYiDunClient() *YiDunClient { + secretId := viper.GetString("netease.yidun.secretId") + secretKey := viper.GetString("netease.yidun.secretKey") + return &YiDunClient{SecretId: secretId, SecretKey: secretKey} +} + +// 生成易盾签名 +func (client *YiDunClient) GenerateSign(params map[string]string) (sign string) { + + var keys []string + for key, _ := range params { + keys = append(keys, key) + } + sort.Strings(keys) + buf := bytes.NewBufferString("") + for _, key := range keys { + buf.WriteString(key + params[key]) + } + buf.WriteString(client.SecretKey) + has := md5.Sum(buf.Bytes()) + + sign = fmt.Sprintf("%x", has) + return +} + +// 获取易盾请求公共参数 +func (client *YiDunClient) GetCommonParams(businessId string) (params map[string]string) { + + params = make(map[string]string, 0) + params["secretId"] = client.SecretId + params["businessId"] = businessId + params["version"] = "v1" + params["timestamp"] = strconv.FormatInt(time.Now().Unix(), 10) + params["nonce"] = HyTools.GetUUID() + + return +} + +// 一键登录API +func (client *YiDunClient) OneClickApi(params map[string]string) (mobile string, resultErr error) { + + apiUrl := "https://ye.dun.163.com/v1/oneclick/check" + + paramString := "" + for k, v := range params { + kv := k + "=" + v + "&" + paramString += kv + } + + if len(paramString) > 0 { + paramString = HyTools.Substr(paramString, 0, len(paramString)-1) + } + + logs.Info("oneClick params:" + paramString) + + headerMap := make(map[string]string, 0) + headerMap["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8" + + result, err := HyTools.HttpDo(http.MethodPost, apiUrl, headerMap, paramString) + logs.Info("oneClick result:" + result) + + if err != nil { + logs.Error("一键登录失败,请求API失败:" + err.Error()) + resultErr = err + } + + //{"code":200,"msg":"ok","data":{"phone":"13079217909","resultCode":"0"}} + + var resultDTO struct { + Code int64 `json:"code"` + Msg string `json:"msg"` + Data map[string]interface{} `json:"data"` + } + + err2 := json.Unmarshal([]byte(result), &resultDTO) + + if err2 != nil { + logs.Error("一键登录失败:解析API结果失败" + err2.Error()) + resultErr = err2 + return + } + + if resultDTO.Code != 200 { + logs.Error("一键登录失败(%s) code[%v]:"+resultDTO.Msg, "", resultDTO.Code) + resultErr = errors.New(resultDTO.Msg) + return + } + + // 结果 + + if phone, ok := resultDTO.Data["phone"]; ok { + mobile = phone.(string) + } + + return +} diff --git a/pkg/partner/ZhimaCertify/ZhimaCertifyClient.go b/pkg/partner/ZhimaCertify/ZhimaCertifyClient.go new file mode 100644 index 0000000..54a3f04 --- /dev/null +++ b/pkg/partner/ZhimaCertify/ZhimaCertifyClient.go @@ -0,0 +1,212 @@ +package ZhimaCertify + +import ( + "encoding/json" + "errors" + "net/url" + "servicebase/pkg/htools" + + "github.com/anxpp/beego/logs" +) + +// 芝麻认证SDK +type ZhimaCertifyClient struct { + GatewayUrl string + AppId string + PublicKey string + PrivateKey string +} + +// 芝麻开放平台的key +const ( + // 蚂蚁开放平台 https://openapi.alipay.com/gateway.do + // 芝麻信用api https://zmopenapi.zmxy.com.cn/openapi.do + ZHIMA_MERCHANT_ID = "268282100002002118952271" + ZHIMA_CERTIFY_GATEWAY_URL = "https://zmopenapi.zmxy.com.cn/openapi.do" // 网关 + + ZHIMA_CERTIFY_APP_ID = "30000229371" // APPID + + // 芝麻公钥 + ZHIMA_CERTIFY_PUBLIC_KEY = ` +-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQK22BgQCNunjjn51b3XUnsTXGa6C3dBnA +U7UP1FCxJN4T1CIxCC5I+Fi9lrzFy899g224JzcTywePp3jIg4aG/11qIJS2edkTUo +7XM8qxpl+ApaRoCLx4NezDzOxVSGYqnu2295wnKW/ft3T+aZQwgELw60IrVutFMOKr1 +H7yrrzbar/OrgaOxLQIDAQAB +-----END PUBLIC KEY----- + ` + // 商户私钥 + ZHIMA_CERTIFY_PRIVATE_KEY = ` +-----BEGIN RSA PRIVATE KEY----- +MIICWwIBAAKBgQDHbe15atuwmQaIUiX9kx45T22dRDmfYz7+rIoQCjR3+J2AQkMX1g3 +9BQZfRJyN8/31GD98zjZr0KowxFYnDJC422w+6mnAtY63fJW32VvIqTbz7PHF/iyVE0 +WCWu2IlukzljaZFg6SK2SD5+ROQEYL3dhzg87/4iDvDIBKuK222HftTMPvLcwIDAQAB +AoGAREH0uM0BOnV1zezIAf17p8NitmyY3v22fr1RV+IWSUWzEWhryPdj289LegoCx3d +OYbgV6sKtz8MQrTZWAnGDiynMe1yucNIRCsq1b0rCoMFGo52vFidYKH2SeGnRKQcMq +6lohM+ialbwabDJW8eFBq6jqm+3KcIPyETmpcBLIawX0c21ECQQDotn2hHOTo0IHsx +oxtwA3i8u0OL8dGbrOyBL5xYVRpxas2Sry9WcCLuDCC52VNKszQq+W2xTPriqvuv/V +rBvrtGxLAkEA22LR0G9PNHGIg2K6+lcQWZ8F53cO32cSP3pKfO6A2m2wzii2mPViU6 +ONlTJKAB3VlHn13XVxVcaFhdfwcxLARUeQJABq3eC+VH22l2FrR8RvsCpZV8lkKesZ +4gb3jsmoChz/MkwndFNU330+c2ijs84Mces8qLQC22h+du0DZky2QyNPSruwJAPpeB +GSDIzkOeGS4v/oCcj5VJT/Kt8SPFkFDw0UgyjCY22u9GuXk5JnfBS1HfvwzEBOqO9T +IutbRAICGt3ob5CEsQJABLSmUBbUmbILI0ymD9AFmX11t1mijZFnC1X22I5kR4TM511 +Oe3j6CFhvyXOg0L9jXKMxcD7GJN73PkglcVypxbzqg== +-----END RSA PRIVATE KEY----- +` + + ZHIMA_CERTIFY_CHARSET = "UTF-8" // 编码 + ZHIMA_CERTIFY_PRODUCT_CODE = "w1010100000000002978" // 固定值 +) + +func NewZhimaCertifyClient() *ZhimaCertifyClient { + return &ZhimaCertifyClient{GatewayUrl: ZHIMA_CERTIFY_GATEWAY_URL, AppId: ZHIMA_CERTIFY_APP_ID, PublicKey: ZHIMA_CERTIFY_PUBLIC_KEY, PrivateKey: ZHIMA_CERTIFY_PRIVATE_KEY} +} + +// 芝麻认证系统参数 +/* +每个接口文档中详细定义了接口业务参数列表,业务参数本身是通过系统参数params发送到服务器端的。这里主要描述这些业务参数是以什么格式组合,并拼装成了系统参数params的。假设接口A定义了两个业务参数,param1和param2,值分别为param1_value和param2_value。系统参数params和业务参数的关系为:params= URLEncode (Base64(RSAEncrypt(param1=URLEncode(param1_value) & param2=URLEncode(param2_value))))。 +首先对于每个业务参数,先进行一次URLEncode,然后按照URL中传递参数的方式把param1和param2拼接起来(使用&和=号) +然后对拼接起来的业务参数进行RSA的加密,得到byte数组 +然后对RSA加密后得到byte数组进行Base64编码 +最后对Base64编码后的params参数做一次URLEncode,URLEncode后的值最终组成了系统参数params的值 +*/ + +// 芝麻认证初始化 +func (s *ZhimaCertifyClient) ZhimaCertifyInit(certifyId, certNo, trueName string) (result string, err error) { + + // 方法名 + method := "zhima.customer.certification.initialize" + // 业务参数 + certMap := make(map[string]string, 0) + certMap["identity_type"] = "CERT_INFO" + certMap["cert_type"] = "IDENTITY_CARD" + certMap["cert_name"] = trueName + certMap["cert_no"] = certNo + + certMapByte, _ := json.Marshal(certMap) + + bizMap := make(map[string]string, 0) + bizMap["transaction_id"] = certifyId + bizMap["product_code"] = ZHIMA_CERTIFY_PRODUCT_CODE + bizMap["biz_code"] = "FACE_SDK" + bizMap["identity_param"] = string(certMapByte) + //bizMap["merchant_config"] = `{"need_user_authorization":"false"}` + + // 请求参数 + requestParam := getCertifyRequestParams(method, bizMap) + + headerMap := make(map[string]string, 0) + + logs.Error("初始化芝麻信用API request:" + requestParam) + + url := ZHIMA_CERTIFY_GATEWAY_URL + "?" + requestParam + responseBody, httpErr := htools.HttpDo("GET", url, headerMap, "") + + logs.Debug("初始化芝麻信用 response:" + responseBody) + + if httpErr != nil { + err = httpErr + logs.Error("初始化芝麻信用失败:" + httpErr.Error()) + return + } + + result = responseBody + return +} + +// 芝麻认证查询结果 +func (s *ZhimaCertifyClient) ZhimaCertifyQueryResult(bizNo string) (result string, err error) { + // 方法名 + method := "zhima.customer.certification.query" + // 业务参数 + bizMap := map[string]string{"biz_no": bizNo} + + // 请求参数 + requestParam := getCertifyRequestParams(method, bizMap) + + if len(requestParam) == 0 { + logs.Info("请求参数为空") + err = errors.New("请求参数错误") + return + } + headerMap := make(map[string]string, 0) + url := ZHIMA_CERTIFY_GATEWAY_URL + "?" + requestParam + responseBody, httpErr := htools.HttpDo("GET", url, headerMap, "") + + if httpErr != nil { + err = httpErr + return + } + + result = responseBody + + return + +} + +// 获取芝麻认证请求参数 +func getCertifyRequestParams(method string, bizMap map[string]string) string { + + // 系统参数转请求 + sysMap := make(map[string]string, 0) + sysMap["app_id"] = url.QueryEscape(ZHIMA_CERTIFY_APP_ID) + sysMap["charset"] = url.QueryEscape(ZHIMA_CERTIFY_CHARSET) + sysMap["method"] = url.QueryEscape(method) + sysMap["platform"] = url.QueryEscape("zmop") + sysMap["version"] = url.QueryEscape("1.0") + + // 待签名的参数 + waitSignParam := getNotEncryptBizParam(bizMap) + + logs.Error("待签名参数:" + waitSignParam) + // 签名 + sign, signErr := htools.RsaSHA1Sign(waitSignParam, ZHIMA_CERTIFY_PRIVATE_KEY) + + logs.Error("签名:" + sign) + + if signErr != nil { + logs.Error("签名失败" + signErr.Error()) + return "" + } + sysMap["sign"] = url.QueryEscape(sign) + + // 获取加密过的业务参数 + params := getCertifyBizParams(bizMap) + sysMap["params"] = params + logs.Error("加密过的业务参数:" + params) + + sysParams := htools.MapToUrlParams(sysMap) + + return sysParams +} + +// 获取芝麻认证业务参数 +func getCertifyBizParams(bizMap map[string]string) string { + + //1. 首先对于每个业务参数,先进行一次 URLEncode,然后按照 URL 中传递参数的方式把 param1 和 param2 拼接起来(使用 & 和 = 号)然后对拼接起来的业务参数进行 RSA 的加密,得到 byte 数组 + + urlParams := getNotEncryptBizParam(bizMap) + //urlParams := "1" + //RSA加密 + paramByte, _ := htools.RsaEncrypt(urlParams, ZHIMA_CERTIFY_PUBLIC_KEY) + + //2. 然后对 RSA 加密后得到 byte 数组进行 Base64 编码 + base64Param := paramByte + + //3. 最后对 Base64 编码后的 params 参数做一次 URLEncode,URLEncode 后的值最终组成了系统参数 params 的值 + + return url.QueryEscape(base64Param) +} + +// 获取未加密的业务参数 +func getNotEncryptBizParam(bizMap map[string]string) string { + + mapData := make(map[string]string, 0) + for k, v := range bizMap { + mapData[k] = url.QueryEscape(v) + } + + urlParams := htools.MapToUrlParams(mapData) + + return urlParams +} diff --git a/pkg/partner/ali_auth/auth_client_do.go b/pkg/partner/ali_auth/auth_client_do.go new file mode 100644 index 0000000..3314bc9 --- /dev/null +++ b/pkg/partner/ali_auth/auth_client_do.go @@ -0,0 +1,129 @@ +package ali_auth + +import ( + "fmt" + + openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + "github.com/spf13/viper" + + cloudauth "github.com/alibabacloud-go/cloudauth-20190307/v3/client" + + util "github.com/alibabacloud-go/tea-utils/v2/service" + "github.com/alibabacloud-go/tea/tea" +) + +func CreateClient(endpoint *string) (_result *cloudauth.Client, _err error) { + // 初始化Client。 + config := &openapi.Config{ + // 使用Credential配置凭证。 + AccessKeyId: tea.String(viper.GetString("aliyun.sms.accessKeyId")), + AccessKeySecret: tea.String(viper.GetString("aliyun.sms.accessKeySecret")), + ConnectTimeout: tea.Int(3000), + ReadTimeout: tea.Int(6000), + // RegionId: tea.String("cn-shanghai"), + Endpoint: endpoint, + } + //_result = &cloudauth.Client{} + _result, _err = cloudauth.NewClient(config) + return _result, _err +} + +func getReturnUrl() string { + return viper.GetString("aliyun.face-verify.returnUrl") +} + +func AliFaceVerify(token, userId, orderNo, metaInfo string) (res *cloudauth.InitFaceVerifyResponse, _err error) { + request := &cloudauth.InitFaceVerifyRequest{ + SceneId: tea.Int64(1000014704), + OuterOrderNo: tea.String(orderNo), + ProductCode: tea.String("LR_FR"), + Model: tea.String("LIVENESS"), + // CertifyUrlType: tea.String("H5"), + CertifyUrlStyle: tea.String("S"), + CallbackToken: tea.String(orderNo), + // LIVENESS(默认):眨眼 PHOTINUS_LIVENESS:眨眼 + 炫彩 MULTI_ACTION:眨眼 + 摇头 (眨眼和摇头顺序随机) MULTI_PHOTINUS:眨眼 + 摇头 (眨眼和摇头顺序随机)+ 炫彩活体检测。 MOVE_ACTION(推荐):远近移动 + 眨眼 (远近和眨眼顺序随机) MULTI_FAPTCHA:眨眼 + 形迹 + UserId: tea.String(userId), + MetaInfo: tea.String(metaInfo), + ReturnUrl: tea.String(fmt.Sprintf(getReturnUrl(), token, orderNo)), + } + client, _err := CreateClient(tea.String("cloudauth.aliyuncs.com")) + if _err != nil { + return nil, _err + } + response, _err := client.InitFaceVerify(request) + // 不支持服务自动路由。 + // response, _err := InitFaceVerify(tea.String("cloudauth.cn-shanghai.aliyuncs.com"), request) + if _err != nil { + return nil, _err + } + // fmt.Println(*response.Body.RequestId) + // fmt.Println(*response.Body.Code) + // fmt.Println(*response.Body.Message) + // fmt.Println(*response.Body.RequestId) + // fmt.Println(*response.Body.ResultObject.CertifyId) + // fmt.Println(*response.Body.ResultObject.CertifyUrl) + return response, _err +} + +func AliFaceVerifyQuery(certifyId string) (res *cloudauth.DescribeFaceVerifyResponse, _err error) { + client, _err := CreateClient(tea.String("cloudauth.aliyuncs.com")) + if _err != nil { + return nil, _err + } + return client.DescribeFaceVerify(&cloudauth.DescribeFaceVerifyRequest{ + SceneId: tea.Int64(1000014704), + CertifyId: tea.String(certifyId), + }) +} + +func InitFaceVerifyAutoRoute(request *cloudauth.InitFaceVerifyRequest) (_result *cloudauth.InitFaceVerifyResponse, _err error) { + endpoints := []*string{tea.String("cloudauth.aliyuncs.com"), tea.String("cloudauth-dualstack.aliyuncs.com")} + var lastResponse *cloudauth.InitFaceVerifyResponse + for _, endpoint := range endpoints { + response, _err := InitFaceVerify(endpoint, request) + lastResponse = response + if _err != nil { + var err = &tea.SDKError{} + if _t, ok := _err.(*tea.SDKError); ok { + err = _t + // 系统异常,切换到下个地域调用。 + if *err.StatusCode == 500 { + continue + } + } + return _result, _err + } + + if *response.StatusCode == 500 { + continue + } + + if *response.Body.Code == "500" { + continue + } + + _result = response + return _result, _err + + } + _result = lastResponse + return _result, _err +} + +func InitFaceVerify(endpoint *string, request *cloudauth.InitFaceVerifyRequest) (_result *cloudauth.InitFaceVerifyResponse, _err error) { + client, _err := CreateClient(endpoint) + if _err != nil { + return _result, _err + } + // 创建RuntimeObject实例并设置运行参数。 + runtime := &util.RuntimeOptions{} + runtime.ReadTimeout = tea.Int(10000) + runtime.ConnectTimeout = tea.Int(10000) + _result = &cloudauth.InitFaceVerifyResponse{} + _body, _err := client.InitFaceVerifyWithOptions(request, runtime) + if _err != nil { + return _result, _err + } + _result = _body + return _result, _err +} diff --git a/pkg/partner/ali_auth/client.go b/pkg/partner/ali_auth/client.go new file mode 100644 index 0000000..78c9eea --- /dev/null +++ b/pkg/partner/ali_auth/client.go @@ -0,0 +1,150 @@ +package ali_auth + +import ( + "fmt" + "servicebase/pkg/log" + "strings" + + "github.com/pkg/errors" + "github.com/spf13/viper" + + "github.com/go-resty/resty/v2" +) + +const ( + url = "https://telvertify.market.alicloudapi.com/lianzhuo/telvertify" + urlSimple = "https://checkone.market.alicloudapi.com/communication/personal/10101" + urlSimpleV2 = "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check" +) + +type AuthResult struct { + Data struct { + Areacode string `json:"areacode"` + Isp string `json:"isp"` + ID string `json:"id"` + City string `json:"city"` + Mobile string `json:"Mobile"` + Name string `json:"Name"` + Postcode string `json:"postcode"` + } `json:"data"` + Resp struct { + Code string `json:"code"` + Desc string `json:"desc"` + } `json:"resp"` +} + +type AuthSimpleResult struct { + // {"code":"10000","message":"成功","data":{"result":"1","birthday":"","address":"","sex":""},"seqNo":"YMX7AK4J250820134839851"} + Code string `json:"code"` + Message string `json:"message"` + Data struct { + Result string `json:"result"` + Birthday string `json:"birthday"` + Address string `json:"address"` + Sex string `json:"sex"` + } `json:"data"` + SeqNo string `json:"seqNo"` +} + +type AuthSimpleResultV2 struct { + // {"code":"10000","message":"成功","data":{"result":"1","birthday":"","address":"","sex":""},"seqNo":"YMX7AK4J250820134839851"} + Code int `json:"code"` + Message string `json:"msg"` + Data struct { + OrderNo string `json:"orderNo"` + Result int `json:"result"` + Birthday string `json:"birthday"` + Address string `json:"address"` + Sex string `json:"sex"` + Desc string `json:"desc"` + } `json:"data"` +} + +func RealAuth(name, mobile, id string) (result AuthResult, e error) { + if strings.HasPrefix(mobile, "1601234") { + result = AuthResult{Data: struct { + Areacode string `json:"areacode"` + Isp string `json:"isp"` + ID string `json:"id"` + City string `json:"city"` + Mobile string `json:"Mobile"` + Name string `json:"Name"` + Postcode string `json:"postcode"` + }{ + Areacode: "", + Isp: "", + ID: id, + City: "", + Mobile: mobile, + Name: name, + Postcode: "", + }, Resp: struct { + Code string `json:"code"` + Desc string `json:"desc"` + }{ + Code: "0", + Desc: "", + }} + return + } + client := resty.New() + if _, e = client.R(). + SetHeader("Authorization", fmt.Sprintf("APPCODE %s", viper.GetString("aliyun.auth.appCode"))). + SetQueryParams(map[string]string{ + "telnumber": mobile, + "name": name, + "id": id, + }). + SetResult(&result). // or SetResult(AuthSuccess{}). + Get(url); e != nil { + fmt.Printf("RealAuth error: %v", e) + return + } + return +} + +func RealAuthSimple(name, id string) (result AuthSimpleResult, e error) { + client := resty.New() + var i *resty.Response + if i, e = client.R(). + SetHeader("Authorization", fmt.Sprintf("APPCODE %s", viper.GetString("aliyun.auth.appCode"))). + SetHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"). + SetBody(fmt.Sprintf("name=%s&idcard=%s", name, id)). + SetResult(&result). // or SetResult(AuthSuccess{}). + Post(urlSimple); e != nil { + fmt.Printf("RealAuthSimple error: %v", e) + return + } else if i != nil { + fmt.Printf("RealAuthSimple success: %v", i.String()) + } + return +} + +// RealAuthSimpleV2 https://market.aliyun.com/detail/cmapi00066570#sku=yuncode6057000002 +func RealAuthSimpleV2(name, id string) (*AuthSimpleResultV2, error) { + var ( + result *AuthSimpleResultV2 + err error + ) + client := resty.New() + var i *resty.Response + i, err = client.R(). + SetHeader("Authorization", fmt.Sprintf("APPCODE %s", viper.GetString("aliyun.auth.appCode"))). + SetHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"). + SetBody(fmt.Sprintf("name=%s&idcard=%s", name, id)). + SetResult(&result). // or SetResult(AuthSuccess{}). + Post(urlSimpleV2) + if err != nil { + fmt.Printf("RealAuthSimple error: %v", err) + return nil, errors.WithStack(err) + } + if i == nil { + log.Error("身份信息二要素返回结果为nil") + return nil, errors.New("身份信息二要素认证请求失败") + } + if i.StatusCode() != 200 { + log.ErrorF("身份信息二要素返回http code (%d) not 200", i.StatusCode()) + return nil, errors.New("身份信息二要素认证请求失败") + } + return result, nil +} diff --git a/pkg/partner/ali_auth/client_test.go b/pkg/partner/ali_auth/client_test.go new file mode 100644 index 0000000..f61fe7f --- /dev/null +++ b/pkg/partner/ali_auth/client_test.go @@ -0,0 +1,70 @@ +package ali_auth + +import ( + "fmt" + "reflect" + "testing" +) + +func TestRealAuth(t *testing.T) { + type args struct { + name string + mobile string + id string + } + tests := []struct { + name string + args args + wantResult AuthResult + }{ + {name: "t1", args: struct { + name string + mobile string + id string + }{name: "123", mobile: "", id: "234"}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotResult, e := RealAuth(tt.args.name, tt.args.mobile, tt.args.id) + fmt.Printf("%++v %+v\n", gotResult, e) + }) + } +} + +func TestRealAuthSimple(t *testing.T) { + type args struct { + name string + id string + } + tests := []struct { + name string + args args + wantResult AuthSimpleResult + wantErr bool + }{ + {name: "t1", args: struct { + name string + id string + }{name: "", id: ""}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotResult, err := RealAuthSimple(tt.args.name, tt.args.id) + if (err != nil) != tt.wantErr { + t.Errorf("RealAuthSimple() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(gotResult, tt.wantResult) { + t.Errorf("RealAuthSimple() = %v, want %v", gotResult, tt.wantResult) + } + }) + } +} + +func TestRealAuthSimpleV2(t *testing.T) { + v2, err := RealAuthSimpleV2("", "") + if err != nil { + t.Error(err) + } + println(v2.Data.Address) +} diff --git a/pkg/partner/mq/http/client.go b/pkg/partner/mq/http/client.go new file mode 100644 index 0000000..04200c2 --- /dev/null +++ b/pkg/partner/mq/http/client.go @@ -0,0 +1,93 @@ +package mq_http + +import ( + "servicebase/pkg/htools" + "servicebase/pkg/partner/mq/message" + "servicebase/pkg/partner/mq/pusher" + "encoding/json" + "fmt" + + "github.com/spf13/viper" +) + +type Client struct { + dataHost string +} + +func init() { + //rlog.SetLogger() +} + +func NewHttpClient() pusher.PushClient { + return &Client{ + dataHost: viper.GetString("service.host.data"), + } +} + +func (client *Client) Push(tag, key string, message []byte) error { + var e error + switch tag { + case "transaction": + _, e = htools.HttpPost(fmt.Sprintf("%s%s", client.dataHost, "/api/subscriber/transaction"), string(message)) + case "transaction-update": + _, e = htools.HttpPost(fmt.Sprintf("%s%s", client.dataHost, "/api/subscriber/transaction/update"), string(message)) + case "register": + _, e = htools.HttpPost(fmt.Sprintf("%s%s", client.dataHost, "/api/subscriber/register"), string(message)) + case "event": + _, e = htools.HttpPost(fmt.Sprintf("%s%s", client.dataHost, "/api/subscriber/event"), string(message)) + case "active": + _, e = htools.HttpPost(fmt.Sprintf("%s%s", client.dataHost, "/api/subscriber/active"), string(message)) + case "error": + _, e = htools.HttpPost(fmt.Sprintf("%s%s", client.dataHost, "/api/subscriber/error"), string(message)) + case "active-new": + default: + // "ignore" + } + return e +} + +func (client *Client) PushString(tag, key, message string) error { + return nil +} + +// 发布注册消息 +func (client *Client) PushRegisterMessage(message message.RegisterMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("register", message.MessageId, bytes) +} + +// 发布事件消息 +func (client *Client) PushEventTopicMessage(message message.EventMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("event", message.MessageId, bytes) +} + +// 发布交易消息 +func (client *Client) PushTransactionMessage(message message.TransactionMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("transaction", message.MessageId, bytes) +} + +// 发布交易更新消息 +func (client *Client) PushTransactionUpdateMessage(message message.TransactionUpdateMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("transaction-update", message.MessageId, bytes) +} + +// 发布活跃消息 +func (client *Client) PushActiveTopicMessage(message message.ActiveMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("active", message.MessageId, bytes) +} + +// 发布错误消息 +func (client *Client) PushErrorTopicMessage(message message.ErrorMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("error", message.MessageId, bytes) +} + +// 发布激活消息 +func (client *Client) PushActiveNewTopicMessage(message message.ActiveNewMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("active-new", message.MessageId, bytes) +} diff --git a/pkg/partner/mq/message/message.go b/pkg/partner/mq/message/message.go new file mode 100644 index 0000000..ed4406e --- /dev/null +++ b/pkg/partner/mq/message/message.go @@ -0,0 +1,5 @@ +package message + +type Message struct { + MessageId string +} diff --git a/pkg/partner/mq/message/message_active.go b/pkg/partner/mq/message/message_active.go new file mode 100644 index 0000000..d4d7ed1 --- /dev/null +++ b/pkg/partner/mq/message/message_active.go @@ -0,0 +1,12 @@ +package message + +// 活跃消息 +type ActiveMessage struct { + Message + UserId string // 用户ID + DeviceId string // 设备ID + ActiveTime string // 活跃的平台 + ActivePlatform string // 活跃的平台 + ActiveDeviceModel string // 活跃的设备型号 + ActiveIp string // 活跃的IP +} diff --git a/pkg/partner/mq/message/message_active_new.go b/pkg/partner/mq/message/message_active_new.go new file mode 100644 index 0000000..9b83b22 --- /dev/null +++ b/pkg/partner/mq/message/message_active_new.go @@ -0,0 +1,16 @@ +package message + +// 激活消息 +type ActiveNewMessage struct { + Message + ClientIp string // 用户Ip + ClientVersion string // 用户ID + DeviceId string // 设备ID + Platform string // 活跃的平台 + MarketChannel string // 活跃的平台 + DeviceModel string // 活跃的设备型号 + TimeStamp string // 活跃的IP + BundleId string // 活跃的IP + OsVersion string // 活跃的IP + ApiVersionNum string // 活跃的IP +} diff --git a/pkg/partner/mq/message/message_error.go b/pkg/partner/mq/message/message_error.go new file mode 100644 index 0000000..1a32ea1 --- /dev/null +++ b/pkg/partner/mq/message/message_error.go @@ -0,0 +1,34 @@ +package message + +// 错误消息(补偿) +type ErrorMessage struct { + Message + Code string // 错误代码 + Content string // 错误内容(json) + Tag ErrorTag // 消息标签:auto=自动处理 manual=手动处理 auto_to_manual=自动转手动 +} + +type ErrorTag string + +const ( + Auto ErrorTag = "AUTO" + Manual ErrorTag = "MANUAL" + AutoToManual ErrorTag = "AUTO_TO_MANUAL" +) + +// CMQ异常消息code +const ( + // 注册云信失败 需要自动补偿注册 + CMQ_ERROR_CODE_SIGNUP_TO_YUNXIN_FAIL = "CMQ_E001" + // 抽奖更新总奖池失败 + CMQ_ERROR_CODE_OPEN_BOX_UPDATE_DATA_FAIL = "CMQ_E002" + // 系统警告 + CMQ_ERROR_CODE_SYSTEM_WARN = "CMQ_E003" +) + +// 系统警告 +type SystemWarnBody struct { + ServiceName string + ApiName string + ErrMsg string +} diff --git a/pkg/partner/mq/message/message_event.go b/pkg/partner/mq/message/message_event.go new file mode 100644 index 0000000..27e3a71 --- /dev/null +++ b/pkg/partner/mq/message/message_event.go @@ -0,0 +1,35 @@ +package message + +import ( + "encoding/json" +) + +// 事件 +type EventMessage struct { + Message + Tag EventTag // 消息标签:EventTagUser=用户 + Flag EventFlag // 消息标签:EventFlagCreate=创建 EventFlagUpdate=更新 EventFlagSave=创建或更新 EventFlagDelete=删除 + EventId string // 事件ID + EventContent interface{} // 事件内容 +} + +type EventTag string + +const ( + EventTagUser = "user" + EventTagRoomInto EventTag = "into_room" +) + +type EventFlag string + +const ( + EventFlagSave EventFlag = "save" + EventFlagCreate EventFlag = "create" + EventFlagUpdate EventFlag = "update" + EventFlagDelete EventFlag = "delete" +) + +func (message *EventMessage) ToJson() string { + b, _ := json.Marshal(message) + return string(b) +} diff --git a/pkg/partner/mq/message/message_register.go b/pkg/partner/mq/message/message_register.go new file mode 100644 index 0000000..49e6cd8 --- /dev/null +++ b/pkg/partner/mq/message/message_register.go @@ -0,0 +1,12 @@ +package message + +// 注册消息 +type RegisterMessage struct { + Message + Platform string // 设备平台 + UserId string // 用户ID + DeviceId string // 设备ID + RegisterTime string // 注册时间 + ChannelCode string // 渠道代码 + Ip string //ip +} diff --git a/pkg/partner/mq/message/message_transaction.go b/pkg/partner/mq/message/message_transaction.go new file mode 100644 index 0000000..77ef1eb --- /dev/null +++ b/pkg/partner/mq/message/message_transaction.go @@ -0,0 +1,104 @@ +package message + +// 交易消息 +type TransactionMessage struct { + Message + FromUserId string // 发起用户ID + FromCurrency TransactionCurrencyEnum // 扣款类型 + FromAmount string // 扣款数量 + ToUserId string // 接收用户 + ToCurrency TransactionCurrencyEnum // 接收类型 + ToAmount string // 接收数量 + TransactionRate string // 交易抽成 + TransactionState TransactionStateEnum // 交易状态 + TransactionType TransactionTypeEnum // 充值、打赏、购买表情、购买守护、兑换、砸蛋、提现、订单等 + TransactionId string // 充值ID、打赏ID、购买表情ID、购买守护ID、兑换ID、砸蛋ID、提现ID、订单ID等 + TransactionCreateTime string // 交易创建时间 + TransactionCompleteTime string // 交易完成时间 + TransactionSubjectId string // 充值为产品ID、打赏为房间ID、购买表情为表情ID、购买守护为房间ID、兑换为配置ID、砸蛋为配置ID、提现为配置ID、订单为品类ID + TransactionCode TransactionCodeEnum // 充值为充值渠道(支付宝H5、支付宝App、微信、运营赠送等)、打赏为打赏类型(单个、批量)、购买表情为空、购买守护为守护类型、兑换为空、砸蛋为中奖等级、提现为银行名称、订单为空 + TransactionAmount string // 交易金额(单位为扣款类型) + TransactionAmountCoupon string // 交易优惠金额(单位为扣款类型) + TransactionAmountCouponId string // 交易优惠凭证ID + TransactionAmountPay string // 交易实际支付金额(单位为扣款类型) + FromPlatform string // 操作用户的平台 + GuildId string // 俱乐部ID +} + +// TransactionUpdateMessage 交易更新消息 +type TransactionUpdateMessage struct { + Message + TransactionState TransactionStateEnum // 交易状态 + TransactionId string // 充值ID、打赏ID、购买表情ID、购买守护ID、兑换ID、砸蛋ID、提现ID、订单ID等 + TransactionCompleteTime string // 交易完成时间 +} + +type TransactionCodeEnum string + +const ( + RewardSimple TransactionCodeEnum = "SIMPLE" // 单个打赏 + RewardMulti TransactionCodeEnum = "MULTI" // 批量打赏 + RewardBagSimple TransactionCodeEnum = "BAG_SIMPLE" // 背包礼物单个打赏 + RewardBagMulti TransactionCodeEnum = "BAG_MULTI" // 背包礼物批量打赏 + + GuardLevel01 TransactionCodeEnum = "1" // 青铜守护 + GuardLevel02 TransactionCodeEnum = "2" // 白银守护 + GuardLevel03 TransactionCodeEnum = "3" // 黄金守护 + + Hunting1 TransactionCodeEnum = "1" // 单砸 + Hunting10 TransactionCodeEnum = "10" // 十砸 + Hunting100 TransactionCodeEnum = "100" // 百砸 + + RechargeAppAlipay TransactionCodeEnum = "AppAlipay" //app支付宝 + RechargeAppWeChat TransactionCodeEnum = "AppWeChat" //app微信 + RechargeAppIap TransactionCodeEnum = "AppIap" //appIap + RechargeH5Alipay TransactionCodeEnum = "H5Alipay" //H5支付宝 + RechargeH5WeChatClub TransactionCodeEnum = "H5WeChatClub" //H5微信公众号 + RechargeOperation TransactionCodeEnum = "Operation" //Operation,后台充值 + RechargeH5WeChatWap TransactionCodeEnum = "H5WeChatWap" //H5网页支付 +) + +type TransactionStateEnum string + +const ( + CREATED TransactionStateEnum = "CREATED" // 已创建 + SUCCESS TransactionStateEnum = "SUCCESS" // 成功 + FAILED TransactionStateEnum = "FAILED" // 失败 +) + +type TransactionCurrencyEnum string + +const ( + DIAMOND TransactionCurrencyEnum = "DIAMOND" // 钻石 + NCoin TransactionCurrencyEnum = "GOLD" //N币 + CRYSTAL TransactionCurrencyEnum = "CRYSTAL" // 晶石 + MONEY TransactionCurrencyEnum = "MONEY" // 钱 + FRAGMENT TransactionCurrencyEnum = "FRAGMENT" // 碎片 +) + +type TransactionTypeEnum string + +const ( + RECHARGE TransactionTypeEnum = "RECHARGE" // 充值 + RechargeNCoin TransactionTypeEnum = "RECHARGE_N_COIN" // 充值N币 + REWARD TransactionTypeEnum = "REWARD" // 打赏 + REWARDNCoin TransactionTypeEnum = "REWARD_N_COIN" // 打赏 + GUARD TransactionTypeEnum = "GUARD" // 购买守护 + EMOJI TransactionTypeEnum = "EMOJI" // 购买表情 + OperationDiamond TransactionTypeEnum = "OPERATION_DIAMOND" // 手工加钻石 + OperationDiamondRetrieve TransactionTypeEnum = "OPERATION_DIAMOND_RETRIEVE" // 手工扣除钻石 + OperationCrystal TransactionTypeEnum = "OPERATION_CRYSTAL" // 手工加晶石 + OperationCrystalReduce TransactionTypeEnum = "OPERATION_CRYSTAL_REDUCE" // 手工扣除晶石 + EXCHANGE TransactionTypeEnum = "EXCHANGE" // 兑换 + EXCHANGENCoin TransactionTypeEnum = "EXCHANGE_N_COIN" // 兑换 + HUNTING TransactionTypeEnum = "HUNTING" // 星空寻宝 + WITHDRAW TransactionTypeEnum = "WITHDRAW" // 提现 + WithdrawNCoin TransactionTypeEnum = "WITHDRAW_N_COIN" // 提现 N币 + WithdrawTimely TransactionTypeEnum = "WITHDRAW_TIMELY" // 提现 + ORDER TransactionTypeEnum = "ORDER" // 订单 + ORDERNCoin TransactionTypeEnum = "ORDER_N_COIN" // 订单 + OrderH5 TransactionTypeEnum = "ORDER_H5" // 订单-H5 + OrderH5NCoin TransactionTypeEnum = "ORDER_H5_N_COIN" // 订单-H5 + LuckGift TransactionTypeEnum = "LUCK_GIFT" // 幸运礼物 + LuckGiftNCoin TransactionTypeEnum = "LUCK_GIFT_N_COIN" // 幸运礼物 +) diff --git a/pkg/partner/mq/message_client.go b/pkg/partner/mq/message_client.go new file mode 100644 index 0000000..424dcb5 --- /dev/null +++ b/pkg/partner/mq/message_client.go @@ -0,0 +1,625 @@ +package mq + +import ( + "servicebase/pkg/common/HyTools" + mq_http "servicebase/pkg/partner/mq/http" + message2 "servicebase/pkg/partner/mq/message" + "servicebase/pkg/partner/mq/pusher" + "encoding/json" + "errors" + "strconv" + "strings" +) + +var ( + client pusher.PushClient +) + +// MessageClient Message客户端 +type MessageClient struct { +} + +type MessageClientStarter struct { +} + +func (s *MessageClientStarter) Init() error { + client = mq_http.NewHttpClient() + return nil +} + +// PushRewardMessage 发布打赏消息 +func (*MessageClient) PushRewardMessage(from, to string, fromAmount, toAmount, createTime, rewardId, roomId, fromPlatform, guildId string, code message2.TransactionCodeEnum) (e error) { + fromA, _ := strconv.Atoi(fromAmount) + toA, _ := strconv.Atoi(toAmount) + message := message2.TransactionMessage{ + FromUserId: from, FromCurrency: message2.DIAMOND, FromAmount: fromAmount, + ToUserId: to, ToCurrency: message2.CRYSTAL, ToAmount: toAmount, + TransactionRate: strconv.Itoa(fromA - toA), + TransactionState: message2.SUCCESS, + TransactionType: message2.REWARD, + TransactionId: rewardId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: roomId, + TransactionCode: code, + TransactionAmount: fromAmount, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: fromAmount, + FromPlatform: fromPlatform, + GuildId: guildId, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushRewardNCoinMessage 发布打赏消息 +func (*MessageClient) PushRewardNCoinMessage(from, to string, fromAmount, toAmount, createTime, rewardId, roomId, fromPlatform, guildId string, code message2.TransactionCodeEnum) (e error) { + fromA, _ := strconv.Atoi(fromAmount) + toA, _ := strconv.Atoi(toAmount) + message := message2.TransactionMessage{ + FromUserId: from, FromCurrency: message2.DIAMOND, FromAmount: fromAmount, + ToUserId: to, ToCurrency: message2.CRYSTAL, ToAmount: toAmount, + TransactionRate: strconv.Itoa(fromA - toA), + TransactionState: message2.SUCCESS, + TransactionType: message2.REWARDNCoin, + TransactionId: rewardId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: roomId, + TransactionCode: code, + TransactionAmount: fromAmount, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: fromAmount, + FromPlatform: fromPlatform, + GuildId: guildId, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushGuardMessage 发布购买守护消息 +func (*MessageClient) PushGuardMessage(from, to string, fromAmount, toAmount, createTime, rewardId, roomId, fromPlatform string, code message2.TransactionCodeEnum) (e error) { + fromA, _ := strconv.Atoi(fromAmount) + toA, _ := strconv.Atoi(toAmount) + message := message2.TransactionMessage{ + FromUserId: from, FromCurrency: message2.DIAMOND, FromAmount: fromAmount, + ToUserId: to, ToCurrency: message2.CRYSTAL, ToAmount: toAmount, + TransactionRate: strconv.Itoa(fromA - toA), + TransactionState: message2.SUCCESS, + TransactionType: message2.GUARD, + TransactionId: rewardId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: roomId, + TransactionCode: code, + TransactionAmount: fromAmount, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: fromAmount, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushExchangeMessage 发布兑换消息 +func (*MessageClient) PushExchangeMessage(userId, crystal, exchangeId, createTime, fromPlatform string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.CRYSTAL, FromAmount: crystal, + ToUserId: userId, ToCurrency: message2.DIAMOND, ToAmount: crystal, + TransactionRate: "0", + TransactionState: message2.SUCCESS, + TransactionType: message2.EXCHANGE, + TransactionId: exchangeId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: crystal, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: crystal, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushExchangeNCoinMessage 发布兑换消息 +func (*MessageClient) PushExchangeNCoinMessage(userId, crystal, exchangeId, createTime, fromPlatform string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.CRYSTAL, FromAmount: crystal, + ToUserId: userId, ToCurrency: message2.DIAMOND, ToAmount: crystal, + TransactionRate: "0", + TransactionState: message2.SUCCESS, + TransactionType: message2.EXCHANGENCoin, + TransactionId: exchangeId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: crystal, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: crystal, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushHuntingMessage 发布星空寻宝(砸蛋)消息 +func (*MessageClient) PushHuntingMessage(userId, pay, win, huntingId, solutionId, createTime, fromPlatform string, code message2.TransactionCodeEnum) (e error) { + payAmount, _ := strconv.Atoi(pay) + winAmount, _ := strconv.Atoi(win) + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.DIAMOND, FromAmount: pay, + ToUserId: userId, ToCurrency: message2.DIAMOND, ToAmount: win, + TransactionRate: strconv.Itoa(payAmount - winAmount), + TransactionState: message2.SUCCESS, + TransactionType: message2.HUNTING, + TransactionId: huntingId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: solutionId, + TransactionCode: code, + TransactionAmount: pay, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: pay, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushLuckGiftMessage 发布幸运礼物消息 +func (*MessageClient) PushLuckGiftMessage(userId, toUserId, pay, win, luckId, solutionId, createTime, fromPlatform string, code message2.TransactionCodeEnum) (e error) { + payAmount, _ := strconv.Atoi(pay) + winAmount, _ := strconv.Atoi(win) + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.DIAMOND, FromAmount: pay, + ToUserId: toUserId, ToCurrency: message2.DIAMOND, ToAmount: win, + TransactionRate: strconv.Itoa(payAmount - winAmount), + TransactionState: message2.SUCCESS, + TransactionType: message2.LuckGift, + TransactionId: luckId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: solutionId, + TransactionCode: code, + TransactionAmount: pay, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: pay, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushLuckGiftNCoinMessage 发布幸运礼物消息 +func (*MessageClient) PushLuckGiftNCoinMessage(userId, toUserId, pay, win, luckId, solutionId, createTime, fromPlatform string, code message2.TransactionCodeEnum) (e error) { + payAmount, _ := strconv.Atoi(pay) + winAmount, _ := strconv.Atoi(win) + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.DIAMOND, FromAmount: pay, + ToUserId: toUserId, ToCurrency: message2.DIAMOND, ToAmount: win, + TransactionRate: strconv.Itoa(payAmount - winAmount), + TransactionState: message2.SUCCESS, + TransactionType: message2.LuckGiftNCoin, + TransactionId: luckId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: solutionId, + TransactionCode: code, + TransactionAmount: pay, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: pay, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushRechargeMessage 发布充值消息(还未到账) +func (*MessageClient) PushRechargeMessage(userId, pay, get, rechargeId, productId, createTime, fromPlatform string, code message2.TransactionCodeEnum) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.MONEY, FromAmount: pay, + ToUserId: userId, ToCurrency: message2.DIAMOND, ToAmount: get, + TransactionRate: "0", + TransactionState: message2.CREATED, + TransactionType: message2.RECHARGE, + TransactionId: rechargeId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: productId, + TransactionCode: code, + TransactionAmount: pay, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: pay, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushRechargeNCoinMessage 发布充值N币消息(还未到账) +func (*MessageClient) PushRechargeNCoinMessage(userId, pay, get, rechargeId, productId, createTime, fromPlatform string, code message2.TransactionCodeEnum) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.MONEY, FromAmount: pay, + ToUserId: userId, ToCurrency: message2.NCoin, ToAmount: get, + TransactionRate: "0", + TransactionState: message2.CREATED, + TransactionType: message2.RechargeNCoin, + TransactionId: rechargeId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: productId, + TransactionCode: code, + TransactionAmount: pay, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: pay, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushOperationDiamondMessage 发布加钻石消息 +func (*MessageClient) PushOperationDiamondMessage(userId, amount, businessId, createTime string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.MONEY, FromAmount: "0", + ToUserId: userId, ToCurrency: message2.DIAMOND, ToAmount: amount, + TransactionRate: "0", + TransactionState: message2.SUCCESS, + TransactionType: message2.OperationDiamond, + TransactionId: businessId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: amount, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: "0", + FromPlatform: "OPERATION", + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushOperationDiamondRetrieveMessage 发布钻石回收消息 +func (*MessageClient) PushOperationDiamondRetrieveMessage(userId, amount, businessId, createTime string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.MONEY, FromAmount: "0", + ToUserId: userId, ToCurrency: message2.DIAMOND, ToAmount: amount, + TransactionRate: "0", + TransactionState: message2.SUCCESS, + TransactionType: message2.OperationDiamond, + TransactionId: businessId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: amount, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: "0", + FromPlatform: "OPERATION", + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushOperationCrystalMessage 发布加晶石消息 +func (*MessageClient) PushOperationCrystalMessage(userId, amount, businessId, createTime string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.MONEY, FromAmount: "0", + ToUserId: userId, ToCurrency: message2.CRYSTAL, ToAmount: amount, + TransactionRate: "0", + TransactionState: message2.SUCCESS, + TransactionType: message2.OperationCrystal, + TransactionId: businessId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: amount, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: "0", + FromPlatform: "OPERATION", + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushOperationCrystalReduceMessage 发布扣除晶石消息 +func (*MessageClient) PushOperationCrystalReduceMessage(userId, amount, businessId, createTime string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.MONEY, FromAmount: "0", + ToUserId: userId, ToCurrency: message2.CRYSTAL, ToAmount: amount, + TransactionRate: "0", + TransactionState: message2.SUCCESS, + TransactionType: message2.OperationCrystalReduce, + TransactionId: businessId, + TransactionCreateTime: createTime, + TransactionCompleteTime: createTime, + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: amount, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: "0", + FromPlatform: "OPERATION", + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushWithdrawMessage 发布提现消息(还未完成) +func (*MessageClient) PushWithdrawMessage(userId, crystal, money, huntingId, createTime, fromPlatform string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.CRYSTAL, FromAmount: crystal, + ToUserId: userId, ToCurrency: message2.MONEY, ToAmount: money, + TransactionRate: "0", + TransactionState: message2.CREATED, + TransactionType: message2.WITHDRAW, + TransactionId: huntingId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: crystal, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: crystal, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushWithdrawNCoinMessage 发布N币提现消息(还未完成) +func (*MessageClient) PushWithdrawNCoinMessage(userId, crystal, money, huntingId, createTime, fromPlatform string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.NCoin, FromAmount: crystal, + ToUserId: userId, ToCurrency: message2.MONEY, ToAmount: money, + TransactionRate: "0", + TransactionState: message2.CREATED, + TransactionType: message2.WithdrawNCoin, + TransactionId: huntingId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: crystal, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: crystal, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushWithdrawTimelyMessage 发布提现消息(还未完成) +func (*MessageClient) PushWithdrawTimelyMessage(userId, crystal, money, rate, payMoney, huntingId, createTime, fromPlatform string) (e error) { + message := message2.TransactionMessage{ + FromUserId: userId, FromCurrency: message2.CRYSTAL, FromAmount: crystal, + ToUserId: userId, ToCurrency: message2.MONEY, ToAmount: money, + TransactionRate: rate, + TransactionState: message2.CREATED, + TransactionType: message2.WithdrawTimely, + TransactionId: huntingId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: "", + TransactionCode: "", + TransactionAmount: crystal, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: crystal, + FromPlatform: fromPlatform, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushOrderMessage 发布订单消息(还未完成)下单用户、接单用户、支付钻石、到账晶石、订单id、技能id、创建时间、下单平台 +func (*MessageClient) PushOrderMessage(fromUserId, toUserId, diamond, crystal, orderId, skillId, createTime, fromPlatform, guildId string) (e error) { + message := message2.TransactionMessage{ + FromUserId: fromUserId, FromCurrency: message2.DIAMOND, FromAmount: diamond, + ToUserId: toUserId, ToCurrency: message2.CRYSTAL, ToAmount: crystal, + TransactionRate: "0", + TransactionState: message2.CREATED, + TransactionType: message2.ORDER, + TransactionId: orderId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: skillId, + TransactionCode: "", + TransactionAmount: diamond, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: diamond, + FromPlatform: fromPlatform, + GuildId: guildId, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushOrderNCoinMessage 发布订单消息(还未完成)下单用户、接单用户、支付钻石、到账晶石、订单id、技能id、创建时间、下单平台 +func (*MessageClient) PushOrderNCoinMessage(fromUserId, toUserId, diamond, crystal, orderId, skillId, createTime, fromPlatform, guildId string) (e error) { + message := message2.TransactionMessage{ + FromUserId: fromUserId, FromCurrency: message2.DIAMOND, FromAmount: diamond, + ToUserId: toUserId, ToCurrency: message2.CRYSTAL, ToAmount: crystal, + TransactionRate: "0", + TransactionState: message2.CREATED, + TransactionType: message2.ORDERNCoin, + TransactionId: orderId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: skillId, + TransactionCode: "", + TransactionAmount: diamond, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: diamond, + FromPlatform: fromPlatform, + GuildId: guildId, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushOrderMessageH5 发布订单消息(还未完成)下单用户、接单用户、支付钻石、到账晶石、订单id、技能id、创建时间、下单平台 +func (*MessageClient) PushOrderMessageH5(fromUserId, toUserId, diamond, crystal, orderId, skillId, createTime, fromPlatform, guildId, channel string) (e error) { + message := message2.TransactionMessage{ + FromUserId: fromUserId, FromCurrency: message2.DIAMOND, FromAmount: diamond, + ToUserId: toUserId, ToCurrency: message2.CRYSTAL, ToAmount: crystal, + TransactionRate: "0", + TransactionState: message2.CREATED, + TransactionType: message2.OrderH5, + TransactionId: orderId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: skillId, + TransactionCode: message2.TransactionCodeEnum(channel), + TransactionAmount: diamond, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: diamond, + FromPlatform: fromPlatform, + GuildId: guildId, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushOrderNCoinMessageH5 发布订单消息(还未完成)下单用户、接单用户、支付钻石、到账晶石、订单id、技能id、创建时间、下单平台 +func (*MessageClient) PushOrderNCoinMessageH5(fromUserId, toUserId, diamond, crystal, orderId, skillId, createTime, fromPlatform, guildId, channel string) (e error) { + message := message2.TransactionMessage{ + FromUserId: fromUserId, FromCurrency: message2.DIAMOND, FromAmount: diamond, + ToUserId: toUserId, ToCurrency: message2.CRYSTAL, ToAmount: crystal, + TransactionRate: "0", + TransactionState: message2.CREATED, + TransactionType: message2.OrderH5NCoin, + TransactionId: orderId, + TransactionCreateTime: createTime, + TransactionCompleteTime: "", + TransactionSubjectId: skillId, + TransactionCode: message2.TransactionCodeEnum(channel), + TransactionAmount: diamond, + TransactionAmountCoupon: "0", + TransactionAmountCouponId: "", + TransactionAmountPay: diamond, + FromPlatform: fromPlatform, + GuildId: guildId, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionMessage(message) + return +} + +// PushTransactionCompleteMessage 发布交易更新消息(提现完成、充值到账等) +func (*MessageClient) PushTransactionCompleteMessage(businessId, completeTime string, state message2.TransactionStateEnum) (e error) { + if (state) != (message2.SUCCESS) && (state) != (message2.FAILED) { + e = errors.New("交易状态只能是完成状态") + return + } + message := message2.TransactionUpdateMessage{ + TransactionState: state, + TransactionId: businessId, + TransactionCompleteTime: completeTime, + } + message.MessageId = HyTools.GetUUID() + e = client.PushTransactionUpdateMessage(message) + return +} + +// PushActiveMessage 发布活跃消息 +func (*MessageClient) PushActiveMessage(userId, deviceId, time, platform, deviceModel, ip string) (e error) { + if len(strings.Split(time, " ")) != 2 { + e = errors.New("活跃时间格式错误!") + return + } + message := message2.ActiveMessage{ + UserId: userId, + DeviceId: deviceId, + ActiveTime: time, + ActivePlatform: platform, + ActiveDeviceModel: deviceModel, + ActiveIp: ip, + } + message.MessageId = HyTools.GetUUID() + e = client.PushActiveTopicMessage(message) + return +} + +// PushErrorMessage 发布错误消息 +func (*MessageClient) PushErrorMessage(code string, content interface{}, tag message2.ErrorTag) (e error) { + b, e := json.Marshal(content) + if nil != e { + return + } + message := message2.ErrorMessage{ + Code: code, + Content: string(b), + Tag: tag, + } + e = client.PushErrorTopicMessage(message) + return +} + +// PushEventMessage 发布事件消息 +func (*MessageClient) PushEventMessage(tag message2.EventTag, flag message2.EventFlag, eventId string, content interface{}) (e error) { + message := message2.EventMessage{ + Tag: tag, + Flag: flag, + EventId: eventId, + EventContent: content, + } + message.MessageId = HyTools.GetUUID() + e = client.PushEventTopicMessage(message) + return +} + +// PushActiveNewTopicMessage 发布激活消息 +func (*MessageClient) PushActiveNewTopicMessage(message message2.ActiveNewMessage) (e error) { + message.MessageId = HyTools.GetUUID() + return client.PushActiveNewTopicMessage(message) +} + +// PushRegisterMessage 发布注册消息 +func (*MessageClient) PushRegisterMessage(message message2.RegisterMessage) (e error) { + message.MessageId = HyTools.GetUUID() + return client.PushRegisterMessage(message) +} diff --git a/pkg/partner/mq/pusher/push_client.go b/pkg/partner/mq/pusher/push_client.go new file mode 100644 index 0000000..246a65d --- /dev/null +++ b/pkg/partner/mq/pusher/push_client.go @@ -0,0 +1,13 @@ +package pusher + +import "servicebase/pkg/partner/mq/message" + +type PushClient interface { + PushRegisterMessage(m message.RegisterMessage) (e error) + PushEventTopicMessage(m message.EventMessage) (e error) + PushTransactionMessage(m message.TransactionMessage) (e error) + PushTransactionUpdateMessage(m message.TransactionUpdateMessage) (e error) + PushActiveTopicMessage(m message.ActiveMessage) (e error) + PushErrorTopicMessage(m message.ErrorMessage) (e error) + PushActiveNewTopicMessage(m message.ActiveNewMessage) (e error) +} diff --git a/pkg/partner/mq/rocket/client.go b/pkg/partner/mq/rocket/client.go new file mode 100644 index 0000000..4eebc65 --- /dev/null +++ b/pkg/partner/mq/rocket/client.go @@ -0,0 +1,159 @@ +package rocket + +import ( + "servicebase/pkg/common" + "servicebase/pkg/partner/mq/message" + "servicebase/pkg/partner/mq/pusher" + "context" + "encoding/json" + "fmt" + "strings" + "sync" + + "github.com/anxpp/beego/logs" + "github.com/apache/rocketmq-client-go/v2" + "github.com/apache/rocketmq-client-go/v2/primitive" + "github.com/apache/rocketmq-client-go/v2/producer" + "github.com/spf13/viper" +) + +var ( + mqProducer rocketmq.Producer + mP sync.Mutex + topicName string + topicGroup string +) + +type Client struct { +} + +func init() { + //rlog.SetLogger() +} + +func NewRocketMQClient(topic, group string) pusher.PushClient { + mP.Lock() + defer mP.Unlock() + + if mqProducer != nil { + return &Client{} + } + + topicName = topic + topicGroup = group + + nsList := strings.Split(viper.GetString("mq.default.nameserver"), ";") + var ns []string + if len(nsList) > 0 { + for _, item := range nsList { + ns = append(ns, item) + } + } else { + ns = []string{"47.97.157.234:9876"} + } + + logs.Info("NewRocketMQClient: %s %s %v", topicName, topicGroup, ns) + + var e error + mqProducer, e = producer.NewDefaultProducer( + producer.WithNameServer(ns), + producer.WithRetry(2), + producer.WithGroupName(topicGroup), + ) + if e != nil { + logs.Error("producer.NewDefaultProducer error: " + e.Error()) + panic(e) + } + if mqProducer == nil { + logs.Error("producer.NewDefaultProducer error: mqProducer==nil") + } + err := mqProducer.Start() + if err != nil { + logs.Error("start producer error: %s", err.Error()) + panic(err) + } else { + logs.Info("NewRocketMQClient success") + } + return &Client{} +} + +func (client *Client) Push(tag, key string, message []byte) error { + + defer func() { + if x := recover(); x != nil { + logs.Error(common.LOG_QUOTE_STRING+"服务器异常 Push Message 获取到Panic @%"+common.LOG_QUOTE_STRING, x) + return + } + }() + return nil + + if nil == mqProducer { + NewRocketMQClient(topicName, topicName) + } + + msg := primitive.NewMessage(topicName, message) + msg.WithTag(tag) + msg.WithKeys([]string{key}) + res, err := mqProducer.SendSync(context.Background(), msg) + if err != nil { + fmt.Printf("send message error: %s\n", err) + } else { + fmt.Printf("send message success: result=%s\n", res.String()) + } + return err +} + +func (client *Client) PushString(tag, key, message string) error { + msg := primitive.NewMessage(topicName, []byte(message)) + msg.WithTag(tag) + msg.WithKeys([]string{key}) + res, err := mqProducer.SendSync(context.Background(), msg) + if err != nil { + fmt.Printf("send message error: %s\n", err) + } else { + fmt.Printf("send message success: result=%s\n", res.String()) + } + return err +} + +// 发布注册消息 +func (client *Client) PushRegisterMessage(message message.RegisterMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("register", message.MessageId, bytes) +} + +// 发布事件消息 +func (client *Client) PushEventTopicMessage(message message.EventMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("event", message.MessageId, bytes) +} + +// 发布交易消息 +func (client *Client) PushTransactionMessage(message message.TransactionMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("transaction", message.MessageId, bytes) +} + +// 发布交易更新消息 +func (client *Client) PushTransactionUpdateMessage(message message.TransactionUpdateMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("transaction-update", message.MessageId, bytes) +} + +// 发布活跃消息 +func (client *Client) PushActiveTopicMessage(message message.ActiveMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("active", message.MessageId, bytes) +} + +// 发布错误消息 +func (client *Client) PushErrorTopicMessage(message message.ErrorMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("error", message.MessageId, bytes) +} + +// 发布激活消息 +func (client *Client) PushActiveNewTopicMessage(message message.ActiveNewMessage) (e error) { + bytes, _ := json.Marshal(message) + return client.Push("active-new", message.MessageId, bytes) +} diff --git a/pkg/partner/mq/rocket_test.go b/pkg/partner/mq/rocket_test.go new file mode 100644 index 0000000..f3f6147 --- /dev/null +++ b/pkg/partner/mq/rocket_test.go @@ -0,0 +1,25 @@ +package mq + +import ( + "servicebase/pkg/common" + "servicebase/pkg/partner/mq/message" + "testing" + "time" + + "github.com/anxpp/beego" +) + +func TestRocket(t *testing.T) { + e := client.PushRegisterMessage(message.RegisterMessage{ + Message: message.Message{ + MessageId: "001", + }, + Platform: "android", + UserId: "001", + DeviceId: "001", + RegisterTime: beego.Date(time.Now(), common.TimeDefaultFormat), + ChannelCode: "001", + Ip: "0.0.0.0", + }) + println(e) +} diff --git a/pkg/partner/qiniu/common.go b/pkg/partner/qiniu/common.go new file mode 100644 index 0000000..24e776b --- /dev/null +++ b/pkg/partner/qiniu/common.go @@ -0,0 +1,21 @@ +package qiniu + +type MusicConvertNotifyParam struct { + Id string `json:"id"` + Pipeline string `json:"pipeline"` + Code int `json:"code"` + Desc string `json:"desc"` + Reqid string `json:"reqid"` + InputBucket string `json:"inputBucket"` + InputKey string `json:"inputKey"` + Items []MusicConvertNotifyParamItem `json:"items"` +} + +type MusicConvertNotifyParamItem struct { + Cmd string `json:"cmd"` + Code int `json:"code"` + Desc string `json:"desc"` + Hash string `json:"hash"` + Key string `json:"key"` + ReturnOld int `json:"returnOld"` +} diff --git a/pkg/partner/qiniu/qiniu_client.go b/pkg/partner/qiniu/qiniu_client.go new file mode 100644 index 0000000..7302d20 --- /dev/null +++ b/pkg/partner/qiniu/qiniu_client.go @@ -0,0 +1,137 @@ +package qiniu + +import ( + "bytes" + "context" + "encoding/base64" + "strings" + + "github.com/anxpp/beego" + "github.com/anxpp/beego/logs" + "github.com/qiniu/go-sdk/v7/auth/qbox" + "github.com/qiniu/go-sdk/v7/storage" + "github.com/spf13/viper" +) + +func getKey() string { + return viper.GetString("qiniu.key") +} + +func getSecret() string { + return viper.GetString("qiniu.secret") +} + +// 获取上传图片的token +func GenerateUploadPhotoToken(expireSeconds uint64) (token string) { + bucket := viper.GetString("qiniu.bucket.photo") + putPolicy := storage.PutPolicy{ + Scope: bucket, + ReturnBody: `{"key":"$(key)","w": $(imageInfo.width), "h": $(imageInfo.height)}`, + MimeLimit: "image/jpeg;image/png", + } + //有效期 + putPolicy.Expires = expireSeconds + mac := qbox.NewMac(getKey(), getSecret()) + token = putPolicy.UploadToken(mac) + return +} + +// 获取后台上传到七牛的token +func GenerateOperationUploadToken(expireSeconds uint64) (token string) { + bucket := viper.GetString("qiniu.bucket.photo") + putPolicy := storage.PutPolicy{ + Scope: bucket, + ReturnBody: `{"key":"$(key)"}`, + MimeLimit: "!application/json;text/plain", + } + // 有效期 + putPolicy.Expires = expireSeconds + mac := qbox.NewMac(getKey(), getSecret()) + token = putPolicy.UploadToken(mac) + + return +} + +// 获取上传音频的token +func GenerateUploadAudioToken(expireSeconds uint64) (token string) { + bucket := viper.GetString("qiniu.bucket.media") + saveMp3Entry := base64.URLEncoding.EncodeToString([]byte(bucket + ":$(key).mp3")) + //数据处理指令,支持多个指令 + avthumbMp3Fop := "avthumb/mp3/ab/192k|saveas/" + saveMp3Entry + //连接多个操作指令 + persistentOps := strings.Join([]string{avthumbMp3Fop}, ";") + pipeline := "FYToMP3Quene" + putPolicy := storage.PutPolicy{ + Scope: bucket, + PersistentOps: persistentOps, + PersistentPipeline: pipeline, + PersistentNotifyURL: viper.GetString("open.notify.qiniuMusicConvert"), + } + putPolicy.Expires = expireSeconds + // 转码通知 + logs.Info("GenerateUploadAudioToken.notifyUrl: " + viper.GetString("open.notify.qiniuMusicConvert")) + mac := qbox.NewMac(getKey(), getSecret()) + upToken := putPolicy.UploadToken(mac) + token = upToken + return +} + +// 获取上传视频的token +func GenerateUploadVideoToken(expireSeconds uint64) (token string) { + bucket := viper.GetString("qiniu.bucket.video") + saveMp4Entry := base64.URLEncoding.EncodeToString([]byte(bucket + ":$(key).mp4")) + saveJpgEntry := base64.URLEncoding.EncodeToString([]byte(bucket + ":$(key).jpg")) + //数据处理指令,支持多个指令 + avthumbMp4Fop := "avthumb/mp4/vcodec/libx264/s/1280x1280/autoscale/1/avsmart/1/enhance/0|saveas/" + saveMp4Entry + vframeJpgFop := "vframe/jpg/offset/1|saveas/" + saveJpgEntry + //连接多个操作指令 + // persistentOps := strings.Join([]string{avthumbMp4Fop, vframeJpgFop}, ";") + persistentOps := strings.Join([]string{avthumbMp4Fop, vframeJpgFop}, ";") + pipeline := "FYVideoToMP4Quene" + putPolicy := storage.PutPolicy{ + Scope: bucket, + PersistentOps: persistentOps, + PersistentPipeline: pipeline, + } + putPolicy.Expires = expireSeconds + + mac := qbox.NewMac(getKey(), getSecret()) + upToken := putPolicy.UploadToken(mac) + + token = upToken + return +} + +func UploadFile(ctx context.Context, bucket string, fileByte []byte, key string) (fileKey string) { + putPolicy := storage.PutPolicy{ + Scope: bucket, + Expires: 600, //10分钟过期 + } + mac := qbox.NewMac(getKey(), getSecret()) + upToken := putPolicy.UploadToken(mac) + cfg := storage.Config{} + // 空间对应的机房 + cfg.Zone = &storage.ZoneHuadong + // 是否使用https域名 + cfg.UseHTTPS = false + // 上传是否使用CDN上传加速 + cfg.UseCdnDomains = false + // 构建表单上传的对象 + formUploader := storage.NewFormUploader(&cfg) + ret := storage.PutRet{} + // 可选配置 + putExtra := storage.PutExtra{} + + dataLen := int64(len(fileByte)) + + err := formUploader.Put(ctx, &ret, upToken, key, bytes.NewReader(fileByte), dataLen, &putExtra) + if err != nil { + beego.BeeLogger.Error("上传失败" + err.Error()) + fileKey = "" + return + } + + //上传成功 + fileKey = key + return +} diff --git a/pkg/partner/recommend/client.go b/pkg/partner/recommend/client.go new file mode 100644 index 0000000..03687d3 --- /dev/null +++ b/pkg/partner/recommend/client.go @@ -0,0 +1,78 @@ +package recommend + +import ( + "servicebase/pkg/cache" + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + + "github.com/anxpp/beego" + "github.com/anxpp/beego/logs" + redis "github.com/redis/go-redis/v9" +) + +const ( + keyUser = "user" + redisKey = "RECOMMEND" +) + +type ItemScore struct { + Key string + Score float64 +} + +type recommendRes struct { + Code int `json:"code"` + Data []ItemScore `json:"data"` + Msg string `json:"msg"` +} + +func GetRecommendUserList(page, size int, skillId string, input map[string]string) (list []string) { + rk := fmt.Sprintf("%s_%s_%s_%s", redisKey, keyUser, skillId, input["user.id"]) + redisClient := cache.GetCommonRedisInstance().RedisClient + // 更新缓存 存在缓存穿透 + if page == 0 { + members := recommendList(keyUser, skillId, input) + var mList []redis.Z + for _, item := range members { + mList = append(mList, redis.Z{ + Score: item.Score, + Member: item.Key, + }) + } + if len(mList) > 0 { + redisClient.ZAdd(cache.Ctx(), rk, mList...) + } + } + list, _ = redisClient.ZRevRange(cache.Ctx(), rk, int64(page*size), int64((page+1)*size-1)).Result() + return +} + +func recommendList(key, group string, input map[string]string) (list []ItemScore) { + logs.Info("load recommend info from recommend service.") + url := fmt.Sprintf("%s%s?group=%s", beego.AppConfig.String("recommendServiceUrl"), key, group) + requestBody, _ := json.Marshal(input) + resp, err := http.Post(url, "application/json;charset=UTF-8", bytes.NewReader(requestBody)) + if err != nil { + logs.Info(err.Error()) + } + if nil == resp { + return + } + defer func() { + _ = resp.Body.Close() + }() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + // handle error + } + logs.Info(string(body)) + var res recommendRes + _ = json.Unmarshal(body, &res) + if res.Code != 6000 { + logs.Info(res.Msg) + } + return res.Data +} diff --git a/pkg/partner/submail/submail_client.go b/pkg/partner/submail/submail_client.go new file mode 100644 index 0000000..23a8943 --- /dev/null +++ b/pkg/partner/submail/submail_client.go @@ -0,0 +1,142 @@ +package submail + +import ( + "encoding/json" + "servicebase/pkg/utils" + "sort" + + "github.com/spf13/viper" +) + +const ( +// submailUrl = "https://api.mysubmail.com/message/xsend.json" +// submailAppId = "105610" +// submialAppKey = "6fec871bd91b4184cec9a6840bc55a31" +// submailSignType = "normal" + +// // 国际短信 +// internationalUrl = "https://api-v4.mysubmail.com/internationalsms/xsend" +// internationalAppId = "62587" +// internationalAppKey = "7b1e063c06d45b29a2490e61363981c4" +) + +type SubmailClient struct { + ToMobile string + TplId string + Vars map[string]string +} + +type SubmailResponse struct { + Status string `json:"status"` + SendId string `json:"send_id"` + Fee int `json:"fee"` + SmsCredits string `json:"sms_credits"` + Code int `json:"code"` + Msg string `json:"msg"` +} + +// 用Submail发送短信 +func (s *SubmailClient) SendMessageBySubmail() (submailRes SubmailResponse) { + + if len(s.ToMobile) == 0 || len(s.TplId) == 0 { + panic("缺少手机号或模板ID") + } + + parameters := make(map[string]string) + parameters["appid"] = viper.GetString("submail.sms.appId") + parameters["to"] = s.ToMobile + parameters["project"] = s.TplId + parameters["sign_type"] = viper.GetString("submail.sms.signType") + + if len(s.Vars) > 0 { + varbyte, err := json.Marshal(s.Vars) + if err != nil { + return + } + parameters["vars"] = string(varbyte) + } + + keys := make([]string, 0, len(parameters)-1) + + for k := range parameters { + keys = append(keys, k) + } + + //对key按asc升序 + sort.Strings(keys) + + //待签名字符串 + waitSignString := "" + for _, value := range keys { + waitSignString += value + "=" + parameters[value] + "&" + } + strlen := len(waitSignString) + if strlen > 0 { + waitSignString = waitSignString[:strlen-1] + } + + waitSignString += "&signature=" + viper.GetString("submail.sms.appKey") + + res, err1 := utils.HttpPost(viper.GetString("submail.sms.url"), waitSignString) + + if err1 != nil { + return + } + + _ = json.Unmarshal([]byte(res), &submailRes) + + return + +} + +// 用Submail发送国际短信 +func (s *SubmailClient) SendInternationalMessageBySubmail() (submailRes SubmailResponse) { + + if len(s.ToMobile) == 0 || len(s.TplId) == 0 { + panic("缺少手机号或模板ID") + } + + parameters := make(map[string]string) + parameters["appid"] = viper.GetString("submail.international.appId") + parameters["to"] = s.ToMobile + parameters["project"] = s.TplId + parameters["sign_type"] = viper.GetString("submail.international.signType") + + if len(s.Vars) > 0 { + varbyte, err := json.Marshal(s.Vars) + if err != nil { + return + } + parameters["vars"] = string(varbyte) + } + + keys := make([]string, 0, len(parameters)-1) + + for k := range parameters { + keys = append(keys, k) + } + + //对key按asc升序 + sort.Strings(keys) + + //待签名字符串 + waitSignString := "" + for _, value := range keys { + waitSignString += value + "=" + parameters[value] + "&" + } + strlen := len(waitSignString) + if strlen > 0 { + waitSignString = waitSignString[:strlen-1] + } + + waitSignString += "&signature=" + viper.GetString("submail.international.appKey") + + res, err1 := utils.HttpPost(viper.GetString("submail.international.url"), waitSignString) + + if err1 != nil { + return + } + + _ = json.Unmarshal([]byte(res), &submailRes) + return +} diff --git a/pkg/partner/wxpay_utility/util.go b/pkg/partner/wxpay_utility/util.go new file mode 100644 index 0000000..94ad199 --- /dev/null +++ b/pkg/partner/wxpay_utility/util.go @@ -0,0 +1,580 @@ +package wxpay_utility + +import ( + "bytes" + "crypto" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/sha256" + "crypto/x509" + "encoding/base64" + "encoding/json" + "encoding/pem" + "errors" + "fmt" + "hash" + "io" + "net/http" + "os" + "strconv" + "time" + + "github.com/tjfoc/gmsm/sm3" +) + +// MchConfig 商户信息配置,用于调用商户API +type MchConfig struct { + mchId string + certificateSerialNo string + privateKeyFilePath string + wechatPayPublicKeyId string + wechatPayPublicKeyFilePath string + privateKey *rsa.PrivateKey + wechatPayPublicKey *rsa.PublicKey +} + +// MchId 商户号 +func (c *MchConfig) MchId() string { + return c.mchId +} + +// CertificateSerialNo 商户API证书序列号 +func (c *MchConfig) CertificateSerialNo() string { + return c.certificateSerialNo +} + +// PrivateKey 商户API证书对应的私钥 +func (c *MchConfig) PrivateKey() *rsa.PrivateKey { + return c.privateKey +} + +// WechatPayPublicKeyId 微信支付公钥ID +func (c *MchConfig) WechatPayPublicKeyId() string { + return c.wechatPayPublicKeyId +} + +// WechatPayPublicKey 微信支付公钥 +func (c *MchConfig) WechatPayPublicKey() *rsa.PublicKey { + return c.wechatPayPublicKey +} + +// CreateMchConfig MchConfig 构造函数 +func CreateMchConfig( + mchId string, + certificateSerialNo string, + privateKeyFilePath string, + wechatPayPublicKeyId string, + wechatPayPublicKeyFilePath string, +) (*MchConfig, error) { + mchConfig := &MchConfig{ + mchId: mchId, + certificateSerialNo: certificateSerialNo, + privateKeyFilePath: privateKeyFilePath, + wechatPayPublicKeyId: wechatPayPublicKeyId, + wechatPayPublicKeyFilePath: wechatPayPublicKeyFilePath, + } + privateKey, err := LoadPrivateKeyWithPath(mchConfig.privateKeyFilePath) + if err != nil { + return nil, err + } + mchConfig.privateKey = privateKey + wechatPayPublicKey, err := LoadPublicKeyWithPath(mchConfig.wechatPayPublicKeyFilePath) + if err != nil { + return nil, err + } + mchConfig.wechatPayPublicKey = wechatPayPublicKey + return mchConfig, nil +} + +// LoadPrivateKey 通过私钥的文本内容加载私钥 +func LoadPrivateKey(privateKeyStr string) (privateKey *rsa.PrivateKey, err error) { + block, _ := pem.Decode([]byte(privateKeyStr)) + if block == nil { + return nil, fmt.Errorf("decode private key err") + } + if block.Type != "PRIVATE KEY" { + return nil, fmt.Errorf("the kind of PEM should be PRVATE KEY") + } + key, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + return nil, fmt.Errorf("parse private key err:%s", err.Error()) + } + privateKey, ok := key.(*rsa.PrivateKey) + if !ok { + return nil, fmt.Errorf("not a RSA private key") + } + return privateKey, nil +} + +// LoadPublicKey 通过公钥的文本内容加载公钥 +func LoadPublicKey(publicKeyStr string) (publicKey *rsa.PublicKey, err error) { + block, _ := pem.Decode([]byte(publicKeyStr)) + if block == nil { + return nil, errors.New("decode public key error") + } + if block.Type != "PUBLIC KEY" { + return nil, fmt.Errorf("the kind of PEM should be PUBLIC KEY") + } + key, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return nil, fmt.Errorf("parse public key err:%s", err.Error()) + } + publicKey, ok := key.(*rsa.PublicKey) + if !ok { + return nil, fmt.Errorf("%s is not rsa public key", publicKeyStr) + } + return publicKey, nil +} + +// LoadPrivateKeyWithPath 通过私钥的文件路径内容加载私钥 +func LoadPrivateKeyWithPath(path string) (privateKey *rsa.PrivateKey, err error) { + privateKeyBytes, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("read private pem file err:%s", err.Error()) + } + return LoadPrivateKey(string(privateKeyBytes)) +} + +// LoadPublicKeyWithPath 通过公钥的文件路径加载公钥 +func LoadPublicKeyWithPath(path string) (publicKey *rsa.PublicKey, err error) { + publicKeyBytes, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("read certificate pem file err:%s", err.Error()) + } + return LoadPublicKey(string(publicKeyBytes)) +} + +// EncryptOAEPWithPublicKey 使用 OAEP padding方式用公钥进行加密 +func EncryptOAEPWithPublicKey(message string, publicKey *rsa.PublicKey) (ciphertext string, err error) { + if publicKey == nil { + return "", fmt.Errorf("you should input *rsa.PublicKey") + } + ciphertextByte, err := rsa.EncryptOAEP(sha1.New(), rand.Reader, publicKey, []byte(message), nil) + if err != nil { + return "", fmt.Errorf("encrypt message with public key err:%s", err.Error()) + } + ciphertext = base64.StdEncoding.EncodeToString(ciphertextByte) + return ciphertext, nil +} + +// DecryptAES256GCM 使用 AEAD_AES_256_GCM 算法进行解密 +// +// 可以使用此算法完成微信支付回调报文解密 +func DecryptAES256GCM(aesKey, associatedData, nonce, ciphertext string) (plaintext string, err error) { + decodedCiphertext, err := base64.StdEncoding.DecodeString(ciphertext) + if err != nil { + return "", err + } + c, err := aes.NewCipher([]byte(aesKey)) + if err != nil { + return "", err + } + gcm, err := cipher.NewGCM(c) + if err != nil { + return "", err + } + dataBytes, err := gcm.Open(nil, []byte(nonce), decodedCiphertext, []byte(associatedData)) + if err != nil { + return "", err + } + return string(dataBytes), nil +} + +// SignSHA256WithRSA 通过私钥对字符串以 SHA256WithRSA 算法生成签名信息 +func SignSHA256WithRSA(source string, privateKey *rsa.PrivateKey) (signature string, err error) { + if privateKey == nil { + return "", fmt.Errorf("private key should not be nil") + } + h := crypto.Hash.New(crypto.SHA256) + _, err = h.Write([]byte(source)) + if err != nil { + return "", nil + } + hashed := h.Sum(nil) + signatureByte, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed) + if err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(signatureByte), nil +} + +// VerifySHA256WithRSA 通过公钥对字符串和签名结果以 SHA256WithRSA 验证签名有效性 +func VerifySHA256WithRSA(source string, signature string, publicKey *rsa.PublicKey) error { + if publicKey == nil { + return fmt.Errorf("public key should not be nil") + } + + sigBytes, err := base64.StdEncoding.DecodeString(signature) + if err != nil { + return fmt.Errorf("verify failed: signature is not base64 encoded") + } + hashed := sha256.Sum256([]byte(source)) + err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed[:], sigBytes) + if err != nil { + return fmt.Errorf("verify signature with public key error:%s", err.Error()) + } + return nil +} + +// GenerateNonce 生成一个长度为 NonceLength 的随机字符串(只包含大小写字母与数字) +func GenerateNonce() (string, error) { + const ( + // NonceSymbols 随机字符串可用字符集 + NonceSymbols = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + // NonceLength 随机字符串的长度 + NonceLength = 32 + ) + + bytes := make([]byte, NonceLength) + _, err := rand.Read(bytes) + if err != nil { + return "", err + } + symbolsByteLength := byte(len(NonceSymbols)) + for i, b := range bytes { + bytes[i] = NonceSymbols[b%symbolsByteLength] + } + return string(bytes), nil +} + +// BuildAuthorization 构建请求头中的 Authorization 信息 +func BuildAuthorization( + mchid string, + certificateSerialNo string, + privateKey *rsa.PrivateKey, + method string, + canonicalURL string, + body []byte, +) (string, error) { + const ( + SignatureMessageFormat = "%s\n%s\n%d\n%s\n%s\n" // 数字签名原文格式 + // HeaderAuthorizationFormat 请求头中的 Authorization 拼接格式 + HeaderAuthorizationFormat = "WECHATPAY2-SHA256-RSA2048 mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%d\",serial_no=\"%s\",signature=\"%s\"" + ) + + nonce, err := GenerateNonce() + if err != nil { + return "", err + } + timestamp := time.Now().Unix() + message := fmt.Sprintf(SignatureMessageFormat, method, canonicalURL, timestamp, nonce, body) + signature, err := SignSHA256WithRSA(message, privateKey) + if err != nil { + return "", err + } + authorization := fmt.Sprintf( + HeaderAuthorizationFormat, + mchid, nonce, timestamp, certificateSerialNo, signature, + ) + return authorization, nil +} + +// ExtractResponseBody 提取应答报文的 Body +func ExtractResponseBody(response *http.Response) ([]byte, error) { + if response.Body == nil { + return nil, nil + } + + body, err := io.ReadAll(response.Body) + if err != nil { + return nil, fmt.Errorf("read response body err:[%s]", err.Error()) + } + response.Body = io.NopCloser(bytes.NewBuffer(body)) + return body, nil +} + +const ( + WechatPayTimestamp = "Wechatpay-Timestamp" // 微信支付回包时间戳 + WechatPayNonce = "Wechatpay-Nonce" // 微信支付回包随机字符串 + WechatPaySignature = "Wechatpay-Signature" // 微信支付回包签名信息 + WechatPaySerial = "Wechatpay-Serial" // 微信支付回包平台序列号 + RequestID = "Request-Id" // 微信支付回包请求ID +) + +func validateWechatPaySignature( + wechatpayPublicKeyId string, + wechatpayPublicKey *rsa.PublicKey, + headers *http.Header, + body []byte, +) error { + timestampStr := headers.Get(WechatPayTimestamp) + serialNo := headers.Get(WechatPaySerial) + signature := headers.Get(WechatPaySignature) + nonce := headers.Get(WechatPayNonce) + + // 拒绝过期请求 + timestamp, err := strconv.ParseInt(timestampStr, 10, 64) + if err != nil { + return fmt.Errorf("invalid timestamp: %w", err) + } + if time.Now().Sub(time.Unix(timestamp, 0)) > 5*time.Minute { + return fmt.Errorf("timestamp expired: %d", timestamp) + } + + if serialNo != wechatpayPublicKeyId { + return fmt.Errorf( + "serial-no mismatch: got %s, expected %s", + serialNo, + wechatpayPublicKeyId, + ) + } + + message := fmt.Sprintf("%s\n%s\n%s\n", timestampStr, nonce, body) + if err := VerifySHA256WithRSA(message, signature, wechatpayPublicKey); err != nil { + return fmt.Errorf("invalid signature: %v", err) + } + + return nil +} + +// ValidateResponse 验证微信支付回包的签名信息 +func ValidateResponse( + wechatpayPublicKeyId string, + wechatpayPublicKey *rsa.PublicKey, + headers *http.Header, + body []byte, +) error { + if err := validateWechatPaySignature(wechatpayPublicKeyId, wechatpayPublicKey, headers, body); err != nil { + return fmt.Errorf("validate response err: %w, RequestID: %s", err, headers.Get(RequestID)) + } + return nil +} + +func validateNotification( + wechatpayPublicKeyId string, + wechatpayPublicKey *rsa.PublicKey, + headers *http.Header, + body []byte, +) error { + if err := validateWechatPaySignature(wechatpayPublicKeyId, wechatpayPublicKey, headers, body); err != nil { + return fmt.Errorf("validate notification err: %w", err) + } + return nil +} + +// Resource 微信支付通知请求中的资源数据 +type Resource struct { + Algorithm string `json:"algorithm"` + Ciphertext string `json:"ciphertext"` + AssociatedData string `json:"associated_data"` + Nonce string `json:"nonce"` + OriginalType string `json:"original_type"` +} + +// Notification 微信支付通知的数据结构 +type Notification struct { + ID string `json:"id"` + CreateTime *time.Time `json:"create_time"` + EventType string `json:"event_type"` + ResourceType string `json:"resource_type"` + Resource *Resource `json:"resource"` + Summary string `json:"summary"` + + Plaintext string // 解密后的业务数据(JSON字符串) +} + +func (c *Notification) validate() error { + if c.Resource == nil { + return errors.New("resource is nil") + } + + if c.Resource.Algorithm != "AEAD_AES_256_GCM" { + return fmt.Errorf("unsupported algorithm: %s", c.Resource.Algorithm) + } + + if c.Resource.Ciphertext == "" { + return errors.New("ciphertext is empty") + } + + if c.Resource.AssociatedData == "" { + return errors.New("associated_data is empty") + } + + if c.Resource.Nonce == "" { + return errors.New("nonce is empty") + } + + if c.Resource.OriginalType == "" { + return fmt.Errorf("original_type is empty") + } + + return nil +} + +func (c *Notification) decrypt(apiv3Key string) error { + if err := c.validate(); err != nil { + return fmt.Errorf("notification format err: %w", err) + } + + plaintext, err := DecryptAES256GCM( + apiv3Key, + c.Resource.AssociatedData, + c.Resource.Nonce, + c.Resource.Ciphertext, + ) + if err != nil { + return fmt.Errorf("notification decrypt err: %w", err) + } + + c.Plaintext = plaintext + return nil +} + +// ParseNotification 解析微信支付通知的报文,返回通知中的业务数据 +// Notification.PlainText 为解密后的业务数据JSON字符串,请自行反序列化后使用 +func ParseNotification( + wechatpayPublicKeyId string, + wechatpayPublicKey *rsa.PublicKey, + apiv3Key string, + headers *http.Header, + body []byte, +) (*Notification, error) { + if err := validateNotification(wechatpayPublicKeyId, wechatpayPublicKey, headers, body); err != nil { + return nil, err + } + + notification := &Notification{} + if err := json.Unmarshal(body, notification); err != nil { + return nil, fmt.Errorf("parse notification err: %w", err) + } + + if err := notification.decrypt(apiv3Key); err != nil { + return nil, fmt.Errorf("notification decrypt err: %w", err) + } + + return notification, nil +} + +// ApiException 微信支付API错误异常,发送HTTP请求成功,但返回状态码不是 2XX 时抛出本异常 +type ApiException struct { + statusCode int // 应答报文的 HTTP 状态码 + header http.Header // 应答报文的 Header 信息 + body []byte // 应答报文的 Body 原文 + errorCode string // 微信支付回包的错误码 + errorMessage string // 微信支付回包的错误信息 +} + +func (c *ApiException) Error() string { + buf := bytes.NewBuffer(nil) + buf.WriteString(fmt.Sprintf("api error:[StatusCode: %d, Body: %s", c.statusCode, string(c.body))) + if len(c.header) > 0 { + buf.WriteString(" Header: ") + for key, value := range c.header { + buf.WriteString(fmt.Sprintf("\n - %v=%v", key, value)) + } + buf.WriteString("\n") + } + buf.WriteString("]") + return buf.String() +} + +func (c *ApiException) StatusCode() int { + return c.statusCode +} + +func (c *ApiException) Header() http.Header { + return c.header +} + +func (c *ApiException) Body() []byte { + return c.body +} + +func (c *ApiException) ErrorCode() string { + return c.errorCode +} + +func (c *ApiException) ErrorMessage() string { + return c.errorMessage +} + +func NewApiException(statusCode int, header http.Header, body []byte) error { + ret := &ApiException{ + statusCode: statusCode, + header: header, + body: body, + } + + bodyObject := map[string]interface{}{} + if err := json.Unmarshal(body, &bodyObject); err == nil { + if val, ok := bodyObject["code"]; ok { + ret.errorCode = val.(string) + } + if val, ok := bodyObject["message"]; ok { + ret.errorMessage = val.(string) + } + } + + return ret +} + +// Time 复制 time.Time 对象,并返回复制体的指针 +func Time(t time.Time) *time.Time { + return &t +} + +// String 复制 string 对象,并返回复制体的指针 +func String(s string) *string { + return &s +} + +// Bytes 复制 []byte 对象,并返回复制体的指针 +func Bytes(b []byte) *[]byte { + return &b +} + +// Bool 复制 bool 对象,并返回复制体的指针 +func Bool(b bool) *bool { + return &b +} + +// Float64 复制 float64 对象,并返回复制体的指针 +func Float64(f float64) *float64 { + return &f +} + +// Float32 复制 float32 对象,并返回复制体的指针 +func Float32(f float32) *float32 { + return &f +} + +// Int64 复制 int64 对象,并返回复制体的指针 +func Int64(i int64) *int64 { + return &i +} + +// Int32 复制 int64 对象,并返回复制体的指针 +func Int32(i int32) *int32 { + return &i +} + +// generateHashFromStream 从io.Reader流中生成哈希值的通用函数 +func generateHashFromStream(reader io.Reader, hashFunc func() hash.Hash, algorithmName string) (string, error) { + hash := hashFunc() + if _, err := io.Copy(hash, reader); err != nil { + return "", fmt.Errorf("failed to read stream for %s: %w", algorithmName, err) + } + return fmt.Sprintf("%x", hash.Sum(nil)), nil +} + +// GenerateSHA256FromStream 从io.Reader流中生成SHA256哈希值 +func GenerateSHA256FromStream(reader io.Reader) (string, error) { + return generateHashFromStream(reader, sha256.New, "SHA256") +} + +// GenerateSHA1FromStream 从io.Reader流中生成SHA1哈希值 +func GenerateSHA1FromStream(reader io.Reader) (string, error) { + return generateHashFromStream(reader, sha1.New, "SHA1") +} + +// GenerateSM3FromStream 从io.Reader流中生成SM3哈希值 +func GenerateSM3FromStream(reader io.Reader) (string, error) { + h := sm3.New() + if _, err := io.Copy(h, reader); err != nil { + return "", fmt.Errorf("failed to read stream for SM3: %w", err) + } + return fmt.Sprintf("%x", h.Sum(nil)), nil +} diff --git a/pkg/repo/admin_privilege.gen.go b/pkg/repo/admin_privilege.gen.go new file mode 100644 index 0000000..306bb44 --- /dev/null +++ b/pkg/repo/admin_privilege.gen.go @@ -0,0 +1,453 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newAdminPrivilege(db *gorm.DB, opts ...gen.DOOption) adminPrivilege { + _adminPrivilege := adminPrivilege{} + + _adminPrivilege.adminPrivilegeDo.UseDB(db, opts...) + _adminPrivilege.adminPrivilegeDo.UseModel(&model.AdminPrivilege{}) + + tableName := _adminPrivilege.adminPrivilegeDo.TableName() + _adminPrivilege.ALL = field.NewAsterisk(tableName) + _adminPrivilege.ID = field.NewString(tableName, "id") + _adminPrivilege.TenantID = field.NewString(tableName, "tenant_id") + _adminPrivilege.ScopeID = field.NewString(tableName, "scope_id") + _adminPrivilege.ParentID = field.NewString(tableName, "parent_id") + _adminPrivilege.Code = field.NewString(tableName, "code") + _adminPrivilege.Name = field.NewString(tableName, "name") + _adminPrivilege.Level = field.NewInt32(tableName, "level") + _adminPrivilege.SourceType = field.NewString(tableName, "source_type") + _adminPrivilege.TargetType = field.NewString(tableName, "target_type") + _adminPrivilege.Target = field.NewString(tableName, "target") + _adminPrivilege.Desc = field.NewString(tableName, "desc") + _adminPrivilege.DeleteAt = field.NewField(tableName, "delete_at") + _adminPrivilege.CreateAt = field.NewTime(tableName, "create_at") + _adminPrivilege.CreateBy = field.NewString(tableName, "create_by") + _adminPrivilege.UpdateAt = field.NewTime(tableName, "update_at") + _adminPrivilege.UpdateBy = field.NewString(tableName, "update_by") + + _adminPrivilege.fillFieldMap() + + return _adminPrivilege +} + +// adminPrivilege 租户-权限表 +type adminPrivilege struct { + adminPrivilegeDo adminPrivilegeDo + + ALL field.Asterisk + ID field.String // 业务ID + TenantID field.String // 企业ID + ScopeID field.String // 范围 + ParentID field.String // 父ID + Code field.String // 代码 + Name field.String // 权限名称 + Level field.Int32 // 权限级别 + SourceType field.String // 类型:resource、interface等 + TargetType field.String + Target field.String // 权限值 resource:菜单路径; api=url-pre + Desc field.String // 描述 + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (a adminPrivilege) Table(newTableName string) *adminPrivilege { + a.adminPrivilegeDo.UseTable(newTableName) + return a.updateTableName(newTableName) +} + +func (a adminPrivilege) As(alias string) *adminPrivilege { + a.adminPrivilegeDo.DO = *(a.adminPrivilegeDo.As(alias).(*gen.DO)) + return a.updateTableName(alias) +} + +func (a *adminPrivilege) updateTableName(table string) *adminPrivilege { + a.ALL = field.NewAsterisk(table) + a.ID = field.NewString(table, "id") + a.TenantID = field.NewString(table, "tenant_id") + a.ScopeID = field.NewString(table, "scope_id") + a.ParentID = field.NewString(table, "parent_id") + a.Code = field.NewString(table, "code") + a.Name = field.NewString(table, "name") + a.Level = field.NewInt32(table, "level") + a.SourceType = field.NewString(table, "source_type") + a.TargetType = field.NewString(table, "target_type") + a.Target = field.NewString(table, "target") + a.Desc = field.NewString(table, "desc") + a.DeleteAt = field.NewField(table, "delete_at") + a.CreateAt = field.NewTime(table, "create_at") + a.CreateBy = field.NewString(table, "create_by") + a.UpdateAt = field.NewTime(table, "update_at") + a.UpdateBy = field.NewString(table, "update_by") + + a.fillFieldMap() + + return a +} + +func (a *adminPrivilege) WithContext(ctx context.Context) IAdminPrivilegeDo { + return a.adminPrivilegeDo.WithContext(ctx) +} + +func (a adminPrivilege) TableName() string { return a.adminPrivilegeDo.TableName() } + +func (a adminPrivilege) Alias() string { return a.adminPrivilegeDo.Alias() } + +func (a adminPrivilege) Columns(cols ...field.Expr) gen.Columns { + return a.adminPrivilegeDo.Columns(cols...) +} + +func (a *adminPrivilege) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := a.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (a *adminPrivilege) fillFieldMap() { + a.fieldMap = make(map[string]field.Expr, 16) + a.fieldMap["id"] = a.ID + a.fieldMap["tenant_id"] = a.TenantID + a.fieldMap["scope_id"] = a.ScopeID + a.fieldMap["parent_id"] = a.ParentID + a.fieldMap["code"] = a.Code + a.fieldMap["name"] = a.Name + a.fieldMap["level"] = a.Level + a.fieldMap["source_type"] = a.SourceType + a.fieldMap["target_type"] = a.TargetType + a.fieldMap["target"] = a.Target + a.fieldMap["desc"] = a.Desc + a.fieldMap["delete_at"] = a.DeleteAt + a.fieldMap["create_at"] = a.CreateAt + a.fieldMap["create_by"] = a.CreateBy + a.fieldMap["update_at"] = a.UpdateAt + a.fieldMap["update_by"] = a.UpdateBy +} + +func (a adminPrivilege) clone(db *gorm.DB) adminPrivilege { + a.adminPrivilegeDo.ReplaceConnPool(db.Statement.ConnPool) + return a +} + +func (a adminPrivilege) replaceDB(db *gorm.DB) adminPrivilege { + a.adminPrivilegeDo.ReplaceDB(db) + return a +} + +type adminPrivilegeDo struct{ gen.DO } + +type IAdminPrivilegeDo interface { + gen.SubQuery + Debug() IAdminPrivilegeDo + WithContext(ctx context.Context) IAdminPrivilegeDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IAdminPrivilegeDo + WriteDB() IAdminPrivilegeDo + As(alias string) gen.Dao + Session(config *gorm.Session) IAdminPrivilegeDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IAdminPrivilegeDo + Not(conds ...gen.Condition) IAdminPrivilegeDo + Or(conds ...gen.Condition) IAdminPrivilegeDo + Select(conds ...field.Expr) IAdminPrivilegeDo + Where(conds ...gen.Condition) IAdminPrivilegeDo + Order(conds ...field.Expr) IAdminPrivilegeDo + Distinct(cols ...field.Expr) IAdminPrivilegeDo + Omit(cols ...field.Expr) IAdminPrivilegeDo + Join(table schema.Tabler, on ...field.Expr) IAdminPrivilegeDo + LeftJoin(table schema.Tabler, on ...field.Expr) IAdminPrivilegeDo + RightJoin(table schema.Tabler, on ...field.Expr) IAdminPrivilegeDo + Group(cols ...field.Expr) IAdminPrivilegeDo + Having(conds ...gen.Condition) IAdminPrivilegeDo + Limit(limit int) IAdminPrivilegeDo + Offset(offset int) IAdminPrivilegeDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminPrivilegeDo + Unscoped() IAdminPrivilegeDo + Create(values ...*model.AdminPrivilege) error + CreateInBatches(values []*model.AdminPrivilege, batchSize int) error + Save(values ...*model.AdminPrivilege) error + First() (*model.AdminPrivilege, error) + Take() (*model.AdminPrivilege, error) + Last() (*model.AdminPrivilege, error) + Find() ([]*model.AdminPrivilege, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminPrivilege, err error) + FindInBatches(result *[]*model.AdminPrivilege, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.AdminPrivilege) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IAdminPrivilegeDo + Assign(attrs ...field.AssignExpr) IAdminPrivilegeDo + Joins(fields ...field.RelationField) IAdminPrivilegeDo + Preload(fields ...field.RelationField) IAdminPrivilegeDo + FirstOrInit() (*model.AdminPrivilege, error) + FirstOrCreate() (*model.AdminPrivilege, error) + FindByPage(offset int, limit int) (result []*model.AdminPrivilege, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IAdminPrivilegeDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (a adminPrivilegeDo) Debug() IAdminPrivilegeDo { + return a.withDO(a.DO.Debug()) +} + +func (a adminPrivilegeDo) WithContext(ctx context.Context) IAdminPrivilegeDo { + return a.withDO(a.DO.WithContext(ctx)) +} + +func (a adminPrivilegeDo) ReadDB() IAdminPrivilegeDo { + return a.Clauses(dbresolver.Read) +} + +func (a adminPrivilegeDo) WriteDB() IAdminPrivilegeDo { + return a.Clauses(dbresolver.Write) +} + +func (a adminPrivilegeDo) Session(config *gorm.Session) IAdminPrivilegeDo { + return a.withDO(a.DO.Session(config)) +} + +func (a adminPrivilegeDo) Clauses(conds ...clause.Expression) IAdminPrivilegeDo { + return a.withDO(a.DO.Clauses(conds...)) +} + +func (a adminPrivilegeDo) Returning(value interface{}, columns ...string) IAdminPrivilegeDo { + return a.withDO(a.DO.Returning(value, columns...)) +} + +func (a adminPrivilegeDo) Not(conds ...gen.Condition) IAdminPrivilegeDo { + return a.withDO(a.DO.Not(conds...)) +} + +func (a adminPrivilegeDo) Or(conds ...gen.Condition) IAdminPrivilegeDo { + return a.withDO(a.DO.Or(conds...)) +} + +func (a adminPrivilegeDo) Select(conds ...field.Expr) IAdminPrivilegeDo { + return a.withDO(a.DO.Select(conds...)) +} + +func (a adminPrivilegeDo) Where(conds ...gen.Condition) IAdminPrivilegeDo { + return a.withDO(a.DO.Where(conds...)) +} + +func (a adminPrivilegeDo) Order(conds ...field.Expr) IAdminPrivilegeDo { + return a.withDO(a.DO.Order(conds...)) +} + +func (a adminPrivilegeDo) Distinct(cols ...field.Expr) IAdminPrivilegeDo { + return a.withDO(a.DO.Distinct(cols...)) +} + +func (a adminPrivilegeDo) Omit(cols ...field.Expr) IAdminPrivilegeDo { + return a.withDO(a.DO.Omit(cols...)) +} + +func (a adminPrivilegeDo) Join(table schema.Tabler, on ...field.Expr) IAdminPrivilegeDo { + return a.withDO(a.DO.Join(table, on...)) +} + +func (a adminPrivilegeDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAdminPrivilegeDo { + return a.withDO(a.DO.LeftJoin(table, on...)) +} + +func (a adminPrivilegeDo) RightJoin(table schema.Tabler, on ...field.Expr) IAdminPrivilegeDo { + return a.withDO(a.DO.RightJoin(table, on...)) +} + +func (a adminPrivilegeDo) Group(cols ...field.Expr) IAdminPrivilegeDo { + return a.withDO(a.DO.Group(cols...)) +} + +func (a adminPrivilegeDo) Having(conds ...gen.Condition) IAdminPrivilegeDo { + return a.withDO(a.DO.Having(conds...)) +} + +func (a adminPrivilegeDo) Limit(limit int) IAdminPrivilegeDo { + return a.withDO(a.DO.Limit(limit)) +} + +func (a adminPrivilegeDo) Offset(offset int) IAdminPrivilegeDo { + return a.withDO(a.DO.Offset(offset)) +} + +func (a adminPrivilegeDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminPrivilegeDo { + return a.withDO(a.DO.Scopes(funcs...)) +} + +func (a adminPrivilegeDo) Unscoped() IAdminPrivilegeDo { + return a.withDO(a.DO.Unscoped()) +} + +func (a adminPrivilegeDo) Create(values ...*model.AdminPrivilege) error { + if len(values) == 0 { + return nil + } + return a.DO.Create(values) +} + +func (a adminPrivilegeDo) CreateInBatches(values []*model.AdminPrivilege, batchSize int) error { + return a.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (a adminPrivilegeDo) Save(values ...*model.AdminPrivilege) error { + if len(values) == 0 { + return nil + } + return a.DO.Save(values) +} + +func (a adminPrivilegeDo) First() (*model.AdminPrivilege, error) { + if result, err := a.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.AdminPrivilege), nil + } +} + +func (a adminPrivilegeDo) Take() (*model.AdminPrivilege, error) { + if result, err := a.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.AdminPrivilege), nil + } +} + +func (a adminPrivilegeDo) Last() (*model.AdminPrivilege, error) { + if result, err := a.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.AdminPrivilege), nil + } +} + +func (a adminPrivilegeDo) Find() ([]*model.AdminPrivilege, error) { + result, err := a.DO.Find() + return result.([]*model.AdminPrivilege), err +} + +func (a adminPrivilegeDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminPrivilege, err error) { + buf := make([]*model.AdminPrivilege, 0, batchSize) + err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (a adminPrivilegeDo) FindInBatches(result *[]*model.AdminPrivilege, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return a.DO.FindInBatches(result, batchSize, fc) +} + +func (a adminPrivilegeDo) Attrs(attrs ...field.AssignExpr) IAdminPrivilegeDo { + return a.withDO(a.DO.Attrs(attrs...)) +} + +func (a adminPrivilegeDo) Assign(attrs ...field.AssignExpr) IAdminPrivilegeDo { + return a.withDO(a.DO.Assign(attrs...)) +} + +func (a adminPrivilegeDo) Joins(fields ...field.RelationField) IAdminPrivilegeDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Joins(_f)) + } + return &a +} + +func (a adminPrivilegeDo) Preload(fields ...field.RelationField) IAdminPrivilegeDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Preload(_f)) + } + return &a +} + +func (a adminPrivilegeDo) FirstOrInit() (*model.AdminPrivilege, error) { + if result, err := a.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.AdminPrivilege), nil + } +} + +func (a adminPrivilegeDo) FirstOrCreate() (*model.AdminPrivilege, error) { + if result, err := a.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.AdminPrivilege), nil + } +} + +func (a adminPrivilegeDo) FindByPage(offset int, limit int) (result []*model.AdminPrivilege, count int64, err error) { + result, err = a.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = a.Offset(-1).Limit(-1).Count() + return +} + +func (a adminPrivilegeDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = a.Count() + if err != nil { + return + } + + err = a.Offset(offset).Limit(limit).Scan(result) + return +} + +func (a adminPrivilegeDo) Scan(result interface{}) (err error) { + return a.DO.Scan(result) +} + +func (a adminPrivilegeDo) Delete(models ...*model.AdminPrivilege) (result gen.ResultInfo, err error) { + return a.DO.Delete(models) +} + +func (a *adminPrivilegeDo) withDO(do gen.Dao) *adminPrivilegeDo { + a.DO = *do.(*gen.DO) + return a +} diff --git a/pkg/repo/admin_role.gen.go b/pkg/repo/admin_role.gen.go new file mode 100644 index 0000000..85353db --- /dev/null +++ b/pkg/repo/admin_role.gen.go @@ -0,0 +1,431 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newAdminRole(db *gorm.DB, opts ...gen.DOOption) adminRole { + _adminRole := adminRole{} + + _adminRole.adminRoleDo.UseDB(db, opts...) + _adminRole.adminRoleDo.UseModel(&model.AdminRole{}) + + tableName := _adminRole.adminRoleDo.TableName() + _adminRole.ALL = field.NewAsterisk(tableName) + _adminRole.ID = field.NewString(tableName, "id") + _adminRole.TenantID = field.NewString(tableName, "tenant_id") + _adminRole.ScopeID = field.NewString(tableName, "scope_id") + _adminRole.Code = field.NewString(tableName, "code") + _adminRole.Name = field.NewString(tableName, "name") + _adminRole.Desc = field.NewString(tableName, "desc") + _adminRole.DeleteAt = field.NewField(tableName, "delete_at") + _adminRole.CreateAt = field.NewTime(tableName, "create_at") + _adminRole.CreateBy = field.NewString(tableName, "create_by") + _adminRole.UpdateAt = field.NewTime(tableName, "update_at") + _adminRole.UpdateBy = field.NewString(tableName, "update_by") + + _adminRole.fillFieldMap() + + return _adminRole +} + +// adminRole 租户-角色表 +type adminRole struct { + adminRoleDo adminRoleDo + + ALL field.Asterisk + ID field.String // 业务ID + TenantID field.String // 企业ID + ScopeID field.String // 角色范围 + Code field.String // 代码 + Name field.String + Desc field.String // 描述 + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (a adminRole) Table(newTableName string) *adminRole { + a.adminRoleDo.UseTable(newTableName) + return a.updateTableName(newTableName) +} + +func (a adminRole) As(alias string) *adminRole { + a.adminRoleDo.DO = *(a.adminRoleDo.As(alias).(*gen.DO)) + return a.updateTableName(alias) +} + +func (a *adminRole) updateTableName(table string) *adminRole { + a.ALL = field.NewAsterisk(table) + a.ID = field.NewString(table, "id") + a.TenantID = field.NewString(table, "tenant_id") + a.ScopeID = field.NewString(table, "scope_id") + a.Code = field.NewString(table, "code") + a.Name = field.NewString(table, "name") + a.Desc = field.NewString(table, "desc") + a.DeleteAt = field.NewField(table, "delete_at") + a.CreateAt = field.NewTime(table, "create_at") + a.CreateBy = field.NewString(table, "create_by") + a.UpdateAt = field.NewTime(table, "update_at") + a.UpdateBy = field.NewString(table, "update_by") + + a.fillFieldMap() + + return a +} + +func (a *adminRole) WithContext(ctx context.Context) IAdminRoleDo { + return a.adminRoleDo.WithContext(ctx) +} + +func (a adminRole) TableName() string { return a.adminRoleDo.TableName() } + +func (a adminRole) Alias() string { return a.adminRoleDo.Alias() } + +func (a adminRole) Columns(cols ...field.Expr) gen.Columns { return a.adminRoleDo.Columns(cols...) } + +func (a *adminRole) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := a.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (a *adminRole) fillFieldMap() { + a.fieldMap = make(map[string]field.Expr, 11) + a.fieldMap["id"] = a.ID + a.fieldMap["tenant_id"] = a.TenantID + a.fieldMap["scope_id"] = a.ScopeID + a.fieldMap["code"] = a.Code + a.fieldMap["name"] = a.Name + a.fieldMap["desc"] = a.Desc + a.fieldMap["delete_at"] = a.DeleteAt + a.fieldMap["create_at"] = a.CreateAt + a.fieldMap["create_by"] = a.CreateBy + a.fieldMap["update_at"] = a.UpdateAt + a.fieldMap["update_by"] = a.UpdateBy +} + +func (a adminRole) clone(db *gorm.DB) adminRole { + a.adminRoleDo.ReplaceConnPool(db.Statement.ConnPool) + return a +} + +func (a adminRole) replaceDB(db *gorm.DB) adminRole { + a.adminRoleDo.ReplaceDB(db) + return a +} + +type adminRoleDo struct{ gen.DO } + +type IAdminRoleDo interface { + gen.SubQuery + Debug() IAdminRoleDo + WithContext(ctx context.Context) IAdminRoleDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IAdminRoleDo + WriteDB() IAdminRoleDo + As(alias string) gen.Dao + Session(config *gorm.Session) IAdminRoleDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IAdminRoleDo + Not(conds ...gen.Condition) IAdminRoleDo + Or(conds ...gen.Condition) IAdminRoleDo + Select(conds ...field.Expr) IAdminRoleDo + Where(conds ...gen.Condition) IAdminRoleDo + Order(conds ...field.Expr) IAdminRoleDo + Distinct(cols ...field.Expr) IAdminRoleDo + Omit(cols ...field.Expr) IAdminRoleDo + Join(table schema.Tabler, on ...field.Expr) IAdminRoleDo + LeftJoin(table schema.Tabler, on ...field.Expr) IAdminRoleDo + RightJoin(table schema.Tabler, on ...field.Expr) IAdminRoleDo + Group(cols ...field.Expr) IAdminRoleDo + Having(conds ...gen.Condition) IAdminRoleDo + Limit(limit int) IAdminRoleDo + Offset(offset int) IAdminRoleDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminRoleDo + Unscoped() IAdminRoleDo + Create(values ...*model.AdminRole) error + CreateInBatches(values []*model.AdminRole, batchSize int) error + Save(values ...*model.AdminRole) error + First() (*model.AdminRole, error) + Take() (*model.AdminRole, error) + Last() (*model.AdminRole, error) + Find() ([]*model.AdminRole, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminRole, err error) + FindInBatches(result *[]*model.AdminRole, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.AdminRole) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IAdminRoleDo + Assign(attrs ...field.AssignExpr) IAdminRoleDo + Joins(fields ...field.RelationField) IAdminRoleDo + Preload(fields ...field.RelationField) IAdminRoleDo + FirstOrInit() (*model.AdminRole, error) + FirstOrCreate() (*model.AdminRole, error) + FindByPage(offset int, limit int) (result []*model.AdminRole, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IAdminRoleDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (a adminRoleDo) Debug() IAdminRoleDo { + return a.withDO(a.DO.Debug()) +} + +func (a adminRoleDo) WithContext(ctx context.Context) IAdminRoleDo { + return a.withDO(a.DO.WithContext(ctx)) +} + +func (a adminRoleDo) ReadDB() IAdminRoleDo { + return a.Clauses(dbresolver.Read) +} + +func (a adminRoleDo) WriteDB() IAdminRoleDo { + return a.Clauses(dbresolver.Write) +} + +func (a adminRoleDo) Session(config *gorm.Session) IAdminRoleDo { + return a.withDO(a.DO.Session(config)) +} + +func (a adminRoleDo) Clauses(conds ...clause.Expression) IAdminRoleDo { + return a.withDO(a.DO.Clauses(conds...)) +} + +func (a adminRoleDo) Returning(value interface{}, columns ...string) IAdminRoleDo { + return a.withDO(a.DO.Returning(value, columns...)) +} + +func (a adminRoleDo) Not(conds ...gen.Condition) IAdminRoleDo { + return a.withDO(a.DO.Not(conds...)) +} + +func (a adminRoleDo) Or(conds ...gen.Condition) IAdminRoleDo { + return a.withDO(a.DO.Or(conds...)) +} + +func (a adminRoleDo) Select(conds ...field.Expr) IAdminRoleDo { + return a.withDO(a.DO.Select(conds...)) +} + +func (a adminRoleDo) Where(conds ...gen.Condition) IAdminRoleDo { + return a.withDO(a.DO.Where(conds...)) +} + +func (a adminRoleDo) Order(conds ...field.Expr) IAdminRoleDo { + return a.withDO(a.DO.Order(conds...)) +} + +func (a adminRoleDo) Distinct(cols ...field.Expr) IAdminRoleDo { + return a.withDO(a.DO.Distinct(cols...)) +} + +func (a adminRoleDo) Omit(cols ...field.Expr) IAdminRoleDo { + return a.withDO(a.DO.Omit(cols...)) +} + +func (a adminRoleDo) Join(table schema.Tabler, on ...field.Expr) IAdminRoleDo { + return a.withDO(a.DO.Join(table, on...)) +} + +func (a adminRoleDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAdminRoleDo { + return a.withDO(a.DO.LeftJoin(table, on...)) +} + +func (a adminRoleDo) RightJoin(table schema.Tabler, on ...field.Expr) IAdminRoleDo { + return a.withDO(a.DO.RightJoin(table, on...)) +} + +func (a adminRoleDo) Group(cols ...field.Expr) IAdminRoleDo { + return a.withDO(a.DO.Group(cols...)) +} + +func (a adminRoleDo) Having(conds ...gen.Condition) IAdminRoleDo { + return a.withDO(a.DO.Having(conds...)) +} + +func (a adminRoleDo) Limit(limit int) IAdminRoleDo { + return a.withDO(a.DO.Limit(limit)) +} + +func (a adminRoleDo) Offset(offset int) IAdminRoleDo { + return a.withDO(a.DO.Offset(offset)) +} + +func (a adminRoleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminRoleDo { + return a.withDO(a.DO.Scopes(funcs...)) +} + +func (a adminRoleDo) Unscoped() IAdminRoleDo { + return a.withDO(a.DO.Unscoped()) +} + +func (a adminRoleDo) Create(values ...*model.AdminRole) error { + if len(values) == 0 { + return nil + } + return a.DO.Create(values) +} + +func (a adminRoleDo) CreateInBatches(values []*model.AdminRole, batchSize int) error { + return a.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (a adminRoleDo) Save(values ...*model.AdminRole) error { + if len(values) == 0 { + return nil + } + return a.DO.Save(values) +} + +func (a adminRoleDo) First() (*model.AdminRole, error) { + if result, err := a.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.AdminRole), nil + } +} + +func (a adminRoleDo) Take() (*model.AdminRole, error) { + if result, err := a.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.AdminRole), nil + } +} + +func (a adminRoleDo) Last() (*model.AdminRole, error) { + if result, err := a.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.AdminRole), nil + } +} + +func (a adminRoleDo) Find() ([]*model.AdminRole, error) { + result, err := a.DO.Find() + return result.([]*model.AdminRole), err +} + +func (a adminRoleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminRole, err error) { + buf := make([]*model.AdminRole, 0, batchSize) + err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (a adminRoleDo) FindInBatches(result *[]*model.AdminRole, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return a.DO.FindInBatches(result, batchSize, fc) +} + +func (a adminRoleDo) Attrs(attrs ...field.AssignExpr) IAdminRoleDo { + return a.withDO(a.DO.Attrs(attrs...)) +} + +func (a adminRoleDo) Assign(attrs ...field.AssignExpr) IAdminRoleDo { + return a.withDO(a.DO.Assign(attrs...)) +} + +func (a adminRoleDo) Joins(fields ...field.RelationField) IAdminRoleDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Joins(_f)) + } + return &a +} + +func (a adminRoleDo) Preload(fields ...field.RelationField) IAdminRoleDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Preload(_f)) + } + return &a +} + +func (a adminRoleDo) FirstOrInit() (*model.AdminRole, error) { + if result, err := a.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.AdminRole), nil + } +} + +func (a adminRoleDo) FirstOrCreate() (*model.AdminRole, error) { + if result, err := a.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.AdminRole), nil + } +} + +func (a adminRoleDo) FindByPage(offset int, limit int) (result []*model.AdminRole, count int64, err error) { + result, err = a.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = a.Offset(-1).Limit(-1).Count() + return +} + +func (a adminRoleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = a.Count() + if err != nil { + return + } + + err = a.Offset(offset).Limit(limit).Scan(result) + return +} + +func (a adminRoleDo) Scan(result interface{}) (err error) { + return a.DO.Scan(result) +} + +func (a adminRoleDo) Delete(models ...*model.AdminRole) (result gen.ResultInfo, err error) { + return a.DO.Delete(models) +} + +func (a *adminRoleDo) withDO(do gen.Dao) *adminRoleDo { + a.DO = *do.(*gen.DO) + return a +} diff --git a/pkg/repo/admin_role_privilege.gen.go b/pkg/repo/admin_role_privilege.gen.go new file mode 100644 index 0000000..b0dd672 --- /dev/null +++ b/pkg/repo/admin_role_privilege.gen.go @@ -0,0 +1,429 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newAdminRolePrivilege(db *gorm.DB, opts ...gen.DOOption) adminRolePrivilege { + _adminRolePrivilege := adminRolePrivilege{} + + _adminRolePrivilege.adminRolePrivilegeDo.UseDB(db, opts...) + _adminRolePrivilege.adminRolePrivilegeDo.UseModel(&model.AdminRolePrivilege{}) + + tableName := _adminRolePrivilege.adminRolePrivilegeDo.TableName() + _adminRolePrivilege.ALL = field.NewAsterisk(tableName) + _adminRolePrivilege.ID = field.NewString(tableName, "id") + _adminRolePrivilege.TenantID = field.NewString(tableName, "tenant_id") + _adminRolePrivilege.ScopeID = field.NewString(tableName, "scope_id") + _adminRolePrivilege.RoleID = field.NewString(tableName, "role_id") + _adminRolePrivilege.PrivilegeID = field.NewString(tableName, "privilege_id") + _adminRolePrivilege.DeleteAt = field.NewField(tableName, "delete_at") + _adminRolePrivilege.CreateAt = field.NewTime(tableName, "create_at") + _adminRolePrivilege.CreateBy = field.NewString(tableName, "create_by") + _adminRolePrivilege.UpdateAt = field.NewTime(tableName, "update_at") + _adminRolePrivilege.UpdateBy = field.NewString(tableName, "update_by") + + _adminRolePrivilege.fillFieldMap() + + return _adminRolePrivilege +} + +// adminRolePrivilege 租户角色-权限表 +type adminRolePrivilege struct { + adminRolePrivilegeDo adminRolePrivilegeDo + + ALL field.Asterisk + ID field.String // 业务ID + TenantID field.String // 企业ID + ScopeID field.String // 范围 + RoleID field.String // 角色ID + PrivilegeID field.String // 权限ID + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (a adminRolePrivilege) Table(newTableName string) *adminRolePrivilege { + a.adminRolePrivilegeDo.UseTable(newTableName) + return a.updateTableName(newTableName) +} + +func (a adminRolePrivilege) As(alias string) *adminRolePrivilege { + a.adminRolePrivilegeDo.DO = *(a.adminRolePrivilegeDo.As(alias).(*gen.DO)) + return a.updateTableName(alias) +} + +func (a *adminRolePrivilege) updateTableName(table string) *adminRolePrivilege { + a.ALL = field.NewAsterisk(table) + a.ID = field.NewString(table, "id") + a.TenantID = field.NewString(table, "tenant_id") + a.ScopeID = field.NewString(table, "scope_id") + a.RoleID = field.NewString(table, "role_id") + a.PrivilegeID = field.NewString(table, "privilege_id") + a.DeleteAt = field.NewField(table, "delete_at") + a.CreateAt = field.NewTime(table, "create_at") + a.CreateBy = field.NewString(table, "create_by") + a.UpdateAt = field.NewTime(table, "update_at") + a.UpdateBy = field.NewString(table, "update_by") + + a.fillFieldMap() + + return a +} + +func (a *adminRolePrivilege) WithContext(ctx context.Context) IAdminRolePrivilegeDo { + return a.adminRolePrivilegeDo.WithContext(ctx) +} + +func (a adminRolePrivilege) TableName() string { return a.adminRolePrivilegeDo.TableName() } + +func (a adminRolePrivilege) Alias() string { return a.adminRolePrivilegeDo.Alias() } + +func (a adminRolePrivilege) Columns(cols ...field.Expr) gen.Columns { + return a.adminRolePrivilegeDo.Columns(cols...) +} + +func (a *adminRolePrivilege) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := a.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (a *adminRolePrivilege) fillFieldMap() { + a.fieldMap = make(map[string]field.Expr, 10) + a.fieldMap["id"] = a.ID + a.fieldMap["tenant_id"] = a.TenantID + a.fieldMap["scope_id"] = a.ScopeID + a.fieldMap["role_id"] = a.RoleID + a.fieldMap["privilege_id"] = a.PrivilegeID + a.fieldMap["delete_at"] = a.DeleteAt + a.fieldMap["create_at"] = a.CreateAt + a.fieldMap["create_by"] = a.CreateBy + a.fieldMap["update_at"] = a.UpdateAt + a.fieldMap["update_by"] = a.UpdateBy +} + +func (a adminRolePrivilege) clone(db *gorm.DB) adminRolePrivilege { + a.adminRolePrivilegeDo.ReplaceConnPool(db.Statement.ConnPool) + return a +} + +func (a adminRolePrivilege) replaceDB(db *gorm.DB) adminRolePrivilege { + a.adminRolePrivilegeDo.ReplaceDB(db) + return a +} + +type adminRolePrivilegeDo struct{ gen.DO } + +type IAdminRolePrivilegeDo interface { + gen.SubQuery + Debug() IAdminRolePrivilegeDo + WithContext(ctx context.Context) IAdminRolePrivilegeDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IAdminRolePrivilegeDo + WriteDB() IAdminRolePrivilegeDo + As(alias string) gen.Dao + Session(config *gorm.Session) IAdminRolePrivilegeDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IAdminRolePrivilegeDo + Not(conds ...gen.Condition) IAdminRolePrivilegeDo + Or(conds ...gen.Condition) IAdminRolePrivilegeDo + Select(conds ...field.Expr) IAdminRolePrivilegeDo + Where(conds ...gen.Condition) IAdminRolePrivilegeDo + Order(conds ...field.Expr) IAdminRolePrivilegeDo + Distinct(cols ...field.Expr) IAdminRolePrivilegeDo + Omit(cols ...field.Expr) IAdminRolePrivilegeDo + Join(table schema.Tabler, on ...field.Expr) IAdminRolePrivilegeDo + LeftJoin(table schema.Tabler, on ...field.Expr) IAdminRolePrivilegeDo + RightJoin(table schema.Tabler, on ...field.Expr) IAdminRolePrivilegeDo + Group(cols ...field.Expr) IAdminRolePrivilegeDo + Having(conds ...gen.Condition) IAdminRolePrivilegeDo + Limit(limit int) IAdminRolePrivilegeDo + Offset(offset int) IAdminRolePrivilegeDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminRolePrivilegeDo + Unscoped() IAdminRolePrivilegeDo + Create(values ...*model.AdminRolePrivilege) error + CreateInBatches(values []*model.AdminRolePrivilege, batchSize int) error + Save(values ...*model.AdminRolePrivilege) error + First() (*model.AdminRolePrivilege, error) + Take() (*model.AdminRolePrivilege, error) + Last() (*model.AdminRolePrivilege, error) + Find() ([]*model.AdminRolePrivilege, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminRolePrivilege, err error) + FindInBatches(result *[]*model.AdminRolePrivilege, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.AdminRolePrivilege) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IAdminRolePrivilegeDo + Assign(attrs ...field.AssignExpr) IAdminRolePrivilegeDo + Joins(fields ...field.RelationField) IAdminRolePrivilegeDo + Preload(fields ...field.RelationField) IAdminRolePrivilegeDo + FirstOrInit() (*model.AdminRolePrivilege, error) + FirstOrCreate() (*model.AdminRolePrivilege, error) + FindByPage(offset int, limit int) (result []*model.AdminRolePrivilege, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IAdminRolePrivilegeDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (a adminRolePrivilegeDo) Debug() IAdminRolePrivilegeDo { + return a.withDO(a.DO.Debug()) +} + +func (a adminRolePrivilegeDo) WithContext(ctx context.Context) IAdminRolePrivilegeDo { + return a.withDO(a.DO.WithContext(ctx)) +} + +func (a adminRolePrivilegeDo) ReadDB() IAdminRolePrivilegeDo { + return a.Clauses(dbresolver.Read) +} + +func (a adminRolePrivilegeDo) WriteDB() IAdminRolePrivilegeDo { + return a.Clauses(dbresolver.Write) +} + +func (a adminRolePrivilegeDo) Session(config *gorm.Session) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Session(config)) +} + +func (a adminRolePrivilegeDo) Clauses(conds ...clause.Expression) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Clauses(conds...)) +} + +func (a adminRolePrivilegeDo) Returning(value interface{}, columns ...string) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Returning(value, columns...)) +} + +func (a adminRolePrivilegeDo) Not(conds ...gen.Condition) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Not(conds...)) +} + +func (a adminRolePrivilegeDo) Or(conds ...gen.Condition) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Or(conds...)) +} + +func (a adminRolePrivilegeDo) Select(conds ...field.Expr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Select(conds...)) +} + +func (a adminRolePrivilegeDo) Where(conds ...gen.Condition) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Where(conds...)) +} + +func (a adminRolePrivilegeDo) Order(conds ...field.Expr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Order(conds...)) +} + +func (a adminRolePrivilegeDo) Distinct(cols ...field.Expr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Distinct(cols...)) +} + +func (a adminRolePrivilegeDo) Omit(cols ...field.Expr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Omit(cols...)) +} + +func (a adminRolePrivilegeDo) Join(table schema.Tabler, on ...field.Expr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Join(table, on...)) +} + +func (a adminRolePrivilegeDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.LeftJoin(table, on...)) +} + +func (a adminRolePrivilegeDo) RightJoin(table schema.Tabler, on ...field.Expr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.RightJoin(table, on...)) +} + +func (a adminRolePrivilegeDo) Group(cols ...field.Expr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Group(cols...)) +} + +func (a adminRolePrivilegeDo) Having(conds ...gen.Condition) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Having(conds...)) +} + +func (a adminRolePrivilegeDo) Limit(limit int) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Limit(limit)) +} + +func (a adminRolePrivilegeDo) Offset(offset int) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Offset(offset)) +} + +func (a adminRolePrivilegeDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Scopes(funcs...)) +} + +func (a adminRolePrivilegeDo) Unscoped() IAdminRolePrivilegeDo { + return a.withDO(a.DO.Unscoped()) +} + +func (a adminRolePrivilegeDo) Create(values ...*model.AdminRolePrivilege) error { + if len(values) == 0 { + return nil + } + return a.DO.Create(values) +} + +func (a adminRolePrivilegeDo) CreateInBatches(values []*model.AdminRolePrivilege, batchSize int) error { + return a.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (a adminRolePrivilegeDo) Save(values ...*model.AdminRolePrivilege) error { + if len(values) == 0 { + return nil + } + return a.DO.Save(values) +} + +func (a adminRolePrivilegeDo) First() (*model.AdminRolePrivilege, error) { + if result, err := a.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.AdminRolePrivilege), nil + } +} + +func (a adminRolePrivilegeDo) Take() (*model.AdminRolePrivilege, error) { + if result, err := a.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.AdminRolePrivilege), nil + } +} + +func (a adminRolePrivilegeDo) Last() (*model.AdminRolePrivilege, error) { + if result, err := a.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.AdminRolePrivilege), nil + } +} + +func (a adminRolePrivilegeDo) Find() ([]*model.AdminRolePrivilege, error) { + result, err := a.DO.Find() + return result.([]*model.AdminRolePrivilege), err +} + +func (a adminRolePrivilegeDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminRolePrivilege, err error) { + buf := make([]*model.AdminRolePrivilege, 0, batchSize) + err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (a adminRolePrivilegeDo) FindInBatches(result *[]*model.AdminRolePrivilege, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return a.DO.FindInBatches(result, batchSize, fc) +} + +func (a adminRolePrivilegeDo) Attrs(attrs ...field.AssignExpr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Attrs(attrs...)) +} + +func (a adminRolePrivilegeDo) Assign(attrs ...field.AssignExpr) IAdminRolePrivilegeDo { + return a.withDO(a.DO.Assign(attrs...)) +} + +func (a adminRolePrivilegeDo) Joins(fields ...field.RelationField) IAdminRolePrivilegeDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Joins(_f)) + } + return &a +} + +func (a adminRolePrivilegeDo) Preload(fields ...field.RelationField) IAdminRolePrivilegeDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Preload(_f)) + } + return &a +} + +func (a adminRolePrivilegeDo) FirstOrInit() (*model.AdminRolePrivilege, error) { + if result, err := a.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.AdminRolePrivilege), nil + } +} + +func (a adminRolePrivilegeDo) FirstOrCreate() (*model.AdminRolePrivilege, error) { + if result, err := a.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.AdminRolePrivilege), nil + } +} + +func (a adminRolePrivilegeDo) FindByPage(offset int, limit int) (result []*model.AdminRolePrivilege, count int64, err error) { + result, err = a.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = a.Offset(-1).Limit(-1).Count() + return +} + +func (a adminRolePrivilegeDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = a.Count() + if err != nil { + return + } + + err = a.Offset(offset).Limit(limit).Scan(result) + return +} + +func (a adminRolePrivilegeDo) Scan(result interface{}) (err error) { + return a.DO.Scan(result) +} + +func (a adminRolePrivilegeDo) Delete(models ...*model.AdminRolePrivilege) (result gen.ResultInfo, err error) { + return a.DO.Delete(models) +} + +func (a *adminRolePrivilegeDo) withDO(do gen.Dao) *adminRolePrivilegeDo { + a.DO = *do.(*gen.DO) + return a +} diff --git a/pkg/repo/admin_user.gen.go b/pkg/repo/admin_user.gen.go new file mode 100644 index 0000000..8b7b6a6 --- /dev/null +++ b/pkg/repo/admin_user.gen.go @@ -0,0 +1,455 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newAdminUser(db *gorm.DB, opts ...gen.DOOption) adminUser { + _adminUser := adminUser{} + + _adminUser.adminUserDo.UseDB(db, opts...) + _adminUser.adminUserDo.UseModel(&model.AdminUser{}) + + tableName := _adminUser.adminUserDo.TableName() + _adminUser.ALL = field.NewAsterisk(tableName) + _adminUser.ID = field.NewString(tableName, "id") + _adminUser.TenantID = field.NewString(tableName, "tenant_id") + _adminUser.Username = field.NewString(tableName, "username") + _adminUser.Channel = field.NewString(tableName, "channel") + _adminUser.ChannelCode = field.NewString(tableName, "channel_code") + _adminUser.Nickname = field.NewString(tableName, "nickname") + _adminUser.Desc = field.NewString(tableName, "desc") + _adminUser.State = field.NewInt32(tableName, "state") + _adminUser.Password = field.NewString(tableName, "password") + _adminUser.PassCipher = field.NewString(tableName, "pass_cipher") + _adminUser.PassSalt = field.NewString(tableName, "pass_salt") + _adminUser.ExtID = field.NewString(tableName, "ext_id") + _adminUser.DeleteAt = field.NewField(tableName, "delete_at") + _adminUser.CreateAt = field.NewTime(tableName, "create_at") + _adminUser.CreateBy = field.NewString(tableName, "create_by") + _adminUser.UpdateAt = field.NewTime(tableName, "update_at") + _adminUser.UpdateBy = field.NewString(tableName, "update_by") + + _adminUser.fillFieldMap() + + return _adminUser +} + +// adminUser 用户表 +type adminUser struct { + adminUserDo adminUserDo + + ALL field.Asterisk + ID field.String // 业务ID + TenantID field.String // 企业ID + Username field.String // 用户名 + Channel field.String // 渠道:ADMIN=后台维护 LDAP=统一管理获取 REGISTER=注册 + ChannelCode field.String + Nickname field.String // 昵称 + Desc field.String + State field.Int32 // 1=启用 2=禁用 + Password field.String // 密码 + PassCipher field.String // 加密方式 + PassSalt field.String // 密码盐 + ExtID field.String // 外部ID + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (a adminUser) Table(newTableName string) *adminUser { + a.adminUserDo.UseTable(newTableName) + return a.updateTableName(newTableName) +} + +func (a adminUser) As(alias string) *adminUser { + a.adminUserDo.DO = *(a.adminUserDo.As(alias).(*gen.DO)) + return a.updateTableName(alias) +} + +func (a *adminUser) updateTableName(table string) *adminUser { + a.ALL = field.NewAsterisk(table) + a.ID = field.NewString(table, "id") + a.TenantID = field.NewString(table, "tenant_id") + a.Username = field.NewString(table, "username") + a.Channel = field.NewString(table, "channel") + a.ChannelCode = field.NewString(table, "channel_code") + a.Nickname = field.NewString(table, "nickname") + a.Desc = field.NewString(table, "desc") + a.State = field.NewInt32(table, "state") + a.Password = field.NewString(table, "password") + a.PassCipher = field.NewString(table, "pass_cipher") + a.PassSalt = field.NewString(table, "pass_salt") + a.ExtID = field.NewString(table, "ext_id") + a.DeleteAt = field.NewField(table, "delete_at") + a.CreateAt = field.NewTime(table, "create_at") + a.CreateBy = field.NewString(table, "create_by") + a.UpdateAt = field.NewTime(table, "update_at") + a.UpdateBy = field.NewString(table, "update_by") + + a.fillFieldMap() + + return a +} + +func (a *adminUser) WithContext(ctx context.Context) IAdminUserDo { + return a.adminUserDo.WithContext(ctx) +} + +func (a adminUser) TableName() string { return a.adminUserDo.TableName() } + +func (a adminUser) Alias() string { return a.adminUserDo.Alias() } + +func (a adminUser) Columns(cols ...field.Expr) gen.Columns { return a.adminUserDo.Columns(cols...) } + +func (a *adminUser) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := a.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (a *adminUser) fillFieldMap() { + a.fieldMap = make(map[string]field.Expr, 17) + a.fieldMap["id"] = a.ID + a.fieldMap["tenant_id"] = a.TenantID + a.fieldMap["username"] = a.Username + a.fieldMap["channel"] = a.Channel + a.fieldMap["channel_code"] = a.ChannelCode + a.fieldMap["nickname"] = a.Nickname + a.fieldMap["desc"] = a.Desc + a.fieldMap["state"] = a.State + a.fieldMap["password"] = a.Password + a.fieldMap["pass_cipher"] = a.PassCipher + a.fieldMap["pass_salt"] = a.PassSalt + a.fieldMap["ext_id"] = a.ExtID + a.fieldMap["delete_at"] = a.DeleteAt + a.fieldMap["create_at"] = a.CreateAt + a.fieldMap["create_by"] = a.CreateBy + a.fieldMap["update_at"] = a.UpdateAt + a.fieldMap["update_by"] = a.UpdateBy +} + +func (a adminUser) clone(db *gorm.DB) adminUser { + a.adminUserDo.ReplaceConnPool(db.Statement.ConnPool) + return a +} + +func (a adminUser) replaceDB(db *gorm.DB) adminUser { + a.adminUserDo.ReplaceDB(db) + return a +} + +type adminUserDo struct{ gen.DO } + +type IAdminUserDo interface { + gen.SubQuery + Debug() IAdminUserDo + WithContext(ctx context.Context) IAdminUserDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IAdminUserDo + WriteDB() IAdminUserDo + As(alias string) gen.Dao + Session(config *gorm.Session) IAdminUserDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IAdminUserDo + Not(conds ...gen.Condition) IAdminUserDo + Or(conds ...gen.Condition) IAdminUserDo + Select(conds ...field.Expr) IAdminUserDo + Where(conds ...gen.Condition) IAdminUserDo + Order(conds ...field.Expr) IAdminUserDo + Distinct(cols ...field.Expr) IAdminUserDo + Omit(cols ...field.Expr) IAdminUserDo + Join(table schema.Tabler, on ...field.Expr) IAdminUserDo + LeftJoin(table schema.Tabler, on ...field.Expr) IAdminUserDo + RightJoin(table schema.Tabler, on ...field.Expr) IAdminUserDo + Group(cols ...field.Expr) IAdminUserDo + Having(conds ...gen.Condition) IAdminUserDo + Limit(limit int) IAdminUserDo + Offset(offset int) IAdminUserDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminUserDo + Unscoped() IAdminUserDo + Create(values ...*model.AdminUser) error + CreateInBatches(values []*model.AdminUser, batchSize int) error + Save(values ...*model.AdminUser) error + First() (*model.AdminUser, error) + Take() (*model.AdminUser, error) + Last() (*model.AdminUser, error) + Find() ([]*model.AdminUser, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminUser, err error) + FindInBatches(result *[]*model.AdminUser, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.AdminUser) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IAdminUserDo + Assign(attrs ...field.AssignExpr) IAdminUserDo + Joins(fields ...field.RelationField) IAdminUserDo + Preload(fields ...field.RelationField) IAdminUserDo + FirstOrInit() (*model.AdminUser, error) + FirstOrCreate() (*model.AdminUser, error) + FindByPage(offset int, limit int) (result []*model.AdminUser, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IAdminUserDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (a adminUserDo) Debug() IAdminUserDo { + return a.withDO(a.DO.Debug()) +} + +func (a adminUserDo) WithContext(ctx context.Context) IAdminUserDo { + return a.withDO(a.DO.WithContext(ctx)) +} + +func (a adminUserDo) ReadDB() IAdminUserDo { + return a.Clauses(dbresolver.Read) +} + +func (a adminUserDo) WriteDB() IAdminUserDo { + return a.Clauses(dbresolver.Write) +} + +func (a adminUserDo) Session(config *gorm.Session) IAdminUserDo { + return a.withDO(a.DO.Session(config)) +} + +func (a adminUserDo) Clauses(conds ...clause.Expression) IAdminUserDo { + return a.withDO(a.DO.Clauses(conds...)) +} + +func (a adminUserDo) Returning(value interface{}, columns ...string) IAdminUserDo { + return a.withDO(a.DO.Returning(value, columns...)) +} + +func (a adminUserDo) Not(conds ...gen.Condition) IAdminUserDo { + return a.withDO(a.DO.Not(conds...)) +} + +func (a adminUserDo) Or(conds ...gen.Condition) IAdminUserDo { + return a.withDO(a.DO.Or(conds...)) +} + +func (a adminUserDo) Select(conds ...field.Expr) IAdminUserDo { + return a.withDO(a.DO.Select(conds...)) +} + +func (a adminUserDo) Where(conds ...gen.Condition) IAdminUserDo { + return a.withDO(a.DO.Where(conds...)) +} + +func (a adminUserDo) Order(conds ...field.Expr) IAdminUserDo { + return a.withDO(a.DO.Order(conds...)) +} + +func (a adminUserDo) Distinct(cols ...field.Expr) IAdminUserDo { + return a.withDO(a.DO.Distinct(cols...)) +} + +func (a adminUserDo) Omit(cols ...field.Expr) IAdminUserDo { + return a.withDO(a.DO.Omit(cols...)) +} + +func (a adminUserDo) Join(table schema.Tabler, on ...field.Expr) IAdminUserDo { + return a.withDO(a.DO.Join(table, on...)) +} + +func (a adminUserDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAdminUserDo { + return a.withDO(a.DO.LeftJoin(table, on...)) +} + +func (a adminUserDo) RightJoin(table schema.Tabler, on ...field.Expr) IAdminUserDo { + return a.withDO(a.DO.RightJoin(table, on...)) +} + +func (a adminUserDo) Group(cols ...field.Expr) IAdminUserDo { + return a.withDO(a.DO.Group(cols...)) +} + +func (a adminUserDo) Having(conds ...gen.Condition) IAdminUserDo { + return a.withDO(a.DO.Having(conds...)) +} + +func (a adminUserDo) Limit(limit int) IAdminUserDo { + return a.withDO(a.DO.Limit(limit)) +} + +func (a adminUserDo) Offset(offset int) IAdminUserDo { + return a.withDO(a.DO.Offset(offset)) +} + +func (a adminUserDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminUserDo { + return a.withDO(a.DO.Scopes(funcs...)) +} + +func (a adminUserDo) Unscoped() IAdminUserDo { + return a.withDO(a.DO.Unscoped()) +} + +func (a adminUserDo) Create(values ...*model.AdminUser) error { + if len(values) == 0 { + return nil + } + return a.DO.Create(values) +} + +func (a adminUserDo) CreateInBatches(values []*model.AdminUser, batchSize int) error { + return a.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (a adminUserDo) Save(values ...*model.AdminUser) error { + if len(values) == 0 { + return nil + } + return a.DO.Save(values) +} + +func (a adminUserDo) First() (*model.AdminUser, error) { + if result, err := a.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.AdminUser), nil + } +} + +func (a adminUserDo) Take() (*model.AdminUser, error) { + if result, err := a.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.AdminUser), nil + } +} + +func (a adminUserDo) Last() (*model.AdminUser, error) { + if result, err := a.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.AdminUser), nil + } +} + +func (a adminUserDo) Find() ([]*model.AdminUser, error) { + result, err := a.DO.Find() + return result.([]*model.AdminUser), err +} + +func (a adminUserDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminUser, err error) { + buf := make([]*model.AdminUser, 0, batchSize) + err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (a adminUserDo) FindInBatches(result *[]*model.AdminUser, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return a.DO.FindInBatches(result, batchSize, fc) +} + +func (a adminUserDo) Attrs(attrs ...field.AssignExpr) IAdminUserDo { + return a.withDO(a.DO.Attrs(attrs...)) +} + +func (a adminUserDo) Assign(attrs ...field.AssignExpr) IAdminUserDo { + return a.withDO(a.DO.Assign(attrs...)) +} + +func (a adminUserDo) Joins(fields ...field.RelationField) IAdminUserDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Joins(_f)) + } + return &a +} + +func (a adminUserDo) Preload(fields ...field.RelationField) IAdminUserDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Preload(_f)) + } + return &a +} + +func (a adminUserDo) FirstOrInit() (*model.AdminUser, error) { + if result, err := a.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.AdminUser), nil + } +} + +func (a adminUserDo) FirstOrCreate() (*model.AdminUser, error) { + if result, err := a.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.AdminUser), nil + } +} + +func (a adminUserDo) FindByPage(offset int, limit int) (result []*model.AdminUser, count int64, err error) { + result, err = a.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = a.Offset(-1).Limit(-1).Count() + return +} + +func (a adminUserDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = a.Count() + if err != nil { + return + } + + err = a.Offset(offset).Limit(limit).Scan(result) + return +} + +func (a adminUserDo) Scan(result interface{}) (err error) { + return a.DO.Scan(result) +} + +func (a adminUserDo) Delete(models ...*model.AdminUser) (result gen.ResultInfo, err error) { + return a.DO.Delete(models) +} + +func (a *adminUserDo) withDO(do gen.Dao) *adminUserDo { + a.DO = *do.(*gen.DO) + return a +} diff --git a/pkg/repo/admin_user_role.gen.go b/pkg/repo/admin_user_role.gen.go new file mode 100644 index 0000000..9a4557b --- /dev/null +++ b/pkg/repo/admin_user_role.gen.go @@ -0,0 +1,429 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newAdminUserRole(db *gorm.DB, opts ...gen.DOOption) adminUserRole { + _adminUserRole := adminUserRole{} + + _adminUserRole.adminUserRoleDo.UseDB(db, opts...) + _adminUserRole.adminUserRoleDo.UseModel(&model.AdminUserRole{}) + + tableName := _adminUserRole.adminUserRoleDo.TableName() + _adminUserRole.ALL = field.NewAsterisk(tableName) + _adminUserRole.ID = field.NewString(tableName, "id") + _adminUserRole.TenantID = field.NewString(tableName, "tenant_id") + _adminUserRole.ScopeID = field.NewString(tableName, "scope_id") + _adminUserRole.UserID = field.NewString(tableName, "user_id") + _adminUserRole.RoleID = field.NewString(tableName, "role_id") + _adminUserRole.DeleteAt = field.NewField(tableName, "delete_at") + _adminUserRole.CreateAt = field.NewTime(tableName, "create_at") + _adminUserRole.CreateBy = field.NewString(tableName, "create_by") + _adminUserRole.UpdateAt = field.NewTime(tableName, "update_at") + _adminUserRole.UpdateBy = field.NewString(tableName, "update_by") + + _adminUserRole.fillFieldMap() + + return _adminUserRole +} + +// adminUserRole 租户用户-角色表 +type adminUserRole struct { + adminUserRoleDo adminUserRoleDo + + ALL field.Asterisk + ID field.String // 业务ID + TenantID field.String // 企业ID + ScopeID field.String // 范围 + UserID field.String // 用户ID + RoleID field.String // 角色ID + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (a adminUserRole) Table(newTableName string) *adminUserRole { + a.adminUserRoleDo.UseTable(newTableName) + return a.updateTableName(newTableName) +} + +func (a adminUserRole) As(alias string) *adminUserRole { + a.adminUserRoleDo.DO = *(a.adminUserRoleDo.As(alias).(*gen.DO)) + return a.updateTableName(alias) +} + +func (a *adminUserRole) updateTableName(table string) *adminUserRole { + a.ALL = field.NewAsterisk(table) + a.ID = field.NewString(table, "id") + a.TenantID = field.NewString(table, "tenant_id") + a.ScopeID = field.NewString(table, "scope_id") + a.UserID = field.NewString(table, "user_id") + a.RoleID = field.NewString(table, "role_id") + a.DeleteAt = field.NewField(table, "delete_at") + a.CreateAt = field.NewTime(table, "create_at") + a.CreateBy = field.NewString(table, "create_by") + a.UpdateAt = field.NewTime(table, "update_at") + a.UpdateBy = field.NewString(table, "update_by") + + a.fillFieldMap() + + return a +} + +func (a *adminUserRole) WithContext(ctx context.Context) IAdminUserRoleDo { + return a.adminUserRoleDo.WithContext(ctx) +} + +func (a adminUserRole) TableName() string { return a.adminUserRoleDo.TableName() } + +func (a adminUserRole) Alias() string { return a.adminUserRoleDo.Alias() } + +func (a adminUserRole) Columns(cols ...field.Expr) gen.Columns { + return a.adminUserRoleDo.Columns(cols...) +} + +func (a *adminUserRole) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := a.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (a *adminUserRole) fillFieldMap() { + a.fieldMap = make(map[string]field.Expr, 10) + a.fieldMap["id"] = a.ID + a.fieldMap["tenant_id"] = a.TenantID + a.fieldMap["scope_id"] = a.ScopeID + a.fieldMap["user_id"] = a.UserID + a.fieldMap["role_id"] = a.RoleID + a.fieldMap["delete_at"] = a.DeleteAt + a.fieldMap["create_at"] = a.CreateAt + a.fieldMap["create_by"] = a.CreateBy + a.fieldMap["update_at"] = a.UpdateAt + a.fieldMap["update_by"] = a.UpdateBy +} + +func (a adminUserRole) clone(db *gorm.DB) adminUserRole { + a.adminUserRoleDo.ReplaceConnPool(db.Statement.ConnPool) + return a +} + +func (a adminUserRole) replaceDB(db *gorm.DB) adminUserRole { + a.adminUserRoleDo.ReplaceDB(db) + return a +} + +type adminUserRoleDo struct{ gen.DO } + +type IAdminUserRoleDo interface { + gen.SubQuery + Debug() IAdminUserRoleDo + WithContext(ctx context.Context) IAdminUserRoleDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IAdminUserRoleDo + WriteDB() IAdminUserRoleDo + As(alias string) gen.Dao + Session(config *gorm.Session) IAdminUserRoleDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IAdminUserRoleDo + Not(conds ...gen.Condition) IAdminUserRoleDo + Or(conds ...gen.Condition) IAdminUserRoleDo + Select(conds ...field.Expr) IAdminUserRoleDo + Where(conds ...gen.Condition) IAdminUserRoleDo + Order(conds ...field.Expr) IAdminUserRoleDo + Distinct(cols ...field.Expr) IAdminUserRoleDo + Omit(cols ...field.Expr) IAdminUserRoleDo + Join(table schema.Tabler, on ...field.Expr) IAdminUserRoleDo + LeftJoin(table schema.Tabler, on ...field.Expr) IAdminUserRoleDo + RightJoin(table schema.Tabler, on ...field.Expr) IAdminUserRoleDo + Group(cols ...field.Expr) IAdminUserRoleDo + Having(conds ...gen.Condition) IAdminUserRoleDo + Limit(limit int) IAdminUserRoleDo + Offset(offset int) IAdminUserRoleDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminUserRoleDo + Unscoped() IAdminUserRoleDo + Create(values ...*model.AdminUserRole) error + CreateInBatches(values []*model.AdminUserRole, batchSize int) error + Save(values ...*model.AdminUserRole) error + First() (*model.AdminUserRole, error) + Take() (*model.AdminUserRole, error) + Last() (*model.AdminUserRole, error) + Find() ([]*model.AdminUserRole, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminUserRole, err error) + FindInBatches(result *[]*model.AdminUserRole, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.AdminUserRole) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IAdminUserRoleDo + Assign(attrs ...field.AssignExpr) IAdminUserRoleDo + Joins(fields ...field.RelationField) IAdminUserRoleDo + Preload(fields ...field.RelationField) IAdminUserRoleDo + FirstOrInit() (*model.AdminUserRole, error) + FirstOrCreate() (*model.AdminUserRole, error) + FindByPage(offset int, limit int) (result []*model.AdminUserRole, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IAdminUserRoleDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (a adminUserRoleDo) Debug() IAdminUserRoleDo { + return a.withDO(a.DO.Debug()) +} + +func (a adminUserRoleDo) WithContext(ctx context.Context) IAdminUserRoleDo { + return a.withDO(a.DO.WithContext(ctx)) +} + +func (a adminUserRoleDo) ReadDB() IAdminUserRoleDo { + return a.Clauses(dbresolver.Read) +} + +func (a adminUserRoleDo) WriteDB() IAdminUserRoleDo { + return a.Clauses(dbresolver.Write) +} + +func (a adminUserRoleDo) Session(config *gorm.Session) IAdminUserRoleDo { + return a.withDO(a.DO.Session(config)) +} + +func (a adminUserRoleDo) Clauses(conds ...clause.Expression) IAdminUserRoleDo { + return a.withDO(a.DO.Clauses(conds...)) +} + +func (a adminUserRoleDo) Returning(value interface{}, columns ...string) IAdminUserRoleDo { + return a.withDO(a.DO.Returning(value, columns...)) +} + +func (a adminUserRoleDo) Not(conds ...gen.Condition) IAdminUserRoleDo { + return a.withDO(a.DO.Not(conds...)) +} + +func (a adminUserRoleDo) Or(conds ...gen.Condition) IAdminUserRoleDo { + return a.withDO(a.DO.Or(conds...)) +} + +func (a adminUserRoleDo) Select(conds ...field.Expr) IAdminUserRoleDo { + return a.withDO(a.DO.Select(conds...)) +} + +func (a adminUserRoleDo) Where(conds ...gen.Condition) IAdminUserRoleDo { + return a.withDO(a.DO.Where(conds...)) +} + +func (a adminUserRoleDo) Order(conds ...field.Expr) IAdminUserRoleDo { + return a.withDO(a.DO.Order(conds...)) +} + +func (a adminUserRoleDo) Distinct(cols ...field.Expr) IAdminUserRoleDo { + return a.withDO(a.DO.Distinct(cols...)) +} + +func (a adminUserRoleDo) Omit(cols ...field.Expr) IAdminUserRoleDo { + return a.withDO(a.DO.Omit(cols...)) +} + +func (a adminUserRoleDo) Join(table schema.Tabler, on ...field.Expr) IAdminUserRoleDo { + return a.withDO(a.DO.Join(table, on...)) +} + +func (a adminUserRoleDo) LeftJoin(table schema.Tabler, on ...field.Expr) IAdminUserRoleDo { + return a.withDO(a.DO.LeftJoin(table, on...)) +} + +func (a adminUserRoleDo) RightJoin(table schema.Tabler, on ...field.Expr) IAdminUserRoleDo { + return a.withDO(a.DO.RightJoin(table, on...)) +} + +func (a adminUserRoleDo) Group(cols ...field.Expr) IAdminUserRoleDo { + return a.withDO(a.DO.Group(cols...)) +} + +func (a adminUserRoleDo) Having(conds ...gen.Condition) IAdminUserRoleDo { + return a.withDO(a.DO.Having(conds...)) +} + +func (a adminUserRoleDo) Limit(limit int) IAdminUserRoleDo { + return a.withDO(a.DO.Limit(limit)) +} + +func (a adminUserRoleDo) Offset(offset int) IAdminUserRoleDo { + return a.withDO(a.DO.Offset(offset)) +} + +func (a adminUserRoleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IAdminUserRoleDo { + return a.withDO(a.DO.Scopes(funcs...)) +} + +func (a adminUserRoleDo) Unscoped() IAdminUserRoleDo { + return a.withDO(a.DO.Unscoped()) +} + +func (a adminUserRoleDo) Create(values ...*model.AdminUserRole) error { + if len(values) == 0 { + return nil + } + return a.DO.Create(values) +} + +func (a adminUserRoleDo) CreateInBatches(values []*model.AdminUserRole, batchSize int) error { + return a.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (a adminUserRoleDo) Save(values ...*model.AdminUserRole) error { + if len(values) == 0 { + return nil + } + return a.DO.Save(values) +} + +func (a adminUserRoleDo) First() (*model.AdminUserRole, error) { + if result, err := a.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.AdminUserRole), nil + } +} + +func (a adminUserRoleDo) Take() (*model.AdminUserRole, error) { + if result, err := a.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.AdminUserRole), nil + } +} + +func (a adminUserRoleDo) Last() (*model.AdminUserRole, error) { + if result, err := a.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.AdminUserRole), nil + } +} + +func (a adminUserRoleDo) Find() ([]*model.AdminUserRole, error) { + result, err := a.DO.Find() + return result.([]*model.AdminUserRole), err +} + +func (a adminUserRoleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.AdminUserRole, err error) { + buf := make([]*model.AdminUserRole, 0, batchSize) + err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (a adminUserRoleDo) FindInBatches(result *[]*model.AdminUserRole, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return a.DO.FindInBatches(result, batchSize, fc) +} + +func (a adminUserRoleDo) Attrs(attrs ...field.AssignExpr) IAdminUserRoleDo { + return a.withDO(a.DO.Attrs(attrs...)) +} + +func (a adminUserRoleDo) Assign(attrs ...field.AssignExpr) IAdminUserRoleDo { + return a.withDO(a.DO.Assign(attrs...)) +} + +func (a adminUserRoleDo) Joins(fields ...field.RelationField) IAdminUserRoleDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Joins(_f)) + } + return &a +} + +func (a adminUserRoleDo) Preload(fields ...field.RelationField) IAdminUserRoleDo { + for _, _f := range fields { + a = *a.withDO(a.DO.Preload(_f)) + } + return &a +} + +func (a adminUserRoleDo) FirstOrInit() (*model.AdminUserRole, error) { + if result, err := a.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.AdminUserRole), nil + } +} + +func (a adminUserRoleDo) FirstOrCreate() (*model.AdminUserRole, error) { + if result, err := a.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.AdminUserRole), nil + } +} + +func (a adminUserRoleDo) FindByPage(offset int, limit int) (result []*model.AdminUserRole, count int64, err error) { + result, err = a.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = a.Offset(-1).Limit(-1).Count() + return +} + +func (a adminUserRoleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = a.Count() + if err != nil { + return + } + + err = a.Offset(offset).Limit(limit).Scan(result) + return +} + +func (a adminUserRoleDo) Scan(result interface{}) (err error) { + return a.DO.Scan(result) +} + +func (a adminUserRoleDo) Delete(models ...*model.AdminUserRole) (result gen.ResultInfo, err error) { + return a.DO.Delete(models) +} + +func (a *adminUserRoleDo) withDO(do gen.Dao) *adminUserRoleDo { + a.DO = *do.(*gen.DO) + return a +} diff --git a/pkg/repo/data_attach.gen.go b/pkg/repo/data_attach.gen.go new file mode 100644 index 0000000..4dafe38 --- /dev/null +++ b/pkg/repo/data_attach.gen.go @@ -0,0 +1,471 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newDataAttach(db *gorm.DB, opts ...gen.DOOption) dataAttach { + _dataAttach := dataAttach{} + + _dataAttach.dataAttachDo.UseDB(db, opts...) + _dataAttach.dataAttachDo.UseModel(&model.DataAttach{}) + + tableName := _dataAttach.dataAttachDo.TableName() + _dataAttach.ALL = field.NewAsterisk(tableName) + _dataAttach.ID = field.NewString(tableName, "id") + _dataAttach.TenantID = field.NewString(tableName, "tenant_id") + _dataAttach.PartUploadID = field.NewString(tableName, "part_upload_id") + _dataAttach.TotalChunks = field.NewInt32(tableName, "total_chunks") + _dataAttach.PartSize = field.NewInt32(tableName, "part_size") + _dataAttach.Md5 = field.NewString(tableName, "md5") + _dataAttach.DataType = field.NewString(tableName, "data_type") + _dataAttach.DataID = field.NewString(tableName, "data_id") + _dataAttach.CommonType = field.NewString(tableName, "common_type") + _dataAttach.FileType = field.NewString(tableName, "file_type") + _dataAttach.FileSize = field.NewInt32(tableName, "file_size") + _dataAttach.FileName = field.NewString(tableName, "file_name") + _dataAttach.FilePath = field.NewString(tableName, "file_path") + _dataAttach.FileThumbPath = field.NewString(tableName, "file_thumb_path") + _dataAttach.FileThumbType = field.NewString(tableName, "file_thumb_type") + _dataAttach.UploadState = field.NewInt32(tableName, "upload_state") + _dataAttach.DeleteAt = field.NewField(tableName, "delete_at") + _dataAttach.CreateAt = field.NewTime(tableName, "create_at") + _dataAttach.CreateBy = field.NewString(tableName, "create_by") + _dataAttach.UpdateAt = field.NewTime(tableName, "update_at") + _dataAttach.UpdateBy = field.NewString(tableName, "update_by") + + _dataAttach.fillFieldMap() + + return _dataAttach +} + +// dataAttach 通用附件 +type dataAttach struct { + dataAttachDo dataAttachDo + + ALL field.Asterisk + ID field.String // 业务ID + TenantID field.String // 企业ID + PartUploadID field.String // 分片上传upload id + TotalChunks field.Int32 // 分片总数 + PartSize field.Int32 // 分片大小-单位M + Md5 field.String // 文件md5 + DataType field.String // 数据类型:SATELLITE=卫星图,其他请使用时完善定义 + DataID field.String // 数据ID + CommonType field.String // 通用类型:IMAGE = 图片(jfif、png、jpg等),DOC = 文档(excel、docs、ppt、pdf等),BINARY = 二进制文件(exe等) + FileType field.String // 文件类型 + FileSize field.Int32 // 文件大小 + FileName field.String // 文件名称 + FilePath field.String // 文件路径 + FileThumbPath field.String // 缩略文件路径 + FileThumbType field.String // 缩略图文件类型 + UploadState field.Int32 // 0未上传,1上传 + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (d dataAttach) Table(newTableName string) *dataAttach { + d.dataAttachDo.UseTable(newTableName) + return d.updateTableName(newTableName) +} + +func (d dataAttach) As(alias string) *dataAttach { + d.dataAttachDo.DO = *(d.dataAttachDo.As(alias).(*gen.DO)) + return d.updateTableName(alias) +} + +func (d *dataAttach) updateTableName(table string) *dataAttach { + d.ALL = field.NewAsterisk(table) + d.ID = field.NewString(table, "id") + d.TenantID = field.NewString(table, "tenant_id") + d.PartUploadID = field.NewString(table, "part_upload_id") + d.TotalChunks = field.NewInt32(table, "total_chunks") + d.PartSize = field.NewInt32(table, "part_size") + d.Md5 = field.NewString(table, "md5") + d.DataType = field.NewString(table, "data_type") + d.DataID = field.NewString(table, "data_id") + d.CommonType = field.NewString(table, "common_type") + d.FileType = field.NewString(table, "file_type") + d.FileSize = field.NewInt32(table, "file_size") + d.FileName = field.NewString(table, "file_name") + d.FilePath = field.NewString(table, "file_path") + d.FileThumbPath = field.NewString(table, "file_thumb_path") + d.FileThumbType = field.NewString(table, "file_thumb_type") + d.UploadState = field.NewInt32(table, "upload_state") + d.DeleteAt = field.NewField(table, "delete_at") + d.CreateAt = field.NewTime(table, "create_at") + d.CreateBy = field.NewString(table, "create_by") + d.UpdateAt = field.NewTime(table, "update_at") + d.UpdateBy = field.NewString(table, "update_by") + + d.fillFieldMap() + + return d +} + +func (d *dataAttach) WithContext(ctx context.Context) IDataAttachDo { + return d.dataAttachDo.WithContext(ctx) +} + +func (d dataAttach) TableName() string { return d.dataAttachDo.TableName() } + +func (d dataAttach) Alias() string { return d.dataAttachDo.Alias() } + +func (d dataAttach) Columns(cols ...field.Expr) gen.Columns { return d.dataAttachDo.Columns(cols...) } + +func (d *dataAttach) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := d.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (d *dataAttach) fillFieldMap() { + d.fieldMap = make(map[string]field.Expr, 21) + d.fieldMap["id"] = d.ID + d.fieldMap["tenant_id"] = d.TenantID + d.fieldMap["part_upload_id"] = d.PartUploadID + d.fieldMap["total_chunks"] = d.TotalChunks + d.fieldMap["part_size"] = d.PartSize + d.fieldMap["md5"] = d.Md5 + d.fieldMap["data_type"] = d.DataType + d.fieldMap["data_id"] = d.DataID + d.fieldMap["common_type"] = d.CommonType + d.fieldMap["file_type"] = d.FileType + d.fieldMap["file_size"] = d.FileSize + d.fieldMap["file_name"] = d.FileName + d.fieldMap["file_path"] = d.FilePath + d.fieldMap["file_thumb_path"] = d.FileThumbPath + d.fieldMap["file_thumb_type"] = d.FileThumbType + d.fieldMap["upload_state"] = d.UploadState + d.fieldMap["delete_at"] = d.DeleteAt + d.fieldMap["create_at"] = d.CreateAt + d.fieldMap["create_by"] = d.CreateBy + d.fieldMap["update_at"] = d.UpdateAt + d.fieldMap["update_by"] = d.UpdateBy +} + +func (d dataAttach) clone(db *gorm.DB) dataAttach { + d.dataAttachDo.ReplaceConnPool(db.Statement.ConnPool) + return d +} + +func (d dataAttach) replaceDB(db *gorm.DB) dataAttach { + d.dataAttachDo.ReplaceDB(db) + return d +} + +type dataAttachDo struct{ gen.DO } + +type IDataAttachDo interface { + gen.SubQuery + Debug() IDataAttachDo + WithContext(ctx context.Context) IDataAttachDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IDataAttachDo + WriteDB() IDataAttachDo + As(alias string) gen.Dao + Session(config *gorm.Session) IDataAttachDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IDataAttachDo + Not(conds ...gen.Condition) IDataAttachDo + Or(conds ...gen.Condition) IDataAttachDo + Select(conds ...field.Expr) IDataAttachDo + Where(conds ...gen.Condition) IDataAttachDo + Order(conds ...field.Expr) IDataAttachDo + Distinct(cols ...field.Expr) IDataAttachDo + Omit(cols ...field.Expr) IDataAttachDo + Join(table schema.Tabler, on ...field.Expr) IDataAttachDo + LeftJoin(table schema.Tabler, on ...field.Expr) IDataAttachDo + RightJoin(table schema.Tabler, on ...field.Expr) IDataAttachDo + Group(cols ...field.Expr) IDataAttachDo + Having(conds ...gen.Condition) IDataAttachDo + Limit(limit int) IDataAttachDo + Offset(offset int) IDataAttachDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IDataAttachDo + Unscoped() IDataAttachDo + Create(values ...*model.DataAttach) error + CreateInBatches(values []*model.DataAttach, batchSize int) error + Save(values ...*model.DataAttach) error + First() (*model.DataAttach, error) + Take() (*model.DataAttach, error) + Last() (*model.DataAttach, error) + Find() ([]*model.DataAttach, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.DataAttach, err error) + FindInBatches(result *[]*model.DataAttach, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.DataAttach) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IDataAttachDo + Assign(attrs ...field.AssignExpr) IDataAttachDo + Joins(fields ...field.RelationField) IDataAttachDo + Preload(fields ...field.RelationField) IDataAttachDo + FirstOrInit() (*model.DataAttach, error) + FirstOrCreate() (*model.DataAttach, error) + FindByPage(offset int, limit int) (result []*model.DataAttach, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IDataAttachDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (d dataAttachDo) Debug() IDataAttachDo { + return d.withDO(d.DO.Debug()) +} + +func (d dataAttachDo) WithContext(ctx context.Context) IDataAttachDo { + return d.withDO(d.DO.WithContext(ctx)) +} + +func (d dataAttachDo) ReadDB() IDataAttachDo { + return d.Clauses(dbresolver.Read) +} + +func (d dataAttachDo) WriteDB() IDataAttachDo { + return d.Clauses(dbresolver.Write) +} + +func (d dataAttachDo) Session(config *gorm.Session) IDataAttachDo { + return d.withDO(d.DO.Session(config)) +} + +func (d dataAttachDo) Clauses(conds ...clause.Expression) IDataAttachDo { + return d.withDO(d.DO.Clauses(conds...)) +} + +func (d dataAttachDo) Returning(value interface{}, columns ...string) IDataAttachDo { + return d.withDO(d.DO.Returning(value, columns...)) +} + +func (d dataAttachDo) Not(conds ...gen.Condition) IDataAttachDo { + return d.withDO(d.DO.Not(conds...)) +} + +func (d dataAttachDo) Or(conds ...gen.Condition) IDataAttachDo { + return d.withDO(d.DO.Or(conds...)) +} + +func (d dataAttachDo) Select(conds ...field.Expr) IDataAttachDo { + return d.withDO(d.DO.Select(conds...)) +} + +func (d dataAttachDo) Where(conds ...gen.Condition) IDataAttachDo { + return d.withDO(d.DO.Where(conds...)) +} + +func (d dataAttachDo) Order(conds ...field.Expr) IDataAttachDo { + return d.withDO(d.DO.Order(conds...)) +} + +func (d dataAttachDo) Distinct(cols ...field.Expr) IDataAttachDo { + return d.withDO(d.DO.Distinct(cols...)) +} + +func (d dataAttachDo) Omit(cols ...field.Expr) IDataAttachDo { + return d.withDO(d.DO.Omit(cols...)) +} + +func (d dataAttachDo) Join(table schema.Tabler, on ...field.Expr) IDataAttachDo { + return d.withDO(d.DO.Join(table, on...)) +} + +func (d dataAttachDo) LeftJoin(table schema.Tabler, on ...field.Expr) IDataAttachDo { + return d.withDO(d.DO.LeftJoin(table, on...)) +} + +func (d dataAttachDo) RightJoin(table schema.Tabler, on ...field.Expr) IDataAttachDo { + return d.withDO(d.DO.RightJoin(table, on...)) +} + +func (d dataAttachDo) Group(cols ...field.Expr) IDataAttachDo { + return d.withDO(d.DO.Group(cols...)) +} + +func (d dataAttachDo) Having(conds ...gen.Condition) IDataAttachDo { + return d.withDO(d.DO.Having(conds...)) +} + +func (d dataAttachDo) Limit(limit int) IDataAttachDo { + return d.withDO(d.DO.Limit(limit)) +} + +func (d dataAttachDo) Offset(offset int) IDataAttachDo { + return d.withDO(d.DO.Offset(offset)) +} + +func (d dataAttachDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IDataAttachDo { + return d.withDO(d.DO.Scopes(funcs...)) +} + +func (d dataAttachDo) Unscoped() IDataAttachDo { + return d.withDO(d.DO.Unscoped()) +} + +func (d dataAttachDo) Create(values ...*model.DataAttach) error { + if len(values) == 0 { + return nil + } + return d.DO.Create(values) +} + +func (d dataAttachDo) CreateInBatches(values []*model.DataAttach, batchSize int) error { + return d.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (d dataAttachDo) Save(values ...*model.DataAttach) error { + if len(values) == 0 { + return nil + } + return d.DO.Save(values) +} + +func (d dataAttachDo) First() (*model.DataAttach, error) { + if result, err := d.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.DataAttach), nil + } +} + +func (d dataAttachDo) Take() (*model.DataAttach, error) { + if result, err := d.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.DataAttach), nil + } +} + +func (d dataAttachDo) Last() (*model.DataAttach, error) { + if result, err := d.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.DataAttach), nil + } +} + +func (d dataAttachDo) Find() ([]*model.DataAttach, error) { + result, err := d.DO.Find() + return result.([]*model.DataAttach), err +} + +func (d dataAttachDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.DataAttach, err error) { + buf := make([]*model.DataAttach, 0, batchSize) + err = d.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (d dataAttachDo) FindInBatches(result *[]*model.DataAttach, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return d.DO.FindInBatches(result, batchSize, fc) +} + +func (d dataAttachDo) Attrs(attrs ...field.AssignExpr) IDataAttachDo { + return d.withDO(d.DO.Attrs(attrs...)) +} + +func (d dataAttachDo) Assign(attrs ...field.AssignExpr) IDataAttachDo { + return d.withDO(d.DO.Assign(attrs...)) +} + +func (d dataAttachDo) Joins(fields ...field.RelationField) IDataAttachDo { + for _, _f := range fields { + d = *d.withDO(d.DO.Joins(_f)) + } + return &d +} + +func (d dataAttachDo) Preload(fields ...field.RelationField) IDataAttachDo { + for _, _f := range fields { + d = *d.withDO(d.DO.Preload(_f)) + } + return &d +} + +func (d dataAttachDo) FirstOrInit() (*model.DataAttach, error) { + if result, err := d.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.DataAttach), nil + } +} + +func (d dataAttachDo) FirstOrCreate() (*model.DataAttach, error) { + if result, err := d.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.DataAttach), nil + } +} + +func (d dataAttachDo) FindByPage(offset int, limit int) (result []*model.DataAttach, count int64, err error) { + result, err = d.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = d.Offset(-1).Limit(-1).Count() + return +} + +func (d dataAttachDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = d.Count() + if err != nil { + return + } + + err = d.Offset(offset).Limit(limit).Scan(result) + return +} + +func (d dataAttachDo) Scan(result interface{}) (err error) { + return d.DO.Scan(result) +} + +func (d dataAttachDo) Delete(models ...*model.DataAttach) (result gen.ResultInfo, err error) { + return d.DO.Delete(models) +} + +func (d *dataAttachDo) withDO(do gen.Dao) *dataAttachDo { + d.DO = *do.(*gen.DO) + return d +} diff --git a/pkg/repo/game.gen.go b/pkg/repo/game.gen.go new file mode 100644 index 0000000..f8667b7 --- /dev/null +++ b/pkg/repo/game.gen.go @@ -0,0 +1,433 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newGame(db *gorm.DB, opts ...gen.DOOption) game { + _game := game{} + + _game.gameDo.UseDB(db, opts...) + _game.gameDo.UseModel(&model.Game{}) + + tableName := _game.gameDo.TableName() + _game.ALL = field.NewAsterisk(tableName) + _game.ID = field.NewString(tableName, "id") + _game.Name = field.NewString(tableName, "name") + _game.Desc = field.NewString(tableName, "desc") + _game.Icon = field.NewString(tableName, "icon") + _game.Logo = field.NewString(tableName, "logo") + _game.Sort = field.NewInt32(tableName, "sort") + _game.State = field.NewInt32(tableName, "state") + _game.DeleteAt = field.NewField(tableName, "delete_at") + _game.CreateAt = field.NewTime(tableName, "create_at") + _game.CreateBy = field.NewString(tableName, "create_by") + _game.UpdateAt = field.NewTime(tableName, "update_at") + _game.UpdateBy = field.NewString(tableName, "update_by") + + _game.fillFieldMap() + + return _game +} + +// game 交易游戏 +type game struct { + gameDo gameDo + + ALL field.Asterisk + ID field.String // 业务ID + Name field.String // 游戏名称 + Desc field.String // 描述 + Icon field.String // 图标 + Logo field.String // logo + Sort field.Int32 // 排序 + State field.Int32 // 状态1=启用 2=禁用 + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (g game) Table(newTableName string) *game { + g.gameDo.UseTable(newTableName) + return g.updateTableName(newTableName) +} + +func (g game) As(alias string) *game { + g.gameDo.DO = *(g.gameDo.As(alias).(*gen.DO)) + return g.updateTableName(alias) +} + +func (g *game) updateTableName(table string) *game { + g.ALL = field.NewAsterisk(table) + g.ID = field.NewString(table, "id") + g.Name = field.NewString(table, "name") + g.Desc = field.NewString(table, "desc") + g.Icon = field.NewString(table, "icon") + g.Logo = field.NewString(table, "logo") + g.Sort = field.NewInt32(table, "sort") + g.State = field.NewInt32(table, "state") + g.DeleteAt = field.NewField(table, "delete_at") + g.CreateAt = field.NewTime(table, "create_at") + g.CreateBy = field.NewString(table, "create_by") + g.UpdateAt = field.NewTime(table, "update_at") + g.UpdateBy = field.NewString(table, "update_by") + + g.fillFieldMap() + + return g +} + +func (g *game) WithContext(ctx context.Context) IGameDo { return g.gameDo.WithContext(ctx) } + +func (g game) TableName() string { return g.gameDo.TableName() } + +func (g game) Alias() string { return g.gameDo.Alias() } + +func (g game) Columns(cols ...field.Expr) gen.Columns { return g.gameDo.Columns(cols...) } + +func (g *game) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := g.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (g *game) fillFieldMap() { + g.fieldMap = make(map[string]field.Expr, 12) + g.fieldMap["id"] = g.ID + g.fieldMap["name"] = g.Name + g.fieldMap["desc"] = g.Desc + g.fieldMap["icon"] = g.Icon + g.fieldMap["logo"] = g.Logo + g.fieldMap["sort"] = g.Sort + g.fieldMap["state"] = g.State + g.fieldMap["delete_at"] = g.DeleteAt + g.fieldMap["create_at"] = g.CreateAt + g.fieldMap["create_by"] = g.CreateBy + g.fieldMap["update_at"] = g.UpdateAt + g.fieldMap["update_by"] = g.UpdateBy +} + +func (g game) clone(db *gorm.DB) game { + g.gameDo.ReplaceConnPool(db.Statement.ConnPool) + return g +} + +func (g game) replaceDB(db *gorm.DB) game { + g.gameDo.ReplaceDB(db) + return g +} + +type gameDo struct{ gen.DO } + +type IGameDo interface { + gen.SubQuery + Debug() IGameDo + WithContext(ctx context.Context) IGameDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IGameDo + WriteDB() IGameDo + As(alias string) gen.Dao + Session(config *gorm.Session) IGameDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IGameDo + Not(conds ...gen.Condition) IGameDo + Or(conds ...gen.Condition) IGameDo + Select(conds ...field.Expr) IGameDo + Where(conds ...gen.Condition) IGameDo + Order(conds ...field.Expr) IGameDo + Distinct(cols ...field.Expr) IGameDo + Omit(cols ...field.Expr) IGameDo + Join(table schema.Tabler, on ...field.Expr) IGameDo + LeftJoin(table schema.Tabler, on ...field.Expr) IGameDo + RightJoin(table schema.Tabler, on ...field.Expr) IGameDo + Group(cols ...field.Expr) IGameDo + Having(conds ...gen.Condition) IGameDo + Limit(limit int) IGameDo + Offset(offset int) IGameDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IGameDo + Unscoped() IGameDo + Create(values ...*model.Game) error + CreateInBatches(values []*model.Game, batchSize int) error + Save(values ...*model.Game) error + First() (*model.Game, error) + Take() (*model.Game, error) + Last() (*model.Game, error) + Find() ([]*model.Game, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Game, err error) + FindInBatches(result *[]*model.Game, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.Game) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IGameDo + Assign(attrs ...field.AssignExpr) IGameDo + Joins(fields ...field.RelationField) IGameDo + Preload(fields ...field.RelationField) IGameDo + FirstOrInit() (*model.Game, error) + FirstOrCreate() (*model.Game, error) + FindByPage(offset int, limit int) (result []*model.Game, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IGameDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (g gameDo) Debug() IGameDo { + return g.withDO(g.DO.Debug()) +} + +func (g gameDo) WithContext(ctx context.Context) IGameDo { + return g.withDO(g.DO.WithContext(ctx)) +} + +func (g gameDo) ReadDB() IGameDo { + return g.Clauses(dbresolver.Read) +} + +func (g gameDo) WriteDB() IGameDo { + return g.Clauses(dbresolver.Write) +} + +func (g gameDo) Session(config *gorm.Session) IGameDo { + return g.withDO(g.DO.Session(config)) +} + +func (g gameDo) Clauses(conds ...clause.Expression) IGameDo { + return g.withDO(g.DO.Clauses(conds...)) +} + +func (g gameDo) Returning(value interface{}, columns ...string) IGameDo { + return g.withDO(g.DO.Returning(value, columns...)) +} + +func (g gameDo) Not(conds ...gen.Condition) IGameDo { + return g.withDO(g.DO.Not(conds...)) +} + +func (g gameDo) Or(conds ...gen.Condition) IGameDo { + return g.withDO(g.DO.Or(conds...)) +} + +func (g gameDo) Select(conds ...field.Expr) IGameDo { + return g.withDO(g.DO.Select(conds...)) +} + +func (g gameDo) Where(conds ...gen.Condition) IGameDo { + return g.withDO(g.DO.Where(conds...)) +} + +func (g gameDo) Order(conds ...field.Expr) IGameDo { + return g.withDO(g.DO.Order(conds...)) +} + +func (g gameDo) Distinct(cols ...field.Expr) IGameDo { + return g.withDO(g.DO.Distinct(cols...)) +} + +func (g gameDo) Omit(cols ...field.Expr) IGameDo { + return g.withDO(g.DO.Omit(cols...)) +} + +func (g gameDo) Join(table schema.Tabler, on ...field.Expr) IGameDo { + return g.withDO(g.DO.Join(table, on...)) +} + +func (g gameDo) LeftJoin(table schema.Tabler, on ...field.Expr) IGameDo { + return g.withDO(g.DO.LeftJoin(table, on...)) +} + +func (g gameDo) RightJoin(table schema.Tabler, on ...field.Expr) IGameDo { + return g.withDO(g.DO.RightJoin(table, on...)) +} + +func (g gameDo) Group(cols ...field.Expr) IGameDo { + return g.withDO(g.DO.Group(cols...)) +} + +func (g gameDo) Having(conds ...gen.Condition) IGameDo { + return g.withDO(g.DO.Having(conds...)) +} + +func (g gameDo) Limit(limit int) IGameDo { + return g.withDO(g.DO.Limit(limit)) +} + +func (g gameDo) Offset(offset int) IGameDo { + return g.withDO(g.DO.Offset(offset)) +} + +func (g gameDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IGameDo { + return g.withDO(g.DO.Scopes(funcs...)) +} + +func (g gameDo) Unscoped() IGameDo { + return g.withDO(g.DO.Unscoped()) +} + +func (g gameDo) Create(values ...*model.Game) error { + if len(values) == 0 { + return nil + } + return g.DO.Create(values) +} + +func (g gameDo) CreateInBatches(values []*model.Game, batchSize int) error { + return g.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (g gameDo) Save(values ...*model.Game) error { + if len(values) == 0 { + return nil + } + return g.DO.Save(values) +} + +func (g gameDo) First() (*model.Game, error) { + if result, err := g.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.Game), nil + } +} + +func (g gameDo) Take() (*model.Game, error) { + if result, err := g.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.Game), nil + } +} + +func (g gameDo) Last() (*model.Game, error) { + if result, err := g.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.Game), nil + } +} + +func (g gameDo) Find() ([]*model.Game, error) { + result, err := g.DO.Find() + return result.([]*model.Game), err +} + +func (g gameDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.Game, err error) { + buf := make([]*model.Game, 0, batchSize) + err = g.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (g gameDo) FindInBatches(result *[]*model.Game, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return g.DO.FindInBatches(result, batchSize, fc) +} + +func (g gameDo) Attrs(attrs ...field.AssignExpr) IGameDo { + return g.withDO(g.DO.Attrs(attrs...)) +} + +func (g gameDo) Assign(attrs ...field.AssignExpr) IGameDo { + return g.withDO(g.DO.Assign(attrs...)) +} + +func (g gameDo) Joins(fields ...field.RelationField) IGameDo { + for _, _f := range fields { + g = *g.withDO(g.DO.Joins(_f)) + } + return &g +} + +func (g gameDo) Preload(fields ...field.RelationField) IGameDo { + for _, _f := range fields { + g = *g.withDO(g.DO.Preload(_f)) + } + return &g +} + +func (g gameDo) FirstOrInit() (*model.Game, error) { + if result, err := g.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.Game), nil + } +} + +func (g gameDo) FirstOrCreate() (*model.Game, error) { + if result, err := g.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.Game), nil + } +} + +func (g gameDo) FindByPage(offset int, limit int) (result []*model.Game, count int64, err error) { + result, err = g.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = g.Offset(-1).Limit(-1).Count() + return +} + +func (g gameDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = g.Count() + if err != nil { + return + } + + err = g.Offset(offset).Limit(limit).Scan(result) + return +} + +func (g gameDo) Scan(result interface{}) (err error) { + return g.DO.Scan(result) +} + +func (g gameDo) Delete(models ...*model.Game) (result gen.ResultInfo, err error) { + return g.DO.Delete(models) +} + +func (g *gameDo) withDO(do gen.Dao) *gameDo { + g.DO = *do.(*gen.DO) + return g +} diff --git a/pkg/repo/gen.go b/pkg/repo/gen.go new file mode 100644 index 0000000..87a66e9 --- /dev/null +++ b/pkg/repo/gen.go @@ -0,0 +1,183 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + "database/sql" + + "gorm.io/gorm" + + "gorm.io/gen" + + "gorm.io/plugin/dbresolver" +) + +var ( + Q = new(Query) + AdminPrivilege *adminPrivilege + AdminRole *adminRole + AdminRolePrivilege *adminRolePrivilege + AdminUser *adminUser + AdminUserRole *adminUserRole + DataAttach *dataAttach + Game *game + TradeCommodity *tradeCommodity + User *user + UserGameRole *userGameRole + UserGameRoleProp *userGameRoleProp +) + +func SetDefault(db *gorm.DB, opts ...gen.DOOption) { + *Q = *Use(db, opts...) + AdminPrivilege = &Q.AdminPrivilege + AdminRole = &Q.AdminRole + AdminRolePrivilege = &Q.AdminRolePrivilege + AdminUser = &Q.AdminUser + AdminUserRole = &Q.AdminUserRole + DataAttach = &Q.DataAttach + Game = &Q.Game + TradeCommodity = &Q.TradeCommodity + User = &Q.User + UserGameRole = &Q.UserGameRole + UserGameRoleProp = &Q.UserGameRoleProp +} + +func Use(db *gorm.DB, opts ...gen.DOOption) *Query { + return &Query{ + db: db, + AdminPrivilege: newAdminPrivilege(db, opts...), + AdminRole: newAdminRole(db, opts...), + AdminRolePrivilege: newAdminRolePrivilege(db, opts...), + AdminUser: newAdminUser(db, opts...), + AdminUserRole: newAdminUserRole(db, opts...), + DataAttach: newDataAttach(db, opts...), + Game: newGame(db, opts...), + TradeCommodity: newTradeCommodity(db, opts...), + User: newUser(db, opts...), + UserGameRole: newUserGameRole(db, opts...), + UserGameRoleProp: newUserGameRoleProp(db, opts...), + } +} + +type Query struct { + db *gorm.DB + + AdminPrivilege adminPrivilege + AdminRole adminRole + AdminRolePrivilege adminRolePrivilege + AdminUser adminUser + AdminUserRole adminUserRole + DataAttach dataAttach + Game game + TradeCommodity tradeCommodity + User user + UserGameRole userGameRole + UserGameRoleProp userGameRoleProp +} + +func (q *Query) Available() bool { return q.db != nil } + +func (q *Query) clone(db *gorm.DB) *Query { + return &Query{ + db: db, + AdminPrivilege: q.AdminPrivilege.clone(db), + AdminRole: q.AdminRole.clone(db), + AdminRolePrivilege: q.AdminRolePrivilege.clone(db), + AdminUser: q.AdminUser.clone(db), + AdminUserRole: q.AdminUserRole.clone(db), + DataAttach: q.DataAttach.clone(db), + Game: q.Game.clone(db), + TradeCommodity: q.TradeCommodity.clone(db), + User: q.User.clone(db), + UserGameRole: q.UserGameRole.clone(db), + UserGameRoleProp: q.UserGameRoleProp.clone(db), + } +} + +func (q *Query) ReadDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Read)) +} + +func (q *Query) WriteDB() *Query { + return q.ReplaceDB(q.db.Clauses(dbresolver.Write)) +} + +func (q *Query) ReplaceDB(db *gorm.DB) *Query { + return &Query{ + db: db, + AdminPrivilege: q.AdminPrivilege.replaceDB(db), + AdminRole: q.AdminRole.replaceDB(db), + AdminRolePrivilege: q.AdminRolePrivilege.replaceDB(db), + AdminUser: q.AdminUser.replaceDB(db), + AdminUserRole: q.AdminUserRole.replaceDB(db), + DataAttach: q.DataAttach.replaceDB(db), + Game: q.Game.replaceDB(db), + TradeCommodity: q.TradeCommodity.replaceDB(db), + User: q.User.replaceDB(db), + UserGameRole: q.UserGameRole.replaceDB(db), + UserGameRoleProp: q.UserGameRoleProp.replaceDB(db), + } +} + +type queryCtx struct { + AdminPrivilege IAdminPrivilegeDo + AdminRole IAdminRoleDo + AdminRolePrivilege IAdminRolePrivilegeDo + AdminUser IAdminUserDo + AdminUserRole IAdminUserRoleDo + DataAttach IDataAttachDo + Game IGameDo + TradeCommodity ITradeCommodityDo + User IUserDo + UserGameRole IUserGameRoleDo + UserGameRoleProp IUserGameRolePropDo +} + +func (q *Query) WithContext(ctx context.Context) *queryCtx { + return &queryCtx{ + AdminPrivilege: q.AdminPrivilege.WithContext(ctx), + AdminRole: q.AdminRole.WithContext(ctx), + AdminRolePrivilege: q.AdminRolePrivilege.WithContext(ctx), + AdminUser: q.AdminUser.WithContext(ctx), + AdminUserRole: q.AdminUserRole.WithContext(ctx), + DataAttach: q.DataAttach.WithContext(ctx), + Game: q.Game.WithContext(ctx), + TradeCommodity: q.TradeCommodity.WithContext(ctx), + User: q.User.WithContext(ctx), + UserGameRole: q.UserGameRole.WithContext(ctx), + UserGameRoleProp: q.UserGameRoleProp.WithContext(ctx), + } +} + +func (q *Query) Transaction(fc func(tx *Query) error, opts ...*sql.TxOptions) error { + return q.db.Transaction(func(tx *gorm.DB) error { return fc(q.clone(tx)) }, opts...) +} + +func (q *Query) Begin(opts ...*sql.TxOptions) *QueryTx { + tx := q.db.Begin(opts...) + return &QueryTx{Query: q.clone(tx), Error: tx.Error} +} + +type QueryTx struct { + *Query + Error error +} + +func (q *QueryTx) Commit() error { + return q.db.Commit().Error +} + +func (q *QueryTx) Rollback() error { + return q.db.Rollback().Error +} + +func (q *QueryTx) SavePoint(name string) error { + return q.db.SavePoint(name).Error +} + +func (q *QueryTx) RollbackTo(name string) error { + return q.db.RollbackTo(name).Error +} diff --git a/pkg/repo/trade_commodity.gen.go b/pkg/repo/trade_commodity.gen.go new file mode 100644 index 0000000..2f9ce52 --- /dev/null +++ b/pkg/repo/trade_commodity.gen.go @@ -0,0 +1,445 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newTradeCommodity(db *gorm.DB, opts ...gen.DOOption) tradeCommodity { + _tradeCommodity := tradeCommodity{} + + _tradeCommodity.tradeCommodityDo.UseDB(db, opts...) + _tradeCommodity.tradeCommodityDo.UseModel(&model.TradeCommodity{}) + + tableName := _tradeCommodity.tradeCommodityDo.TableName() + _tradeCommodity.ALL = field.NewAsterisk(tableName) + _tradeCommodity.ID = field.NewString(tableName, "id") + _tradeCommodity.CommodityType = field.NewString(tableName, "commodity_type") + _tradeCommodity.UserID = field.NewString(tableName, "user_id") + _tradeCommodity.CommodityID = field.NewString(tableName, "commodity_id") + _tradeCommodity.Desc = field.NewString(tableName, "desc") + _tradeCommodity.Price = field.NewInt32(tableName, "price") + _tradeCommodity.Icon = field.NewString(tableName, "icon") + _tradeCommodity.Logo = field.NewString(tableName, "logo") + _tradeCommodity.State = field.NewInt32(tableName, "state") + _tradeCommodity.DeleteAt = field.NewField(tableName, "delete_at") + _tradeCommodity.CreateAt = field.NewTime(tableName, "create_at") + _tradeCommodity.CreateBy = field.NewString(tableName, "create_by") + _tradeCommodity.UpdateAt = field.NewTime(tableName, "update_at") + _tradeCommodity.UpdateBy = field.NewString(tableName, "update_by") + + _tradeCommodity.fillFieldMap() + + return _tradeCommodity +} + +// tradeCommodity 交易的商品 +type tradeCommodity struct { + tradeCommodityDo tradeCommodityDo + + ALL field.Asterisk + ID field.String // 业务ID + CommodityType field.String // GAME_ROLE=游戏角色 + UserID field.String // 用户ID + CommodityID field.String // 如游戏角色ID(user_game_role的ID) + Desc field.String // 描述 + Price field.Int32 // 价格,单位为分 + Icon field.String // 图标 + Logo field.String // logo + State field.Int32 // 状态1=启用 2=禁用 + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (t tradeCommodity) Table(newTableName string) *tradeCommodity { + t.tradeCommodityDo.UseTable(newTableName) + return t.updateTableName(newTableName) +} + +func (t tradeCommodity) As(alias string) *tradeCommodity { + t.tradeCommodityDo.DO = *(t.tradeCommodityDo.As(alias).(*gen.DO)) + return t.updateTableName(alias) +} + +func (t *tradeCommodity) updateTableName(table string) *tradeCommodity { + t.ALL = field.NewAsterisk(table) + t.ID = field.NewString(table, "id") + t.CommodityType = field.NewString(table, "commodity_type") + t.UserID = field.NewString(table, "user_id") + t.CommodityID = field.NewString(table, "commodity_id") + t.Desc = field.NewString(table, "desc") + t.Price = field.NewInt32(table, "price") + t.Icon = field.NewString(table, "icon") + t.Logo = field.NewString(table, "logo") + t.State = field.NewInt32(table, "state") + t.DeleteAt = field.NewField(table, "delete_at") + t.CreateAt = field.NewTime(table, "create_at") + t.CreateBy = field.NewString(table, "create_by") + t.UpdateAt = field.NewTime(table, "update_at") + t.UpdateBy = field.NewString(table, "update_by") + + t.fillFieldMap() + + return t +} + +func (t *tradeCommodity) WithContext(ctx context.Context) ITradeCommodityDo { + return t.tradeCommodityDo.WithContext(ctx) +} + +func (t tradeCommodity) TableName() string { return t.tradeCommodityDo.TableName() } + +func (t tradeCommodity) Alias() string { return t.tradeCommodityDo.Alias() } + +func (t tradeCommodity) Columns(cols ...field.Expr) gen.Columns { + return t.tradeCommodityDo.Columns(cols...) +} + +func (t *tradeCommodity) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := t.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (t *tradeCommodity) fillFieldMap() { + t.fieldMap = make(map[string]field.Expr, 14) + t.fieldMap["id"] = t.ID + t.fieldMap["commodity_type"] = t.CommodityType + t.fieldMap["user_id"] = t.UserID + t.fieldMap["commodity_id"] = t.CommodityID + t.fieldMap["desc"] = t.Desc + t.fieldMap["price"] = t.Price + t.fieldMap["icon"] = t.Icon + t.fieldMap["logo"] = t.Logo + t.fieldMap["state"] = t.State + t.fieldMap["delete_at"] = t.DeleteAt + t.fieldMap["create_at"] = t.CreateAt + t.fieldMap["create_by"] = t.CreateBy + t.fieldMap["update_at"] = t.UpdateAt + t.fieldMap["update_by"] = t.UpdateBy +} + +func (t tradeCommodity) clone(db *gorm.DB) tradeCommodity { + t.tradeCommodityDo.ReplaceConnPool(db.Statement.ConnPool) + return t +} + +func (t tradeCommodity) replaceDB(db *gorm.DB) tradeCommodity { + t.tradeCommodityDo.ReplaceDB(db) + return t +} + +type tradeCommodityDo struct{ gen.DO } + +type ITradeCommodityDo interface { + gen.SubQuery + Debug() ITradeCommodityDo + WithContext(ctx context.Context) ITradeCommodityDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() ITradeCommodityDo + WriteDB() ITradeCommodityDo + As(alias string) gen.Dao + Session(config *gorm.Session) ITradeCommodityDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) ITradeCommodityDo + Not(conds ...gen.Condition) ITradeCommodityDo + Or(conds ...gen.Condition) ITradeCommodityDo + Select(conds ...field.Expr) ITradeCommodityDo + Where(conds ...gen.Condition) ITradeCommodityDo + Order(conds ...field.Expr) ITradeCommodityDo + Distinct(cols ...field.Expr) ITradeCommodityDo + Omit(cols ...field.Expr) ITradeCommodityDo + Join(table schema.Tabler, on ...field.Expr) ITradeCommodityDo + LeftJoin(table schema.Tabler, on ...field.Expr) ITradeCommodityDo + RightJoin(table schema.Tabler, on ...field.Expr) ITradeCommodityDo + Group(cols ...field.Expr) ITradeCommodityDo + Having(conds ...gen.Condition) ITradeCommodityDo + Limit(limit int) ITradeCommodityDo + Offset(offset int) ITradeCommodityDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) ITradeCommodityDo + Unscoped() ITradeCommodityDo + Create(values ...*model.TradeCommodity) error + CreateInBatches(values []*model.TradeCommodity, batchSize int) error + Save(values ...*model.TradeCommodity) error + First() (*model.TradeCommodity, error) + Take() (*model.TradeCommodity, error) + Last() (*model.TradeCommodity, error) + Find() ([]*model.TradeCommodity, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.TradeCommodity, err error) + FindInBatches(result *[]*model.TradeCommodity, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.TradeCommodity) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) ITradeCommodityDo + Assign(attrs ...field.AssignExpr) ITradeCommodityDo + Joins(fields ...field.RelationField) ITradeCommodityDo + Preload(fields ...field.RelationField) ITradeCommodityDo + FirstOrInit() (*model.TradeCommodity, error) + FirstOrCreate() (*model.TradeCommodity, error) + FindByPage(offset int, limit int) (result []*model.TradeCommodity, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) ITradeCommodityDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (t tradeCommodityDo) Debug() ITradeCommodityDo { + return t.withDO(t.DO.Debug()) +} + +func (t tradeCommodityDo) WithContext(ctx context.Context) ITradeCommodityDo { + return t.withDO(t.DO.WithContext(ctx)) +} + +func (t tradeCommodityDo) ReadDB() ITradeCommodityDo { + return t.Clauses(dbresolver.Read) +} + +func (t tradeCommodityDo) WriteDB() ITradeCommodityDo { + return t.Clauses(dbresolver.Write) +} + +func (t tradeCommodityDo) Session(config *gorm.Session) ITradeCommodityDo { + return t.withDO(t.DO.Session(config)) +} + +func (t tradeCommodityDo) Clauses(conds ...clause.Expression) ITradeCommodityDo { + return t.withDO(t.DO.Clauses(conds...)) +} + +func (t tradeCommodityDo) Returning(value interface{}, columns ...string) ITradeCommodityDo { + return t.withDO(t.DO.Returning(value, columns...)) +} + +func (t tradeCommodityDo) Not(conds ...gen.Condition) ITradeCommodityDo { + return t.withDO(t.DO.Not(conds...)) +} + +func (t tradeCommodityDo) Or(conds ...gen.Condition) ITradeCommodityDo { + return t.withDO(t.DO.Or(conds...)) +} + +func (t tradeCommodityDo) Select(conds ...field.Expr) ITradeCommodityDo { + return t.withDO(t.DO.Select(conds...)) +} + +func (t tradeCommodityDo) Where(conds ...gen.Condition) ITradeCommodityDo { + return t.withDO(t.DO.Where(conds...)) +} + +func (t tradeCommodityDo) Order(conds ...field.Expr) ITradeCommodityDo { + return t.withDO(t.DO.Order(conds...)) +} + +func (t tradeCommodityDo) Distinct(cols ...field.Expr) ITradeCommodityDo { + return t.withDO(t.DO.Distinct(cols...)) +} + +func (t tradeCommodityDo) Omit(cols ...field.Expr) ITradeCommodityDo { + return t.withDO(t.DO.Omit(cols...)) +} + +func (t tradeCommodityDo) Join(table schema.Tabler, on ...field.Expr) ITradeCommodityDo { + return t.withDO(t.DO.Join(table, on...)) +} + +func (t tradeCommodityDo) LeftJoin(table schema.Tabler, on ...field.Expr) ITradeCommodityDo { + return t.withDO(t.DO.LeftJoin(table, on...)) +} + +func (t tradeCommodityDo) RightJoin(table schema.Tabler, on ...field.Expr) ITradeCommodityDo { + return t.withDO(t.DO.RightJoin(table, on...)) +} + +func (t tradeCommodityDo) Group(cols ...field.Expr) ITradeCommodityDo { + return t.withDO(t.DO.Group(cols...)) +} + +func (t tradeCommodityDo) Having(conds ...gen.Condition) ITradeCommodityDo { + return t.withDO(t.DO.Having(conds...)) +} + +func (t tradeCommodityDo) Limit(limit int) ITradeCommodityDo { + return t.withDO(t.DO.Limit(limit)) +} + +func (t tradeCommodityDo) Offset(offset int) ITradeCommodityDo { + return t.withDO(t.DO.Offset(offset)) +} + +func (t tradeCommodityDo) Scopes(funcs ...func(gen.Dao) gen.Dao) ITradeCommodityDo { + return t.withDO(t.DO.Scopes(funcs...)) +} + +func (t tradeCommodityDo) Unscoped() ITradeCommodityDo { + return t.withDO(t.DO.Unscoped()) +} + +func (t tradeCommodityDo) Create(values ...*model.TradeCommodity) error { + if len(values) == 0 { + return nil + } + return t.DO.Create(values) +} + +func (t tradeCommodityDo) CreateInBatches(values []*model.TradeCommodity, batchSize int) error { + return t.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (t tradeCommodityDo) Save(values ...*model.TradeCommodity) error { + if len(values) == 0 { + return nil + } + return t.DO.Save(values) +} + +func (t tradeCommodityDo) First() (*model.TradeCommodity, error) { + if result, err := t.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.TradeCommodity), nil + } +} + +func (t tradeCommodityDo) Take() (*model.TradeCommodity, error) { + if result, err := t.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.TradeCommodity), nil + } +} + +func (t tradeCommodityDo) Last() (*model.TradeCommodity, error) { + if result, err := t.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.TradeCommodity), nil + } +} + +func (t tradeCommodityDo) Find() ([]*model.TradeCommodity, error) { + result, err := t.DO.Find() + return result.([]*model.TradeCommodity), err +} + +func (t tradeCommodityDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.TradeCommodity, err error) { + buf := make([]*model.TradeCommodity, 0, batchSize) + err = t.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (t tradeCommodityDo) FindInBatches(result *[]*model.TradeCommodity, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return t.DO.FindInBatches(result, batchSize, fc) +} + +func (t tradeCommodityDo) Attrs(attrs ...field.AssignExpr) ITradeCommodityDo { + return t.withDO(t.DO.Attrs(attrs...)) +} + +func (t tradeCommodityDo) Assign(attrs ...field.AssignExpr) ITradeCommodityDo { + return t.withDO(t.DO.Assign(attrs...)) +} + +func (t tradeCommodityDo) Joins(fields ...field.RelationField) ITradeCommodityDo { + for _, _f := range fields { + t = *t.withDO(t.DO.Joins(_f)) + } + return &t +} + +func (t tradeCommodityDo) Preload(fields ...field.RelationField) ITradeCommodityDo { + for _, _f := range fields { + t = *t.withDO(t.DO.Preload(_f)) + } + return &t +} + +func (t tradeCommodityDo) FirstOrInit() (*model.TradeCommodity, error) { + if result, err := t.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.TradeCommodity), nil + } +} + +func (t tradeCommodityDo) FirstOrCreate() (*model.TradeCommodity, error) { + if result, err := t.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.TradeCommodity), nil + } +} + +func (t tradeCommodityDo) FindByPage(offset int, limit int) (result []*model.TradeCommodity, count int64, err error) { + result, err = t.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = t.Offset(-1).Limit(-1).Count() + return +} + +func (t tradeCommodityDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = t.Count() + if err != nil { + return + } + + err = t.Offset(offset).Limit(limit).Scan(result) + return +} + +func (t tradeCommodityDo) Scan(result interface{}) (err error) { + return t.DO.Scan(result) +} + +func (t tradeCommodityDo) Delete(models ...*model.TradeCommodity) (result gen.ResultInfo, err error) { + return t.DO.Delete(models) +} + +func (t *tradeCommodityDo) withDO(do gen.Dao) *tradeCommodityDo { + t.DO = *do.(*gen.DO) + return t +} diff --git a/pkg/repo/user.gen.go b/pkg/repo/user.gen.go new file mode 100644 index 0000000..17d4853 --- /dev/null +++ b/pkg/repo/user.gen.go @@ -0,0 +1,433 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newUser(db *gorm.DB, opts ...gen.DOOption) user { + _user := user{} + + _user.userDo.UseDB(db, opts...) + _user.userDo.UseModel(&model.User{}) + + tableName := _user.userDo.TableName() + _user.ALL = field.NewAsterisk(tableName) + _user.ID = field.NewString(tableName, "id") + _user.No = field.NewString(tableName, "no") + _user.Nickname = field.NewString(tableName, "nickname") + _user.Sign = field.NewString(tableName, "sign") + _user.Avatar = field.NewString(tableName, "avatar") + _user.Password = field.NewString(tableName, "password") + _user.PassSalt = field.NewString(tableName, "pass_salt") + _user.WxOpenID = field.NewString(tableName, "wx_open_id") + _user.WxUnionID = field.NewString(tableName, "wx_union_id") + _user.DeleteAt = field.NewField(tableName, "delete_at") + _user.CreateAt = field.NewTime(tableName, "create_at") + _user.UpdateAt = field.NewTime(tableName, "update_at") + + _user.fillFieldMap() + + return _user +} + +// user 用户 +type user struct { + userDo userDo + + ALL field.Asterisk + ID field.String // ID + No field.String // 用户号、用户名 + Nickname field.String // 昵称 + Sign field.String // 签名 + Avatar field.String // 头像 + Password field.String // 密码 + PassSalt field.String // 密码盐 + WxOpenID field.String // OPEN ID + WxUnionID field.String // UNION ID + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + UpdateAt field.Time // 更新时间 + + fieldMap map[string]field.Expr +} + +func (u user) Table(newTableName string) *user { + u.userDo.UseTable(newTableName) + return u.updateTableName(newTableName) +} + +func (u user) As(alias string) *user { + u.userDo.DO = *(u.userDo.As(alias).(*gen.DO)) + return u.updateTableName(alias) +} + +func (u *user) updateTableName(table string) *user { + u.ALL = field.NewAsterisk(table) + u.ID = field.NewString(table, "id") + u.No = field.NewString(table, "no") + u.Nickname = field.NewString(table, "nickname") + u.Sign = field.NewString(table, "sign") + u.Avatar = field.NewString(table, "avatar") + u.Password = field.NewString(table, "password") + u.PassSalt = field.NewString(table, "pass_salt") + u.WxOpenID = field.NewString(table, "wx_open_id") + u.WxUnionID = field.NewString(table, "wx_union_id") + u.DeleteAt = field.NewField(table, "delete_at") + u.CreateAt = field.NewTime(table, "create_at") + u.UpdateAt = field.NewTime(table, "update_at") + + u.fillFieldMap() + + return u +} + +func (u *user) WithContext(ctx context.Context) IUserDo { return u.userDo.WithContext(ctx) } + +func (u user) TableName() string { return u.userDo.TableName() } + +func (u user) Alias() string { return u.userDo.Alias() } + +func (u user) Columns(cols ...field.Expr) gen.Columns { return u.userDo.Columns(cols...) } + +func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := u.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (u *user) fillFieldMap() { + u.fieldMap = make(map[string]field.Expr, 12) + u.fieldMap["id"] = u.ID + u.fieldMap["no"] = u.No + u.fieldMap["nickname"] = u.Nickname + u.fieldMap["sign"] = u.Sign + u.fieldMap["avatar"] = u.Avatar + u.fieldMap["password"] = u.Password + u.fieldMap["pass_salt"] = u.PassSalt + u.fieldMap["wx_open_id"] = u.WxOpenID + u.fieldMap["wx_union_id"] = u.WxUnionID + u.fieldMap["delete_at"] = u.DeleteAt + u.fieldMap["create_at"] = u.CreateAt + u.fieldMap["update_at"] = u.UpdateAt +} + +func (u user) clone(db *gorm.DB) user { + u.userDo.ReplaceConnPool(db.Statement.ConnPool) + return u +} + +func (u user) replaceDB(db *gorm.DB) user { + u.userDo.ReplaceDB(db) + return u +} + +type userDo struct{ gen.DO } + +type IUserDo interface { + gen.SubQuery + Debug() IUserDo + WithContext(ctx context.Context) IUserDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IUserDo + WriteDB() IUserDo + As(alias string) gen.Dao + Session(config *gorm.Session) IUserDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IUserDo + Not(conds ...gen.Condition) IUserDo + Or(conds ...gen.Condition) IUserDo + Select(conds ...field.Expr) IUserDo + Where(conds ...gen.Condition) IUserDo + Order(conds ...field.Expr) IUserDo + Distinct(cols ...field.Expr) IUserDo + Omit(cols ...field.Expr) IUserDo + Join(table schema.Tabler, on ...field.Expr) IUserDo + LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo + RightJoin(table schema.Tabler, on ...field.Expr) IUserDo + Group(cols ...field.Expr) IUserDo + Having(conds ...gen.Condition) IUserDo + Limit(limit int) IUserDo + Offset(offset int) IUserDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo + Unscoped() IUserDo + Create(values ...*model.User) error + CreateInBatches(values []*model.User, batchSize int) error + Save(values ...*model.User) error + First() (*model.User, error) + Take() (*model.User, error) + Last() (*model.User, error) + Find() ([]*model.User, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.User, err error) + FindInBatches(result *[]*model.User, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.User) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IUserDo + Assign(attrs ...field.AssignExpr) IUserDo + Joins(fields ...field.RelationField) IUserDo + Preload(fields ...field.RelationField) IUserDo + FirstOrInit() (*model.User, error) + FirstOrCreate() (*model.User, error) + FindByPage(offset int, limit int) (result []*model.User, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IUserDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (u userDo) Debug() IUserDo { + return u.withDO(u.DO.Debug()) +} + +func (u userDo) WithContext(ctx context.Context) IUserDo { + return u.withDO(u.DO.WithContext(ctx)) +} + +func (u userDo) ReadDB() IUserDo { + return u.Clauses(dbresolver.Read) +} + +func (u userDo) WriteDB() IUserDo { + return u.Clauses(dbresolver.Write) +} + +func (u userDo) Session(config *gorm.Session) IUserDo { + return u.withDO(u.DO.Session(config)) +} + +func (u userDo) Clauses(conds ...clause.Expression) IUserDo { + return u.withDO(u.DO.Clauses(conds...)) +} + +func (u userDo) Returning(value interface{}, columns ...string) IUserDo { + return u.withDO(u.DO.Returning(value, columns...)) +} + +func (u userDo) Not(conds ...gen.Condition) IUserDo { + return u.withDO(u.DO.Not(conds...)) +} + +func (u userDo) Or(conds ...gen.Condition) IUserDo { + return u.withDO(u.DO.Or(conds...)) +} + +func (u userDo) Select(conds ...field.Expr) IUserDo { + return u.withDO(u.DO.Select(conds...)) +} + +func (u userDo) Where(conds ...gen.Condition) IUserDo { + return u.withDO(u.DO.Where(conds...)) +} + +func (u userDo) Order(conds ...field.Expr) IUserDo { + return u.withDO(u.DO.Order(conds...)) +} + +func (u userDo) Distinct(cols ...field.Expr) IUserDo { + return u.withDO(u.DO.Distinct(cols...)) +} + +func (u userDo) Omit(cols ...field.Expr) IUserDo { + return u.withDO(u.DO.Omit(cols...)) +} + +func (u userDo) Join(table schema.Tabler, on ...field.Expr) IUserDo { + return u.withDO(u.DO.Join(table, on...)) +} + +func (u userDo) LeftJoin(table schema.Tabler, on ...field.Expr) IUserDo { + return u.withDO(u.DO.LeftJoin(table, on...)) +} + +func (u userDo) RightJoin(table schema.Tabler, on ...field.Expr) IUserDo { + return u.withDO(u.DO.RightJoin(table, on...)) +} + +func (u userDo) Group(cols ...field.Expr) IUserDo { + return u.withDO(u.DO.Group(cols...)) +} + +func (u userDo) Having(conds ...gen.Condition) IUserDo { + return u.withDO(u.DO.Having(conds...)) +} + +func (u userDo) Limit(limit int) IUserDo { + return u.withDO(u.DO.Limit(limit)) +} + +func (u userDo) Offset(offset int) IUserDo { + return u.withDO(u.DO.Offset(offset)) +} + +func (u userDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IUserDo { + return u.withDO(u.DO.Scopes(funcs...)) +} + +func (u userDo) Unscoped() IUserDo { + return u.withDO(u.DO.Unscoped()) +} + +func (u userDo) Create(values ...*model.User) error { + if len(values) == 0 { + return nil + } + return u.DO.Create(values) +} + +func (u userDo) CreateInBatches(values []*model.User, batchSize int) error { + return u.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (u userDo) Save(values ...*model.User) error { + if len(values) == 0 { + return nil + } + return u.DO.Save(values) +} + +func (u userDo) First() (*model.User, error) { + if result, err := u.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) Take() (*model.User, error) { + if result, err := u.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) Last() (*model.User, error) { + if result, err := u.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) Find() ([]*model.User, error) { + result, err := u.DO.Find() + return result.([]*model.User), err +} + +func (u userDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.User, err error) { + buf := make([]*model.User, 0, batchSize) + err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (u userDo) FindInBatches(result *[]*model.User, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return u.DO.FindInBatches(result, batchSize, fc) +} + +func (u userDo) Attrs(attrs ...field.AssignExpr) IUserDo { + return u.withDO(u.DO.Attrs(attrs...)) +} + +func (u userDo) Assign(attrs ...field.AssignExpr) IUserDo { + return u.withDO(u.DO.Assign(attrs...)) +} + +func (u userDo) Joins(fields ...field.RelationField) IUserDo { + for _, _f := range fields { + u = *u.withDO(u.DO.Joins(_f)) + } + return &u +} + +func (u userDo) Preload(fields ...field.RelationField) IUserDo { + for _, _f := range fields { + u = *u.withDO(u.DO.Preload(_f)) + } + return &u +} + +func (u userDo) FirstOrInit() (*model.User, error) { + if result, err := u.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) FirstOrCreate() (*model.User, error) { + if result, err := u.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.User), nil + } +} + +func (u userDo) FindByPage(offset int, limit int) (result []*model.User, count int64, err error) { + result, err = u.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = u.Offset(-1).Limit(-1).Count() + return +} + +func (u userDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = u.Count() + if err != nil { + return + } + + err = u.Offset(offset).Limit(limit).Scan(result) + return +} + +func (u userDo) Scan(result interface{}) (err error) { + return u.DO.Scan(result) +} + +func (u userDo) Delete(models ...*model.User) (result gen.ResultInfo, err error) { + return u.DO.Delete(models) +} + +func (u *userDo) withDO(do gen.Dao) *userDo { + u.DO = *do.(*gen.DO) + return u +} diff --git a/pkg/repo/user_game_role.gen.go b/pkg/repo/user_game_role.gen.go new file mode 100644 index 0000000..d7259ec --- /dev/null +++ b/pkg/repo/user_game_role.gen.go @@ -0,0 +1,441 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newUserGameRole(db *gorm.DB, opts ...gen.DOOption) userGameRole { + _userGameRole := userGameRole{} + + _userGameRole.userGameRoleDo.UseDB(db, opts...) + _userGameRole.userGameRoleDo.UseModel(&model.UserGameRole{}) + + tableName := _userGameRole.userGameRoleDo.TableName() + _userGameRole.ALL = field.NewAsterisk(tableName) + _userGameRole.ID = field.NewString(tableName, "id") + _userGameRole.GameID = field.NewString(tableName, "game_id") + _userGameRole.GameRoleName = field.NewString(tableName, "game_role_name") + _userGameRole.GameRoleID = field.NewString(tableName, "game_role_id") + _userGameRole.Desc = field.NewString(tableName, "desc") + _userGameRole.Icon = field.NewString(tableName, "icon") + _userGameRole.Logo = field.NewString(tableName, "logo") + _userGameRole.State = field.NewInt32(tableName, "state") + _userGameRole.DeleteAt = field.NewField(tableName, "delete_at") + _userGameRole.CreateAt = field.NewTime(tableName, "create_at") + _userGameRole.CreateBy = field.NewString(tableName, "create_by") + _userGameRole.UpdateAt = field.NewTime(tableName, "update_at") + _userGameRole.UpdateBy = field.NewString(tableName, "update_by") + + _userGameRole.fillFieldMap() + + return _userGameRole +} + +// userGameRole 用户的游戏角色 +type userGameRole struct { + userGameRoleDo userGameRoleDo + + ALL field.Asterisk + ID field.String // 业务ID + GameID field.String // 游戏 + GameRoleName field.String // 角色名称 + GameRoleID field.String // 角色ID + Desc field.String // 描述 + Icon field.String // 图标 + Logo field.String // logo + State field.Int32 // 状态1=启用 2=禁用 + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (u userGameRole) Table(newTableName string) *userGameRole { + u.userGameRoleDo.UseTable(newTableName) + return u.updateTableName(newTableName) +} + +func (u userGameRole) As(alias string) *userGameRole { + u.userGameRoleDo.DO = *(u.userGameRoleDo.As(alias).(*gen.DO)) + return u.updateTableName(alias) +} + +func (u *userGameRole) updateTableName(table string) *userGameRole { + u.ALL = field.NewAsterisk(table) + u.ID = field.NewString(table, "id") + u.GameID = field.NewString(table, "game_id") + u.GameRoleName = field.NewString(table, "game_role_name") + u.GameRoleID = field.NewString(table, "game_role_id") + u.Desc = field.NewString(table, "desc") + u.Icon = field.NewString(table, "icon") + u.Logo = field.NewString(table, "logo") + u.State = field.NewInt32(table, "state") + u.DeleteAt = field.NewField(table, "delete_at") + u.CreateAt = field.NewTime(table, "create_at") + u.CreateBy = field.NewString(table, "create_by") + u.UpdateAt = field.NewTime(table, "update_at") + u.UpdateBy = field.NewString(table, "update_by") + + u.fillFieldMap() + + return u +} + +func (u *userGameRole) WithContext(ctx context.Context) IUserGameRoleDo { + return u.userGameRoleDo.WithContext(ctx) +} + +func (u userGameRole) TableName() string { return u.userGameRoleDo.TableName() } + +func (u userGameRole) Alias() string { return u.userGameRoleDo.Alias() } + +func (u userGameRole) Columns(cols ...field.Expr) gen.Columns { + return u.userGameRoleDo.Columns(cols...) +} + +func (u *userGameRole) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := u.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (u *userGameRole) fillFieldMap() { + u.fieldMap = make(map[string]field.Expr, 13) + u.fieldMap["id"] = u.ID + u.fieldMap["game_id"] = u.GameID + u.fieldMap["game_role_name"] = u.GameRoleName + u.fieldMap["game_role_id"] = u.GameRoleID + u.fieldMap["desc"] = u.Desc + u.fieldMap["icon"] = u.Icon + u.fieldMap["logo"] = u.Logo + u.fieldMap["state"] = u.State + u.fieldMap["delete_at"] = u.DeleteAt + u.fieldMap["create_at"] = u.CreateAt + u.fieldMap["create_by"] = u.CreateBy + u.fieldMap["update_at"] = u.UpdateAt + u.fieldMap["update_by"] = u.UpdateBy +} + +func (u userGameRole) clone(db *gorm.DB) userGameRole { + u.userGameRoleDo.ReplaceConnPool(db.Statement.ConnPool) + return u +} + +func (u userGameRole) replaceDB(db *gorm.DB) userGameRole { + u.userGameRoleDo.ReplaceDB(db) + return u +} + +type userGameRoleDo struct{ gen.DO } + +type IUserGameRoleDo interface { + gen.SubQuery + Debug() IUserGameRoleDo + WithContext(ctx context.Context) IUserGameRoleDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IUserGameRoleDo + WriteDB() IUserGameRoleDo + As(alias string) gen.Dao + Session(config *gorm.Session) IUserGameRoleDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IUserGameRoleDo + Not(conds ...gen.Condition) IUserGameRoleDo + Or(conds ...gen.Condition) IUserGameRoleDo + Select(conds ...field.Expr) IUserGameRoleDo + Where(conds ...gen.Condition) IUserGameRoleDo + Order(conds ...field.Expr) IUserGameRoleDo + Distinct(cols ...field.Expr) IUserGameRoleDo + Omit(cols ...field.Expr) IUserGameRoleDo + Join(table schema.Tabler, on ...field.Expr) IUserGameRoleDo + LeftJoin(table schema.Tabler, on ...field.Expr) IUserGameRoleDo + RightJoin(table schema.Tabler, on ...field.Expr) IUserGameRoleDo + Group(cols ...field.Expr) IUserGameRoleDo + Having(conds ...gen.Condition) IUserGameRoleDo + Limit(limit int) IUserGameRoleDo + Offset(offset int) IUserGameRoleDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IUserGameRoleDo + Unscoped() IUserGameRoleDo + Create(values ...*model.UserGameRole) error + CreateInBatches(values []*model.UserGameRole, batchSize int) error + Save(values ...*model.UserGameRole) error + First() (*model.UserGameRole, error) + Take() (*model.UserGameRole, error) + Last() (*model.UserGameRole, error) + Find() ([]*model.UserGameRole, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.UserGameRole, err error) + FindInBatches(result *[]*model.UserGameRole, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.UserGameRole) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IUserGameRoleDo + Assign(attrs ...field.AssignExpr) IUserGameRoleDo + Joins(fields ...field.RelationField) IUserGameRoleDo + Preload(fields ...field.RelationField) IUserGameRoleDo + FirstOrInit() (*model.UserGameRole, error) + FirstOrCreate() (*model.UserGameRole, error) + FindByPage(offset int, limit int) (result []*model.UserGameRole, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IUserGameRoleDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (u userGameRoleDo) Debug() IUserGameRoleDo { + return u.withDO(u.DO.Debug()) +} + +func (u userGameRoleDo) WithContext(ctx context.Context) IUserGameRoleDo { + return u.withDO(u.DO.WithContext(ctx)) +} + +func (u userGameRoleDo) ReadDB() IUserGameRoleDo { + return u.Clauses(dbresolver.Read) +} + +func (u userGameRoleDo) WriteDB() IUserGameRoleDo { + return u.Clauses(dbresolver.Write) +} + +func (u userGameRoleDo) Session(config *gorm.Session) IUserGameRoleDo { + return u.withDO(u.DO.Session(config)) +} + +func (u userGameRoleDo) Clauses(conds ...clause.Expression) IUserGameRoleDo { + return u.withDO(u.DO.Clauses(conds...)) +} + +func (u userGameRoleDo) Returning(value interface{}, columns ...string) IUserGameRoleDo { + return u.withDO(u.DO.Returning(value, columns...)) +} + +func (u userGameRoleDo) Not(conds ...gen.Condition) IUserGameRoleDo { + return u.withDO(u.DO.Not(conds...)) +} + +func (u userGameRoleDo) Or(conds ...gen.Condition) IUserGameRoleDo { + return u.withDO(u.DO.Or(conds...)) +} + +func (u userGameRoleDo) Select(conds ...field.Expr) IUserGameRoleDo { + return u.withDO(u.DO.Select(conds...)) +} + +func (u userGameRoleDo) Where(conds ...gen.Condition) IUserGameRoleDo { + return u.withDO(u.DO.Where(conds...)) +} + +func (u userGameRoleDo) Order(conds ...field.Expr) IUserGameRoleDo { + return u.withDO(u.DO.Order(conds...)) +} + +func (u userGameRoleDo) Distinct(cols ...field.Expr) IUserGameRoleDo { + return u.withDO(u.DO.Distinct(cols...)) +} + +func (u userGameRoleDo) Omit(cols ...field.Expr) IUserGameRoleDo { + return u.withDO(u.DO.Omit(cols...)) +} + +func (u userGameRoleDo) Join(table schema.Tabler, on ...field.Expr) IUserGameRoleDo { + return u.withDO(u.DO.Join(table, on...)) +} + +func (u userGameRoleDo) LeftJoin(table schema.Tabler, on ...field.Expr) IUserGameRoleDo { + return u.withDO(u.DO.LeftJoin(table, on...)) +} + +func (u userGameRoleDo) RightJoin(table schema.Tabler, on ...field.Expr) IUserGameRoleDo { + return u.withDO(u.DO.RightJoin(table, on...)) +} + +func (u userGameRoleDo) Group(cols ...field.Expr) IUserGameRoleDo { + return u.withDO(u.DO.Group(cols...)) +} + +func (u userGameRoleDo) Having(conds ...gen.Condition) IUserGameRoleDo { + return u.withDO(u.DO.Having(conds...)) +} + +func (u userGameRoleDo) Limit(limit int) IUserGameRoleDo { + return u.withDO(u.DO.Limit(limit)) +} + +func (u userGameRoleDo) Offset(offset int) IUserGameRoleDo { + return u.withDO(u.DO.Offset(offset)) +} + +func (u userGameRoleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IUserGameRoleDo { + return u.withDO(u.DO.Scopes(funcs...)) +} + +func (u userGameRoleDo) Unscoped() IUserGameRoleDo { + return u.withDO(u.DO.Unscoped()) +} + +func (u userGameRoleDo) Create(values ...*model.UserGameRole) error { + if len(values) == 0 { + return nil + } + return u.DO.Create(values) +} + +func (u userGameRoleDo) CreateInBatches(values []*model.UserGameRole, batchSize int) error { + return u.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (u userGameRoleDo) Save(values ...*model.UserGameRole) error { + if len(values) == 0 { + return nil + } + return u.DO.Save(values) +} + +func (u userGameRoleDo) First() (*model.UserGameRole, error) { + if result, err := u.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRole), nil + } +} + +func (u userGameRoleDo) Take() (*model.UserGameRole, error) { + if result, err := u.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRole), nil + } +} + +func (u userGameRoleDo) Last() (*model.UserGameRole, error) { + if result, err := u.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRole), nil + } +} + +func (u userGameRoleDo) Find() ([]*model.UserGameRole, error) { + result, err := u.DO.Find() + return result.([]*model.UserGameRole), err +} + +func (u userGameRoleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.UserGameRole, err error) { + buf := make([]*model.UserGameRole, 0, batchSize) + err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (u userGameRoleDo) FindInBatches(result *[]*model.UserGameRole, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return u.DO.FindInBatches(result, batchSize, fc) +} + +func (u userGameRoleDo) Attrs(attrs ...field.AssignExpr) IUserGameRoleDo { + return u.withDO(u.DO.Attrs(attrs...)) +} + +func (u userGameRoleDo) Assign(attrs ...field.AssignExpr) IUserGameRoleDo { + return u.withDO(u.DO.Assign(attrs...)) +} + +func (u userGameRoleDo) Joins(fields ...field.RelationField) IUserGameRoleDo { + for _, _f := range fields { + u = *u.withDO(u.DO.Joins(_f)) + } + return &u +} + +func (u userGameRoleDo) Preload(fields ...field.RelationField) IUserGameRoleDo { + for _, _f := range fields { + u = *u.withDO(u.DO.Preload(_f)) + } + return &u +} + +func (u userGameRoleDo) FirstOrInit() (*model.UserGameRole, error) { + if result, err := u.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRole), nil + } +} + +func (u userGameRoleDo) FirstOrCreate() (*model.UserGameRole, error) { + if result, err := u.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRole), nil + } +} + +func (u userGameRoleDo) FindByPage(offset int, limit int) (result []*model.UserGameRole, count int64, err error) { + result, err = u.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = u.Offset(-1).Limit(-1).Count() + return +} + +func (u userGameRoleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = u.Count() + if err != nil { + return + } + + err = u.Offset(offset).Limit(limit).Scan(result) + return +} + +func (u userGameRoleDo) Scan(result interface{}) (err error) { + return u.DO.Scan(result) +} + +func (u userGameRoleDo) Delete(models ...*model.UserGameRole) (result gen.ResultInfo, err error) { + return u.DO.Delete(models) +} + +func (u *userGameRoleDo) withDO(do gen.Dao) *userGameRoleDo { + u.DO = *do.(*gen.DO) + return u +} diff --git a/pkg/repo/user_game_role_prop.gen.go b/pkg/repo/user_game_role_prop.gen.go new file mode 100644 index 0000000..0d93df6 --- /dev/null +++ b/pkg/repo/user_game_role_prop.gen.go @@ -0,0 +1,453 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package repo + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "servicebase/pkg/model" +) + +func newUserGameRoleProp(db *gorm.DB, opts ...gen.DOOption) userGameRoleProp { + _userGameRoleProp := userGameRoleProp{} + + _userGameRoleProp.userGameRolePropDo.UseDB(db, opts...) + _userGameRoleProp.userGameRolePropDo.UseModel(&model.UserGameRoleProp{}) + + tableName := _userGameRoleProp.userGameRolePropDo.TableName() + _userGameRoleProp.ALL = field.NewAsterisk(tableName) + _userGameRoleProp.ID = field.NewString(tableName, "id") + _userGameRoleProp.UserID = field.NewString(tableName, "user_id") + _userGameRoleProp.GameID = field.NewString(tableName, "game_id") + _userGameRoleProp.RoleID = field.NewString(tableName, "role_id") + _userGameRoleProp.Type = field.NewString(tableName, "type") + _userGameRoleProp.Title = field.NewString(tableName, "title") + _userGameRoleProp.Content = field.NewString(tableName, "content") + _userGameRoleProp.URL = field.NewString(tableName, "url") + _userGameRoleProp.Ext = field.NewString(tableName, "ext") + _userGameRoleProp.State = field.NewInt32(tableName, "state") + _userGameRoleProp.Sort = field.NewInt32(tableName, "sort") + _userGameRoleProp.DeleteAt = field.NewField(tableName, "delete_at") + _userGameRoleProp.CreateAt = field.NewTime(tableName, "create_at") + _userGameRoleProp.CreateBy = field.NewString(tableName, "create_by") + _userGameRoleProp.UpdateAt = field.NewTime(tableName, "update_at") + _userGameRoleProp.UpdateBy = field.NewString(tableName, "update_by") + + _userGameRoleProp.fillFieldMap() + + return _userGameRoleProp +} + +// userGameRoleProp 用户的游戏角色属性 +type userGameRoleProp struct { + userGameRolePropDo userGameRolePropDo + + ALL field.Asterisk + ID field.String // 业务ID + UserID field.String // 用户ID + GameID field.String // 游戏 + RoleID field.String // 角色ID,user_game_role的ID + Type field.String // TEXT=文字 SKIN=皮肤 + Title field.String // 标题 + Content field.String // 内容 + URL field.String // 链接 + Ext field.String // 扩展字段 + State field.Int32 // 状态1=启用 2=禁用 + Sort field.Int32 // 排序 + DeleteAt field.Field // del标志 + CreateAt field.Time // 创建时间 + CreateBy field.String // 创建人 + UpdateAt field.Time // 更新时间 + UpdateBy field.String // 更新人 + + fieldMap map[string]field.Expr +} + +func (u userGameRoleProp) Table(newTableName string) *userGameRoleProp { + u.userGameRolePropDo.UseTable(newTableName) + return u.updateTableName(newTableName) +} + +func (u userGameRoleProp) As(alias string) *userGameRoleProp { + u.userGameRolePropDo.DO = *(u.userGameRolePropDo.As(alias).(*gen.DO)) + return u.updateTableName(alias) +} + +func (u *userGameRoleProp) updateTableName(table string) *userGameRoleProp { + u.ALL = field.NewAsterisk(table) + u.ID = field.NewString(table, "id") + u.UserID = field.NewString(table, "user_id") + u.GameID = field.NewString(table, "game_id") + u.RoleID = field.NewString(table, "role_id") + u.Type = field.NewString(table, "type") + u.Title = field.NewString(table, "title") + u.Content = field.NewString(table, "content") + u.URL = field.NewString(table, "url") + u.Ext = field.NewString(table, "ext") + u.State = field.NewInt32(table, "state") + u.Sort = field.NewInt32(table, "sort") + u.DeleteAt = field.NewField(table, "delete_at") + u.CreateAt = field.NewTime(table, "create_at") + u.CreateBy = field.NewString(table, "create_by") + u.UpdateAt = field.NewTime(table, "update_at") + u.UpdateBy = field.NewString(table, "update_by") + + u.fillFieldMap() + + return u +} + +func (u *userGameRoleProp) WithContext(ctx context.Context) IUserGameRolePropDo { + return u.userGameRolePropDo.WithContext(ctx) +} + +func (u userGameRoleProp) TableName() string { return u.userGameRolePropDo.TableName() } + +func (u userGameRoleProp) Alias() string { return u.userGameRolePropDo.Alias() } + +func (u userGameRoleProp) Columns(cols ...field.Expr) gen.Columns { + return u.userGameRolePropDo.Columns(cols...) +} + +func (u *userGameRoleProp) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := u.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (u *userGameRoleProp) fillFieldMap() { + u.fieldMap = make(map[string]field.Expr, 16) + u.fieldMap["id"] = u.ID + u.fieldMap["user_id"] = u.UserID + u.fieldMap["game_id"] = u.GameID + u.fieldMap["role_id"] = u.RoleID + u.fieldMap["type"] = u.Type + u.fieldMap["title"] = u.Title + u.fieldMap["content"] = u.Content + u.fieldMap["url"] = u.URL + u.fieldMap["ext"] = u.Ext + u.fieldMap["state"] = u.State + u.fieldMap["sort"] = u.Sort + u.fieldMap["delete_at"] = u.DeleteAt + u.fieldMap["create_at"] = u.CreateAt + u.fieldMap["create_by"] = u.CreateBy + u.fieldMap["update_at"] = u.UpdateAt + u.fieldMap["update_by"] = u.UpdateBy +} + +func (u userGameRoleProp) clone(db *gorm.DB) userGameRoleProp { + u.userGameRolePropDo.ReplaceConnPool(db.Statement.ConnPool) + return u +} + +func (u userGameRoleProp) replaceDB(db *gorm.DB) userGameRoleProp { + u.userGameRolePropDo.ReplaceDB(db) + return u +} + +type userGameRolePropDo struct{ gen.DO } + +type IUserGameRolePropDo interface { + gen.SubQuery + Debug() IUserGameRolePropDo + WithContext(ctx context.Context) IUserGameRolePropDo + WithResult(fc func(tx gen.Dao)) gen.ResultInfo + ReplaceDB(db *gorm.DB) + ReadDB() IUserGameRolePropDo + WriteDB() IUserGameRolePropDo + As(alias string) gen.Dao + Session(config *gorm.Session) IUserGameRolePropDo + Columns(cols ...field.Expr) gen.Columns + Clauses(conds ...clause.Expression) IUserGameRolePropDo + Not(conds ...gen.Condition) IUserGameRolePropDo + Or(conds ...gen.Condition) IUserGameRolePropDo + Select(conds ...field.Expr) IUserGameRolePropDo + Where(conds ...gen.Condition) IUserGameRolePropDo + Order(conds ...field.Expr) IUserGameRolePropDo + Distinct(cols ...field.Expr) IUserGameRolePropDo + Omit(cols ...field.Expr) IUserGameRolePropDo + Join(table schema.Tabler, on ...field.Expr) IUserGameRolePropDo + LeftJoin(table schema.Tabler, on ...field.Expr) IUserGameRolePropDo + RightJoin(table schema.Tabler, on ...field.Expr) IUserGameRolePropDo + Group(cols ...field.Expr) IUserGameRolePropDo + Having(conds ...gen.Condition) IUserGameRolePropDo + Limit(limit int) IUserGameRolePropDo + Offset(offset int) IUserGameRolePropDo + Count() (count int64, err error) + Scopes(funcs ...func(gen.Dao) gen.Dao) IUserGameRolePropDo + Unscoped() IUserGameRolePropDo + Create(values ...*model.UserGameRoleProp) error + CreateInBatches(values []*model.UserGameRoleProp, batchSize int) error + Save(values ...*model.UserGameRoleProp) error + First() (*model.UserGameRoleProp, error) + Take() (*model.UserGameRoleProp, error) + Last() (*model.UserGameRoleProp, error) + Find() ([]*model.UserGameRoleProp, error) + FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.UserGameRoleProp, err error) + FindInBatches(result *[]*model.UserGameRoleProp, batchSize int, fc func(tx gen.Dao, batch int) error) error + Pluck(column field.Expr, dest interface{}) error + Delete(...*model.UserGameRoleProp) (info gen.ResultInfo, err error) + Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + Updates(value interface{}) (info gen.ResultInfo, err error) + UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error) + UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error) + UpdateColumns(value interface{}) (info gen.ResultInfo, err error) + UpdateFrom(q gen.SubQuery) gen.Dao + Attrs(attrs ...field.AssignExpr) IUserGameRolePropDo + Assign(attrs ...field.AssignExpr) IUserGameRolePropDo + Joins(fields ...field.RelationField) IUserGameRolePropDo + Preload(fields ...field.RelationField) IUserGameRolePropDo + FirstOrInit() (*model.UserGameRoleProp, error) + FirstOrCreate() (*model.UserGameRoleProp, error) + FindByPage(offset int, limit int) (result []*model.UserGameRoleProp, count int64, err error) + ScanByPage(result interface{}, offset int, limit int) (count int64, err error) + Scan(result interface{}) (err error) + Returning(value interface{}, columns ...string) IUserGameRolePropDo + UnderlyingDB() *gorm.DB + schema.Tabler +} + +func (u userGameRolePropDo) Debug() IUserGameRolePropDo { + return u.withDO(u.DO.Debug()) +} + +func (u userGameRolePropDo) WithContext(ctx context.Context) IUserGameRolePropDo { + return u.withDO(u.DO.WithContext(ctx)) +} + +func (u userGameRolePropDo) ReadDB() IUserGameRolePropDo { + return u.Clauses(dbresolver.Read) +} + +func (u userGameRolePropDo) WriteDB() IUserGameRolePropDo { + return u.Clauses(dbresolver.Write) +} + +func (u userGameRolePropDo) Session(config *gorm.Session) IUserGameRolePropDo { + return u.withDO(u.DO.Session(config)) +} + +func (u userGameRolePropDo) Clauses(conds ...clause.Expression) IUserGameRolePropDo { + return u.withDO(u.DO.Clauses(conds...)) +} + +func (u userGameRolePropDo) Returning(value interface{}, columns ...string) IUserGameRolePropDo { + return u.withDO(u.DO.Returning(value, columns...)) +} + +func (u userGameRolePropDo) Not(conds ...gen.Condition) IUserGameRolePropDo { + return u.withDO(u.DO.Not(conds...)) +} + +func (u userGameRolePropDo) Or(conds ...gen.Condition) IUserGameRolePropDo { + return u.withDO(u.DO.Or(conds...)) +} + +func (u userGameRolePropDo) Select(conds ...field.Expr) IUserGameRolePropDo { + return u.withDO(u.DO.Select(conds...)) +} + +func (u userGameRolePropDo) Where(conds ...gen.Condition) IUserGameRolePropDo { + return u.withDO(u.DO.Where(conds...)) +} + +func (u userGameRolePropDo) Order(conds ...field.Expr) IUserGameRolePropDo { + return u.withDO(u.DO.Order(conds...)) +} + +func (u userGameRolePropDo) Distinct(cols ...field.Expr) IUserGameRolePropDo { + return u.withDO(u.DO.Distinct(cols...)) +} + +func (u userGameRolePropDo) Omit(cols ...field.Expr) IUserGameRolePropDo { + return u.withDO(u.DO.Omit(cols...)) +} + +func (u userGameRolePropDo) Join(table schema.Tabler, on ...field.Expr) IUserGameRolePropDo { + return u.withDO(u.DO.Join(table, on...)) +} + +func (u userGameRolePropDo) LeftJoin(table schema.Tabler, on ...field.Expr) IUserGameRolePropDo { + return u.withDO(u.DO.LeftJoin(table, on...)) +} + +func (u userGameRolePropDo) RightJoin(table schema.Tabler, on ...field.Expr) IUserGameRolePropDo { + return u.withDO(u.DO.RightJoin(table, on...)) +} + +func (u userGameRolePropDo) Group(cols ...field.Expr) IUserGameRolePropDo { + return u.withDO(u.DO.Group(cols...)) +} + +func (u userGameRolePropDo) Having(conds ...gen.Condition) IUserGameRolePropDo { + return u.withDO(u.DO.Having(conds...)) +} + +func (u userGameRolePropDo) Limit(limit int) IUserGameRolePropDo { + return u.withDO(u.DO.Limit(limit)) +} + +func (u userGameRolePropDo) Offset(offset int) IUserGameRolePropDo { + return u.withDO(u.DO.Offset(offset)) +} + +func (u userGameRolePropDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IUserGameRolePropDo { + return u.withDO(u.DO.Scopes(funcs...)) +} + +func (u userGameRolePropDo) Unscoped() IUserGameRolePropDo { + return u.withDO(u.DO.Unscoped()) +} + +func (u userGameRolePropDo) Create(values ...*model.UserGameRoleProp) error { + if len(values) == 0 { + return nil + } + return u.DO.Create(values) +} + +func (u userGameRolePropDo) CreateInBatches(values []*model.UserGameRoleProp, batchSize int) error { + return u.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (u userGameRolePropDo) Save(values ...*model.UserGameRoleProp) error { + if len(values) == 0 { + return nil + } + return u.DO.Save(values) +} + +func (u userGameRolePropDo) First() (*model.UserGameRoleProp, error) { + if result, err := u.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRoleProp), nil + } +} + +func (u userGameRolePropDo) Take() (*model.UserGameRoleProp, error) { + if result, err := u.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRoleProp), nil + } +} + +func (u userGameRolePropDo) Last() (*model.UserGameRoleProp, error) { + if result, err := u.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRoleProp), nil + } +} + +func (u userGameRolePropDo) Find() ([]*model.UserGameRoleProp, error) { + result, err := u.DO.Find() + return result.([]*model.UserGameRoleProp), err +} + +func (u userGameRolePropDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.UserGameRoleProp, err error) { + buf := make([]*model.UserGameRoleProp, 0, batchSize) + err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (u userGameRolePropDo) FindInBatches(result *[]*model.UserGameRoleProp, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return u.DO.FindInBatches(result, batchSize, fc) +} + +func (u userGameRolePropDo) Attrs(attrs ...field.AssignExpr) IUserGameRolePropDo { + return u.withDO(u.DO.Attrs(attrs...)) +} + +func (u userGameRolePropDo) Assign(attrs ...field.AssignExpr) IUserGameRolePropDo { + return u.withDO(u.DO.Assign(attrs...)) +} + +func (u userGameRolePropDo) Joins(fields ...field.RelationField) IUserGameRolePropDo { + for _, _f := range fields { + u = *u.withDO(u.DO.Joins(_f)) + } + return &u +} + +func (u userGameRolePropDo) Preload(fields ...field.RelationField) IUserGameRolePropDo { + for _, _f := range fields { + u = *u.withDO(u.DO.Preload(_f)) + } + return &u +} + +func (u userGameRolePropDo) FirstOrInit() (*model.UserGameRoleProp, error) { + if result, err := u.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRoleProp), nil + } +} + +func (u userGameRolePropDo) FirstOrCreate() (*model.UserGameRoleProp, error) { + if result, err := u.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.UserGameRoleProp), nil + } +} + +func (u userGameRolePropDo) FindByPage(offset int, limit int) (result []*model.UserGameRoleProp, count int64, err error) { + result, err = u.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = u.Offset(-1).Limit(-1).Count() + return +} + +func (u userGameRolePropDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = u.Count() + if err != nil { + return + } + + err = u.Offset(offset).Limit(limit).Scan(result) + return +} + +func (u userGameRolePropDo) Scan(result interface{}) (err error) { + return u.DO.Scan(result) +} + +func (u userGameRolePropDo) Delete(models ...*model.UserGameRoleProp) (result gen.ResultInfo, err error) { + return u.DO.Delete(models) +} + +func (u *userGameRolePropDo) withDO(do gen.Dao) *userGameRolePropDo { + u.DO = *do.(*gen.DO) + return u +} diff --git a/pkg/req/abstract.go b/pkg/req/abstract.go new file mode 100644 index 0000000..9319600 --- /dev/null +++ b/pkg/req/abstract.go @@ -0,0 +1,125 @@ +package req + +import ( + "servicebase/pkg/constant" + "servicebase/pkg/tools" + "errors" + + "github.com/gin-gonic/gin" +) + +const ( + defaultPage = 1 + defaultSize = 10 +) + +type Page struct { + Page int64 `json:"page" form:"page" uri:"page"` + Size int64 `json:"size" form:"size" uri:"size"` +} + +func (p *Page) check() { + if p.Page < 1 { + p.Page = defaultPage + } + if p.Size == 0 { + p.Size = defaultSize + } else if p.Size < 0 { + p.Size = 9999 + } +} + +func (p *Page) Check() error { + p.check() + return nil +} + +func (p *Page) Offset() int { + p.check() + return int(p.Page*p.Size - p.Size) +} + +func (p *Page) Limit() int { + p.check() + return int(p.Size) +} + +func TID(c *gin.Context) string { + return c.GetHeader(constant.TenantId) +} + +func SID(c *gin.Context) string { + return c.GetHeader(constant.ScopeId) +} + +func UID(c *gin.Context) string { + return c.GetHeader(tools.HeaderUserId) +} + +func CLI(c *gin.Context) string { + return c.GetHeader(tools.HeaderClient) +} + +type BaseQuery struct { + IndustryID string `json:"industry_id" form:"industry_id" uri:"industry_id"` + PeriodID string `json:"period_id" form:"period_id" uri:"period_id"` + CityID string `json:"city_id" form:"city_id" uri:"city_id"` + ProvinceID string `json:"province_id" form:"province_id" uri:"province_id"` + RiskLevel string `json:"risk_level" form:"risk_level" uri:"risk_level"` +} + +type KeyBody struct { + Key string `json:"key" form:"key" uri:"key"` +} + +type IDBody struct { + ID string `json:"id" form:"id" uri:"id"` // put方法时通常为url参数,post方法时通常为json参数 +} + +type ID32Body struct { + ID int32 `json:"id" form:"id" uri:"id"` // put方法时通常为url参数,post方法时通常为json参数 +} + +func (d IDBody) Check() error { + if len(d.ID) == 0 { + return errors.New("ID不能为空") + } + return nil +} + +type ClanIDBody struct { + ClanID string `json:"clan_id" form:"clan_id" uri:"clan_id"` // put方法时通常为url参数,post方法时通常为json参数 +} + +func (d ClanIDBody) Check() error { + if len(d.ClanID) == 0 { + return errors.New("家ID不能为空") + } + return nil +} + +type AreaIDBody struct { + IDBody + KeyBody + AreaID string `json:"area_id" form:"area_id" uri:"area_id"` +} + +type TenantUserLoginBody struct { + Username string `json:"username"` + Password string `json:"password"` +} + +type TenantUserUpdatePwdBody struct { + Pre string `json:"pre"` + New string `json:"new"` +} + +type PageWithKeyBody struct { + Page + KeyBody +} + +type PageWithIDBody struct { + Page + IDBody +} diff --git a/pkg/req/admin_act.go b/pkg/req/admin_act.go new file mode 100644 index 0000000..cbc9f16 --- /dev/null +++ b/pkg/req/admin_act.go @@ -0,0 +1,15 @@ +package req + +import "servicebase/pkg/datasource/fields" + +type News struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + TypeID string `gorm:"column:type_id;type:char(32);not null;comment:类型" json:"type_id"` // 类型 + Title string `gorm:"column:title;type:varchar(255);not null;comment:标题" json:"title"` // 标题 + HeadImg string `gorm:"column:head_img;type:varchar(255);not null;comment:头图" json:"head_img"` // 头图 + Content string `gorm:"column:content;type:longtext;not null;comment:内容:富文本" json:"content"` // 内容:富文本 + Sort int32 `gorm:"column:sort;type:int;not null;default:999;comment:排序" json:"sort"` // 排序 + Position int32 `gorm:"column:position;type:int;not null;default:1;comment:位置1=列表 2=banner" json:"position"` // 位置1=列表 2=banner + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + NewsDate fields.Time `gorm:"column:news_date;type:datetime;not null;comment:新闻时间" json:"news_date"` // 新闻时间 +} diff --git a/pkg/req/admin_system.go b/pkg/req/admin_system.go new file mode 100644 index 0000000..15cfb05 --- /dev/null +++ b/pkg/req/admin_system.go @@ -0,0 +1,90 @@ +package req + +import ( + "errors" + "servicebase/pkg/datasource/fields" +) + +type SystemSettingPageReq struct { + Page +} + +type DashboardBasicReq struct { + Date *fields.Date +} + +type SystemSettingAddReq struct { + Name string `json:"name"` // 配置名称 + Key string `json:"key"` // 配置Key + Value string `json:"value"` // 配置值 + Desc string `json:"desc"` // 描述说明 + Ext string `json:"ext"` // 扩展信息 +} + +func (d *SystemSettingAddReq) Check() error { + if len(d.Name) == 0 { + return errors.New("名称不能为空") + } + if len(d.Key) == 0 { + return errors.New("配置Key不能为空") + } + return nil +} + +type SystemSettingUpdateReq struct { + IDBody + SystemSettingAddReq +} + +func (d *SystemSettingUpdateReq) Check() error { + if len(d.ID) == 0 { + return errors.New("ID不能为空") + } + if len(d.Name) == 0 { + return errors.New("名称不能为空") + } + if len(d.Key) == 0 { + return errors.New("配置Key不能为空") + } + return nil +} + +type AdminSystemContentPageReq struct { + Page +} + +type AdminSystemContentAddReq struct { + Name string `json:"name"` // 配置名称 + Key string `json:"key"` // 配置Key + Value string `json:"value"` // 配置值 + Desc string `json:"desc"` // 描述说明 + Ext string `json:"ext"` // 扩展信息 +} + +func (d *AdminSystemContentAddReq) Check() error { + if len(d.Name) == 0 { + return errors.New("名称不能为空") + } + if len(d.Key) == 0 { + return errors.New("配置Key不能为空") + } + return nil +} + +type AdminSystemContentUpdateReq struct { + IDBody + AdminSystemContentAddReq +} + +func (d *AdminSystemContentUpdateReq) Check() error { + if len(d.ID) == 0 { + return errors.New("ID不能为空") + } + if len(d.Name) == 0 { + return errors.New("名称不能为空") + } + if len(d.Key) == 0 { + return errors.New("配置Key不能为空") + } + return nil +} diff --git a/pkg/req/admin_trade.go b/pkg/req/admin_trade.go new file mode 100644 index 0000000..05e0a66 --- /dev/null +++ b/pkg/req/admin_trade.go @@ -0,0 +1,6 @@ +package req + +type GameSkinPageReq struct { + PageWithKeyBody + GameName string `json:"game_name"` +} diff --git a/pkg/req/app_user.go b/pkg/req/app_user.go new file mode 100644 index 0000000..04e55d5 --- /dev/null +++ b/pkg/req/app_user.go @@ -0,0 +1,227 @@ +package req + +import ( + "errors" + "servicebase/pkg/datasource/fields" +) + +// 登录请求对象 +type SignInRequest struct { + Email string `json:"email"` + Password string `json:"password"` +} + +func (req *SignInRequest) CheckParameter() (err error) { + + if len(req.Email) == 0 || len(req.Password) == 0 { + err = errors.New("邮箱和密码不能为空") + return + } + + return nil +} + +// 注册请求对象 +type SignUpRequest struct { + UserType string `json:"userType"` + Truename string `json:"truename"` + Nickname string `json:"nickname"` + Password string `json:"password"` + Phone string `json:"phone"` + Email string `json:"email"` + BirthYear string `json:"birthYear"` + BirthMonth string `json:"birthMonth"` + BirthDay string `json:"birthday"` + Gender string `json:"gender"` + Position string `json:"position"` + PostCode string `json:"postCode"` + Prefecture string `json:"prefecture"` + Address string `json:"address"` + Building string `json:"building"` + InvoiceType string `json:"invoiceType"` + InvoiceNo string `json:"invoiceNo"` +} + +func (req *SignUpRequest) CheckParameter() (err error) { + + if len(req.UserType) == 0 { + err = errors.New("用户类型不能为空") + return + } + if req.UserType == "P" { + if len(req.InvoiceType) == 0 { + err = errors.New("开发票类型不能为空") + return + } + } + if len(req.Truename) == 0 { + err = errors.New("真实姓名不能为空") + return + } + if len(req.Nickname) == 0 { + err = errors.New("昵称不能为空") + return + } + if len(req.Password) == 0 { + err = errors.New("密码不能为空") + return + } + if len(req.Phone) == 0 { + err = errors.New("手机号不能为空") + return + } + if len(req.Email) == 0 { + err = errors.New("邮箱不能为空") + return + } + if len(req.BirthYear) == 0 { + err = errors.New("出生年不能为空") + return + } + if len(req.BirthMonth) == 0 { + err = errors.New("出生月不能为空") + return + } + if len(req.BirthDay) == 0 { + err = errors.New("出生日不能为空") + return + } + if len(req.Gender) == 0 { + err = errors.New("性别不能为空") + return + } + if len(req.Position) == 0 { + err = errors.New("职位不能为空") + return + } + if len(req.PostCode) == 0 { + err = errors.New("邮编不能为空") + return + } + if len(req.Prefecture) == 0 { + err = errors.New("省不能为空") + return + } + if len(req.Address) == 0 { + err = errors.New("地址不能为空") + return + } + + return nil +} + +type ReportAllReq struct { + Date fields.Date `json:"date" form:"date" uri:"date"` +} + +// 登录请求对象 +type UserInfoUpdateReq struct { + // UserType string `gorm:"column:user_type;type:char(1);not null;comment:P=person C= crop" json:"user_type"` + Truename string `gorm:"column:truename;type:varchar(60);not null" json:"truename"` + Nickname string `gorm:"column:nickname;type:varchar(60);not null" json:"nickname"` + Phone string `gorm:"column:phone;type:varchar(20);not null" json:"phone"` + Email string `gorm:"column:email;type:varchar(100);not null;uniqueIndex:EMAIL_idx,priority:1" json:"email"` + Birthday string `gorm:"column:birthday;type:varchar(20);not null" json:"birthday"` + Gender string `gorm:"column:gender;type:char(1);not null" json:"gender"` + Position string `gorm:"column:position;type:varchar(100);not null" json:"position"` + PostCode string `gorm:"column:post_code;type:varchar(20);not null" json:"post_code"` + Prefecture string `gorm:"column:prefecture;type:varchar(100);not null" json:"prefecture"` + Address string `gorm:"column:address;type:varchar(255);not null" json:"address"` + Building string `gorm:"column:building;type:varchar(100);not null" json:"building"` + InvoiceType string `gorm:"column:invoice_type;type:char(1);not null;comment:发票类型 1=可开 2=不可开" json:"invoice_type"` + InvoiceNo string `gorm:"column:invoice_no;type:varchar(50);not null;comment:发票编号" json:"invoice_no"` + AccountBank string `gorm:"column:account_bank;type:varchar(255);not null;comment:开户银行" json:"account_bank"` + AccountBranch string `gorm:"column:account_branch;type:varchar(255);not null;comment:开户支行" json:"account_branch"` + AccountType string `gorm:"column:account_type;type:char(1);not null;comment:账户类型 1= 普通預金 2=当座預金" json:"account_type"` + AccountNo string `gorm:"column:account_no;type:varchar(100);not null;comment:银行账号" json:"account_no"` + AccountName string `gorm:"column:account_name;type:varchar(100);not null;comment:开户人姓名" json:"account_name"` + PersonalDocType string `gorm:"column:personal_doc_type;type:char(1);not null;comment:1=居民票的复印件2=驾驶证3=护照4=保险证5=在留卡" json:"personal_doc_type"` + PersonalImage string `gorm:"column:personal_image;type:varchar(255);not null;comment:身份证照片" json:"personal_image"` + PersonalEndDate string `gorm:"column:personal_end_date;type:varchar(255);not null;comment:身份证有效期" json:"personal_end_date"` + PersonalImage2 string `gorm:"column:personal_image_2;type:varchar(255);not null;comment:身份证照片" json:"personal_image_2"` +} + +func (req *UserInfoUpdateReq) Check() (err error) { + if len(req.Email) == 0 { + err = errors.New("邮箱不能为空") + return + } + + return nil +} + +type UserPwdUpdateReq struct { + PrePassowrd string `json:"pre_password"` + NewPassowrd string `json:"new_password"` +} + +func (req *UserPwdUpdateReq) Check() (err error) { + if len(req.NewPassowrd) == 0 { + err = errors.New("新密码不能为空") + return + } + return nil +} + +type UserLogOffReq struct { + Passowrd string `json:"password"` +} + +func (req *UserLogOffReq) Check() (err error) { + if len(req.Passowrd) == 0 { + err = errors.New("密码不能为空") + return + } + return nil +} + +type UserPwdResetReq struct { + Email string `json:"email"` +} + +func (req *UserPwdResetReq) Check() (err error) { + if len(req.Email) == 0 { + err = errors.New("邮箱不能为空") + return + } + return nil +} + +type UserPwdResetCommitReq struct { + Code string `json:"code"` // 邮件中url的代码 + NewPassword string `json:"new_password"` // 新密码 +} + +func (req *UserPwdResetCommitReq) Check() (err error) { + if len(req.NewPassword) == 0 { + err = errors.New("新密码不能为空") + return + } + return nil +} + +type UserActiveReq struct { + UserId string `json:"userId" uri:"userId"` // 邮件中url的代码 +} + +func (req *UserActiveReq) Check() (err error) { + if len(req.UserId) == 0 { + err = errors.New("不能为空") + return + } + return nil +} + +type AppUserAddApplyList struct { + Page + ClanIDBody + Direct string `json:"direct"` // send 发出的申请 receive 收到的申请 +} + +func (req *AppUserAddApplyList) Check() (err error) { + req.Page.check() + // if err = req.ClanIDBody.Check(); err != nil { + // return + // } + return nil +} diff --git a/pkg/req/app_user_clan.go b/pkg/req/app_user_clan.go new file mode 100644 index 0000000..fc2fec3 --- /dev/null +++ b/pkg/req/app_user_clan.go @@ -0,0 +1,115 @@ +package req + +import ( + "errors" +) + +type AppClanCreate struct { + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` + Sign string `gorm:"column:sign;type:varchar(255);not null;comment:签名" json:"sign"` + Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"avatar"` +} + +func (req *AppClanCreate) Check() (err error) { + if len(req.Nickname) == 0 { + err = errors.New("名称不能为空") + return + } + return nil +} + +type AppClanUpdate struct { + IDBody + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` + Sign string `gorm:"column:sign;type:varchar(255);not null;comment:签名" json:"sign"` + Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"avatar"` +} + +func (req *AppClanUpdate) Check() (err error) { + if len(req.Nickname) == 0 { + err = errors.New("名称不能为空") + return + } + return nil +} + +type AppClanMemberApplyList struct { + Page + ClanIDBody + Direct string `json:"direct"` // send 发出的申请 receive 收到的申请 +} + +func (req *AppClanMemberApplyList) Check() (err error) { + req.Page.check() + // if err = req.ClanIDBody.Check(); err != nil { + // return + // } + return nil +} + +type AppClanMemberInvite struct { + ClanID string `json:"clan_id"` + UserID string `json:"user_id"` + Message string `json:"message"` +} + +func (req *AppClanMemberInvite) Check() (err error) { + if len(req.ClanID) == 0 { + err = errors.New("家不能为空") + return + } + if len(req.UserID) == 0 { + err = errors.New("用户ID不能为空") + return + } + return nil +} + +type AppClanMemberInviteAccept struct { + IDBody + Message string `json:"message"` +} + +func (req *AppClanMemberInviteAccept) Check() (err error) { + return req.IDBody.Check() +} + +type AppClanMemberInviteRefuse struct { + IDBody + Message string `json:"message"` +} + +func (req *AppClanMemberInviteRefuse) Check() (err error) { + return req.IDBody.Check() +} + +type AppClanMemberApply struct { + ClanID string `json:"clan_id"` + Message string `json:"message"` +} + +func (req *AppClanMemberApply) Check() (err error) { + if len(req.ClanID) == 0 { + err = errors.New("家不能为空") + return + } + return nil +} + +type AppClanMemberApplyAccept struct { + IDBody + Message string `json:"message"` +} + +func (req *AppClanMemberApplyAccept) Check() (err error) { + return req.IDBody.Check() +} + +type AppClanMemberApplyRefuse struct { + IDBody + Message string `json:"message"` +} + +func (req *AppClanMemberApplyRefuse) Check() (err error) { + return req.IDBody.Check() +} diff --git a/pkg/req/app_user_common.go b/pkg/req/app_user_common.go new file mode 100644 index 0000000..e6ded1a --- /dev/null +++ b/pkg/req/app_user_common.go @@ -0,0 +1,68 @@ +package req + +import "errors" + +type AppUserAuthReq struct { + Code string `json:"code" form:"code" uri:"code"` + No string `json:"no" form:"no" uri:"no"` + Pwd string `json:"pwd" form:"pwd" uri:"pwd"` +} + +func (d AppUserAuthReq) Check() error { + if len(d.Code) == 0 { + return errors.New("code不能为空") + } + return nil +} + +type AppUserRegisterReq struct { + Nickname string `json:"nickname" form:"nickname" uri:"nickname"` + Avatar string `json:"avatar" form:"avatar" uri:"avatar"` + Sex int32 `json:"sex" form:"sex" uri:"sex"` // 1=男 2=女 + Mobile string `json:"mobile" form:"mobile" uri:"mobile"` +} + +func (d AppUserRegisterReq) Check() error { + return nil +} + +type AppUserRealAuthByIDCardReq struct { + Avatar string `json:"avatar" form:"avatar" uri:"avatar"` + IDCard string `json:"id_card" form:"id_card" uri:"id_card"` + RealName string `json:"real_name" form:"real_name" uri:"real_name"` + Gender int32 `json:"gender" form:"gender" uri:"gender"` + Mobile string `json:"mobile" form:"mobile" uri:"mobile"` + // ImageFront string `json:"image_front" form:"image_front" uri:"image_front"` + // ImageBack string `json:"image_back" form:"image_back" uri:"image_back"` + // ImageOnHand string `json:"image_on_hand" form:"image_on_hand" uri:"image_on_hand"` +} + +func (d AppUserRealAuthByIDCardReq) Check() error { + return nil +} + +type AppUserRealAuthByIDCardVerifyReq struct { + RealAuthID string `json:"real_auth_id" form:"real_auth_id" uri:"real_auth_id"` + Code string `json:"code" form:"code" uri:"code"` +} + +func (d AppUserRealAuthByIDCardVerifyReq) Check() error { + return nil +} + +type AppUserComplainAddReq struct { + // 投诉单号 问题分类 提交日期 提交人 具体内容 状态 + Type string `json:"type"` // 类型:DRIVER=司机 VEHICLE=车辆 ORDER=订单 COMPANY=公司 OTHER=其他 + Content string `json:"content"` // 投诉类型 + Mobile string `json:"mobile"` // 联系方式 + Desc string `json:"desc"` // 更多说明 +} + +type AppUserComplainUpdateReq struct { + IDBody + // 投诉单号 问题分类 提交日期 提交人 具体内容 状态 + Type string `json:"type"` // 类型:DRIVER=司机 VEHICLE=车辆 ORDER=订单 COMPANY=公司 OTHER=其他 + Content string `json:"content"` // 投诉类型 + Mobile string `json:"mobile"` // 联系方式 + Desc string `json:"desc"` // 更多说明 +} diff --git a/pkg/req/app_user_content.go b/pkg/req/app_user_content.go new file mode 100644 index 0000000..22851da --- /dev/null +++ b/pkg/req/app_user_content.go @@ -0,0 +1,66 @@ +package req + +type CategoryListReq struct { + KeyBody + ParentID *string `json:"parent_id" form:"parent_id" uri:"parent_id"` +} + +func (d *CategoryListReq) Check() error { + return nil +} + +type ShopListReq struct { + KeyBody +} + +func (d *ShopListReq) Check() error { + return nil +} + +type CommodityListReq struct { + KeyBody + TopCatID *string `json:"top_cat_id" form:"top_cat_id" uri:"top_cat_id"` + SecondCatID *string `json:"second_cat_id" form:"second_cat_id" uri:"second_cat_id"` + ThirdCatID *string `json:"third_cat_id" form:"third_cat_id" uri:"third_cat_id"` +} +type CommodityListByTagReq struct { + Tag string `json:"tag" form:"tag" uri:"tag"` +} + +func (d *CommodityListReq) Check() error { + return nil +} + +type AppCommodityPageReq struct { + PageWithKeyBody + CatID *string `json:"cat_id" form:"cat_id" uri:"cat_id"` +} + +func (d *AppCommodityPageReq) Check() error { + return nil +} + +type BannerListReq struct { + Position string `json:"position" form:"position" uri:"position"` +} + +func (d *BannerListReq) Check() error { + return nil +} + +type FAQListReq struct { + KeyBody +} + +func (d *FAQListReq) Check() error { + return nil +} + +type ArticleListReq struct { + KeyBody + ArticleType string `json:"article_type" form:"article_type" uri:"article_type"` +} + +func (d *ArticleListReq) Check() error { + return nil +} diff --git a/pkg/req/app_user_friend.go b/pkg/req/app_user_friend.go new file mode 100644 index 0000000..83f9e84 --- /dev/null +++ b/pkg/req/app_user_friend.go @@ -0,0 +1,83 @@ +package req + +import ( + "errors" +) + +type AppFriendList struct { +} + +func (req *AppFriendList) Check() (err error) { + return nil +} + +type AppFriendApplyList struct { + Page + Direct string `json:"direct"` // send 发出的申请 receive 收到的申请 +} + +func (req *AppFriendApplyList) Check() (err error) { + return nil +} + +type AppFriendApply struct { + UserID string `json:"user_id"` + Message string `json:"message"` +} + +func (req *AppFriendApply) Check() (err error) { + if len(req.UserID) == 0 { + err = errors.New("用户不能为空") + return + } + return nil +} + +type AppFriendApplyAccept struct { + IDBody + Message string `json:"message"` +} + +func (req *AppFriendApplyAccept) Check() (err error) { + return req.IDBody.Check() +} + +type AppFriendApplyRefuse struct { + IDBody + Message string `json:"message"` +} + +func (req *AppFriendApplyRefuse) Check() (err error) { + return req.IDBody.Check() +} + +type AppFriendTopList struct { +} + +func (req *AppFriendTopList) Check() (err error) { + return nil +} + +type AppFriendTopAdd struct { + UserID string `json:"user_id"` +} + +func (req *AppFriendTopAdd) Check() (err error) { + if len(req.UserID) == 0 { + err = errors.New("用户不能为空") + return + } + return nil +} + +type AppFriendTopRemove struct { + UserID string `json:"user_id"` +} + +func (req *AppFriendTopRemove) Check() (err error) { + if len(req.UserID) == 0 { + err = errors.New("用户不能为空") + return + } + return nil +} diff --git a/pkg/req/app_user_moment.go b/pkg/req/app_user_moment.go new file mode 100644 index 0000000..daebc5b --- /dev/null +++ b/pkg/req/app_user_moment.go @@ -0,0 +1,36 @@ +package req + +import ( + "errors" +) + +type AppMomentCreate struct { + ClanID string `gorm:"column:clan_id;type:char(32);not null;comment:家" json:"clan_id"` + Title string `gorm:"column:title;type:varchar(64);not null;comment:标题" json:"title"` + TextContent string `gorm:"column:text_content;type:varchar(2048);not null;comment:内容" json:"text_content"` + Items []AppMomentCreateItem `json:"items"` +} + +func (req *AppMomentCreate) Check() (err error) { + return nil +} + +type AppMomentUpdate struct { + IDBody + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` + Sign string `gorm:"column:sign;type:varchar(255);not null;comment:签名" json:"sign"` + Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"avatar"` +} + +func (req *AppMomentUpdate) Check() (err error) { + if len(req.Nickname) == 0 { + err = errors.New("名称不能为空") + return + } + return nil +} + +type AppMomentCreateItem struct { + Type string `gorm:"column:type;type:varchar(64);not null;comment:类型:PIC=图片" json:"type"` + Content string `gorm:"column:content;type:varchar(255);not null;comment:内容、如图片id" json:"content"` +} diff --git a/pkg/req/app_user_order.go b/pkg/req/app_user_order.go new file mode 100644 index 0000000..19aec3d --- /dev/null +++ b/pkg/req/app_user_order.go @@ -0,0 +1,59 @@ +package req + +import ( + "errors" + "servicebase/pkg/datasource/fields" + + "github.com/shopspring/decimal" +) + +type OrderInfoReq struct { + IDBody +} + +type OrderCommitReq struct { + OrderType int32 `gorm:"column:order_type;type:int;not null;comment:订单类型 1=到店 2=邮寄" json:"order_type"` + OrderAmount decimal.Decimal `gorm:"column:order_amount;type:decimal(10,2);not null;comment:订单金额" json:"order_amount"` + OrderExtraAmount decimal.Decimal `gorm:"column:order_extra_amount;type:decimal(10,2);not null;comment:订单额外费用(挂号信要2000其他0)" json:"order_extra_amount"` + OrderPayAmount decimal.Decimal `gorm:"column:order_pay_amount;type:decimal(10,2);not null;comment:订单支付金额" json:"order_pay_amount"` + OrderPayType int32 `gorm:"column:order_pay_type;type:int;not null;comment:订单支付类型1=现金 2=银行汇款 3=挂号信" json:"order_pay_type"` + OrderPayTime fields.Time `gorm:"column:order_pay_time;type:datetime;not null;comment:订单支付时间" json:"order_pay_time"` + OrderPayNo string `gorm:"column:order_pay_no;type:varchar(255);not null;comment:订单支付流水号" json:"order_pay_no"` + OrderPayRemark string `gorm:"column:order_pay_remark;type:varchar(255);not null;comment:订单支付备注" json:"order_pay_remark"` + OrderRemark string `gorm:"column:order_remark;type:varchar(255);not null;comment:订单备注" json:"order_remark"` + ToShopID string `gorm:"column:to_shop_id;type:char(32);not null;comment:到店门店id" json:"to_shop_id"` + ToShopDate string `gorm:"column:to_shop_date;type:char(10);not null;comment:到店日期" json:"to_shop_date"` + ToShopTime string `gorm:"column:to_shop_time;type:char(20);not null;comment:到店时间" json:"to_shop_time"` + ExpressArriveDate string `gorm:"column:express_arrive_date;type:varchar(20);not null;comment:快递日期" json:"express_arrive_date"` + ExpressArriveTime string `gorm:"column:express_arrive_time;type:varchar(255);not null;comment:快递时间" json:"express_arrive_time"` + InvoiceType string `gorm:"column:invoice_type;type:char(1);not null;comment:发票类型1=需要发票 2=不需要" json:"invoice_type"` + InvoiceNo string `gorm:"column:invoice_no;type:varchar(255);comment:发票号码" json:"invoice_no"` + PersonalDocType string `gorm:"column:personal_doc_type;type:char(2);comment:身份类型" json:"personal_doc_type"` + PersonalDoc string `gorm:"column:personal_doc;type:varchar(255);comment:身份照片" json:"personal_doc"` + PersonalEndDate string `gorm:"column:personal_end_date;type:varchar(255);comment:身份照片有效期" json:"personal_end_date"` + OrderDetails []OrderDetailReq `json:"order_details"` + BankName string `json:"bank_name"` + BranchBankName string `json:"branch_bank_name"` + CardType string `json:"card_type"` + CardNo string `json:"card_no"` + CardUserName string `json:"card_user_name"` + PersonalDoc2 string `json:"personal_doc_2"` +} + +func (d *OrderCommitReq) Check() error { + if len(d.OrderDetails) == 0 { + return errors.New("没有商品信息") + } + return nil +} + +type OrderDetailReq struct { + OrderID int32 `gorm:"column:order_id;type:int;not null;comment:订单ID" json:"order_id"` + ProductID string `gorm:"column:product_id;type:char(32);not null;comment:商品ID" json:"product_id"` + ProductName string `gorm:"column:product_name;type:varchar(255);not null;comment:商品名称" json:"product_name"` + ProductPrice decimal.Decimal `gorm:"column:product_price;type:decimal(10,2);not null;comment:商品价格" json:"product_price"` + ProductNum int32 `gorm:"column:product_num;type:int;not null;comment:商品数量" json:"product_num"` + ProductTotal decimal.Decimal `gorm:"column:product_total;type:decimal(10,2);not null;comment:商品总价" json:"product_total"` + ProductPros string `gorm:"column:product_pros;type:varchar(255);not null;comment:属性" json:"product_pros"` + PriceType string `gorm:"column:price_type;type:char(50);not null;comment:价格类型" json:"price_type"` +} diff --git a/pkg/req/common_auth.go b/pkg/req/common_auth.go new file mode 100644 index 0000000..ae16ed4 --- /dev/null +++ b/pkg/req/common_auth.go @@ -0,0 +1,165 @@ +package req + +import ( + "context" + "errors" + "servicebase/pkg/log" +) + +type CommonAuthReq struct { + Type string `json:"type"` // app_user_wechat app_driver_wechat admin_company + Code string `json:"code" form:"code" uri:"code"` // 微信登录:type=app_user_wechat|app_driver_wechat + Login string `json:"login"` // 账号密码登录:type=admin_company + Password string `json:"password"` // 账号密码登录:type=admin_company +} + +func (d *CommonAuthReq) Check() error { + return nil +} + +type AdminUserRoleAllReq struct { + UserID string `json:"user_id" form:"user_id" uri:"user_id"` // ID +} +type TenantRolePrivilegeAllReq struct { + RoleID string `json:"role_id" form:"role_id" uri:"role_id"` // ID +} + +type AdminUserPassResetReq struct { + UserID string `json:"user_id"` // USERNAME EMAIL AUTO + PrePass string `json:"pre_password"` + NewPass string `json:"new_password"` +} + +func (d *AdminUserPassResetReq) Check() error { + if len(d.UserID) == 0 { + return errors.New("请指定用户ID") + } + if len(d.PrePass) == 0 { + return errors.New("请指定旧密码") + } + if len(d.NewPass) == 0 { + return errors.New("请指定新密码") + } + if len(d.NewPass) < 6 { + return errors.New("密码不能少于6位") + } + return nil +} + +type UserCheckReq struct { + UserID string `json:"user_id"` + Point string `json:"point"` +} + +func (d UserCheckReq) Check(c context.Context) error { + if len(d.UserID) == 0 || len(d.Point) == 0 { + log.ErrorF("privilege check 参数错误: uid=%s point=%s", d.UserID, d.Point) + return errors.New("参数错误") + } + return nil +} + +type ServiceUserResourceReq struct { + UserID string `json:"user_id" form:"user_id" uri:"user_id"` +} + +func (d ServiceUserResourceReq) Check() error { + if len(d.UserID) == 0 { + return errors.New("参数错误") + } + return nil +} + +type TenantAddReq struct { + Name string `gorm:"column:name;type:varchar(255);not null;index:idx_name,priority:1;comment:租户名" json:"name"` + Contact string `gorm:"column:contact;type:varchar(255);not null;comment:联系方式" json:"contact"` + Desc string `gorm:"column:desc;type:varchar(255);not null;comment:备注" json:"desc"` +} + +func (d *TenantAddReq) Check() error { + if len(d.Name) == 0 { + return errors.New("名称不能为空") + } + return nil +} + +type TenantUpdateReq struct { + IDBody + TenantAddReq +} + +func (d *TenantUpdateReq) Check() error { + if len(d.ID) == 0 { + return errors.New("ID不能为空") + } + return nil +} + +type AdminPrivilegeAddReq struct { + TenantID string `gorm:"column:tenant_id;type:char(32);not null;default:system;comment:企业ID" json:"tenant_id"` + ScopeID string `gorm:"column:scope_id;type:char(32);not null;comment:范围" json:"scope_id"` + ParentID string `gorm:"column:parent_id;type:char(32);not null;comment:父ID" json:"parent_id"` + Code string `gorm:"column:code;type:varchar(64);not null;comment:代码" json:"code"` + Name string `gorm:"column:name;type:varchar(64);not null;index:idx_name,priority:1;comment:权限名称" json:"name"` + Level int32 `gorm:"column:level;type:int;not null;comment:权限级别" json:"level"` + SourceType string `gorm:"column:source_type;type:varchar(64);not null;comment:类型:resource、interface等" json:"source_type"` + TargetType string `gorm:"column:target_type;type:varchar(255);not null" json:"target_type"` + Target string `gorm:"column:target;type:varchar(255);not null;comment:权限值 resource:菜单路径; api=url-pre" json:"target"` + Desc string `gorm:"column:desc;type:varchar(64);not null;comment:描述" json:"desc"` +} + +func (d *AdminPrivilegeAddReq) Check() error { + return nil +} + +type AdminPrivilegeUpdateReq struct { + IDBody + AdminPrivilegeAddReq +} + +func (d *AdminPrivilegeUpdateReq) Check() error { + return nil +} + +type AdminRoleAddReq struct { + Name string `json:"name"` // 名称 + Code string `json:"code"` // 名称 + Desc string `json:"desc"` // 描述 +} + +type AdminRoleUpdateReq struct { + IDBody + AdminRoleAddReq +} + +type AdminUserAddReq struct { + Username string `json:"username" form:"username" uri:"username"` // ID + Nickname string `json:"nickname" form:"nickname" uri:"nickname"` // + Desc string `json:"desc" form:"desc" uri:"desc"` // + Password string `json:"password" form:"password" uri:"password"` // +} + +type AdminUserUpdateReq struct { + IDBody + Username string `json:"username" form:"username" uri:"username"` // ID + Nickname string `json:"nickname" form:"nickname" uri:"nickname"` // + Desc string `json:"desc" form:"desc" uri:"desc"` // + State int32 `json:"state" form:"state" uri:"state"` // +} + +type AdminUserUpdatePasswordReq struct { + IDBody + Password string `json:"password" form:"password" uri:"password"` // ID +} + +type AdminUserRoleAddReq struct { + ScopeID string `json:"scope_id"` // + UserID string `json:"user_id"` // + RoleID string `json:"role_id"` // +} + +type AdminRolePrivilegeAddReq struct { + ScopeID string `json:"scope_id"` // + RoleID string `json:"role_id"` // + PrivilegeID string `json:"privilege_id"` // +} diff --git a/pkg/req/open.go b/pkg/req/open.go new file mode 100644 index 0000000..fe7c89e --- /dev/null +++ b/pkg/req/open.go @@ -0,0 +1,31 @@ +package req + +type AudioToTextReq struct { + Url string `json:"audio_url" form:"audio_url" uri:"audio_url"` + Text string `json:"text" form:"text" uri:"text"` +} + +func (d AudioToTextReq) GetText() string { + if len(d.Text) == 0 { + return `本人尊重宣誓:本人自愿加入东东电竞,并严格遵守东东电竞所有规定,接受个人信息公开到互联网进行监督和宣传,爱国爱党不触碰法律法规,不做无道德无底线的事,不做违法乱纪的事。做一名优秀的陪玩,时刻约束自己,努力为陪玩行业正名,拥有远大志向,从我做起改善不良风气,不断努力,不断进步,和东东电竞一起努力,共同构建陪玩行业新标杆。若出现违反相关规定内容,本人自愿接受所有处罚。` + } + return d.Text +} + +type TextSimilarityReq struct { + Text1 string `json:"text1" form:"text1" uri:"text1"` + Text2 string `json:"text2" form:"text2" uri:"text2"` +} + +type VideoExtractFramesReq struct { + Url string `json:"video_url" form:"video_url" uri:"video_url"` + NumFrames int `json:"num_frames" form:"num_frames" uri:"num_frames"` + Force bool `json:"force" form:"force" uri:"force"` +} + +func (d VideoExtractFramesReq) GetNumFrames() int { + if d.NumFrames <= 0 || d.NumFrames > 20 { + return 5 + } + return d.NumFrames +} diff --git a/pkg/req/trade_game.go b/pkg/req/trade_game.go new file mode 100644 index 0000000..ea6c1e2 --- /dev/null +++ b/pkg/req/trade_game.go @@ -0,0 +1 @@ +package req diff --git a/pkg/res/abstract.go b/pkg/res/abstract.go new file mode 100644 index 0000000..9065ef8 --- /dev/null +++ b/pkg/res/abstract.go @@ -0,0 +1,149 @@ +package res + +import ( + "fmt" + "net/http" + "servicebase/pkg/cerrors" + "servicebase/pkg/log" + "servicebase/pkg/req" + + "github.com/gin-gonic/gin" +) + +const ( + CodeSuccess = 200 + CodeFailed = 500 + AuthERR = 400 +) + +type Fn func(c *gin.Context) Response + +func WrapApi(f Fn) gin.HandlerFunc { + return func(c *gin.Context) { + if f == nil { + c.JSON(http.StatusInternalServerError, Failed("biz fn is nil")) + c.Abort() + return + } + rsp := f(c) + if rsp.Cause != nil { + log.ErrorFWithCtx(c.Request.Context(), "api err :[%+v]", rsp.Cause) + } + c.JSON(http.StatusOK, rsp) + } +} + +type Response struct { + Code int `json:"code"` + Msg string `json:"msg,omitempty"` + Data interface{} `json:"data,omitempty"` + Cause error `json:"-"` +} + +type PageData struct { + Total int64 `json:"total"` + CountPage int64 `json:"count_page"` + HasNext bool `json:"has_next"` + List interface{} `json:"list"` +} + +func (t Response) Success() bool { + return t.Code == CodeSuccess +} + +func Success(data interface{}) Response { + return Response{ + Code: CodeSuccess, + Msg: "", + Data: data, + } +} + +func Empty() Response { + return Response{ + Code: CodeSuccess, + Msg: "", + } +} + +func Page(pageable req.Page, count int64, data interface{}) Response { + cnt := (count + pageable.Size - 1) / pageable.Size + return Success(PageData{ + Total: count, + CountPage: cnt, + HasNext: pageable.Size < cnt, + List: data, + }) +} + +func Failed(msg string) Response { + return Response{ + Code: CodeFailed, + Msg: msg, + } +} + +func Error(e error) Response { + return Response{ + Code: CodeFailed, + Msg: e.Error(), + } +} + +func ErrorMsg(msg string, e error) Response { + return Response{ + Code: CodeFailed, + Msg: fmt.Sprintf("%s,%v", msg, e), + } +} + +func ErrorCode(code int) Response { + return Response{ + Code: code, + Msg: cerrors.Msg(code), + } +} + +func FailedWithCause(msg string, err error) Response { + return Response{ + Code: CodeFailed, + Msg: msg, + Cause: err, + } +} + +func Cause(err error) Response { + return Response{ + Code: CodeFailed, + Msg: err.Error(), + Cause: err, + } +} + +func AuthFailed(msg string) Response { + return Response{ + Code: AuthERR, + Msg: msg, + } +} + +func FailedF(msg string, args ...interface{}) Response { + return Response{ + Code: CodeFailed, + Msg: fmt.Sprintf(msg, args...), + } +} + +type IDBody struct { + ID string `json:"id" form:"id" uri:"id"` +} + +type ImageDTO struct { + ImageID string `json:"image_id"` + ImageUrl string `json:"image_url"` +} + +type AccessTokenDTO struct { + AccessToken string + ExpireTime string +} diff --git a/pkg/res/act_news.go b/pkg/res/act_news.go new file mode 100644 index 0000000..b88552e --- /dev/null +++ b/pkg/res/act_news.go @@ -0,0 +1,35 @@ +package res + +import "servicebase/pkg/datasource/fields" + +type ActNewsAll struct { + ListType []ActNewsType `gorm:"-" json:"list_type"` + ListBanner []ActNews `gorm:"-" json:"list_banner"` + ListNews []ActNews `gorm:"-" json:"list_news"` +} + +type ActNewsType struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"type_id"` // 业务ID + Name string `gorm:"column:name;type:varchar(255);not null;comment:类型名称" json:"name"` // 类型名称 + Sort int32 `gorm:"column:sort;type:int;not null;default:999;comment:排序" json:"sort"` // 排序 + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 +} + +type ActNews struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"news_id"` // 业务ID + TypeID string `gorm:"column:type_id;type:char(32);not null;comment:类型" json:"type_id"` // 类型 + Title string `gorm:"column:title;type:varchar(255);not null;comment:标题" json:"title"` // 标题 + HeadImg string `gorm:"column:head_img;type:varchar(255);not null;comment:头图" json:"head_img"` // 头图 + Content string `gorm:"column:content;type:longtext;not null;comment:内容:富文本" json:"content"` // 内容:富文本 + Sort int32 `gorm:"column:sort;type:int;not null;default:999;comment:排序" json:"sort"` // 排序 + Position int32 `gorm:"column:position;type:int;not null;default:1;comment:位置1=列表 2=banner" json:"position"` // 位置1=列表 2=banner + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + ViewCount int32 `gorm:"column:view_count;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"view_count"` // 浏览量 + NewsDate fields.Date `gorm:"column:news_date;type:datetime;not null;comment:新闻时间" json:"news_date"` // 新闻时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 + + DetailScheme string `gorm:"detail_scheme"` +} diff --git a/pkg/res/admin.go b/pkg/res/admin.go new file mode 100644 index 0000000..9ab95c8 --- /dev/null +++ b/pkg/res/admin.go @@ -0,0 +1,24 @@ +package res + +import ( + "github.com/shopspring/decimal" +) + +type DashboardBasic struct { + TotalSale DashboardBasicItem `json:"total_sale"` + OrderStateList []DashboardBasicItem `json:"order_state_list"` + StoreSaleList []DashboardBasicItem `json:"store_sale_list"` + CateSaleList []DashboardBasicItem `json:"cate_sale_list"` + CommoditySaleList []DashboardBasicItem `json:"commodity_sale_list"` + LatestOrderList []OrderRes `json:"latest_order_list"` +} + +type DashboardBasicItem struct { + Title string `json:"title"` + Desc string `json:"desc"` + Icon string `json:"icon"` + Cnt int64 `json:"cnt"` + Amount decimal.Decimal `json:"amount"` + CntText string `json:"cnt_text"` + AmountText string `json:"amount_text"` +} diff --git a/pkg/res/admin_act.go b/pkg/res/admin_act.go new file mode 100644 index 0000000..fd910d1 --- /dev/null +++ b/pkg/res/admin_act.go @@ -0,0 +1,21 @@ +package res + +import "servicebase/pkg/datasource/fields" + +type News struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + TypeID string `gorm:"column:type_id;type:char(32);not null;comment:类型" json:"type_id"` // 类型 + TypeName string `gorm:"column:type_name;type:char(32);not null;comment:类型" json:"type_name"` // 类型 + Title string `gorm:"column:title;type:varchar(255);not null;comment:标题" json:"title"` // 标题 + HeadImg string `gorm:"column:head_img;type:varchar(255);not null;comment:头图" json:"head_img"` // 头图 + Content string `gorm:"column:content;type:longtext;not null;comment:内容:富文本" json:"content"` // 内容:富文本 + Sort int32 `gorm:"column:sort;type:int;not null;default:999;comment:排序" json:"sort"` // 排序 + Position int32 `gorm:"column:position;type:int;not null;default:1;comment:位置1=列表 2=banner" json:"position"` // 位置1=列表 2=banner + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + StateName string `gorm:"column:state_name;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state_name"` // 状态1=启用 2=禁用 + NewsDate fields.Time `gorm:"column:news_date;type:datetime;not null;comment:新闻时间" json:"news_date"` // 新闻时间 + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} diff --git a/pkg/res/admin_trade.go b/pkg/res/admin_trade.go new file mode 100644 index 0000000..3748908 --- /dev/null +++ b/pkg/res/admin_trade.go @@ -0,0 +1,37 @@ +package res + +import "servicebase/pkg/datasource/fields" + +type UserGameRole struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` // 业务ID + UserID string `gorm:"column:user_id;type:char(32);not null;comment:用户ID" json:"user_id"` // 用户ID + UserNo string `gorm:"column:user_no;type:char(32);not null;comment:用户ID" json:"user_no"` // 用户ID + UserName string `gorm:"column:user_name;type:char(32);not null;comment:用户ID" json:"user_name"` // 用户ID + GameID string `gorm:"column:game_id;type:char(32);not null;comment:游戏" json:"game_id"` // 游戏 + TargetID string `gorm:"column:target_id;type:char(32);not null;comment:游戏" json:"target_id"` // 三方ID + GameName string `gorm:"column:game_name;type:char(32);not null;comment:游戏" json:"game_name"` // 游戏 + GameRoleName string `gorm:"column:game_role_name;type:varchar(255);not null;comment:角色名称" json:"game_role_name"` // 角色名称 + GameRoleID string `gorm:"column:game_role_id;type:varchar(255);not null;comment:角色ID" json:"game_role_id"` // 角色ID + Desc string `gorm:"column:desc;type:varchar(255);not null;comment:描述" json:"desc"` // 描述 + Icon string `gorm:"column:icon;type:varchar(255);not null;comment:图标" json:"icon"` // 图标 + Logo string `gorm:"column:logo;type:varchar(255);not null;comment:logo" json:"logo"` // logo + Price int32 `gorm:"column:price;type:int;not null;comment:价格,单位为分" json:"price"` // 价格,单位为分 + DataState int32 `gorm:"column:data_state;type:int;not null;default:2;comment:数据状态:1=完成 2=待处理" json:"data_state"` // 数据状态:1=完成 2=待处理 + State int32 `gorm:"column:state;type:int;not null;default:1;comment:状态1=启用 2=禁用" json:"state"` // 状态1=启用 2=禁用 + Title string `gorm:"column:title;type:text;not null;comment:标题" json:"title"` // 标题 + ProductNo string `gorm:"column:product_no;type:varchar(255);not null;comment:商品编号" json:"product_no"` // 商品编号 + ThirdID string `gorm:"column:third_id;type:varchar(255);not null;comment:第三方ID" json:"third_id"` // 第三方ID + ProductType string `gorm:"column:product_type;type:varchar(255);not null;comment:商品类型" json:"product_type"` // 商品类型 + ServerZone string `gorm:"column:server_zone;type:varchar(255);not null;comment:游戏区服" json:"server_zone"` // 游戏区服 + CanReAuth string `gorm:"column:can_re_auth;type:varchar(255);not null;comment:canReAuth==1?可二次实名":不可实名" json:"can_re_auth"` // canReAuth=="1"?"可二次实名":"不可实名" + HaveChenMi string `gorm:"column:have_chen_mi;type:varchar(255);not null;comment:{{item.haveChenMi==1?有:无}}防沉迷" json:"have_chen_mi"` // {{item.haveChenMi=="1"?"有":"无"}}防沉迷 + UserPrice string `gorm:"column:user_price;type:varchar(255);not null;comment:第三方ID" json:"user_price"` // 第三方ID + BrightLights string `gorm:"column:bright_lights;type:varchar(2048);not null;comment:第三方ID" json:"bright_lights"` // 第三方ID + Vip string `gorm:"column:vip;type:varchar(255);not null;comment:贵族等级" json:"vip"` // 贵族等级 + PriceInput *string `gorm:"column:price_input;type:varchar(30);comment:通过输入的价格统计" json:"price_input"` // 通过输入的价格统计 + SkinList string `gorm:"column:skin_list;type:text;not null;comment:皮肤列表" json:"skin_list"` // 皮肤列表 + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` // 创建时间 + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` // 创建人 + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` // 更新时间 + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` // 更新人 +} diff --git a/pkg/res/app_user.go b/pkg/res/app_user.go new file mode 100644 index 0000000..f069fa5 --- /dev/null +++ b/pkg/res/app_user.go @@ -0,0 +1,66 @@ +package res + +import "servicebase/pkg/datasource/fields" + +type UserRes struct { + IDBody + UserType string `gorm:"column:user_type;type:char(1);not null;comment:P=person C= crop" json:"user_type"` + Truename string `gorm:"column:truename;type:varchar(60);not null" json:"truename"` + Nickname string `gorm:"column:nickname;type:varchar(60);not null" json:"nickname"` + Password string `gorm:"column:password;type:varchar(60);not null" json:"password"` + Phone string `gorm:"column:phone;type:varchar(20);not null" json:"phone"` + Email string `gorm:"column:email;type:varchar(100);not null;uniqueIndex:EMAIL_idx,priority:1" json:"email"` + Birthday string `gorm:"column:birthday;type:varchar(20);not null" json:"birthday"` + Gender string `gorm:"column:gender;type:char(1);not null" json:"gender"` + Position string `gorm:"column:position;type:varchar(100);not null" json:"position"` + PostCode string `gorm:"column:post_code;type:varchar(20);not null" json:"post_code"` + Prefecture string `gorm:"column:prefecture;type:varchar(100);not null" json:"prefecture"` + Address string `gorm:"column:address;type:varchar(255);not null" json:"address"` + Building string `gorm:"column:building;type:varchar(100);not null" json:"building"` + Status string `gorm:"column:status;type:char(1);not null;default:1" json:"status"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null" json:"update_at"` + InvoiceType string `gorm:"column:invoice_type;type:char(1);not null;comment:发票类型 1=可开 2=不可开" json:"invoice_type"` + InvoiceNo string `gorm:"column:invoice_no;type:varchar(50);not null;comment:发票编号" json:"invoice_no"` + AccountBank string `gorm:"column:account_bank;type:varchar(255);not null;comment:开户银行" json:"account_bank"` + AccountBranch string `gorm:"column:account_branch;type:varchar(255);not null;comment:开户支行" json:"account_branch"` + AccountType string `gorm:"column:account_type;type:char(1);not null;comment:账户类型 1= 普通預金 2=当座預金" json:"account_type"` + AccountNo string `gorm:"column:account_no;type:varchar(100);not null;comment:银行账号" json:"account_no"` + AccountName string `gorm:"column:account_name;type:varchar(100);not null;comment:开户人姓名" json:"account_name"` + PersonalDocType string `gorm:"column:personal_doc_type;type:char(1);not null;comment:1=居民票的复印件2=驾驶证3=护照4=保险证5=在留卡" json:"personal_doc_type"` + PersonalImage string `gorm:"column:personal_image;type:varchar(255);not null;comment:身份证照片" json:"personal_image"` + PersonalEndDate string `gorm:"column:personal_end_date;type:varchar(255);not null;comment:身份证有效期" json:"personal_end_date"` + PersonalImage2 string `gorm:"column:personal_image_2;type:varchar(255);not null;comment:身份证照片2" json:"personal_image_2"` +} + +type AppUserRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + No string `gorm:"column:no;type:varchar(64);not null;index:uk,priority:1;comment:用户号、用户名" json:"no"` + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` + Sign string `gorm:"column:sign;type:varchar(255);not null;comment:签名" json:"sign"` + Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"avatar"` + Password string `gorm:"column:password;type:varchar(64);not null;comment:密码" json:"password"` + PassSalt string `gorm:"column:pass_salt;type:varchar(32);not null;comment:密码盐" json:"pass_salt"` + WxOpenID string `gorm:"column:wx_open_id;type:varchar(64);not null;comment:OPEN ID" json:"wx_open_id"` + WxUnionID string `gorm:"column:wx_union_id;type:varchar(64);not null;comment:UNION ID" json:"wx_union_id"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` +} + +type AppUserAuthRes struct { // 店铺商品-卡片 + Token string `json:"token"` +} + +type AppUserRelationApplyRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + Type string `gorm:"column:type;type:varchar(64);not null;comment:类型:CLAN=家 FRIEND=朋友" json:"type"` + TypeID string `gorm:"column:type_id;type:char(32);not null;comment:团体ID" json:"type_id"` + OpUserID string `gorm:"column:op_user_id;type:char(32);not null;comment:操作用户" json:"op_user_id"` + ToUserID string `gorm:"column:to_user_id;type:char(32);not null;comment:目标用户" json:"to_user_id"` + Message string `gorm:"column:message;type:varchar(255);not null;comment:申请内容" json:"message"` + ReplyMsg string `gorm:"column:reply_msg;type:varchar(255);not null;comment:回复内容" json:"reply_msg"` + Channel string `gorm:"column:channel;type:varchar(64);not null;comment:方式 APPLY=用户申请 INVITE=管理员邀请" json:"channel"` + State string `gorm:"column:state;type:varchar(32);not null;comment:OK" json:"state"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` +} diff --git a/pkg/res/app_user_clan.go b/pkg/res/app_user_clan.go new file mode 100644 index 0000000..43423df --- /dev/null +++ b/pkg/res/app_user_clan.go @@ -0,0 +1,43 @@ +package res + +import "servicebase/pkg/datasource/fields" + +type UserClanRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + No string `gorm:"column:no;type:varchar(64);not null;index:uk,priority:1;comment:编号" json:"no"` + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` + Sign string `gorm:"column:sign;type:varchar(255);not null;comment:签名" json:"sign"` + Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"avatar"` + CreatorUID string `gorm:"column:creator_uid;type:char(32);not null;comment:创建人" json:"creator_uid"` + ManagerUID string `gorm:"column:manager_uid;type:char(32);not null;comment:管理人" json:"manager_uid"` + CntMember int32 `gorm:"column:cnt_member;type:int;not null;comment:成员数" json:"cnt_member"` + CntMoment int32 `gorm:"column:cnt_moment;type:int;not null;comment:动态数量" json:"cnt_moment"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` + + UserNo string `gorm:"column:no;type:varchar(64);not null;index:uk,priority:1;comment:用户号、用户名" json:"user_no"` + UserNickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"user_nickname"` + UserAvatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"user_avatar"` +} + +type UserClanMemberRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + No string `gorm:"column:no;type:varchar(64);not null;index:uk,priority:1;comment:编号" json:"no"` + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` + Sign string `gorm:"column:sign;type:varchar(255);not null;comment:签名" json:"sign"` + Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"avatar"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` +} + +type UserClanMemberApplyRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + ClanID string `gorm:"column:clan_id;type:char(32);not null;comment:团体ID" json:"clan_id"` + ApplyUserID string `gorm:"column:apply_user_id;type:char(32);not null;comment:操作用户" json:"apply_user_id"` + TargetUserID string `gorm:"column:target_user_id;type:char(32);not null;comment:目标用户" json:"target_user_id"` + Message string `gorm:"column:message;type:varchar(255);not null;comment:申请内容" json:"message"` + ReplyMsg string `gorm:"column:reply_msg;type:varchar(255);not null;comment:回复内容" json:"reply_msg"` + Channel string `gorm:"column:channel;type:varchar(64);not null;comment:方式 APPLY=用户申请 INVITE=管理员邀请" json:"channel"` + State string `gorm:"column:state;type:varchar(32);not null;comment:OK" json:"state"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` +} diff --git a/pkg/res/app_user_content.go b/pkg/res/app_user_content.go new file mode 100644 index 0000000..195531e --- /dev/null +++ b/pkg/res/app_user_content.go @@ -0,0 +1,121 @@ +package res + +import ( + "servicebase/pkg/datasource/fields" + + "github.com/shopspring/decimal" +) + +type CategoryRes struct { + IDBody + CatName string `gorm:"column:cat_name;type:varchar(60);not null" json:"cat_name"` + IconImg string `gorm:"column:icon_img;type:varchar(255);not null" json:"icon_img"` + ParentID string `gorm:"column:parent_id;type:int;not null" json:"parent_id"` + Level int32 `gorm:"column:level;type:int;not null" json:"level"` + Status int32 `gorm:"column:status;type:int;not null" json:"status"` + IsHot string `gorm:"column:is_hot;type:char(1);not null;default:0" json:"is_hot"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null" json:"update_at"` +} + +type ShopRes struct { + IDBody + ShopName string `gorm:"column:shop_name;type:varchar(255);not null" json:"shop_name"` + BgColor string `gorm:"column:bg_color;type:varchar(20);not null" json:"bg_color"` + Lng string `gorm:"column:lng;type:varchar(50);not null" json:"lng"` + Lat string `gorm:"column:lat;type:varchar(50);not null" json:"lat"` + Address string `gorm:"column:address;type:varchar(255);not null" json:"address"` + PostCode string `gorm:"column:post_code;type:varchar(20);not null" json:"post_code"` + Phone string `gorm:"column:phone;type:varchar(20);not null" json:"phone"` + OpenTime string `gorm:"column:open_time;type:varchar(255);not null" json:"open_time"` + Traffic string `gorm:"column:traffic;type:varchar(255);not null" json:"traffic"` + Status string `gorm:"column:status;type:char(1);not null" json:"status"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null" json:"update_at"` +} + +type SpuRes struct { + IDBody + SpuCode string `gorm:"column:spu_code;type:varchar(60);not null;comment:商品编码" json:"spu_code"` + TopCatID string `gorm:"column:top_cat_id;type:int;not null;comment:一级分类ID" json:"top_cat_id"` + TopCatName string `gorm:"column:top_cat_name;type:varchar(60);not null;comment:一级分类ID" json:"top_cat_name"` + SecondCatID string `gorm:"column:second_cat_id;type:int;not null;comment:二级分类ID" json:"second_cat_id"` + SecondCatName string `gorm:"column:second_cat_name;type:varchar(60);not null;comment:二级分类ID" json:"second_cat_name"` + ThirdCatID string `gorm:"column:third_cat_id;type:int;not null;comment:三级分类ID" json:"third_cat_id"` + ThirdCatName string `gorm:"column:third_cat_name;type:varchar(60);not null;comment:三级分类ID" json:"third_cat_name"` + Title string `gorm:"column:title;type:varchar(255);not null;comment:商品名称" json:"title"` + HeadImg string `gorm:"column:head_img;type:varchar(255);not null;comment:商品图片" json:"head_img"` + Tag string `gorm:"column:tag;type:varchar(100);not null;comment:标签" json:"tag"` + NewPrice string `gorm:"column:new_price;type:varchar(30);not null;comment:新品价格" json:"new_price"` + NewPriceProps string `gorm:"column:new_price_props;type:json;not null;comment:新品价格属性" json:"new_price_props"` + AllowOld string `gorm:"column:allow_old;type:char(1);not null;comment:允许卖二手" json:"allow_old"` + OldPrice string `gorm:"column:old_price;type:varchar(30);not null;comment:二手价" json:"old_price"` + OldPriceProps string `gorm:"column:old_price_props;type:json;not null;comment:二手价属性\n" json:"old_price_props"` + Status string `gorm:"column:status;type:char(1);not null;comment:1=上架 2=下架" json:"status"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null" json:"update_at"` + SortNo string `gorm:"column:sort_no;type:int;not null" json:"sort_no"` +} + +type SkuRes struct { + IDBody + SpuID string `gorm:"column:spu_id;type:int(11);not null;comment:SPUID" json:"spu_id"` + SkuCode string `gorm:"column:sku_code;type:varchar(30);not null" json:"sku_code"` + SkuName string `gorm:"column:sku_name;type:varchar(255);not null" json:"sku_name"` + Attrs string `gorm:"column:attrs;type:json;not null" json:"attrs"` + AttrsName string `gorm:"column:attrs_name;type:varchar(255);not null;comment:属性字符串" json:"attrs_name"` + MarketPrice decimal.Decimal `gorm:"column:market_price;type:decimal(9,2);not null;comment:市场价" json:"market_price"` + SalePrice decimal.Decimal `gorm:"column:sale_price;type:decimal(9,2);not null;comment:销售价" json:"sale_price"` + SaleCount int32 `gorm:"column:sale_count;type:int(11);not null;comment:销量" json:"sale_count"` + SaleStatus string `gorm:"column:sale_status;type:char(1);not null;comment:1=上架 2=下架" json:"sale_status"` + StockNum int32 `gorm:"column:stock_num;type:int(11);not null;comment:库存" json:"stock_num"` +} + +type CommodityRes struct { + IDBody + SpuCode string `gorm:"column:spu_code;type:varchar(60);not null;comment:商品编码" json:"spu_code"` + TopCatID string `gorm:"column:top_cat_id;type:int;not null;comment:一级分类ID" json:"top_cat_id"` + SecondCatID string `gorm:"column:second_cat_id;type:int;not null;comment:二级分类ID" json:"second_cat_id"` + ThirdCatID string `gorm:"column:third_cat_id;type:int;not null;comment:三级分类ID" json:"third_cat_id"` + Title string `gorm:"column:title;type:varchar(255);not null;comment:商品名称" json:"title"` + HeadImg string `gorm:"column:head_img;type:varchar(255);not null;comment:商品图片" json:"head_img"` + Tag string `gorm:"column:tag;type:varchar(100);not null;comment:标签" json:"tag"` + NewPrice string `gorm:"column:new_price;type:varchar(30);not null;comment:新品价格" json:"new_price"` + NewPriceProps string `gorm:"column:new_price_props;type:json;not null;comment:新品价格属性" json:"new_price_props"` + AllowOld string `gorm:"column:allow_old;type:char(1);not null;comment:允许卖二手" json:"allow_old"` + OldPrice string `gorm:"column:old_price;type:varchar(30);not null;comment:二手价" json:"old_price"` + OldPriceProps string `gorm:"column:old_price_props;type:json;not null;comment:二手价属性\n" json:"old_price_props"` + Status string `gorm:"column:status;type:char(1);not null;comment:1=上架 2=下架" json:"status"` +} + +type BannerRes struct { + IDBody + ImgURL string `gorm:"column:img_url;type:varchar(255);not null;comment:图片地址" json:"img_url"` + Title string `gorm:"column:title;type:varchar(255);not null;comment:标题" json:"title"` + LinkURL string `gorm:"column:link_url;type:varchar(255);not null;comment:链接" json:"link_url"` + Status string `gorm:"column:status;type:char(1);not null;comment:状态 1=正常 0=作废" json:"status"` + ViewPos string `gorm:"column:view_pos;type:varchar(60);not null;comment:HOME_TOP 首页顶部 SPU_TOP 商品页顶部" json:"view_pos"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null" json:"update_at"` +} + +type FAQRes struct { + IDBody + Question string `gorm:"column:question;type:varchar(255);not null;comment:问题" json:"question"` + Answer string `gorm:"column:answer;type:longtext;not null;comment:答案" json:"answer"` + Status string `gorm:"column:status;type:char(1);not null" json:"status"` + OrderNo int32 `gorm:"column:order_no;type:int;not null;default:1000;comment:序号" json:"order_no"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null" json:"update_at"` +} + +type ArticleRes struct { + IDBody + Title string `gorm:"column:title;type:varchar(255);comment:文章标题" json:"title"` + Content string `gorm:"column:content;type:text;comment:文章内容" json:"content"` + ImgURL string `gorm:"column:img_url;type:varchar(255);comment:文章图片" json:"img_url"` + ArticleType string `gorm:"column:article_type;type:char(1);comment:文章类型 1=首页特色介绍 2=网站条款" json:"article_type"` + Status string `gorm:"column:status;type:char(1);comment:文章状态 0=作废 1=正常" json:"status"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null" json:"update_at"` +} diff --git a/pkg/res/app_user_friend.go b/pkg/res/app_user_friend.go new file mode 100644 index 0000000..9646619 --- /dev/null +++ b/pkg/res/app_user_friend.go @@ -0,0 +1,32 @@ +package res + +import "servicebase/pkg/datasource/fields" + +type UserFriendRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + No string `gorm:"column:no;type:varchar(64);not null;index:uk,priority:1;comment:编号" json:"no"` + Nickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"nickname"` + Sign string `gorm:"column:sign;type:varchar(255);not null;comment:签名" json:"sign"` + Avatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"avatar"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` + + ClanID string + ClanName string + ClanAvatar string +} + +type UserFriendTopRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` +} + +type UserFriendApplyRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + FromUserID string `gorm:"column:from_user_id;type:char(32);not null;index:uk,priority:1;comment:团体ID" json:"from_user_id"` + ToUserID string `gorm:"column:to_user_id;type:char(32);not null;index:uk,priority:2;comment:用户ID" json:"to_user_id"` + Message string `gorm:"column:message;type:varchar(255);not null;comment:申请内容" json:"message"` + ReplyMsg string `gorm:"column:reply_msg;type:varchar(255);not null" json:"reply_msg"` + Channel string `gorm:"column:channel;type:varchar(64);not null;comment:方式 NORMAL=普通" json:"channel"` + State string `gorm:"column:state;type:varchar(32);not null;comment:OK" json:"state"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` +} diff --git a/pkg/res/app_user_moment.go b/pkg/res/app_user_moment.go new file mode 100644 index 0000000..ff37d30 --- /dev/null +++ b/pkg/res/app_user_moment.go @@ -0,0 +1,28 @@ +package res + +import "servicebase/pkg/datasource/fields" + +type UserMomentRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + ClanID string `gorm:"column:clan_id;type:char(32);not null;comment:家" json:"clan_id"` + Title string `gorm:"column:title;type:varchar(64);not null;comment:标题" json:"title"` + TextContent string `gorm:"column:text_content;type:varchar(2048);not null;comment:内容" json:"text_content"` + CreateBy string `gorm:"column:create_by;type:char(32);not null;comment:创建人" json:"create_by"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` + + UserNo string `gorm:"column:no;type:varchar(64);not null;index:uk,priority:1;comment:用户号、用户名" json:"user_no"` + UserNickname string `gorm:"column:nickname;type:varchar(64);not null;comment:昵称" json:"user_nickname"` + UserAvatar string `gorm:"column:avatar;type:varchar(255);not null;comment:头像" json:"user_avatar"` + + Items []UserMomentItemRes `gorm:"-" json:"items"` +} + +type UserMomentItemRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:ID" json:"id"` + ClanID string `gorm:"column:clan_id;type:char(32);not null;comment:家" json:"clan_id"` + MomentID string `gorm:"column:moment_id;type:char(32);not null;comment:动态" json:"moment_id"` + Type string `gorm:"column:type;type:varchar(64);not null;comment:类型:PIC=图片" json:"type"` + Content string `gorm:"column:content;type:varchar(255);not null;comment:内容、如图片id" json:"content"` + CreateBy string `gorm:"column:create_by;type:char(32);not null;comment:创建人" json:"create_by"` +} diff --git a/pkg/res/app_user_order.go b/pkg/res/app_user_order.go new file mode 100644 index 0000000..2d49223 --- /dev/null +++ b/pkg/res/app_user_order.go @@ -0,0 +1,67 @@ +package res + +import ( + "servicebase/pkg/datasource/fields" + + "github.com/shopspring/decimal" +) + +type OrderRes struct { + IDBody + UserID string `gorm:"column:user_id;type:int;not null;comment:用户id" json:"user_id"` + Truename string `json:"truename"` + Nickname string `json:"nickname"` + OrderNo string `gorm:"column:order_no;type:varchar(255);not null;comment:订单号" json:"order_no"` + OrderStatus string `gorm:"column:order_status;type:char(2);not null;comment:订单状态 1=已下单 2=已收货 3=已付款 4=已完成 0=已取消" json:"order_status"` + OrderType int32 `gorm:"column:order_type;type:int;not null;comment:订单类型 1=到店 2=邮寄" json:"order_type"` + OrderAmount decimal.Decimal `gorm:"column:order_amount;type:decimal(10,2);not null;comment:订单金额" json:"order_amount"` + OrderExtraAmount decimal.Decimal `gorm:"column:order_extra_amount;type:decimal(10,2);not null;comment:订单额外费用(挂号信要2000其他0)" json:"order_extra_amount"` + OrderPayAmount decimal.Decimal `gorm:"column:order_pay_amount;type:decimal(10,2);not null;comment:订单支付金额" json:"order_pay_amount"` + OrderPayType int32 `gorm:"column:order_pay_type;type:int;not null;comment:订单支付类型1=现金 2=银行汇款 3=挂号信" json:"order_pay_type"` + OrderPayTime string `gorm:"column:order_pay_time;type:datetime;not null;comment:订单支付时间" json:"order_pay_time"` + OrderPayNo string `gorm:"column:order_pay_no;type:varchar(255);not null;comment:订单支付流水号" json:"order_pay_no"` + OrderPayStatus string `gorm:"column:order_pay_status;type:char(1);not null;comment:订单支付状态 0=未支付 1=已支付" json:"order_pay_status"` + OrderPayRemark string `gorm:"column:order_pay_remark;type:varchar(255);not null;comment:订单支付备注" json:"order_pay_remark"` + OrderRemark string `gorm:"column:order_remark;type:varchar(255);not null;comment:订单备注" json:"order_remark"` + ToShopID string `gorm:"column:to_shop_id;type:int;not null;comment:到店门店id" json:"to_shop_id"` + ToShopName string `json:"to_shop_name"` + ToShopDate string `gorm:"column:to_shop_date;type:char(10);not null;comment:到店日期" json:"to_shop_date"` + ToShopTime string `gorm:"column:to_shop_time;type:char(20);not null;comment:到店时间" json:"to_shop_time"` + ExpressArriveDate string `gorm:"column:express_arrive_date;type:varchar(20);not null;comment:快递日期" json:"express_arrive_date"` + ExpressArriveTime string `gorm:"column:express_arrive_time;type:varchar(255);not null;comment:快递时间" json:"express_arrive_time"` + InvoiceType string `gorm:"column:invoice_type;type:char(1);not null;comment:发票类型1=需要发票 2=不需要" json:"invoice_type"` + InvoiceNo string `gorm:"column:invoice_no;type:varchar(255);comment:发票号码" json:"invoice_no"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;comment:Create Time" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;comment:Create Time" json:"update_at"` + PersonalDocType string `gorm:"column:personal_doc_type;type:varchar(255);not null;comment:身份类型" json:"personal_doc_type"` + PersonalDoc string `gorm:"column:personal_doc;type:varchar(255);not null;comment:身份照片" json:"personal_doc"` + PersonalEndDate string `gorm:"column:personal_end_date;type:varchar(255);not null;comment:身份有效期" json:"personal_end_date"` + Details []OrderDetaliRes `json:"details" gorm:"-"` + BankName string `gorm:"column:bank_name;type:varchar(255);not null;comment:银行名" json:"bank_name"` + BranchBankName string `gorm:"column:branch_bank_name;type:varchar(255);not null;comment:支行名" json:"branch_bank_name"` + CardType string `gorm:"column:card_type;type:varchar(255);not null;comment:卡类型" json:"card_type"` + CardNo string `gorm:"column:card_no;type:varchar(255);not null;comment:卡号" json:"card_no"` + CardUserName string `gorm:"column:card_user_name;type:varchar(255);not null;comment:卡户名" json:"card_user_name"` + Birthday string `gorm:"column:birthday;type:varchar(255);not null;comment:生日" json:"birthday"` + Position string `json:"position"` + Phone string `json:"phone"` + Gender string `json:"gender"` + Prefecture string `json:"prefecture"` + Address string `json:"address"` + Building string `json:"building"` +} + +type OrderDetaliRes struct { + IDBody + OrderID string `gorm:"column:order_id;type:int;not null;comment:订单ID" json:"order_id"` + ProductID string `gorm:"column:product_id;type:int;not null;comment:商品ID" json:"product_id"` + ProductName string `gorm:"column:product_name;type:varchar(255);not null;comment:商品名称" json:"product_name"` + ProductPrice decimal.Decimal `gorm:"column:product_price;type:decimal(10,2);not null;comment:商品价格" json:"product_price"` + ProductNum int32 `gorm:"column:product_num;type:int;not null;comment:商品数量" json:"product_num"` + ProductTotal decimal.Decimal `gorm:"column:product_total;type:decimal(10,2);not null;comment:商品总价" json:"product_total"` + ProductPros string `gorm:"column:product_pros;type:varchar(255);not null;comment:属性" json:"product_pros"` + CreateAt *fields.Time `gorm:"column:create_at;type:datetime;not null;comment:Create Time" json:"create_at"` + UpdateAt *fields.Time `gorm:"column:update_at;type:datetime;not null;comment:Create Time" json:"update_at"` + PriceType string `gorm:"column:price_type;type:char(50);not null;comment:价格类型" json:"price_type"` + ProductCode string `json:"product_code"` +} diff --git a/pkg/res/app_user_shop.go b/pkg/res/app_user_shop.go new file mode 100644 index 0000000..343c8c3 --- /dev/null +++ b/pkg/res/app_user_shop.go @@ -0,0 +1,29 @@ +package res + +import "servicebase/pkg/datasource/fields" + +type CategoryTreeRes struct { + IDBody + CatName string `gorm:"column:cat_name;type:varchar(60);not null" json:"cat_name"` + IconImg string `gorm:"column:icon_img;type:varchar(255);not null" json:"icon_img"` + ParentID string `gorm:"column:parent_id;type:int;not null" json:"parent_id"` + Level int32 `gorm:"column:level;type:int;not null" json:"level"` + Status int32 `gorm:"column:status;type:int;not null" json:"status"` + IsHot string `gorm:"column:is_hot;type:char(1);not null;default:0" json:"is_hot"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null" json:"create_at"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null" json:"update_at"` + Children []*CategoryTreeRes `json:"children" gorm:"-"` +} + +type ShopItemRes struct { + ID string `json:"shopId"` + ShopName string `json:"shopName"` + BgColor string `json:"bgColor"` + Lng string `json:"lng"` + Lat string `json:"lat"` + Address string `json:"address"` + PostCode string `json:"postCode"` + Phone string `json:"phone"` + OpenTime string `json:"openTime"` + Traffic string `json:"traffic"` +} diff --git a/pkg/res/common_auth.go b/pkg/res/common_auth.go new file mode 100644 index 0000000..6a07405 --- /dev/null +++ b/pkg/res/common_auth.go @@ -0,0 +1,163 @@ +package res + +import ( + "servicebase/pkg/datasource/fields" +) + +type AdminUserAuthRes struct { + Token string `json:"token"` +} + +type TenantRes struct { + ID string `gorm:"column:id;type:char(32);not null;uniqueIndex:id,priority:1;comment:业务ID" json:"id"` + Name string `gorm:"column:name;type:varchar(255);not null;index:idx_name,priority:1;comment:租户名" json:"name"` + Contact string `gorm:"column:contact;type:varchar(255);not null;comment:联系方式" json:"contact"` + Desc string `gorm:"column:desc;type:varchar(255);not null;comment:备注" json:"desc"` + CreateAt fields.Time `gorm:"column:create_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_at"` + CreateBy string `gorm:"column:create_by;type:varchar(255);not null;comment:创建人" json:"create_by"` + UpdateAt fields.Time `gorm:"column:update_at;type:datetime;not null;index:idx_delete_at,priority:2;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_at"` + UpdateBy string `gorm:"column:update_by;type:varchar(255);not null;comment:更新人" json:"update_by"` +} + +type AdminUserRes struct { + IDBody + Username string `json:"username"` + Nickname string `json:"nickname"` + Desc string `json:"desc"` + State int32 `json:"state"` // 创建人 + CreateAt fields.Time `json:"create_at"` // 创建时间 + CreateBy string `json:"create_by"` // 创建人 + UpdateAt fields.Time `json:"update_at"` // 更新时间 + UpdateBy string `json:"update_by"` +} + +type AdminRoleRes struct { + IDBody + TenantID string `json:"tenant_id"` // 租户ID + Name string `json:"name"` + Code string `json:"code"` + UserType string `json:"user_type"` // 类型:HEAD=总行、BRANCH=分行 + Desc string `json:"desc"` // 描述 + CreateAt fields.Time `json:"create_at"` // 创建时间 + CreateBy string `json:"create_by"` // 创建人 + UpdateAt fields.Time `json:"update_at"` // 更新时间 + UpdateBy string `json:"update_by"` +} + +type AdminPrivilegeRes struct { + IDBody + TenantID string `json:"tenant_id"` // 租户ID + ParentID string `json:"parent_id"` // 父ID + Name string `json:"name"` // 权限名称 + Level string `json:"level"` // 权限级别 + SourceType string `gorm:"column:source_type;type:varchar(64);not null" json:"source_type"` // 类型:resource、api等 + TargetType string `gorm:"column:target_type;type:varchar(64);not null" json:"target_type"` // 类型:GROUP MENU BTN 等 + Target string `gorm:"column:target;type:varchar(64);not null" json:"target"` // 权限值 menu:菜单路径; api=url-pre + Desc string `gorm:"column:desc;type:varchar(64);not null" json:"desc"` + CreateAt fields.Time `json:"create_at"` // 创建时间 +} + +type AdminPrivilegeTypedTreeRes struct { + Type string `json:"type"` + TypeName string `json:"type_name"` + Tree *[]*AdminPrivilegeTreeRes `json:"tree"` +} + +type AdminPrivilegeTreeRes struct { + IDBody + TenantID string `json:"tenant_id"` // 租户ID + ParentID string `json:"parent_id"` // 父ID + Name string `json:"name"` // 权限名称 + Level string `json:"level"` // 权限级别 + SourceType string `gorm:"column:source_type;type:varchar(64);not null" json:"source_type"` // 类型:resource、api等 + TargetType string `gorm:"column:target_type;type:varchar(64);not null" json:"target_type"` // 类型:GROUP MENU BTN 等 + Target string `gorm:"column:target;type:varchar(64);not null" json:"target"` // 权限值 menu:菜单路径; api=url-pre + Desc string `gorm:"column:desc;type:varchar(64);not null" json:"desc"` + Children []*AdminPrivilegeTreeRes `json:"children" gorm:"-"` +} + +type AdminRolePrivilegeTypedALLRes struct { + Type string `json:"type"` + TypeName string `json:"type_name"` + Tree *[]*AdminRolePrivilegeALLRes `json:"tree"` +} + +type AdminRolePrivilegeALLRes struct { + ID string `json:"id"` // 角色-权限关联关系的ID + Authorized bool `json:"authorized"` // 角色是否已授权该权限 + ScopeID string `json:"scope_id"` + ScopeName string `json:"scope_name"` + ScopeCode string `json:"scope_code"` + PrivilegeParentID string `json:"privilege_parent_id"` + PrivilegeID string `json:"privilege_id"` + PrivilegeName string `json:"privilege_name"` + PrivilegeCode string `json:"privilege_code"` + PrivilegeTarget string `json:"privilege_target"` + PrivilegeSourceType string `json:"privilege_source_type"` + PrivilegeSourceTypeName string `json:"privilege_source_type_name"` + Children []*AdminRolePrivilegeALLRes `json:"children" gorm:"-"` +} + +var typeName = map[string]string{ + "INTERFACE": "接口权限", + "RESOURCE": "资源权限", + "DATA": "数据权限", +} + +func (d *AdminRolePrivilegeTypedALLRes) Complete() { + d.TypeName = typeName[d.Type] +} + +func (d *AdminRolePrivilegeALLRes) Complete() { + d.PrivilegeSourceTypeName = typeName[d.PrivilegeSourceType] +} + +type SystemSettingRes struct { + ID string `json:"id"` + Name string `json:"name"` // 配置名称 + Key string `json:"key"` // 配置key + Value string `json:"value"` // 配置内容 + Ext string `json:"ext"` // 扩展信息 + Desc string `json:"desc"` // 描述说明 + Changeable int32 `json:"changeable"` // 是否可以修改 1=可修改 2=不可修改 + Deletable int32 `json:"deletable"` // 是否可以删除 1=可删除 2=不可删除 +} + +type AdminSystemContentRes struct { + ID string `json:"id"` + Name string `json:"name"` // 配置名称 + Key string `json:"key"` // 配置key + Value string `json:"value"` // 配置内容 + Ext string `json:"ext"` // 扩展信息 + Desc string `json:"desc"` // 描述说明 + Changeable int32 `json:"changeable"` // 是否可以修改 1=可修改 2=不可修改 + Deletable int32 `json:"deletable"` // 是否可以删除 1=可删除 2=不可删除 +} + +type AdminUserRoleAllRes struct { + ID string `json:"id"` // 用户-角色关联关系的ID + Authorized bool `json:"authorized"` // 是否已授权 + RoleID string `json:"role_id"` + RoleName string `json:"role_name"` + RoleCode string `json:"role_code"` +} + +type UserCheckRes struct { + Allowed bool `json:"allowed"` + ErrMsg string `json:"err_msg"` +} + +func (d UserCheckRes) HasError() bool { + return len(d.ErrMsg) > 0 +} + +type AdminUserResourceItemRes struct { + ID string `json:"-"` + ParentID string `json:"-"` + Code string `json:"code"` + Name string `json:"name"` + Level int32 `json:"level"` + Target string `json:"target"` + Desc string `json:"desc"` + Children []*AdminUserResourceItemRes `json:"children,omitempty" gorm:"-"` +} diff --git a/pkg/res/common_basic.go b/pkg/res/common_basic.go new file mode 100644 index 0000000..c73beb9 --- /dev/null +++ b/pkg/res/common_basic.go @@ -0,0 +1,15 @@ +package res + +type AttachmentDTO struct { + ID string `json:"id"` + Filename string `json:"filename"` + Url string `json:"url"` + ThumbUrl string `json:"thumb_url"` +} + +type AttachmentRes struct { + ID string `json:"id"` + Filename string `json:"filename"` + Url string `json:"url"` + ThumbUrl string `json:"thumb_url"` +} diff --git a/pkg/res/match.go b/pkg/res/match.go new file mode 100644 index 0000000..ba0a055 --- /dev/null +++ b/pkg/res/match.go @@ -0,0 +1,405 @@ +package res + +type BasicInfo struct { + AbbrEn string `json:"abbr_en"` + AbbrZh string `json:"abbr_zh"` + Bonus string `json:"bonus"` + CityName string `json:"city_name"` + Color string `json:"color"` + Cover string `json:"cover"` + DispName string `json:"disp_name"` + EndTime string `json:"end_time"` + Grade string `json:"grade"` + GradeLabel string `json:"grade_label"` + ID string `json:"id"` + Logo string `json:"logo"` + Mode string `json:"mode"` + SpecialColor string `json:"special_color"` + SpecialGradeLabel string `json:"special_grade_label"` + StartTime string `json:"start_time"` + Status string `json:"status"` +} + +type Team struct { + Abbr string `json:"abbr"` + ID string `json:"id"` + Logo string `json:"logo"` + Name string `json:"name"` +} + +type WinTeam struct { + Abbr string `json:"abbr"` + ID string `json:"id"` + Logo string `json:"logo"` + Name string `json:"name"` +} + +type MatchItem struct { + BasicInfo BasicInfo `json:"basic_info"` + IsFollow int64 `json:"is_follow"` + PageToken string `json:"page_token"` + RecentMatch interface{} `json:"recent_match"` + Teams []Team `json:"teams"` + WinTeam WinTeam `json:"win_team"` +} +type Data struct { + APIGo bool `json:"api_go"` + Items []MatchItem `json:"items"` + Stats []string `json:"stats"` +} + +type MatchResponse struct { + Data Data `json:"data"` + Errcode int64 `json:"errcode"` + Message interface{} `json:"message"` + Success bool `json:"success"` +} + +// 详情返回的 +type MatchDetailData struct { + Basic DetailBasic `json:"basic"` + CurTeamRank []CurTeamRank `json:"cur_team_rank"` + PointType string `json:"point_type"` + RelativeTTS []string `json:"relative_tts"` + TeamRank []TeamRank `json:"team_rank"` + Teams []TeamElement `json:"teams"` +} + +type DetailBasic struct { + AbbrEn string `json:"abbr_en"` + AbbrZh string `json:"abbr_zh"` + Bonus string `json:"bonus"` + Character string `json:"character"` + CityName string `json:"city_name"` + EndTime string `json:"end_time"` + Grade string `json:"grade"` + ID string `json:"id"` + Logo string `json:"logo"` + NameEn string `json:"name_en"` + NameZh string `json:"name_zh"` + StartTime string `json:"start_time"` + Status string `json:"status"` + TtID string `json:"tt_id"` + TtNameShow string `json:"tt_name_show"` +} + +type CurTeamRank struct { + Bonus string `json:"bonus"` + CupInfo string `json:"cup_info"` + MetalInfo string `json:"metal_info"` + Point string `json:"point"` + PointType string `json:"point_type"` + Promotion string `json:"promotion"` + Rank string `json:"rank"` + RankDesc string `json:"rank_desc"` + Team CurTeamRankTeam `json:"team"` + TtName []string `json:"tt_name"` +} + +type CurTeamRankTeam struct { + Abbr string `json:"abbr"` + GlobalBonus string `json:"global_bonus"` + GlobalRank string `json:"global_rank"` + ID string `json:"id"` + Logo string `json:"logo"` + Name string `json:"name"` + RegionName string `json:"region_name"` +} + +type TeamRank struct { + Bonus string `json:"bonus"` + CupInfo string `json:"cup_info"` + MetalInfo string `json:"metal_info"` + Point string `json:"point"` + PointType string `json:"point_type"` + Promotion string `json:"promotion"` + Rank string `json:"rank"` + RankDesc string `json:"rank_desc"` + Team TeamRankTeam `json:"team"` + TtName []string `json:"tt_name"` +} + +type TeamRankTeam struct { + Abbr string `json:"abbr"` + GlobalBonus string `json:"global_bonus"` + GlobalRank string `json:"global_rank"` + ID string `json:"id"` + Logo string `json:"logo"` + Name string `json:"name"` + RegionName string `json:"region_name"` +} + +type TeamElement struct { + Abbr string `json:"abbr"` + CustomText1 string `json:"custom_text1"` + CustomText2 string `json:"custom_text2"` + GlobalBonus string `json:"global_bonus"` + GlobalRank string `json:"global_rank"` + ID string `json:"id"` + Logo string `json:"logo"` + Name string `json:"name"` + PromotionFromTt PromotionFromTt `json:"promotion_from_tt"` + PromotionRank string `json:"promotion_rank"` + RegionName string `json:"region_name"` + TtSource string `json:"tt_source"` +} + +type PromotionFromTt struct { + AbbrEn string `json:"abbr_en"` + AbbrZh string `json:"abbr_zh"` + Cover string `json:"cover"` + ID string `json:"id"` + LocalID string `json:"local_id"` + Logo string `json:"logo"` + NameEn string `json:"name_en"` + NameZh string `json:"name_zh"` + RelatedType string `json:"related_type"` +} + +type MatchDetailResponse struct { + Data MatchDetailData `json:"data"` + Errcode int64 `json:"errcode"` + Message interface{} `json:"message"` + Success bool `json:"success"` +} + +// 赛程的 +type MatchBattleResponse struct { + Data BattleData `json:"data"` + Errcode int64 `json:"errcode"` + Message interface{} `json:"message"` + Success bool `json:"success"` +} + +type BattleData struct { + Matches []Match `json:"matches"` + StateVer string `json:"state_ver"` + StateVerV1 interface{} `json:"state_ver_v1"` + TodayMcTotal string `json:"today_mc_total"` +} + +type Match struct { + LikeData LikeData `json:"like_data"` + McInfo McInfo `json:"mc_info"` + State State `json:"state"` + TtInfo TtInfo `json:"tt_info"` +} + +type LikeData struct { + IsDislikes bool `json:"is_dislikes"` + IsLikes bool `json:"is_likes"` + Team1Likes int64 `json:"team1_likes"` + Team2Likes int64 `json:"team2_likes"` +} + +type McInfo struct { + Display string `json:"display"` + Format string `json:"format"` + GameType string `json:"game_type"` + Grade string `json:"grade"` + GroupID int64 `json:"group_id"` + ID string `json:"id"` + PlanTs string `json:"plan_ts"` + RoundName string `json:"round_name"` + SortNum int64 `json:"sort_num"` + Star string `json:"star"` + T1Info T1Info `json:"t1_info"` + T2Info T2Info `json:"t2_info"` + Tags string `json:"tags"` + TtStage string `json:"tt_stage"` + TtStageDesc string `json:"tt_stage_desc"` + UserData UserData `json:"user_data"` +} + +type T1Info struct { + Bonus string `json:"bonus"` + Country string `json:"country"` + DispName string `json:"disp_name"` + ID string `json:"id"` + Logo string `json:"logo"` + Rank string `json:"rank"` + VRank interface{} `json:"v_rank"` +} + +type T2Info struct { + Bonus string `json:"bonus"` + Country string `json:"country"` + DispName string `json:"disp_name"` + ID string `json:"id"` + Logo string `json:"logo"` + Rank string `json:"rank"` + VRank interface{} `json:"v_rank"` +} + +type UserData struct { + SubStatus int64 `json:"sub_status"` +} + +type State struct { + BoutStates []BoutState `json:"bout_states"` + DarkHorse string `json:"dark_horse"` + DropAct int64 `json:"drop_act"` + HasExpertPlan int64 `json:"has_expert_plan"` + HasForecast int64 `json:"has_forecast"` + HighlightStatus int64 `json:"highlight_status"` + LiveStatus *Status `json:"live_status"` + RoundNum string `json:"round_num"` + Status string `json:"status"` + T1Odds string `json:"t1_odds"` + T1OddsPercent string `json:"t1_odds_percent"` + T1QuickScore string `json:"t1_quick_score"` + T1Score string `json:"t1_score"` + T2Odds string `json:"t2_odds"` + T2OddsPercent string `json:"t2_odds_percent"` + T2QuickScore string `json:"t2_quick_score"` + T2Score string `json:"t2_score"` + VideoStatus *Status `json:"video_status"` +} + +type BoutState struct { + BaseTs string `json:"base_ts"` + BoutNum string `json:"bout_num"` + Display string `json:"display"` + EndTs string `json:"end_ts"` + FieldConf []string `json:"field_conf"` + GameTime string `json:"game_time"` + MapName string `json:"map_name"` + Now string `json:"now"` + Result string `json:"result"` + RoundNum string `json:"round_num"` + Status string `json:"status"` + T1BoutFlags []string `json:"t1_bout_flags"` + T1FhRounds string `json:"t1_fh_rounds"` + T1Kill string `json:"t1_kill"` + T1OtRounds string `json:"t1_ot_rounds"` + T1QuickScore string `json:"t1_quick_score"` + T1ScRounds string `json:"t1_sc_rounds"` + T1Score string `json:"t1_score"` + T2BoutFlags []string `json:"t2_bout_flags"` + T2FhRounds string `json:"t2_fh_rounds"` + T2Kill string `json:"t2_kill"` + T2OtRounds string `json:"t2_ot_rounds"` + T2QuickScore string `json:"t2_quick_score"` + T2ScRounds string `json:"t2_sc_rounds"` + T2Score string `json:"t2_score"` +} + +type TtInfo struct { + AbbrEn string `json:"abbr_en"` + AbbrZh string `json:"abbr_zh"` + Bonus string `json:"bonus"` + CityName string `json:"city_name"` + Color string `json:"color"` + Cover string `json:"cover"` + DispName string `json:"disp_name"` + EndTime string `json:"end_time"` + Grade string `json:"grade"` + GradeLabel string `json:"grade_label"` + ID string `json:"id"` + Logo string `json:"logo"` + Mode string `json:"mode"` + SpecialColor string `json:"special_color"` + SpecialGradeLabel string `json:"special_grade_label"` + StartTime string `json:"start_time"` + Status string `json:"status"` +} + +type Status struct { + Integer *int64 + String *string +} + +// 选手榜 +type PlayerRankResponse struct { + Data PlayerRankData `json:"data"` + Errcode int64 `json:"errcode"` + Message interface{} `json:"message"` + Success bool `json:"success"` +} + +type PlayerRankData struct { + Items []PlayerItem `json:"items"` + TotalPage string `json:"total_page"` + TotalRows string `json:"total_rows"` +} + +type PlayerItem struct { + CountryLogo string `json:"country_logo"` + FieldValues FieldValues `json:"field_values"` + PlayerID string `json:"player_id"` + PlayerName string `json:"player_name"` + Portrait string `json:"portrait"` + TeamLogo string `json:"team_logo"` +} + +type FieldValues struct { + Rating string `json:"rating"` +} + +// 战队榜 +type TeamRankResponse struct { + Data TeamRankData `json:"data"` + Errcode int64 `json:"errcode"` + Message interface{} `json:"message"` + Success bool `json:"success"` +} + +type TeamRankData struct { + Items []TeamItem `json:"items"` + TotalPage string `json:"total_page"` + TotalRows string `json:"total_rows"` +} + +type TeamItem struct { + CountryLogo string `json:"country_logo"` + FieldValues TeamFieldValues `json:"field_values"` + TeamID string `json:"team_id"` + TeamLogo string `json:"team_logo"` + TeamName string `json:"team_name"` +} + +type TeamFieldValues struct { + AvgAssist string `json:"avg_assist"` + AvgDeath string `json:"avg_death"` + AvgKill string `json:"avg_kill"` + AvgRound string `json:"avg_round"` + CTFirstWinRate string `json:"ct_first_win_rate"` + CTFirstWinRound string `json:"ct_first_win_round"` + CTWinRate string `json:"ct_win_rate"` + CTWinRound string `json:"ct_win_round"` + FirstDeathNum string `json:"first_death_num"` + FirstDeathRate string `json:"first_death_rate"` + FirstFiveWinNum string `json:"first_five_win_num"` + FirstFiveWinRate string `json:"first_five_win_rate"` + FirstKill string `json:"first_kill"` + FirstKillRate string `json:"first_kill_rate"` + FirstTenWinNum string `json:"first_ten_win_num"` + FirstTenWinRate string `json:"first_ten_win_rate"` + GamePlayed string `json:"game_played"` + GlobalBonus string `json:"global_bonus"` + GlobalRank string `json:"global_rank"` + Kd string `json:"kd"` + KdDiff string `json:"kd_diff"` + KdRate string `json:"kd_rate"` + MapNum string `json:"map_num"` + MapWinLoss string `json:"map_win_loss"` + MapWinRate string `json:"map_win_rate"` + Point string `json:"point"` + Rank string `json:"rank"` + RankChange string `json:"rank_change"` + RankDiff string `json:"rank_diff"` + Rating string `json:"rating"` + RegionName string `json:"region_name"` + Score string `json:"score"` + TFirstWinRate string `json:"t_first_win_rate"` + TFirstWinRound string `json:"t_first_win_round"` + TWinRate string `json:"t_win_rate"` + TWinRound string `json:"t_win_round"` + TotalAssist string `json:"total_assist"` + TotalDeath string `json:"total_death"` + TotalKill string `json:"total_kill"` + TotalRound string `json:"total_round"` + ValvePoint string `json:"valve_point"` + ValveRank string `json:"valve_rank"` + WinRate string `json:"win_rate"` +} diff --git a/pkg/secure/auth.go b/pkg/secure/auth.go new file mode 100644 index 0000000..0a1895a --- /dev/null +++ b/pkg/secure/auth.go @@ -0,0 +1,11 @@ +package secure + +const ( + HeaderScopeCode = "X-SCOPE" + HeaderNonce = "X-NONCE" + HeaderSign = "X-S-SIGN" + + TypeResource = "RESOURCE" // 资源权限 + TypeInterface = "INTERFACE" // 接口权限 + TypeData = "DATA" // 数据权限 +) diff --git a/pkg/secure/jwt.go b/pkg/secure/jwt.go new file mode 100644 index 0000000..4a1f58d --- /dev/null +++ b/pkg/secure/jwt.go @@ -0,0 +1,86 @@ +package secure + +import ( + "crypto/ecdsa" + "strings" + "time" + + "github.com/golang-jwt/jwt/v5" + "github.com/google/uuid" +) + +type Claims struct { + Username string `json:"un,omitempty"` + Nickname string `json:"nn,omitempty"` + ExtID string `json:"ei,omitempty"` + jwt.RegisteredClaims +} + +func (c Claims) NeedRefresh(d time.Duration) bool { + return c.ExpiresAt.Before(time.Now().Add(d)) +} + +func GenerateToken(iss, uid, username, nickname string, exp, nbf, iat time.Time, aud []string, primaryKey string) (tokenStr string, e error) { + token := jwt.NewWithClaims(jwt.SigningMethodES256, &Claims{ + Username: username, + Nickname: nickname, + RegisteredClaims: jwt.RegisteredClaims{ + Issuer: iss, // 令牌发行者 + Subject: uid, // 统一用户ID + Audience: aud, // 受众 + ExpiresAt: &jwt.NumericDate{Time: exp}, // 过期时间 + NotBefore: &jwt.NumericDate{Time: nbf}, // 启用时间 + IssuedAt: &jwt.NumericDate{Time: iat}, // 发布时间 + ID: JwtID(), // jwt ID + }, + }) + var ecdsaKey *ecdsa.PrivateKey + if ecdsaKey, e = jwt.ParseECPrivateKeyFromPEM([]byte(primaryKey)); e != nil { + panic(e) + } + tokenStr, e = token.SignedString(ecdsaKey) + return +} + +func GenerateTokenWithEID(iss, uid, username, nickname, eid string, exp, nbf, iat time.Time, aud []string, primaryKey string) (tokenStr string, e error) { + token := jwt.NewWithClaims(jwt.SigningMethodES256, &Claims{ + Username: username, + Nickname: nickname, + ExtID: eid, + RegisteredClaims: jwt.RegisteredClaims{ + Issuer: iss, // 令牌发行者 + Subject: uid, // 统一用户ID + Audience: aud, // 受众 + ExpiresAt: &jwt.NumericDate{Time: exp}, // 过期时间 + NotBefore: &jwt.NumericDate{Time: nbf}, // 启用时间 + IssuedAt: &jwt.NumericDate{Time: iat}, // 发布时间 + ID: JwtID(), // jwt ID + }, + }) + var ecdsaKey *ecdsa.PrivateKey + if ecdsaKey, e = jwt.ParseECPrivateKeyFromPEM([]byte(primaryKey)); e != nil { + panic(e) + } + tokenStr, e = token.SignedString(ecdsaKey) + return +} + +func VerifyToken(tokenStr, publicKey string) (access bool, claims Claims, e error) { + var ecdsaKeyPub *ecdsa.PublicKey + if ecdsaKeyPub, e = jwt.ParseECPublicKeyFromPEM([]byte(publicKey)); e != nil { + return + } + var token *jwt.Token + if token, e = jwt.ParseWithClaims(tokenStr, &claims, func(token *jwt.Token) (interface{}, error) { + return ecdsaKeyPub, nil + }); e != nil { + return + } + access = token.Valid + return +} + +func JwtID() string { + u4 := uuid.New() + return strings.ReplaceAll(u4.String(), "-", "") +} diff --git a/pkg/secure/jwt_test.go b/pkg/secure/jwt_test.go new file mode 100644 index 0000000..43ad45d --- /dev/null +++ b/pkg/secure/jwt_test.go @@ -0,0 +1,12 @@ +package secure + +import ( + "fmt" + "testing" +) + +func TestVerifyToken(t *testing.T) { + ts := "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Inlhbmd0YW8iLCJuaWNrbmFtZSI6IuadqOeEmCIsImlzcyI6InpreHFncm91cC5jb20iLCJzdWIiOiJhZjBmNzM4OGM0MDk0MWQzYmU5NTdiYmExM2RkMzExYiIsImV4cCI6MTY4NDkxMjAwNCwibmJmIjoxNjg0ODI1NjA0LCJpYXQiOjE2ODQ4MjU2MDQsImp0aSI6IjkyNzIzMDM0NGE5MTQ0MTU4OTQyYWI4YmQ2MzkwMmQ2In0.58aFVo5FyTem4Fc2PZVBVEB-0DO2hhHuJ34ASGZQh1Cmd3peD5V5scWPdtx3wF3FAkXG_uE-o9smboGeuqscKQ" + gotAccess, gotClaims, err := VerifyToken(ts, "") + fmt.Printf("%v %v %v\n", gotAccess, gotClaims, err) +} diff --git a/pkg/secure/password_test.go b/pkg/secure/password_test.go new file mode 100644 index 0000000..b87a0e1 --- /dev/null +++ b/pkg/secure/password_test.go @@ -0,0 +1,9 @@ +package secure + +import "testing" + +func Test_generatePasswd(t *testing.T) { + for i := 0; i < 20; i++ { + println(GeneratePasswd("advance", 16)) + } +} diff --git a/pkg/secure/tool.go b/pkg/secure/tool.go new file mode 100644 index 0000000..14db74e --- /dev/null +++ b/pkg/secure/tool.go @@ -0,0 +1,71 @@ +package secure + +import ( + "crypto/ecdsa" + "crypto/elliptic" + randcrypto "crypto/rand" + "crypto/x509" + "encoding/pem" + "fmt" + "math/rand" + "time" +) + +type PassLevel string + +const ( + High PassLevel = "advance" + Mid PassLevel = "mix" + Low PassLevel = "char" + Danger PassLevel = "num" + + nUmStr = "0123456789" + charStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + specStr = "+=-@#~,.[]()!%^*$" +) + +var ( + r = rand.New(rand.NewSource(time.Now().UnixNano())) +) + +func GeneratePasswd(level PassLevel, length int32) string { + var passwd = make([]byte, length, length) + var sourceStr string + switch level { + case Danger: + sourceStr = nUmStr + case Low: + sourceStr = charStr + case Mid: + sourceStr = fmt.Sprintf("%s%s", nUmStr, charStr) + case High: + sourceStr = fmt.Sprintf("%s%s%s", nUmStr, charStr, specStr) + default: + sourceStr = fmt.Sprintf("%s%s", nUmStr, charStr) + } + for i := range passwd { + index := r.Intn(len(sourceStr)) + passwd[i] = sourceStr[index] + } + return string(passwd) +} + +func GenerateECDSAKeyPem() (primaryKey, publicKey []byte, e error) { + var ( + key *ecdsa.PrivateKey + sec []byte + pk []byte + ) + if key, e = ecdsa.GenerateKey(elliptic.P256(), randcrypto.Reader); e != nil { + return + } + if sec, e = x509.MarshalECPrivateKey(key); e != nil { + return + } + if pk, e = x509.MarshalPKIXPublicKey(key.Public()); e != nil { + return + } + primaryKey = pem.EncodeToMemory(&pem.Block{Type: "ECD PRIVATE KEY", Bytes: sec}) + publicKey = pem.EncodeToMemory(&pem.Block{Type: "ECD PUBLIC KEY", Bytes: pk}) + return +} diff --git a/pkg/tools/float_util.go b/pkg/tools/float_util.go new file mode 100644 index 0000000..ed4c6b7 --- /dev/null +++ b/pkg/tools/float_util.go @@ -0,0 +1,7 @@ +package tools + +import "math" + +func Float64EqualsZero(data float64) bool { + return math.Abs(data-0) < 1e-5 +} diff --git a/pkg/tools/jwt.go b/pkg/tools/jwt.go new file mode 100644 index 0000000..b40f7c8 --- /dev/null +++ b/pkg/tools/jwt.go @@ -0,0 +1,105 @@ +package tools + +import ( + "crypto/ecdsa" + "errors" + "strings" + "time" + + "github.com/golang-jwt/jwt/v5" + "github.com/google/uuid" +) + +const ( + HeaderNonce = "X-NONCE" + HeaderSign = "X-S-SIGN" + + TypeResource = "RESOURCE" // 资源权限 + TypeInterface = "INTERFACE" // 接口权限 + TypeData = "DATA" // 数据权限 + + HeaderUserId = "X-USER-ID" + HeaderScopeId = "X-SCOPE-ID" + HeaderScopeCode = "X-SCOPE" + HeaderUsername = "X-USERNAME" + HeaderNickname = "X-NICKNAME" + HeaderClient = "X-CLIENT" + + ClientAdminCompany = "ADMIN_COMPANY" + ClientAdminAppUser = "APP_USER" + ClientAdminAppDriver = "APP_DRIVER" +) + +const ( + iss = "anxpp.com" + secret = `-----BEGIN ECD PRIVATE KEY----- +MHcCAQEEIDjrRKvb5a6Klcqi38w5vQMZZluja1DTOG+UFrh3hRxfoAoGCCqGSM49AwEHoUQDQgAEt6K29uBUrZmM4Sdyw/w9d2EUk1kiV8YM+tmGkuVyXQ+qFcbl7f4V1UMbKzXsqmyCPxgFBaeN61/nxdi99Ds4bw== +-----END ECD PRIVATE KEY-----` + pk = `-----BEGIN ECD PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt6K29uBUrZmM4Sdyw/w9d2EUk1kiV8YM+tmGkuVyXQ+qFcbl7f4V1UMbKzXsqmyCPxgFBaeN61/nxdi99Ds4bw== +-----END ECD PUBLIC KEY-----` +) + +type Claims struct { + Username string `json:"un,omitempty"` + Nickname string `json:"nn,omitempty"` + Client string `json:"cli,omitempty"` + jwt.RegisteredClaims +} + +func (c Claims) NeedRefresh(d time.Duration) bool { + return c.ExpiresAt.Before(time.Now().Add(d)) +} + +func GenerateToken(client, uid, username, nickname string, exp, nbf, iat time.Time, aud []string) (tokenStr string, e error) { + token := jwt.NewWithClaims(jwt.SigningMethodES256, &Claims{ + Username: username, + Nickname: nickname, + Client: client, + RegisteredClaims: jwt.RegisteredClaims{ + Issuer: iss, // 令牌发行者 + Subject: uid, // 统一用户ID + Audience: aud, // 受众 + ExpiresAt: &jwt.NumericDate{Time: exp}, // 过期时间 + NotBefore: &jwt.NumericDate{Time: nbf}, // 启用时间 + IssuedAt: &jwt.NumericDate{Time: iat}, // 发布时间 + ID: JwtID(), // jwt ID + }, + }) + var ecdsaKey *ecdsa.PrivateKey + if ecdsaKey, e = jwt.ParseECPrivateKeyFromPEM([]byte(secret)); e != nil { + panic(e) + } + tokenStr, e = token.SignedString(ecdsaKey) + return +} + +func VerifyToken(tokenStr string) (access bool, claims Claims, e error) { + var ecdsaKeyPub *ecdsa.PublicKey + if ecdsaKeyPub, e = jwt.ParseECPublicKeyFromPEM([]byte(pk)); e != nil { + return + } + var token *jwt.Token + if token, e = jwt.ParseWithClaims(tokenStr, &claims, func(token *jwt.Token) (interface{}, error) { + return ecdsaKeyPub, nil + }); e != nil { + return + } + access = token.Valid + return +} + +func JwtID() string { + u4 := uuid.New() + return strings.ReplaceAll(u4.String(), "-", "") +} + +func ParseAuthToken(jwt string) (access bool, claims Claims, e error) { + // jwt := c.GetHeader("Authorization") + fields := strings.Fields(jwt) + if len(fields) < 2 { + e = errors.New("wrong token") + return + } + return VerifyToken(fields[1]) +} diff --git a/pkg/tools/jwt_test.go b/pkg/tools/jwt_test.go new file mode 100644 index 0000000..1f415ad --- /dev/null +++ b/pkg/tools/jwt_test.go @@ -0,0 +1,69 @@ +package tools + +import ( + "testing" + "time" +) + +func TestGenerateToken(t *testing.T) { + type args struct { + client string + uid string + username string + nickname string + exp time.Time + nbf time.Time + iat time.Time + aud []string + } + var now = time.Now() + var loginExpiration = 60 * 24 * 30 // 30天 + tests := []struct { + name string + args args + wantTokenStr string + wantErr bool + }{ + // 28a08f58496f11eeb95f0242ac110004 + { + name: "test01", + args: struct { + client string + uid string + username string + nickname string + exp time.Time + nbf time.Time + iat time.Time + aud []string + }{ + client: "APP_USER", + uid: "28a08f58496f11eeb95f0242ac110004", + username: "driver001", + nickname: "driver001", + exp: now.Add(time.Minute * time.Duration(loginExpiration)), + nbf: now, + iat: now, + aud: []string{}, + }, + wantTokenStr: "", + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotTokenStr, err := GenerateToken(tt.args.client, tt.args.uid, tt.args.username, tt.args.nickname, tt.args.exp, tt.args.nbf, tt.args.iat, tt.args.aud) + if (err != nil) != tt.wantErr { + t.Errorf("GenerateToken() error = %v, wantErr %v", err, tt.wantErr) + return + } + if gotTokenStr != tt.wantTokenStr { + t.Errorf("GenerateToken() = %v, want %v", gotTokenStr, tt.wantTokenStr) + } + }) + } +} + +func TestUuid(t *testing.T) { + println(Uuid()) +} diff --git a/pkg/tools/list.go b/pkg/tools/list.go new file mode 100644 index 0000000..26f3d60 --- /dev/null +++ b/pkg/tools/list.go @@ -0,0 +1,26 @@ +package tools + +func ListToMap[K comparable, S any](list []S, keyFunc func(S) K) map[K]S { + if len(list) == 0 { + return make(map[K]S) + } + result := make(map[K]S, len(list)) + for _, item := range list { + key := keyFunc(item) + result[key] = item + } + return result +} +func SliceToMapList[K comparable, V any](slice []V, keyFunc func(V) K) map[K][]V { + result := make(map[K][]V) + for _, v := range slice { + key := keyFunc(v) + if _, ok := result[key]; !ok { + result[key] = make([]V, 0) + result[key] = append(result[key], v) + } else { + result[key] = append(result[key], v) + } + } + return result +} diff --git a/pkg/tools/password.go b/pkg/tools/password.go new file mode 100644 index 0000000..d3ee8a1 --- /dev/null +++ b/pkg/tools/password.go @@ -0,0 +1,107 @@ +package tools + +import ( + "crypto/ecdsa" + "crypto/elliptic" + randcrypto "crypto/rand" + "crypto/x509" + "encoding/pem" + "fmt" + "math/rand" + "time" +) + +const ( + NUmStr = "0123456789" + CharStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + SpecStr = "+=-@#~,.[]()!%^*$" +) + +var ( + r = rand.New(rand.NewSource(time.Now().UnixNano())) +) + +func GeneratePasswd(level string, length int32) string { + //var ( + // length int = 16 + // charset = "advance" + //) + //初始化密码切片 + var passwd = make([]byte, length, length) + //源字符串 + var sourceStr string + //判断字符类型,如果是数字 + switch level { + case "num": + sourceStr = NUmStr + case "char": + sourceStr = level + case "mix": + sourceStr = fmt.Sprintf("%s%s", NUmStr, CharStr) + case "advance": + sourceStr = fmt.Sprintf("%s%s%s", NUmStr, CharStr, SpecStr) + default: + sourceStr = NUmStr + } + //遍历,生成一个随机index索引, + for i := range passwd { + index := r.Intn(len(sourceStr)) + passwd[i] = sourceStr[index] + } + return string(passwd) +} + +type PassLevel string + +const ( + High PassLevel = "advance" + Mid PassLevel = "mix" + Low PassLevel = "char" + Danger PassLevel = "num" + + nUmStr = "0123456789" + charStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + specStr = "+=-@#~,.[]()!%^*$" +) + +func GeneratePwd(level PassLevel, length int32) string { + var passwd = make([]byte, length, length) + var sourceStr string + switch level { + case Danger: + sourceStr = nUmStr + case Low: + sourceStr = charStr + case Mid: + sourceStr = fmt.Sprintf("%s%s", nUmStr, charStr) + case High: + sourceStr = fmt.Sprintf("%s%s%s", nUmStr, charStr, specStr) + default: + sourceStr = fmt.Sprintf("%s%s", nUmStr, charStr) + } + for i := range passwd { + index := r.Intn(len(sourceStr)) + passwd[i] = sourceStr[index] + } + return string(passwd) +} + +func GenerateECDSAKeyPem() (primaryKey, publicKey []byte, e error) { + var ( + key *ecdsa.PrivateKey + sec []byte + pk []byte + ) + if key, e = ecdsa.GenerateKey(elliptic.P256(), randcrypto.Reader); e != nil { + return + } + if sec, e = x509.MarshalECPrivateKey(key); e != nil { + return + } + if pk, e = x509.MarshalPKIXPublicKey(key.Public()); e != nil { + return + } + primaryKey = pem.EncodeToMemory(&pem.Block{Type: "ECD PRIVATE KEY", Bytes: sec}) + publicKey = pem.EncodeToMemory(&pem.Block{Type: "ECD PUBLIC KEY", Bytes: pk}) + return +} diff --git a/pkg/tools/path.go b/pkg/tools/path.go new file mode 100644 index 0000000..edec483 --- /dev/null +++ b/pkg/tools/path.go @@ -0,0 +1,34 @@ +package tools + +import ( + "github.com/spf13/viper" + "os" + "path" + "path/filepath" +) + +const ( + urlPre = "/api/v1/attachment" +) + +func Mkdir(basePath string, folderName string) string { + folderPath := filepath.Join(basePath, folderName) + _ = os.MkdirAll(folderPath, os.ModePerm) + return folderPath +} + +func BasePath() string { + return viper.GetString("attachment.path") +} + +func UrlBasePath() string { + return "/static" +} + +func URLPath(filePath string) string { + return filepath.Join("/", UrlBasePath(), filePath) +} + +func AttachmentUrl(relative string) string { + return path.Join(urlPre, relative) +} diff --git a/pkg/tools/picture/thumb_task.go b/pkg/tools/picture/thumb_task.go new file mode 100644 index 0000000..e159965 --- /dev/null +++ b/pkg/tools/picture/thumb_task.go @@ -0,0 +1,182 @@ +package picture + +import ( + "context" + //cache "ServiceAll/modules/company/internal/client/redis" + "servicebase/pkg/datasource" + "servicebase/pkg/log" + "servicebase/pkg/repo" + "servicebase/pkg/tools" + "fmt" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/disintegration/imaging" + "github.com/pkg/errors" + "github.com/spf13/viper" + "go.uber.org/zap" +) + +const ( + CurIndexName = "CUR_INDEX_DATA_ATTACHMENT" + CommonTypeImage = "IMAGE" + CommonTypeUnknown = "UNCLASSIFIED" + + pathThumb = "thumb" + FileTypeThumb = "jpg" +) + +var typeOfCommonType map[string]string + +func init() { + typeOfCommonType = map[string]string{ + "jpg": CommonTypeImage, + "png": CommonTypeImage, + "jfif": CommonTypeImage, + "jpeg": CommonTypeImage, + "bmp": CommonTypeImage, + "webp": CommonTypeImage, + "icon": CommonTypeImage, + } +} + +func ParseCommonType(_type string) string { + if v, ok := typeOfCommonType[_type]; ok { + return v + } + return CommonTypeUnknown +} + +func StartThumbTask() { + const lines = 10 + const dur = time.Second * 10 + for { + if cnt := ThumbTask(lines); cnt != lines { + time.Sleep(dur) + } + } +} + +// ThumbTask 图片缩略图任务 +// 定期扫描附件表,将未生成压缩图的图片生成压缩图 +func ThumbTask(lines int) (cnt int) { + var ( + pid int64 + e error + ctx = context.Background() + w, h uint = 0, 100 + ) + if pid, e = curIndexPID(); e != nil { + log.Error("ThumbTask init error", zap.String("error", e.Error()), zap.Int64("pid", pid)) + return + } + var list []struct { + Pid int64 + ID string + CommonType string + FilePath string + FileType string + } + if e = datasource.DB.WithContext(ctx). + Raw("select * from data_attachment where pid>=? and common_type=? and file_thumb_path=? order by pid limit ?", pid, CommonTypeImage, "", lines). + Find(&list).Error; e != nil { + log.Error("ThumbTask select error", zap.String("error", e.Error()), zap.Int64("pid", pid)) + return + } + // todo with WaitGroup + //userCache := cache.User() + for _, item := range list { + if e = DoThumb(item.FilePath, item.ID, item.CommonType, item.FileType, w, h); e != nil { + log.Error("ThumbTask thumb error", + zap.String("error", e.Error()), + zap.Int64("pid", pid), + zap.String("path", item.FilePath), + zap.String("file", item.ID), + zap.String("type", item.FileType)) + return + } + //userCache.Set(ctx, CurIndexName, item.Pid+1, 0) + cnt++ + } + return +} + +// 获取开始生成缩略图的索引 +func curIndexPID() (pid int64, e error) { + // 取当前已压缩的位置 + //ctx := context.Background() + //userCache := cache.User() + //if pid, _ = userCache.Get(ctx, CurIndexName).Int64(); pid == 0 { + // // 当前不存在,从数据库统计 + // if e = datasource.DB.WithContext(ctx). + // Raw("select pid from data_attachment where common_type=? and file_thumb_path=? order by pid limit 1", CommonTypeImage, ""). + // First(&pid).Error; e != nil { + // return + // } + // userCache.Set(ctx, CurIndexName, pid, 0) + //} + return +} + +func DoThumb(path, id, commonType, _type string, w, h uint) error { + if w == 0 && h == 0 { + return errors.New("尺寸错误") + } + commonType = strings.ToLower(commonType) + // 得到后缀和 + image, err := imaging.Open(filepath.Join(viper.GetString("attachment.path"), path)) + if err != nil { + return err + } + var suffix []byte + if w > 0 { + suffix = append(suffix, 'w') + suffix = append(suffix, strconv.Itoa(int(w))...) + } + if h > 0 { + suffix = append(suffix, 'h') + suffix = append(suffix, strconv.Itoa(int(h))...) + } + _ = tools.Mkdir(filepath.Join(viper.GetString("attachment.path"), commonType), pathThumb) + thumbFilename := filepath.Join(commonType, pathThumb, fmt.Sprintf("%s.%s.%s", id, suffix, FileTypeThumb)) + targetImage := imaging.Resize(image, int(w), int(h), imaging.Lanczos) + return repo.Q.Transaction(func(tx *repo.Query) error { + if _, e := tx.DataAttach.WithContext(context.Background()). + Select(tx.DataAttach.FileThumbPath, tx.DataAttach.FileThumbType). + Where(tx.DataAttach.ID.Eq(id)). + UpdateSimple( + tx.DataAttach.FileThumbPath.Value(thumbFilename), + tx.DataAttach.FileThumbType.Value(FileTypeThumb), + ); e != nil { + return e + } + return imaging.Save(targetImage, filepath.Join(filepath.Join(viper.GetString("attachment.path"), thumbFilename))) + }) +} + +func Do(path, id, commonType, _type string, w, h uint) (string, error) { + if w == 0 && h == 0 { + return "", errors.New("尺寸错误") + } + commonType = strings.ToLower(commonType) + // 得到后缀和 + image, err := imaging.Open(filepath.Join(viper.GetString("attachment.path"), path)) + if err != nil { + return "", err + } + var suffix []byte + if w > 0 { + suffix = append(suffix, 'w') + suffix = append(suffix, strconv.Itoa(int(w))...) + } + if h > 0 { + suffix = append(suffix, 'h') + suffix = append(suffix, strconv.Itoa(int(h))...) + } + _ = tools.Mkdir(filepath.Join(viper.GetString("attachment.path"), commonType), pathThumb) + thumbFilename := filepath.Join(commonType, pathThumb, fmt.Sprintf("%s.%s.%s", id, suffix, FileTypeThumb)) + targetImage := imaging.Resize(image, int(w), int(h), imaging.Lanczos) + return thumbFilename, imaging.Save(targetImage, filepath.Join(filepath.Join(viper.GetString("attachment.path"), thumbFilename))) +} diff --git a/pkg/tools/picture/thumb_task_test.go b/pkg/tools/picture/thumb_task_test.go new file mode 100644 index 0000000..6d5de98 --- /dev/null +++ b/pkg/tools/picture/thumb_task_test.go @@ -0,0 +1,57 @@ +package picture + +import ( + "servicebase/pkg/datasource" + "servicebase/pkg/log" + "fmt" + "testing" + + "github.com/disintegration/imaging" + "github.com/spf13/viper" +) + +func init() { + viper.Set("db.connectString", "zhzl:Zhzl_2022@tcp(cq.anxpp.com:3306)/data_front?charset=utf8mb4&parseTime=True&loc=Local") + log.Init() + datasource.InitMySQl() +} + +func TestThumbTask(t *testing.T) { + path := "../../../data/IMAGE/d4d7c746cce146a190cf97154c6f07c1.jfif" + tsrc, err := imaging.Open(path) + if err != nil { + println(err) + return + } + // 以下质量由低到高 + //dstImage := imaging.Resize(tsrc, 0, 100, imaging.NearestNeighbor) + //err = imaging.Save(dstImage, fmt.Sprintf("%s%s.%s", "../../../data/IMAGE/", "NearestNeighbor", "jpg")) + //if err != nil { + // println(err.Error()) + //} + //dstImage = imaging.Resize(tsrc, 0, 100, imaging.Linear) + //err = imaging.Save(dstImage, fmt.Sprintf("%s%s.%s", "../../../data/IMAGE/", "Linear", "jpg")) + //if err != nil { + // println(err.Error()) + //} + //dstImage = imaging.Resize(tsrc, 0, 100, imaging.CatmullRom) + //err = imaging.Save(dstImage, fmt.Sprintf("%s%s.%s", "../../../data/IMAGE/", "CatmullRom", "jpg")) + //if err != nil { + // println(err.Error()) + //} + dstImage := imaging.Resize(tsrc, 0, 100, imaging.Lanczos) + err = imaging.Save(dstImage, fmt.Sprintf("%s%s.%s", "../../../data/IMAGE/", "Lanczos", "jpg")) + if err != nil { + println(err.Error()) + } + dstImage = imaging.Resize(tsrc, 0, 100, imaging.Lanczos) + err = imaging.Save(dstImage, fmt.Sprintf("%s%s.%s", "../../../data/IMAGE/", "Lanczos", "png")) + if err != nil { + println(err.Error()) + } +} + +func Test_curIndexPID(t *testing.T) { + gotPid, err := curIndexPID() + println(gotPid, err) +} diff --git a/pkg/tools/safe.go b/pkg/tools/safe.go new file mode 100644 index 0000000..98a95da --- /dev/null +++ b/pkg/tools/safe.go @@ -0,0 +1,26 @@ +package tools + +import ( + "runtime/debug" + "servicebase/pkg/log" +) + +func Recover(cleanups ...func()) { + for _, cleanup := range cleanups { + cleanup() + } + + if p := recover(); p != nil { + log.ErrorF("occur panic: [%+v], stack info [%s]", p, debug.Stack()) + } +} + +func RunSafe(fn func()) { + defer Recover() + + fn() +} + +func GoSafe(fn func()) { + go RunSafe(fn) +} diff --git a/pkg/tools/strings.go b/pkg/tools/strings.go new file mode 100644 index 0000000..ebd391a --- /dev/null +++ b/pkg/tools/strings.go @@ -0,0 +1,332 @@ +package tools + +import ( + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "math/rand" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" + + "github.com/google/uuid" + "github.com/shopspring/decimal" +) + +const ( + defaultSaltLen = 4 +) + +func Uuid() string { + u7, _ := uuid.NewV7() + return strings.ReplaceAll(u7.String(), "-", "") +} + +func SafePStr(p *string) string { + if p == nil { + return "" + } + return *p +} + +func SafeI32(p *int32) int32 { + if p == nil { + return 0 + } + return *p +} + +func StrFromInt(i int) string { + return strconv.Itoa(i) +} + +func StrFromInt32(i int32) string { + return strconv.Itoa(int(i)) +} +func StrFromInt64(i int64) string { + return strconv.FormatInt(i, 10) +} + +func StrFromFloat32(f float32) string { + return strconv.FormatFloat(float64(f), 'f', -1, 32) +} + +func StrFromFloat64(f float64) string { + return strconv.FormatFloat(f, 'f', -1, 64) +} + +func MD5(str string) string { + h := md5.New() + h.Write([]byte(str)) + return hex.EncodeToString(h.Sum(nil)) +} + +func MD5WithSalt(str, salt string) string { + return MD5(str + salt) +} + +func RandSalt() string { + return RandSaltN(defaultSaltLen) +} + +func RandSaltN(n uint8) string { + if n == 0 { + return "" + } + var ans = make([]byte, n) + ans[0] = byte(rand.Intn(9)+1) + '0' + for i := byte(1); i < n; i++ { + ans[i] = byte(rand.Intn(10)) + '0' + } + return string(ans) +} + +func StrToInt(str string) int { + return int(StrToFloat(str)) +} +func StrToInt64(str string) int64 { + return int64(StrToFloat(str)) +} + +func StrToInt32(str string) int32 { + return int32(StrToFloat(str)) +} +func StrToFloat(str string) float64 { + if s, err := strconv.ParseFloat(str, 64); err != nil { + return 0 + } else { + return s + } +} + +// GetWeekEnd 根据年份和ISO周数结束日期(周日) +func GetWeekEnd(year, week int) (endWeek time.Time) { + // 1月4日至少是该年的第一周 + // 这是计算ISO周的一个参考点 + t := time.Date(year, time.January, 4, 0, 0, 0, 0, time.UTC) + + // 找到这一天所在的周一是哪一天 + // ISO周中周一是一周的第一天 + weekday := t.Weekday() + if weekday == time.Sunday { + weekday = 7 // 调整周日为7,以便正确计算偏移量 + } + // 计算到周一的偏移量 + offset := int(time.Monday - weekday) + if offset > 0 { + offset -= 7 + } + t = t.AddDate(0, 0, offset) + + // 计算目标周的起始日期(加上周数-1周) + t = t.AddDate(0, 0, (week-1)*7) + + return t.AddDate(0, 0, 6) +} + +// GetWeekRange 根据年份和ISO周数获取该周的开始日期(周一)和结束日期(周日) +func GetWeekRange(year, week int) (start, end string) { + // 1月4日至少是该年的第一周 + // 这是计算ISO周的一个参考点 + t := time.Date(year, time.January, 4, 0, 0, 0, 0, time.UTC) + + // 找到这一天所在的周一是哪一天 + // ISO周中周一是一周的第一天 + weekday := t.Weekday() + if weekday == time.Sunday { + weekday = 7 // 调整周日为7,以便正确计算偏移量 + } + // 计算到周一的偏移量 + offset := int(time.Monday - weekday) + if offset > 0 { + offset -= 7 + } + t = t.AddDate(0, 0, offset) + + // 计算目标周的起始日期(加上周数-1周) + t = t.AddDate(0, 0, (week-1)*7) + + // 开始日期是周一 + start = t.Format("2006-01-02") + + // 结束日期是周日(加6天) + end = t.AddDate(0, 0, 6).Format("2006-01-02") + + return +} +func DaysBetween(date1, date2 time.Time) int { + // 只比较日期部分,忽略时间 + y1, m1, d1 := date1.Date() + y2, m2, d2 := date2.Date() + date1 = time.Date(y1, m1, d1, 0, 0, 0, 0, date1.Location()) + date2 = time.Date(y2, m2, d2, 0, 0, 0, 0, date2.Location()) + // 计算时间差(纳秒) + diff := date1.Sub(date2) + if diff < 0 { + diff = -diff + } + + // 转换为天数 + return int(diff.Hours() / 24) +} + +func StrToDate(str string) time.Time { + layout := "2006-01-02" + t, _ := time.ParseInLocation(layout, str, time.Local) + return t +} +func StrToDateTime(str string) time.Time { + layout := "2006-01-02 15:04:05" + t, _ := time.ParseInLocation(layout, str, time.Local) + return t +} +func SecMobile(src string) string { + start, end := 3, 7 + bytes := []rune(src) + for start < end && start < len(bytes) { + bytes[start] = '*' + start++ + } + return string(bytes) +} + +const ( + lenMin = 4 + lenMax = 6 + defaultTimeout = time.Minute * 5 +) + +func RandomCode() string { + code, _ := RandomCodeByLen(lenMin) + return code +} + +func RandomCodeWithTimeout() (code string, validTo time.Time) { + code, _ = RandomCodeByLen(lenMin) + validTo = time.Now().Add(defaultTimeout) + return +} + +func RandomCodeByLen(len int) (code string, e error) { + if len < lenMin || len > lenMax { + e = errors.New("只能生成4~6位验证码") + return + } + switch len { + case 4: + code = fmt.Sprintf("%4d", r.Intn(8999)+1000) + case 5: + code = fmt.Sprintf("%5d", r.Intn(89999)+10000) + case 6: + code = fmt.Sprintf("%6d", r.Intn(899999)+100000) + } + return +} + +func MaskIDCardFlexible(id string) string { + length := utf8.RuneCountInString(id) + runes := []rune(id) + switch length { + case 18: + // 18位:前6后4 + return string(runes[:6]) + "**********" + string(runes[16:]) + case 15: + // 15位:前6后3(老身份证) + return string(runes[:6]) + "******" + string(runes[12:]) + case 0: + return "" + default: + return "****" // 或返回原值 / 错误提示 + } +} + +// 判断decimal是否是0.5的倍数 +func IsHalfMultiple(d decimal.Decimal) bool { + // 乘以2后检查是否为整数 + multiplied := d.Mul(decimal.NewFromInt(2)) + // 将整数部分转换为decimal类型后再比较 + intPart := decimal.NewFromInt(multiplied.IntPart()) + return multiplied.Equal(intPart) +} + +// IsChineseIDCard 检查输入是否为中国大陆合法的 18 位身份证号码 +func IsChineseIDCard(id string) bool { + // 1. 检查长度 + if utf8.RuneCountInString(id) != 18 { + return false + } + + // 2. 使用正则表达式校验格式 + // 第1-17位:数字;第18位:数字或X(大小写均可) + matched, err := regexp.MatchString(`^\d{17}[\dXx]$`, id) + if err != nil || !matched { + return false + } + + // 3. 校验最后一位校验码 + return validateCheckDigit(id) +} + +// validateCheckDigit 验证身份证最后一位校验码是否正确 +func validateCheckDigit(id string) bool { + // 权重因子 + factor := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2} + // 校验码对照表 + checkCode := []byte{'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'} + + sum := 0 + for i := 0; i < 17; i++ { + if id[i] < '0' || id[i] > '9' { + return false + } + sum += int(id[i]-'0') * factor[i] + } + // 计算校验码 + mod := sum % 11 + expected := checkCode[mod] + + // 比较最后一位(忽略大小写) + lastChar := id[17] + if lastChar >= 'a' && lastChar <= 'z' { + lastChar -= 32 // 转大写 + } + if lastChar >= 'A' && lastChar <= 'Z' { + lastChar += 32 // 转小写再比?不,直接比 'X' + } + return lastChar == expected || (lastChar == 'x' && expected == 'X') +} + +func IsMultipleOfHalf(d decimal.Decimal) bool { + // 乘以 2 + times2 := d.Mul(decimal.NewFromInt(2)) + + // 检查是否为整数(小数位为 0) + return times2.Equal(times2.Truncate(0)) +} +func NumToChinese(n int) string { + chineseDigits := []string{"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"} + return chineseDigits[n] +} + +// 将切片按每组10个元素拆分 +// 参数:原切片、每组元素数量(此处固定为10) +// 返回:拆分后的二维切片 +func PaginateList[T any](slice []T, groupSize int) [][]T { + var groups [][]T + length := len(slice) + + // 循环截取,每次取 groupSize 个元素 + for i := 0; i < length; i += groupSize { + end := i + groupSize + // 处理最后一组可能不足 groupSize 的情况 + if end > length { + end = length + } + // 截取当前组并添加到结果中 + groups = append(groups, slice[i:end]) + } + return groups +} diff --git a/pkg/tools/strings_test.go b/pkg/tools/strings_test.go new file mode 100644 index 0000000..ce1d4b8 --- /dev/null +++ b/pkg/tools/strings_test.go @@ -0,0 +1,19 @@ +package tools + +import "testing" + +func TestMD5(t *testing.T) { + str, salt := "123", "456" + println(MD5(str)) + println(MD5(str + salt)) + println(MD5WithSalt(str, salt)) +} + +func TestRandSaltN(t *testing.T) { + for i := 1; i < 10; i++ { + println(RandSalt()) + for j := 0; j < 10; j++ { + println(RandSaltN(uint8(i))) + } + } +} diff --git a/pkg/utils/http.go b/pkg/utils/http.go new file mode 100644 index 0000000..7b571d1 --- /dev/null +++ b/pkg/utils/http.go @@ -0,0 +1,145 @@ +package utils + +import ( + "context" + "crypto/sha1" + "encoding/base64" + "encoding/hex" + "io" + "io/ioutil" + "net/http" + "sort" + "strings" + "time" +) + +// 调用POST请求 +func HttpPost(url string, body string) (remoteResponse string, err error) { + + bodyReader := strings.NewReader(body) + //application/x-www-form-urlencoded + //application/json + _, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + + client := &http.Client{ + Timeout: time.Second * 20, // 设置客户端超时为5秒 + } + + response, err1 := client.Post(url, "application/x-www-form-urlencoded", bodyReader) + + if err1 != nil { + err = err1 + return + } + defer response.Body.Close() + + resBody, err2 := ioutil.ReadAll(response.Body) + + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(resBody) + + return +} + +// 调用Get请求 +func HttpGet(url string) (remoteResponse string, err error) { + + response, err1 := http.Get(url) + + if err1 != nil { + err = err1 + return + } + defer response.Body.Close() + + resBody, err2 := ioutil.ReadAll(response.Body) + + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(resBody) + + return +} + +// 复杂http请求 +func HttpDo(httpMethod string, url string, headerMap map[string]string, rawBody string) (remoteResponse string, err error) { + + _, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + + client := &http.Client{ + Timeout: time.Second * 20, // 设置客户端超时为5秒 + } + + req, err0 := http.NewRequest(httpMethod, url, strings.NewReader(rawBody)) + + if err0 != nil { + + err = err0 + return + } + + if len(headerMap) > 0 { + for k, v := range headerMap { + req.Header.Set(k, v) + } + } + + resp, err1 := client.Do(req) + + if err1 != nil { + err = err1 + return + } + + defer resp.Body.Close() + + body, err2 := ioutil.ReadAll(resp.Body) + if err2 != nil { + err = err2 + return + } + + remoteResponse = string(body) + + return + +} + +func CreateApiSign(params map[string]string, secret string) string { + + keys := make([]string, 20) + for key, _ := range params { + if key == "Signature" { + continue + } + keys = append(keys, key) + } + //按key升序 + sort.Strings(keys) + //把KEY值合并为字符串 + waitSignString := "" + for _, value := range keys { + waitSignString += base64.StdEncoding.EncodeToString([]byte(params[value])) + } + //加上密钥 + appSecret := secret + waitSignString += appSecret + + // log.InfoF("waitSignString: %s", waitSignString) + //sha1加密 + t := sha1.New() + io.WriteString(t, waitSignString) + sign := t.Sum(nil) + + return hex.EncodeToString(sign) + +} diff --git a/pkg/utils/limit.go b/pkg/utils/limit.go new file mode 100644 index 0000000..bad530e --- /dev/null +++ b/pkg/utils/limit.go @@ -0,0 +1,88 @@ +package utils + +import ( + "sync" + "time" + + "github.com/anxpp/beego/context" + + "golang.org/x/time/rate" +) + +// Global Rate Limiter Configuration +// 使用 rate.NewLimiter 创建一个全局限流器。 +// rate.Every(5*time.Second/500) 设置了令牌的生成速率,每 5 秒生成 500 个令牌,即每秒 100 个。500 是桶的容量,允许在短时间内处理 500 个突发请求。 +const ( + globalBurst = 500 // Example: A burst capacity of 500 + globalDuration = 5 * time.Second +) + +// User Rate Limiter Configuration +// 使用 sync.Map 存储每个用户的限流器。sync.Map 是并发安全的,适合在多个 goroutine 中存取数据。getUserLimiter 函数负责获取或为新用户创建限流器。 +const ( + userBurst = 20 // Example: A burst capacity of 20 + userDuration = 3 * time.Second +) + +// Global Limiter +var globalLimiter *rate.Limiter + +func init() { + // Initialize global rate limiter with a 5-second interval + globalLimiter = rate.NewLimiter(rate.Every(globalDuration/time.Duration(globalBurst)), globalBurst) +} + +// User-specific limiters +var ( + userLimiters sync.Map + mu sync.Mutex +) + +// getUserLimiter retrieves or creates a user-specific rate limiter. +func getUserLimiter(userID string) *rate.Limiter { + mu.Lock() + defer mu.Unlock() + + limiter, ok := userLimiters.Load(userID) + if !ok { + // Create a new limiter for the user + newLimiter := rate.NewLimiter(rate.Every(userDuration/time.Duration(userBurst)), userBurst) + userLimiters.Store(userID, newLimiter) + return newLimiter + } + + return limiter.(*rate.Limiter) +} + +// RateLimitFilter is a Beego filter for rate limiting. +// 过滤器逻辑 (RateLimitFilter): +// 首先调用 globalLimiter.Allow() 检查是否超过了全局限制。如果超出,直接返回 429 错误。 +// 然后,获取用户 ID。在实际应用中,你可能从 ctx.Input.Header、ctx.Input.Session 或其他地方获取。 +// 通过 getUserLimiter 获取该用户的限流器,并调用 userLimiter.Allow() 检查是否超过了用户限制。如果超出,返回 429 错误。 +func RateLimitFilter(ctx *context.Context) { + // --- Global Rate Limiting --- + if !globalLimiter.Allow() { + ctx.ResponseWriter.WriteHeader(429) // 429 Too Many Requests + // ctx.ResponseWriter.Write([]byte("429 Too Many Requests - Global Limit Exceeded")) + ctx.ResponseWriter.Write([]byte("429 当前服务器请求过多")) + return + } + + // --- Per-User Rate Limiting --- + // In a real application, you would get the user ID from the session, JWT, or request header. + // For this example, we'll use a hardcoded value or a placeholder. + // You can replace this with your actual logic to get the user ID. + userID := ctx.Input.Param("x-token") // Example: Get user ID from URL parameter + if userID == "" { + // Handle cases where the user ID is not available. + userID = "anonymous" + } + + userLimiter := getUserLimiter(userID) + if !userLimiter.Allow() { + ctx.ResponseWriter.WriteHeader(429) // 429 Too Many Requests + // ctx.ResponseWriter.Write([]byte(fmt.Sprintf("429 Too Many Requests - User %s Limit Exceeded", userID))) + ctx.ResponseWriter.Write([]byte("429 当前用户请求过多")) + return + } +} diff --git a/pkg/utils/p_tools.go b/pkg/utils/p_tools.go new file mode 100644 index 0000000..c544df4 --- /dev/null +++ b/pkg/utils/p_tools.go @@ -0,0 +1,29 @@ +package utils + +import ( + "github.com/spf13/viper" +) + +// 获取ticket +func GetJxApiTicket() (result string) { + + ticket := viper.GetString("tuilan_ticket") + result = ticket + return +} + +// 是否在白名单 +func IsWhiteIp(ip string) (result bool) { + + result = false + + whiteList := []string{ + "120.53.99.84", + "175.11.144.242", + } + + result = IsInStringList(ip, whiteList) + + return + +} diff --git a/pkg/utils/time_tool.go b/pkg/utils/time_tool.go new file mode 100644 index 0000000..9c4a00e --- /dev/null +++ b/pkg/utils/time_tool.go @@ -0,0 +1,37 @@ +package utils + +import ( + "database/sql/driver" + "fmt" + "github.com/anxpp/common-utils/str" + "time" +) + +type Time struct { + time.Time +} + +func (t *Time) UnmarshalJSON(data []byte) (e error) { + t.Time, e = time.ParseInLocation(str.TimeLayout, string(data), time.Local) + return nil +} + +func (t Time) MarshalJSON() ([]byte, error) { + return ([]byte)(fmt.Sprintf("\"%s\"", t.Time.Format(str.TimeLayout))), nil +} +func (t *Time) Scan(value interface{}) error { + bytes, _ := value.([]byte) + tt, _ := time.ParseInLocation(str.TimeLayout, string(bytes), time.Local) + *t = Time{ + Time: tt, + } + return nil +} + +func (t Time) Value() (driver.Value, error) { + return t.Time.Format(str.TimeLayout), nil +} + +func (t Time) String() string { + return str.TimeToString(t.Time) +} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go new file mode 100644 index 0000000..3ed0e93 --- /dev/null +++ b/pkg/utils/utils.go @@ -0,0 +1,356 @@ +package utils + +import ( + "crypto/sha1" + "encoding/json" + "fmt" + "io" + "servicebase/pkg/constant" + "strconv" + "strings" + "time" + + "github.com/anxpp/common-utils/str" + "github.com/gin-gonic/gin" +) + +func FullPhotoUrl(path string) string { + if len(path) == 0 { + return "" + } + if strings.Index(path, "http") >= 0 { + return path + } + return fmt.Sprintf("%s%s", constant.PhotoDomainUrl, path) +} + +// 从gin Context获取AppUserId +func AppUserIdByHeader(c *gin.Context) (staffId string) { + + inputToken := c.Request.Header.Get("X-Token") + if len(inputToken) == 0 { + return + } + + //从缓存获取 + // redisClient := cache.GetCommonRedisInstance().RedisClient + // accessTokenKey := cache.ACCESSTOKEN_KEY_PREV + inputToken + // staffId = redisClient.Get(cache.Ctx(), accessTokenKey).Val() + return +} + +// 获取客户端真实IP +func GetClientRealIp(c *gin.Context) (ip string) { + ip = c.ClientIP() + xForwardedFor := c.Request.Header.Get("X-Forwarded-For") + if xForwardedFor != "" { + ip = xForwardedFor + // 可能有多个IP,第一个是客户端的真实IP + if i := strings.Index(xForwardedFor, ","); i >= 0 { + ip = xForwardedFor[:i] + } + } + return +} + +// 移出int数组重复项 +func RemoveDuplicatesInt(nums []int) []int { + result := make([]int, 0, len(nums)) + temp := make(map[int]int, len(nums)) + for _, item := range nums { + if _, ok := temp[item]; !ok { + temp[item] = item + result = append(result, item) + } + } + return result +} + +// 移出string数组重复项 +func RemoveDuplicatesString(nums []string) []string { + result := make([]string, 0, len(nums)) + temp := make(map[string]string, len(nums)) + for _, item := range nums { + if _, ok := temp[item]; !ok { + temp[item] = item + result = append(result, item) + } + } + return result +} + +// 判断数组是否包含某个数 +func IsInIntList(v int, list []int) bool { + if len(list) == 0 { + return false + } + isIn := false + for _, item := range list { + if v == item { + isIn = true + break + } + } + + return isIn + +} + +// 判断数组是否包含某个字符串 +func IsInStringList(v string, list []string) bool { + if len(list) == 0 { + return false + } + isIn := false + for _, item := range list { + if v == item { + isIn = true + break + } + } + + return isIn +} + +// 根据生日获得年龄 +func AgeByBirthday(birthday string) (age string) { + age = "" + if len(birthday) < 10 { + return + } + + t, err := time.Parse(str.DateLayout, birthday) + + if err != nil { + return + } + birthdayYear := t.Year() + nowYear := time.Now().Year() + + ageInt := nowYear - birthdayYear + + if ageInt < 0 { + ageInt = 0 + } + + age = strconv.Itoa(ageInt) + return +} + +// 根据年龄获取生日 +func BirthdayByAge(age int) (birthday string) { + birthday = "" + if age < 0 || age > 100 { + return + } + nowYear := time.Now().Year() + birthYear := nowYear - age + + birthday = strconv.Itoa(birthYear) + "-01-01" + return +} + +// 获取日期是周几 +func GetWeekDayByDate(d string) string { + + dayTime, err := time.Parse(str.DateLayout, d) + + if err != nil { + return "" + } + week := int(dayTime.Weekday()) + return strconv.Itoa(week) +} + +// stringList转intList +func StringListToIntList(stringList []string) (intList []int) { + + if len(stringList) == 0 { + return + } + + for _, item := range stringList { + intList = append(intList, str.StringToInt(item)) + } + + return +} + +// float32转string +func Float32ToString(f float32, prec int) string { + return strconv.FormatFloat(float64(f), 'f', prec, 32) +} + +// float64转string +func Float64ToString(f float64, prec int) string { + return strconv.FormatFloat(f, 'f', prec, 64) +} + +func Decimal(num float64) float64 { + num, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", num), 64) + return num +} + +// 获取周几的名字 +func GetWeekNameByIndex(weekIndex int) (weekName string) { + if weekIndex < 0 || weekIndex > 6 { + return + } + names := []string{"周日", "周一", "周二", "周三", "周四", "周五", "周六"} + return names[weekIndex] +} + +// 获取周几的名字 +func GetWeekNameListByIndexList(weekIndexList string) (weekName string) { + if len(weekIndexList) == 0 { + return + } + var indexList []string + _ = json.Unmarshal([]byte(weekIndexList), &indexList) + + if len(indexList) == 0 { + return + } + var nameList []string + for _, item := range indexList { + name := GetWeekNameByIndex(str.StringToInt(item)) + nameList = append(nameList, name) + } + weekName = strings.Join(nameList, ",") + + return + +} + +// 获取某时间的当月第一天 +func GetFirstDateOfMonth(d time.Time) time.Time { + d = d.AddDate(0, 0, -d.Day()+1) + return GetZeroTime(d) +} + +// 获取某时间的当月最后一天 +func GetLastDateOfMonth(d time.Time) time.Time { + return GetFirstDateOfMonth(d).AddDate(0, 1, -1) +} + +// 获取某一天的0点时间 +func GetZeroTime(d time.Time) time.Time { + return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, d.Location()) +} + +/* +* +获取本周周一的日期 +*/ +func GetCurrentWeekFirstDate() (weekMonday string) { + now := time.Now() + + offset := int(time.Monday - now.Weekday()) + if offset > 0 { + offset = -6 + } + + weekStartDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset) + weekMonday = weekStartDate.Format("2006-01-02") + return +} + +/* +* +日期加天数 +*/ +func DateAddDays(dateStr string, days int) (resultDate string) { + dateTime, _ := time.Parse(str.DateLayout, dateStr) + weekStartDate := dateTime.AddDate(0, 0, days) + resultDate = str.DateToString(weekStartDate) + return +} + +/* +获取上周的周一日期 +*/ +func GetLastWeekFirstDate() (resultDate string) { + thisWeekMonday := GetCurrentWeekFirstDate() + TimeMonday, _ := time.Parse(str.DateLayout, thisWeekMonday) + lastWeekMonday := TimeMonday.AddDate(0, 0, -7) + resultDate = lastWeekMonday.Format("2006-01-02") + return +} + +// SHA1 加密 +func Sha1Str(str string) (result string) { + t := sha1.New() + io.WriteString(t, str) + + result = fmt.Sprintf("%x", t.Sum(nil)) + return +} + +func GetAgeFromIDCard(idCard string) (int, error) { + // 验证身份证号码长度 + if len(idCard) != 18 { + return 0, fmt.Errorf("身份证号码必须是18位") + } + + // 提取出生日期部分 (第7-14位) + birthStr := idCard[6:14] + + // 解析出生日期 + birthDate, err := time.Parse("20060102", birthStr) + if err != nil { + return 0, fmt.Errorf("解析出生日期失败: %v", err) + } + + // 获取当前日期 + now := time.Now() + + // 计算年龄 + age := now.Year() - birthDate.Year() + + // 考虑月份和日期,如果还没过生日则减1岁 + birthDay := time.Date(now.Year(), birthDate.Month(), birthDate.Day(), 0, 0, 0, 0, now.Location()) + if now.Before(birthDay) { + age-- + } + + return age, nil +} + +// IDCardInfo 存储从身份证提取的信息 +type IDCardInfo struct { + BirthYear int // 出生年份 + BirthMonth int // 出生月份 + BirthDay int // 出生日 + Gender string // 性别:"男" 或 "女" +} + +// ParseIDCard 从身份证号码提取出生日期和性别 +func ParseIDCard(idCard string) (birthday, gender string) { + // 验证身份证号码长度 + if len(idCard) != 18 { + return "", "" + } + + // 提取出生日期部分 (第7-14位) + birthStr := idCard[6:14] + birthDate, err := time.Parse("20060102", birthStr) + if err != nil { + return "", "" + } + + birthday = str.DateToString(birthDate) + + // 提取性别标识 (第17位) + genderChar := idCard[16:17] + genderNum, err := strconv.Atoi(genderChar) + if err != nil { + return "", "" + } + + gender = "0" + if genderNum%2 == 1 { + gender = "1" + } + return + +}