From 0772e8d0da0696a4f02d91835ca154f2ac9b377c Mon Sep 17 00:00:00 2001 From: workabee <2950914812@qq.com> Date: Wed, 31 Jan 2024 17:04:43 +0800 Subject: [PATCH] build --- api/exhibition/exhibition.pb.go | 871 ++++++++++++++++++++++ api/exhibition/exhibition.validator.pb.go | 62 ++ api/exhibition/exhibition_triple.pb.go | 282 +++++++ conf/dev/config.yaml | 27 + conf/dev/dubbogo.yaml | 55 ++ conf/prod/config.yaml | 27 + conf/prod/dubbogo.yaml | 55 ++ conf/test/config.yaml | 27 + conf/test/dubbogo.yaml | 55 ++ go.mod | 148 ++++ internal/config/app_config.go | 69 ++ internal/filter/authfilter.go | 38 + internal/middleware/auth.go | 53 ++ internal/middleware/cors.go | 48 ++ internal/middleware/logging.go | 89 +++ internal/model/common.go | 19 + internal/model/user.go | 12 + internal/msg/code.go | 33 + internal/msg/message.go | 28 + internal/response/response.go | 27 + internal/response/user.go | 5 + pkg/cache/redis.go | 32 + pkg/jwt/jwt.go | 55 ++ pkg/logger/zap.go | 65 ++ pkg/router/router.go | 73 ++ pkg/service/init.go | 17 + pkg/service/register_record.go | 1 + pkg/tracing/jaeger.go | 50 ++ pkg/utils/user.go | 19 + pkg/utils/validator.go | 63 ++ 30 files changed, 2405 insertions(+) create mode 100644 api/exhibition/exhibition.pb.go create mode 100644 api/exhibition/exhibition.validator.pb.go create mode 100644 api/exhibition/exhibition_triple.pb.go create mode 100644 conf/dev/config.yaml create mode 100644 conf/dev/dubbogo.yaml create mode 100644 conf/prod/config.yaml create mode 100644 conf/prod/dubbogo.yaml create mode 100644 conf/test/config.yaml create mode 100644 conf/test/dubbogo.yaml create mode 100644 go.mod create mode 100644 internal/config/app_config.go create mode 100644 internal/filter/authfilter.go create mode 100644 internal/middleware/auth.go create mode 100644 internal/middleware/cors.go create mode 100644 internal/middleware/logging.go create mode 100644 internal/model/common.go create mode 100644 internal/model/user.go create mode 100644 internal/msg/code.go create mode 100644 internal/msg/message.go create mode 100644 internal/response/response.go create mode 100644 internal/response/user.go create mode 100644 pkg/cache/redis.go create mode 100644 pkg/jwt/jwt.go create mode 100644 pkg/logger/zap.go create mode 100644 pkg/router/router.go create mode 100644 pkg/service/init.go create mode 100644 pkg/service/register_record.go create mode 100644 pkg/tracing/jaeger.go create mode 100644 pkg/utils/user.go create mode 100644 pkg/utils/validator.go diff --git a/api/exhibition/exhibition.pb.go b/api/exhibition/exhibition.pb.go new file mode 100644 index 0000000..add9f28 --- /dev/null +++ b/api/exhibition/exhibition.pb.go @@ -0,0 +1,871 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.0 +// protoc v3.21.1 +// source: pb/exhibition.proto + +package exhibition + +import ( + _ "github.com/mwitkow/go-proto-validators" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + _ "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type RegisterInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id"` + Uuid string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid"` + ArtistName string `protobuf:"bytes,3,opt,name=artistName,proto3" json:"artistName"` + Gender int32 `protobuf:"varint,4,opt,name=gender,proto3" json:"gender"` + PhoneNum string `protobuf:"bytes,5,opt,name=phoneNum,proto3" json:"phoneNum"` + IdCard string `protobuf:"bytes,6,opt,name=idCard,proto3" json:"idCard"` + Address string `protobuf:"bytes,7,opt,name=address,proto3" json:"address"` + IdCardPhoto string `protobuf:"bytes,8,opt,name=idCardPhoto,proto3" json:"idCardPhoto"` + ArtistPhoto string `protobuf:"bytes,9,opt,name=artistPhoto,proto3" json:"artistPhoto"` + CreatedAt string `protobuf:"bytes,10,opt,name=createdAt,proto3" json:"createdAt"` + UpdatedAt string `protobuf:"bytes,11,opt,name=updatedAt,proto3" json:"updatedAt"` +} + +func (x *RegisterInfo) Reset() { + *x = RegisterInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_pb_exhibition_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterInfo) ProtoMessage() {} + +func (x *RegisterInfo) ProtoReflect() protoreflect.Message { + mi := &file_pb_exhibition_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterInfo.ProtoReflect.Descriptor instead. +func (*RegisterInfo) Descriptor() ([]byte, []int) { + return file_pb_exhibition_proto_rawDescGZIP(), []int{0} +} + +func (x *RegisterInfo) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *RegisterInfo) GetUuid() string { + if x != nil { + return x.Uuid + } + return "" +} + +func (x *RegisterInfo) GetArtistName() string { + if x != nil { + return x.ArtistName + } + return "" +} + +func (x *RegisterInfo) GetGender() int32 { + if x != nil { + return x.Gender + } + return 0 +} + +func (x *RegisterInfo) GetPhoneNum() string { + if x != nil { + return x.PhoneNum + } + return "" +} + +func (x *RegisterInfo) GetIdCard() string { + if x != nil { + return x.IdCard + } + return "" +} + +func (x *RegisterInfo) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *RegisterInfo) GetIdCardPhoto() string { + if x != nil { + return x.IdCardPhoto + } + return "" +} + +func (x *RegisterInfo) GetArtistPhoto() string { + if x != nil { + return x.ArtistPhoto + } + return "" +} + +func (x *RegisterInfo) GetCreatedAt() string { + if x != nil { + return x.CreatedAt + } + return "" +} + +func (x *RegisterInfo) GetUpdatedAt() string { + if x != nil { + return x.UpdatedAt + } + return "" +} + +type SaveRegisterRecordResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg"` +} + +func (x *SaveRegisterRecordResp) Reset() { + *x = SaveRegisterRecordResp{} + if protoimpl.UnsafeEnabled { + mi := &file_pb_exhibition_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SaveRegisterRecordResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SaveRegisterRecordResp) ProtoMessage() {} + +func (x *SaveRegisterRecordResp) ProtoReflect() protoreflect.Message { + mi := &file_pb_exhibition_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SaveRegisterRecordResp.ProtoReflect.Descriptor instead. +func (*SaveRegisterRecordResp) Descriptor() ([]byte, []int) { + return file_pb_exhibition_proto_rawDescGZIP(), []int{1} +} + +func (x *SaveRegisterRecordResp) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +type CheckPhoneResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsExist bool `protobuf:"varint,1,opt,name=isExist,proto3" json:"isExist"` + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg"` + Data *RegisterInfo `protobuf:"bytes,3,opt,name=data,proto3" json:"data"` +} + +func (x *CheckPhoneResp) Reset() { + *x = CheckPhoneResp{} + if protoimpl.UnsafeEnabled { + mi := &file_pb_exhibition_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CheckPhoneResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckPhoneResp) ProtoMessage() {} + +func (x *CheckPhoneResp) ProtoReflect() protoreflect.Message { + mi := &file_pb_exhibition_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CheckPhoneResp.ProtoReflect.Descriptor instead. +func (*CheckPhoneResp) Descriptor() ([]byte, []int) { + return file_pb_exhibition_proto_rawDescGZIP(), []int{2} +} + +func (x *CheckPhoneResp) GetIsExist() bool { + if x != nil { + return x.IsExist + } + return false +} + +func (x *CheckPhoneResp) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +func (x *CheckPhoneResp) GetData() *RegisterInfo { + if x != nil { + return x.Data + } + return nil +} + +type RecordListReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Keyword string `protobuf:"bytes,1,opt,name=keyword,proto3" json:"keyword"` + Page int32 `protobuf:"varint,2,opt,name=page,proto3" json:"page"` + PageSize int32 `protobuf:"varint,3,opt,name=pageSize,proto3" json:"pageSize"` +} + +func (x *RecordListReq) Reset() { + *x = RecordListReq{} + if protoimpl.UnsafeEnabled { + mi := &file_pb_exhibition_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RecordListReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecordListReq) ProtoMessage() {} + +func (x *RecordListReq) ProtoReflect() protoreflect.Message { + mi := &file_pb_exhibition_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecordListReq.ProtoReflect.Descriptor instead. +func (*RecordListReq) Descriptor() ([]byte, []int) { + return file_pb_exhibition_proto_rawDescGZIP(), []int{3} +} + +func (x *RecordListReq) GetKeyword() string { + if x != nil { + return x.Keyword + } + return "" +} + +func (x *RecordListReq) GetPage() int32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *RecordListReq) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +type RecordListResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []*RegisterInfo `protobuf:"bytes,1,rep,name=data,proto3" json:"data"` + Count int32 `protobuf:"varint,2,opt,name=count,proto3" json:"count"` + Page int32 `protobuf:"varint,3,opt,name=page,proto3" json:"page"` + PageSize int32 `protobuf:"varint,4,opt,name=pageSize,proto3" json:"pageSize"` + Msg string `protobuf:"bytes,5,opt,name=msg,proto3" json:"msg"` +} + +func (x *RecordListResp) Reset() { + *x = RecordListResp{} + if protoimpl.UnsafeEnabled { + mi := &file_pb_exhibition_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RecordListResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecordListResp) ProtoMessage() {} + +func (x *RecordListResp) ProtoReflect() protoreflect.Message { + mi := &file_pb_exhibition_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecordListResp.ProtoReflect.Descriptor instead. +func (*RecordListResp) Descriptor() ([]byte, []int) { + return file_pb_exhibition_proto_rawDescGZIP(), []int{4} +} + +func (x *RecordListResp) GetData() []*RegisterInfo { + if x != nil { + return x.Data + } + return nil +} + +func (x *RecordListResp) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + +func (x *RecordListResp) GetPage() int32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *RecordListResp) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *RecordListResp) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +type ExportRecordReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ExportRecordReq) Reset() { + *x = ExportRecordReq{} + if protoimpl.UnsafeEnabled { + mi := &file_pb_exhibition_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExportRecordReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportRecordReq) ProtoMessage() {} + +func (x *ExportRecordReq) ProtoReflect() protoreflect.Message { + mi := &file_pb_exhibition_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportRecordReq.ProtoReflect.Descriptor instead. +func (*ExportRecordReq) Descriptor() ([]byte, []int) { + return file_pb_exhibition_proto_rawDescGZIP(), []int{5} +} + +type ExportInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ArtistName string `protobuf:"bytes,3,opt,name=artistName,proto3" json:"artistName"` + Gender int32 `protobuf:"varint,4,opt,name=gender,proto3" json:"gender"` + PhoneNum string `protobuf:"bytes,5,opt,name=phoneNum,proto3" json:"phoneNum"` + IdCard string `protobuf:"bytes,6,opt,name=idCard,proto3" json:"idCard"` + Address string `protobuf:"bytes,7,opt,name=address,proto3" json:"address"` + IdCardPhoto string `protobuf:"bytes,8,opt,name=idCardPhoto,proto3" json:"idCardPhoto"` + ArtistPhoto string `protobuf:"bytes,9,opt,name=artistPhoto,proto3" json:"artistPhoto"` + CreatedAt string `protobuf:"bytes,10,opt,name=createdAt,proto3" json:"createdAt"` + UpdatedAt string `protobuf:"bytes,11,opt,name=updatedAt,proto3" json:"updatedAt"` +} + +func (x *ExportInfo) Reset() { + *x = ExportInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_pb_exhibition_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExportInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportInfo) ProtoMessage() {} + +func (x *ExportInfo) ProtoReflect() protoreflect.Message { + mi := &file_pb_exhibition_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportInfo.ProtoReflect.Descriptor instead. +func (*ExportInfo) Descriptor() ([]byte, []int) { + return file_pb_exhibition_proto_rawDescGZIP(), []int{6} +} + +func (x *ExportInfo) GetArtistName() string { + if x != nil { + return x.ArtistName + } + return "" +} + +func (x *ExportInfo) GetGender() int32 { + if x != nil { + return x.Gender + } + return 0 +} + +func (x *ExportInfo) GetPhoneNum() string { + if x != nil { + return x.PhoneNum + } + return "" +} + +func (x *ExportInfo) GetIdCard() string { + if x != nil { + return x.IdCard + } + return "" +} + +func (x *ExportInfo) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *ExportInfo) GetIdCardPhoto() string { + if x != nil { + return x.IdCardPhoto + } + return "" +} + +func (x *ExportInfo) GetArtistPhoto() string { + if x != nil { + return x.ArtistPhoto + } + return "" +} + +func (x *ExportInfo) GetCreatedAt() string { + if x != nil { + return x.CreatedAt + } + return "" +} + +func (x *ExportInfo) GetUpdatedAt() string { + if x != nil { + return x.UpdatedAt + } + return "" +} + +type ExportRecordResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []*ExportInfo `protobuf:"bytes,1,rep,name=data,proto3" json:"data"` + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg"` +} + +func (x *ExportRecordResp) Reset() { + *x = ExportRecordResp{} + if protoimpl.UnsafeEnabled { + mi := &file_pb_exhibition_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExportRecordResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportRecordResp) ProtoMessage() {} + +func (x *ExportRecordResp) ProtoReflect() protoreflect.Message { + mi := &file_pb_exhibition_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportRecordResp.ProtoReflect.Descriptor instead. +func (*ExportRecordResp) Descriptor() ([]byte, []int) { + return file_pb_exhibition_proto_rawDescGZIP(), []int{7} +} + +func (x *ExportRecordResp) GetData() []*ExportInfo { + if x != nil { + return x.Data + } + return nil +} + +func (x *ExportRecordResp) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +var File_pb_exhibition_proto protoreflect.FileDescriptor + +var file_pb_exhibition_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x70, 0x62, 0x2f, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x1a, 0x12, 0x70, 0x62, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x70, 0x62, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb8, 0x02, 0x0a, 0x0c, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, + 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, + 0x4e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, + 0x4e, 0x75, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x50, + 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x43, 0x61, + 0x72, 0x64, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, + 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x72, + 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x2a, 0x0a, 0x16, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, + 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, + 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x59, 0x0a, + 0x0d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, + 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, + 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, + 0x67, 0x22, 0x11, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x52, 0x65, 0x71, 0x22, 0x92, 0x02, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x64, 0x43, 0x61, 0x72, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x43, + 0x61, 0x72, 0x64, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x61, + 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x50, 0x0a, 0x10, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x78, + 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x32, 0xc4, 0x02, 0x0a, 0x0a, + 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x0a, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x1a, 0x1a, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, + 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x22, + 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x61, 0x76, 0x65, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x51, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1b, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x78, 0x68, 0x69, 0x62, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_pb_exhibition_proto_rawDescOnce sync.Once + file_pb_exhibition_proto_rawDescData = file_pb_exhibition_proto_rawDesc +) + +func file_pb_exhibition_proto_rawDescGZIP() []byte { + file_pb_exhibition_proto_rawDescOnce.Do(func() { + file_pb_exhibition_proto_rawDescData = protoimpl.X.CompressGZIP(file_pb_exhibition_proto_rawDescData) + }) + return file_pb_exhibition_proto_rawDescData +} + +var file_pb_exhibition_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_pb_exhibition_proto_goTypes = []interface{}{ + (*RegisterInfo)(nil), // 0: exhibition.RegisterInfo + (*SaveRegisterRecordResp)(nil), // 1: exhibition.SaveRegisterRecordResp + (*CheckPhoneResp)(nil), // 2: exhibition.CheckPhoneResp + (*RecordListReq)(nil), // 3: exhibition.RecordListReq + (*RecordListResp)(nil), // 4: exhibition.RecordListResp + (*ExportRecordReq)(nil), // 5: exhibition.ExportRecordReq + (*ExportInfo)(nil), // 6: exhibition.ExportInfo + (*ExportRecordResp)(nil), // 7: exhibition.ExportRecordResp +} +var file_pb_exhibition_proto_depIdxs = []int32{ + 0, // 0: exhibition.CheckPhoneResp.data:type_name -> exhibition.RegisterInfo + 0, // 1: exhibition.RecordListResp.data:type_name -> exhibition.RegisterInfo + 6, // 2: exhibition.ExportRecordResp.data:type_name -> exhibition.ExportInfo + 0, // 3: exhibition.Exhibition.CheckPhone:input_type -> exhibition.RegisterInfo + 0, // 4: exhibition.Exhibition.SaveRegisterRecord:input_type -> exhibition.RegisterInfo + 3, // 5: exhibition.Exhibition.RegisterRecordList:input_type -> exhibition.RecordListReq + 5, // 6: exhibition.Exhibition.ExportRegisterRecord:input_type -> exhibition.ExportRecordReq + 2, // 7: exhibition.Exhibition.CheckPhone:output_type -> exhibition.CheckPhoneResp + 1, // 8: exhibition.Exhibition.SaveRegisterRecord:output_type -> exhibition.SaveRegisterRecordResp + 4, // 9: exhibition.Exhibition.RegisterRecordList:output_type -> exhibition.RecordListResp + 7, // 10: exhibition.Exhibition.ExportRegisterRecord:output_type -> exhibition.ExportRecordResp + 7, // [7:11] is the sub-list for method output_type + 3, // [3:7] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_pb_exhibition_proto_init() } +func file_pb_exhibition_proto_init() { + if File_pb_exhibition_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_pb_exhibition_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pb_exhibition_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SaveRegisterRecordResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pb_exhibition_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckPhoneResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pb_exhibition_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecordListReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pb_exhibition_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecordListResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pb_exhibition_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExportRecordReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pb_exhibition_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExportInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_pb_exhibition_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExportRecordResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_pb_exhibition_proto_rawDesc, + NumEnums: 0, + NumMessages: 8, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_pb_exhibition_proto_goTypes, + DependencyIndexes: file_pb_exhibition_proto_depIdxs, + MessageInfos: file_pb_exhibition_proto_msgTypes, + }.Build() + File_pb_exhibition_proto = out.File + file_pb_exhibition_proto_rawDesc = nil + file_pb_exhibition_proto_goTypes = nil + file_pb_exhibition_proto_depIdxs = nil +} diff --git a/api/exhibition/exhibition.validator.pb.go b/api/exhibition/exhibition.validator.pb.go new file mode 100644 index 0000000..469b08e --- /dev/null +++ b/api/exhibition/exhibition.validator.pb.go @@ -0,0 +1,62 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: pb/exhibition.proto + +package exhibition + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + _ "github.com/mwitkow/go-proto-validators" + github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators" + _ "google.golang.org/protobuf/types/descriptorpb" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +func (this *RegisterInfo) Validate() error { + return nil +} +func (this *SaveRegisterRecordResp) Validate() error { + return nil +} +func (this *CheckPhoneResp) Validate() error { + if this.Data != nil { + if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.Data); err != nil { + return github_com_mwitkow_go_proto_validators.FieldError("Data", err) + } + } + return nil +} +func (this *RecordListReq) Validate() error { + return nil +} +func (this *RecordListResp) Validate() error { + for _, item := range this.Data { + if item != nil { + if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil { + return github_com_mwitkow_go_proto_validators.FieldError("Data", err) + } + } + } + return nil +} +func (this *ExportRecordReq) Validate() error { + return nil +} +func (this *ExportInfo) Validate() error { + return nil +} +func (this *ExportRecordResp) Validate() error { + for _, item := range this.Data { + if item != nil { + if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil { + return github_com_mwitkow_go_proto_validators.FieldError("Data", err) + } + } + } + return nil +} diff --git a/api/exhibition/exhibition_triple.pb.go b/api/exhibition/exhibition_triple.pb.go new file mode 100644 index 0000000..c5390b1 --- /dev/null +++ b/api/exhibition/exhibition_triple.pb.go @@ -0,0 +1,282 @@ +// Code generated by protoc-gen-go-triple. DO NOT EDIT. +// versions: +// - protoc-gen-go-triple v1.0.5 +// - protoc v3.21.1 +// source: pb/exhibition.proto + +package exhibition + +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 + +// ExhibitionClient is the client API for Exhibition 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 ExhibitionClient interface { + CheckPhone(ctx context.Context, in *RegisterInfo, opts ...grpc_go.CallOption) (*CheckPhoneResp, common.ErrorWithAttachment) + SaveRegisterRecord(ctx context.Context, in *RegisterInfo, opts ...grpc_go.CallOption) (*SaveRegisterRecordResp, common.ErrorWithAttachment) + RegisterRecordList(ctx context.Context, in *RecordListReq, opts ...grpc_go.CallOption) (*RecordListResp, common.ErrorWithAttachment) + ExportRegisterRecord(ctx context.Context, in *ExportRecordReq, opts ...grpc_go.CallOption) (*ExportRecordResp, common.ErrorWithAttachment) +} + +type exhibitionClient struct { + cc *triple.TripleConn +} + +type ExhibitionClientImpl struct { + CheckPhone func(ctx context.Context, in *RegisterInfo) (*CheckPhoneResp, error) + SaveRegisterRecord func(ctx context.Context, in *RegisterInfo) (*SaveRegisterRecordResp, error) + RegisterRecordList func(ctx context.Context, in *RecordListReq) (*RecordListResp, error) + ExportRegisterRecord func(ctx context.Context, in *ExportRecordReq) (*ExportRecordResp, error) +} + +func (c *ExhibitionClientImpl) GetDubboStub(cc *triple.TripleConn) ExhibitionClient { + return NewExhibitionClient(cc) +} + +func (c *ExhibitionClientImpl) XXX_InterfaceName() string { + return "exhibition.Exhibition" +} + +func NewExhibitionClient(cc *triple.TripleConn) ExhibitionClient { + return &exhibitionClient{cc} +} + +func (c *exhibitionClient) CheckPhone(ctx context.Context, in *RegisterInfo, opts ...grpc_go.CallOption) (*CheckPhoneResp, common.ErrorWithAttachment) { + out := new(CheckPhoneResp) + interfaceKey := ctx.Value(constant.InterfaceKey).(string) + return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/CheckPhone", in, out) +} + +func (c *exhibitionClient) SaveRegisterRecord(ctx context.Context, in *RegisterInfo, opts ...grpc_go.CallOption) (*SaveRegisterRecordResp, common.ErrorWithAttachment) { + out := new(SaveRegisterRecordResp) + interfaceKey := ctx.Value(constant.InterfaceKey).(string) + return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/SaveRegisterRecord", in, out) +} + +func (c *exhibitionClient) RegisterRecordList(ctx context.Context, in *RecordListReq, opts ...grpc_go.CallOption) (*RecordListResp, common.ErrorWithAttachment) { + out := new(RecordListResp) + interfaceKey := ctx.Value(constant.InterfaceKey).(string) + return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/RegisterRecordList", in, out) +} + +func (c *exhibitionClient) ExportRegisterRecord(ctx context.Context, in *ExportRecordReq, opts ...grpc_go.CallOption) (*ExportRecordResp, common.ErrorWithAttachment) { + out := new(ExportRecordResp) + interfaceKey := ctx.Value(constant.InterfaceKey).(string) + return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/ExportRegisterRecord", in, out) +} + +// ExhibitionServer is the server API for Exhibition service. +// All implementations must embed UnimplementedExhibitionServer +// for forward compatibility +type ExhibitionServer interface { + CheckPhone(context.Context, *RegisterInfo) (*CheckPhoneResp, error) + SaveRegisterRecord(context.Context, *RegisterInfo) (*SaveRegisterRecordResp, error) + RegisterRecordList(context.Context, *RecordListReq) (*RecordListResp, error) + ExportRegisterRecord(context.Context, *ExportRecordReq) (*ExportRecordResp, error) + mustEmbedUnimplementedExhibitionServer() +} + +// UnimplementedExhibitionServer must be embedded to have forward compatible implementations. +type UnimplementedExhibitionServer struct { + proxyImpl protocol.Invoker +} + +func (UnimplementedExhibitionServer) CheckPhone(context.Context, *RegisterInfo) (*CheckPhoneResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method CheckPhone not implemented") +} +func (UnimplementedExhibitionServer) SaveRegisterRecord(context.Context, *RegisterInfo) (*SaveRegisterRecordResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SaveRegisterRecord not implemented") +} +func (UnimplementedExhibitionServer) RegisterRecordList(context.Context, *RecordListReq) (*RecordListResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterRecordList not implemented") +} +func (UnimplementedExhibitionServer) ExportRegisterRecord(context.Context, *ExportRecordReq) (*ExportRecordResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExportRegisterRecord not implemented") +} +func (s *UnimplementedExhibitionServer) XXX_SetProxyImpl(impl protocol.Invoker) { + s.proxyImpl = impl +} + +func (s *UnimplementedExhibitionServer) XXX_GetProxyImpl() protocol.Invoker { + return s.proxyImpl +} + +func (s *UnimplementedExhibitionServer) XXX_ServiceDesc() *grpc_go.ServiceDesc { + return &Exhibition_ServiceDesc +} +func (s *UnimplementedExhibitionServer) XXX_InterfaceName() string { + return "exhibition.Exhibition" +} + +func (UnimplementedExhibitionServer) mustEmbedUnimplementedExhibitionServer() {} + +// UnsafeExhibitionServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ExhibitionServer will +// result in compilation errors. +type UnsafeExhibitionServer interface { + mustEmbedUnimplementedExhibitionServer() +} + +func RegisterExhibitionServer(s grpc_go.ServiceRegistrar, srv ExhibitionServer) { + s.RegisterService(&Exhibition_ServiceDesc, srv) +} + +func _Exhibition_CheckPhone_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterInfo) + 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("CheckPhone", 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 _Exhibition_SaveRegisterRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterInfo) + 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("SaveRegisterRecord", 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 _Exhibition_RegisterRecordList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) { + in := new(RecordListReq) + 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("RegisterRecordList", 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 _Exhibition_ExportRegisterRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc_go.UnaryServerInterceptor) (interface{}, error) { + in := new(ExportRecordReq) + 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("ExportRegisterRecord", 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) +} + +// Exhibition_ServiceDesc is the grpc_go.ServiceDesc for Exhibition service. +// It's only intended for direct use with grpc_go.RegisterService, +// and not to be introspected or modified (even as a copy) +var Exhibition_ServiceDesc = grpc_go.ServiceDesc{ + ServiceName: "exhibition.Exhibition", + HandlerType: (*ExhibitionServer)(nil), + Methods: []grpc_go.MethodDesc{ + { + MethodName: "CheckPhone", + Handler: _Exhibition_CheckPhone_Handler, + }, + { + MethodName: "SaveRegisterRecord", + Handler: _Exhibition_SaveRegisterRecord_Handler, + }, + { + MethodName: "RegisterRecordList", + Handler: _Exhibition_RegisterRecordList_Handler, + }, + { + MethodName: "ExportRegisterRecord", + Handler: _Exhibition_ExportRegisterRecord_Handler, + }, + }, + Streams: []grpc_go.StreamDesc{}, + Metadata: "pb/exhibition.proto", +} diff --git a/conf/dev/config.yaml b/conf/dev/config.yaml new file mode 100644 index 0000000..52e56ba --- /dev/null +++ b/conf/dev/config.yaml @@ -0,0 +1,27 @@ +system: + domain: localhost + mode: dev + node_num: 3 + port: 8086 + key: + cert: + is_https: false + cron: false + key_path: "" + cert_path: "" +redis: + db: 1 + addr: 127.0.0.1:6379 + password: 7532T6R +jaeger: + addr: 127.0.0.1:6831 + open: true +zapLog: + level: "info" + filename: "logs/exhibition-main.log" + max_size: 5 + max_age: 30 + max_backups: 30 +jwt: + key: "3Ei*^!a6^6$w^wgK" + expire: 24 \ No newline at end of file diff --git a/conf/dev/dubbogo.yaml b/conf/dev/dubbogo.yaml new file mode 100644 index 0000000..2709a4c --- /dev/null +++ b/conf/dev/dubbogo.yaml @@ -0,0 +1,55 @@ +dubbo: + registries: + meal_zk: + protocol: zookeeper + timeout: 30s + address: 127.0.0.1:2181 + consumer: + filter: tracing + request-timeout: 30s + params: + max-call-send-msg-size: 8000000 + max-call-recv-msg-size: 8000000 + references: + + logger: + zap-config: + level: error # 日志级别 + 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: "logs/runtime/meal-main.log" + # 每个日志文件长度的最大大小,单位是 MiB。默认 100MiB + maxSize: 5 + # 日志保留的最大天数(只保留最近多少天的日志) + maxAge: 30 + # 只保留最近多少个日志文件,用于控制程序总日志的大小 + maxBackups: 30 + # 是否使用本地时间,默认使用 UTC 时间 + localTime: true + # 是否压缩日志文件,压缩方法 gzip + compress: false + diff --git a/conf/prod/config.yaml b/conf/prod/config.yaml new file mode 100644 index 0000000..1cfab86 --- /dev/null +++ b/conf/prod/config.yaml @@ -0,0 +1,27 @@ +system: + domain: exhibition.szjixun.cn + mode: prod + node_num: 3 + port: 9025 + key: + cert: + is_https: false + cron: false + key_path: "" + cert_path: "" +redis: + db: 3 + addr: r-bp1mjimyh1ejg1mxclpd.redis.rds.aliyuncs.com:6379 + password: "fonchain_opv:kP6tW4tS3qB2dW4aE6uI5cX2" +jaeger: + addr: jaeger:6831 + open: true +zapLog: + level: "info" + filename: "logs/exhibition-main.log" + max_size: 5 + max_age: 30 + max_backups: 30 +jwt: + key: "tP0xXGErz4~" + expire: 24 \ No newline at end of file diff --git a/conf/prod/dubbogo.yaml b/conf/prod/dubbogo.yaml new file mode 100644 index 0000000..deb1f2d --- /dev/null +++ b/conf/prod/dubbogo.yaml @@ -0,0 +1,55 @@ +dubbo: + registries: + meal_zk: + protocol: zookeeper + timeout: 3s + address: zookeeper:2181 + consumer: + filter: tracing + request-timeout: 30s + params: + max-call-send-msg-size: 8000000 + max-call-recv-msg-size: 8000000 + references: + + logger: + zap-config: + level: error # 日志级别 + 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/meal-main.log" + # 每个日志文件长度的最大大小,单位是 MiB。默认 100MiB + maxSize: 5 + # 日志保留的最大天数(只保留最近多少天的日志) + maxAge: 30 + # 只保留最近多少个日志文件,用于控制程序总日志的大小 + maxBackups: 30 + # 是否使用本地时间,默认使用 UTC 时间 + localTime: true + # 是否压缩日志文件,压缩方法 gzip + compress: false + diff --git a/conf/test/config.yaml b/conf/test/config.yaml new file mode 100644 index 0000000..342ff31 --- /dev/null +++ b/conf/test/config.yaml @@ -0,0 +1,27 @@ +system: + domain: exhibitiontest.szjixun.cn + mode: test + node_num: 3 + port: 9025 + key: + cert: + is_https: false + cron: false + key_path: "" + cert_path: "" +redis: + db: 3 + addr: redis:6379 + password: +jaeger: + addr: "172.16.100.93:9031" + open: true +zapLog: + level: "info" + filename: "logs/exhibition-main.log" + max_size: 5 + max_age: 30 + max_backups: 30 +jwt: + key: "SxjwBuEcHg42t73" + expire: 24 \ No newline at end of file diff --git a/conf/test/dubbogo.yaml b/conf/test/dubbogo.yaml new file mode 100644 index 0000000..deb1f2d --- /dev/null +++ b/conf/test/dubbogo.yaml @@ -0,0 +1,55 @@ +dubbo: + registries: + meal_zk: + protocol: zookeeper + timeout: 3s + address: zookeeper:2181 + consumer: + filter: tracing + request-timeout: 30s + params: + max-call-send-msg-size: 8000000 + max-call-recv-msg-size: 8000000 + references: + + logger: + zap-config: + level: error # 日志级别 + 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/meal-main.log" + # 每个日志文件长度的最大大小,单位是 MiB。默认 100MiB + maxSize: 5 + # 日志保留的最大天数(只保留最近多少天的日志) + maxAge: 30 + # 只保留最近多少个日志文件,用于控制程序总日志的大小 + maxBackups: 30 + # 是否使用本地时间,默认使用 UTC 时间 + localTime: true + # 是否压缩日志文件,压缩方法 gzip + compress: false + diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..fd579eb --- /dev/null +++ b/go.mod @@ -0,0 +1,148 @@ +module github.com/exhibition-main + +go 1.20 + +require ( + dubbo.apache.org/dubbo-go/v3 v3.0.5 + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/dubbogo/gost v1.13.2 + github.com/dubbogo/grpc-go v1.42.10 + github.com/dubbogo/triple v1.2.2-rc2 + github.com/gin-contrib/gzip v0.0.6 + github.com/gin-contrib/pprof v1.4.0 + github.com/gin-gonic/gin v1.9.0 + github.com/go-playground/locales v0.14.1 + github.com/go-playground/universal-translator v0.18.1 + github.com/go-playground/validator/v10 v10.11.2 + github.com/go-redis/redis v6.15.9+incompatible + github.com/golang/protobuf v1.5.2 + github.com/google/wire v0.5.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/robfig/cron/v3 v3.0.1 + github.com/spf13/viper v1.7.0 + github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271 + github.com/uber/jaeger-client-go v2.30.0+incompatible + go.uber.org/zap v1.21.0 + google.golang.org/protobuf v1.28.1 +) + +require ( + cloud.google.com/go v0.65.0 // indirect + contrib.go.opencensus.io/exporter/prometheus v0.4.1 // 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/aliyun/alibaba-cloud-sdk-go v1.61.1704 // indirect + github.com/apache/dubbo-getty v1.4.9-0.20221022181821-4dc6252ce98c // indirect + github.com/apache/dubbo-go-hessian2 v1.11.5 // 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.8.0 // indirect + github.com/census-instrumentation/opencensus-proto v0.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4 // indirect + github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 // 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.1 // indirect + github.com/dlclark/regexp2 v1.7.0 // indirect + github.com/dubbogo/go-zookeeper v1.0.4-0.20211212162352-f9d2183d89d5 // indirect + github.com/emicklei/go-restful/v3 v3.10.1 // indirect + github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 // indirect + github.com/envoyproxy/protoc-gen-validate v0.1.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-co-op/gocron v1.9.0 // indirect + github.com/go-errors/errors v1.0.1 // indirect + github.com/go-kit/log v0.1.0 // indirect + github.com/go-logfmt/logfmt v0.5.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-resty/resty/v2 v2.7.0 // indirect + github.com/goccy/go-json v0.10.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.3.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/hcl v1.0.0 // indirect + github.com/hashicorp/vault/sdk v0.7.0 // indirect + github.com/jinzhu/copier v0.3.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.0.9 // indirect + github.com/knadh/koanf v1.5.0 // indirect + github.com/leodido/go-urn v1.2.1 // 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.7 // indirect + github.com/mattn/go-isatty v0.0.17 // 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 v1.1.4 // indirect + github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 // indirect + github.com/pelletier/go-toml v1.7.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pierrec/lz4 v2.5.2+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.12.2 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/statsd_exporter v0.21.0 // indirect + github.com/shirou/gopsutil/v3 v3.22.2 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/afero v1.1.2 // indirect + github.com/spf13/cast v1.3.0 // indirect + github.com/spf13/jwalterweatherman v1.0.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.2.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.9 // indirect + github.com/yusufpapurcu/wmi v1.2.2 // indirect + go.etcd.io/etcd/api/v3 v3.5.7 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.7 // indirect + go.etcd.io/etcd/client/v3 v3.5.7 // indirect + go.opencensus.io v0.23.0 // indirect + go.opentelemetry.io/otel v1.11.0 // indirect + go.opentelemetry.io/otel/trace v1.11.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + golang.org/x/crypto v0.5.0 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect + google.golang.org/appengine v1.6.6 // indirect + google.golang.org/genproto v0.0.0-20220504150022-98cd25cafc72 // indirect + google.golang.org/grpc v1.51.0 // indirect + gopkg.in/ini.v1 v1.66.2 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/internal/config/app_config.go b/internal/config/app_config.go new file mode 100644 index 0000000..2e26893 --- /dev/null +++ b/internal/config/app_config.go @@ -0,0 +1,69 @@ +package config + +import ( + "dubbo.apache.org/dubbo-go/v3/common/constant" + "fmt" + "github.com/exhibition-main/internal/model" + "github.com/spf13/viper" + "os" +) + +var Data = new(AppConfig) + +type AppConfig struct { + System struct { + Domain string + Mode string + NodeNum int32 + Port int32 + KeyPath string `mapstructure:"key_path"` + CertPath string `mapstructure:"cert_path"` + IsHttps bool `mapstructure:"is_https"` + Cron bool + } + Redis struct { + Db uint8 + Addr string + Password string + } + + ZapLog struct { + Level string `mapstructure:"level"` + Filename string `mapstructure:"filename"` + MaxSize int `mapstructure:"max_size"` + MaxAge int `mapstructure:"max_age"` + MaxBackups int `mapstructure:"max_backups"` + } + Jaeger struct { + Addr string + Open bool + } + Jwt struct { + Key string + Expire int32 + } +} + +func GetConf() (iniConf string, err error) { + if os.Getenv(model.MODE_ENV) != "" { + if err = os.Setenv(constant.ConfigFileEnvKey, fmt.Sprintf("./conf/%s/%s", os.Getenv(model.MODE_ENV), model.SERVER_DUBBOGO_CONFIG)); err != nil { + return + } + } + iniConf = fmt.Sprintf("./conf/%s/%s", os.Getenv(model.MODE_ENV), model.SERVER_CONFIG) + return +} + +func GetOptions() { + iniConf, err := GetConf() + 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()) + } + +} diff --git a/internal/filter/authfilter.go b/internal/filter/authfilter.go new file mode 100644 index 0000000..cddc517 --- /dev/null +++ b/internal/filter/authfilter.go @@ -0,0 +1,38 @@ +package filter + +import ( + "context" + "fmt" + + "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.SetFilter("authFilter", NewAuthFilter) +} + +func NewAuthFilter() filter.Filter { + return &AuthFilter{} +} + +type AuthFilter struct { +} + +func (f *AuthFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result { + + //xxx 接收凭证 + invocation.SetAttachment("usertoken", "this is jwt token") + return invoker.Invoke(ctx, invocation) +} + +func (f *AuthFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, protocol protocol.Invocation) protocol.Result { + fmt.Println("AuthFilter OnResponse is called") + myAttachmentMap := make(map[string]interface{}) + myAttachmentMap["key1"] = "value1" + myAttachmentMap["key2"] = []string{"value1", "value2"} + result.SetAttachments(myAttachmentMap) + fmt.Printf("result %v--", result) + return result +} diff --git a/internal/middleware/auth.go b/internal/middleware/auth.go new file mode 100644 index 0000000..7058fb3 --- /dev/null +++ b/internal/middleware/auth.go @@ -0,0 +1,53 @@ +package middleware + +import ( + "github.com/exhibition-main/internal/model" + "github.com/exhibition-main/internal/msg" + "github.com/exhibition-main/internal/response" + "github.com/exhibition-main/pkg/jwt" + "github.com/gin-gonic/gin" + + "strings" +) + +// JWTAuthMiddleware 基于JWT的认证中间件 +func JWTAuthMiddleware() func(c *gin.Context) { + return func(c *gin.Context) { + authHeader := c.Request.Header.Get("Authorization") + if authHeader == "" { + response.ResponseQuickMsg(c, msg.Fail, msg.NEED_LOGIN, nil) + c.Abort() + return + } + // 按空格分割 + parts := strings.SplitN(authHeader, " ", 2) + if !(len(parts) == 2 && parts[0] == "Bearer") { + response.ResponseMsg(c, msg.StatusUnauthorized, model.Response{ + Status: msg.Fail, + Data: nil, + Msg: msg.NEED_LOGIN, + }) + c.Abort() + return + } + // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它 + jwtInfo, err := jwt.ParseToken(parts[1]) + if err != nil { + response.ResponseMsg(c, msg.StatusUnauthorized, model.Response{ + Status: msg.Fail, + Data: nil, + Msg: msg.INVALID_TOKEN, + }) + c.Abort() + return + } + // 将当前请求的userID信息保存到请求的上下文c上 + c.Set(model.CTX_USER_INFO, jwt.MyClaims{ + UserId: jwtInfo.UserId, + Nickname: jwtInfo.Nickname, + Phone: jwtInfo.Phone, + Openid: jwtInfo.Openid, + }) + c.Next() // 后续的处理请求的函数中 可以用过c.Get(CtxUserIDKey) 来获取当前请求的用户信息 + } +} diff --git a/internal/middleware/cors.go b/internal/middleware/cors.go new file mode 100644 index 0000000..a78628b --- /dev/null +++ b/internal/middleware/cors.go @@ -0,0 +1,48 @@ +package middleware + +import ( + "fmt" + "net/http" + "strings" + + "github.com/gin-gonic/gin" +) + +// 跨域 +func Cors() gin.HandlerFunc { + return func(c *gin.Context) { + method := c.Request.Method //请求方法 + origin := c.Request.Header.Get("Origin") //请求头部 + var headerKeys []string // 声明请求头keys + for k := range c.Request.Header { + headerKeys = append(headerKeys, k) + } + headerStr := strings.Join(headerKeys, ", ") + if headerStr != "" { + headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr) + } else { + headerStr = "access-control-allow-origin, access-control-allow-headers" + } + if origin != "" { + c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + c.Header("Access-Control-Allow-Origin", "*") // 这是允许访问所有域 + c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") //服务器支持的所有跨域请求的方法,为了避免浏览次请求的多次'预检'请求 + // header的类型 + c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma") + // 允许跨域设置 可以返回其他子段 + c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar") // 跨域关键设置 让浏览器可以解析 + c.Header("Access-Control-Max-Age", "172800") // 缓存请求信息 单位为秒 + c.Header("Access-Control-Allow-Credentials", "false") // 跨域请求是否需要带cookie信息 默认设置为true + c.Set("content-type", "application/json") + //c.Header("Access-Control-Allow-Credentials", "true") // 跨域请求是否需要带cookie信息 默认设置为true + //c.Header("Access-Control-Request-Private-Network", "true") // 跨域请求是否需要带cookie信息 默认设置为true + //c.Header("Access-Control-Allow-Private-Network", "true") // 设置返回格式是json + } + //放行所有OPTIONS方法 + if method == "OPTIONS" { + c.JSON(http.StatusOK, "Options Request!") + } + // 处理请求 + c.Next() // 处理请求 + } +} diff --git a/internal/middleware/logging.go b/internal/middleware/logging.go new file mode 100644 index 0000000..d41a3fe --- /dev/null +++ b/internal/middleware/logging.go @@ -0,0 +1,89 @@ +package middleware + +import ( + "bytes" + "github.com/gin-gonic/gin" + "go.uber.org/zap" + "io/ioutil" + "net" + "net/http" + "net/http/httputil" + "os" + "runtime/debug" + "strings" + "time" +) + +func NewLogger() gin.HandlerFunc { + return func(c *gin.Context) { + // 开始时间 + startTime := time.Now() // 处理请求 + endTime := time.Now() // 执行时间 + latencyTime := endTime.Sub(startTime) // 请求方式 + path := c.Request.URL.Path + query := c.Request.URL.RawQuery + data, _ := ioutil.ReadAll(c.Request.Body) + dataStr := string(data) + if len(dataStr) > 1000 { + // 数据太大就不记录了 + dataStr = "" + } + zap.L().Info("path", + zap.Int("status", c.Writer.Status()), + zap.String("method", c.Request.Method), + zap.String("path", path), + zap.String("query", query), + zap.Any("body", dataStr), + zap.String("ip", c.ClientIP()), + zap.String("user-agent", c.Request.UserAgent()), + zap.String("errors", c.Errors.ByType(gin.ErrorTypePrivate).String()), + zap.Duration("latencyTime", latencyTime)) + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data)) + c.Next() + } +} + +// GinRecovery recover掉项目可能出现的panic,并记录日志 +func GinRecovery(stack bool) gin.HandlerFunc { + return func(c *gin.Context) { + defer func() { + if err := recover(); err != nil { + // Check for a broken connection, as it is not really a + // condition that warrants a panic stack trace. + var brokenPipe bool + if ne, ok := err.(*net.OpError); ok { + if se, ok := ne.Err.(*os.SyscallError); ok { + if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") { + brokenPipe = true + } + } + } + httpRequest, _ := httputil.DumpRequest(c.Request, false) + if brokenPipe { + zap.L().Error(c.Request.URL.Path, + zap.Any("error", err), + zap.String("request", string(httpRequest)), + ) + // If the connection is dead, we can't write a status to it. + c.Error(err.(error)) // nolint: errcheck + c.Abort() + return + } + if stack { + zap.L().Error("[Recovery from panic]", + zap.Any("error", err), + zap.String("request", string(httpRequest)), + zap.String("stack", string(debug.Stack())), + ) + } else { + zap.L().Error("[Recovery from panic]", + zap.Any("error", err), + zap.String("request", string(httpRequest)), + ) + } + c.AbortWithStatus(http.StatusInternalServerError) + } + }() + c.Next() + } +} diff --git a/internal/model/common.go b/internal/model/common.go new file mode 100644 index 0000000..18e8e0d --- /dev/null +++ b/internal/model/common.go @@ -0,0 +1,19 @@ +package model + +const ( + SERVER_CONFIG = "config.yaml" + SERVER_DUBBOGO_CONFIG = "dubbogo.yaml" + MODE_ENV = "MODE_ENV" +) + +type Response struct { + Status int `json:"status"` + Data interface{} `json:"data"` + Msg string `json:"msg"` +} + +type PageInfo struct { + Page int32 `json:"page" query:"page"` + PageSize int32 `json:"pageSize" query:"pageSize"` + Total int32 `json:"total"` +} diff --git a/internal/model/user.go b/internal/model/user.go new file mode 100644 index 0000000..bbc24d7 --- /dev/null +++ b/internal/model/user.go @@ -0,0 +1,12 @@ +package model + +const ( + CTX_USER_INFO = "userinfo" +) + +type UserInfo struct { + UserId int64 `json:"userId"` + CountryCode string `json:"countryCode"` + Phone string `json:"phone"` + Identity int32 `json:"identity"` +} diff --git a/internal/msg/code.go b/internal/msg/code.go new file mode 100644 index 0000000..bbbd908 --- /dev/null +++ b/internal/msg/code.go @@ -0,0 +1,33 @@ +package msg + +const ( + Ok = 0 + Fail = 1 +) + +const ( + StatusContinue = 100 // 继续 + StatusSwitchingProtocols = 101 // 切换协议 + StatusOK = 200 // 成功 + StatusCreated = 201 // 已创建 + StatusAccepted = 202 // 已接受 + StatusNonAuthoritative = 203 // 非权威性信息 + StatusNoContent = 204 // 无内容 + StatusResetContent = 205 // 重置内容 + StatusPartialContent = 206 // 部分内容 + StatusMultipleChoices = 300 // 多种选择 + StatusMovedPermanently = 301 // 永久移动 + StatusFound = 302 // 临时移动 + StatusSeeOther = 303 // 查看其他位置 + StatusNotModified = 304 // 未修改 + StatusUseProxy = 305 // 使用代理 + StatusTemporaryRedirect = 307 // 临时重定向 + StatusBadRequest = 400 // 错误请求 + StatusUnauthorized = 401 // 未经授权 + StatusForbidden = 403 // 禁止访问 + StatusNotFound = 404 // 未找到 + StatusMethodNotAllowed = 405 // 方法不允许 + StatusConflict = 409 // 冲突 + StatusInternalServerError = 500 // 服务器内部错误 + StatusServiceUnavailable = 503 // 服务不可用 +) diff --git a/internal/msg/message.go b/internal/msg/message.go new file mode 100644 index 0000000..dff71ed --- /dev/null +++ b/internal/msg/message.go @@ -0,0 +1,28 @@ +package msg + +const ( + FAIL = "操作失败" + SUCCESS = "操作成功" + + ERROR_LOGIN = "账号或密码错误" + ERROR_JSON_PARSE = "json解析失败" + ERROR_JSON_MARSHAL = "json序列化失败" + ERROR_FOR_UPDATE = "锁定错误" + ERROR_INSERT = "插入异常" + ERROR_DELETE = "删除异常" + ERROR_UPDATE = "更新异常" + ERROR_SELECT = "查询异常" + ERROR_EMPTY_PARAM = "值为空" + ERROR_COPIER_STRUCT = "拷贝结构体错误" + ERROR_NO_ACTION = "无需操作" + ERROR_BIND_PARAM = "绑定数据失败" + + TICKET_SUBCARD_NO_ENOUGH = "次卡数量不足" + BUY_FAIL = "购买失败" + + WARNING_WAITING = "请稍后再试" + + NEED_LOGIN = "请先登录" + + INVALID_TOKEN = "token不合法" +) diff --git a/internal/response/response.go b/internal/response/response.go new file mode 100644 index 0000000..c0268b6 --- /dev/null +++ b/internal/response/response.go @@ -0,0 +1,27 @@ +package response + +import ( + "github.com/exhibition-main/internal/model" + "github.com/gin-gonic/gin" + "net/http" +) + +func ResponseMsg(c *gin.Context, httpCode int, Resp model.Response) { + if httpCode == 0 { + httpCode = http.StatusOK + } + c.JSON(httpCode, model.Response{ + Status: Resp.Status, + Msg: Resp.Msg, + Data: Resp.Data, + }) +} + +func ResponseQuickMsg(c *gin.Context, Status uint8, Msg string, Data interface{}) { + //var c gin.Context + c.JSON(http.StatusOK, model.Response{ + Status: int(Status), + Msg: Msg, + Data: Data, + }) +} diff --git a/internal/response/user.go b/internal/response/user.go new file mode 100644 index 0000000..e9964a0 --- /dev/null +++ b/internal/response/user.go @@ -0,0 +1,5 @@ +package response + +type LoginInfo struct { + Token string `json:"token"` +} diff --git a/pkg/cache/redis.go b/pkg/cache/redis.go new file mode 100644 index 0000000..3810e73 --- /dev/null +++ b/pkg/cache/redis.go @@ -0,0 +1,32 @@ +package cache + +import ( + "github.com/dubbogo/gost/log/logger" + appConfig "github.com/exhibition-main/internal/config" + "github.com/go-redis/redis" + "github.com/google/wire" +) + +var RedisProvider = wire.NewSet(NewRedis) + +// TODO 添加连接池 + +// RedisClient Redis缓存客户端单例 +var ( + RedisClient *redis.Client + //RedisDbName string +) + +func NewRedis() *redis.Client { + RedisClient = redis.NewClient(&redis.Options{ + Addr: appConfig.Data.Redis.Addr, + Password: appConfig.Data.Redis.Password, + DB: int(appConfig.Data.Redis.Db), + }) + _, err := RedisClient.Ping().Result() + if err != nil { + logger.Errorf("connRedis err", err) + panic(err) + } + return RedisClient +} diff --git a/pkg/jwt/jwt.go b/pkg/jwt/jwt.go new file mode 100644 index 0000000..117020b --- /dev/null +++ b/pkg/jwt/jwt.go @@ -0,0 +1,55 @@ +package jwt + +import ( + "errors" + "github.com/exhibition-main/internal/msg" + "time" + + "github.com/spf13/viper" + + "github.com/dgrijalva/jwt-go" +) + +var mySecret = []byte(viper.GetString("jwt.key")) + +type MyClaims struct { + UserId int64 `json:"userId"` + Nickname string `json:"nickname"` + Phone string `json:"phone"` + Openid string `json:"openid"` + jwt.StandardClaims +} + +// GenToken 生成JWT +func GenToken(userId int64, nickname string, phone string, openid string) (string, error) { + // 创建一个我们自己的声明的数据 + c := MyClaims{ + userId, + nickname, + phone, + openid, + jwt.StandardClaims{ + ExpiresAt: time.Now().Add( + time.Duration(viper.GetInt("jwt.expire")) * time.Hour).Unix(), + Issuer: "meal", + }, + } + token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) + return token.SignedString(mySecret) +} + +// ParseToken 解析JWT +func ParseToken(tokenString string) (*MyClaims, error) { + // 解析token + var mc = new(MyClaims) + token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) { + return mySecret, nil + }) + if err != nil { + return nil, err + } + if token.Valid { // 校验token + return mc, nil + } + return nil, errors.New(msg.INVALID_TOKEN) +} diff --git a/pkg/logger/zap.go b/pkg/logger/zap.go new file mode 100644 index 0000000..1b38b49 --- /dev/null +++ b/pkg/logger/zap.go @@ -0,0 +1,65 @@ +package logger + +import ( + "fmt" + "github.com/google/wire" + "os" + + appConfig "github.com/exhibition-main/internal/config" + + "github.com/natefinch/lumberjack" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +var lg *zap.Logger + +var Provider = wire.NewSet(ZapInit) + +// ZapInit 初始化lg +func ZapInit() *zap.Logger { + var err error + c := appConfig.Data + fmt.Println(c) + writeSyncer := getLogWriter(appConfig.Data.ZapLog.Filename, appConfig.Data.ZapLog.MaxSize, appConfig.Data.ZapLog.MaxBackups, appConfig.Data.ZapLog.MaxAge) + encoder := getEncoder() + var l = new(zapcore.Level) + err = l.UnmarshalText([]byte(appConfig.Data.ZapLog.Level)) + if err != nil { + return nil + } + var core zapcore.Core + if appConfig.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) +} diff --git a/pkg/router/router.go b/pkg/router/router.go new file mode 100644 index 0000000..c0594ac --- /dev/null +++ b/pkg/router/router.go @@ -0,0 +1,73 @@ +package router + +import ( + "github.com/exhibition-main/internal/middleware" + "net/http" + + "github.com/gin-contrib/gzip" + "github.com/gin-contrib/pprof" + "github.com/gin-gonic/gin" +) + +// 路由配置 +func NewRouter() *gin.Engine { + //使用默认gin路由 + r := gin.Default() + r.Use(gzip.Gzip(gzip.DefaultCompression)) + //加入日志中间件,跨域中间件 + r.Use(middleware.NewLogger(), middleware.Cors(), middleware.GinRecovery(true)) + //noAuth := r.Group("") + auth := r.Group("") + auth.Use(middleware.JWTAuthMiddleware()) + //userAuth := auth.Group("user") + //{ + // userAuth.POST("info", api.UserInfo) + // userAuth.POST("tickets", api.Tickets) + // userAuth.POST("login-out", api.LoginOut) + // userAuth.POST("destroy", api.Destroy) + //} + //userNoAuth := noAuth.Group("user") + //{ + // userNoAuth.POST("login", api.Login) + //} + //goodsAuth := auth.Group("goods") + //{ + // goodsAuth.POST("drink-list", api.DrinkList) + // goodsAuth.POST("ticket-list", api.TickerList) + // goodsAuth.POST("set-meal-list", api.SetMealList) + //} + // + //orderAuth := auth.Group("order") + //{ + // orderAuth.POST("buy-goods", api.BuyGoods) + // orderAuth.POST("buy-tickets", api.BuyTicket) + // orderAuth.POST("buy-balance", api.BuyBalance) + // orderAuth.POST("buy-set-meal", api.BuySetMeal) + // orderAuth.POST("history-goods", api.HistoryGoods) + // orderAuth.POST("history-tickets", api.HistoryTickets) + // orderAuth.POST("history-balance", api.HistoryBalance) + //} + // + //orderNoAuth := noAuth.Group("order") + //{ + // orderNoAuth.POST("wx_callback", api.WxCallback) + // orderAuth.POST("order-data-h5", api.OrderDataH5) + // orderAuth.POST("update-h5-order", api.UpdateH5Order) + //} + // + //miniNoAuth := noAuth.Group("mini") + //{ + // miniNoAuth.POST("url-scheme", api.UrlScheme) + //} + + //静态文件 + r.StaticFS("/static", http.Dir("./runtime")) + r.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "status": 1, + "msg": "不存在的路由", + }) + }) + pprof.Register(r) + return r +} diff --git a/pkg/service/init.go b/pkg/service/init.go new file mode 100644 index 0000000..cb94d9c --- /dev/null +++ b/pkg/service/init.go @@ -0,0 +1,17 @@ +package service + +import ( + "dubbo.apache.org/dubbo-go/v3/config" + _ "dubbo.apache.org/dubbo-go/v3/imports" + appConfig "github.com/exhibition-main/internal/config" +) + +//var GrpcAccountClientImpl = new(account.AccountClientImpl) + +func init() { + //config.SetConsumerService(GrpcAccountClientImpl) + appConfig.GetOptions() + if err := config.Load(); err != nil { + panic(err) + } +} diff --git a/pkg/service/register_record.go b/pkg/service/register_record.go new file mode 100644 index 0000000..6d43c33 --- /dev/null +++ b/pkg/service/register_record.go @@ -0,0 +1 @@ +package service diff --git a/pkg/tracing/jaeger.go b/pkg/tracing/jaeger.go new file mode 100644 index 0000000..f3c82ce --- /dev/null +++ b/pkg/tracing/jaeger.go @@ -0,0 +1,50 @@ +package tracing + +import ( + appConfig "github.com/exhibition-main/internal/config" + "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" + "io" + "time" +) + +var Provider = wire.NewSet(NewTracing) + +type JaegerProvider struct { + Tracer opentracing.Tracer + Closer io.Closer +} + +var JaegerPoint *JaegerProvider + +func NewTracing() (jaegerProvider *JaegerProvider) { + if !appConfig.Data.Jaeger.Open { + return + } + jaegerProvider = &JaegerProvider{} + cfg := jaegerConfig.Configuration{ + ServiceName: "fonchain-baidu", + Sampler: &jaegerConfig.SamplerConfig{ + Type: jaeger.SamplerTypeRemote, + Param: 1, + }, + Reporter: &jaegerConfig.ReporterConfig{ + LocalAgentHostPort: appConfig.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 +} diff --git a/pkg/utils/user.go b/pkg/utils/user.go new file mode 100644 index 0000000..d470be8 --- /dev/null +++ b/pkg/utils/user.go @@ -0,0 +1,19 @@ +package utils + +import ( + "errors" + "github.com/exhibition-main/internal/model" + "github.com/exhibition-main/internal/msg" + "github.com/exhibition-main/pkg/jwt" + "github.com/gin-gonic/gin" +) + +func GetJwtInfo(ctx *gin.Context) (jwtInfo jwt.MyClaims, err error) { + val, ok := ctx.Get(model.CTX_USER_INFO) + if !ok { + err = errors.New(msg.NEED_LOGIN) + return + } + jwtInfo = val.(jwt.MyClaims) + return +} diff --git a/pkg/utils/validator.go b/pkg/utils/validator.go new file mode 100644 index 0000000..bdb47ea --- /dev/null +++ b/pkg/utils/validator.go @@ -0,0 +1,63 @@ +package utils + +import ( + "fmt" + "reflect" + "strings" + + "github.com/gin-gonic/gin/binding" + "github.com/go-playground/locales/en" + "github.com/go-playground/locales/zh" + ut "github.com/go-playground/universal-translator" + "github.com/go-playground/validator/v10" + enTranslations "github.com/go-playground/validator/v10/translations/en" + zhTranslations "github.com/go-playground/validator/v10/translations/zh" +) + +var Trans ut.Translator + +// InitTrans 初始化翻译器 +func InitTrans(locale string) (err error) { + // 修改gin框架中的Validator引擎属性,实现自定制 + if v, ok := binding.Validator.Engine().(*validator.Validate); ok { + // 注册一个获取json tag的自定义方法 + v.RegisterTagNameFunc(func(fld reflect.StructField) string { + name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0] + if name == "-" { + return "" + } + return name + }) + // 为SignUpParam注册自定义校验方法 + zhT := zh.New() // 中文翻译器 + enT := en.New() // 英文翻译器 + uni := ut.New(enT, zhT, enT) + var ok bool + // 也可以使用 uni.FindTranslator(...) 传入多个locale进行查找 + Trans, ok = uni.GetTranslator(locale) + if !ok { + return fmt.Errorf("uni.GetTranslator(%s) failed", locale) + } + + // 注册翻译器 + switch locale { + case "en": + err = enTranslations.RegisterDefaultTranslations(v, Trans) + case "zh": + err = zhTranslations.RegisterDefaultTranslations(v, Trans) + default: + err = enTranslations.RegisterDefaultTranslations(v, Trans) + } + return + } + return +} + +// RemoveTopStruct 去除提示信息中的结构体名称 +func RemoveTopStruct(fields map[string]string) map[string]string { + res := map[string]string{} + for field, err := range fields { + res[field[strings.Index(field, ".")+1:]] = err + } + return res +}