diff --git a/README.md b/README.md index 4813e32..1c13dc6 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,123 @@ func NewServiceContext(c config.Config, db *gorm.DB) *ServiceContext { ``` +编辑2调用其它服务 `internal/svc/servicecontext.go`: + +```go +import ( +"fmt" +"net" +"strconv" +"sync" +"time" + +"lone-services/pkg/discovery" +"lone-services/pkg/utils" +"lone-services/services/order/internal/config" + +"github.com/zeromicro/go-zero/core/logx" +"github.com/zeromicro/go-zero/zrpc" +"gorm.io/gorm" +) + +// 缓存条目 +type rpcClientCacheEntry struct { +cli zrpc.Client +target string +expireAt time.Time +} + +const rpcClientCacheTTL = 30 * time.Second //缓存过期时间 + +var ( +rpcCacheLock sync.Mutex +rpcCache = make(map[string]*rpcClientCacheEntry) +) + +func GetRpcClient(serviceName string) (zrpc.Client, error) { +if serviceName == utils.StringEmpty { +err := fmt.Errorf("rpc serviceName is empty") +logx.Error(err) +return nil, err +} + +cacheKey := serviceName + +rpcCacheLock.Lock() +entry, ok := rpcCache[cacheKey] +if ok && time.Now().Before(entry.expireAt) { +rpcCacheLock.Unlock() +return entry.cli, nil +} +delete(rpcCache, cacheKey) +rpcCacheLock.Unlock() + +inst, err := discovery.Pick(serviceName) +if err != nil { +err = fmt.Errorf("discovery pick %s failed: %w", serviceName, err) +logx.Error(err) +return nil, err +} + +target := net.JoinHostPort(inst.IP, strconv.FormatUint(inst.Port, utils.NumberTen)) + +cli := zrpc.MustNewClient(zrpc.RpcClientConf{ +Target: target, +Timeout: utils.RpcTimeOut, //rpc调用超时5s +}) + +rpcCacheLock.Lock() +rpcCache[cacheKey] = &rpcClientCacheEntry{ +cli: cli, +target: target, +expireAt: time.Now().Add(rpcClientCacheTTL), +} +rpcCacheLock.Unlock() + +return cli, nil +} + +type ServiceContext struct { +Config config.Config +DB *gorm.DB +Prefix string + +ExpressSvcName string //服务名 +} + +func NewServiceContext(c config.Config, db *gorm.DB) *ServiceContext { +//启动仅读取配置,不建立rpc连接 多个服务就多个 +expressSvc := utils.GetConfigString("services.express") + +if expressSvc == utils.StringEmpty { +logx.Error("config services.express empty") +} + +svcCtx := &ServiceContext{ +Config: c, +DB: db, +Prefix: utils.GetConfigString("mysql.prefix"), +ExpressSvcName: expressSvc, +} + +return svcCtx +} + + +调用方法logic中 +//调用其它服务实例 +//cli, err := svc.GetRpcClient(l.svcCtx.ExpressSvcName) +//if err != nil { +// l.Logger.Errorf("get express rpc err: %v", err) +// //降级逻辑 +// return l.out(utils.ErrorInternalServer, "express"+utils.ErrorInternalServer.Msg) +//} +//expClient := express.NewExpressClient(cli.Conn()) +//res, _ := expClient.Ping(context.Background(), &express.Request{}) +//l.Logger.Error("res: %v", res) + +``` + ### 7. 接入 Docker Compose 在 `deploy/docker-compose.override.yml` 增加服务: diff --git a/deploy/apisix/lua/auth.lua b/deploy/apisix/lua/auth.lua index bea8aa3..9039569 100644 --- a/deploy/apisix/lua/auth.lua +++ b/deploy/apisix/lua/auth.lua @@ -102,8 +102,20 @@ function _M.access(conf, ctx) if json.name then ngx.req.set_header("X-User-Name", json.name) end - if json.username then - ngx.req.set_header("X-Username", json.username) + if json.store_name then + ngx.req.set_header("X-Store-Name", json.store_name) + end + if json.store_id then + ngx.req.set_header("X-Store-Id", tostring(json.store_id)) + end + if json.sale_name then + ngx.req.set_header("X-Sale-Name", json.sale_name) + end + if json.sale_id then + ngx.req.set_header("X-Sale-Id", tostring(json.sale_id)) + end + if json.group_id then + ngx.req.set_header("X-Group-Id", tostring(json.group_id)) end end diff --git a/go.mod b/go.mod index 66e11a1..a2d0ec2 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,10 @@ go 1.26 require ( buf.build/go/protovalidate v0.14.0 - github.com/aliyun/credentials-go v1.4.13 + github.com/alibabacloud-go/darabonba-openapi/v2 v2.2.4 + github.com/alibabacloud-go/sts-20150401/v2 v2.1.0 + github.com/alibabacloud-go/tea v1.5.3 + github.com/alibabacloud-go/tea-utils/v2 v2.0.9 github.com/fsnotify/fsnotify v1.10.1 github.com/gin-gonic/gin v1.12.0 github.com/go-playground/validator/v10 v10.30.3 @@ -30,8 +33,9 @@ require ( buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250717165733-d22d418d82d8.1 // indirect cel.dev/expr v0.25.2 // indirect filippo.io/edwards25519 v1.2.0 // indirect + github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect github.com/alibabacloud-go/debug v1.0.1 // indirect - github.com/alibabacloud-go/tea v1.2.2 // indirect + github.com/aliyun/credentials-go v1.4.13 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bytedance/gopkg v0.1.3 // indirect @@ -39,6 +43,7 @@ require ( github.com/bytedance/sonic/loader v0.5.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // 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.6 // indirect github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/coreos/go-semver v0.3.1 // indirect @@ -70,6 +75,7 @@ require ( github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/grafana/pyroscope-go v1.3.0 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.10 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect @@ -112,6 +118,7 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/tiendc/go-deepcopy v1.7.2 // indirect github.com/titanous/json5 v1.0.0 // indirect + github.com/tjfoc/gmsm v1.4.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.3.1 // indirect github.com/x448/float16 v0.8.4 // indirect diff --git a/go.sum b/go.sum index ca59f2e..4cfedf8 100644 --- a/go.sum +++ b/go.sum @@ -4,15 +4,61 @@ buf.build/go/protovalidate v0.14.0 h1:kr/rC/no+DtRyYX+8KXLDxNnI1rINz0imk5K44ZpZ3 buf.build/go/protovalidate v0.14.0/go.mod h1:+F/oISho9MO7gJQNYC2VWLzcO1fTPmaTA08SDYJZncA= cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +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/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.1.13/go.mod h1:lxFGfobinVsQ49ntjpgWghXmIF0/Sm4+wvBJ1h5RtaE= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.2.4 h1:o6veen0IZ/Fe1JawwhwQMZcbw67CVDY1pQwXcNWPyQo= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.2.4/go.mod h1:eHjVxrT9g8uVYN/nyAwOFQEfkVA154ChiqRc2XnNKYU= +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/tea v1.2.2 h1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU= +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.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY= +github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= +github.com/alibabacloud-go/sts-20150401/v2 v2.1.0 h1:Z5FOpAW003CjNSEPSemkPGj+OHWvF5bu7gz+Rdx/1zU= +github.com/alibabacloud-go/sts-20150401/v2 v2.1.0/go.mod h1:8q8jpK/mnC7fcp83naYBa7wzlIMuQrMWCbNmBfxh2wM= +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.11/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.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.13/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= +github.com/alibabacloud-go/tea v1.5.2/go.mod h1:hgSs82CkOiehSQMoiFN79dL6zsGX7pVGvnn9SIEs8/0= +github.com/alibabacloud-go/tea v1.5.3 h1:UMJTBcO48w7Zz1nlFe9bmRsHwgB7AjF8DBQzcvHhIp8= +github.com/alibabacloud-go/tea v1.5.3/go.mod h1:hgSs82CkOiehSQMoiFN79dL6zsGX7pVGvnn9SIEs8/0= +github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I= +github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= +github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4= +github.com/alibabacloud-go/tea-utils/v2 v2.0.7/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I= +github.com/alibabacloud-go/tea-utils/v2 v2.0.9 h1:y6pUIlhjxbZl9ObDAcmA1H3c21eaAxADHTDQmBnAIgA= +github.com/alibabacloud-go/tea-utils/v2 v2.0.9/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I= github.com/alicebob/miniredis/v2 v2.38.0 h1:nZAzCR+Lj+Vxk4ZXzm2NuKq2O33RXj1XxJ2e2uP9jiw= github.com/alicebob/miniredis/v2 v2.38.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM= +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.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= github.com/aliyun/credentials-go v1.4.13 h1:alJaUIolzjrw0sZjOTwYpI34Djqo3MJJh4q+yqMah7Q= github.com/aliyun/credentials-go v1.4.13/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= @@ -35,10 +81,15 @@ github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiD github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 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/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/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -51,8 +102,11 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +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/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -110,12 +164,28 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +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/protobuf v1.2.0/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.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/cel-go v0.25.0 h1:jsFw9Fhn+3y2kBbltZR4VEz5xKkcIFRPDnuEzAGv5GY= github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= +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.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -123,6 +193,11 @@ github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgY github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= 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/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= github.com/grafana/pyroscope-go v1.3.0 h1:t3Jehad8vvqN4oRAB0LdmfQ5ZSUXQw3asoft+K4GAT8= github.com/grafana/pyroscope-go v1.3.0/go.mod h1:XA7I3usNx+UdjOZfQnl1WV8y924vsJo9KIVrKB+9jx4= github.com/grafana/pyroscope-go/godeltaprof v0.1.10 h1:dvhndEbyavTb59vFCd6PsrAG5qi69/qZZtegh/TJKSY= @@ -141,8 +216,10 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= 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.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/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= @@ -172,6 +249,8 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh 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/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= @@ -200,6 +279,7 @@ github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4 github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= @@ -224,6 +304,9 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= +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/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -241,6 +324,7 @@ github.com/spiffe/go-spiffe/v2 v2.7.0/go.mod h1:47Q0Q9/AqGha8QLHp+kxpH4Wca7X7EnO github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/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 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= @@ -260,6 +344,9 @@ github.com/tiendc/go-deepcopy v1.7.2 h1:Ut2yYR7W9tWjTQitganoIue4UGxZwCcJy3orjrrI github.com/tiendc/go-deepcopy v1.7.2/go.mod h1:4bKjNC2r7boYOkD2IOuZpYjmlDdzjbpTRyCx+goBCJQ= github.com/titanous/json5 v1.0.0 h1:hJf8Su1d9NuI/ffpxgxQfxh/UiBFZX7bMPid0rIL/7s= github.com/titanous/json5 v1.0.0/go.mod h1:7JH1M8/LHKc6cyP5o5g3CSaRj+mBrIimTxzpvmckH8c= +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/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= @@ -273,6 +360,7 @@ github.com/xuri/excelize/v2 v2.11.0/go.mod h1:jxFLbzaIwGQ5ufFNvYfUOHqXhfPaNmP14K github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 h1:+C0TIdyyYmzadGaL/HBLbf3WdLgC29pgyhTjAT/0nuE= github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= 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 v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= @@ -333,41 +421,80 @@ golang.org/x/arch v0.22.0 h1:c/Zle32i5ttqRXjdLyyHZESLD/bB90DCU1g9l/0YBDI= golang.org/x/arch v0.22.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-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.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/image v0.38.0 h1:5l+q+Y9JDC7mBOMjo4/aPhMDcxEptsX+Tt3GgRQRPuE= golang.org/x/image v0.38.0/go.mod h1:/3f6vaXC+6CEanU4KJxbcUZyEePbyKbaLoDOe4ehFYY= +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/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/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-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-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-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-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.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +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-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.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/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-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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -377,32 +504,57 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc 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.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +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/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc= golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= 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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 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.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= 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-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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/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.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -411,12 +563,26 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +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/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +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/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= +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.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -431,6 +597,7 @@ gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +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/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= @@ -450,6 +617,8 @@ gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= gorm.io/plugin/dbresolver v1.6.0 h1:XvKDeOtTn1EIX6s4SrKpEH82q0gXVemhYjbYZFGFVcw= gorm.io/plugin/dbresolver v1.6.0/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM= +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= k8s.io/api v0.34.3 h1:D12sTP257/jSH2vHV2EDYrb16bS7ULlHpdNdNhEw2S4= k8s.io/api v0.34.3/go.mod h1:PyVQBF886Q5RSQZOim7DybQjAbVs8g7gwJNhGtY5MBk= k8s.io/apimachinery v0.34.3 h1:/TB+SFEiQvN9HPldtlWOTp0hWbJ+fjU+wkxysf/aQnE= diff --git a/pkg/utils/loginInfo.go b/pkg/utils/loginInfo.go index 38f4bb3..3594ec9 100644 --- a/pkg/utils/loginInfo.go +++ b/pkg/utils/loginInfo.go @@ -18,6 +18,11 @@ type UserInfo struct { UserAgent string // 完整原始ua BrowserName string // 浏览器名称 BrowserVer string // 浏览器版本 + StoreName string // 店铺名称 + StoreId int64 // 店铺id + SaleName string // 销售名称 + SaleId int64 // 销售id + GroupId int64 // 分组ID Valid bool } @@ -32,25 +37,45 @@ func GetUserFromCtx(ctx context.Context) UserInfo { ipList := md.Get("x-client-ip") userAgentList := md.Get("x-user-agent") + storeName := md.Get("x-store-name") + storeId := md.Get("x-store-id") + saleName := md.Get("x-sale-name") + saleId := md.Get("x-sale-id") + groupId := md.Get("x-group-id") + if len(refreshList) == NumberZero { refreshList = md.Get("X-Refresh") } var userInfo UserInfo - if len(uidList) > 0 { - userInfo.RawUID = uidList[0] + if len(uidList) > NumberZero { + userInfo.RawUID = uidList[NumberZero] } - if len(nameList) > 0 { - userInfo.Name = nameList[0] + if len(nameList) > NumberZero { + userInfo.Name = nameList[NumberZero] } - if len(refreshList) > 0 { - userInfo.Refresh = refreshList[0] + if len(storeName) > NumberZero { + userInfo.StoreName = storeName[NumberZero] } - - if len(ipList) > 0 { - userInfo.ClientIP = ipList[0] + if len(storeId) > NumberZero { + userInfo.StoreId, _ = strconv.ParseInt(storeId[NumberZero], NumberTen, NumberSixtyFourth) } - if len(userAgentList) > 0 { - userInfo.UserAgent = userAgentList[0] + if len(saleName) > NumberZero { + userInfo.SaleName = saleName[NumberZero] + } + if len(saleId) > NumberZero { + userInfo.SaleId, _ = strconv.ParseInt(saleId[NumberZero], NumberTen, NumberSixtyFourth) + } + if len(groupId) > NumberZero { + userInfo.GroupId, _ = strconv.ParseInt(groupId[NumberZero], NumberTen, NumberSixtyFourth) + } + if len(refreshList) > NumberZero { + userInfo.Refresh = refreshList[NumberZero] + } + if len(ipList) > NumberZero { + userInfo.ClientIP = ipList[NumberZero] + } + if len(userAgentList) > NumberZero { + userInfo.UserAgent = userAgentList[NumberZero] userInfo.UserAgent, _ = url.QueryUnescape(userInfo.UserAgent) ua := user_agent.New(userInfo.UserAgent) userInfo.BrowserName, userInfo.BrowserVer = ua.Browser() diff --git a/pkg/utils/status.go b/pkg/utils/status.go index d6b467c..46ee40f 100644 --- a/pkg/utils/status.go +++ b/pkg/utils/status.go @@ -48,10 +48,25 @@ const ( StringZero = "0" StringStatusOk = "1" StringStatusNo = "2" + + StoreAuthBind = 1 // 绑定 + StoreAuthUnBind = 2 // 解绑 + + StatusApply = 2 //申请 + StatusFirstVerify = 3 //一审 + StatusSecondVerify = 4 //二审 + StatusApplyRefuse = 5 //申请拒绝 + StatusVerifyRefuse = 6 //一审拒绝 + StatusAdminFirstVerify = 13 //一审 + StatusAdminSecondVerify = 14 //二审 + StatusAdminWaitPass = 19 //等待审核 + StatusAdminSecondRefuse = 16 //审核失败 + + RpcTimeOut = 5000 //服务连接超时时间 毫秒 ) const ( - // LoginUser 所有的登录 加上服务名:id + // Login LoginUser 所有的登录 加上服务名:id // %s 为,admin,user ,... Login = "login:service:%s:token:" LoginKey = "login:service:%s:info:" @@ -63,10 +78,11 @@ const ( ) var ( - //新使用方法 - Ok = Status{Code: 10000, Msg: "OK"} - Fail = Status{Code: 999, Msg: "fail"} - ErrorExist = Status{Code: 998, Msg: "已存在"} + // Ok 新使用方法 + Ok = Status{Code: 10000, Msg: "OK"} + Fail = Status{Code: 999, Msg: "fail"} + ErrorExist = Status{Code: 998, Msg: "已存在"} + ErrorInternalServer = Status{Code: 997, Msg: "服务错误"} ErrorParams = Status{Code: 10001, Msg: "缺少参数或传值不对"} ErrorMissingParams = Status{Code: 10001, Msg: "缺少参数"} diff --git a/rpc/express/express.pb b/rpc/express/express.pb new file mode 100644 index 0000000..e06ab43 Binary files /dev/null and b/rpc/express/express.pb differ diff --git a/rpc/express/express.proto b/rpc/express/express.proto new file mode 100644 index 0000000..a04b156 --- /dev/null +++ b/rpc/express/express.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +package express; +option go_package="./express"; +import "google/api/annotations.proto"; + + +message Request { + string ping = 1; +} + +message Response { + int32 code = 1; + string msg = 2; + string data = 3; +} + +message EmtpyRequest { +} + +service Express { + rpc Ping(Request) returns(Response){ + option (google.api.http) = { + post: "/admin/v3/express/ping" + body: "*" + }; + }; + rpc Items(EmtpyRequest) returns(Response){ + option (google.api.http) = { + post: "/admin/v3/express/items" + body: "*" + }; + }; +} diff --git a/rpc/express/pb/express.pb.go b/rpc/express/pb/express.pb.go new file mode 100644 index 0000000..131ff5b --- /dev/null +++ b/rpc/express/pb/express.pb.go @@ -0,0 +1,233 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v4.25.8 +// source: express/express.proto + +package express + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Request struct { + state protoimpl.MessageState `protogen:"open.v1"` + Ping string `protobuf:"bytes,1,opt,name=ping,proto3" json:"ping,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Request) Reset() { + *x = Request{} + mi := &file_express_express_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Request) ProtoMessage() {} + +func (x *Request) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Request.ProtoReflect.Descriptor instead. +func (*Request) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{0} +} + +func (x *Request) GetPing() string { + if x != nil { + return x.Ping + } + return "" +} + +type Response struct { + state protoimpl.MessageState `protogen:"open.v1"` + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` + Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Response) Reset() { + *x = Response{} + mi := &file_express_express_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Response.ProtoReflect.Descriptor instead. +func (*Response) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{1} +} + +func (x *Response) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *Response) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +func (x *Response) GetData() string { + if x != nil { + return x.Data + } + return "" +} + +type EmtpyRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EmtpyRequest) Reset() { + *x = EmtpyRequest{} + mi := &file_express_express_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EmtpyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EmtpyRequest) ProtoMessage() {} + +func (x *EmtpyRequest) ProtoReflect() protoreflect.Message { + mi := &file_express_express_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EmtpyRequest.ProtoReflect.Descriptor instead. +func (*EmtpyRequest) Descriptor() ([]byte, []int) { + return file_express_express_proto_rawDescGZIP(), []int{2} +} + +var File_express_express_proto protoreflect.FileDescriptor + +const file_express_express_proto_rawDesc = "" + + "\n" + + "\x15express/express.proto\x12\aexpress\x1a\x1cgoogle/api/annotations.proto\"\x1d\n" + + "\aRequest\x12\x12\n" + + "\x04ping\x18\x01 \x01(\tR\x04ping\"D\n" + + "\bResponse\x12\x12\n" + + "\x04code\x18\x01 \x01(\x05R\x04code\x12\x10\n" + + "\x03msg\x18\x02 \x01(\tR\x03msg\x12\x12\n" + + "\x04data\x18\x03 \x01(\tR\x04data\"\x0e\n" + + "\fEmtpyRequest2\xb0\x01\n" + + "\aExpress\x12N\n" + + "\x04Ping\x12\x10.express.Request\x1a\x11.express.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/admin/v3/express/ping\x12U\n" + + "\x05Items\x12\x15.express.EmtpyRequest\x1a\x11.express.Response\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/admin/v3/express/itemsB\vZ\t./expressb\x06proto3" + +var ( + file_express_express_proto_rawDescOnce sync.Once + file_express_express_proto_rawDescData []byte +) + +func file_express_express_proto_rawDescGZIP() []byte { + file_express_express_proto_rawDescOnce.Do(func() { + file_express_express_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_express_express_proto_rawDesc), len(file_express_express_proto_rawDesc))) + }) + return file_express_express_proto_rawDescData +} + +var file_express_express_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_express_express_proto_goTypes = []any{ + (*Request)(nil), // 0: express.Request + (*Response)(nil), // 1: express.Response + (*EmtpyRequest)(nil), // 2: express.EmtpyRequest +} +var file_express_express_proto_depIdxs = []int32{ + 0, // 0: express.Express.Ping:input_type -> express.Request + 2, // 1: express.Express.Items:input_type -> express.EmtpyRequest + 1, // 2: express.Express.Ping:output_type -> express.Response + 1, // 3: express.Express.Items:output_type -> express.Response + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_express_express_proto_init() } +func file_express_express_proto_init() { + if File_express_express_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_express_express_proto_rawDesc), len(file_express_express_proto_rawDesc)), + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_express_express_proto_goTypes, + DependencyIndexes: file_express_express_proto_depIdxs, + MessageInfos: file_express_express_proto_msgTypes, + }.Build() + File_express_express_proto = out.File + file_express_express_proto_goTypes = nil + file_express_express_proto_depIdxs = nil +} diff --git a/rpc/express/pb/express_grpc.pb.go b/rpc/express/pb/express_grpc.pb.go new file mode 100644 index 0000000..fd1c711 --- /dev/null +++ b/rpc/express/pb/express_grpc.pb.go @@ -0,0 +1,159 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.6.2 +// - protoc v4.25.8 +// source: express/express.proto + +package express + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + Express_Ping_FullMethodName = "/express.Express/Ping" + Express_Items_FullMethodName = "/express.Express/Items" +) + +// ExpressClient is the client API for Express service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ExpressClient interface { + Ping(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) + Items(ctx context.Context, in *EmtpyRequest, opts ...grpc.CallOption) (*Response, error) +} + +type expressClient struct { + cc grpc.ClientConnInterface +} + +func NewExpressClient(cc grpc.ClientConnInterface) ExpressClient { + return &expressClient{cc} +} + +func (c *expressClient) Ping(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Express_Ping_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *expressClient) Items(ctx context.Context, in *EmtpyRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Express_Items_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ExpressServer is the server API for Express service. +// All implementations must embed UnimplementedExpressServer +// for forward compatibility. +type ExpressServer interface { + Ping(context.Context, *Request) (*Response, error) + Items(context.Context, *EmtpyRequest) (*Response, error) + mustEmbedUnimplementedExpressServer() +} + +// UnimplementedExpressServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedExpressServer struct{} + +func (UnimplementedExpressServer) Ping(context.Context, *Request) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method Ping not implemented") +} +func (UnimplementedExpressServer) Items(context.Context, *EmtpyRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method Items not implemented") +} +func (UnimplementedExpressServer) mustEmbedUnimplementedExpressServer() {} +func (UnimplementedExpressServer) testEmbeddedByValue() {} + +// UnsafeExpressServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ExpressServer will +// result in compilation errors. +type UnsafeExpressServer interface { + mustEmbedUnimplementedExpressServer() +} + +func RegisterExpressServer(s grpc.ServiceRegistrar, srv ExpressServer) { + // If the following call panics, it indicates UnimplementedExpressServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&Express_ServiceDesc, srv) +} + +func _Express_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Request) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExpressServer).Ping(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Express_Ping_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExpressServer).Ping(ctx, req.(*Request)) + } + return interceptor(ctx, in, info, handler) +} + +func _Express_Items_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EmtpyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExpressServer).Items(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Express_Items_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExpressServer).Items(ctx, req.(*EmtpyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Express_ServiceDesc is the grpc.ServiceDesc for Express service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Express_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "express.Express", + HandlerType: (*ExpressServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Ping", + Handler: _Express_Ping_Handler, + }, + { + MethodName: "Items", + Handler: _Express_Items_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "express/express.proto", +} diff --git a/rpc/order/order.pb b/rpc/order/order.pb index 2beb57e..0b586a2 100644 Binary files a/rpc/order/order.pb and b/rpc/order/order.pb differ diff --git a/rpc/order/order.proto b/rpc/order/order.proto index 8ef430f..99d98f6 100644 --- a/rpc/order/order.proto +++ b/rpc/order/order.proto @@ -37,6 +37,7 @@ message EditAddressRequest { string district_ids = 5; bool default = 6; int64 id = 7; + int32 type = 8; } message StatusAddressRequest { diff --git a/rpc/order/pb/order.pb.go b/rpc/order/pb/order.pb.go index abc4474..2907376 100644 --- a/rpc/order/pb/order.pb.go +++ b/rpc/order/pb/order.pb.go @@ -251,6 +251,7 @@ type EditAddressRequest struct { DistrictIds string `protobuf:"bytes,5,opt,name=district_ids,json=districtIds,proto3" json:"district_ids,omitempty"` Default bool `protobuf:"varint,6,opt,name=default,proto3" json:"default,omitempty"` Id int64 `protobuf:"varint,7,opt,name=id,proto3" json:"id,omitempty"` + Type int32 `protobuf:"varint,8,opt,name=type,proto3" json:"type,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -334,6 +335,13 @@ func (x *EditAddressRequest) GetId() int64 { return 0 } +func (x *EditAddressRequest) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + type StatusAddressRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` @@ -805,7 +813,7 @@ const file_order_order_proto_rawDesc = "" + "\x12CreateOrderRequest\x12\x1d\n" + "\n" + "address_id\x18\x01 \x01(\x03R\taddressId\x12\x12\n" + - "\x04note\x18\x02 \x01(\tR\x04note\"\xc3\x01\n" + + "\x04note\x18\x02 \x01(\tR\x04note\"\xd7\x01\n" + "\x12EditAddressRequest\x12\x1a\n" + "\bdistrict\x18\x01 \x01(\tR\bdistrict\x12\x18\n" + "\aaddress\x18\x02 \x01(\tR\aaddress\x12\x12\n" + @@ -813,7 +821,8 @@ const file_order_order_proto_rawDesc = "" + "\x06mobile\x18\x04 \x01(\tR\x06mobile\x12!\n" + "\fdistrict_ids\x18\x05 \x01(\tR\vdistrictIds\x12\x18\n" + "\adefault\x18\x06 \x01(\bR\adefault\x12\x0e\n" + - "\x02id\x18\a \x01(\x03R\x02id\">\n" + + "\x02id\x18\a \x01(\x03R\x02id\x12\x12\n" + + "\x04type\x18\b \x01(\x05R\x04type\">\n" + "\x14StatusAddressRequest\x12\x0e\n" + "\x02id\x18\x01 \x01(\x03R\x02id\x12\x16\n" + "\x06status\x18\x02 \x01(\x05R\x06status\"\x0e\n" + diff --git a/services/admin/internal/config/config.go b/services/admin/internal/config/config.go index 724c850..a1979dd 100644 --- a/services/admin/internal/config/config.go +++ b/services/admin/internal/config/config.go @@ -1,10 +1,7 @@ package config -import "github.com/zeromicro/go-zero/zrpc" - type Config struct { - Nacos NacosConf - LonelogRpc zrpc.RpcClientConf + Nacos NacosConf } type NacosConf struct { diff --git a/services/chore/.gitignore b/services/chore/.gitignore new file mode 100644 index 0000000..2de5cd0 --- /dev/null +++ b/services/chore/.gitignore @@ -0,0 +1,3 @@ +run.toml +tmp +etc/chore.yaml \ No newline at end of file diff --git a/services/chore/internal/logic/policyLogic.go b/services/chore/internal/logic/policyLogic.go index 631cef1..997e944 100644 --- a/services/chore/internal/logic/policyLogic.go +++ b/services/chore/internal/logic/policyLogic.go @@ -2,21 +2,16 @@ package logic import ( "context" - "crypto/hmac" - "crypto/sha256" - "encoding/base64" - "encoding/hex" - "encoding/json" - "fmt" - "hash" - "io" - "time" + "strings" "lone-services/pkg/utils" chore "lone-services/rpc/chore/pb" "lone-services/services/chore/internal/svc" - "github.com/aliyun/credentials-go/credentials" + openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client" + util "github.com/alibabacloud-go/tea-utils/v2/service" + "github.com/alibabacloud-go/tea/tea" "github.com/zeromicro/go-zero/core/logx" ) @@ -26,15 +21,17 @@ type PolicyLogic struct { logx.Logger } -type PolicyToken struct { - Policy string `json:"policy"` - SecurityToken string `json:"security_token"` - SignatureVersion string `json:"x_oss_signature_version"` - Credential string `json:"x_oss_credential"` - Date string `json:"x_oss_date"` - Signature string `json:"signature"` - Host string `json:"host"` - Dir string `json:"dir"` +// StsToken 对齐阿里云 STS 返回字段,并附带前端上传所需信息 +type StsToken struct { + AccessKeyId string `json:"AccessKeyId"` + AccessKeySecret string `json:"AccessKeySecret"` + SecurityToken string `json:"SecurityToken"` + Expiration string `json:"Expiration"` + Bucket string `json:"bucket"` + Region string `json:"region"` + Endpoint string `json:"endpoint"` + Host string `json:"host"` + Dir string `json:"dir"` } func NewPolicyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PolicyLogic { @@ -45,98 +42,93 @@ func NewPolicyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PolicyLogi } } -var ( - region string - bucketName string - product = "oss" -) - func (l *PolicyLogic) Policy(in *chore.PolicyReq) (*chore.Response, error) { - // 设置bucket所处地域 - region = utils.GetConfigString("oss.region") - // 替换为您的bucket名称 - bucketName = utils.GetConfigString("oss.bucketName") - // 设置 OSS 上传地址 - // lone-images.oss-accelerate.aliyuncs.com - host := fmt.Sprintf("https://%s.oss-%s.aliyuncs.com", bucketName, region) - // 设置上传目录 + accessKeyId := utils.GetConfigString("oss.accessKeyId") + accessKeySecret := utils.GetConfigString("oss.accessKeySecret") + roleArn := utils.GetConfigString("oss.roleArn") + roleSessionName := utils.GetConfigString("oss.roleSessionName") + stsEndpoint := utils.GetConfigString("oss.stsEndpoint") + region := utils.GetConfigString("oss.region") + bucket := utils.GetConfigString("oss.bucketName") dir := utils.GetConfigString("oss.dir") - config := new(credentials.Config). - SetType("ram_role_arn"). - SetAccessKeyId(utils.GetConfigString("oss.accessKeyId")). - SetAccessKeySecret(utils.GetConfigString("oss.accessKeySecret")). - SetRoleArn(utils.GetConfigString("oss.roleArn")). - SetRoleSessionName(utils.GetConfigString("oss.roleSessionName")). - SetPolicy(""). - SetRoleSessionExpiration(3600) + endpoint := utils.GetConfigString("oss.endpoint") + host := utils.GetConfigString("oss.host") - // 根据配置创建凭证提供器 - provider, err := credentials.NewCredential(config) + if accessKeyId == utils.StringEmpty || accessKeySecret == utils.StringEmpty || roleArn == utils.StringEmpty { + l.Errorf("oss config missing: accessKeyId/accessKeySecret/roleArn") + return failResponse(utils.Fail), nil + } + if roleSessionName == utils.StringEmpty { + roleSessionName = "chore-oss-upload" + } + if stsEndpoint == utils.StringEmpty { + stsEndpoint = "sts.cn-hangzhou.aliyuncs.com" + } + if bucket == utils.StringEmpty { + bucket = "lone-images" + } + if region == utils.StringEmpty { + region = "oss-cn-hangzhou" + } + if endpoint == utils.StringEmpty { + endpoint = "https://lone-images.oss-accelerate.aliyuncs.com" + } + if host == utils.StringEmpty { + host = "https://images.ailuowan.com" + } + if !strings.HasPrefix(endpoint, "http") { + endpoint = "https://" + endpoint + } + if !strings.HasPrefix(host, "http") { + host = "https://" + host + } + + expire := int64(utils.GetConfigInt("oss.expireSeconds")) + if expire < 1 { + expire = 3600 + } + + client, err := createStsClient(accessKeyId, accessKeySecret, stsEndpoint) if err != nil { - l.Errorf("NewCredential fail, err:%v", err) + l.Errorf("create STS client: %v", err) + return failResponse(utils.Fail), nil } - // 从凭证提供器获取凭证 - cred, err := provider.GetCredential() + + assumeRoleRequest := &sts20150401.AssumeRoleRequest{ + DurationSeconds: tea.Int64(expire), + RoleArn: tea.String(roleArn), + RoleSessionName: tea.String(roleSessionName), + } + resp, err := client.AssumeRoleWithOptions(assumeRoleRequest, &util.RuntimeOptions{}) if err != nil { - l.Errorf("GetCredential fail, err:%v", err) + l.Errorf("AssumeRole: %v", err) + return failResponse(utils.Fail), nil } - // 构建policy - utcTime := time.Now().UTC() - date := utcTime.Format("20060102") - expiration := utcTime.Add(1 * time.Hour) - policyMap := map[string]any{ - "expiration": expiration.Format("2006-01-02T15:04:05.000Z"), - "conditions": []any{ - map[string]string{"bucket": bucketName}, - map[string]string{"x-oss-signature-version": "OSS4-HMAC-SHA256"}, - map[string]string{"x-oss-credential": fmt.Sprintf("%v/%v/%v/%v/aliyun_v4_request", *cred.AccessKeyId, date, region, product)}, - map[string]string{"x-oss-date": utcTime.Format("20060102T150405Z")}, - map[string]string{"x-oss-security-token": *cred.SecurityToken}, - }, + if resp == nil || resp.Body == nil || resp.Body.Credentials == nil { + l.Errorf("AssumeRole empty credentials") + return failResponse(utils.Fail), nil } - // 将policy转换为 JSON 格式 - policy, err := json.Marshal(policyMap) - if err != nil { - l.Errorf("json.Marshal fail, err:%v", err) + + cred := resp.Body.Credentials + token := StsToken{ + AccessKeyId: tea.StringValue(cred.AccessKeyId), + AccessKeySecret: tea.StringValue(cred.AccessKeySecret), + SecurityToken: tea.StringValue(cred.SecurityToken), + Expiration: tea.StringValue(cred.Expiration), + Bucket: bucket, + Region: region, + Endpoint: endpoint, + Host: host, + Dir: dir, } - // 构造待签名字符串(StringToSign) - stringToSign := base64.StdEncoding.EncodeToString([]byte(policy)) - hmacHash := func() hash.Hash { return sha256.New() } - // 构建signing key - signingKey := "aliyun_v4" + *cred.AccessKeySecret - h1 := hmac.New(hmacHash, []byte(signingKey)) - io.WriteString(h1, date) - h1Key := h1.Sum(nil) - h2 := hmac.New(hmacHash, h1Key) - io.WriteString(h2, region) - h2Key := h2.Sum(nil) - h3 := hmac.New(hmacHash, h2Key) - io.WriteString(h3, product) - h3Key := h3.Sum(nil) - h4 := hmac.New(hmacHash, h3Key) - io.WriteString(h4, "aliyun_v4_request") - h4Key := h4.Sum(nil) - // 生成签名 - h := hmac.New(hmacHash, h4Key) - io.WriteString(h, stringToSign) - signature := hex.EncodeToString(h.Sum(nil)) - // 构建返回给前端的表单 - policyToken := PolicyToken{ - Policy: stringToSign, - SecurityToken: *cred.SecurityToken, - SignatureVersion: "OSS4-HMAC-SHA256", - Credential: fmt.Sprintf("%v/%v/%v/%v/aliyun_v4_request", *cred.AccessKeyId, date, region, product), - Date: utcTime.UTC().Format("20060102T150405Z"), - Signature: signature, - Host: host, // 返回 OSS 上传地址 - Dir: dir, // 返回上传目录 - } - response, err := json.Marshal(policyToken) - if err != nil { - fmt.Println("json err:", err) - } - return &chore.Response{ - Code: 0, - Data: string(response), - }, nil + return okResponse(token), nil +} + +func createStsClient(accessKeyId, accessKeySecret, endpoint string) (*sts20150401.Client, error) { + config := &openapi.Config{ + AccessKeyId: tea.String(accessKeyId), + AccessKeySecret: tea.String(accessKeySecret), + Endpoint: tea.String(endpoint), + } + return sts20150401.NewClient(config) } diff --git a/services/chore/internal/logic/response.go b/services/chore/internal/logic/response.go new file mode 100644 index 0000000..6100dec --- /dev/null +++ b/services/chore/internal/logic/response.go @@ -0,0 +1,24 @@ +package logic + +import ( + "lone-services/pkg/utils" + chore "lone-services/rpc/chore/pb" + + jsoniter "github.com/json-iterator/go" +) + +func okResponse(data any) *chore.Response { + buf, _ := jsoniter.Marshal(data) + return &chore.Response{ + Code: utils.Ok.Code, + Msg: utils.Ok.Msg, + Data: string(buf), + } +} + +func failResponse(status utils.Status) *chore.Response { + return &chore.Response{ + Code: status.Code, + Msg: status.Msg, + } +} diff --git a/services/chore/run.toml b/services/chore/run.toml index c944759..c9bd19a 100644 --- a/services/chore/run.toml +++ b/services/chore/run.toml @@ -2,7 +2,7 @@ login_out_time=43200 #api接口超时时间分 login_refresh_out_time=83200 name = "chore-service" - listenOn = "0.0.0.0:10300" + listenOn = "0.0.0.0:10500" mode = "dev" [log] path = "logs" @@ -15,6 +15,18 @@ maxBackups = 5 compress = false +[oss] + accessKeyId = "LTAI5t7U8KvxSiPE5auwQUuu" + accessKeySecret = "xjfgbQQRpL4TcIspNuClg6bYADa3pk" + roleArn = "acs:ram::你的账号ID:role/你的角色名" + roleSessionName = "chore-oss-upload" + region = "oss-cn-hangzhou" + bucketName = "lone-images" + endpoint = "https://lone-images.oss-accelerate.aliyuncs.com" + host = "https://images.ailuowan.com" + dir = "upload/" + expireSeconds = 3600 + [redis] host = '39.106.171.204' password = 'lLMLcuPpzSj' @@ -22,4 +34,4 @@ db = 0 [encrypt] - data_key = "u2t9T3luZtoRfhBstkFN6TiIMW38BA8a" \ No newline at end of file + data_key = "u2t9T3luZtoRfhBstkFN6TiIMW38BA8a" diff --git a/services/express/.gitignore b/services/express/.gitignore new file mode 100644 index 0000000..b16af82 --- /dev/null +++ b/services/express/.gitignore @@ -0,0 +1,3 @@ +run.toml +tmp +etc/express.yaml \ No newline at end of file diff --git a/services/express/express.go b/services/express/express.go new file mode 100644 index 0000000..1a5dd28 --- /dev/null +++ b/services/express/express.go @@ -0,0 +1,158 @@ +package main + +import ( + "flag" + "lone-services/pkg/discovery" + "lone-services/pkg/modelbase" + "lone-services/pkg/mysql" + "lone-services/pkg/redis" + "lone-services/pkg/utils" + "lone-services/pkg/validate" + express "lone-services/rpc/express/pb" + "lone-services/services/express/internal/config" + "lone-services/services/express/internal/server" + "lone-services/services/express/internal/svc" + "net" + "os" + "strconv" + + "github.com/zeromicro/go-zero/core/conf" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/service" + "github.com/zeromicro/go-zero/zrpc" + "google.golang.org/grpc" + "google.golang.org/grpc/reflection" +) + +var configFile = flag.String("f", "etc/express.yaml", "the config file") + +func main() { + flag.Parse() + var c config.Config + conf.MustLoad(*configFile, &c) + + // Nacos配置拉取初始化 + nacosParam := utils.NacosConfig{ + Hosts: c.Nacos.Hosts, + NamespaceId: c.Nacos.NamespaceId, + Group: c.Nacos.Group, + ConfigID: c.Nacos.ConfigID, + } + utils.InitConfig(nacosParam) + + // 日志配置 + logConf := logx.LogConf{ + ServiceName: utils.GetConfigString("log.serviceName"), + Mode: utils.GetConfigString("log.mode"), + Encoding: utils.GetConfigString("log.encoding"), + Level: utils.GetConfigString("log.level"), + Path: utils.GetConfigString("log.path"), + KeepDays: utils.GetConfigInt("log.keepDays"), + MaxSize: utils.GetConfigInt("log.maxSize"), + MaxBackups: utils.GetConfigInt("log.maxBackups"), + Compress: utils.GetConfigBool("log.compress"), + } + logx.SetUp(logConf) + logx.AddWriter(logx.NewWriter(os.Stdout)) + + listenOn := utils.GetConfigString("base.listenOn") + mode := utils.GetConfigString("base.mode") + serviceName := utils.GetConfigString("base.name") + + // 初始化服务发现 + if err := discovery.Init(discovery.Config{ + Hosts: c.Nacos.Hosts, + NamespaceId: c.Nacos.NamespaceId, + Group: c.Nacos.Group, + }); err != nil { + logx.Errorf("nacos init: %v", err) + os.Exit(1) + } + + port, err := listenPort(listenOn) + if err != nil { + logx.Errorf("parse ListenOn: %v", err) + os.Exit(1) + } + + // 注册服务 + if err := discovery.Register(discovery.Instance{ + ServiceName: serviceName, + IP: c.Nacos.RegisterIP, + Port: port, + Group: c.Nacos.Group, + }); err != nil { + logx.Errorf("nacos register: %v", err) + os.Exit(1) + } + logx.Infof("服务注册成功: %s:%d", c.Nacos.RegisterIP, port) + + defer func() { + if err := discovery.Deregister(); err != nil { + logx.Errorf("nacos deregister: %v", err) + } + }() + + // 初始化MySQL + db, err := mysql.New(mysql.Config{ + Host: utils.GetConfigString("mysql.host"), + Port: utils.GetConfigInt("mysql.port"), + User: utils.GetConfigString("mysql.user"), + Password: utils.GetConfigString("mysql.password"), + Database: utils.GetConfigString("mysql.database"), + Charset: utils.GetConfigString("mysql.charset"), + Prefix: utils.GetConfigString("mysql.prefix"), + ReadHost: utils.GetConfigString("mysql_read.host"), + ReadPort: utils.GetConfigInt("mysql_read.port"), + ReadUser: utils.GetConfigString("mysql_read.user"), + ReadPassword: utils.GetConfigString("mysql_read.password"), + ReadDatabase: utils.GetConfigString("mysql_read.database"), + }) + if err != nil { + logx.Errorf("mysql init: %v", err) + os.Exit(1) + } + + // 初始化Redis + if err := redis.Init(redis.Config{ + Host: utils.GetConfigString("redis.host"), + Port: utils.GetConfigInt("redis.port"), + Password: utils.GetConfigString("redis.password"), + DB: utils.GetConfigInt("redis.db"), + }); err != nil { + logx.Errorf("redis init: %v", err) + os.Exit(1) + } + + debug := utils.GetConfigBool("mysql.debug") + modelbase.Init(db, modelbase.Config{Prefix: utils.GetConfigString("mysql.prefix"), Debug: debug}) + + // 初始化服务信息 + rpcConf := zrpc.RpcServerConf{ + ListenOn: listenOn, + } + rpcConf.Mode = mode + ctx := svc.NewServiceContext(c, db) + + s := zrpc.MustNewServer(rpcConf, func(grpcServer *grpc.Server) { + express.RegisterExpressServer(grpcServer, server.NewExpressServer(ctx)) + if mode == service.DevMode || mode == service.TestMode { + reflection.Register(grpcServer) + } + }) + defer s.Stop() + + s.AddUnaryInterceptors(validate.UnaryServerInterceptor(validate.MustNew())) + + logx.Infof("Starting rpc server at %s...", listenOn) + s.Start() +} + +// listenPort 拆分端口 +func listenPort(listenOn string) (uint64, error) { + _, portStr, err := net.SplitHostPort(listenOn) + if err != nil { + return utils.NumberZero, err + } + return strconv.ParseUint(portStr, utils.NumberTen, utils.NumberSixtyFourth) +} diff --git a/services/express/expressclient/express.go b/services/express/expressclient/express.go new file mode 100644 index 0000000..263ce84 --- /dev/null +++ b/services/express/expressclient/express.go @@ -0,0 +1,45 @@ +// Code generated by goctl. DO NOT EDIT. +// goctl 1.10.2 +// Source: express.proto + +package expressClient + +import ( + "context" + + "lone-services/rpc/express/pb" + + "github.com/zeromicro/go-zero/zrpc" + "google.golang.org/grpc" +) + +type ( + EmtpyRequest = express.EmtpyRequest + Request = express.Request + Response = express.Response + + Express interface { + Ping(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) + Items(ctx context.Context, in *EmtpyRequest, opts ...grpc.CallOption) (*Response, error) + } + + defaultExpress struct { + cli zrpc.Client + } +) + +func NewExpress(cli zrpc.Client) Express { + return &defaultExpress{ + cli: cli, + } +} + +func (m *defaultExpress) Ping(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) { + client := express.NewExpressClient(m.cli.Conn()) + return client.Ping(ctx, in, opts...) +} + +func (m *defaultExpress) Items(ctx context.Context, in *EmtpyRequest, opts ...grpc.CallOption) (*Response, error) { + client := express.NewExpressClient(m.cli.Conn()) + return client.Items(ctx, in, opts...) +} diff --git a/services/express/internal/config/config.go b/services/express/internal/config/config.go new file mode 100644 index 0000000..a1979dd --- /dev/null +++ b/services/express/internal/config/config.go @@ -0,0 +1,13 @@ +package config + +type Config struct { + Nacos NacosConf +} + +type NacosConf struct { + Hosts []string + NamespaceId string `json:",optional"` + Group string `json:",optional"` + RegisterIP string `json:",optional"` + ConfigID string `json:",optional"` +} diff --git a/services/express/internal/logic/base.go b/services/express/internal/logic/base.go new file mode 100644 index 0000000..cbd496c --- /dev/null +++ b/services/express/internal/logic/base.go @@ -0,0 +1,44 @@ +package logic + +import ( + "lone-services/pkg/utils" + "lone-services/pkg/validate" + express "lone-services/rpc/express/pb" + "reflect" + + jsoniter "github.com/json-iterator/go" +) + +type BaseLogic struct { +} + +func (l *BaseLogic) checkParams(in interface{}, v validate.IValidator) *express.Response { + rv := reflect.ValueOf(in) + if rv.Kind() != reflect.Ptr || rv.IsNil() { + return &express.Response{ + Code: utils.ErrorParams.Code, + Msg: "request must be non‑nil proto pointer", + } + } + + resp := validate.ValidateFromProto(in, v) + if resp != utils.StringEmpty { + return &express.Response{ + Code: utils.ErrorParams.Code, + Msg: resp, + } + } + return nil +} + +func (l *BaseLogic) fail(status utils.Status) (*express.Response, error) { + return l.out(status, status.Msg) +} +func (l *BaseLogic) out(status utils.Status, msg string) (*express.Response, error) { + return &express.Response{Code: status.Code, Msg: msg}, nil +} + +func (l *BaseLogic) ok(data any) (*express.Response, error) { + buf, _ := jsoniter.Marshal(data) + return &express.Response{Code: utils.Ok.Code, Msg: utils.Ok.Msg, Data: string(buf)}, nil +} diff --git a/services/express/internal/logic/itemsLogic.go b/services/express/internal/logic/itemsLogic.go new file mode 100644 index 0000000..01d7980 --- /dev/null +++ b/services/express/internal/logic/itemsLogic.go @@ -0,0 +1,30 @@ +package logic + +import ( + "context" + + "lone-services/rpc/express/pb" + "lone-services/services/express/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ItemsLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ItemsLogic { + return &ItemsLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *ItemsLogic) Items(in *express.EmtpyRequest) (*express.Response, error) { + // todo: add your logic here and delete this line + + return &express.Response{}, nil +} diff --git a/services/express/internal/logic/pinglogic.go b/services/express/internal/logic/pinglogic.go new file mode 100644 index 0000000..ef3efb3 --- /dev/null +++ b/services/express/internal/logic/pinglogic.go @@ -0,0 +1,31 @@ +package logic + +import ( + "context" + express "lone-services/rpc/express/pb" + + "lone-services/services/express/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type PingLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewPingLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PingLogic { + return &PingLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *PingLogic) Ping(in *express.Request) (*express.Response, error) { + // todo: add your logic here and delete this line + + return l.ok("this is a test") +} diff --git a/services/express/internal/server/expressServer.go b/services/express/internal/server/expressServer.go new file mode 100644 index 0000000..1f51ebe --- /dev/null +++ b/services/express/internal/server/expressServer.go @@ -0,0 +1,34 @@ +// Code generated by goctl. DO NOT EDIT. +// goctl 1.10.2 +// Source: express.proto + +package server + +import ( + "context" + + "lone-services/rpc/express/pb" + "lone-services/services/express/internal/logic" + "lone-services/services/express/internal/svc" +) + +type ExpressServer struct { + svcCtx *svc.ServiceContext + express.UnimplementedExpressServer +} + +func NewExpressServer(svcCtx *svc.ServiceContext) *ExpressServer { + return &ExpressServer{ + svcCtx: svcCtx, + } +} + +func (s *ExpressServer) Ping(ctx context.Context, in *express.Request) (*express.Response, error) { + l := logic.NewPingLogic(ctx, s.svcCtx) + return l.Ping(in) +} + +func (s *ExpressServer) Items(ctx context.Context, in *express.EmtpyRequest) (*express.Response, error) { + l := logic.NewItemsLogic(ctx, s.svcCtx) + return l.Items(in) +} diff --git a/services/express/internal/svc/servicecontext.go b/services/express/internal/svc/servicecontext.go new file mode 100644 index 0000000..be0d50e --- /dev/null +++ b/services/express/internal/svc/servicecontext.go @@ -0,0 +1,23 @@ +package svc + +import ( + "lone-services/pkg/utils" + "lone-services/services/express/internal/config" + + "gorm.io/gorm" +) + +type ServiceContext struct { + Config config.Config + DB *gorm.DB + Prefix string +} + +func NewServiceContext(c config.Config, db *gorm.DB) *ServiceContext { + + return &ServiceContext{ + Config: c, + DB: db, + Prefix: utils.GetConfigString("mysql.prefix"), + } +} diff --git a/services/order/.gitignore b/services/order/.gitignore index aa5820a..af1e890 100644 --- a/services/order/.gitignore +++ b/services/order/.gitignore @@ -1,2 +1,3 @@ run.toml -etc/order.yaml \ No newline at end of file +etc/order.yaml +tmp \ No newline at end of file diff --git a/services/order/internal/dao/address.go b/services/order/internal/dao/address.go new file mode 100644 index 0000000..4c40b7b --- /dev/null +++ b/services/order/internal/dao/address.go @@ -0,0 +1,25 @@ +package dao + +const DeliveryAddressDefaultYes = 1 //默认 +const DeliveryAddressDefaultNo = 2 //不默认 +const DeliveryAddressTypeStore = 1 + +type Address struct { + Id int64 `json:"id" gorm:"id"` + TargetId int64 `json:"target_id" gorm:"target_id"` // 对象ID + District string `json:"district" gorm:"district"` // 地区 + DistrictIds string `json:"district_ids" gorm:"district_ids"` // 地区IDS + Default int32 `json:"default" gorm:"default"` // 默认:1为默认,2为不默认 + Address string `json:"address" gorm:"address"` // 地址 + SaleId int64 `json:"sale_id" gorm:"sale_id"` // 销售ID + GroupId int64 `json:"group_id" gorm:"group_id"` // 分组ID + Name string `json:"name" gorm:"name"` // 收货人姓名 + Mobile string `json:"mobile" gorm:"mobile"` // 收货人手机 + Type int32 `json:"type" gorm:"type"` // 类型 1门店 , 2销售,3为用户 + Status int32 `json:"status" gorm:"status"` // 状态,1是正常,2为申请,3为一审核,4为二审核中,5为拒绝申请,6为审核失败,7为删除 + Reason string `json:"reason" gorm:"reason"` + NewContent string `json:"new_content" gorm:"new_content"` // 编辑后的内容 + TypeName string `json:"type_name" gorm:"type_name"` // 类型名 + AdminId int64 `json:"admin_id" gorm:"admin_id"` + AdminName string `json:"admin_name" gorm:"admin_name"` +} diff --git a/services/order/internal/dao/cart.go b/services/order/internal/dao/cart.go new file mode 100644 index 0000000..c18931a --- /dev/null +++ b/services/order/internal/dao/cart.go @@ -0,0 +1,10 @@ +package dao + +type Cart struct { + Id int64 `json:"id" gorm:"id"` + Content string `json:"content" gorm:"content"` // 内容 + StoreId int64 `json:"store_id" gorm:"store_id"` // 门店ID + SaleId int64 `json:"sale_id" gorm:"sale_id"` // 销售ID + Type bool `json:"type" gorm:"type"` // 类型,1为门店添加,2为销售添加 + UserId int64 `json:"user_id" gorm:"user_id"` // 用户ID +} diff --git a/services/order/internal/dao/order.go b/services/order/internal/dao/order.go new file mode 100644 index 0000000..aab1a6f --- /dev/null +++ b/services/order/internal/dao/order.go @@ -0,0 +1,223 @@ +package dao + +import ( + "lone-services/pkg/utils" +) + +const ( + OrderPayTypeWechat = 1 //微信 + OrderPayTypeAlipay = 2 //支付宝 + OrderPayTypeRemaining = 3 //余额 + + OrderPayStatusOk = 1 //为已支付 + OrderPayStatusWait = 2 //为未支付 + OrderPayStatusIn = 3 //为支付中 + OrderPayStatusFail = 4 //支付失败 + OrderPayStatusLose = 5 //已失效 + + OrderTypeSale = 1 //销售 + OrderTypeStore = 2 //为门店 + OrderTypePersonal = 3 //为个人 + OrderTypeHome = 4 //为个人家庭试用 +) + +type OrderCreate struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + StoreId int `gorm:"column:store_id;type:int(11);comment:美容院关联ID号" json:"store_id"` + StoreName string `gorm:"column:store_name;type:varchar(50);comment:门店名" json:"store_name"` + SaleName string `gorm:"column:sale_name;type:varchar(50);comment:销售姓名" json:"sale_name"` + SaleMobile string `gorm:"column:sale_mobile;type:char(60);comment:销售电话" json:"sale_mobile"` + SaleProvince int `gorm:"column:sale_province;type:int(11);default:0;comment:销售到的地域" json:"sale_province"` + UserId int `gorm:"column:user_id;type:int(11);comment:用户ID" json:"user_id"` + UserName string `gorm:"column:user_name;type:varchar(255);comment:用户名" json:"user_name"` + SaleId int `gorm:"column:sale_id;type:int(11);comment:销售员ID号" json:"sale_id"` + Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号;NOT NULL" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址;NOT NULL" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(50);comment:收货人姓名;NOT NULL" json:"addressee"` + DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` + TotalPrice float64 `gorm:"column:total_price;type:decimal(10,2);comment:总价;NOT NULL" json:"total_price"` + GroupId int `gorm:"column:group_id;type:int(11);default:0" json:"group_id"` + PayPrice float64 `gorm:"column:pay_price;type:decimal(10,2);comment:实际支付金额" json:"pay_price"` + PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` + IsSupply uint8 `gorm:"column:is_supply;type:tinyint(1);default:1;comment:是否补过货,1为没有,2为补过" json:"is_supply"` + Note string `gorm:"column:note;type:varchar(255);comment:备注" json:"note"` + VerifyStatus uint8 `gorm:"column:verify_status;type:tinyint(1);default:0;comment:审核状态,1为通过,2为失败,3为待审核,0为正常订单不需要审核" json:"verify_status"` + ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` + Type uint8 `gorm:"column:type;type:tinyint(1);default:0;comment:类型 1 销售,2为门店,3为个人,4为个人家庭试用,5为个人门店试用" json:"type"` +} + +type OrderInfo struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + StoreId int `gorm:"column:store_id;type:int(11);comment:美容院关联ID号" json:"store_id"` + StoreName string `gorm:"column:store_name;type:varchar(50);comment:门店名" json:"store_name"` + SaleName string `gorm:"column:sale_name;type:varchar(50);comment:销售姓名" json:"sale_name"` + SaleMobile string `gorm:"column:sale_mobile;type:char(60);comment:销售电话" json:"sale_mobile"` + UserId int `gorm:"column:user_id;type:int(11);comment:用户ID" json:"user_id"` + UserName string `gorm:"column:user_name;type:varchar(255);comment:用户名" json:"user_name"` + SaleId int `gorm:"column:sale_id;type:int(11);comment:销售员ID号" json:"sale_id"` + Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号;NOT NULL" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址;NOT NULL" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(50);comment:收货人姓名;NOT NULL" json:"addressee"` + DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` + TotalPrice float64 `gorm:"column:total_price;type:decimal(10,2);comment:总价;NOT NULL" json:"total_price"` + PayPrice float64 `gorm:"column:pay_price;type:decimal(10,2);comment:实际支付金额" json:"pay_price"` + PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` + DeliverStatus uint8 `gorm:"column:deliver_status;type:tinyint(1);default:2;comment:发货状态,1为已签收,2为待发货,3为发货中,4为已发货" json:"deliver_status"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` + IsSupply uint8 `gorm:"column:is_supply;type:tinyint(1);default:1;comment:是否补过货,1为没有,2为补过" json:"is_supply"` + Note string `gorm:"column:note;type:varchar(255);comment:备注" json:"note"` + ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` + OutTradeNo string `gorm:"column:out_trade_no;type:varchar(50);comment:支付订单号" json:"out_trade_no"` + OldAddress string `gorm:"column:old_address;type:varchar(255);comment:老的收发货信息,如果有这个就表明是修改过收货地址" json:"old_address"` + Type uint8 `gorm:"column:type;type:tinyint(1);default:0;comment:类型 1 销售,2为门店,3为个人,4为个人家庭试用,5为个人门店试用" json:"type"` + SignTime utils.CustomTime `gorm:"column:sign_time;type:datetime;comment:签收时间" json:"sign_time"` + CreateType uint8 `gorm:"column:create_type;type:tinyint(1);default:1;comment:下单人类型,1为销售,2为门店,3为个人;NOT NULL" json:"create_type"` + CreateTime utils.CustomTime `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP;comment:订单创建时间" json:"create_time"` + ProductItems []OrderProducts `gorm:"-" json:"product_items"` + RefundStatus uint8 `gorm:"column:refund_status" json:"refund_status"` + AesMobile string `gorm:"-" json:"aes_mobile"` + OriginalMobile string `gorm:"-" json:"original_mobile,omitempty"` +} + +type OrderPay struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + TotalPrice float64 `gorm:"column:total_price;type:decimal(10,2);comment:总价;NOT NULL" json:"total_price"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + PayPrice float64 `gorm:"column:pay_price;type:decimal(10,2);comment:实际支付金额" json:"pay_price"` + PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` + DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` + GroupId int `gorm:"column:group_id;type:int(11);default:0;comment:分组ID" json:"group_id"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` + Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号;NOT NULL" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址;NOT NULL" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(50);comment:收货人姓名;NOT NULL" json:"addressee"` + OutTradeNo string `gorm:"column:out_trade_no;type:varchar(50);comment:支付订单号;NOT NULL" json:"out_trade_no"` +} + +type OrderDown struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + StoreId int `gorm:"column:store_id;type:int(11);comment:美容院关联ID号" json:"store_id"` + StoreName string `gorm:"column:store_name;type:varchar(50);comment:门店名" json:"store_name"` + SaleName string `gorm:"column:sale_name;type:varchar(50);comment:销售姓名" json:"sale_name"` + SaleMobile string `gorm:"column:sale_mobile;type:char(60);comment:销售电话" json:"sale_mobile"` + SaleId int `gorm:"column:sale_id;type:int(11);comment:销售员ID号" json:"sale_id"` + Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号;NOT NULL" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址;NOT NULL" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(50);comment:收货人姓名;NOT NULL" json:"addressee"` + DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` + TotalPrice float64 `gorm:"column:total_price;type:decimal(10,2);comment:总价;NOT NULL" json:"total_price"` + PayPrice float64 `gorm:"column:pay_price;type:decimal(10,2);comment:实际支付金额" json:"pay_price"` + PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` + ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` + SignTime utils.CustomTime `gorm:"column:sign_time;type:datetime;comment:签收时间" json:"sign_time"` + CreateType uint8 `gorm:"column:create_type;type:tinyint(1);default:1;comment:下单人类型,1为销售,2为门店,3为个人;NOT NULL" json:"create_type"` + CreateTime utils.CustomTime `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP;comment:订单创建时间" json:"create_time"` + ProductName string `gorm:"-" json:"product_name"` + TypeName string `gorm:"-" json:"type_name"` + BankInfo string `gorm:"-" json:"bank_info"` + OriginalMobile string `gorm:"-" json:"original_mobile"` + OriginalSaleMobile string `gorm:"-" json:"original_sale_mobile"` +} + +type OrderSaleItems struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + StoreName string `gorm:"column:store_name;type:varchar(50);comment:门店名" json:"store_name"` + TotalPrice float64 `gorm:"column:total_price;type:decimal(10,2);comment:总价;NOT NULL" json:"total_price"` + PayPrice float64 `gorm:"column:pay_price;type:decimal(10,2);comment:实际支付金额" json:"pay_price"` + ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` + SignTime utils.CustomTime `gorm:"column:sign_time;type:datetime;comment:签收时间" json:"sign_time"` + CreateTime utils.CustomTime `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP;comment:订单创建时间" json:"create_time"` + ProductItems []OrderProducts `gorm:"-" json:"product_items"` +} + +type OrderAccount struct { + Id int `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + StoreId int `gorm:"column:store_id;type:int(11);comment:美容院关联ID号" json:"store_id"` + UserId int `gorm:"column:user_id;type:int(11);comment:用户ID" json:"user_id"` + SaleId int `gorm:"column:sale_id;type:int(11);comment:销售员ID号" json:"sale_id"` + TotalPrice float64 `gorm:"column:total_price;type:decimal(10,2);comment:总价;NOT NULL" json:"total_price"` + PayPrice float64 `gorm:"column:pay_price;type:decimal(10,2);comment:实际支付金额" json:"pay_price"` + PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` + ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` + Type uint8 `gorm:"column:type;type:tinyint(1);default:0;comment:类型 1 销售,2为门店,3为个人,4为个人家庭试用,5为个人门店试用" json:"type"` + Products []OrderProducts `gorm:"-" json:"products"` + TaskAwardMonthStatus uint8 `gorm:"column:task_awark_month_status;type:tinyint(1);default:2;comment:结算任务与奖励月,1 为已结算,2为未结算" json:"task_awark_month_status"` + TaskAwardQuarterStatus uint8 `gorm:"column:task_awark_quarter_status;type:tinyint(1);default:2;comment:结算任务与奖励季度,1 为已结算,2为未结算" json:"task_awark_quarter_status"` + TaskAwardHalfYearStatus uint8 `gorm:"column:task_awark_half_year_status;type:tinyint(1);default:2;comment:结算任务与奖励半年,1 为已结算,2为未结算" json:"task_awark_half_year_status"` + TaskAwardYearStatus uint8 `gorm:"column:task_awark_year_status;type:tinyint(1);default:2;comment:结算任务与奖励年,1 为已结算,2为未结算" json:"task_awark_year_status"` + CreateTime utils.CustomTime `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP;comment:订单创建时间" json:"create_time"` +} + +type OrderAccountStatus struct { + AccountStatus uint8 `gorm:"column:account_status;type:tinyint(1);default:2;comment:结算订单状态,1为已结算,2为未结算,3为结算中" json:"account_status"` +} + +type OrderShareStatus struct { + ShareStatus uint8 `gorm:"column:share_status;type:tinyint(1);default:2;comment:结算抽成状态,1为已结算,2为未结算,3为结算中" json:"share_status"` +} + +type OrderDeliverGoodsStatus struct { + SignTime utils.CustomTime `gorm:"column:sign_time;type:datetime;comment:签收时间" json:"sign_time"` + DeliverStatus uint8 `gorm:"column:deliver_status;type:tinyint(1);default:2;comment:发货状态,1为已签收,2为待发货,3为发货中,4为已发货" json:"deliver_status"` +} + +type OrderImitateInfo struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号;NOT NULL" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址;NOT NULL" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(50);comment:收货人姓名;NOT NULL" json:"addressee"` + DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` + PayType uint8 `gorm:"column:pay_type;type:tinyint(1);default:1;comment:支付类型,1为微信,2为支付宝,3为余额支付" json:"pay_type"` + DeliverStatus uint8 `gorm:"column:deliver_status;type:tinyint(1);default:2;comment:发货状态,1为已签收,2为待发货,3为发货中,4为已发货" json:"deliver_status"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` + VerifyStatus uint8 `gorm:"column:verify_status;type:tinyint(1);default:0;comment:审核状态,1为通过,2为失败,3为待审核,0为正常订单不需要审核" json:"verify_status"` + ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` +} + +type OrderImitateItems struct { + OrderImitateInfo + ProductItems []OrderProducts `gorm:"-" json:"product_items"` +} + +type OrderDownInfo struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + StoreId int `gorm:"column:store_id;type:int(11);comment:美容院关联ID号" json:"store_id"` + StoreName string `gorm:"column:store_name;type:varchar(50);comment:门店名" json:"store_name"` + SaleName string `gorm:"column:sale_name;type:varchar(50);comment:销售姓名" json:"sale_name"` + UserId int `gorm:"column:user_id;type:int(11);comment:用户ID" json:"user_id"` + UserName string `gorm:"column:user_name;type:varchar(255);comment:用户名" json:"user_name"` + SaleId int `gorm:"column:sale_id;type:int(11);comment:销售员ID号" json:"sale_id"` + Mobile string `gorm:"column:mobile;type:char(60);comment:收货人手机号;NOT NULL" json:"mobile"` + Address string `gorm:"column:address;type:varchar(255);comment:收货人地址;NOT NULL" json:"address"` + Addressee string `gorm:"column:addressee;type:varchar(50);comment:收货人姓名;NOT NULL" json:"addressee"` + DistrictIds string `gorm:"column:district_ids;type:varchar(255);comment:地区IDS;NOT NULL" json:"district_ids"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:2;comment:支付状态,1为已支付,2为未支付,3为支付中,4支付失败,5已失效;NOT NULL" json:"status"` + ProductIds string `gorm:"column:product_ids;type:varchar(150);comment:产品IDs" json:"product_ids"` + CreateTime utils.CustomTime `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP;comment:订单创建时间" json:"create_time"` + CreateDate string `gorm:"-" json:"create_date"` + ProductName string `gorm:"-" json:"product_name"` + ProductNumber int `gorm:"-" json:"product_number"` + StoreBusinessLicense string `gorm:"-" json:"store_business_license"` +} + +type OrderTaskAndAwardMonth struct { + TaskAwardMonthStatus uint8 `gorm:"column:task_award_month_status;type:tinyint(1);default:2;comment:结算任务与奖励月,1 为已结算,2为未结算" json:"task_awark_month_status"` +} +type OrderTaskAndAwardQuarter struct { + TaskAwardQuarterStatus uint8 `gorm:"column:task_award_quarter_status;type:tinyint(1);default:2;comment:结算任务与奖励季度,1 为已结算,2为未结算" json:"task_awark_quarter_status"` +} +type OrderTaskAndAwardHalfYear struct { + TaskAwardHalfYearStatus uint8 `gorm:"column:task_award_half_year_status;type:tinyint(1);default:2;comment:结算任务与奖励半年,1 为已结算,2为未结算" json:"task_awark_half_year_status"` +} +type OrderTaskAndAwardYear struct { + TaskAwardYearStatus uint8 `gorm:"column:task_award_year_status;type:tinyint(1);default:2;comment:结算任务与奖励年,1 为已结算,2为未结算" json:"task_awark_year_status"` +} diff --git a/services/order/internal/dao/orderProduct.go b/services/order/internal/dao/orderProduct.go new file mode 100644 index 0000000..b29399c --- /dev/null +++ b/services/order/internal/dao/orderProduct.go @@ -0,0 +1,44 @@ +package dao + +import "lone-services/pkg/utils" + +type OrderProductCreate struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + Ordersn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + ProductId int `gorm:"column:product_id;type:int(11);comment:产品ID;NOT NULL" json:"product_id"` + ProductName string `gorm:"column:product_name;type:varchar(255);comment:产品名;NOT NULL" json:"product_name"` + Price float64 `gorm:"column:price;type:decimal(10,2);comment:产品单价格;NOT NULL" json:"price"` + Number int `gorm:"column:number;type:int(11);default:0;comment:购买的数量;NOT NULL" json:"number"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:1;comment:状态:1为正常,2为已推货" json:"status"` + ReturnNumber int `gorm:"column:return_number;type:int(11);default:0;comment:退货数量" json:"return_number"` +} + +type OrderProductInfo struct { + Id int64 `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + Ordersn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + ProductId int `gorm:"column:product_id;type:int(11);comment:产品ID;NOT NULL" json:"product_id"` + ProductName string `gorm:"column:product_name;type:varchar(255);comment:产品名;NOT NULL" json:"product_name"` + Price float64 `gorm:"column:price;type:decimal(10,2);comment:产品单价格;NOT NULL" json:"price"` + Number int `gorm:"column:number;type:int(11);default:0;comment:购买的数量;NOT NULL" json:"number"` + Status uint8 `gorm:"column:status;type:tinyint(1);default:1;comment:状态:1为正常,2为已推货" json:"status"` + ReturnNumber int `gorm:"column:return_number;type:int(11);default:0;comment:退货数量" json:"return_number"` + CreateType uint8 `gorm:"column:create_type;type:tinyint(1);default:1;comment:下单人类型,1为销售,2为门店,3为个人;NOT NULL" json:"create_type"` + CreateTime utils.CustomTime `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP;comment:订单创建时间" json:"create_time"` +} + +type OrderProductPay struct { + ProductId int `gorm:"column:product_id;type:int(11);comment:产品ID;NOT NULL" json:"product_id"` + Number int `gorm:"column:number;type:int(11);default:0;comment:购买的数量;NOT NULL" json:"number"` + ProductName string `gorm:"column:product_name;type:varchar(255);comment:产品名;NOT NULL" json:"product_name"` + Type uint8 `gorm:"-" json:"type"` + Price float64 `gorm:"column:price;type:decimal(10,2);comment:产品单价格;NOT NULL" json:"price"` +} + +type OrderProducts struct { + Id int `gorm:"column:id;type:bigint(20);primary_key;AUTO_INCREMENT" json:"id"` + OrderSn string `gorm:"column:ordersn;type:varchar(100);comment:订单号;NOT NULL" json:"ordersn"` + ProductId int `gorm:"column:product_id;type:int(11);comment:产品ID;NOT NULL" json:"product_id"` + ProductName string `gorm:"column:product_name;type:varchar(255);comment:产品名;NOT NULL" json:"product_name"` + Price float32 `gorm:"column:price;type:decimal(10,2);comment:产品单价格;NOT NULL" json:"price"` + Number int `gorm:"column:number;type:int(11);default:0;comment:购买的数量;NOT NULL" json:"number"` +} diff --git a/services/order/internal/logic/addressItemLogic.go b/services/order/internal/logic/addressItemLogic.go index e40cd67..ab4730a 100644 --- a/services/order/internal/logic/addressItemLogic.go +++ b/services/order/internal/logic/addressItemLogic.go @@ -13,6 +13,7 @@ type AddressItemLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewAddressItemLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddressItemLogic { diff --git a/services/order/internal/logic/base.go b/services/order/internal/logic/base.go new file mode 100644 index 0000000..16ca9b6 --- /dev/null +++ b/services/order/internal/logic/base.go @@ -0,0 +1,44 @@ +package logic + +import ( + "lone-services/pkg/utils" + "lone-services/pkg/validate" + order "lone-services/rpc/order/pb" + "reflect" + + jsoniter "github.com/json-iterator/go" +) + +type BaseLogic struct { +} + +func (l *BaseLogic) checkParams(in interface{}, v validate.IValidator) *order.Response { + rv := reflect.ValueOf(in) + if rv.Kind() != reflect.Ptr || rv.IsNil() { + return &order.Response{ + Code: utils.ErrorParams.Code, + Msg: "request must be non‑nil proto pointer", + } + } + + resp := validate.ValidateFromProto(in, v) + if resp != utils.StringEmpty { + return &order.Response{ + Code: utils.ErrorParams.Code, + Msg: resp, + } + } + return nil +} + +func (l *BaseLogic) fail(status utils.Status) (*order.Response, error) { + return l.out(status, status.Msg) +} +func (l *BaseLogic) out(status utils.Status, msg string) (*order.Response, error) { + return &order.Response{Code: status.Code, Msg: msg}, nil +} + +func (l *BaseLogic) ok(data any) (*order.Response, error) { + buf, _ := jsoniter.Marshal(data) + return &order.Response{Code: utils.Ok.Code, Msg: utils.Ok.Msg, Data: string(buf)}, nil +} diff --git a/services/order/internal/logic/itemsLogic.go b/services/order/internal/logic/itemsLogic.go index 721de5c..ef7867b 100644 --- a/services/order/internal/logic/itemsLogic.go +++ b/services/order/internal/logic/itemsLogic.go @@ -3,6 +3,7 @@ package logic import ( "context" + order "lone-services/rpc/order/pb" "lone-services/services/order/internal/svc" "github.com/zeromicro/go-zero/core/logx" @@ -12,6 +13,7 @@ type ItemsLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ItemsLogic { @@ -22,9 +24,17 @@ func NewItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ItemsLogic } } -func (l *ItemsLogic) Items(in *order.ItemsRequest) (*order.Response, error) { - // todo: add your logic here and delete this line +func (l *ItemsLogic) Items(in *order.OrderItemsRequest) (*order.Response, error) { + //调用其它服务实例 + //cli, err := svc.GetRpcClient(l.svcCtx.ExpressSvcName) + //if err != nil { + // l.Logger.Errorf("get express rpc err: %v", err) + // //降级逻辑 + // return l.out(utils.ErrorInternalServer, "express"+utils.ErrorInternalServer.Msg) + //} + //expClient := express.NewExpressClient(cli.Conn()) + //res, _ := expClient.Ping(context.Background(), &express.Request{}) + //l.Logger.Error("res: %v", res) - //TODO new id now return &order.Response{}, nil } diff --git a/services/order/internal/logic/orderAuditingItemsLogic.go b/services/order/internal/logic/orderAuditingItemsLogic.go index 1f011a8..1997b29 100644 --- a/services/order/internal/logic/orderAuditingItemsLogic.go +++ b/services/order/internal/logic/orderAuditingItemsLogic.go @@ -13,6 +13,7 @@ type OrderAuditingItemsLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewOrderAuditingItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OrderAuditingItemsLogic { diff --git a/services/order/internal/logic/orderAuditingLogic.go b/services/order/internal/logic/orderAuditingLogic.go index 10d6591..fe226e9 100644 --- a/services/order/internal/logic/orderAuditingLogic.go +++ b/services/order/internal/logic/orderAuditingLogic.go @@ -13,6 +13,7 @@ type OrderAuditingLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewOrderAuditingLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OrderAuditingLogic { diff --git a/services/order/internal/logic/orderCreateLogic.go b/services/order/internal/logic/orderCreateLogic.go index 2854e46..af59d22 100644 --- a/services/order/internal/logic/orderCreateLogic.go +++ b/services/order/internal/logic/orderCreateLogic.go @@ -13,6 +13,7 @@ type OrderCreateLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewOrderCreateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OrderCreateLogic { diff --git a/services/order/internal/logic/webAddressCreateLogic.go b/services/order/internal/logic/webAddressCreateLogic.go index ca6435a..0f4a2d1 100644 --- a/services/order/internal/logic/webAddressCreateLogic.go +++ b/services/order/internal/logic/webAddressCreateLogic.go @@ -2,10 +2,14 @@ package logic import ( "context" - + "lone-services/pkg/utils" "lone-services/rpc/order/pb" + "lone-services/services/order/internal/dao" + "lone-services/services/order/internal/model" "lone-services/services/order/internal/svc" + "lone-services/services/order/validator" + jsoniter "github.com/json-iterator/go" "github.com/zeromicro/go-zero/core/logx" ) @@ -13,6 +17,7 @@ type WebAddressCreateLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewWebAddressCreateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WebAddressCreateLogic { @@ -24,7 +29,50 @@ func NewWebAddressCreateLogic(ctx context.Context, svcCtx *svc.ServiceContext) * } func (l *WebAddressCreateLogic) WebAddressCreate(in *order.EditAddressRequest) (*order.Response, error) { - // todo: add your logic here and delete this line + var v validator.AddressEditValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + encryPhone, cErr := utils.EncryptPhone(in.Mobile) + if cErr != nil { + l.Logger.Error(cErr) + return l.fail(utils.ErrorEncryptAesError) + } + + data := dao.Address{ + TargetId: adminInfo.ID, + TypeName: adminInfo.Name, + District: in.District, + DistrictIds: in.DistrictIds, + Address: in.Address, + Name: in.Name, + Mobile: encryPhone, + Type: in.Type, + Status: utils.StatusApply, + } + + jsonStr, err := jsoniter.MarshalToString(data) + if err != nil { + l.Logger.Error("转换失败:", err) + return l.fail(utils.ErrorJsonDataError) + } + + data.NewContent = jsonStr + data.SaleId = adminInfo.SaleId + data.GroupId = adminInfo.GroupId + + modelObj := model.AddressModel{}.Init() + + err = modelObj.Create(&data) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + + return l.ok(data.Id) - return &order.Response{}, nil } diff --git a/services/order/internal/logic/webAddressDefLogic.go b/services/order/internal/logic/webAddressDefLogic.go index cddd4d4..2891828 100644 --- a/services/order/internal/logic/webAddressDefLogic.go +++ b/services/order/internal/logic/webAddressDefLogic.go @@ -13,6 +13,7 @@ type WebAddressDefLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewWebAddressDefLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WebAddressDefLogic { diff --git a/services/order/internal/logic/webAddressEditLogic.go b/services/order/internal/logic/webAddressEditLogic.go index c614eeb..3a7f38f 100644 --- a/services/order/internal/logic/webAddressEditLogic.go +++ b/services/order/internal/logic/webAddressEditLogic.go @@ -13,6 +13,7 @@ type WebAddressEditLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewWebAddressEditLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WebAddressEditLogic { diff --git a/services/order/internal/logic/webAddressItemsLogic.go b/services/order/internal/logic/webAddressItemsLogic.go index 27b713a..d26e863 100644 --- a/services/order/internal/logic/webAddressItemsLogic.go +++ b/services/order/internal/logic/webAddressItemsLogic.go @@ -13,6 +13,7 @@ type WebAddressItemsLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewWebAddressItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WebAddressItemsLogic { diff --git a/services/order/internal/logic/webAddressStatusLogic.go b/services/order/internal/logic/webAddressStatusLogic.go index 3ceb077..563903f 100644 --- a/services/order/internal/logic/webAddressStatusLogic.go +++ b/services/order/internal/logic/webAddressStatusLogic.go @@ -13,6 +13,7 @@ type WebAddressStatusLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewWebAddressStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WebAddressStatusLogic { diff --git a/services/order/internal/logic/webCartEditLogic.go b/services/order/internal/logic/webCartEditLogic.go index 333dcaa..0d46507 100644 --- a/services/order/internal/logic/webCartEditLogic.go +++ b/services/order/internal/logic/webCartEditLogic.go @@ -13,6 +13,7 @@ type WebCartEditLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewWebCartEditLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WebCartEditLogic { diff --git a/services/order/internal/logic/webCartLogic.go b/services/order/internal/logic/webCartLogic.go index 30c9a90..2cf3e03 100644 --- a/services/order/internal/logic/webCartLogic.go +++ b/services/order/internal/logic/webCartLogic.go @@ -13,6 +13,7 @@ type WebCartLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewWebCartLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WebCartLogic { diff --git a/services/order/internal/logic/webCreateLogic.go b/services/order/internal/logic/webCreateLogic.go index f205b94..ed4445e 100644 --- a/services/order/internal/logic/webCreateLogic.go +++ b/services/order/internal/logic/webCreateLogic.go @@ -13,6 +13,7 @@ type WebCreateLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewWebCreateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WebCreateLogic { diff --git a/services/order/internal/model/address.go b/services/order/internal/model/address.go new file mode 100644 index 0000000..11f0cdb --- /dev/null +++ b/services/order/internal/model/address.go @@ -0,0 +1,23 @@ +package model + +import ( + "lone-services/pkg/modelbase" + "lone-services/services/order/internal/dao" +) + +type AddressModel struct { + modelbase.Base +} + +func (m AddressModel) TableName() string { + return modelbase.Prefix() + "address" +} + +func (m AddressModel) Init() AddressModel { + m.Table = m.TableName() + return m +} + +func (m AddressModel) Create(data *dao.Address) error { + return m.Base.Create(data) +} diff --git a/services/order/internal/model/cart.go b/services/order/internal/model/cart.go new file mode 100644 index 0000000..92924af --- /dev/null +++ b/services/order/internal/model/cart.go @@ -0,0 +1,23 @@ +package model + +import ( + "lone-services/pkg/modelbase" + "lone-services/services/order/internal/dao" +) + +type CartModel struct { + modelbase.Base +} + +func (m CartModel) TableName() string { + return modelbase.Prefix() + "cart" +} + +func (m CartModel) Init() CartModel { + m.Table = m.TableName() + return m +} + +func (m CartModel) Create(data *dao.Cart) error { + return m.Base.Create(data) +} diff --git a/services/order/internal/model/order.go b/services/order/internal/model/order.go new file mode 100644 index 0000000..5c91cc1 --- /dev/null +++ b/services/order/internal/model/order.go @@ -0,0 +1,23 @@ +package model + +import ( + "lone-services/pkg/modelbase" + "lone-services/services/order/internal/dao" +) + +type OrderModel struct { + modelbase.Base +} + +func (m OrderModel) TableName() string { + return modelbase.Prefix() + "order" +} + +func (m OrderModel) Init() OrderModel { + m.Table = m.TableName() + return m +} + +func (m OrderModel) Create(data *dao.OrderCreate) error { + return m.Base.Create(data) +} diff --git a/services/order/internal/model/orderProduct.go b/services/order/internal/model/orderProduct.go new file mode 100644 index 0000000..be38ec3 --- /dev/null +++ b/services/order/internal/model/orderProduct.go @@ -0,0 +1,23 @@ +package model + +import ( + "lone-services/pkg/modelbase" + "lone-services/services/order/internal/dao" +) + +type OrderProductModel struct { + modelbase.Base +} + +func (m OrderProductModel) TableName() string { + return modelbase.Prefix() + "order_product" +} + +func (m OrderProductModel) Init() OrderProductModel { + m.Table = m.TableName() + return m +} + +func (m OrderProductModel) Create(data *dao.OrderProductCreate) error { + return m.Base.Create(data) +} diff --git a/services/order/internal/svc/servicecontext.go b/services/order/internal/svc/servicecontext.go index 243f6e9..f85286e 100644 --- a/services/order/internal/svc/servicecontext.go +++ b/services/order/internal/svc/servicecontext.go @@ -1,22 +1,100 @@ package svc import ( + "fmt" + "net" + "strconv" + "sync" + "time" + + "lone-services/pkg/discovery" "lone-services/pkg/utils" "lone-services/services/order/internal/config" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/zrpc" "gorm.io/gorm" ) +// 缓存条目 +type rpcClientCacheEntry struct { + cli zrpc.Client + target string + expireAt time.Time +} + +const rpcClientCacheTTL = 30 * time.Second //缓存过期时间 + +var ( + rpcCacheLock sync.Mutex + rpcCache = make(map[string]*rpcClientCacheEntry) +) + +func GetRpcClient(serviceName string) (zrpc.Client, error) { + if serviceName == utils.StringEmpty { + err := fmt.Errorf("rpc serviceName is empty") + logx.Error(err) + return nil, err + } + + cacheKey := serviceName + + rpcCacheLock.Lock() + entry, ok := rpcCache[cacheKey] + if ok && time.Now().Before(entry.expireAt) { + rpcCacheLock.Unlock() + return entry.cli, nil + } + delete(rpcCache, cacheKey) + rpcCacheLock.Unlock() + + inst, err := discovery.Pick(serviceName) + if err != nil { + err = fmt.Errorf("discovery pick %s failed: %w", serviceName, err) + logx.Error(err) + return nil, err + } + + target := net.JoinHostPort(inst.IP, strconv.FormatUint(inst.Port, utils.NumberTen)) + + cli := zrpc.MustNewClient(zrpc.RpcClientConf{ + Target: target, + Timeout: utils.RpcTimeOut, //rpc调用超时5s + }) + + rpcCacheLock.Lock() + rpcCache[cacheKey] = &rpcClientCacheEntry{ + cli: cli, + target: target, + expireAt: time.Now().Add(rpcClientCacheTTL), + } + rpcCacheLock.Unlock() + + return cli, nil +} + type ServiceContext struct { Config config.Config DB *gorm.DB Prefix string + + ExpressSvcName string //服务名 } func NewServiceContext(c config.Config, db *gorm.DB) *ServiceContext { - return &ServiceContext{ - Config: c, - DB: db, - Prefix: utils.GetConfigString("mysql.prefix"), + //启动仅读取配置,不建立rpc连接 多个服务就多个 + expressSvc := utils.GetConfigString("services.express") + + if expressSvc == utils.StringEmpty { + logx.Error("config services.express empty") } + + svcCtx := &ServiceContext{ + Config: c, + DB: db, + Prefix: utils.GetConfigString("mysql.prefix"), + ExpressSvcName: expressSvc, + } + + return svcCtx } diff --git a/services/order/order.go b/services/order/order.go index 0e5cbf7..07b09b8 100644 --- a/services/order/order.go +++ b/services/order/order.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "lone-services/pkg/discovery" "lone-services/pkg/modelbase" "lone-services/pkg/mysql" @@ -38,6 +39,7 @@ func main() { Group: c.Nacos.Group, ConfigID: c.Nacos.ConfigID, } + fmt.Println("Nacos Config:", nacosParam) utils.InitConfig(nacosParam) // 日志配置 diff --git a/services/order/validator/address.go b/services/order/validator/address.go new file mode 100644 index 0000000..ae36a94 --- /dev/null +++ b/services/order/validator/address.go @@ -0,0 +1,69 @@ +package validator + +import "lone-services/pkg/validate" + +// AddressDefValidator 查看列表 +type AddressDefValidator struct { + Id int64 `validate:"required"` +} + +// GetMessage 查看列表 - 提示消息 +func (p AddressDefValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + "Id.required": "Id不能为空", + } +} + +// AddressStatusValidator 查看列表 +type AddressStatusValidator struct { + Id int64 `validate:"required"` + Status int32 `validate:"required,oneof=1 2"` +} + +// GetMessage 查看列表 - 提示消息 +func (p AddressStatusValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + "Id.required": "Id不能为空", + "Status.required": "状态不能为空", + "Status.oneof": "状态不对", + } +} + +type AddressEditValidator struct { + Id int64 + District string `validate:"required"` + Address string `validate:"required"` + Name string `validate:"required"` + Mobile string `validate:"required"` + DistrictIds string `validate:"required"` + Type int32 `validate:"required,oneof=1 2 3"` //类型 1门店 , 2销售,3为用户 + Default bool +} + +// GetMessage 查看列表 - 提示消息 +func (p AddressEditValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + "District.required": "区域不能为空", + "Address.required": "地址不能为空", + "Name.required": "姓名不能为空", + "Mobile.required": "手机不能为空", + "DistrictIds.required": "区域ID不能为空", + "Type.required": "类型不能为空", + "Type.oneof": "类型不对", + } +} + +type AdminAddressItemsValidator struct { + Page int32 + Size int32 + DistrictId int64 + Mobile string + StoreId int64 + SaleId int64 + Time []string +} + +// GetMessage 查看列表 - 提示消息 +func (p AdminAddressItemsValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{} +} diff --git a/services/order/validator/cart.go b/services/order/validator/cart.go new file mode 100644 index 0000000..2bac657 --- /dev/null +++ b/services/order/validator/cart.go @@ -0,0 +1,13 @@ +package validator + +import "lone-services/pkg/validate" + +// CartEditValidator 查看列表 +type CartEditValidator struct { + Info string +} + +// GetMessage 查看列表 - 提示消息 +func (p CartEditValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{} +} diff --git a/services/order/validator/order.go b/services/order/validator/order.go new file mode 100644 index 0000000..1ddb16e --- /dev/null +++ b/services/order/validator/order.go @@ -0,0 +1,70 @@ +package validator + +import "lone-services/pkg/validate" + +type AdminOrderAuditingItemsValidator struct { + Page int32 + Size int32 +} + +// GetMessage 查看列表 - 提示消息 +func (p AdminOrderAuditingItemsValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{} +} + +type AdminOrderAuditingValidator struct { + Id int64 `validate:"required"` + Status int32 `validate:"required,oneof=1 2"` + Reason string `validate:"required_if=Status 2"` +} + +// GetMessage 修改状态 - 提示消息 +func (p AdminOrderAuditingValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + "Id.required": "ID不能为空", + "Status.required": "状态不能为空", + "Status.oneof": "状态传值不对", + "Reason.required_if": "理由不能为空", + } +} + +type AdminOrderCreateValidator struct { + AddressId int64 `validate:"required"` + Info string `validate:"required"` + Note string +} + +// GetMessage 修改状态 - 提示消息 +func (p AdminOrderCreateValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + "AddressId.required": "地址ID不能为空", + "Info.required": "内容不能为空", + } +} + +type OrderCreateValidator struct { + AddressId int64 `validate:"required"` + Note string +} + +func (p OrderCreateValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + "AddressId.required": "地址ID不能为空", + } +} + +type OrderItemsValidator struct { + Page int32 + Size int32 + ProductId int64 + OrderSn string + Mobile string + StoreId int64 + SaleId int64 + Time []string + Status int32 +} + +func (p OrderItemsValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{} +}