Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0ddc2f17b9 | |||
| 91359f61ac | |||
| e1829b90bf | |||
| 6980b31da7 | |||
| 4960021748 | |||
| 960dca6a50 | |||
| 518d45d296 | |||
| 09fe61defd | |||
| 7d2303e5e6 | |||
| 38f5d74f4a | |||
| c10586ad10 | |||
| 8b7ccb212c | |||
| f5c4977851 | |||
| e051046f77 |
@@ -251,7 +251,7 @@ func GetInstanceAddr(ctx context.Context, name string) (addr string, err error)
|
|||||||
err = errors.New("获取服务监听器失败")
|
err = errors.New("获取服务监听器失败")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer watch.Close()
|
||||||
service, err := watch.Proceed()
|
service, err := watch.Proceed()
|
||||||
if err != nil || service == nil {
|
if err != nil || service == nil {
|
||||||
err = errors.New("获取服务实例失败")
|
err = errors.New("获取服务实例失败")
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.com/red-future/common/beans"
|
"gitea.com/red-future/common/beans"
|
||||||
@@ -27,9 +28,30 @@ import (
|
|||||||
// ==================== 缓存管理器(单例) ====================
|
// ==================== 缓存管理器(单例) ====================
|
||||||
|
|
||||||
var (
|
var (
|
||||||
localCache *gcache.Cache
|
localCache *gcache.Cache
|
||||||
|
snowflakeNode *snowflake.Node
|
||||||
|
snowflakeOnce sync.Once
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
ctx := context.Background()
|
||||||
|
snowflakeOnce.Do(func() {
|
||||||
|
nodeId := genv.Get("APP_NODE", 1).Int64()
|
||||||
|
// 安全范围 0~1023
|
||||||
|
if nodeId < 0 || nodeId > 1023 {
|
||||||
|
nodeId = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
node, err := snowflake.NewNode(nodeId)
|
||||||
|
if err != nil {
|
||||||
|
g.Log().Errorf(ctx, "snowflake init failed: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
snowflakeNode = node
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// getLocalCache 获取本地缓存实例
|
// getLocalCache 获取本地缓存实例
|
||||||
func getLocalCache() *gcache.Cache {
|
func getLocalCache() *gcache.Cache {
|
||||||
if localCache == nil {
|
if localCache == nil {
|
||||||
@@ -165,31 +187,30 @@ func insertHook(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeId := genv.Get("APP_NODE", "").Int64()
|
if g.IsEmpty(snowflakeNode) {
|
||||||
if g.IsEmpty(nodeId) {
|
return nil, fmt.Errorf("snowflakeNode is nil")
|
||||||
nodeId = 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
node, err := snowflake.NewNode(nodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for i := range in.Data {
|
for i := range in.Data {
|
||||||
if _, ok := in.Data[i]["id"]; ok {
|
if _, ok := in.Data[i]["id"]; ok {
|
||||||
in.Data[i]["id"] = node.Generate().Int64()
|
in.Data[i]["id"] = snowflakeNode.Generate().Int64()
|
||||||
}
|
}
|
||||||
if _, ok := in.Data[i]["tenant_id"]; ok {
|
if _, ok := in.Data[i]["tenant_id"]; ok {
|
||||||
if !g.IsEmpty(userInfo.TenantId) {
|
if g.IsEmpty(in.Data[i]["tenant_id"]) {
|
||||||
in.Data[i]["tenant_id"] = userInfo.TenantId
|
if !g.IsEmpty(userInfo.TenantId) {
|
||||||
} else {
|
in.Data[i]["tenant_id"] = userInfo.TenantId
|
||||||
return nil, fmt.Errorf("tenantId cannot be empty")
|
} else {
|
||||||
|
return nil, fmt.Errorf("tenantId cannot be empty")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if _, ok := in.Data[i]["creator"]; ok {
|
if _, ok := in.Data[i]["creator"]; ok {
|
||||||
if !g.IsEmpty(userInfo.UserName) {
|
if g.IsEmpty(in.Data[i]["creator"]) {
|
||||||
in.Data[i]["creator"] = userInfo.UserName
|
if !g.IsEmpty(userInfo.UserName) {
|
||||||
} else {
|
in.Data[i]["creator"] = userInfo.UserName
|
||||||
return nil, fmt.Errorf("user info cannot be empty")
|
} else {
|
||||||
|
return nil, fmt.Errorf("user info cannot be empty")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if _, ok := in.Data[i]["updater"]; ok {
|
if _, ok := in.Data[i]["updater"]; ok {
|
||||||
|
|||||||
12
go.mod
12
go.mod
@@ -9,14 +9,10 @@ require (
|
|||||||
github.com/gogf/gf/contrib/registry/consul/v2 v2.9.5
|
github.com/gogf/gf/contrib/registry/consul/v2 v2.9.5
|
||||||
github.com/gogf/gf/contrib/trace/otlphttp/v2 v2.9.5
|
github.com/gogf/gf/contrib/trace/otlphttp/v2 v2.9.5
|
||||||
github.com/gogf/gf/v2 v2.9.5
|
github.com/gogf/gf/v2 v2.9.5
|
||||||
github.com/google/uuid v1.6.0
|
|
||||||
github.com/hashicorp/consul/api v1.26.1
|
github.com/hashicorp/consul/api v1.26.1
|
||||||
github.com/meilisearch/meilisearch-go v0.36.1
|
github.com/meilisearch/meilisearch-go v0.36.1
|
||||||
github.com/minio/minio-go/v7 v7.0.97
|
|
||||||
github.com/nats-io/nats.go v1.48.0
|
|
||||||
github.com/olivere/elastic/v7 v7.0.32
|
github.com/olivere/elastic/v7 v7.0.32
|
||||||
github.com/r3labs/diff/v2 v2.15.1
|
github.com/r3labs/diff/v2 v2.15.1
|
||||||
github.com/rabbitmq/amqp091-go v1.10.0
|
|
||||||
github.com/rpcxio/rpcx-consul v0.1.1
|
github.com/rpcxio/rpcx-consul v0.1.1
|
||||||
github.com/smallnest/rpcx v1.9.1
|
github.com/smallnest/rpcx v1.9.1
|
||||||
github.com/tiger1103/gfast-token v1.0.10
|
github.com/tiger1103/gfast-token v1.0.10
|
||||||
@@ -55,7 +51,6 @@ require (
|
|||||||
github.com/fatih/color v1.18.0 // indirect
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
|
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
|
||||||
github.com/go-ini/ini v1.67.0 // indirect
|
|
||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-ole/go-ole v1.2.4 // indirect
|
github.com/go-ole/go-ole v1.2.4 // indirect
|
||||||
@@ -75,6 +70,7 @@ require (
|
|||||||
github.com/google/flatbuffers v1.12.1 // indirect
|
github.com/google/flatbuffers v1.12.1 // indirect
|
||||||
github.com/google/gnostic-models v0.7.0 // indirect
|
github.com/google/gnostic-models v0.7.0 // indirect
|
||||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
|
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
|
||||||
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
|
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
|
||||||
github.com/grandcat/zeroconf v1.0.0 // indirect
|
github.com/grandcat/zeroconf v1.0.0 // indirect
|
||||||
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
|
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
|
||||||
@@ -94,7 +90,6 @@ require (
|
|||||||
github.com/kavu/go_reuseport v1.5.0 // indirect
|
github.com/kavu/go_reuseport v1.5.0 // indirect
|
||||||
github.com/klauspost/compress v1.18.0 // indirect
|
github.com/klauspost/compress v1.18.0 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.11 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.11 // indirect
|
||||||
github.com/klauspost/crc32 v1.3.0 // indirect
|
|
||||||
github.com/klauspost/reedsolomon v1.12.4 // indirect
|
github.com/klauspost/reedsolomon v1.12.4 // indirect
|
||||||
github.com/libp2p/go-sockaddr v0.2.0 // indirect
|
github.com/libp2p/go-sockaddr v0.2.0 // indirect
|
||||||
github.com/magiconair/properties v1.8.10 // indirect
|
github.com/magiconair/properties v1.8.10 // indirect
|
||||||
@@ -103,15 +98,11 @@ require (
|
|||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||||
github.com/miekg/dns v1.1.63 // indirect
|
github.com/miekg/dns v1.1.63 // indirect
|
||||||
github.com/minio/crc64nvme v1.1.0 // indirect
|
|
||||||
github.com/minio/md5-simd v1.1.2 // indirect
|
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
|
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/nats-io/nkeys v0.4.11 // indirect
|
|
||||||
github.com/nats-io/nuid v1.0.1 // indirect
|
|
||||||
github.com/olekukonko/errors v1.1.0 // indirect
|
github.com/olekukonko/errors v1.1.0 // indirect
|
||||||
github.com/olekukonko/ll v0.0.9 // indirect
|
github.com/olekukonko/ll v0.0.9 // indirect
|
||||||
github.com/olekukonko/tablewriter v1.1.0 // indirect
|
github.com/olekukonko/tablewriter v1.1.0 // indirect
|
||||||
@@ -128,7 +119,6 @@ require (
|
|||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/rpcxio/libkv v0.5.1 // indirect
|
github.com/rpcxio/libkv v0.5.1 // indirect
|
||||||
github.com/rs/cors v1.11.1 // indirect
|
github.com/rs/cors v1.11.1 // indirect
|
||||||
github.com/rs/xid v1.6.0 // indirect
|
|
||||||
github.com/rubyist/circuitbreaker v2.2.1+incompatible // indirect
|
github.com/rubyist/circuitbreaker v2.2.1+incompatible // indirect
|
||||||
github.com/shirou/gopsutil/v3 v3.21.6 // indirect
|
github.com/shirou/gopsutil/v3 v3.21.6 // indirect
|
||||||
github.com/smallnest/quick v0.2.0 // indirect
|
github.com/smallnest/quick v0.2.0 // indirect
|
||||||
|
|||||||
20
go.sum
20
go.sum
@@ -140,8 +140,6 @@ github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01
|
|||||||
github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc=
|
github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc=
|
||||||
github.com/go-ego/gse v1.0.2 h1:+27lYFPhQEhA9igtdOsJPRKYL/k3TwYsxBF5jr6KFv4=
|
github.com/go-ego/gse v1.0.2 h1:+27lYFPhQEhA9igtdOsJPRKYL/k3TwYsxBF5jr6KFv4=
|
||||||
github.com/go-ego/gse v1.0.2/go.mod h1:Fy35G+q7VV7Et1zIKO8o/sW1kkugV3znXap/lF/11zc=
|
github.com/go-ego/gse v1.0.2/go.mod h1:Fy35G+q7VV7Et1zIKO8o/sW1kkugV3znXap/lF/11zc=
|
||||||
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
|
|
||||||
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
|
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
|
||||||
@@ -353,11 +351,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
|
|||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
|
||||||
github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU=
|
github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||||
github.com/klauspost/crc32 v1.3.0 h1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM=
|
|
||||||
github.com/klauspost/crc32 v1.3.0/go.mod h1:D7kQaZhnkX/Y0tstFGf8VUzv2UofNGqCjnC3zdHB0Hw=
|
|
||||||
github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA=
|
github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA=
|
||||||
github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU=
|
github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
@@ -415,12 +410,6 @@ github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7
|
|||||||
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
|
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
|
||||||
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||||
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
||||||
github.com/minio/crc64nvme v1.1.0 h1:e/tAguZ+4cw32D+IO/8GSf5UVr9y+3eJcxZI2WOO/7Q=
|
|
||||||
github.com/minio/crc64nvme v1.1.0/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
|
|
||||||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
|
||||||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
|
||||||
github.com/minio/minio-go/v7 v7.0.97 h1:lqhREPyfgHTB/ciX8k2r8k0D93WaFqxbJX36UZq5occ=
|
|
||||||
github.com/minio/minio-go/v7 v7.0.97/go.mod h1:re5VXuo0pwEtoNLsNuSr0RrLfT/MBtohwdaSmPPSRSk=
|
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
|
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
@@ -450,13 +439,8 @@ github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5Vgl
|
|||||||
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
|
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
|
||||||
github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
|
github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
|
||||||
github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
|
github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
|
||||||
github.com/nats-io/nats.go v1.48.0 h1:pSFyXApG+yWU/TgbKCjmm5K4wrHu86231/w84qRVR+U=
|
|
||||||
github.com/nats-io/nats.go v1.48.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g=
|
|
||||||
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||||
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||||
github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0=
|
|
||||||
github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE=
|
|
||||||
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
|
|
||||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||||
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
|
||||||
@@ -550,8 +534,6 @@ github.com/quic-go/quic-go v0.49.0 h1:w5iJHXwHxs1QxyBv1EHKuC50GX5to8mJAxvtnttJp9
|
|||||||
github.com/quic-go/quic-go v0.49.0/go.mod h1:s2wDnmCdooUQBmQfpUSTCYBl1/D4FcqbULMMkASvR6s=
|
github.com/quic-go/quic-go v0.49.0/go.mod h1:s2wDnmCdooUQBmQfpUSTCYBl1/D4FcqbULMMkASvR6s=
|
||||||
github.com/r3labs/diff/v2 v2.15.1 h1:EOrVqPUzi+njlumoqJwiS/TgGgmZo83619FNDB9xQUg=
|
github.com/r3labs/diff/v2 v2.15.1 h1:EOrVqPUzi+njlumoqJwiS/TgGgmZo83619FNDB9xQUg=
|
||||||
github.com/r3labs/diff/v2 v2.15.1/go.mod h1:I8noH9Fc2fjSaMxqF3G2lhDdC0b+JXCfyx85tWFM9kc=
|
github.com/r3labs/diff/v2 v2.15.1/go.mod h1:I8noH9Fc2fjSaMxqF3G2lhDdC0b+JXCfyx85tWFM9kc=
|
||||||
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
|
|
||||||
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
|
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
|
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
|
||||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
@@ -570,8 +552,6 @@ github.com/rpcxio/rpcx-consul v0.1.1 h1:z/IHpIytgChEuHndWlpo4BY0V0mVBSg/XsKsc54f
|
|||||||
github.com/rpcxio/rpcx-consul v0.1.1/go.mod h1:N4SjBS0M9HpVdq3CIIXm/MwWv6euXQ39ybhfH2iTh1c=
|
github.com/rpcxio/rpcx-consul v0.1.1/go.mod h1:N4SjBS0M9HpVdq3CIIXm/MwWv6euXQ39ybhfH2iTh1c=
|
||||||
github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
|
github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
|
||||||
github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
|
github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
|
||||||
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
|
|
||||||
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
|
|
||||||
github.com/rubyist/circuitbreaker v2.2.1+incompatible h1:KUKd/pV8Geg77+8LNDwdow6rVCAYOp8+kHUyFvL6Mhk=
|
github.com/rubyist/circuitbreaker v2.2.1+incompatible h1:KUKd/pV8Geg77+8LNDwdow6rVCAYOp8+kHUyFvL6Mhk=
|
||||||
github.com/rubyist/circuitbreaker v2.2.1+incompatible/go.mod h1:Ycs3JgJADPuzJDwffe12k6BZT8hxVi6lFK+gWYJLN4A=
|
github.com/rubyist/circuitbreaker v2.2.1+incompatible/go.mod h1:Ycs3JgJADPuzJDwffe12k6BZT8hxVi6lFK+gWYJLN4A=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ func UserLimiter(r *ghttp.Request) {
|
|||||||
var userName string
|
var userName string
|
||||||
user, err := utils.GetUserInfo(r.GetCtx())
|
user, err := utils.GetUserInfo(r.GetCtx())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Response.WriteStatusExit(429, err.Error())
|
r.Response.WriteStatusExit(401, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
userName = gconv.String(user.UserName)
|
userName = gconv.String(user.UserName)
|
||||||
|
|||||||
119
utils/gse.go
119
utils/gse.go
@@ -42,78 +42,77 @@ type gseTool struct {
|
|||||||
func newGseTool() (tool *gseTool, err error) {
|
func newGseTool() (tool *gseTool, err error) {
|
||||||
// 1. 初始化分词器
|
// 1. 初始化分词器
|
||||||
var seg gse.Segmenter
|
var seg gse.Segmenter
|
||||||
|
// 内置词典(无外部文件)
|
||||||
|
err = seg.LoadDictEmbed()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 内置停用词(v1.0.2 标准)
|
||||||
|
err = seg.LoadStopEmbed()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 获取GSE数据文件路径
|
// 2. 初始化 TF-IDF 提取器
|
||||||
gseDataPath := os.Getenv("GSE_DATA_PATH")
|
tfidf := &extracker.TagExtracter{}
|
||||||
|
tfidf.WithGse(seg)
|
||||||
|
|
||||||
if gseDataPath != "" {
|
// 尝试从默认路径加载 IDF 字典
|
||||||
// 使用外部数据文件
|
idfPath := getIdfDictPath()
|
||||||
dictPath := filepath.Join(gseDataPath, "dict", "zh")
|
if idfPath != "" {
|
||||||
idfPath := filepath.Join(gseDataPath, "dict", "zh", "idf.txt")
|
// 如果找到自定义路径,使用 LoadDict 方法加载
|
||||||
stopPath := filepath.Join(gseDataPath, "dict", "zh", "stop.txt")
|
err = tfidf.LoadDict(idfPath)
|
||||||
|
|
||||||
// 加载词典
|
|
||||||
err = seg.LoadDict(filepath.Join(dictPath, "dict.txt"))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
glog.Warningf(context.Background(), "加载自定义 IDF 字典失败 [%s]: %v,将使用默认字典", idfPath, err)
|
||||||
}
|
// 回退到默认加载方式
|
||||||
|
err = tfidf.LoadIdf()
|
||||||
// 加载停用词
|
} else {
|
||||||
err = seg.LoadStop(stopPath)
|
glog.Infof(context.Background(), "成功加载自定义 IDF 字典: %s", idfPath)
|
||||||
if err != nil {
|
|
||||||
glog.Warning(context.Background(), "加载停用词失败,继续:", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 初始化 TF-IDF 提取器
|
|
||||||
tfidf := &extracker.TagExtracter{}
|
|
||||||
tfidf.WithGse(seg)
|
|
||||||
err = tfidf.LoadIdf(idfPath)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 初始化 TextRank 提取器
|
|
||||||
tr := &extracker.TextRanker{}
|
|
||||||
tr.WithGse(seg)
|
|
||||||
|
|
||||||
tool = &gseTool{
|
|
||||||
seg: seg,
|
|
||||||
tfidf: tfidf,
|
|
||||||
tr: tr,
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 使用内置embed数据
|
// 使用默认的 IDF 字典
|
||||||
err = seg.LoadDictEmbed()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// 内置停用词(v1.0.2 标准)
|
|
||||||
err = seg.LoadStopEmbed()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 初始化 TF-IDF 提取器
|
|
||||||
tfidf := &extracker.TagExtracter{}
|
|
||||||
tfidf.WithGse(seg)
|
|
||||||
err = tfidf.LoadIdf()
|
err = tfidf.LoadIdf()
|
||||||
if err != nil {
|
}
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 初始化 TextRank 提取器
|
if err != nil {
|
||||||
tr := &extracker.TextRanker{}
|
return
|
||||||
tr.WithGse(seg)
|
}
|
||||||
|
|
||||||
tool = &gseTool{
|
// 3. 初始化 TextRank 提取器
|
||||||
seg: seg,
|
tr := &extracker.TextRanker{}
|
||||||
tfidf: tfidf,
|
tr.WithGse(seg)
|
||||||
tr: tr,
|
|
||||||
}
|
tool = &gseTool{
|
||||||
|
seg: seg,
|
||||||
|
tfidf: tfidf,
|
||||||
|
tr: tr,
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getIdfDictPath 获取 IDF 字典文件路径
|
||||||
|
func getIdfDictPath() string {
|
||||||
|
// 1. 尝试从容器内的默认挂载路径加载(Docker 卷映射)
|
||||||
|
containerPath := "/app/dict/zh/idf.txt"
|
||||||
|
if _, err := os.Stat(containerPath); err == nil {
|
||||||
|
return containerPath
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 尝试从当前工作目录的 dict/zh/idf.txt 加载
|
||||||
|
workDir, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
localPath := filepath.Join(workDir, "dict", "zh", "idf.txt")
|
||||||
|
if _, err := os.Stat(localPath); err == nil {
|
||||||
|
return localPath
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 如果没有找到自定义路径,返回空字符串,使用默认字典
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
// Cut 分词(关键词提取唯一正确模式:精确模式 + HMM)
|
// Cut 分词(关键词提取唯一正确模式:精确模式 + HMM)
|
||||||
func (k *gseTool) Cut(text string) []string {
|
func (k *gseTool) Cut(text string) []string {
|
||||||
return k.seg.Cut(text, true)
|
return k.seg.Cut(text, true)
|
||||||
|
|||||||
130
utils/utils.go
130
utils/utils.go
@@ -460,3 +460,133 @@ func IsLocalIP(ip string) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLocalIP 获取本机有效的局域网 IPv4 地址
|
||||||
|
func GetLocalIP() string {
|
||||||
|
addrs, err := net.InterfaceAddrs()
|
||||||
|
if err != nil {
|
||||||
|
return "127.0.0.1"
|
||||||
|
}
|
||||||
|
|
||||||
|
var validIPs []string
|
||||||
|
|
||||||
|
for _, addr := range addrs {
|
||||||
|
ipnet, ok := addr.(*net.IPNet)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ip := ipnet.IP
|
||||||
|
|
||||||
|
if isIPValid(ip) {
|
||||||
|
validIPs = append(validIPs, ip.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 优先返回非 169.254.x.x 的 IP
|
||||||
|
for _, ip := range validIPs {
|
||||||
|
if !strings.HasPrefix(ip, "169.254.") {
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 其次返回 169.254.x.x(最后的选择)
|
||||||
|
if len(validIPs) > 0 {
|
||||||
|
return validIPs[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
return "127.0.0.1"
|
||||||
|
}
|
||||||
|
|
||||||
|
// isIPValid 判断 IP 是否有效
|
||||||
|
func isIPValid(ip net.IP) bool {
|
||||||
|
// 不是 loopback (127.0.0.1)
|
||||||
|
if ip.IsLoopback() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 是 IPv4
|
||||||
|
if ip.To4() == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不是链路本地地址 (169.254.0.0/16)
|
||||||
|
if ip[0] == 169 && ip[1] == 254 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不是组播地址
|
||||||
|
if ip.IsMulticast() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不是未指定地址 (0.0.0.0)
|
||||||
|
if ip.IsUnspecified() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetServerPort(ctx context.Context) string {
|
||||||
|
address := g.Cfg().MustGet(ctx, "server.address", ":8080").String()
|
||||||
|
// address 格式如 ":3009",去掉冒号
|
||||||
|
if strings.HasPrefix(address, ":") {
|
||||||
|
return address[1:]
|
||||||
|
}
|
||||||
|
return "8080"
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLocalAddress 获取局域网地址(IP:端口)
|
||||||
|
func GetLocalAddress(ctx context.Context) string {
|
||||||
|
ip := GetLocalIP()
|
||||||
|
port := GetServerPort(ctx)
|
||||||
|
|
||||||
|
if port == "80" || port == "443" {
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
return ip + ":" + port
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSchemaFromRequest 从当前请求中获取协议(http/https)
|
||||||
|
func GetSchemaFromRequest(ctx context.Context) string {
|
||||||
|
r := g.RequestFromCtx(ctx)
|
||||||
|
if r == nil {
|
||||||
|
return "http"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. 代理场景:X-Forwarded-Proto
|
||||||
|
if proto := r.Header.Get("X-Forwarded-Proto"); proto != "" {
|
||||||
|
return proto
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 代理场景:X-Forwarded-Scheme
|
||||||
|
if proto := r.Header.Get("X-Forwarded-Scheme"); proto != "" {
|
||||||
|
return proto
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. TLS 连接(直接 HTTPS)
|
||||||
|
if r.TLS != nil {
|
||||||
|
return "https"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 默认 HTTP(这行很重要!)
|
||||||
|
return "http" // ← 确保有这行
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLocalBaseURL 获取局域网基础 URL(动态协议 + IP + 端口)
|
||||||
|
func GetLocalBaseURL(ctx context.Context) string {
|
||||||
|
schema := GetSchemaFromRequest(ctx)
|
||||||
|
addr := GetLocalAddress(ctx)
|
||||||
|
return schema + "://" + addr
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCallbackURL 获取回调地址(完整 URL)
|
||||||
|
func GetCallbackURL(ctx context.Context, path string) string {
|
||||||
|
baseURL := GetLocalBaseURL(ctx)
|
||||||
|
// 确保 path 以 / 开头
|
||||||
|
if !strings.HasPrefix(path, "/") {
|
||||||
|
path = "/" + path
|
||||||
|
}
|
||||||
|
return baseURL + path
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user