添加db操作。

This commit is contained in:
guoqiang 2023-12-17 15:48:47 +08:00
parent bda8ee73ad
commit cedb477402
14 changed files with 1052 additions and 23 deletions

1
.gitignore vendored
View File

@ -25,3 +25,4 @@ go.work
.idea .idea
.DS_Store .DS_Store
vendor

View File

@ -114,6 +114,344 @@ func (x *GreetResponse) GetResult() string {
return "" return ""
} }
type CreateUserRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
Mobile string `protobuf:"bytes,2,opt,name=mobile,proto3" json:"mobile,omitempty"`
Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"`
Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"`
}
func (x *CreateUserRequest) Reset() {
*x = CreateUserRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_hello_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CreateUserRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CreateUserRequest) ProtoMessage() {}
func (x *CreateUserRequest) ProtoReflect() protoreflect.Message {
mi := &file_hello_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 CreateUserRequest.ProtoReflect.Descriptor instead.
func (*CreateUserRequest) Descriptor() ([]byte, []int) {
return file_hello_proto_rawDescGZIP(), []int{2}
}
func (x *CreateUserRequest) GetUsername() string {
if x != nil {
return x.Username
}
return ""
}
func (x *CreateUserRequest) GetMobile() string {
if x != nil {
return x.Mobile
}
return ""
}
func (x *CreateUserRequest) GetPassword() string {
if x != nil {
return x.Password
}
return ""
}
func (x *CreateUserRequest) GetEmail() string {
if x != nil {
return x.Email
}
return ""
}
type CreateUserResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
}
func (x *CreateUserResponse) Reset() {
*x = CreateUserResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_hello_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CreateUserResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CreateUserResponse) ProtoMessage() {}
func (x *CreateUserResponse) ProtoReflect() protoreflect.Message {
mi := &file_hello_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 CreateUserResponse.ProtoReflect.Descriptor instead.
func (*CreateUserResponse) Descriptor() ([]byte, []int) {
return file_hello_proto_rawDescGZIP(), []int{3}
}
func (x *CreateUserResponse) GetId() int64 {
if x != nil {
return x.Id
}
return 0
}
type GetUserRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
}
func (x *GetUserRequest) Reset() {
*x = GetUserRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_hello_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *GetUserRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetUserRequest) ProtoMessage() {}
func (x *GetUserRequest) ProtoReflect() protoreflect.Message {
mi := &file_hello_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 GetUserRequest.ProtoReflect.Descriptor instead.
func (*GetUserRequest) Descriptor() ([]byte, []int) {
return file_hello_proto_rawDescGZIP(), []int{4}
}
func (x *GetUserRequest) GetId() int64 {
if x != nil {
return x.Id
}
return 0
}
type GetUserResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"`
Mobile string `protobuf:"bytes,3,opt,name=mobile,proto3" json:"mobile,omitempty"`
Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"`
}
func (x *GetUserResponse) Reset() {
*x = GetUserResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_hello_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *GetUserResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetUserResponse) ProtoMessage() {}
func (x *GetUserResponse) ProtoReflect() protoreflect.Message {
mi := &file_hello_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 GetUserResponse.ProtoReflect.Descriptor instead.
func (*GetUserResponse) Descriptor() ([]byte, []int) {
return file_hello_proto_rawDescGZIP(), []int{5}
}
func (x *GetUserResponse) GetId() int64 {
if x != nil {
return x.Id
}
return 0
}
func (x *GetUserResponse) GetUsername() string {
if x != nil {
return x.Username
}
return ""
}
func (x *GetUserResponse) GetMobile() string {
if x != nil {
return x.Mobile
}
return ""
}
func (x *GetUserResponse) GetEmail() string {
if x != nil {
return x.Email
}
return ""
}
type CheckPasswordRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
}
func (x *CheckPasswordRequest) Reset() {
*x = CheckPasswordRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_hello_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CheckPasswordRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CheckPasswordRequest) ProtoMessage() {}
func (x *CheckPasswordRequest) ProtoReflect() protoreflect.Message {
mi := &file_hello_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 CheckPasswordRequest.ProtoReflect.Descriptor instead.
func (*CheckPasswordRequest) Descriptor() ([]byte, []int) {
return file_hello_proto_rawDescGZIP(), []int{6}
}
func (x *CheckPasswordRequest) GetUsername() string {
if x != nil {
return x.Username
}
return ""
}
func (x *CheckPasswordRequest) GetPassword() string {
if x != nil {
return x.Password
}
return ""
}
type CheckPasswordResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"`
}
func (x *CheckPasswordResponse) Reset() {
*x = CheckPasswordResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_hello_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CheckPasswordResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CheckPasswordResponse) ProtoMessage() {}
func (x *CheckPasswordResponse) ProtoReflect() protoreflect.Message {
mi := &file_hello_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 CheckPasswordResponse.ProtoReflect.Descriptor instead.
func (*CheckPasswordResponse) Descriptor() ([]byte, []int) {
return file_hello_proto_rawDescGZIP(), []int{7}
}
func (x *CheckPasswordResponse) GetOk() bool {
if x != nil {
return x.Ok
}
return false
}
var File_hello_proto protoreflect.FileDescriptor var File_hello_proto protoreflect.FileDescriptor
var file_hello_proto_rawDesc = []byte{ var file_hello_proto_rawDesc = []byte{
@ -123,20 +461,59 @@ var file_hello_proto_rawDesc = []byte{
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67,
0x22, 0x27, 0x0a, 0x0d, 0x47, 0x72, 0x65, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x22, 0x27, 0x0a, 0x0d, 0x47, 0x72, 0x65, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x32, 0x85, 0x01, 0x0a, 0x0c, 0x47, 0x72, 0x09, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x79, 0x0a, 0x11, 0x43, 0x72, 0x65,
0x65, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x47, 0x72, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a,
0x65, 0x65, 0x74, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x72, 0x65, 0x65, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x6f,
0x2e, 0x47, 0x72, 0x65, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62, 0x69,
0x12, 0x3f, 0x0a, 0x0e, 0x47, 0x72, 0x65, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x54, 0x69, 0x6d, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03,
0x65, 0x73, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x72, 0x65, 0x65, 0x74, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65,
0x47, 0x72, 0x65, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x24, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73,
0x01, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x2e, 0x67, 0x71, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x75, 0x6f, 0x71, 0x69, 0x61, 0x6e, 0x67, 0x2f, 0x67, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65,
0x70, 0x63, 0x65, 0x78, 0x65, 0x72, 0x63, 0x69, 0x73, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02,
0x75, 0x6c, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6b, 0x0a, 0x0f,
0x33, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12,
0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d,
0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x62,
0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01,
0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x4e, 0x0a, 0x14, 0x43, 0x68, 0x65,
0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a,
0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x27, 0x0a, 0x15, 0x43, 0x68, 0x65,
0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02,
0x6f, 0x6b, 0x32, 0xd4, 0x02, 0x0a, 0x0c, 0x47, 0x72, 0x65, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76,
0x69, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x47, 0x72, 0x65, 0x65, 0x74, 0x12, 0x13, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x72, 0x65, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x72, 0x65, 0x65, 0x74, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0e, 0x47, 0x72, 0x65,
0x65, 0x74, 0x4d, 0x61, 0x6e, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x13, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x72, 0x65, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x72, 0x65, 0x65, 0x74, 0x52, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65,
0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65,
0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70,
0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
0x55, 0x73, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65,
0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65,
0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0d, 0x43,
0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1b, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f,
0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74,
0x2e, 0x67, 0x71, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x75, 0x6f,
0x71, 0x69, 0x61, 0x6e, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x65, 0x78, 0x65, 0x72, 0x63, 0x69,
0x73, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x70,
0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
} }
var ( var (
@ -151,18 +528,30 @@ func file_hello_proto_rawDescGZIP() []byte {
return file_hello_proto_rawDescData return file_hello_proto_rawDescData
} }
var file_hello_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_hello_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_hello_proto_goTypes = []interface{}{ var file_hello_proto_goTypes = []interface{}{
(*GreetRequest)(nil), // 0: proto.GreetRequest (*GreetRequest)(nil), // 0: proto.GreetRequest
(*GreetResponse)(nil), // 1: proto.GreetResponse (*GreetResponse)(nil), // 1: proto.GreetResponse
(*CreateUserRequest)(nil), // 2: proto.CreateUserRequest
(*CreateUserResponse)(nil), // 3: proto.CreateUserResponse
(*GetUserRequest)(nil), // 4: proto.GetUserRequest
(*GetUserResponse)(nil), // 5: proto.GetUserResponse
(*CheckPasswordRequest)(nil), // 6: proto.CheckPasswordRequest
(*CheckPasswordResponse)(nil), // 7: proto.CheckPasswordResponse
} }
var file_hello_proto_depIdxs = []int32{ var file_hello_proto_depIdxs = []int32{
0, // 0: proto.GreetService.Greet:input_type -> proto.GreetRequest 0, // 0: proto.GreetService.Greet:input_type -> proto.GreetRequest
0, // 1: proto.GreetService.GreetManyTimes:input_type -> proto.GreetRequest 0, // 1: proto.GreetService.GreetManyTimes:input_type -> proto.GreetRequest
1, // 2: proto.GreetService.Greet:output_type -> proto.GreetResponse 4, // 2: proto.GreetService.GetUser:input_type -> proto.GetUserRequest
1, // 3: proto.GreetService.GreetManyTimes:output_type -> proto.GreetResponse 2, // 3: proto.GreetService.CreateUser:input_type -> proto.CreateUserRequest
2, // [2:4] is the sub-list for method output_type 6, // 4: proto.GreetService.CheckPassword:input_type -> proto.CheckPasswordRequest
0, // [0:2] is the sub-list for method input_type 1, // 5: proto.GreetService.Greet:output_type -> proto.GreetResponse
1, // 6: proto.GreetService.GreetManyTimes:output_type -> proto.GreetResponse
5, // 7: proto.GreetService.GetUser:output_type -> proto.GetUserResponse
3, // 8: proto.GreetService.CreateUser:output_type -> proto.CreateUserResponse
7, // 9: proto.GreetService.CheckPassword:output_type -> proto.CheckPasswordResponse
5, // [5:10] is the sub-list for method output_type
0, // [0:5] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name 0, // [0:0] is the sub-list for field type_name
@ -198,6 +587,78 @@ func file_hello_proto_init() {
return nil return nil
} }
} }
file_hello_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateUserRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_hello_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CreateUserResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_hello_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*GetUserRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_hello_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*GetUserResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_hello_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CheckPasswordRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_hello_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CheckPasswordResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
} }
type x struct{} type x struct{}
out := protoimpl.TypeBuilder{ out := protoimpl.TypeBuilder{
@ -205,7 +666,7 @@ func file_hello_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_hello_proto_rawDesc, RawDescriptor: file_hello_proto_rawDesc,
NumEnums: 0, NumEnums: 0,
NumMessages: 2, NumMessages: 8,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },

View File

@ -21,6 +21,9 @@ const _ = grpc.SupportPackageIsVersion7
const ( const (
GreetService_Greet_FullMethodName = "/proto.GreetService/Greet" GreetService_Greet_FullMethodName = "/proto.GreetService/Greet"
GreetService_GreetManyTimes_FullMethodName = "/proto.GreetService/GreetManyTimes" GreetService_GreetManyTimes_FullMethodName = "/proto.GreetService/GreetManyTimes"
GreetService_GetUser_FullMethodName = "/proto.GreetService/GetUser"
GreetService_CreateUser_FullMethodName = "/proto.GreetService/CreateUser"
GreetService_CheckPassword_FullMethodName = "/proto.GreetService/CheckPassword"
) )
// GreetServiceClient is the client API for GreetService service. // GreetServiceClient is the client API for GreetService service.
@ -29,6 +32,9 @@ const (
type GreetServiceClient interface { type GreetServiceClient interface {
Greet(ctx context.Context, in *GreetRequest, opts ...grpc.CallOption) (*GreetResponse, error) Greet(ctx context.Context, in *GreetRequest, opts ...grpc.CallOption) (*GreetResponse, error)
GreetManyTimes(ctx context.Context, in *GreetRequest, opts ...grpc.CallOption) (GreetService_GreetManyTimesClient, error) GreetManyTimes(ctx context.Context, in *GreetRequest, opts ...grpc.CallOption) (GreetService_GreetManyTimesClient, error)
GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error)
CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error)
CheckPassword(ctx context.Context, in *CheckPasswordRequest, opts ...grpc.CallOption) (*CheckPasswordResponse, error)
} }
type greetServiceClient struct { type greetServiceClient struct {
@ -80,12 +86,42 @@ func (x *greetServiceGreetManyTimesClient) Recv() (*GreetResponse, error) {
return m, nil return m, nil
} }
func (c *greetServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) {
out := new(GetUserResponse)
err := c.cc.Invoke(ctx, GreetService_GetUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *greetServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error) {
out := new(CreateUserResponse)
err := c.cc.Invoke(ctx, GreetService_CreateUser_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *greetServiceClient) CheckPassword(ctx context.Context, in *CheckPasswordRequest, opts ...grpc.CallOption) (*CheckPasswordResponse, error) {
out := new(CheckPasswordResponse)
err := c.cc.Invoke(ctx, GreetService_CheckPassword_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// GreetServiceServer is the server API for GreetService service. // GreetServiceServer is the server API for GreetService service.
// All implementations must embed UnimplementedGreetServiceServer // All implementations must embed UnimplementedGreetServiceServer
// for forward compatibility // for forward compatibility
type GreetServiceServer interface { type GreetServiceServer interface {
Greet(context.Context, *GreetRequest) (*GreetResponse, error) Greet(context.Context, *GreetRequest) (*GreetResponse, error)
GreetManyTimes(*GreetRequest, GreetService_GreetManyTimesServer) error GreetManyTimes(*GreetRequest, GreetService_GreetManyTimesServer) error
GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)
CreateUser(context.Context, *CreateUserRequest) (*CreateUserResponse, error)
CheckPassword(context.Context, *CheckPasswordRequest) (*CheckPasswordResponse, error)
mustEmbedUnimplementedGreetServiceServer() mustEmbedUnimplementedGreetServiceServer()
} }
@ -99,6 +135,15 @@ func (UnimplementedGreetServiceServer) Greet(context.Context, *GreetRequest) (*G
func (UnimplementedGreetServiceServer) GreetManyTimes(*GreetRequest, GreetService_GreetManyTimesServer) error { func (UnimplementedGreetServiceServer) GreetManyTimes(*GreetRequest, GreetService_GreetManyTimesServer) error {
return status.Errorf(codes.Unimplemented, "method GreetManyTimes not implemented") return status.Errorf(codes.Unimplemented, "method GreetManyTimes not implemented")
} }
func (UnimplementedGreetServiceServer) GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented")
}
func (UnimplementedGreetServiceServer) CreateUser(context.Context, *CreateUserRequest) (*CreateUserResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented")
}
func (UnimplementedGreetServiceServer) CheckPassword(context.Context, *CheckPasswordRequest) (*CheckPasswordResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CheckPassword not implemented")
}
func (UnimplementedGreetServiceServer) mustEmbedUnimplementedGreetServiceServer() {} func (UnimplementedGreetServiceServer) mustEmbedUnimplementedGreetServiceServer() {}
// UnsafeGreetServiceServer may be embedded to opt out of forward compatibility for this service. // UnsafeGreetServiceServer may be embedded to opt out of forward compatibility for this service.
@ -151,6 +196,60 @@ func (x *greetServiceGreetManyTimesServer) Send(m *GreetResponse) error {
return x.ServerStream.SendMsg(m) return x.ServerStream.SendMsg(m)
} }
func _GreetService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetUserRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(GreetServiceServer).GetUser(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: GreetService_GetUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(GreetServiceServer).GetUser(ctx, req.(*GetUserRequest))
}
return interceptor(ctx, in, info, handler)
}
func _GreetService_CreateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateUserRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(GreetServiceServer).CreateUser(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: GreetService_CreateUser_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(GreetServiceServer).CreateUser(ctx, req.(*CreateUserRequest))
}
return interceptor(ctx, in, info, handler)
}
func _GreetService_CheckPassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CheckPasswordRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(GreetServiceServer).CheckPassword(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: GreetService_CheckPassword_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(GreetServiceServer).CheckPassword(ctx, req.(*CheckPasswordRequest))
}
return interceptor(ctx, in, info, handler)
}
// GreetService_ServiceDesc is the grpc.ServiceDesc for GreetService service. // GreetService_ServiceDesc is the grpc.ServiceDesc for GreetService service.
// It's only intended for direct use with grpc.RegisterService, // It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy) // and not to be introspected or modified (even as a copy)
@ -162,6 +261,18 @@ var GreetService_ServiceDesc = grpc.ServiceDesc{
MethodName: "Greet", MethodName: "Greet",
Handler: _GreetService_Greet_Handler, Handler: _GreetService_Greet_Handler,
}, },
{
MethodName: "GetUser",
Handler: _GreetService_GetUser_Handler,
},
{
MethodName: "CreateUser",
Handler: _GreetService_CreateUser_Handler,
},
{
MethodName: "CheckPassword",
Handler: _GreetService_CheckPassword_Handler,
},
}, },
Streams: []grpc.StreamDesc{ Streams: []grpc.StreamDesc{
{ {

View File

@ -0,0 +1,53 @@
package conn
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/pkg/errors"
"log"
)
type MySQLConn struct {
Host string
Port int
Username string
Password string
DBName string
}
var mysqlDB *sql.DB
// InitMySQLConn 初始化mysql连接
func InitMySQLConn(cfg *MySQLConn) error {
var err error
mysqlDB, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.Username, cfg.Password, cfg.Host, cfg.Port, cfg.DBName))
if err != nil {
return errors.Wrap(err, "open mysql failed")
}
mysqlDB.SetMaxIdleConns(5)
mysqlDB.SetMaxOpenConns(50)
// ping
if err = mysqlDB.Ping(); err != nil {
return errors.Wrap(err, "ping mysql failed")
}
log.Printf("connect mysql successfully, host:%s, port:%d\n", cfg.Host, cfg.Port)
return nil
}
func GetMySQLConn() *sql.DB {
return mysqlDB
}
func CloseMySQLConn() error {
if mysqlDB == nil {
return nil
}
return mysqlDB.Close()
}

View File

@ -0,0 +1,14 @@
-- name: CreateUser :execresult
INSERT INTO grpcstudy.user (username, mobile, email, password) VALUES (?, ?, ?, ?);
-- name: GetUserById :one
SELECT * FROM grpcstudy.user WHERE id = ? LIMIT 1;
-- name: GetUserByUsername :one
SELECT * FROM grpcstudy.user WHERE username = ? LIMIT 1;
-- name: GetUserByMobile :one
SELECT * FROM grpcstudy.user WHERE mobile = ? LIMIT 1;
-- name: ListUsers :many
SELECT * FROM grpcstudy.user ORDER BY id DESC LIMIT ? OFFSET ?;

View File

@ -0,0 +1,14 @@
create database if not exists `grpcstudy`;
CREATE TABLE grpcstudy.`user` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名',
`mobile` char(11) NOT NULL COMMENT '手机号',
`email` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '邮箱',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`modified_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`password` varbinary(60) NOT NULL DEFAULT '' COMMENT '密码hash',
PRIMARY KEY (`id`),
UNIQUE KEY `udx_mobile` (`mobile`) USING BTREE,
UNIQUE KEY `udx_email` (`email`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

View File

@ -0,0 +1,9 @@
version: "2"
sql:
- engine: "mysql"
queries: "query.sql"
schema: "schema.sql"
gen:
go:
package: "user"
out: "user"

View File

@ -0,0 +1,31 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.20.0
package user
import (
"context"
"database/sql"
)
type DBTX interface {
ExecContext(context.Context, string, ...interface{}) (sql.Result, error)
PrepareContext(context.Context, string) (*sql.Stmt, error)
QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error)
QueryRowContext(context.Context, string, ...interface{}) *sql.Row
}
func New(db DBTX) *Queries {
return &Queries{db: db}
}
type Queries struct {
db DBTX
}
func (q *Queries) WithTx(tx *sql.Tx) *Queries {
return &Queries{
db: tx,
}
}

View File

@ -0,0 +1,25 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.20.0
package user
import (
"time"
)
type GrpcstudyUser struct {
ID uint32
// 用户名
Username string
// 手机号
Mobile string
// 邮箱
Email string
// 添加时间
CreatedAt time.Time
// 更新时间
ModifiedAt time.Time
// 密码hash
Password []byte
}

View File

@ -0,0 +1,128 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.20.0
// source: query.sql
package user
import (
"context"
"database/sql"
)
const createUser = `-- name: CreateUser :execresult
INSERT INTO grpcstudy.user (username, mobile, email, password) VALUES (?, ?, ?, ?)
`
type CreateUserParams struct {
Username string
Mobile string
Email string
Password []byte
}
func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (sql.Result, error) {
return q.db.ExecContext(ctx, createUser,
arg.Username,
arg.Mobile,
arg.Email,
arg.Password,
)
}
const getUserById = `-- name: GetUserById :one
SELECT id, username, mobile, email, created_at, modified_at, password FROM grpcstudy.user WHERE id = ? LIMIT 1
`
func (q *Queries) GetUserById(ctx context.Context, id uint32) (GrpcstudyUser, error) {
row := q.db.QueryRowContext(ctx, getUserById, id)
var i GrpcstudyUser
err := row.Scan(
&i.ID,
&i.Username,
&i.Mobile,
&i.Email,
&i.CreatedAt,
&i.ModifiedAt,
&i.Password,
)
return i, err
}
const getUserByMobile = `-- name: GetUserByMobile :one
SELECT id, username, mobile, email, created_at, modified_at, password FROM grpcstudy.user WHERE mobile = ? LIMIT 1
`
func (q *Queries) GetUserByMobile(ctx context.Context, mobile string) (GrpcstudyUser, error) {
row := q.db.QueryRowContext(ctx, getUserByMobile, mobile)
var i GrpcstudyUser
err := row.Scan(
&i.ID,
&i.Username,
&i.Mobile,
&i.Email,
&i.CreatedAt,
&i.ModifiedAt,
&i.Password,
)
return i, err
}
const getUserByUsername = `-- name: GetUserByUsername :one
SELECT id, username, mobile, email, created_at, modified_at, password FROM grpcstudy.user WHERE username = ? LIMIT 1
`
func (q *Queries) GetUserByUsername(ctx context.Context, username string) (GrpcstudyUser, error) {
row := q.db.QueryRowContext(ctx, getUserByUsername, username)
var i GrpcstudyUser
err := row.Scan(
&i.ID,
&i.Username,
&i.Mobile,
&i.Email,
&i.CreatedAt,
&i.ModifiedAt,
&i.Password,
)
return i, err
}
const listUsers = `-- name: ListUsers :many
SELECT id, username, mobile, email, created_at, modified_at, password FROM grpcstudy.user ORDER BY id DESC LIMIT ? OFFSET ?
`
type ListUsersParams struct {
Limit int32
Offset int32
}
func (q *Queries) ListUsers(ctx context.Context, arg ListUsersParams) ([]GrpcstudyUser, error) {
rows, err := q.db.QueryContext(ctx, listUsers, arg.Limit, arg.Offset)
if err != nil {
return nil, err
}
defer rows.Close()
var items []GrpcstudyUser
for rows.Next() {
var i GrpcstudyUser
if err := rows.Scan(
&i.ID,
&i.Username,
&i.Mobile,
&i.Email,
&i.CreatedAt,
&i.ModifiedAt,
&i.Password,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}

View File

@ -7,6 +7,9 @@ option go_package = "git.gqnotes.com/guoqiang/grpcexercises/consuldemo/pb";
service GreetService { service GreetService {
rpc Greet(GreetRequest) returns (GreetResponse) {} rpc Greet(GreetRequest) returns (GreetResponse) {}
rpc GreetManyTimes(GreetRequest) returns (stream GreetResponse) {} rpc GreetManyTimes(GreetRequest) returns (stream GreetResponse) {}
rpc GetUser(GetUserRequest) returns (GetUserResponse) {}
rpc CreateUser(CreateUserRequest) returns (CreateUserResponse) {}
rpc CheckPassword(CheckPasswordRequest) returns (CheckPasswordResponse) {}
} }
message GreetRequest { message GreetRequest {
@ -16,3 +19,37 @@ message GreetRequest {
message GreetResponse { message GreetResponse {
string result = 1; string result = 1;
} }
message CreateUserRequest {
string username = 1;
string mobile = 2;
string password = 3;
string email = 4;
}
message CreateUserResponse {
int64 id = 1;
}
message GetUserRequest {
int64 id = 1;
}
message GetUserResponse {
int64 id = 1;
string username = 2;
string mobile = 3;
string email = 4;
}
message CheckPasswordRequest {
string username = 1;
string password = 2;
}
message CheckPasswordResponse {
bool ok = 1;
}

View File

@ -2,9 +2,17 @@ package main
import ( import (
"context" "context"
"database/sql"
"fmt"
"git.gqnotes.com/guoqiang/grpcexercises/consuldemo/pkg/consul" "git.gqnotes.com/guoqiang/grpcexercises/consuldemo/pkg/consul"
"git.gqnotes.com/guoqiang/grpcexercises/consuldemo/pkg/db/conn"
"git.gqnotes.com/guoqiang/grpcexercises/consuldemo/pkg/db/user"
"github.com/hashicorp/consul/api" "github.com/hashicorp/consul/api"
"github.com/pkg/errors"
"golang.org/x/crypto/bcrypt"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/reflection" "google.golang.org/grpc/reflection"
"google.golang.org/grpc/status"
"log" "log"
"net" "net"
"net/http" "net/http"
@ -35,7 +43,7 @@ func main() {
s := grpc.NewServer() s := grpc.NewServer()
pb.RegisterGreetServiceServer(s, &Server{}) pb.RegisterGreetServiceServer(s, &Server{logger: logger})
reflection.Register(s) reflection.Register(s)
@ -44,6 +52,16 @@ func main() {
// 启动相关服务 // 启动相关服务
var gg errgroup.Group var gg errgroup.Group
gg.Go(func() error {
return conn.InitMySQLConn(&conn.MySQLConn{
Host: "localhost",
Port: 3306,
Username: "test1",
Password: "test1",
DBName: "grpcstudy",
})
})
gg.Go(func() error { gg.Go(func() error {
logger.Debug("grpc server start") logger.Debug("grpc server start")
@ -129,6 +147,7 @@ func main() {
type Server struct { type Server struct {
pb.UnimplementedGreetServiceServer pb.UnimplementedGreetServiceServer
logger *zap.Logger
} }
func (s *Server) Greet(ctx context.Context, req *pb.GreetRequest) (resp *pb.GreetResponse, err error) { func (s *Server) Greet(ctx context.Context, req *pb.GreetRequest) (resp *pb.GreetResponse, err error) {
@ -160,3 +179,123 @@ func (s *Server) GreetManyTimes(request *pb.GreetRequest, stream pb.GreetService
return return
} }
// CreateUser 创建用户
func (s *Server) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (resp *pb.CreateUserResponse, err error) {
resp = &pb.CreateUserResponse{}
// 获取密码hash值
passwordHash, err := bcrypt.GenerateFromPassword([]byte(req.Password), 12)
if err != nil {
err = status.Error(codes.Internal, "password hash failed:"+err.Error())
return
}
queries := user.New(conn.GetMySQLConn())
result, err := queries.CreateUser(ctx, user.CreateUserParams{
Username: req.Username,
Mobile: req.Mobile,
Email: req.Email,
Password: passwordHash,
})
if err != nil {
err = status.Error(codes.Internal, "create user failed:"+err.Error())
return
}
// 获取插入的id
id, err := result.LastInsertId()
if err != nil {
err = status.Error(codes.Internal, "create user failed")
return
}
resp.Id = id
return
}
// GetUser 获取用户
func (s *Server) GetUser(ctx context.Context, req *pb.GetUserRequest) (resp *pb.GetUserResponse, err error) {
resp = &pb.GetUserResponse{}
defer func() {
if err1 := recover(); err1 != nil {
s.logger.Fatal("get user failed", zap.Any("err", err1))
err = status.Error(codes.Internal, fmt.Sprintf("panic: %v", err1))
}
if err != nil {
s.logger.Error("get user failed", zap.Error(err))
} else {
s.logger.Info("get user success")
}
}()
queries := user.New(conn.GetMySQLConn())
result, err := queries.GetUserById(ctx, uint32(req.Id))
if err != nil {
if !errors.Is(err, sql.ErrNoRows) {
err = status.Error(codes.Internal, "get user failed")
return
}
err = status.Error(codes.NotFound, "user not found")
return
}
resp.Id = int64(result.ID)
resp.Username = result.Username
resp.Mobile = result.Mobile
resp.Email = result.Email
return
}
// CheckPassword 校验密码
func (s *Server) CheckPassword(ctx context.Context, req *pb.CheckPasswordRequest) (resp *pb.CheckPasswordResponse, err error) {
resp = &pb.CheckPasswordResponse{}
defer func() {
if err1 := recover(); err1 != nil {
s.logger.Fatal("check password failed", zap.Any("err", err1))
err = status.Error(codes.Internal, fmt.Sprintf("panic: %v", err1))
}
if err != nil {
s.logger.Error("check password failed", zap.Error(err))
} else {
s.logger.Info("check password success")
}
}()
queries := user.New(conn.GetMySQLConn())
// 查询用户信息
result, err := queries.GetUserByUsername(ctx, req.Username)
if err != nil {
if !errors.Is(err, sql.ErrNoRows) {
err = status.Error(codes.Internal, "check password failed:"+err.Error())
return
}
err = status.Error(codes.NotFound, "user not found")
return
}
// 校验密码
if err = bcrypt.CompareHashAndPassword(result.Password, []byte(req.Password)); err != nil {
err = status.Error(codes.Unauthenticated, "password incorrect")
return
}
resp.Ok = true
return
}

2
go.mod
View File

@ -3,9 +3,11 @@ module git.gqnotes.com/guoqiang/grpcexercises
go 1.21.4 go 1.21.4
require ( require (
github.com/go-sql-driver/mysql v1.7.1
github.com/hashicorp/consul/api v1.26.1 github.com/hashicorp/consul/api v1.26.1
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
go.uber.org/zap v1.26.0 go.uber.org/zap v1.26.0
golang.org/x/crypto v0.14.0
golang.org/x/sync v0.3.0 golang.org/x/sync v0.3.0
google.golang.org/grpc v1.59.0 google.golang.org/grpc v1.59.0
google.golang.org/protobuf v1.31.0 google.golang.org/protobuf v1.31.0

4
go.sum
View File

@ -29,6 +29,8 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@ -176,6 +178,8 @@ go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ=
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=