初始化版本

This commit is contained in:
蒋海成 2025-02-20 20:40:39 +08:00
parent 0e8a31c511
commit 1bedc6546b
46 changed files with 5889 additions and 0 deletions

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

9
.idea/mircro-bundle.iml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/mircro-bundle.iml" filepath="$PROJECT_DIR$/.idea/mircro-bundle.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,7 @@
### protot文件编译指令
```shell
protoc --proto_path=. --proto_path=D:/go_workspace/src --go_out=./pb --govalidators_out=./pb --go-triple_out=./pb ./pb/bundle.proto
protoc --proto_path=. --go-grpc_out=./pb --proto_path=D:/go_workspace/src --go_out=./pb --govalidators_out=./pb --go-triple_out=./pb ./pb/bundle.proto
```

3
build/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*
!.gitignore
!.gitkeep

0
build/.gitkeep Normal file
View File

50
cmd/app.go Normal file
View File

@ -0,0 +1,50 @@
package main
import (
"dubbo.apache.org/dubbo-go/v3/config"
_ "dubbo.apache.org/dubbo-go/v3/filter/tps/strategy"
_ "dubbo.apache.org/dubbo-go/v3/imports"
"github.com/bwmarrin/snowflake"
"go.uber.org/zap"
"gorm.io/gorm"
bundleConfig "micro-bundle/config"
"micro-bundle/internal/controller"
_ "micro-bundle/internal/handler"
"micro-bundle/pkg/app"
"micro-bundle/pkg/tracing"
)
func NewApp(Lg *zap.Logger, JaegerTracer *tracing.JaegerProvider, SfNode *snowflake.Node, BundleDB *gorm.DB) *app.App {
return &app.App{
Lg: Lg,
JaegerTracer: JaegerTracer,
SfNode: SfNode,
BundleDB: BundleDB,
}
}
func main() {
var err error
bundleConfig.GetOptions()
app.ModuleClients, err = InitApp()
if err != nil {
panic(err)
}
//l, err := net.Listen("tcp", ":8883")
//if err != nil {
// fmt.Printf("failed to listen: %v", err)
// return
//}
//s := grpc.NewServer() // 创建gRPC服务器
//dci.RegisterDciServer(s, &controller.DciProvider{}) // 在gRPC服务端注册服务
// 启动服务
//err = s.Serve(l)
//注册服务
config.SetProviderService(&controller.BundleProvider{})
if err = config.Load(); err != nil {
panic(err)
}
select {}
}

19
cmd/wire.go Normal file
View File

@ -0,0 +1,19 @@
// go:build wireinject
//go:build wireinject
// +build wireinject
package main
import (
"github.com/google/wire"
"micro-bundle/pkg/app"
"micro-bundle/pkg/db"
"micro-bundle/pkg/logger"
"micro-bundle/pkg/snowf"
"micro-bundle/pkg/tracing"
)
func InitApp() (*app.App, error) {
wire.Build(logger.Provider, tracing.Provider, snowf.Provider, db.Provider, NewApp)
return &app.App{}, nil
}

26
cmd/wire_gen.go Normal file
View File

@ -0,0 +1,26 @@
// Code generated by Wire. DO NOT EDIT.
//go:generate go run github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
import (
"micro-bundle/pkg/app"
"micro-bundle/pkg/db"
"micro-bundle/pkg/logger"
"micro-bundle/pkg/snowf"
"micro-bundle/pkg/tracing"
)
// Injectors from wire.go:
func InitApp() (*app.App, error) {
zapLogger := logger.ZapInit()
jaegerProvider := tracing.NewTracing()
node := snowf.NewSf()
gormDB := db.NewBundleDB()
appApp := NewApp(zapLogger, jaegerProvider, node, gormDB)
return appApp, nil
}

34
conf/dev/config.yaml Normal file
View File

@ -0,0 +1,34 @@
system:
mode: dev #正式 prod #测试 test #开发 dev
config_source: config
bundleDB:
host: 172.16.100.99
port: 9007
user: artuser
password: C250PflXIWv2SQm8
db_name: "fiee_bundle"
#aliYunRtc:
# appid: "aeztom27"
# app_key: "76c62466cbd77d7a3606660a15861d1e"
#redis:
# db: 1
# addr: 127.0.0.1:6379
# password: "7532T6R"
zapLog:
level: "info"
filename: "logs/bundle.log"
max_size: 5
max_age: 30
max_backups: 30
snowflake:
node_num: 4
start_time: "2023-11-27"
jaeger:
addr: "127.0.0.1:6831"
open: false
#rabbitmq:
# user: "myuser"
# password: "mypass"
# host: "localhost"
# port: 5672
# vhost: "oa"

68
conf/dev/dubbogo.yaml Normal file
View File

@ -0,0 +1,68 @@
dubbo:
metrics:
enable: true # default is true
path: /metrics # default is /metrics
port: 9092 # default is 9090
namespace: dubboFiee # default is dubbo 作为数据上报 metrics 的前缀
registries:
demoZK:
protocol: zookeeper
timeout: 10s
address: 172.16.100.93:2181
protocols:
triple: #triple
name: tri
port: 20201
provider:
filter: tracing
services:
BundleProvider:
interface: com.fontree.microservices.fiee.bundle
retries: 0
filter: tps,tracing
tps.limiter: method-service
tps.limit.strategy: fixedWindow
tps.limit.rejected.handler: DefaultValueHandler
tps.limit.interval: 1000 # 间隔时间
tps.limit.rate: 30 # 间隔时间内次数
warmup: 100 #预热时间
logger:
zap-config:
level: info # 日志级别
development: false
disableCaller: false
disableStacktrace: false
encoding: "json"
# zap encoder 配置
encoderConfig:
messageKey: "message"
levelKey: "level"
timeKey: "time"
nameKey: "logger"
callerKey: "caller"
stacktraceKey: "stacktrace"
lineEnding: ""
levelEncoder: "capitalColor"
timeEncoder: "iso8601"
durationEncoder: "seconds"
callerEncoder: "short"
nameEncoder: ""
EncodeTime: zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05.000"),
EncodeDuration: zapcore.SecondsDurationEncoder,
outputPaths:
- "stderr"
errorOutputPaths:
- "stderr"
lumberjack-config:
# 写日志的文件名称
filename: "runtime/logs/bundle.log"
# 每个日志文件长度的最大大小,单位是 MiB。默认 100MiB
maxSize: 5
# 日志保留的最大天数(只保留最近多少天的日志)
maxAge: 30
# 只保留最近多少个日志文件,用于控制程序总日志的大小
maxBackups: 30
# 是否使用本地时间,默认使用 UTC 时间
localTime: true
# 是否压缩日志文件,压缩方法 gzip
compress: false

31
conf/prod/config.yaml Normal file
View File

@ -0,0 +1,31 @@
system:
mode: prod #正式 prod #测试 test #开发 dev
# config_source: configmap
bundleDB:
host: 172.16.100.99
port: 9007
user: artuser
password: C250PflXIWv2SQm8
db_name: "fontree_bundle"
#redis:
# db: ${oa-meeting.redis.db}
# addr: ${redis.addr}
# password: ${redis.password}
zapLog:
level: "info"
filename: "logs/bundle.log"
max_size: 5
max_age: 30
max_backups: 30
snowflake:
node_num: 4
start_time: "2023-11-27"
jaeger:
addr: "127.0.0.1:6831"
open: false
#rabbitmq:
# user: ${rabbitmq.user}
# password: ${rabbitmq.password}
# host: ${rabbitmq.host}
# port: ${rabbitmq.port}
# vhost: ${oa-meeting.rabbitmq.vhost}

68
conf/prod/dubbogo.yaml Normal file
View File

@ -0,0 +1,68 @@
dubbo:
metrics:
enable: true # default is true
path: /metrics # default is /metrics
port: 9092 # default is 9090
namespace: dubboFiee # default is dubbo 作为数据上报 metrics 的前缀
registries:
demoZK:
protocol: zookeeper
timeout: 10s
address: zookeeper:2181
protocols:
triple: #triple
name: tri
port: 20201
provider:
filter: tracing
services:
BundleProvider:
interface: com.fontree.microservices.fiee.bundle
retries: 0
filter: tps,tracing
tps.limiter: method-service
tps.limit.strategy: fixedWindow
tps.limit.rejected.handler: DefaultValueHandler
tps.limit.interval: 1000 # 间隔时间
tps.limit.rate: 300 # 间隔时间内次数
warmup: 100 #预热时间
logger:
zap-config:
level: info # 日志级别
development: false
disableCaller: false
disableStacktrace: false
encoding: "json"
# zap encoder 配置
encoderConfig:
messageKey: "message"
levelKey: "level"
timeKey: "time"
nameKey: "logger"
callerKey: "caller"
stacktraceKey: "stacktrace"
lineEnding: ""
levelEncoder: "capitalColor"
timeEncoder: "iso8601"
durationEncoder: "seconds"
callerEncoder: "short"
nameEncoder: ""
EncodeTime: zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05.000"),
EncodeDuration: zapcore.SecondsDurationEncoder,
outputPaths:
- "stderr"
errorOutputPaths:
- "stderr"
lumberjack-config:
# 写日志的文件名称
filename: "runtime/logs/bundle.log"
# 每个日志文件长度的最大大小,单位是 MiB。默认 100MiB
maxSize: 5
# 日志保留的最大天数(只保留最近多少天的日志)
maxAge: 30
# 只保留最近多少个日志文件,用于控制程序总日志的大小
maxBackups: 30
# 是否使用本地时间,默认使用 UTC 时间
localTime: true
# 是否压缩日志文件,压缩方法 gzip
compress: false

154
config/config.go Normal file
View File

@ -0,0 +1,154 @@
package config
import (
"fmt"
"os"
"reflect"
"strings"
"dubbo.apache.org/dubbo-go/v3/common/constant"
"github.com/spf13/viper"
"micro-bundle/pkg/msg"
)
var Data = new(AppConfig)
type AppConfig struct {
System struct {
Mode string
ConfigSource string `mapstructure:"config_source"`
}
BundleDB struct {
Host string
Port string
User string
Password string
DbName string `mapstructure:"db_name"`
}
Redis struct {
DB string
Addr string
Password string
}
ZapLog struct {
Level string `mapstructure:"level"`
Filename string `mapstructure:"filename"`
MaxSize string `mapstructure:"max_size"`
MaxAge string `mapstructure:"max_age"`
MaxBackups string `mapstructure:"max_backups"`
}
SnowFlake struct {
NodeNum string `mapstructure:"node_num"`
StartTime string `mapstructure:"start_time"`
}
Jaeger struct {
Addr string `mapstructure:"host"`
Open string `mapstructure:"open"`
}
RabbitMq struct {
User string `mapstructure:"user"`
Password string `mapstructure:"password"`
Host string `mapstructure:"host"`
Port string `mapstructure:"port"`
Vhost string `mapstructure:"vhost"`
}
}
func GetConf() (iniConf string, err error) {
if os.Getenv(msg.MODE_ENV) != "" {
if err = os.Setenv(constant.ConfigFileEnvKey, fmt.Sprintf("./conf/%s/%s", os.Getenv(msg.MODE_ENV), msg.SERVER_DUBBOGO_CONFIG)); err != nil {
return
}
}
if os.Getenv(msg.MODE_ENV) == "" {
iniConf = fmt.Sprintf("../conf/%s", msg.SERVER_CONFIG)
} else {
iniConf = fmt.Sprintf("./conf/%s/%s", os.Getenv(msg.MODE_ENV), msg.SERVER_CONFIG)
}
return
}
func GetOptions() {
iniConf, err := GetConf()
if err != nil {
panic("GetOptions err" + err.Error())
}
if err = Viper(iniConf); err != nil {
return
}
}
func Viper(iniConf string) (err error) {
viper.SetConfigFile(iniConf)
err = viper.ReadInConfig()
if err != nil {
panic("viper.ReadInConfig failed" + err.Error())
return
}
if err = viper.Unmarshal(Data); err != nil {
panic("viper.Unmarshal failed" + err.Error())
return
}
// 如果是configmap模式再修改
fmt.Println(Data.System)
if Data.System.ConfigSource == "configmap" {
traverseFields(reflect.ValueOf(*Data), "", Data)
}
return
}
func traverseFields(value reflect.Value, prefix string, configPtr interface{}) {
valueType := value.Type()
prefixEnv := "${"
suffixEnv := "}"
// 遍历结构体的字段
for i := 0; i < valueType.NumField(); i++ {
field := valueType.Field(i)
fieldValue := value.Field(i)
// 拼接字段名(带有前缀)
fieldName := prefix + field.Name
// 判断字段的类型
if fieldValue.Kind() == reflect.Struct {
// 递归遍历嵌套结构体字段
traverseFields(fieldValue, fieldName+".", configPtr)
} else {
// 获取字段的值
fieldValueStr := fmt.Sprintf("%v", fieldValue.Interface())
// 判断是不是需要通过环境变量获取
if len(fieldValueStr) > 3 && strings.HasPrefix(fieldValueStr, prefixEnv) && strings.HasSuffix(fieldValueStr, suffixEnv) {
end := len(fieldValueStr) - len(suffixEnv)
var hasDefault bool
if strings.Index(fieldValueStr, "|") > 0 {
hasDefault = true
end = strings.Index(fieldValueStr, "|")
}
envStr := fieldValueStr[len(prefixEnv):end]
getValue := os.Getenv(envStr)
if getValue == "" && hasDefault {
getValue = fieldValueStr[end+1 : len(fieldValueStr)-len(suffixEnv)]
}
setSubFieldValue(configPtr, fieldName, getValue)
}
}
}
}
func setSubFieldValue(configPtr interface{}, fieldPath string, newValue interface{}) {
value := reflect.ValueOf(configPtr).Elem()
fields := strings.Split(fieldPath, ".")
for _, field := range fields {
value = value.FieldByName(field)
if !value.IsValid() {
return // 字段不存在,直接返回
}
if value.Kind() == reflect.Ptr {
value = value.Elem() // 解引用指针类型的字段
}
}
// 检查字段是否可设置
if value.CanSet() {
// 根据字段类型,将新值转换为对应类型并设置字段的值
newValue := reflect.ValueOf(newValue).Convert(value.Type())
value.Set(newValue)
}
}

View File

@ -0,0 +1,58 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: chain-dci-server
spec:
replicas: 1
selector:
matchLabels:
app: chain-dci-server
template:
metadata:
labels:
app: chain-dci-server
spec:
containers:
- name: chain-dci-server
image: testhub.szjixun.cn:9043/k8stest/chain-dci-server:latest
ports:
- containerPort: 20201
volumeMounts:
- name: logs
mountPath: /app/logs
- name: runtime
mountPath: /app/runtime
envFrom:
- configMapRef:
name: "erp-configmap"
- secretRef:
name: erp-secret
# nodeSelector:
# node: node1
imagePullSecrets:
- name: docker-login-secret
volumes:
- name: logs
nfs:
server: node0
path: /mnt/storage/erp/chain-dci-server/logs
- name: runtime
nfs:
server: node0
path: /mnt/storage/erp/chain-dci-server/runtime
---
apiVersion: v1
kind: Service
metadata:
name: chain-dci-server
spec:
type: NodePort
selector:
app: chain-dci-server
ports:
- name: http
protocol: TCP
nodePort: 20201
targetPort: 20201
port: 20201

164
go.mod Normal file
View File

@ -0,0 +1,164 @@
module micro-bundle
go 1.20
require (
dubbo.apache.org/dubbo-go/v3 v3.1.1
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704
github.com/bwmarrin/snowflake v0.3.0
github.com/dubbogo/grpc-go v1.42.10
github.com/dubbogo/triple v1.2.2-rc3
github.com/getsentry/sentry-go v0.31.1
github.com/gin-gonic/gin v1.10.0
github.com/go-redis/redis v6.15.9+incompatible
github.com/golang/protobuf v1.5.4
github.com/google/wire v0.6.0
github.com/mwitkow/go-proto-validators v0.3.2
github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/opentracing/opentracing-go v1.2.0
github.com/spf13/viper v1.19.0
github.com/streadway/amqp v1.1.0
github.com/uber/jaeger-client-go v2.30.0+incompatible
go.uber.org/zap v1.27.0
google.golang.org/protobuf v1.36.5
gorm.io/driver/mysql v1.5.7
gorm.io/gorm v1.25.12
)
require (
cloud.google.com/go/compute v1.24.0 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
github.com/RoaringBitmap/roaring v1.2.3 // indirect
github.com/Workiva/go-datastructures v1.0.52 // indirect
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 // indirect
github.com/alibaba/sentinel-golang v1.0.4 // indirect
github.com/apache/dubbo-getty v1.4.9 // indirect
github.com/apache/dubbo-go-hessian2 v1.12.2 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.2.0 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/bytedance/sonic v1.11.6 // indirect
github.com/bytedance/sonic/loader v0.1.1 // indirect
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect
github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa // indirect
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/creasty/defaults v1.5.2 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/dlclark/regexp2 v1.7.0 // indirect
github.com/dubbogo/go-zookeeper v1.0.4-0.20211212162352-f9d2183d89d5 // indirect
github.com/dubbogo/gost v1.14.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/emicklei/go-restful/v3 v3.10.1 // indirect
github.com/envoyproxy/go-control-plane v0.12.0 // indirect
github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-co-op/gocron v1.9.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.20.0 // indirect
github.com/go-resty/resty/v2 v2.7.0 // indirect
github.com/go-sql-driver/mysql v1.7.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/vault/sdk v0.7.0 // indirect
github.com/influxdata/tdigest v0.0.1 // indirect
github.com/jinzhu/copier v0.3.5 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/k0kubun/pp v3.0.1+incompatible // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/knadh/koanf v1.5.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mschoch/smat v0.2.0 // indirect
github.com/nacos-group/nacos-sdk-go/v2 v2.2.2 // indirect
github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 // indirect
github.com/openzipkin/zipkin-go v0.4.0 // indirect
github.com/pelletier/go-toml v1.9.3 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pierrec/lz4 v2.6.1+incompatible // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/polarismesh/polaris-go v1.3.0 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_golang v1.13.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.37.0 // indirect
github.com/prometheus/procfs v0.8.0 // indirect
github.com/robfig/cron/v3 v3.0.1 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/shirou/gopsutil/v3 v3.22.2 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/tklauser/go-sysconf v0.3.10 // indirect
github.com/tklauser/numcpus v0.4.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.etcd.io/etcd/api/v3 v3.5.12 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect
go.etcd.io/etcd/client/v3 v3.5.12 // indirect
go.opentelemetry.io/contrib/propagators/b3 v1.10.0 // indirect
go.opentelemetry.io/otel v1.24.0 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.10.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.10.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.10.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/otel/sdk v1.21.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/arch v0.8.0 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/oauth2 v0.18.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c // indirect
google.golang.org/grpc v1.62.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

2164
go.sum Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,49 @@
package controller
import (
"context"
"micro-bundle/internal/logic"
"micro-bundle/pb/bundle"
)
type BundleProvider struct {
bundle.UnimplementedBundleServer
}
// 套餐相关
func (b *BundleProvider) CreateBundle(_ context.Context, req *bundle.BundleProfile) (res *bundle.CommonResponse, err error) {
return logic.CreateBundle(req)
}
func (b *BundleProvider) UpdateBundle(_ context.Context, req *bundle.BundleProfile) (res *bundle.CommonResponse, err error) {
return logic.UpdateBundle(req)
}
func (b *BundleProvider) DeleteBundle(_ context.Context, req *bundle.DelBundleRequest) (res *bundle.CommonResponse, err error) {
return logic.DeleteBundle(req)
}
func (b *BundleProvider) BundleList(_ context.Context, req *bundle.BundleListRequest) (res *bundle.BundleListResponse, err error) {
return logic.BundleList(req)
}
func (b *BundleProvider) BundleDetail(_ context.Context, req *bundle.BundleDetailRequest) (res *bundle.BundleDetailResponse, err error) {
return logic.BundleDetail(req)
}
// 订单相关
func (b *BundleProvider) CreateOrderRecord(_ context.Context, req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
return logic.CreateOrderRecord(req)
}
func (b *BundleProvider) UpdateOrderRecord(_ context.Context, req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
return logic.UpdateOrderRecord(req)
}
func (b *BundleProvider) OrderRecordsList(_ context.Context, req *bundle.OrderRecordsRequest) (res *bundle.OrderRecordsResponse, err error) {
return logic.OrderRecordsList(req)
}
func (b *BundleProvider) OrderRecordsDetail(_ context.Context, req *bundle.OrderRecordsDetailRequest) (res *bundle.OrderRecordsDetailResponse, err error) {
return logic.OrderRecordsDetail(req)
}

87
internal/dao/bundleDao.go Normal file
View File

@ -0,0 +1,87 @@
package dao
import (
"github.com/jinzhu/copier"
"micro-bundle/internal/model"
"micro-bundle/pb/bundle"
"micro-bundle/pkg/app"
commonErr "micro-bundle/pkg/err"
"micro-bundle/pkg/msg"
)
func CreateBundle(bundle *model.BundleProfile) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
err = app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Create(&bundle).Error
if err != nil {
res.Msg = msg.ErrorCreateBundleInfo
return res, commonErr.ReturnError(err, msg.ErrorCreateBundleInfo, "创建套餐信息失败: ")
}
res.Msg = msg.SuccessCreateBundleInfo
return
}
func UpdateBundle(bundle *model.BundleProfile) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
err = app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Where("uuid = ?", bundle.UUID).Updates(bundle).Error
if err != nil {
res.Msg = msg.ErrorUpdateBundleInfo
return res, commonErr.ReturnError(err, msg.ErrorUpdateBundleInfo, "更新套餐信息失败: ")
}
res.Msg = msg.SuccessUpdateBundleInfo
return
}
func DeleteBundle(uuid string) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
err = app.ModuleClients.BundleDB.Where("uuid = ?", uuid).Delete(&model.BundleProfile{}).Error
if err != nil {
res.Msg = msg.ErrorDeleteBundleInfo
return res, commonErr.ReturnError(err, msg.ErrorDeleteBundleInfo, "删除套餐信息失败: ")
}
res.Msg = msg.SuccessDeleteBundleInfo
return
}
func BundleList(req *bundle.BundleListRequest) (res *bundle.BundleListResponse, err error) {
res = new(bundle.BundleListResponse)
res.Bundles = make([]*bundle.BundleProfile, 0)
bundles := make([]*model.BundleProfile, 0)
query := app.ModuleClients.BundleDB.Model(&model.BundleProfile{})
if req.Name != "" {
query = query.Where("name like ?", "%"+req.Name+"%")
}
if req.Content != "" {
query = query.Where("content like ?", "%"+req.Content+"%")
}
count := *query
if err = query.Find(&bundles).Error; err != nil {
return res, commonErr.ReturnError(err, msg.ErrorGetBundleList, "获取套餐列表失败: ")
}
_ = copier.CopyWithOption(&res.Bundles, &bundles, copier.Option{DeepCopy: true})
var total int64
count.Count(&total)
res.Total = int32(total)
return
}
func BundleDetail(uuid string) (res *bundle.BundleProfile, err error) {
res = new(bundle.BundleProfile)
bundle := new(model.BundleProfile)
err = app.ModuleClients.BundleDB.Where("uuid = ?", uuid).First(&bundle).Error
if err != nil {
return res, commonErr.ReturnError(err, msg.ErrorGetBundleInfo, "获取套餐信息失败: ")
}
_ = copier.CopyWithOption(&res, &bundle, copier.Option{DeepCopy: true})
return
}

View File

@ -0,0 +1,113 @@
package dao
import (
"github.com/jinzhu/copier"
"micro-bundle/internal/model"
"micro-bundle/pb/bundle"
"micro-bundle/pkg/app"
commonErr "micro-bundle/pkg/err"
"micro-bundle/pkg/msg"
"micro-bundle/pkg/utils"
)
func CreateOrderRecord(orderRecord *model.BundleOrderRecords) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
orderRecord.UUID = app.ModuleClients.SfNode.Generate().Base64()
orderRecord.OrderNo = utils.GetOrderNo()
err = app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Create(&orderRecord).Error
if err != nil {
res.Msg = msg.ErrorCreateOrderInfo
return res, commonErr.ReturnError(err, msg.ErrorCreateOrderInfo, "创建订单信息失败: ")
}
res.Uuid = orderRecord.UUID
res.Msg = msg.SuccessCreateOrderInfo
return
}
func UpdateOrderRecord(orderRecord *model.BundleOrderRecords) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
err = app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Where("uuid = ?", orderRecord.UUID).Updates(orderRecord).Error
if err != nil {
res.Msg = msg.ErrorUpdateOrderInfo
return res, commonErr.ReturnError(err, msg.ErrorUpdateOrderInfo, "更新订单信息失败: ")
}
res.Uuid = orderRecord.UUID
res.Msg = msg.SuccessUpdateOrderInfo
return
}
func OrderRecordsList(req *bundle.OrderRecordsRequest) (res *bundle.OrderRecordsResponse, err error) {
res = new(bundle.OrderRecordsResponse)
res.OrderRecords = make([]*bundle.OrderRecord, 0)
records := make([]*model.BundleOrderRecords, 0)
query := app.ModuleClients.BundleDB.Model(&model.BundleOrderRecords{})
if req.CustomerNum != "" {
query = query.Where("customer_num like ?", "%"+req.CustomerNum+"%")
}
if req.CustomerName != "" {
query = query.Where("customer_name like ?", "%"+req.CustomerName+"%")
}
if req.BundleName != "" {
query = query.Where("bundle_name like ?", "%"+req.BundleName+"%")
}
if req.BundleUUID != "" {
query = query.Where("bundle_uuid = ?", req.BundleUUID)
}
if req.OrderNo != "" {
query = query.Where("order_no like ?", "%"+req.OrderNo+"%")
}
if req.Status != 0 {
query = query.Where("status = ?", req.Status)
}
if req.StartSignedTime != "" {
query = query.Where("signed_time >= ?", req.StartSignedTime)
}
if req.EndSignedTime != "" {
query = query.Where("signed_time <= ?", req.EndSignedTime)
}
if req.StartPayTime != "" {
query = query.Where("pay_time >= ?", req.StartPayTime)
}
if req.EndPayTime != "" {
query = query.Where("pay_time <= ?", req.EndPayTime)
}
count := *query
err = query.Limit(int(req.PageSize)).Offset(int(req.Page-1) * int(req.PageSize)).Find(&records).Error
if err != nil {
return res, commonErr.ReturnError(err, msg.ErrorGetOrderList, "获取订单信息失败: ")
}
_ = copier.CopyWithOption(&res.OrderRecords, &records, copier.Option{DeepCopy: true})
var total int64
count.Count(&total)
res.Total = int32(total)
return
}
func OrderRecordDetail(uuid string) (res *bundle.OrderRecord, err error) {
res = new(bundle.OrderRecord)
orderRecord := new(model.BundleOrderRecords)
err = app.ModuleClients.BundleDB.Where("uuid = ?", uuid).First(&orderRecord).Error
if err != nil {
return res, commonErr.ReturnError(err, msg.ErrorGetOrderInfo, "获取订单信息失败: ")
}
_ = copier.CopyWithOption(&res, &orderRecord, copier.Option{DeepCopy: true})
return
}

View File

@ -0,0 +1,57 @@
package handler
import (
"errors"
"sync"
"dubbo.apache.org/dubbo-go/v3/common"
"dubbo.apache.org/dubbo-go/v3/common/extension"
"dubbo.apache.org/dubbo-go/v3/filter"
"dubbo.apache.org/dubbo-go/v3/protocol"
)
func init() {
extension.SetRejectedExecutionHandler("DefaultValueHandler", GetDefaultValueRejectedExecutionHandlerSingleton)
}
type DefaultValueRejectedExecutionHandler struct {
defaultResult sync.Map
}
func (mh *DefaultValueRejectedExecutionHandler) RejectedExecution(url *common.URL, invocation protocol.Invocation) protocol.Result {
key := url.ServiceKey() + "#" + invocation.MethodName()
result, loaded := mh.defaultResult.Load(key)
if !loaded {
// we didn't configure any default value for this invocation
return &protocol.RPCResult{
Err: errors.New("请求太频繁"),
}
}
return result.(*protocol.RPCResult)
}
func GetCustomRejectedExecutionHandler() filter.RejectedExecutionHandler {
return &DefaultValueRejectedExecutionHandler{}
}
var (
customHandlerOnce sync.Once
customHandlerInstance *DefaultValueRejectedExecutionHandler
)
/**
* the better way is designing the RejectedExecutionHandler as singleton.
*/
func GetDefaultValueRejectedExecutionHandlerSingleton() filter.RejectedExecutionHandler {
customHandlerOnce.Do(func() {
customHandlerInstance = &DefaultValueRejectedExecutionHandler{}
})
initDefaultValue()
return customHandlerInstance
}
func initDefaultValue() {
// setting your default value
}

View File

@ -0,0 +1,49 @@
package logic
import (
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
"github.com/jinzhu/copier"
"micro-bundle/internal/dao"
"micro-bundle/internal/model"
"micro-bundle/pb/bundle"
)
func CreateBundle(req *bundle.BundleProfile) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
bundleProfile := new(model.BundleProfile)
_ = copier.CopyWithOption(&bundleProfile, req, copier.Option{DeepCopy: true})
bundleProfile.UUID = utils.GetUUID()
res, err = dao.CreateBundle(bundleProfile)
return
}
func UpdateBundle(req *bundle.BundleProfile) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
bundleProfile := new(model.BundleProfile)
_ = copier.CopyWithOption(&bundleProfile, req, copier.Option{DeepCopy: true})
res, err = dao.UpdateBundle(bundleProfile)
return
}
func DeleteBundle(req *bundle.DelBundleRequest) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
res, err = dao.DeleteBundle(req.Uuid)
return
}
func BundleList(req *bundle.BundleListRequest) (res *bundle.BundleListResponse, err error) {
res = new(bundle.BundleListResponse)
res, err = dao.BundleList(req)
return
}
func BundleDetail(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailResponse, err error) {
res = new(bundle.BundleDetailResponse)
res.Bundle = new(bundle.BundleProfile)
res.Bundle, err = dao.BundleDetail(req.Uuid)
if err != nil {
res.Msg = err.Error()
}
return
}

View File

@ -0,0 +1,44 @@
package logic
import (
"github.com/jinzhu/copier"
"micro-bundle/internal/dao"
"micro-bundle/internal/model"
"micro-bundle/pb/bundle"
"micro-bundle/pkg/app"
"micro-bundle/pkg/utils"
)
func CreateOrderRecord(req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
orderRecord := new(model.BundleOrderRecords)
_ = copier.CopyWithOption(&orderRecord, req, copier.Option{DeepCopy: true})
orderRecord.UUID = app.ModuleClients.SfNode.Generate().Base64()
orderRecord.OrderNo = utils.GetOrderNo()
res, err = dao.CreateOrderRecord(orderRecord)
return
}
func UpdateOrderRecord(req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
orderRecord := new(model.BundleOrderRecords)
_ = copier.CopyWithOption(&orderRecord, req, copier.Option{DeepCopy: true})
res, err = dao.UpdateOrderRecord(orderRecord)
return
}
func OrderRecordsList(req *bundle.OrderRecordsRequest) (res *bundle.OrderRecordsResponse, err error) {
res = new(bundle.OrderRecordsResponse)
res, err = dao.OrderRecordsList(req)
return
}
func OrderRecordsDetail(req *bundle.OrderRecordsDetailRequest) (res *bundle.OrderRecordsDetailResponse, err error) {
res = new(bundle.OrderRecordsDetailResponse)
res.OrderRecord = new(bundle.OrderRecord)
res.OrderRecord, err = dao.OrderRecordDetail(req.Uuid)
if err != nil {
res.Msg = err.Error()
}
return
}

14
internal/model/bundle.go Normal file
View File

@ -0,0 +1,14 @@
package model
import "gorm.io/gorm"
type BundleProfile struct {
gorm.Model
UUID string `json:"uuid" gorm:"column:uuid;type:varchar(1024);comment:套餐UUID"`
Name string `json:"name" gorm:"column:name;type:varchar(2048);comment:套餐名称"`
Price float32 `json:"price" gorm:"column:price;type:decimal(12,2);comment:套餐价格"`
PriceType int64 `json:"priceType" gorm:"column:price_type;type:int;comment:套餐价格类型 1:人民币 2:美元"`
Contract string `json:"contract" gorm:"type:varchar(1024);comment:合同"`
Content string `json:"content" gorm:"column:content;type:text;comment:套餐内容"`
Language string `json:"language" gorm:"column:language;type:varchar(32);comment:套餐语言 zh-CN EN"`
}

View File

@ -0,0 +1,25 @@
package model
import "gorm.io/gorm"
// BundleOrderRecords struct
type BundleOrderRecords struct {
gorm.Model
UUID string `json:"uuid" gorm:"column:uuid;type:varchar(1024);comment:UUID"`
OrderNo string `json:"orderNo" gorm:"column:order_no;type:varchar(1024);comment:交易编号"`
BundleUUID string `json:"bundleUUID" gorm:"column:bundle_uuid;type:varchar(1024);comment:套餐UUID"`
BundleName string `json:"bundleName" gorm:"column:bundle_name;type:varchar(2048);comment:套餐名"`
CustomerID string `json:"customerID" gorm:"column:customer_id;type:varchar(1024);comment:客户ID"`
CustomerNum string `json:"customerNum" gorm:"column:customer_num;type:varchar(1024);comment:客户编号"`
CustomerName string `json:"customerName" gorm:"column:customer_name;type:varchar(1024);comment:客户名"`
Amount float32 `json:"amount" gorm:"column:amount;type:decimal(12,2);comment:金额"`
AmountType int64 `json:"amountType" gorm:"column:amount_type;type:int;comment:金额类型"`
SignContract string `json:"signContract" gorm:"column:sign_contract;type:varchar(1024);comment:签约合同"`
Signature string `json:"signature" gorm:"column:signature;type:text;comment:签字"`
SignedTime string `json:"signedTime" gorm:"column:signed_time;type:varchar(1024);comment:签约时间(北京时间)"`
PayType int64 `json:"payType" gorm:"column:pay_type;type:int;comment:支付类型"`
PayTime string `json:"payTime" gorm:"column:pay_time;type:varchar(1024);comment:支付时间(北京时间)"`
CheckoutSessionId string `json:"checkoutSessionId" gorm:"column:checkout_session_id;type:varchar(1024);comment:checkoutSessionId"`
CheckoutSessionUrl string `json:"checkoutSessionUrl" gorm:"column:checkout_session_url;type:text;comment:checkoutSessionUrl"`
Status int64 `json:"status" gorm:"column:status;type:int;comment:状态 1:已签未支付 2:已签已支付"`
}

111
pb/bundle.proto Normal file
View File

@ -0,0 +1,111 @@
syntax = "proto3";
package bundle;
option go_package = "./bundle";
service Bundle {
rpc CreateBundle(BundleProfile) returns (CommonResponse) {}
rpc UpdateBundle(BundleProfile) returns (CommonResponse) {}
rpc DeleteBundle(DelBundleRequest) returns (CommonResponse) {}
rpc BundleList(BundleListRequest) returns (BundleListResponse) {}
rpc BundleDetail(BundleDetailRequest) returns (BundleDetailResponse) {}
rpc CreateOrderRecord(OrderRecord) returns (CommonResponse) {}
rpc UpdateOrderRecord(OrderRecord) returns (CommonResponse) {}
rpc OrderRecordsList(OrderRecordsRequest) returns (OrderRecordsResponse) {}
rpc OrderRecordsDetail(OrderRecordsDetailRequest) returns (OrderRecordsDetailResponse) {}
}
message CommonResponse {
string msg = 1 [json_name = "msg"];
string uuid = 2 [json_name = "uuid"];
}
message BundleProfile {
string uuid = 1 [json_name = "uuid"];
string name = 2 [json_name = "name"];
int64 price = 3 [json_name = "price"];
int64 PriceType = 4 [json_name = "priceType"];
string content = 5 [json_name = "content"];
string contract = 6 [json_name = "contract"];
string language = 7 [json_name = "language"];
string createdAt = 8 [json_name = "createdAt"];
string updatedAt = 9 [json_name = "updatedAt"];
}
message DelBundleRequest {
string uuid = 1 [json_name = "uuid"];
}
message BundleListRequest {
int32 page = 1 [json_name = "page"];
int32 pageSize = 2 [json_name = "pageSize"];
string name = 3 [json_name = "name"];
string content = 4 [json_name = "content"];
}
message BundleListResponse {
repeated BundleProfile bundles = 1 [json_name = "bundles"];
int32 total = 2 [json_name = "total"];
}
message BundleDetailRequest {
string uuid = 1 [json_name = "uuid"];
}
message BundleDetailResponse {
BundleProfile bundle = 1 [json_name = "bundle"];
string msg = 2 [json_name = "msg"];
}
message OrderRecord {
string uuid = 1 [json_name = "uuid"];
string bundleUuid = 2 [json_name = "bundleUuid"];
string customerID = 3 [json_name = "customerID"];
string customerNum = 4 [json_name = "customerNum"];
string customerName = 5 [json_name = "customerName"];
int64 amount = 6 [json_name = "amount"];
int64 amountType = 7 [json_name = "amountType"];
string signContract = 8 [json_name = "signContract"];
string signature = 9 [json_name = "signature"];
string signedTime = 10 [json_name = "signedTime"];
int64 payType = 11 [json_name = "payType"];
string payTime = 12 [json_name = "payTime"];
string checkoutSessionId = 13 [json_name = "checkoutSessionId"];
string checkoutSessionUrl = 14 [json_name = "checkoutSessionUrl"];
string status = 15 [json_name = "status"];
string orderNo = 16 [json_name = "orderNo"];
string bundleName = 17 [json_name = "bundleName"];
}
message OrderRecordsRequest {
int32 page = 1 [json_name = "page"];
int32 pageSize = 2 [json_name = "pageSize"];
string customerNum = 3 [json_name = "customerNum"];
string customerName = 4 [json_name = "customerName"];
string bundleUUID = 5 [json_name = "bundleUUID"];
string orderNo = 6 [json_name = "orderNo"];
int64 status = 7 [json_name = "status"];
string bundleName = 8 [json_name = "bundleName"];
string startSignedTime = 9 [json_name = "startSignedTime"];
string endSignedTime = 10 [json_name = "endSignedTime"];
string startPayTime = 11 [json_name = "startPayTime"];
string endPayTime = 12 [json_name = "endPayTime"];
string customerID = 13 [json_name = "customerID"];
}
message OrderRecordsResponse {
repeated OrderRecord orderRecords = 1 [json_name = "orderRecords"];
int32 total = 2 [json_name = "total"];
}
message OrderRecordsDetailRequest {
string uuid = 1 [json_name = "uuid"];
}
message OrderRecordsDetailResponse {
OrderRecord orderRecord = 1 [json_name = "orderRecord"];
string msg = 2 [json_name = "msg"];
}

1336
pb/bundle/bundle.pb.go Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,77 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: pb/bundle.proto
package bundle
import (
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
func (this *CommonResponse) Validate() error {
return nil
}
func (this *BundleProfile) Validate() error {
return nil
}
func (this *DelBundleRequest) Validate() error {
return nil
}
func (this *BundleListRequest) Validate() error {
return nil
}
func (this *BundleListResponse) Validate() error {
for _, item := range this.Bundles {
if item != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("Bundles", err)
}
}
}
return nil
}
func (this *BundleDetailRequest) Validate() error {
return nil
}
func (this *BundleDetailResponse) Validate() error {
if this.Bundle != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.Bundle); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("Bundle", err)
}
}
return nil
}
func (this *OrderRecord) Validate() error {
return nil
}
func (this *OrderRecordsRequest) Validate() error {
return nil
}
func (this *OrderRecordsResponse) Validate() error {
for _, item := range this.OrderRecords {
if item != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("OrderRecords", err)
}
}
}
return nil
}
func (this *OrderRecordsDetailRequest) Validate() error {
return nil
}
func (this *OrderRecordsDetailResponse) Validate() error {
if this.OrderRecord != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.OrderRecord); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("OrderRecord", err)
}
}
return nil
}

View File

@ -0,0 +1,507 @@
// Code generated by protoc-gen-go-triple. DO NOT EDIT.
// versions:
// - protoc-gen-go-triple v1.0.5
// - protoc v5.29.0--rc3
// source: pb/bundle.proto
package bundle
import (
context "context"
protocol "dubbo.apache.org/dubbo-go/v3/protocol"
dubbo3 "dubbo.apache.org/dubbo-go/v3/protocol/dubbo3"
invocation "dubbo.apache.org/dubbo-go/v3/protocol/invocation"
grpc_go "github.com/dubbogo/grpc-go"
codes "github.com/dubbogo/grpc-go/codes"
metadata "github.com/dubbogo/grpc-go/metadata"
status "github.com/dubbogo/grpc-go/status"
common "github.com/dubbogo/triple/pkg/common"
constant "github.com/dubbogo/triple/pkg/common/constant"
triple "github.com/dubbogo/triple/pkg/triple"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc_go.SupportPackageIsVersion7
// BundleClient is the client API for Bundle 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 BundleClient interface {
CreateBundle(ctx context.Context, in *BundleProfile, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment)
UpdateBundle(ctx context.Context, in *BundleProfile, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment)
DeleteBundle(ctx context.Context, in *DelBundleRequest, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment)
BundleList(ctx context.Context, in *BundleListRequest, opts ...grpc_go.CallOption) (*BundleListResponse, common.ErrorWithAttachment)
BundleDetail(ctx context.Context, in *BundleDetailRequest, opts ...grpc_go.CallOption) (*BundleDetailResponse, common.ErrorWithAttachment)
CreateOrderRecord(ctx context.Context, in *OrderRecord, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment)
UpdateOrderRecord(ctx context.Context, in *OrderRecord, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment)
OrderRecordsList(ctx context.Context, in *OrderRecordsRequest, opts ...grpc_go.CallOption) (*OrderRecordsResponse, common.ErrorWithAttachment)
OrderRecordsDetail(ctx context.Context, in *OrderRecordsDetailRequest, opts ...grpc_go.CallOption) (*OrderRecordsDetailResponse, common.ErrorWithAttachment)
}
type bundleClient struct {
cc *triple.TripleConn
}
type BundleClientImpl struct {
CreateBundle func(ctx context.Context, in *BundleProfile) (*CommonResponse, error)
UpdateBundle func(ctx context.Context, in *BundleProfile) (*CommonResponse, error)
DeleteBundle func(ctx context.Context, in *DelBundleRequest) (*CommonResponse, error)
BundleList func(ctx context.Context, in *BundleListRequest) (*BundleListResponse, error)
BundleDetail func(ctx context.Context, in *BundleDetailRequest) (*BundleDetailResponse, error)
CreateOrderRecord func(ctx context.Context, in *OrderRecord) (*CommonResponse, error)
UpdateOrderRecord func(ctx context.Context, in *OrderRecord) (*CommonResponse, error)
OrderRecordsList func(ctx context.Context, in *OrderRecordsRequest) (*OrderRecordsResponse, error)
OrderRecordsDetail func(ctx context.Context, in *OrderRecordsDetailRequest) (*OrderRecordsDetailResponse, error)
}
func (c *BundleClientImpl) GetDubboStub(cc *triple.TripleConn) BundleClient {
return NewBundleClient(cc)
}
func (c *BundleClientImpl) XXX_InterfaceName() string {
return "bundle.Bundle"
}
func NewBundleClient(cc *triple.TripleConn) BundleClient {
return &bundleClient{cc}
}
func (c *bundleClient) CreateBundle(ctx context.Context, in *BundleProfile, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment) {
out := new(CommonResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/CreateBundle", in, out)
}
func (c *bundleClient) UpdateBundle(ctx context.Context, in *BundleProfile, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment) {
out := new(CommonResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/UpdateBundle", in, out)
}
func (c *bundleClient) DeleteBundle(ctx context.Context, in *DelBundleRequest, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment) {
out := new(CommonResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/DeleteBundle", in, out)
}
func (c *bundleClient) BundleList(ctx context.Context, in *BundleListRequest, opts ...grpc_go.CallOption) (*BundleListResponse, common.ErrorWithAttachment) {
out := new(BundleListResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/BundleList", in, out)
}
func (c *bundleClient) BundleDetail(ctx context.Context, in *BundleDetailRequest, opts ...grpc_go.CallOption) (*BundleDetailResponse, common.ErrorWithAttachment) {
out := new(BundleDetailResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/BundleDetail", in, out)
}
func (c *bundleClient) CreateOrderRecord(ctx context.Context, in *OrderRecord, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment) {
out := new(CommonResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/CreateOrderRecord", in, out)
}
func (c *bundleClient) UpdateOrderRecord(ctx context.Context, in *OrderRecord, opts ...grpc_go.CallOption) (*CommonResponse, common.ErrorWithAttachment) {
out := new(CommonResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/UpdateOrderRecord", in, out)
}
func (c *bundleClient) OrderRecordsList(ctx context.Context, in *OrderRecordsRequest, opts ...grpc_go.CallOption) (*OrderRecordsResponse, common.ErrorWithAttachment) {
out := new(OrderRecordsResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/OrderRecordsList", in, out)
}
func (c *bundleClient) OrderRecordsDetail(ctx context.Context, in *OrderRecordsDetailRequest, opts ...grpc_go.CallOption) (*OrderRecordsDetailResponse, common.ErrorWithAttachment) {
out := new(OrderRecordsDetailResponse)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/OrderRecordsDetail", in, out)
}
// BundleServer is the server API for Bundle service.
// All implementations must embed UnimplementedBundleServer
// for forward compatibility
type BundleServer interface {
CreateBundle(context.Context, *BundleProfile) (*CommonResponse, error)
UpdateBundle(context.Context, *BundleProfile) (*CommonResponse, error)
DeleteBundle(context.Context, *DelBundleRequest) (*CommonResponse, error)
BundleList(context.Context, *BundleListRequest) (*BundleListResponse, error)
BundleDetail(context.Context, *BundleDetailRequest) (*BundleDetailResponse, error)
CreateOrderRecord(context.Context, *OrderRecord) (*CommonResponse, error)
UpdateOrderRecord(context.Context, *OrderRecord) (*CommonResponse, error)
OrderRecordsList(context.Context, *OrderRecordsRequest) (*OrderRecordsResponse, error)
OrderRecordsDetail(context.Context, *OrderRecordsDetailRequest) (*OrderRecordsDetailResponse, error)
mustEmbedUnimplementedBundleServer()
}
// UnimplementedBundleServer must be embedded to have forward compatible implementations.
type UnimplementedBundleServer struct {
proxyImpl protocol.Invoker
}
func (UnimplementedBundleServer) CreateBundle(context.Context, *BundleProfile) (*CommonResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateBundle not implemented")
}
func (UnimplementedBundleServer) UpdateBundle(context.Context, *BundleProfile) (*CommonResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateBundle not implemented")
}
func (UnimplementedBundleServer) DeleteBundle(context.Context, *DelBundleRequest) (*CommonResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteBundle not implemented")
}
func (UnimplementedBundleServer) BundleList(context.Context, *BundleListRequest) (*BundleListResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method BundleList not implemented")
}
func (UnimplementedBundleServer) BundleDetail(context.Context, *BundleDetailRequest) (*BundleDetailResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method BundleDetail not implemented")
}
func (UnimplementedBundleServer) CreateOrderRecord(context.Context, *OrderRecord) (*CommonResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateOrderRecord not implemented")
}
func (UnimplementedBundleServer) UpdateOrderRecord(context.Context, *OrderRecord) (*CommonResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateOrderRecord not implemented")
}
func (UnimplementedBundleServer) OrderRecordsList(context.Context, *OrderRecordsRequest) (*OrderRecordsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method OrderRecordsList not implemented")
}
func (UnimplementedBundleServer) OrderRecordsDetail(context.Context, *OrderRecordsDetailRequest) (*OrderRecordsDetailResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method OrderRecordsDetail not implemented")
}
func (s *UnimplementedBundleServer) XXX_SetProxyImpl(impl protocol.Invoker) {
s.proxyImpl = impl
}
func (s *UnimplementedBundleServer) XXX_GetProxyImpl() protocol.Invoker {
return s.proxyImpl
}
func (s *UnimplementedBundleServer) XXX_ServiceDesc() *grpc_go.ServiceDesc {
return &Bundle_ServiceDesc
}
func (s *UnimplementedBundleServer) XXX_InterfaceName() string {
return "bundle.Bundle"
}
func (UnimplementedBundleServer) mustEmbedUnimplementedBundleServer() {}
// UnsafeBundleServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to BundleServer will
// result in compilation errors.
type UnsafeBundleServer interface {
mustEmbedUnimplementedBundleServer()
}
func RegisterBundleServer(s grpc_go.ServiceRegistrar, srv BundleServer) {
s.RegisterService(&Bundle_ServiceDesc, srv)
}
func _Bundle_CreateBundle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(BundleProfile)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("CreateBundle", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_UpdateBundle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(BundleProfile)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("UpdateBundle", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_DeleteBundle_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(DelBundleRequest)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("DeleteBundle", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_BundleList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(BundleListRequest)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("BundleList", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_BundleDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(BundleDetailRequest)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("BundleDetail", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_CreateOrderRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(OrderRecord)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("CreateOrderRecord", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_UpdateOrderRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(OrderRecord)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("UpdateOrderRecord", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_OrderRecordsList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(OrderRecordsRequest)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("OrderRecordsList", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
func _Bundle_OrderRecordsDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) {
in := new(OrderRecordsDetailRequest)
if err := dec(in); err != nil {
return nil, err
}
base := srv.(dubbo3.Dubbo3GrpcService)
args := []interface{}{}
args = append(args, in)
md, _ := metadata.FromIncomingContext(ctx)
invAttachment := make(map[string]interface{}, len(md))
for k, v := range md {
invAttachment[k] = v
}
invo := invocation.NewRPCInvocation("OrderRecordsDetail", args, invAttachment)
if interceptor == nil {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
info := &grpc_go.UnaryServerInfo{
Server: srv,
FullMethod: ctx.Value("XXX_TRIPLE_GO_INTERFACE_NAME").(string),
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
result := base.XXX_GetProxyImpl().Invoke(ctx, invo)
return result, result.Error()
}
return interceptor(ctx, in, info, handler)
}
// Bundle_ServiceDesc is the grpc_go.ServiceDesc for Bundle service.
// It's only intended for direct use with grpc_go.RegisterService,
// and not to be introspected or modified (even as a copy)
var Bundle_ServiceDesc = grpc_go.ServiceDesc{
ServiceName: "bundle.Bundle",
HandlerType: (*BundleServer)(nil),
Methods: []grpc_go.MethodDesc{
{
MethodName: "CreateBundle",
Handler: _Bundle_CreateBundle_Handler,
},
{
MethodName: "UpdateBundle",
Handler: _Bundle_UpdateBundle_Handler,
},
{
MethodName: "DeleteBundle",
Handler: _Bundle_DeleteBundle_Handler,
},
{
MethodName: "BundleList",
Handler: _Bundle_BundleList_Handler,
},
{
MethodName: "BundleDetail",
Handler: _Bundle_BundleDetail_Handler,
},
{
MethodName: "CreateOrderRecord",
Handler: _Bundle_CreateOrderRecord_Handler,
},
{
MethodName: "UpdateOrderRecord",
Handler: _Bundle_UpdateOrderRecord_Handler,
},
{
MethodName: "OrderRecordsList",
Handler: _Bundle_OrderRecordsList_Handler,
},
{
MethodName: "OrderRecordsDetail",
Handler: _Bundle_OrderRecordsDetail_Handler,
},
},
Streams: []grpc_go.StreamDesc{},
Metadata: "pb/bundle.proto",
}

20
pkg/amqp/rabbitmq.go Normal file
View File

@ -0,0 +1,20 @@
package amqp
import (
"github.com/google/wire"
"github.com/streadway/amqp"
)
var RabbitMqConn *amqp.Connection
var Provider = wire.NewSet(NewRabbitMq)
func NewRabbitMq() *amqp.Connection {
//var err error
// 创建连接
/*RabbitMqConn, err = amqp.Dial(fmt.Sprintf("amqp://%s:%s@%s:%d/%s", appConfig.Data.RabbitMq.User, appConfig.Data.RabbitMq.Password, appConfig.Data.RabbitMq.Host, appConfig.Data.RabbitMq.Port, appConfig.Data.RabbitMq.Vhost))
if err != nil {
log.Fatalf("failed to connect RabbitMQ: %v", err)
}*/
return RabbitMqConn
}

18
pkg/app/app.go Normal file
View File

@ -0,0 +1,18 @@
package app
import (
"github.com/bwmarrin/snowflake"
"go.uber.org/zap"
"gorm.io/gorm"
"micro-bundle/pkg/tracing"
)
var ModuleClients *App
type App struct {
Lg *zap.Logger
//RedisClient *redis.Client
JaegerTracer *tracing.JaegerProvider
BundleDB *gorm.DB
SfNode *snowflake.Node
}

24
pkg/cache/redis.go vendored Normal file
View File

@ -0,0 +1,24 @@
package cache
import (
"github.com/go-redis/redis"
"github.com/google/wire"
)
var RedisProvider = wire.NewSet(NewRedis)
// TODO 添加连接池
func NewRedis() *redis.Client {
//redisDb, _ := strconv.Atoi(dciConfig.Data.Redis.DB)
//RedisClient := redis.NewClient(&redis.Options{
// Addr: dciConfig.Data.Redis.Addr,
// Password: dciConfig.Data.Redis.Password,
// DB: redisDb,
//})
//_, err := RedisClient.Ping().Result()
//if err != nil {
// logger.Errorf("connRedis err", err)
// panic(err)
//}
return nil
}

18
pkg/db/bundleDB.go Normal file
View File

@ -0,0 +1,18 @@
package db
import (
"github.com/google/wire"
"gorm.io/gorm"
bundleConfig "micro-bundle/config"
"strings"
)
var Provider = wire.NewSet(NewBundleDB)
func NewBundleDB() *gorm.DB {
connBundleDB := strings.Join([]string{bundleConfig.Data.ChainDci.User, ":", bundleConfig.Data.ChainDci.Password,
"@tcp(", bundleConfig.Data.ChainDci.Host, ":", bundleConfig.Data.ChainDci.Port, ")/",
bundleConfig.Data.ChainDci.DbName, "?charset=utf8mb4&parseTime=true"}, "")
DciDB := loadMysqlConn(connBundleDB)
return DciDB
}

56
pkg/db/mysql.go Normal file
View File

@ -0,0 +1,56 @@
package db
import (
"time"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"micro-bundle/internal/model"
)
func loadMysqlConn(conn string) *gorm.DB {
var ormLogger logger.Interface
if gin.Mode() == "debug" {
ormLogger = logger.Default.LogMode(logger.Info)
} else {
ormLogger = logger.Default
}
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: conn, // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据版本自动配置
}), &gorm.Config{
Logger: ormLogger,
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
DisableForeignKeyConstraintWhenMigrating: true,
})
if err != nil {
panic(err)
}
sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(20) //设置连接池,空闲
sqlDB.SetMaxOpenConns(100) //打开
sqlDB.SetConnMaxLifetime(time.Second * 30)
err = db.AutoMigrate(&model.BundleProfile{}, &model.BundleOrderRecords{})
if err != nil {
return nil
}
return db
}
func DBMigration() {
}
func addColumn(dst interface{}, column string) {
return
}

40
pkg/err/common.go Normal file
View File

@ -0,0 +1,40 @@
package err
import (
"errors"
"fmt"
"dubbo.apache.org/dubbo-go/v3/common/logger"
"github.com/getsentry/sentry-go"
"go.uber.org/zap"
"micro-bundle/pkg/app"
)
func ReturnError(err error, msg, print string) error {
if err != nil {
sentry.WithScope(func(scope *sentry.Scope) {
scope.SetLevel(sentry.LevelError)
sentry.CaptureMessage(fmt.Sprintf("print:%+v msg:%+v err : %+v", print, msg, err))
})
logger.Error(print, err)
fmt.Printf(print+"%+v\n", err)
return errors.New(msg)
} else {
sentry.CaptureMessage(fmt.Sprintf("print:%+v msg:%+v ", print, msg))
return errors.New(msg)
}
}
func RecordCommonInfo(method, point string, value any) {
sentry.WithScope(func(scope *sentry.Scope) {
scope.SetLevel(sentry.LevelInfo)
scope.SetTag("method : ", method)
if value != nil {
sentry.CaptureMessage(fmt.Sprintf("point:%+v value:%+v ", point, value))
} else {
sentry.CaptureMessage(fmt.Sprintf("point:%+v ", point))
}
})
}

5
pkg/init/start.go Normal file
View File

@ -0,0 +1,5 @@
package common
func Init() {
//db.DBMigration()
}

63
pkg/logger/zap_logger.go Normal file
View File

@ -0,0 +1,63 @@
package logger
import (
"github.com/google/wire"
bundleConfig "micro-bundle/config"
"os"
"strconv"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var Provider = wire.NewSet(ZapInit)
// ZapInit 初始化lg
func ZapInit() *zap.Logger {
var err error
maxSize, _ := strconv.Atoi(bundleConfig.Data.ZapLog.MaxSize)
maxAge, _ := strconv.Atoi(bundleConfig.Data.ZapLog.MaxAge)
maxBackups, _ := strconv.Atoi(bundleConfig.Data.ZapLog.MaxAge)
writeSyncer := getLogWriter(bundleConfig.Data.ZapLog.Filename, maxSize, maxBackups, maxAge)
encoder := getEncoder()
var l = new(zapcore.Level)
err = l.UnmarshalText([]byte(bundleConfig.Data.ZapLog.Level))
if err != nil {
return nil
}
var core zapcore.Core
if bundleConfig.Data.System.Mode == "dev" {
// 进入开发模式,日志输出到终端
consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
core = zapcore.NewTee(
zapcore.NewCore(encoder, writeSyncer, l),
zapcore.NewCore(consoleEncoder, zapcore.Lock(os.Stdout), zapcore.DebugLevel),
)
} else {
core = zapcore.NewCore(encoder, writeSyncer, l)
}
lg := zap.New(core, zap.AddCaller())
zap.ReplaceGlobals(lg)
return lg
}
func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.TimeKey = "time"
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
encoderConfig.EncodeDuration = zapcore.SecondsDurationEncoder
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
return zapcore.NewJSONEncoder(encoderConfig)
}
func getLogWriter(filename string, maxSize, maxBackup, maxAge int) zapcore.WriteSyncer {
lumberJackLogger := &lumberjack.Logger{
Filename: filename,
MaxSize: maxSize,
MaxBackups: maxBackup,
MaxAge: maxAge,
}
return zapcore.AddSync(lumberJackLogger)
}

45
pkg/msg/msg.go Normal file
View File

@ -0,0 +1,45 @@
package msg
const (
SERVER_CONFIG = "config.yaml"
SERVER_DUBBOGO_CONFIG = "dubbogo.yaml"
MODE_ENV = "MODE_ENV"
)
const (
Success = "操作成功"
Failed = "操作失败"
)
const (
Http = 200
)
// 套餐信息
const (
ErrorCreateBundleInfo = "创建套餐信息失败"
SuccessCreateBundleInfo = "创建套餐信息成功"
ErrorUpdateBundleInfo = "更新套餐信息失败"
SuccessUpdateBundleInfo = "更新套餐信息成功"
ErrorDeleteBundleInfo = "删除套餐信息失败"
SuccessDeleteBundleInfo = "删除套餐信息成功"
ErrorGetBundleList = "获取套餐列表失败"
ErrorGetBundleInfo = "获取套餐信息失败"
)
// 订单信息
const (
ErrorCreateOrderInfo = "创建订单信息失败"
SuccessCreateOrderInfo = "创建订单信息成功"
ErrorUpdateOrderInfo = "更新订单信息失败"
SuccessUpdateOrderInfo = "更新订单信息成功"
ErrorGetOrderInfo = "获取订单信息失败"
ErrorGetOrderList = "获取订单列表失败"
)

4
pkg/service/init.go Normal file
View File

@ -0,0 +1,4 @@
package service
func init() {
}

38
pkg/snowf/snowflake.go Normal file
View File

@ -0,0 +1,38 @@
package snowf
import (
"strconv"
"time"
"github.com/bwmarrin/snowflake"
"github.com/google/wire"
bundleConfig "micro-bundle/config"
"micro-bundle/pkg/app"
)
var Provider = wire.NewSet(NewSf)
func NewSf() *snowflake.Node {
var err error
var st time.Time
nodeNum, _ := strconv.Atoi(bundleConfig.Data.SnowFlake.NodeNum)
st, err = time.Parse("2006-01-02", bundleConfig.Data.SnowFlake.StartTime)
if err != nil {
panic(err)
}
snowflake.Epoch = st.UnixNano() / 1000000
node, errS := snowflake.NewNode(int64(nodeNum))
if errS != nil {
panic(errS)
}
return node
}
func GenIDInt64() int64 {
return app.ModuleClients.SfNode.Generate().Int64()
}
func GetIDBase64() string {
return app.ModuleClients.SfNode.Generate().Base64()
}

51
pkg/tracing/jaeger.go Normal file
View File

@ -0,0 +1,51 @@
package tracing
import (
"io"
bundleConfig "micro-bundle/config"
"time"
"github.com/google/wire"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
jaegerConfig "github.com/uber/jaeger-client-go/config"
"go.uber.org/zap"
)
var Provider = wire.NewSet(NewTracing)
type JaegerProvider struct {
Tracer opentracing.Tracer
Closer io.Closer
}
//var JaegerPoint *JaegerProvider
func NewTracing() (jaegerProvider *JaegerProvider) {
if bundleConfig.Data.Jaeger.Open != "true" {
return
}
jaegerProvider = &JaegerProvider{}
cfg := jaegerConfig.Configuration{
ServiceName: "oa-meeting",
Sampler: &jaegerConfig.SamplerConfig{
Type: jaeger.SamplerTypeRemote,
Param: 1,
},
Reporter: &jaegerConfig.ReporterConfig{
LocalAgentHostPort: bundleConfig.Data.Jaeger.Addr,
LogSpans: true,
BufferFlushInterval: 5 * time.Second,
},
}
nativeTracerIo, closerIo, err := cfg.NewTracer(jaegerConfig.Logger(jaeger.StdLogger))
if err != nil {
zap.L().Error("nativeTracer err", zap.Error(err))
return
}
opentracing.SetGlobalTracer(nativeTracerIo)
jaegerProvider.Tracer = nativeTracerIo
jaegerProvider.Closer = closerIo
//JaegerPoint = jaegerProvider
return
}

75
pkg/utils/http.go Normal file
View File

@ -0,0 +1,75 @@
package utils
import (
"bytes"
"fmt"
"go.uber.org/zap"
"io/ioutil"
"net/http"
)
func Post(url string, jsonStr []byte) (statusCode int, result string) {
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
statusCode = resp.StatusCode
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("post url:", url)
fmt.Println("response Headers:", resp.Header)
fmt.Println("response Body:", string(body))
result = string(body)
zap.L().Info("post", zap.Any("url", url), zap.Any("jsonStr", jsonStr), zap.Any("result", result))
return
}
func Get(url string) (statusCode int, result string) {
resp, err := http.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
statusCode = resp.StatusCode
fmt.Println("response StatusCode:", resp.StatusCode)
fmt.Println("response Status:", resp.Status)
fmt.Println("response Headers:", resp.Header)
body, _ := ioutil.ReadAll(resp.Body)
result = string(body)
fmt.Println("response Body:", string(body))
zap.L().Info("Get", zap.Any("url", url), zap.Any("result", result))
return
}
func PutFromFileUrlWithStream(url, fileName, fileUrl string) (statusCode int, result string) {
file, err := http.Get(fileUrl)
if err != nil {
panic(err)
}
defer file.Body.Close()
fileBody, _ := ioutil.ReadAll(file.Body)
req, err := http.NewRequest("PUT", url, bytes.NewBuffer(fileBody))
req.Header.Set("Content-Type", "application/octet-stream")
req.Header.Set("x-oss-meta-rawfilename", fileName)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
//panic(err)
return 400, "执行文件上传失败"
}
defer resp.Body.Close()
statusCode = resp.StatusCode
body, _ := ioutil.ReadAll(resp.Body)
result = string(body)
fmt.Println("put url:", url)
fmt.Println("fileName :", fileName)
fmt.Println("response Headers:", resp.Header)
//fmt.Println("response Body:", string(body))
fmt.Println("response StatusCode:", statusCode)
//zap.L().Info("post", zap.Any("url", url), zap.Any("jsonStr", bytes.NewBuffer(fileBody).String()), zap.Any("result", result))
return
}

11
pkg/utils/msg.go Normal file
View File

@ -0,0 +1,11 @@
package utils
import "strings"
import "errors"
func SubstrError(err error) (sErr error) {
start := strings.Index(err.Error(), ":")
msg := err.Error()[start+2:]
sErr = errors.New(msg)
return
}

23
pkg/utils/orderNo.go Normal file
View File

@ -0,0 +1,23 @@
package utils
import (
"math/rand"
"time"
)
const source = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
// 生成订单号 模版 BD20250220104501+6位随机数 避免 订单号重复
func GetOrderNo() string {
return "BD" + time.Now().Format("20060102150405") + GetRandomString(6)
}
// 生成随机字符串
func GetRandomString(length int) string {
rand.Seed(time.Now().UnixNano())
bytes := make([]byte, length)
for i := 0; i < length; i++ {
bytes[i] = source[rand.Intn(62)]
}
return string(bytes)
}

52
pkg/utils/time.go Normal file
View File

@ -0,0 +1,52 @@
package utils
import (
"errors"
"time"
"go.uber.org/zap"
"micro-bundle/pkg/msg"
)
const (
DateTimeFormat = "2006-01-02 15:04:05"
DateFormat = "2006-01-02"
DateFormatYmdHisDot = "2006.01.02 15:04"
DateFormatMonth = "2006年01月02日 15:04"
)
func DatetimeToTimes(datetime string, dateFormat string) (times int32, err error) {
if datetime == "" {
times = 0
return
}
loc, _ := time.LoadLocation("Asia/Shanghai")
t, err := time.ParseInLocation(dateFormat, datetime, loc)
if err != nil {
zap.L().Error("DatetimeToTimes err:"+datetime+":", zap.Error(err))
err = errors.New(msg.ErrorDatetime)
return
}
times = int32(t.Unix())
return
}
func TimesToDatetime(times int32, format string) string {
if times == 0 {
return ""
}
t := time.Unix(int64(times), 0)
if format == "" {
format = DateTimeFormat
}
return t.Format(format)
}
func MonthInfo() (startTime int64, endTime int64) {
timeNow := time.Now()
timeToday := time.Date(timeNow.Year(), timeNow.Month(), timeNow.Day(), 0, 0, 0, 0, timeNow.Location()) // 获取当天0点时间 time类型
startTime = timeToday.AddDate(0, 0, -timeToday.Day()+1).Unix() // 获取本月第一天0点 时间戳类型
endTime = timeToday.AddDate(0, 1, -timeToday.Day()+1).Unix()
return
}