Compare commits

...

23 Commits

Author SHA1 Message Date
1456264d1e Merge remote-tracking branch 'origin/main' 2024-02-23 16:11:10 +08:00
fc73a6c806 更新 2024-02-23 15:34:27 +08:00
21a88e5418 更新 2024-02-23 11:25:13 +08:00
40f8c1392b 更新 2024-02-22 12:41:42 +08:00
817ec9cb11 更新 2024-02-22 12:14:35 +08:00
584b4b558a 更新 2024-02-22 11:59:47 +08:00
904bee84bb 更新 2024-02-21 11:56:38 +08:00
838e55ccb2 更新 2024-02-20 14:26:34 +08:00
9fda485552 更新 2024-02-20 14:11:41 +08:00
bd813dfb38 更新 2024-02-20 11:35:43 +08:00
ea79c8d734 更新 2024-02-19 15:23:26 +08:00
640f303aec 更新 2024-02-19 14:37:59 +08:00
90e942e61f 更新 2024-02-19 13:54:38 +08:00
ee9737442f 更新 2024-02-19 11:09:35 +08:00
d843145c0e 更新 2024-02-19 10:45:33 +08:00
gy
ccead6dc90 feat 2024-02-18 16:49:29 +08:00
8128f0e90a 更新 'pkg/router/router.go' 2024-02-18 16:46:02 +08:00
93065cb890 Merge branch 'wp' into dev 2024-02-18 16:11:09 +08:00
962ab2b152 更新 2024-02-18 16:10:34 +08:00
0436c7ee39 Merge branch 'wp' into dev 2024-02-18 15:21:18 +08:00
d319e24c8b 更新 2024-02-18 15:20:51 +08:00
fe437e57e7 更新 2024-02-18 15:10:17 +08:00
a5a40851b3 更新 2024-02-18 14:50:45 +08:00
20 changed files with 897 additions and 275 deletions

View File

@ -34,11 +34,14 @@ type RegisterInfo struct {
PhoneNum string `protobuf:"bytes,5,opt,name=phoneNum,proto3" json:"phoneNum"` PhoneNum string `protobuf:"bytes,5,opt,name=phoneNum,proto3" json:"phoneNum"`
IdCard string `protobuf:"bytes,6,opt,name=idCard,proto3" json:"idCard"` IdCard string `protobuf:"bytes,6,opt,name=idCard,proto3" json:"idCard"`
Address string `protobuf:"bytes,7,opt,name=address,proto3" json:"address"` Address string `protobuf:"bytes,7,opt,name=address,proto3" json:"address"`
IdCardPhoto string `protobuf:"bytes,8,opt,name=idCardPhoto,proto3" json:"idCardPhoto"` Address1 string `protobuf:"bytes,8,opt,name=address1,proto3" json:"address1"`
IdCardBackPhoto string `protobuf:"bytes,9,opt,name=idCardBackPhoto,proto3" json:"idCardBackPhoto"` IdCardPhoto string `protobuf:"bytes,9,opt,name=idCardPhoto,proto3" json:"idCardPhoto"`
ArtistPhoto string `protobuf:"bytes,10,opt,name=artistPhoto,proto3" json:"artistPhoto"` IdCardBackPhoto string `protobuf:"bytes,10,opt,name=idCardBackPhoto,proto3" json:"idCardBackPhoto"`
CreatedAt string `protobuf:"bytes,11,opt,name=createdAt,proto3" json:"createdAt"` ArtistPhoto string `protobuf:"bytes,11,opt,name=artistPhoto,proto3" json:"artistPhoto"`
UpdatedAt string `protobuf:"bytes,12,opt,name=updatedAt,proto3" json:"updatedAt"` CreatedAt string `protobuf:"bytes,12,opt,name=createdAt,proto3" json:"createdAt"`
UpdatedAt string `protobuf:"bytes,13,opt,name=updatedAt,proto3" json:"updatedAt"`
IdCardStartDate string `protobuf:"bytes,14,opt,name=idCardStartDate,proto3" json:"idCardStartDate"`
IdCardEndDate string `protobuf:"bytes,15,opt,name=idCardEndDate,proto3" json:"idCardEndDate"`
} }
func (x *RegisterInfo) Reset() { func (x *RegisterInfo) Reset() {
@ -122,6 +125,13 @@ func (x *RegisterInfo) GetAddress() string {
return "" return ""
} }
func (x *RegisterInfo) GetAddress1() string {
if x != nil {
return x.Address1
}
return ""
}
func (x *RegisterInfo) GetIdCardPhoto() string { func (x *RegisterInfo) GetIdCardPhoto() string {
if x != nil { if x != nil {
return x.IdCardPhoto return x.IdCardPhoto
@ -157,6 +167,20 @@ func (x *RegisterInfo) GetUpdatedAt() string {
return "" return ""
} }
func (x *RegisterInfo) GetIdCardStartDate() string {
if x != nil {
return x.IdCardStartDate
}
return ""
}
func (x *RegisterInfo) GetIdCardEndDate() string {
if x != nil {
return x.IdCardEndDate
}
return ""
}
type SaveRegisterRecordResp struct { type SaveRegisterRecordResp struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
@ -275,6 +299,53 @@ func (x *CheckPhoneResp) GetData() *RegisterInfo {
return nil return nil
} }
type CheckIdCardResp struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg"`
}
func (x *CheckIdCardResp) Reset() {
*x = CheckIdCardResp{}
if protoimpl.UnsafeEnabled {
mi := &file_pb_exhibition_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CheckIdCardResp) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CheckIdCardResp) ProtoMessage() {}
func (x *CheckIdCardResp) 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 CheckIdCardResp.ProtoReflect.Descriptor instead.
func (*CheckIdCardResp) Descriptor() ([]byte, []int) {
return file_pb_exhibition_proto_rawDescGZIP(), []int{3}
}
func (x *CheckIdCardResp) GetMsg() string {
if x != nil {
return x.Msg
}
return ""
}
type RecordListReq struct { type RecordListReq struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
@ -290,7 +361,7 @@ type RecordListReq struct {
func (x *RecordListReq) Reset() { func (x *RecordListReq) Reset() {
*x = RecordListReq{} *x = RecordListReq{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_pb_exhibition_proto_msgTypes[3] mi := &file_pb_exhibition_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -303,7 +374,7 @@ func (x *RecordListReq) String() string {
func (*RecordListReq) ProtoMessage() {} func (*RecordListReq) ProtoMessage() {}
func (x *RecordListReq) ProtoReflect() protoreflect.Message { func (x *RecordListReq) ProtoReflect() protoreflect.Message {
mi := &file_pb_exhibition_proto_msgTypes[3] mi := &file_pb_exhibition_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -316,7 +387,7 @@ func (x *RecordListReq) ProtoReflect() protoreflect.Message {
// Deprecated: Use RecordListReq.ProtoReflect.Descriptor instead. // Deprecated: Use RecordListReq.ProtoReflect.Descriptor instead.
func (*RecordListReq) Descriptor() ([]byte, []int) { func (*RecordListReq) Descriptor() ([]byte, []int) {
return file_pb_exhibition_proto_rawDescGZIP(), []int{3} return file_pb_exhibition_proto_rawDescGZIP(), []int{4}
} }
func (x *RecordListReq) GetKeyword() string { func (x *RecordListReq) GetKeyword() string {
@ -369,7 +440,7 @@ type RecordListResp struct {
func (x *RecordListResp) Reset() { func (x *RecordListResp) Reset() {
*x = RecordListResp{} *x = RecordListResp{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_pb_exhibition_proto_msgTypes[4] mi := &file_pb_exhibition_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -382,7 +453,7 @@ func (x *RecordListResp) String() string {
func (*RecordListResp) ProtoMessage() {} func (*RecordListResp) ProtoMessage() {}
func (x *RecordListResp) ProtoReflect() protoreflect.Message { func (x *RecordListResp) ProtoReflect() protoreflect.Message {
mi := &file_pb_exhibition_proto_msgTypes[4] mi := &file_pb_exhibition_proto_msgTypes[5]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -395,7 +466,7 @@ func (x *RecordListResp) ProtoReflect() protoreflect.Message {
// Deprecated: Use RecordListResp.ProtoReflect.Descriptor instead. // Deprecated: Use RecordListResp.ProtoReflect.Descriptor instead.
func (*RecordListResp) Descriptor() ([]byte, []int) { func (*RecordListResp) Descriptor() ([]byte, []int) {
return file_pb_exhibition_proto_rawDescGZIP(), []int{4} return file_pb_exhibition_proto_rawDescGZIP(), []int{5}
} }
func (x *RecordListResp) GetData() []*RegisterInfo { func (x *RecordListResp) GetData() []*RegisterInfo {
@ -442,7 +513,7 @@ type ExportRecordReq struct {
func (x *ExportRecordReq) Reset() { func (x *ExportRecordReq) Reset() {
*x = ExportRecordReq{} *x = ExportRecordReq{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_pb_exhibition_proto_msgTypes[5] mi := &file_pb_exhibition_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -455,7 +526,7 @@ func (x *ExportRecordReq) String() string {
func (*ExportRecordReq) ProtoMessage() {} func (*ExportRecordReq) ProtoMessage() {}
func (x *ExportRecordReq) ProtoReflect() protoreflect.Message { func (x *ExportRecordReq) ProtoReflect() protoreflect.Message {
mi := &file_pb_exhibition_proto_msgTypes[5] mi := &file_pb_exhibition_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -468,7 +539,7 @@ func (x *ExportRecordReq) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExportRecordReq.ProtoReflect.Descriptor instead. // Deprecated: Use ExportRecordReq.ProtoReflect.Descriptor instead.
func (*ExportRecordReq) Descriptor() ([]byte, []int) { func (*ExportRecordReq) Descriptor() ([]byte, []int) {
return file_pb_exhibition_proto_rawDescGZIP(), []int{5} return file_pb_exhibition_proto_rawDescGZIP(), []int{6}
} }
type ExportInfo struct { type ExportInfo struct {
@ -491,7 +562,7 @@ type ExportInfo struct {
func (x *ExportInfo) Reset() { func (x *ExportInfo) Reset() {
*x = ExportInfo{} *x = ExportInfo{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_pb_exhibition_proto_msgTypes[6] mi := &file_pb_exhibition_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -504,7 +575,7 @@ func (x *ExportInfo) String() string {
func (*ExportInfo) ProtoMessage() {} func (*ExportInfo) ProtoMessage() {}
func (x *ExportInfo) ProtoReflect() protoreflect.Message { func (x *ExportInfo) ProtoReflect() protoreflect.Message {
mi := &file_pb_exhibition_proto_msgTypes[6] mi := &file_pb_exhibition_proto_msgTypes[7]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -517,7 +588,7 @@ func (x *ExportInfo) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExportInfo.ProtoReflect.Descriptor instead. // Deprecated: Use ExportInfo.ProtoReflect.Descriptor instead.
func (*ExportInfo) Descriptor() ([]byte, []int) { func (*ExportInfo) Descriptor() ([]byte, []int) {
return file_pb_exhibition_proto_rawDescGZIP(), []int{6} return file_pb_exhibition_proto_rawDescGZIP(), []int{7}
} }
func (x *ExportInfo) GetArtistName() string { func (x *ExportInfo) GetArtistName() string {
@ -602,7 +673,7 @@ type ExportRecordResp struct {
func (x *ExportRecordResp) Reset() { func (x *ExportRecordResp) Reset() {
*x = ExportRecordResp{} *x = ExportRecordResp{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_pb_exhibition_proto_msgTypes[7] mi := &file_pb_exhibition_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -615,7 +686,7 @@ func (x *ExportRecordResp) String() string {
func (*ExportRecordResp) ProtoMessage() {} func (*ExportRecordResp) ProtoMessage() {}
func (x *ExportRecordResp) ProtoReflect() protoreflect.Message { func (x *ExportRecordResp) ProtoReflect() protoreflect.Message {
mi := &file_pb_exhibition_proto_msgTypes[7] mi := &file_pb_exhibition_proto_msgTypes[8]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -628,7 +699,7 @@ func (x *ExportRecordResp) ProtoReflect() protoreflect.Message {
// Deprecated: Use ExportRecordResp.ProtoReflect.Descriptor instead. // Deprecated: Use ExportRecordResp.ProtoReflect.Descriptor instead.
func (*ExportRecordResp) Descriptor() ([]byte, []int) { func (*ExportRecordResp) Descriptor() ([]byte, []int) {
return file_pb_exhibition_proto_rawDescGZIP(), []int{7} return file_pb_exhibition_proto_rawDescGZIP(), []int{8}
} }
func (x *ExportRecordResp) GetData() []*ExportInfo { func (x *ExportRecordResp) GetData() []*ExportInfo {
@ -652,7 +723,7 @@ var file_pb_exhibition_proto_rawDesc = []byte{
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 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, 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, 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, 0xe2, 0x02, 0x0a, 0x0c, 0x52, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xce, 0x03, 0x0a, 0x0c, 0x52,
0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 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, 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, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12,
@ -664,96 +735,110 @@ var file_pb_exhibition_proto_rawDesc = []byte{
0x4e, 0x75, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 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, 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, 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, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
0x68, 0x6f, 0x74, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x43, 0x61, 0x31, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
0x72, 0x64, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x64, 0x43, 0x61, 0x72, 0x31, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x50, 0x68, 0x6f, 0x74, 0x6f,
0x64, 0x42, 0x61, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x50, 0x68,
0x52, 0x0f, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x74, 0x6f, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x42, 0x61, 0x63,
0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x6b, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64,
0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x43, 0x61, 0x72, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x0a,
0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x0b, 0x20, 0x01,
0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12,
0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0c, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0c, 0x20, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a,
0x58, 0x0a, 0x16, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09,
0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x69,
0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x18, 0x0e,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72,
0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x45,
0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x64,
0x63, 0x6b, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x44, 0x61, 0x74, 0x65, 0x22, 0x58, 0x0a, 0x16, 0x53,
0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x61, 0x76, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72,
0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20,
0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e,
0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64,
0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x87, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x68,
0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x45, 0x78, 0x69,
0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x45, 0x78, 0x69, 0x73,
0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x6d, 0x73, 0x67, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28,
0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52,
0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x72, 0x74, 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74,
0x28, 0x05, 0x52, 0x07, 0x73, 0x6f, 0x72, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x61, 0x22, 0x23, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x64, 0x43, 0x61, 0x72, 0x64,
0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x22, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28,
0x96, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x87, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x63, 0x6f, 0x72,
0x73, 0x70, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77,
0x32, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f,
0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05,
0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69,
0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69,
0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x72, 0x74, 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20,
0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6f, 0x72, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04,
0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74,
0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x11, 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x6f, 0x22, 0x96, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52,
0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x22, 0xbc, 0x02, 0x0a, 0x0a, 0x65, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28,
0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x72, 0x0b, 0x32, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52,
0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74,
0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05,
0x6e, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18,
0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x18, 0x05, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70,
0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x12, 0x16, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70,
0x0a, 0x06, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x05,
0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x22, 0x11, 0x0a, 0x0f, 0x45, 0x78, 0x70,
0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x22, 0xbc, 0x02, 0x0a,
0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x61,
0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x50, 0x68, 0x6f, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
0x74, 0x6f, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x67,
0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, 0x43, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x67, 0x65, 0x6e,
0x61, 0x72, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x18,
0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x12,
0x09, 0x52, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x16, 0x0a, 0x06, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x06, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65,
0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73,
0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x50, 0x68, 0x6f, 0x74, 0x6f,
0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x50, 0x0a, 0x10, 0x45, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x50, 0x68,
0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x6f, 0x74, 0x6f, 0x12, 0x28, 0x0a, 0x0f, 0x69, 0x64, 0x43, 0x61, 0x72, 0x64, 0x42, 0x61, 0x63,
0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6b, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64,
0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x61, 0x72, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x0a,
0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x18, 0x0a, 0x20, 0x01,
0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x32, 0xc4, 0x02, 0x0a, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x12,
0x0a, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x0a, 0x43, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0b, 0x20, 0x01,
0x68, 0x65, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a,
0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09,
0x6e, 0x66, 0x6f, 0x1a, 0x1a, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x50, 0x0a, 0x10, 0x45,
0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12,
0x52, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x2a, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e,
0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72,
0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6d,
0x22, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x61, 0x76, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x32, 0x8a, 0x03,
0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0a, 0x0a, 0x45, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x0a,
0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x18, 0x2e, 0x65, 0x78, 0x68,
0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x1a, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f,
0x74, 0x52, 0x65, 0x71, 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,
0x6e, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x52, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
0x12, 0x51, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74,
0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1b, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f,
0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x1a, 0x22, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x61,
0x72, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64,
0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72,
0x65, 0x73, 0x70, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x70, 0x62, 0x2f, 0x65, 0x78, 0x68, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x65, 0x78, 0x68,
0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 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, 0x12, 0x44, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x64, 0x43,
0x61, 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, 0x1b, 0x2e,
0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b,
0x49, 0x64, 0x43, 0x61, 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 ( var (
@ -768,32 +853,35 @@ func file_pb_exhibition_proto_rawDescGZIP() []byte {
return 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_msgTypes = make([]protoimpl.MessageInfo, 9)
var file_pb_exhibition_proto_goTypes = []interface{}{ var file_pb_exhibition_proto_goTypes = []interface{}{
(*RegisterInfo)(nil), // 0: exhibition.RegisterInfo (*RegisterInfo)(nil), // 0: exhibition.RegisterInfo
(*SaveRegisterRecordResp)(nil), // 1: exhibition.SaveRegisterRecordResp (*SaveRegisterRecordResp)(nil), // 1: exhibition.SaveRegisterRecordResp
(*CheckPhoneResp)(nil), // 2: exhibition.CheckPhoneResp (*CheckPhoneResp)(nil), // 2: exhibition.CheckPhoneResp
(*RecordListReq)(nil), // 3: exhibition.RecordListReq (*CheckIdCardResp)(nil), // 3: exhibition.CheckIdCardResp
(*RecordListResp)(nil), // 4: exhibition.RecordListResp (*RecordListReq)(nil), // 4: exhibition.RecordListReq
(*ExportRecordReq)(nil), // 5: exhibition.ExportRecordReq (*RecordListResp)(nil), // 5: exhibition.RecordListResp
(*ExportInfo)(nil), // 6: exhibition.ExportInfo (*ExportRecordReq)(nil), // 6: exhibition.ExportRecordReq
(*ExportRecordResp)(nil), // 7: exhibition.ExportRecordResp (*ExportInfo)(nil), // 7: exhibition.ExportInfo
(*ExportRecordResp)(nil), // 8: exhibition.ExportRecordResp
} }
var file_pb_exhibition_proto_depIdxs = []int32{ var file_pb_exhibition_proto_depIdxs = []int32{
0, // 0: exhibition.SaveRegisterRecordResp.data:type_name -> exhibition.RegisterInfo 0, // 0: exhibition.SaveRegisterRecordResp.data:type_name -> exhibition.RegisterInfo
0, // 1: exhibition.CheckPhoneResp.data:type_name -> exhibition.RegisterInfo 0, // 1: exhibition.CheckPhoneResp.data:type_name -> exhibition.RegisterInfo
0, // 2: exhibition.RecordListResp.data:type_name -> exhibition.RegisterInfo 0, // 2: exhibition.RecordListResp.data:type_name -> exhibition.RegisterInfo
6, // 3: exhibition.ExportRecordResp.data:type_name -> exhibition.ExportInfo 7, // 3: exhibition.ExportRecordResp.data:type_name -> exhibition.ExportInfo
0, // 4: exhibition.Exhibition.CheckPhone:input_type -> exhibition.RegisterInfo 0, // 4: exhibition.Exhibition.CheckPhone:input_type -> exhibition.RegisterInfo
0, // 5: exhibition.Exhibition.SaveRegisterRecord:input_type -> exhibition.RegisterInfo 0, // 5: exhibition.Exhibition.SaveRegisterRecord:input_type -> exhibition.RegisterInfo
3, // 6: exhibition.Exhibition.RegisterRecordList:input_type -> exhibition.RecordListReq 4, // 6: exhibition.Exhibition.RegisterRecordList:input_type -> exhibition.RecordListReq
5, // 7: exhibition.Exhibition.ExportRegisterRecord:input_type -> exhibition.ExportRecordReq 6, // 7: exhibition.Exhibition.ExportRegisterRecord:input_type -> exhibition.ExportRecordReq
2, // 8: exhibition.Exhibition.CheckPhone:output_type -> exhibition.CheckPhoneResp 0, // 8: exhibition.Exhibition.CheckIdCard:input_type -> exhibition.RegisterInfo
1, // 9: exhibition.Exhibition.SaveRegisterRecord:output_type -> exhibition.SaveRegisterRecordResp 2, // 9: exhibition.Exhibition.CheckPhone:output_type -> exhibition.CheckPhoneResp
4, // 10: exhibition.Exhibition.RegisterRecordList:output_type -> exhibition.RecordListResp 1, // 10: exhibition.Exhibition.SaveRegisterRecord:output_type -> exhibition.SaveRegisterRecordResp
7, // 11: exhibition.Exhibition.ExportRegisterRecord:output_type -> exhibition.ExportRecordResp 5, // 11: exhibition.Exhibition.RegisterRecordList:output_type -> exhibition.RecordListResp
8, // [8:12] is the sub-list for method output_type 8, // 12: exhibition.Exhibition.ExportRegisterRecord:output_type -> exhibition.ExportRecordResp
4, // [4:8] is the sub-list for method input_type 3, // 13: exhibition.Exhibition.CheckIdCard:output_type -> exhibition.CheckIdCardResp
9, // [9:14] is the sub-list for method output_type
4, // [4:9] is the sub-list for method input_type
4, // [4:4] is the sub-list for extension type_name 4, // [4:4] is the sub-list for extension type_name
4, // [4:4] is the sub-list for extension extendee 4, // [4:4] is the sub-list for extension extendee
0, // [0:4] is the sub-list for field type_name 0, // [0:4] is the sub-list for field type_name
@ -842,7 +930,7 @@ func file_pb_exhibition_proto_init() {
} }
} }
file_pb_exhibition_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { file_pb_exhibition_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RecordListReq); i { switch v := v.(*CheckIdCardResp); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -854,7 +942,7 @@ func file_pb_exhibition_proto_init() {
} }
} }
file_pb_exhibition_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { file_pb_exhibition_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*RecordListResp); i { switch v := v.(*RecordListReq); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -866,7 +954,7 @@ func file_pb_exhibition_proto_init() {
} }
} }
file_pb_exhibition_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { file_pb_exhibition_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ExportRecordReq); i { switch v := v.(*RecordListResp); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -878,7 +966,7 @@ func file_pb_exhibition_proto_init() {
} }
} }
file_pb_exhibition_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { file_pb_exhibition_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ExportInfo); i { switch v := v.(*ExportRecordReq); i {
case 0: case 0:
return &v.state return &v.state
case 1: case 1:
@ -890,6 +978,18 @@ func file_pb_exhibition_proto_init() {
} }
} }
file_pb_exhibition_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { file_pb_exhibition_proto_msgTypes[7].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[8].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ExportRecordResp); i { switch v := v.(*ExportRecordResp); i {
case 0: case 0:
return &v.state return &v.state
@ -908,7 +1008,7 @@ func file_pb_exhibition_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_pb_exhibition_proto_rawDesc, RawDescriptor: file_pb_exhibition_proto_rawDesc,
NumEnums: 0, NumEnums: 0,
NumMessages: 8, NumMessages: 9,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },

View File

@ -36,6 +36,9 @@ func (this *CheckPhoneResp) Validate() error {
} }
return nil return nil
} }
func (this *CheckIdCardResp) Validate() error {
return nil
}
func (this *RecordListReq) Validate() error { func (this *RecordListReq) Validate() error {
return nil return nil
} }

View File

@ -32,6 +32,7 @@ type ExhibitionClient interface {
SaveRegisterRecord(ctx context.Context, in *RegisterInfo, opts ...grpc_go.CallOption) (*SaveRegisterRecordResp, 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) 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) ExportRegisterRecord(ctx context.Context, in *ExportRecordReq, opts ...grpc_go.CallOption) (*ExportRecordResp, common.ErrorWithAttachment)
CheckIdCard(ctx context.Context, in *RegisterInfo, opts ...grpc_go.CallOption) (*CheckIdCardResp, common.ErrorWithAttachment)
} }
type exhibitionClient struct { type exhibitionClient struct {
@ -43,6 +44,7 @@ type ExhibitionClientImpl struct {
SaveRegisterRecord func(ctx context.Context, in *RegisterInfo) (*SaveRegisterRecordResp, error) SaveRegisterRecord func(ctx context.Context, in *RegisterInfo) (*SaveRegisterRecordResp, error)
RegisterRecordList func(ctx context.Context, in *RecordListReq) (*RecordListResp, error) RegisterRecordList func(ctx context.Context, in *RecordListReq) (*RecordListResp, error)
ExportRegisterRecord func(ctx context.Context, in *ExportRecordReq) (*ExportRecordResp, error) ExportRegisterRecord func(ctx context.Context, in *ExportRecordReq) (*ExportRecordResp, error)
CheckIdCard func(ctx context.Context, in *RegisterInfo) (*CheckIdCardResp, error)
} }
func (c *ExhibitionClientImpl) GetDubboStub(cc *triple.TripleConn) ExhibitionClient { func (c *ExhibitionClientImpl) GetDubboStub(cc *triple.TripleConn) ExhibitionClient {
@ -81,6 +83,12 @@ func (c *exhibitionClient) ExportRegisterRecord(ctx context.Context, in *ExportR
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/ExportRegisterRecord", in, out) return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/ExportRegisterRecord", in, out)
} }
func (c *exhibitionClient) CheckIdCard(ctx context.Context, in *RegisterInfo, opts ...grpc_go.CallOption) (*CheckIdCardResp, common.ErrorWithAttachment) {
out := new(CheckIdCardResp)
interfaceKey := ctx.Value(constant.InterfaceKey).(string)
return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/CheckIdCard", in, out)
}
// ExhibitionServer is the server API for Exhibition service. // ExhibitionServer is the server API for Exhibition service.
// All implementations must embed UnimplementedExhibitionServer // All implementations must embed UnimplementedExhibitionServer
// for forward compatibility // for forward compatibility
@ -89,6 +97,7 @@ type ExhibitionServer interface {
SaveRegisterRecord(context.Context, *RegisterInfo) (*SaveRegisterRecordResp, error) SaveRegisterRecord(context.Context, *RegisterInfo) (*SaveRegisterRecordResp, error)
RegisterRecordList(context.Context, *RecordListReq) (*RecordListResp, error) RegisterRecordList(context.Context, *RecordListReq) (*RecordListResp, error)
ExportRegisterRecord(context.Context, *ExportRecordReq) (*ExportRecordResp, error) ExportRegisterRecord(context.Context, *ExportRecordReq) (*ExportRecordResp, error)
CheckIdCard(context.Context, *RegisterInfo) (*CheckIdCardResp, error)
mustEmbedUnimplementedExhibitionServer() mustEmbedUnimplementedExhibitionServer()
} }
@ -109,6 +118,9 @@ func (UnimplementedExhibitionServer) RegisterRecordList(context.Context, *Record
func (UnimplementedExhibitionServer) ExportRegisterRecord(context.Context, *ExportRecordReq) (*ExportRecordResp, error) { func (UnimplementedExhibitionServer) ExportRegisterRecord(context.Context, *ExportRecordReq) (*ExportRecordResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method ExportRegisterRecord not implemented") return nil, status.Errorf(codes.Unimplemented, "method ExportRegisterRecord not implemented")
} }
func (UnimplementedExhibitionServer) CheckIdCard(context.Context, *RegisterInfo) (*CheckIdCardResp, error) {
return nil, status.Errorf(codes.Unimplemented, "method CheckIdCard not implemented")
}
func (s *UnimplementedExhibitionServer) XXX_SetProxyImpl(impl protocol.Invoker) { func (s *UnimplementedExhibitionServer) XXX_SetProxyImpl(impl protocol.Invoker) {
s.proxyImpl = impl s.proxyImpl = impl
} }
@ -253,6 +265,35 @@ func _Exhibition_ExportRegisterRecord_Handler(srv interface{}, ctx context.Conte
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Exhibition_CheckIdCard_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("CheckIdCard", 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. // Exhibition_ServiceDesc is the grpc_go.ServiceDesc for Exhibition service.
// It's only intended for direct use with grpc_go.RegisterService, // It's only intended for direct use with grpc_go.RegisterService,
// and not to be introspected or modified (even as a copy) // and not to be introspected or modified (even as a copy)
@ -276,6 +317,10 @@ var Exhibition_ServiceDesc = grpc_go.ServiceDesc{
MethodName: "ExportRegisterRecord", MethodName: "ExportRegisterRecord",
Handler: _Exhibition_ExportRegisterRecord_Handler, Handler: _Exhibition_ExportRegisterRecord_Handler,
}, },
{
MethodName: "CheckIdCard",
Handler: _Exhibition_CheckIdCard_Handler,
},
}, },
Streams: []grpc_go.StreamDesc{}, Streams: []grpc_go.StreamDesc{},
Metadata: "pb/exhibition.proto", Metadata: "pb/exhibition.proto",

35
conf/config.yaml Normal file
View File

@ -0,0 +1,35 @@
system:
domain: exhibitiontest
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:
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
bos:
AccessKeyId: "ALTAKxrqOQHnAN525Tb2GX4Bhe"
AccessKeySecret: "d2ecaa9d75114d3b9f42b99014198306"
BucketName: "dci-file-new"
Endpoint: ".bj.bcebos.com"
BosBaseDir: "exhibition"
Host: "https://bj.bcebos.com"
CdnHost: "https://cdns.fontree.cn"

View File

@ -1,5 +1,5 @@
system: system:
domain: localhost domain: exhibitiontest
mode: dev mode: dev
node_num: 3 node_num: 3
port: 8086 port: 8086
@ -26,10 +26,10 @@ jwt:
key: "3Ei*^!a6^6$w^wgK" key: "3Ei*^!a6^6$w^wgK"
expire: 24 expire: 24
bos: bos:
Ak: "ALTAKxrqOQHnAN525Tb2GX4Bhe" AccessKeyId: "ALTAKxrqOQHnAN525Tb2GX4Bhe"
Sk: "d2ecaa9d75114d3b9f42b99014198306" AccessKeySecret: "d2ecaa9d75114d3b9f42b99014198306"
BucketName: "dci-file-new" BucketName: "dci-file-new"
BosUrl: ".bj.bcebos.com" Endpoint: ".bj.bcebos.com"
BosBaseDir: "fonchain-main" BosBaseDir: "exhibition"
BosHttp: "https://" Host: "https://bj.bcebos.com"
BosDomain: "cdns.fontree.cn" CdnHost: "https://cdns.fontree.cn"

View File

@ -13,16 +13,18 @@ dubbo:
references: references:
AccountClientImpl: AccountClientImpl:
protocol: tri protocol: tri
interface: com.fontree.microservices.common.Account
filter: cshutdown,sign,fonDomainFilter,fonValidateFilter
timeout: 15s
retries: 0 retries: 0
interface: com.fontree.microservices.common.Account
filter: cshutdown,sign
params: params:
.accessKeyId: "Accountksl" .accessKeyId: "Accountksl"
.secretAccessKey: "BSDY-FDF1-Fontree_account" .secretAccessKey: "BSDY-FDF1-Fontree_account"
ExhibitionClientImpl: ExhibitionClientImpl:
protocol: tri protocol: tri
interface: com.fontree.microservices.common.Exhibition interface: com.fontree.microservices.common.Exhibition
ArtistClientImpl:
protocol: tri
interface: com.fontree.microservices.common.Artist
logger: logger:
zap-config: zap-config:
level: error # 日志级别 level: error # 日志级别

68
conf/dubbogo.yaml Normal file
View File

@ -0,0 +1,68 @@
dubbo:
registries:
demoZK:
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:
AccountClientImpl:
protocol: tri
retries: 0
interface: com.fontree.microservices.common.Account
filter: cshutdown,sign
params:
.accessKeyId: "Accountksl"
.secretAccessKey: "BSDY-FDF1-Fontree_account"
ExhibitionClientImpl:
protocol: tri
interface: com.fontree.microservices.common.Exhibition
ArtistClientImpl:
protocol: tri
interface: com.fontree.microservices.common.Artist
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/exhibition-main.log"
# 每个日志文件长度的最大大小,单位是 MiB。默认 100MiB
maxSize: 5
# 日志保留的最大天数(只保留最近多少天的日志)
maxAge: 30
# 只保留最近多少个日志文件,用于控制程序总日志的大小
maxBackups: 30
# 是否使用本地时间,默认使用 UTC 时间
localTime: true
# 是否压缩日志文件,压缩方法 gzip
compress: false

View File

@ -1,11 +1,11 @@
system: system:
domain: exhibition.szjixun.cn domain: exhibition
mode: prod mode: prod
node_num: 3 node_num: 3
port: 9025 port: 9025
key: key:
cert: cert:
is_https: false is_https: true
cron: false cron: false
key_path: "" key_path: ""
cert_path: "" cert_path: ""
@ -26,10 +26,10 @@ jwt:
key: "tP0xXGErz4~" key: "tP0xXGErz4~"
expire: 24 expire: 24
bos: bos:
Ak: "ALTAKxrqOQHnAN525Tb2GX4Bhe" AccessKeyId: "ALTAKxrqOQHnAN525Tb2GX4Bhe"
Sk: "d2ecaa9d75114d3b9f42b99014198306" AccessKeySecret: "d2ecaa9d75114d3b9f42b99014198306"
BucketName: "dci-file-new" BucketName: "dci-file-new"
BosUrl: ".bj.bcebos.com" Endpoint: ".bj.bcebos.com"
BosBaseDir: "fonchain-main" BosBaseDir: "exhibition"
BosHttp: "https://" Host: "https://bj.bcebos.com"
BosDomain: "cdns.fontree.cn" CdnHost: "https://cdns.fontree.cn"

View File

@ -13,16 +13,18 @@ dubbo:
references: references:
AccountClientImpl: AccountClientImpl:
protocol: tri protocol: tri
interface: com.fontree.microservices.common.Account
filter: cshutdown,sign,fonDomainFilter,fonValidateFilter
timeout: 15s
retries: 0 retries: 0
interface: com.fontree.microservices.common.Account
filter: cshutdown,sign
params: params:
.accessKeyId: "Accountksl" .accessKeyId: "Accountksl"
.secretAccessKey: "BSDY-FDF1-Fontree_account" .secretAccessKey: "BSDY-FDF1-Fontree_account"
ExhibitionClientImpl: ExhibitionClientImpl:
protocol: tri protocol: tri
interface: com.fontree.microservices.common.Exhibition interface: com.fontree.microservices.common.Exhibition
ArtistClientImpl:
protocol: tri
interface: com.fontree.microservices.common.Artist
logger: logger:
zap-config: zap-config:
level: error # 日志级别 level: error # 日志级别

View File

@ -1,5 +1,5 @@
system: system:
domain: exhibitiontest.szjixun.cn domain: exhibitiontest
mode: test mode: test
node_num: 3 node_num: 3
port: 9025 port: 9025
@ -16,20 +16,20 @@ redis:
jaeger: jaeger:
addr: "172.16.100.93:9031" addr: "172.16.100.93:9031"
open: true open: true
zapLog: #zapLog:
level: "info" # level: "info"
filename: "logs/exhibition-main.log" # filename: "logs/exhibition-main.log"
max_size: 5 # max_size: 5
max_age: 30 # max_age: 30
max_backups: 30 # max_backups: 30
jwt: jwt:
key: "SxjwBuEcHg42t73" key: "SxjwBuEcHg42t73"
expire: 24 expire: 24
bos: bos:
Ak: "ALTAKxrqOQHnAN525Tb2GX4Bhe" AccessKeyId: "ALTAKxrqOQHnAN525Tb2GX4Bhe"
Sk: "d2ecaa9d75114d3b9f42b99014198306" AccessKeySecret: "d2ecaa9d75114d3b9f42b99014198306"
BucketName: "dci-file-new" BucketName: "dci-file-new"
BosUrl: ".bj.bcebos.com" Endpoint: ".bj.bcebos.com"
BosBaseDir: "fonchain-main" BosBaseDir: "exhibition"
BosHttp: "https://" Host: "https://bj.bcebos.com"
BosDomain: "cdns.fontree.cn" CdnHost: "https://cdns.fontree.cn"

View File

@ -13,16 +13,18 @@ dubbo:
references: references:
AccountClientImpl: AccountClientImpl:
protocol: tri protocol: tri
interface: com.fontree.microservices.common.Account
filter: cshutdown,sign,fonDomainFilter,fonValidateFilter
timeout: 15s
retries: 0 retries: 0
interface: com.fontree.microservices.common.Account
filter: cshutdown,sign
params: params:
.accessKeyId: "Accountksl" .accessKeyId: "Accountksl"
.secretAccessKey: "BSDY-FDF1-Fontree_account" .secretAccessKey: "BSDY-FDF1-Fontree_account"
ExhibitionClientImpl: ExhibitionClientImpl:
protocol: tri protocol: tri
interface: com.fontree.microservices.common.Exhibition interface: com.fontree.microservices.common.Exhibition
ArtistClientImpl:
protocol: tri
interface: com.fontree.microservices.common.Artist
logger: logger:
zap-config: zap-config:
level: error # 日志级别 level: error # 日志级别

2
go.mod
View File

@ -3,6 +3,7 @@ module github.com/exhibition-main
go 1.20 go 1.20
replace ( replace (
github.com/fonchain/utils/baidu => ../utils/baidu
github.com/fonchain_enterprise/utils/aes => ../utils/aes github.com/fonchain_enterprise/utils/aes => ../utils/aes
github.com/fonchain_enterprise/utils/chain => ../utils/chain github.com/fonchain_enterprise/utils/chain => ../utils/chain
github.com/fonchain_enterprise/utils/feie => ../utils/feie github.com/fonchain_enterprise/utils/feie => ../utils/feie
@ -22,6 +23,7 @@ require (
github.com/dubbogo/gost v1.13.2 github.com/dubbogo/gost v1.13.2
github.com/dubbogo/grpc-go v1.42.10 github.com/dubbogo/grpc-go v1.42.10
github.com/dubbogo/triple v1.2.2-rc2 github.com/dubbogo/triple v1.2.2-rc2
github.com/fonchain/utils/baidu v0.0.0-00010101000000-000000000000
github.com/fonchain_enterprise/utils/objstorage v0.0.0-00010101000000-000000000000 github.com/fonchain_enterprise/utils/objstorage v0.0.0-00010101000000-000000000000
github.com/gin-contrib/gzip v0.0.6 github.com/gin-contrib/gzip v0.0.6
github.com/gin-contrib/pprof v1.4.0 github.com/gin-contrib/pprof v1.4.0

View File

@ -10,79 +10,6 @@ import (
var Data = new(AppConfig) var Data = new(AppConfig)
var (
AppMode string
HttpPort string
Key string
Cert string
IsHttps bool
RunHttps bool
Domain string
OssDomain string
ServerDM string
Env string
DriverUrl string
AppointUrl string
MaterialHost string
BosAk string
BosSk string
BosBucketName string
BosBaseDir string
BosUrl string
BosHttp string
BosDomain string
ProjectMapDir string
JaegerHost string
JaegerOpen bool
Cron bool
DingAccessToken string
DingUrl string
HolidayID string
HolidaySecret string
HolidaySingleUrl string
HolidayMultiUrl string
ErpAk string
ErpSk string
// rabbitmq
RabbitmqUser string
RabbitmqPassword string
RabbitmqHost string
RabbitmqPort int
RabbitmqVhost string
RabbitmqVhostArtwork string
RedisDB int
RedisAddr string
RedisPw string
//shop配置
ShopHost string
//ShopDetail string
// 地图
MapAppCode string
// es
ElasticHost string
SendIndexesUrl string
ChatGptHost string
ApiHost string
Level string
Filename string
MaxSize string
MaxAge string
MaxBackups string
YearGiftCheckHost string
Aliyun struct {
AccessKeyId string
AccessKeySecret string
}
)
type AppConfig struct { type AppConfig struct {
System struct { System struct {
Domain string Domain string
@ -128,7 +55,7 @@ type AppConfig struct {
func GetConf() (iniConf string, err error) { func GetConf() (iniConf string, err error) {
if os.Getenv(model.MODE_ENV) != "" { 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 { if err = os.Setenv(constant.ConfigFileEnvKey, fmt.Sprintf("./conf/%s/%s", os.Getenv(model.MODE_ENV), model.SERVER_DUBBOGO_CONFIG)); err != nil {
return return
} }
} }

44
internal/filter/domain.go Normal file
View File

@ -0,0 +1,44 @@
package filter
import (
"context"
appconfig "github.com/exhibition-main/internal/config"
"reflect"
)
import (
"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("fonDomainFilter", NewDomainFonFilter)
}
func NewDomainFonFilter() filter.Filter {
return &DomainFonFilter{}
}
type DomainFonFilter struct {
}
func (f *DomainFonFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
if len(invocation.Arguments()) > 0 {
req := invocation.Arguments()[0]
pp := reflect.ValueOf(req)
field := pp.Elem().FieldByName("Domain")
if field.IsValid() {
if field.IsZero() {
field.SetString(appconfig.Data.System.Domain)
}
}
}
return invoker.Invoke(ctx, invocation)
}
func (f *DomainFonFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, protocol protocol.Invocation) protocol.Result {
return result
}

272
internal/model/ocr.go Normal file
View File

@ -0,0 +1,272 @@
package model
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/url"
"strconv"
"time"
"unicode/utf8"
)
const (
grant_type = "client_credentials"
)
var accessToken string
var expires_in uint64
type OcrQuery struct {
IdCardUrl string `json:"idCardUrl"`
Side int `json:"side"` // 1 正面 2 反面
}
type OcrRes struct {
RealName string `json:"realName"`
IDNum string `json:"iDNum"`
Path string `json:"path"`
Age int `json:"age"`
Birthday string `json:"birthday"`
Sex string `json:"sex"`
IssueDate string `json:"issueDate"`
ExpirationDate string `json:"expirationDate"`
}
const (
ocr_client_id = "cLg2dUH1pqopsj22tShw8FQU"
ocr_client_secret = "diriz5PmhLOB8hwE4KnEEiaBMV6WfBR1"
)
type OrcRes struct {
Path string `json:"path"`
Name string `json:"name"`
IdCard string `json:"idCard"`
Age int `json:"age"`
Birthday string `json:"birthday"`
Sex string `json:"sex"`
IssueDate string `json:"issueDate"`
ExpirationDate string `json:"expirationDate"`
}
type OcrGetIdCardRes struct {
WordsResult WordsResult `json:"words_result"`
IdcardNumberType int `json:"idcard_number_type"`
WordsResultNum int `json:"words_result_num"`
ImageStatus string `json:"image_status"`
LogId uint64 `json:"log_id"`
}
type WordsResult struct {
Name WordsResultDetail `json:"姓名"`
Address WordsResultDetail `json:"住址"`
IdCard WordsResultDetail `json:"公民身份号码"`
Birthday WordsResultDetail `json:"出生"`
Sex WordsResultDetail `json:"性别"`
IssueDate WordsResultDetail `json:"签发日期"`
ExpirationDate WordsResultDetail `json:"失效日期"`
}
type WordsResultDetail struct {
Words string
}
type AccessToken struct {
Refresh_token string `json:"refresh_token"`
Expires_in uint64 `json:"expires_in"`
Scope string `json:"scope"`
Session_key string `json:"session_key"`
Access_token string `json:"access_token"`
Session_secret string `json:"session_secret"`
Error string `json:"error"`
Error_description string `json:"error_description"`
}
func OcrGetIdCard(image string, side string) (*OrcRes, error) {
var (
accesstoken string
response string
err error
)
if accesstoken, err = GetOcrAccessToken(); err != nil {
fmt.Println(err.Error())
return nil, err
}
if response, err = PostForm("https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=["+accesstoken+"]", url.Values{"image": {image}, "id_card_side": {side}}); err != nil {
fmt.Println(err.Error())
return nil, err
}
var res OcrGetIdCardRes
if err = json.Unmarshal([]byte(response), &res); err != nil {
return nil, err
}
fmt.Printf("%+v\n", res)
switch res.ImageStatus {
case "normal":
case "reversed_side":
return nil, errors.New("身份证正反面颠倒")
case "non_idcard":
return nil, errors.New("上传的图片中不包含身份证")
case "blurred":
return nil, errors.New("身份证模糊")
case "other_type_card":
return nil, errors.New("其他类型证照")
case "over_exposure":
return nil, errors.New("身份证关键字段反光或过曝")
case "over_dark":
return nil, errors.New("身份证欠曝(亮度过低)")
case "unknown":
return nil, errors.New("未知状态")
default:
return nil, errors.New("未知状态")
}
if side == "front" {
switch res.IdcardNumberType {
case -1:
return nil, errors.New("身份证正面所有字段全为空")
case 0:
return nil, errors.New(" 身份证证号不合法,此情况下不返回身份证证号")
case 1:
case 2:
return nil, errors.New("身份证证号和性别、出生信息都不一致")
case 3:
return nil, errors.New("身份证证号和出生信息不一致")
case 4:
return nil, errors.New("身份证证号和性别信息不一致")
default:
return nil, errors.New("未知状态")
}
}
var result OrcRes
fmt.Println(res.WordsResult.Name.Words)
if side == "front" {
result.Name = res.WordsResult.Name.Words
result.Birthday = res.WordsResult.Birthday.Words
result.IdCard = res.WordsResult.IdCard.Words
result.Sex = res.WordsResult.Sex.Words
result.Path = res.WordsResult.Address.Words
var age int
birYear, _ := strconv.Atoi(result.Birthday[0:4])
birMonth, _ := strconv.Atoi(result.Birthday[4:6])
fmt.Println(birYear)
fmt.Println(time.Now().Year())
age = time.Now().Year() - birYear
if int(time.Now().Month()) < birMonth {
age--
}
result.Age = age
} else {
issueDate := res.WordsResult.IssueDate.Words[:4] + "-" + res.WordsResult.IssueDate.Words[4:6] + "-" + res.WordsResult.IssueDate.Words[6:8]
result.IssueDate = issueDate
expirationDate := res.WordsResult.ExpirationDate.Words[:4] + "-" + res.WordsResult.ExpirationDate.Words[4:6] + "-" + res.WordsResult.ExpirationDate.Words[6:8]
result.ExpirationDate = expirationDate
}
return &result, nil
}
func (m *OcrRes) CheckIdAndName() {
if utf8.RuneCountInString(m.RealName) == 18 && utf8.RuneCountInString(m.IDNum) != 18 {
m.IDNum, m.RealName = m.RealName, m.IDNum
}
}
func GetOcrAccessToken() (string, error) {
var (
resObj AccessToken
err error
// daoAccessToken entity.AccessToken
)
if expires_in == 0 || expires_in < uint64(time.Now().Unix()) {
fmt.Println(1)
// if daoAccessToken, err = dao.GetAccessToken("baidu", "accesstoken"); err != nil { //查询是否有记录
// return "", err
// }
// fmt.Println(2)
if resObj, err = getOcrAccessToken(); err != nil { //从链上获取
return "", err
}
// var tmp = entity.AccessToken{
// Platform: "baidu",
// Types: "accesstoken",
// Txt: resObj.Access_token,
// Expires_in: uint64(time.Now().Unix()) + resObj.Expires_in,
// }
// if daoAccessToken.Uid == 0 {
// if err = dao.AddAccessToken(tmp); err != nil {
// return "", err
// }
// } else {
// if _, err = dao.UpdateAccessToken(tmp); err != nil {
// return "", err
// }
// }
accessToken = resObj.Access_token
expires_in = resObj.Expires_in
}
return accessToken, nil
}
func getOcrAccessToken() (AccessToken, error) {
var (
resObj AccessToken
err error
)
url := "https://aip.baidubce.com/oauth/2.0/token"
urlReq := "?grant_type=" + grant_type + "&client_id=" + ocr_client_id + "&client_secret=" + ocr_client_secret
fmt.Println(urlReq)
res := Get(url + urlReq)
if err = json.Unmarshal([]byte(res), &resObj); err != nil {
return resObj, err
}
if resObj.Error != "" {
return resObj, errors.New(resObj.Error_description)
}
return resObj, err
}
func PostForm(urlStr string, data url.Values) (string, error) {
resp, err := http.PostForm(urlStr, data)
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}
return string(body), err
}
func Get(url string) string {
// 超时时间5秒
client := &http.Client{Timeout: 5 * time.Second}
resp, err := client.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var buffer [512]byte
result := bytes.NewBuffer(nil)
for {
n, err := resp.Body.Read(buffer[0:])
result.Write(buffer[0:n])
if err != nil && err == io.EOF {
break
} else if err != nil {
panic(err)
}
}
return result.String()
}

View File

@ -18,7 +18,7 @@ func NewRouter() *gin.Engine {
r.Use(gzip.Gzip(gzip.DefaultCompression)) r.Use(gzip.Gzip(gzip.DefaultCompression))
//加入日志中间件,跨域中间件 //加入日志中间件,跨域中间件
r.Use(middleware.NewLogger(), middleware.Cors(), middleware.GinRecovery(true)) r.Use(middleware.NewLogger(), middleware.Cors(), middleware.GinRecovery(true))
auth := r.Group("") auth := r.Group("/api")
//auth.Use(middleware.JWTAuthMiddleware()) //auth.Use(middleware.JWTAuthMiddleware())
// 上传 // 上传
upload := auth.Group("upload") upload := auth.Group("upload")
@ -35,9 +35,10 @@ func NewRouter() *gin.Engine {
{ {
registerAuth.POST("register_record_list", service.RegisterList) //报名列表 registerAuth.POST("register_record_list", service.RegisterList) //报名列表
registerAuth.POST("check_by_phone", service.CheckByPhone) //检索手机号 registerAuth.POST("check_by_phone", service.CheckByPhone) //检索手机号
registerAuth.POST("check_id_card", service.CheckIdCard) //检索身份证号
registerAuth.POST("save_register_info", service.SaveRegister) //保存 registerAuth.POST("save_register_info", service.SaveRegister) //保存
registerAuth.POST("export_register", service.ExportRegister) //导出 registerAuth.POST("export_register", service.ExportRegister) //导出
registerAuth.POST("scan_id_card", service.GetCardIdWithImg) //扫描身份证图片获取信息 registerAuth.POST("scan_id_card", service.OcrBase64) //扫描身份证图片获取信息
} }
//静态文件 //静态文件

View File

@ -2,6 +2,7 @@ package service
import ( import (
"github.com/exhibition-main/api/account" "github.com/exhibition-main/api/account"
appconfig "github.com/exhibition-main/internal/config"
"github.com/exhibition-main/internal/msg" "github.com/exhibition-main/internal/msg"
"github.com/exhibition-main/internal/response" "github.com/exhibition-main/internal/response"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -17,10 +18,10 @@ func OnlySend(c *gin.Context) {
response.ResponseQuickMsg(c, msg.Fail, msg.INVALID_PARAMS, nil) response.ResponseQuickMsg(c, msg.Fail, msg.INVALID_PARAMS, nil)
return return
} }
//req.Domain = appconfig.Data.System.Domain req.Domain = appconfig.Data.System.Domain
//req.Scope = "exhibition" req.Scope = "exhibition"
res, err := AccountProvider.SendMsg(c, &req) res, err := AccountProvider.OnlySendMsg(c, &req)
if err != nil { if err != nil {
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil) response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil)
return return
@ -40,8 +41,8 @@ func OnlyCheck(c *gin.Context) {
return return
} }
//req.Domain = appconfig.Data.System.Domain req.Domain = appconfig.Data.System.Domain
//req.Scope = "exhibition" req.Scope = "exhibition"
res, err := AccountProvider.OnlyCheckMsg(c, &req) res, err := AccountProvider.OnlyCheckMsg(c, &req)
if err != nil { if err != nil {

View File

@ -212,7 +212,7 @@ func GetSnapshot(videoPath, snapshotPath string, frameNum int) (snapshotName str
} }
func PutBos(filePath string, mediaType string, needRemove bool) (url string, err error) { func PutBos(filePath string, mediaType string, needRemove bool) (url string, err error) {
BOSClient, err := objstorage.NewBOS(config.BosAk, config.BosSk, objstorage.BOS_BJ) BOSClient, err := objstorage.NewBOS(config.Data.Bos.AccessKeyId, config.Data.Bos.AccessKeySecret, objstorage.BOS_BJ)
if err != nil { if err != nil {
logger.Errorf("PutBos NewBOS err ", err) logger.Errorf("PutBos NewBOS err ", err)
err = errors.New(msg.ErrorUploadBos) err = errors.New(msg.ErrorUploadBos)
@ -235,15 +235,14 @@ func PutBos(filePath string, mediaType string, needRemove bool) (url string, err
} }
} }
filePath = strings.Replace(filePath, "./runtime", "", 1) filePath = strings.Replace(filePath, "./runtime", "", 1)
var objectName string = fmt.Sprintf("%s/%s%s", config.BosBaseDir, config.Env, filePath) var objectName string = fmt.Sprintf("%s/%s%s", config.Data.Bos.BosBaseDir, config.Data.System.Mode, filePath)
_, err = BOSClient.PutObjectFromBytes(config.BosBucketName, objectName, fileBytes) _, err = BOSClient.PutObjectFromBytes(config.Data.Bos.BucketName, objectName, fileBytes)
if err != nil { if err != nil {
logger.Errorf("PutBos PutObject err %+v", err.Error()) logger.Errorf("PutBos PutObject err %+v", err.Error())
err = errors.New(msg.ErrorUploadBos) err = errors.New(msg.ErrorUploadBos)
return return
} }
//url = fmt.Sprintf("%s%s%s/%s", config.BosHttp, config.BosBucketName, config.BosUrl, objectName) url = fmt.Sprintf("%s/%s", config.Data.Bos.CdnHost, objectName)
url = fmt.Sprintf("%s%s/%s", config.BosHttp, config.BosDomain, objectName)
return return
} }
@ -258,15 +257,14 @@ func quickBos(file *multipart.FileHeader, mediaType string, mask string, source
return return
} }
} }
var objectName string = fmt.Sprintf("%s/%s/%s", config.BosBaseDir, config.Env, filePath) var objectName string = fmt.Sprintf("%s/%s/%s", config.Data.Bos.BosBaseDir, config.Data.System.Mode, filePath)
BOSClient, _ := objstorage.NewBOS(config.BosAk, config.BosSk, objstorage.BOS_BJ) BOSClient, _ := objstorage.NewBOS(config.Data.Bos.AccessKeyId, config.Data.Bos.AccessKeySecret, objstorage.BOS_BJ)
_, err = BOSClient.PutObjectFromBytes(config.BosBucketName, objectName, fileBytes) _, err = BOSClient.PutObjectFromBytes(config.Data.Bos.BucketName, objectName, fileBytes)
if err != nil { if err != nil {
logger.Errorf("quickBos err", err) logger.Errorf("quickBos err", err)
return return
} }
//url = fmt.Sprintf("%s%s%s/%s", config.BosHttp, config.BosBucketName, config.BosUrl, objectName) url = fmt.Sprintf("%s/%s", config.Data.Bos.CdnHost, objectName)
url = fmt.Sprintf("%s%s/%s", config.BosHttp, config.BosDomain, objectName)
return return
} }

View File

@ -14,10 +14,10 @@ var AccountProvider = new(account.AccountClientImpl)
var GrpcArtistImpl = new(artist.ArtistClientImpl) var GrpcArtistImpl = new(artist.ArtistClientImpl)
func init() { func init() {
appConfig.GetOptions()
config.SetConsumerService(GrpcArtistImpl) config.SetConsumerService(GrpcArtistImpl)
config.SetConsumerService(AccountProvider) config.SetConsumerService(AccountProvider)
config.SetConsumerService(GrpcExhibitionClientImpl) config.SetConsumerService(GrpcExhibitionClientImpl)
appConfig.GetOptions()
if err := config.Load(); err != nil { if err := config.Load(); err != nil {
panic(err) panic(err)
} }

View File

@ -2,9 +2,9 @@ package service
import ( import (
"context" "context"
"encoding/base64"
"fmt" "fmt"
"github.com/dubbogo/gost/log/logger" "github.com/dubbogo/gost/log/logger"
"github.com/exhibition-main/api/artist"
"github.com/exhibition-main/api/exhibition" "github.com/exhibition-main/api/exhibition"
"github.com/exhibition-main/internal/config" "github.com/exhibition-main/internal/config"
"github.com/exhibition-main/internal/model" "github.com/exhibition-main/internal/model"
@ -13,6 +13,9 @@ import (
"github.com/exhibition-main/pkg/logic" "github.com/exhibition-main/pkg/logic"
"github.com/exhibition-main/pkg/utils" "github.com/exhibition-main/pkg/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"io/ioutil"
"net/http"
"time" "time"
) )
@ -45,11 +48,59 @@ func CheckByPhone(c *gin.Context) {
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil) response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil)
return return
} }
if resp.IsExist {
img := resp.Data.IdCardBackPhoto
response1, err := http.Get(img)
if err != nil {
fmt.Println("网络请求错误:", err)
return
}
defer response1.Body.Close()
// 读取图片数据
imageData, err := ioutil.ReadAll(response1.Body)
if err != nil {
fmt.Println("读取图片数据错误:", err)
return
}
// 将图片数据转换为base64编码
base64Data := base64.StdEncoding.EncodeToString(imageData)
result, err := model.OcrGetIdCard(base64Data, "back")
if err != nil {
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil)
return
}
resp.Data.IdCardStartDate = result.IssueDate
resp.Data.IdCardEndDate = result.ExpirationDate
}
response.ResponseQuickMsg(c, msg.Ok, resp.Msg, resp) response.ResponseQuickMsg(c, msg.Ok, resp.Msg, resp)
return return
} }
func CheckIdCard(c *gin.Context) {
var registerInfo exhibition.RegisterInfo
if err := c.ShouldBind(&registerInfo); err != nil {
logger.Errorf("CheckIdCard ShouldBind err", err)
response.ResponseQuickMsg(c, msg.Fail, msg.INVALID_PARAMS, nil)
return
}
resp, err := GrpcExhibitionClientImpl.CheckIdCard(context.Background(), &registerInfo)
if err != nil {
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil)
return
}
response.ResponseQuickMsg(c, msg.Ok, resp.Msg, nil)
return
}
func SaveRegister(c *gin.Context) { func SaveRegister(c *gin.Context) {
var registerInfo exhibition.RegisterInfo var registerInfo exhibition.RegisterInfo
if err := c.ShouldBind(&registerInfo); err != nil { if err := c.ShouldBind(&registerInfo); err != nil {
@ -62,6 +113,33 @@ func SaveRegister(c *gin.Context) {
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil) response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil)
return return
} }
img := resp.Data.IdCardBackPhoto
response1, err := http.Get(img)
if err != nil {
fmt.Println("网络请求错误:", err)
return
}
defer response1.Body.Close()
// 读取图片数据
imageData, err := ioutil.ReadAll(response1.Body)
if err != nil {
fmt.Println("读取图片数据错误:", err)
return
}
// 将图片数据转换为base64编码
base64Data := base64.StdEncoding.EncodeToString(imageData)
result, err := model.OcrGetIdCard(base64Data, "back")
if err != nil {
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil)
return
}
resp.Data.IdCardStartDate = result.IssueDate
resp.Data.IdCardEndDate = result.ExpirationDate
response.ResponseQuickMsg(c, msg.Ok, resp.Msg, resp) response.ResponseQuickMsg(c, msg.Ok, resp.Msg, resp)
return return
@ -87,7 +165,7 @@ func ExportRegister(c *gin.Context) {
resp.Data = []*exhibition.ExportInfo{} resp.Data = []*exhibition.ExportInfo{}
} }
columns := []string{"画家姓名", "性别", "手机号", "身份证号", "通讯地址", "身份证照片", "本人近照", "报名时间", "更新时间"} columns := []string{"画家姓名", "性别", "手机号", "身份证号", "通讯地址", "身份证照片", "本人近照", "报名时间", "更新时间"}
exportFileName := fmt.Sprintf("国展报名%v.xlsx", time.Now().Format("2006-01-01")) exportFileName := fmt.Sprintf("国展报名%s.xlsx", time.Now().Format("20060102"))
filePath := fmt.Sprintf("./runtime/%s", exportFileName) filePath := fmt.Sprintf("./runtime/%s", exportFileName)
data := make([]interface{}, 0) data := make([]interface{}, 0)
for _, v := range resp.Data { for _, v := range resp.Data {
@ -117,13 +195,13 @@ func ExportRegister(c *gin.Context) {
return return
} }
var httpType string var httpType string
if config.IsHttps { if config.Data.System.IsHttps {
httpType = model.HttpsType httpType = model.HttpsType
} else { } else {
httpType = model.HttpType httpType = model.HttpType
} }
var exportUrl string = fmt.Sprintf("%s%s/static/%s", httpType, c.Request.Host, exportFileName) var exportUrl string
exportUrl = fmt.Sprintf("%s%s/static/%s", httpType, c.Request.Host, exportFileName)
response.ResponseQuickMsg(c, msg.Ok, resp.Msg, map[string]string{ response.ResponseQuickMsg(c, msg.Ok, resp.Msg, map[string]string{
"exportUrl": exportUrl, "exportUrl": exportUrl,
}) })
@ -131,23 +209,65 @@ func ExportRegister(c *gin.Context) {
} }
func GetCardIdWithImg(c *gin.Context) { func OcrBase64(c *gin.Context) {
var listReq artist.GetCardIdWithImgReq
if err := c.ShouldBind(&listReq); err != nil { var req model.OcrQuery
logger.Errorf("GetCardIdWithImg ShouldBind err", err)
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil) if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
logger.Errorf("OcrBase64 ShouldBind err", err)
response.ResponseQuickMsg(c, msg.Fail, msg.INVALID_PARAMS, nil)
return return
} }
if err := listReq.Validate(); err != nil {
err = utils.SubstrError(err) img := req.IdCardUrl
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil)
response1, err := http.Get(img)
if err != nil {
fmt.Println("网络请求错误:", err)
return return
} }
resp, err := GrpcArtistImpl.GetCardIdWithImg(context.Background(), &listReq)
defer response1.Body.Close()
// 读取图片数据
imageData, err := ioutil.ReadAll(response1.Body)
if err != nil {
fmt.Println("读取图片数据错误:", err)
return
}
// 将图片数据转换为base64编码
base64Data := base64.StdEncoding.EncodeToString(imageData)
fmt.Println(base64Data)
side := ""
if req.Side == 1 {
side = "front"
} else {
side = "back"
}
result, err := model.OcrGetIdCard(base64Data, side)
if err != nil { if err != nil {
response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil) response.ResponseQuickMsg(c, msg.Fail, err.Error(), nil)
return return
} }
response.ResponseQuickMsg(c, msg.Ok, resp.Msg, resp)
res := model.OcrRes{}
if side == "front" {
res.IDNum = result.IdCard
res.RealName = result.Name
res.Path = result.Path
res.Age = result.Age
res.Birthday = result.Birthday
res.Sex = result.Sex
fmt.Println("身份证和名字", res.IDNum, res.RealName)
res.CheckIdAndName()
fmt.Println("身份证和名字", res.IDNum, res.RealName)
} else {
res.IssueDate = result.IssueDate
res.ExpirationDate = result.ExpirationDate
}
response.ResponseQuickMsg(c, msg.Ok, "操作成功", res)
return return
} }