diff --git a/rpc/message/message.pb b/rpc/message/message.pb new file mode 100644 index 0000000..7b20ecf Binary files /dev/null and b/rpc/message/message.pb differ diff --git a/rpc/message/message.proto b/rpc/message/message.proto new file mode 100644 index 0000000..98aaec2 --- /dev/null +++ b/rpc/message/message.proto @@ -0,0 +1,59 @@ +syntax = "proto3"; + +package message; +import "google/api/annotations.proto"; +option go_package="lone-services/rpc/message"; + +message Response { + int32 code = 1; + string msg = 2; + string data = 3; +} + +message AddResponse { + int32 num = 1; +} + +message ItemsRequest { + int32 page = 1; + int32 size = 2; + int32 type =3; +} + +message AddRequest { + string content = 1; + int32 target_type = 2; + int64 target_id = 3; + int32 type_status = 4; + int32 type = 5; + int64 obj_id = 6; +} + +message ApiMessageNumberRequest { + int32 type = 1; +} + + +service Message { + rpc AdminMessage(ItemsRequest) returns(Response){ + option (google.api.http) = { + get: "/admin/v3/message/items" + body: "*" + }; + }; + + rpc ApiMessage(ItemsRequest) returns(Response){ + option (google.api.http) = { + get: "/api/v3/message/items" + body: "*" + }; + }; + rpc ApiMessageNumber(ApiMessageNumberRequest) returns(Response){ + option (google.api.http) = { + get: "/api/v3/message/Number" + body: "*" + }; + }; + + rpc MessageAdd(AddRequest) returns(AddResponse); +} diff --git a/rpc/message/pb/message.pb.go b/rpc/message/pb/message.pb.go new file mode 100644 index 0000000..999f701 --- /dev/null +++ b/rpc/message/pb/message.pb.go @@ -0,0 +1,410 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v4.25.8 +// source: message/message.proto + +package message + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Response struct { + state protoimpl.MessageState `protogen:"open.v1"` + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` + Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Response) Reset() { + *x = Response{} + mi := &file_message_message_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_message_message_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Response.ProtoReflect.Descriptor instead. +func (*Response) Descriptor() ([]byte, []int) { + return file_message_message_proto_rawDescGZIP(), []int{0} +} + +func (x *Response) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *Response) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +func (x *Response) GetData() string { + if x != nil { + return x.Data + } + return "" +} + +type AddResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Num int32 `protobuf:"varint,1,opt,name=num,proto3" json:"num,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddResponse) Reset() { + *x = AddResponse{} + mi := &file_message_message_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddResponse) ProtoMessage() {} + +func (x *AddResponse) ProtoReflect() protoreflect.Message { + mi := &file_message_message_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddResponse.ProtoReflect.Descriptor instead. +func (*AddResponse) Descriptor() ([]byte, []int) { + return file_message_message_proto_rawDescGZIP(), []int{1} +} + +func (x *AddResponse) GetNum() int32 { + if x != nil { + return x.Num + } + return 0 +} + +type ItemsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Page int32 `protobuf:"varint,1,opt,name=page,proto3" json:"page,omitempty"` + Size int32 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + Type int32 `protobuf:"varint,3,opt,name=type,proto3" json:"type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ItemsRequest) Reset() { + *x = ItemsRequest{} + mi := &file_message_message_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ItemsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ItemsRequest) ProtoMessage() {} + +func (x *ItemsRequest) ProtoReflect() protoreflect.Message { + mi := &file_message_message_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ItemsRequest.ProtoReflect.Descriptor instead. +func (*ItemsRequest) Descriptor() ([]byte, []int) { + return file_message_message_proto_rawDescGZIP(), []int{2} +} + +func (x *ItemsRequest) GetPage() int32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *ItemsRequest) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *ItemsRequest) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +type AddRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` + TargetType int32 `protobuf:"varint,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` + TargetId int64 `protobuf:"varint,3,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + TypeStatus int32 `protobuf:"varint,4,opt,name=type_status,json=typeStatus,proto3" json:"type_status,omitempty"` + Type int32 `protobuf:"varint,5,opt,name=type,proto3" json:"type,omitempty"` + ObjId int64 `protobuf:"varint,6,opt,name=obj_id,json=objId,proto3" json:"obj_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AddRequest) Reset() { + *x = AddRequest{} + mi := &file_message_message_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AddRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddRequest) ProtoMessage() {} + +func (x *AddRequest) ProtoReflect() protoreflect.Message { + mi := &file_message_message_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddRequest.ProtoReflect.Descriptor instead. +func (*AddRequest) Descriptor() ([]byte, []int) { + return file_message_message_proto_rawDescGZIP(), []int{3} +} + +func (x *AddRequest) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *AddRequest) GetTargetType() int32 { + if x != nil { + return x.TargetType + } + return 0 +} + +func (x *AddRequest) GetTargetId() int64 { + if x != nil { + return x.TargetId + } + return 0 +} + +func (x *AddRequest) GetTypeStatus() int32 { + if x != nil { + return x.TypeStatus + } + return 0 +} + +func (x *AddRequest) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *AddRequest) GetObjId() int64 { + if x != nil { + return x.ObjId + } + return 0 +} + +type ApiMessageNumberRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type int32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ApiMessageNumberRequest) Reset() { + *x = ApiMessageNumberRequest{} + mi := &file_message_message_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ApiMessageNumberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApiMessageNumberRequest) ProtoMessage() {} + +func (x *ApiMessageNumberRequest) ProtoReflect() protoreflect.Message { + mi := &file_message_message_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ApiMessageNumberRequest.ProtoReflect.Descriptor instead. +func (*ApiMessageNumberRequest) Descriptor() ([]byte, []int) { + return file_message_message_proto_rawDescGZIP(), []int{4} +} + +func (x *ApiMessageNumberRequest) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +var File_message_message_proto protoreflect.FileDescriptor + +const file_message_message_proto_rawDesc = "" + + "\n" + + "\x15message/message.proto\x12\amessage\x1a\x1cgoogle/api/annotations.proto\"D\n" + + "\bResponse\x12\x12\n" + + "\x04code\x18\x01 \x01(\x05R\x04code\x12\x10\n" + + "\x03msg\x18\x02 \x01(\tR\x03msg\x12\x12\n" + + "\x04data\x18\x03 \x01(\tR\x04data\"\x1f\n" + + "\vAddResponse\x12\x10\n" + + "\x03num\x18\x01 \x01(\x05R\x03num\"J\n" + + "\fItemsRequest\x12\x12\n" + + "\x04page\x18\x01 \x01(\x05R\x04page\x12\x12\n" + + "\x04size\x18\x02 \x01(\x05R\x04size\x12\x12\n" + + "\x04type\x18\x03 \x01(\x05R\x04type\"\xb0\x01\n" + + "\n" + + "AddRequest\x12\x18\n" + + "\acontent\x18\x01 \x01(\tR\acontent\x12\x1f\n" + + "\vtarget_type\x18\x02 \x01(\x05R\n" + + "targetType\x12\x1b\n" + + "\ttarget_id\x18\x03 \x01(\x03R\btargetId\x12\x1f\n" + + "\vtype_status\x18\x04 \x01(\x05R\n" + + "typeStatus\x12\x12\n" + + "\x04type\x18\x05 \x01(\x05R\x04type\x12\x15\n" + + "\x06obj_id\x18\x06 \x01(\x03R\x05objId\"-\n" + + "\x17ApiMessageNumberRequest\x12\x12\n" + + "\x04type\x18\x01 \x01(\x05R\x04type2\xe6\x02\n" + + "\aMessage\x12\\\n" + + "\fAdminMessage\x12\x15.message.ItemsRequest\x1a\x11.message.Response\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\x12\x17/admin/v3/message/items\x12X\n" + + "\n" + + "ApiMessage\x12\x15.message.ItemsRequest\x1a\x11.message.Response\" \x82\xd3\xe4\x93\x02\x1a:\x01*\x12\x15/api/v3/message/items\x12j\n" + + "\x10ApiMessageNumber\x12 .message.ApiMessageNumberRequest\x1a\x11.message.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\x12\x16/api/v3/message/Number\x127\n" + + "\n" + + "MessageAdd\x12\x13.message.AddRequest\x1a\x14.message.AddResponseB\x1bZ\x19lone-services/rpc/messageb\x06proto3" + +var ( + file_message_message_proto_rawDescOnce sync.Once + file_message_message_proto_rawDescData []byte +) + +func file_message_message_proto_rawDescGZIP() []byte { + file_message_message_proto_rawDescOnce.Do(func() { + file_message_message_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_message_message_proto_rawDesc), len(file_message_message_proto_rawDesc))) + }) + return file_message_message_proto_rawDescData +} + +var file_message_message_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_message_message_proto_goTypes = []any{ + (*Response)(nil), // 0: message.Response + (*AddResponse)(nil), // 1: message.AddResponse + (*ItemsRequest)(nil), // 2: message.ItemsRequest + (*AddRequest)(nil), // 3: message.AddRequest + (*ApiMessageNumberRequest)(nil), // 4: message.ApiMessageNumberRequest +} +var file_message_message_proto_depIdxs = []int32{ + 2, // 0: message.Message.AdminMessage:input_type -> message.ItemsRequest + 2, // 1: message.Message.ApiMessage:input_type -> message.ItemsRequest + 4, // 2: message.Message.ApiMessageNumber:input_type -> message.ApiMessageNumberRequest + 3, // 3: message.Message.MessageAdd:input_type -> message.AddRequest + 0, // 4: message.Message.AdminMessage:output_type -> message.Response + 0, // 5: message.Message.ApiMessage:output_type -> message.Response + 0, // 6: message.Message.ApiMessageNumber:output_type -> message.Response + 1, // 7: message.Message.MessageAdd:output_type -> message.AddResponse + 4, // [4:8] is the sub-list for method output_type + 0, // [0:4] 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 extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_message_message_proto_init() } +func file_message_message_proto_init() { + if File_message_message_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_message_message_proto_rawDesc), len(file_message_message_proto_rawDesc)), + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_message_message_proto_goTypes, + DependencyIndexes: file_message_message_proto_depIdxs, + MessageInfos: file_message_message_proto_msgTypes, + }.Build() + File_message_message_proto = out.File + file_message_message_proto_goTypes = nil + file_message_message_proto_depIdxs = nil +} diff --git a/rpc/message/pb/message_grpc.pb.go b/rpc/message/pb/message_grpc.pb.go new file mode 100644 index 0000000..cf27b7f --- /dev/null +++ b/rpc/message/pb/message_grpc.pb.go @@ -0,0 +1,235 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.6.2 +// - protoc v4.25.8 +// source: message/message.proto + +package message + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + Message_AdminMessage_FullMethodName = "/message.Message/AdminMessage" + Message_ApiMessage_FullMethodName = "/message.Message/ApiMessage" + Message_ApiMessageNumber_FullMethodName = "/message.Message/ApiMessageNumber" + Message_MessageAdd_FullMethodName = "/message.Message/MessageAdd" +) + +// MessageClient is the client API for Message service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type MessageClient interface { + AdminMessage(ctx context.Context, in *ItemsRequest, opts ...grpc.CallOption) (*Response, error) + ApiMessage(ctx context.Context, in *ItemsRequest, opts ...grpc.CallOption) (*Response, error) + ApiMessageNumber(ctx context.Context, in *ApiMessageNumberRequest, opts ...grpc.CallOption) (*Response, error) + MessageAdd(ctx context.Context, in *AddRequest, opts ...grpc.CallOption) (*AddResponse, error) +} + +type messageClient struct { + cc grpc.ClientConnInterface +} + +func NewMessageClient(cc grpc.ClientConnInterface) MessageClient { + return &messageClient{cc} +} + +func (c *messageClient) AdminMessage(ctx context.Context, in *ItemsRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Message_AdminMessage_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *messageClient) ApiMessage(ctx context.Context, in *ItemsRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Message_ApiMessage_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *messageClient) ApiMessageNumber(ctx context.Context, in *ApiMessageNumberRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Message_ApiMessageNumber_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *messageClient) MessageAdd(ctx context.Context, in *AddRequest, opts ...grpc.CallOption) (*AddResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AddResponse) + err := c.cc.Invoke(ctx, Message_MessageAdd_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MessageServer is the server API for Message service. +// All implementations must embed UnimplementedMessageServer +// for forward compatibility. +type MessageServer interface { + AdminMessage(context.Context, *ItemsRequest) (*Response, error) + ApiMessage(context.Context, *ItemsRequest) (*Response, error) + ApiMessageNumber(context.Context, *ApiMessageNumberRequest) (*Response, error) + MessageAdd(context.Context, *AddRequest) (*AddResponse, error) + mustEmbedUnimplementedMessageServer() +} + +// UnimplementedMessageServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedMessageServer struct{} + +func (UnimplementedMessageServer) AdminMessage(context.Context, *ItemsRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method AdminMessage not implemented") +} +func (UnimplementedMessageServer) ApiMessage(context.Context, *ItemsRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method ApiMessage not implemented") +} +func (UnimplementedMessageServer) ApiMessageNumber(context.Context, *ApiMessageNumberRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method ApiMessageNumber not implemented") +} +func (UnimplementedMessageServer) MessageAdd(context.Context, *AddRequest) (*AddResponse, error) { + return nil, status.Error(codes.Unimplemented, "method MessageAdd not implemented") +} +func (UnimplementedMessageServer) mustEmbedUnimplementedMessageServer() {} +func (UnimplementedMessageServer) testEmbeddedByValue() {} + +// UnsafeMessageServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MessageServer will +// result in compilation errors. +type UnsafeMessageServer interface { + mustEmbedUnimplementedMessageServer() +} + +func RegisterMessageServer(s grpc.ServiceRegistrar, srv MessageServer) { + // If the following call panics, it indicates UnimplementedMessageServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&Message_ServiceDesc, srv) +} + +func _Message_AdminMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ItemsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MessageServer).AdminMessage(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Message_AdminMessage_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MessageServer).AdminMessage(ctx, req.(*ItemsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Message_ApiMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ItemsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MessageServer).ApiMessage(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Message_ApiMessage_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MessageServer).ApiMessage(ctx, req.(*ItemsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Message_ApiMessageNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ApiMessageNumberRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MessageServer).ApiMessageNumber(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Message_ApiMessageNumber_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MessageServer).ApiMessageNumber(ctx, req.(*ApiMessageNumberRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Message_MessageAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MessageServer).MessageAdd(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Message_MessageAdd_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MessageServer).MessageAdd(ctx, req.(*AddRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// Message_ServiceDesc is the grpc.ServiceDesc for Message service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Message_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "message.Message", + HandlerType: (*MessageServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "AdminMessage", + Handler: _Message_AdminMessage_Handler, + }, + { + MethodName: "ApiMessage", + Handler: _Message_ApiMessage_Handler, + }, + { + MethodName: "ApiMessageNumber", + Handler: _Message_ApiMessageNumber_Handler, + }, + { + MethodName: "MessageAdd", + Handler: _Message_MessageAdd_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "message/message.proto", +} diff --git a/services/equipment/internal/logic/apiBeansAddLogic.go b/services/equipment/internal/logic/apiBeansAddLogic.go new file mode 100644 index 0000000..2e43f30 --- /dev/null +++ b/services/equipment/internal/logic/apiBeansAddLogic.go @@ -0,0 +1,85 @@ +package logic + +import ( + "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" + "lone-services/services/equipment/validator" + "strconv" + + "lone-services/rpc/equipment/pb" + "lone-services/services/equipment/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ApiBeansAddLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewApiBeansAddLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiBeansAddLogic { + return &ApiBeansAddLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *ApiBeansAddLogic) ApiBeansAdd(in *equipment.ApiBeansAddRequest) (*equipment.Response, error) { + var v validator.BeansImagesValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + + if in.Id < utils.NumberOne { + return l.add(in, adminInfo) + } + + return l.update(in) +} + +func (l *ApiBeansAddLogic) update(in *equipment.ApiBeansAddRequest) (*equipment.Response, error) { + var info dao.BeansInfo + w := modelbase.Params{Eq: map[string]string{"id": strconv.FormatInt(in.Id, utils.NumberTen)}} + err := model.BeansModel{}.Init().GetOne(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + if info.Id < utils.NumberOne { + return l.fail(utils.ErrorNotFund) + } + info.SecondTime = utils.Now() + info.SecondImage = in.Image + _, err = model.BeansModel{}.Init().Edit(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + return l.ok(utils.NumberOne) +} + +func (l *ApiBeansAddLogic) add(in *equipment.ApiBeansAddRequest, adminInfo utils.UserInfo) (*equipment.Response, error) { + create := dao.BeansCreate{ + UserId: adminInfo.ID, + UserName: adminInfo.Name, + UserNickName: adminInfo.Name, + FirstImage: in.Image, + FirstTime: utils.Now(), + } + err := model.BeansModel{}.Init().Create(&create) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + return l.ok(utils.NumberOne) +} diff --git a/services/equipment/internal/logic/apiBeansItemsLogic.go b/services/equipment/internal/logic/apiBeansItemsLogic.go new file mode 100644 index 0000000..471ecc0 --- /dev/null +++ b/services/equipment/internal/logic/apiBeansItemsLogic.go @@ -0,0 +1,52 @@ +package logic + +import ( + "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" + "strconv" + + "lone-services/rpc/equipment/pb" + "lone-services/services/equipment/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ApiBeansItemsLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewApiBeansItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiBeansItemsLogic { + return &ApiBeansItemsLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *ApiBeansItemsLogic) ApiBeansItems(in *equipment.ApiBeansItemsRequest) (*equipment.Response, error) { + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + var info []dao.BeansInfo + w := modelbase.Params{ + Size: int(in.Size), + Order: "id desc", + Page: int(in.Page), + Eq: map[string]string{"user_id": strconv.FormatInt(adminInfo.ID, utils.NumberTen)}, + } + + items, err := model.BeansModel{}.Init().Page(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + + return l.ok(items) +} diff --git a/services/equipment/internal/logic/apiBeansLastLogic.go b/services/equipment/internal/logic/apiBeansLastLogic.go new file mode 100644 index 0000000..04ce855 --- /dev/null +++ b/services/equipment/internal/logic/apiBeansLastLogic.go @@ -0,0 +1,53 @@ +package logic + +import ( + "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" + "strconv" + + "lone-services/rpc/equipment/pb" + "lone-services/services/equipment/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ApiBeansLastLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewApiBeansLastLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiBeansLastLogic { + return &ApiBeansLastLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *ApiBeansLastLogic) ApiBeansLast(in *equipment.EmptyRequest) (*equipment.Response, error) { + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + + var info dao.BeansInfo + w := modelbase.Params{ + Eq: map[string]string{"user_id": strconv.FormatInt(adminInfo.ID, utils.NumberTen)}, + Order: "id desc", + } + err := model.BeansModel{}.Init().GetOne(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + if info.Id < utils.NumberOne { + return l.fail(utils.ErrorNotFund) + } + + return l.ok(info) +} diff --git a/services/message/.gitignore b/services/message/.gitignore new file mode 100644 index 0000000..e01ad78 --- /dev/null +++ b/services/message/.gitignore @@ -0,0 +1,3 @@ +run.toml +etc/message.yaml +tmp \ No newline at end of file diff --git a/services/message/Dockerfile b/services/message/Dockerfile new file mode 100644 index 0000000..9ac2ac9 --- /dev/null +++ b/services/message/Dockerfile @@ -0,0 +1,37 @@ +FROM golang:1.26.5-alpine AS builder + +WORKDIR /src + +ENV GOPROXY=https://goproxy.cn,direct \ + CGO_ENABLED=0 \ + GOOS=linux \ + GOARCH=amd64 + +COPY pkg ./pkg +COPY go.mod go.sum ./ + +RUN --mount=type=cache,target=/go/pkg/mod \ + go mod download + +COPY rpc/ ./rpc +COPY services/message/ ./services/message/ + +WORKDIR /src/services/message + +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -ldflags="-s -w" -o /out/main ./ + +FROM alpine:3.22 + +WORKDIR /app + +ENV TZ=Asia/Shanghai + +RUN apk add --no-cache tzdata \ + && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone + +COPY --from=builder /out/main . + +CMD ["./main", "-f", "etc/message.yaml"] diff --git a/services/message/internal/config/config.go b/services/message/internal/config/config.go new file mode 100644 index 0000000..a1979dd --- /dev/null +++ b/services/message/internal/config/config.go @@ -0,0 +1,13 @@ +package config + +type Config struct { + Nacos NacosConf +} + +type NacosConf struct { + Hosts []string + NamespaceId string `json:",optional"` + Group string `json:",optional"` + RegisterIP string `json:",optional"` + ConfigID string `json:",optional"` +} diff --git a/services/message/internal/dao/message.go b/services/message/internal/dao/message.go new file mode 100644 index 0000000..c98f5a8 --- /dev/null +++ b/services/message/internal/dao/message.go @@ -0,0 +1,41 @@ +package dao + +import "lone-services/pkg/utils" + +const ( + // 目标类型 + TargetTypeAgent = 1 //代理 + TargetTypeStore = 2 //门店 + TargetTypeUser = 3 //个人 + // 类型 + ObjTypeAgent = 1 //添加代理 + ObjTypeStore = 2 //加门店 + ObjTypeSupply = 3 //审核补货 +) + +type MessageCreate struct { + Id int64 `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + Content string `gorm:"column:content;type:varchar(255);comment:内容;NOT NULL" json:"content"` + TargetType int32 `gorm:"column:target_type;type:tinyint(1);comment:目标类型,1为销售,2为门店,3为个人;NOT NULL" json:"target_type"` + TargetId int64 `gorm:"column:target_id;type:int(11);comment:目标ID,发给谁;NOT NULL" json:"target_id"` + TypeStatus int32 `gorm:"column:type_status;type:tinyint(1);comment:类型状态,目前1为通过,2为未通过;NOT NULL" json:"type_status"` + Type int32 `gorm:"column:type;type:tinyint(2);comment:类型,1为申请代理,2为添加门店,3为审核补货;NOT NULL" json:"type"` + ObjId int64 `gorm:"column:obj_id;type:int(11);comment:对像ID;NOT NULL" json:"obj_id"` +} + +type MessageInfo struct { + Id int64 `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT;comment:ID" json:"id"` + Content string `gorm:"column:content;type:varchar(255);comment:内容;NOT NULL" json:"content"` + TargetType int32 `gorm:"column:target_type;type:tinyint(1);comment:目标类型,1为销售,2为门店,3为个人;NOT NULL" json:"target_type"` + TargetId int64 `gorm:"column:target_id;type:int(11);comment:目标ID,发给谁;NOT NULL" json:"target_id"` + TypeStatus int32 `gorm:"column:type_status;type:tinyint(1);comment:类型状态,目前1为通过,2为未通过;NOT NULL" json:"type_status"` + Type int32 `gorm:"column:type;type:tinyint(2);comment:类型,1为申请代理,2为添加门店,3为审核补货;NOT NULL" json:"type"` + ObjId int64 `gorm:"column:obj_id;type:int(11);comment:对像ID;NOT NULL" json:"obj_id"` + Status int32 `gorm:"column:status;type:tinyint(1);default:2;comment:状态,1为已读,2为未读;NOT NULL" json:"status"` + UpdateTime utils.CustomTime `gorm:"column:update_time;type:datetime;default:CURRENT_TIMESTAMP;comment:更新时间" json:"update_time"` + CreateTime utils.CustomTime `gorm:"column:create_time;type:datetime;default:CURRENT_TIMESTAMP;comment:添加时间" json:"create_time"` +} + +type MessageStatus struct { + Status int32 `gorm:"column:status;type:tinyint(1);default:9;comment:9是待处理 1是已通过 2是未通过,3为禁用;NOT NULL" json:"status"` +} diff --git a/services/message/internal/logic/adminMessageLogic.go b/services/message/internal/logic/adminMessageLogic.go new file mode 100644 index 0000000..fd4bf23 --- /dev/null +++ b/services/message/internal/logic/adminMessageLogic.go @@ -0,0 +1,54 @@ +package logic + +import ( + "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/message/internal/dao" + "lone-services/services/message/internal/model" + "lone-services/services/order/validator" + + "lone-services/rpc/message/pb" + "lone-services/services/message/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminMessageLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewAdminMessageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminMessageLogic { + return &AdminMessageLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *AdminMessageLogic) AdminMessage(in *message.ItemsRequest) (*message.Response, error) { + var v validator.OrderItemsValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + var info []dao.MessageInfo + w := modelbase.Params{ + Page: int(in.Page), + Size: int(in.Size), + Order: "id desc", + } + + items, err := model.MessageModel{}.Init().Page(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + return l.ok(items) +} diff --git a/services/message/internal/logic/apiMessageLogic.go b/services/message/internal/logic/apiMessageLogic.go new file mode 100644 index 0000000..c02d6f8 --- /dev/null +++ b/services/message/internal/logic/apiMessageLogic.go @@ -0,0 +1,66 @@ +package logic + +import ( + "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/message/internal/dao" + "lone-services/services/message/internal/model" + "lone-services/services/order/validator" + "strconv" + + "lone-services/rpc/message/pb" + "lone-services/services/message/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ApiMessageLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewApiMessageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiMessageLogic { + return &ApiMessageLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *ApiMessageLogic) ApiMessage(in *message.ItemsRequest) (*message.Response, error) { + var v validator.OrderItemsValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + var info []dao.MessageInfo + w := modelbase.Params{ + Page: int(in.Page), + Size: int(in.Size), + Order: "id desc", + } + + items, err := model.MessageModel{}.Init().Page(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + var ids []string + for _, v := range info { + ids = append(ids, strconv.Itoa(int(v.Id))) + } + + if len(ids) > utils.NumberZero { + status := dao.MessageStatus{Status: utils.StatusOk} + + ww := modelbase.Params{In: map[string][]string{"id": ids}} + _, err = model.MessageModel{}.Init().Edit(ww, &status) + } + return l.ok(items) +} diff --git a/services/message/internal/logic/apiMessageNumberLogic.go b/services/message/internal/logic/apiMessageNumberLogic.go new file mode 100644 index 0000000..053ee60 --- /dev/null +++ b/services/message/internal/logic/apiMessageNumberLogic.go @@ -0,0 +1,53 @@ +package logic + +import ( + "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/message/internal/dao" + "lone-services/services/message/internal/model" + "strconv" + + "lone-services/rpc/message/pb" + "lone-services/services/message/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ApiMessageNumberLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewApiMessageNumberLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiMessageNumberLogic { + return &ApiMessageNumberLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *ApiMessageNumberLogic) ApiMessageNumber(in *message.ApiMessageNumberRequest) (*message.Response, error) { + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + + var info []dao.MessageInfo + w := modelbase.Params{ + Eq: map[string]string{ + "status": strconv.Itoa(utils.StatusFail), + "target_id": strconv.FormatInt(adminInfo.ID, utils.NumberTen), + "type": strconv.Itoa(int(in.Type)), + }, + } + + count, err := model.MessageModel{}.Init().Count(w, &info) + if err != nil { + utils.Logger.Error(err) + return l.fail(utils.Fail) + } + return l.ok(count) +} diff --git a/services/message/internal/logic/base.go b/services/message/internal/logic/base.go new file mode 100644 index 0000000..9a1afb0 --- /dev/null +++ b/services/message/internal/logic/base.go @@ -0,0 +1,48 @@ +package logic + +import ( + "lone-services/pkg/utils" + "lone-services/pkg/validate" + message "lone-services/rpc/message/pb" + "reflect" + + jsoniter "github.com/json-iterator/go" +) + +type BaseLogic struct { +} + +func (l *BaseLogic) checkParams(in interface{}, v validate.IValidator) *message.Response { + rv := reflect.ValueOf(in) + if rv.Kind() != reflect.Ptr || rv.IsNil() { + return &message.Response{ + Code: utils.ErrorParams.Code, + Msg: "request must be non‑nil proto pointer", + } + } + + resp := validate.ValidateFromProto(in, v) + if resp != utils.StringEmpty { + return &message.Response{ + Code: utils.ErrorParams.Code, + Msg: resp, + } + } + return nil +} + +func (l *BaseLogic) fail(status utils.Status) (*message.Response, error) { + return l.out(status, status.Msg) +} +func (l *BaseLogic) out(status utils.Status, msg string) (*message.Response, error) { + return &message.Response{Code: status.Code, Msg: msg}, nil +} + +func (l *BaseLogic) outData(status utils.Status, msg, data string) (*message.Response, error) { + return &message.Response{Code: status.Code, Msg: msg, Data: data}, nil +} + +func (l *BaseLogic) ok(data any) (*message.Response, error) { + buf, _ := jsoniter.Marshal(data) + return &message.Response{Code: utils.Ok.Code, Msg: utils.Ok.Msg, Data: string(buf)}, nil +} diff --git a/services/message/internal/logic/messageAddLogic.go b/services/message/internal/logic/messageAddLogic.go new file mode 100644 index 0000000..679ceb8 --- /dev/null +++ b/services/message/internal/logic/messageAddLogic.go @@ -0,0 +1,48 @@ +package logic + +import ( + "context" + "lone-services/pkg/utils" + "lone-services/services/message/internal/dao" + "lone-services/services/message/internal/model" + + "lone-services/rpc/message/pb" + "lone-services/services/message/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type MessageAddLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger +} + +func NewMessageAddLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MessageAddLogic { + return &MessageAddLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *MessageAddLogic) MessageAdd(in *message.AddRequest) (*message.AddResponse, error) { + add := dao.MessageCreate{ + Content: in.Content, + TargetType: in.TargetType, + TargetId: in.TargetId, + TypeStatus: in.TypeStatus, + Type: in.Type, + ObjId: in.ObjId, + } + + err := model.MessageModel{}.Init().Create(&add) + if err != nil { + l.Logger.Error("Failed to create message:", err) + return nil, status.Error(codes.Internal, utils.Fail.Msg) + } + + return &message.AddResponse{Num: utils.NumberOne}, nil +} diff --git a/services/message/internal/model/message.go b/services/message/internal/model/message.go new file mode 100644 index 0000000..25f312c --- /dev/null +++ b/services/message/internal/model/message.go @@ -0,0 +1,23 @@ +package model + +import ( + "lone-services/pkg/modelbase" + "lone-services/services/message/internal/dao" +) + +type MessageModel struct { + modelbase.Base +} + +func (m MessageModel) TableName() string { + return modelbase.Prefix() + "message" +} + +func (m MessageModel) Init() MessageModel { + m.Table = m.TableName() + return m +} + +func (m MessageModel) Create(data *dao.MessageCreate) error { + return m.Base.Create(data) +} diff --git a/services/message/internal/server/messageServer.go b/services/message/internal/server/messageServer.go new file mode 100644 index 0000000..c7cca15 --- /dev/null +++ b/services/message/internal/server/messageServer.go @@ -0,0 +1,44 @@ +// Code generated by goctl. DO NOT EDIT. +// goctl 1.10.2 +// Source: message.proto + +package server + +import ( + "context" + + "lone-services/rpc/message/pb" + "lone-services/services/message/internal/logic" + "lone-services/services/message/internal/svc" +) + +type MessageServer struct { + svcCtx *svc.ServiceContext + message.UnimplementedMessageServer +} + +func NewMessageServer(svcCtx *svc.ServiceContext) *MessageServer { + return &MessageServer{ + svcCtx: svcCtx, + } +} + +func (s *MessageServer) AdminMessage(ctx context.Context, in *message.ItemsRequest) (*message.Response, error) { + l := logic.NewAdminMessageLogic(ctx, s.svcCtx) + return l.AdminMessage(in) +} + +func (s *MessageServer) ApiMessage(ctx context.Context, in *message.ItemsRequest) (*message.Response, error) { + l := logic.NewApiMessageLogic(ctx, s.svcCtx) + return l.ApiMessage(in) +} + +func (s *MessageServer) ApiMessageNumber(ctx context.Context, in *message.ApiMessageNumberRequest) (*message.Response, error) { + l := logic.NewApiMessageNumberLogic(ctx, s.svcCtx) + return l.ApiMessageNumber(in) +} + +func (s *MessageServer) MessageAdd(ctx context.Context, in *message.AddRequest) (*message.AddResponse, error) { + l := logic.NewMessageAddLogic(ctx, s.svcCtx) + return l.MessageAdd(in) +} diff --git a/services/message/internal/svc/servicecontext.go b/services/message/internal/svc/servicecontext.go new file mode 100644 index 0000000..e47e5d3 --- /dev/null +++ b/services/message/internal/svc/servicecontext.go @@ -0,0 +1,22 @@ +package svc + +import ( + "lone-services/pkg/utils" + "lone-services/services/message/internal/config" + + "gorm.io/gorm" +) + +type ServiceContext struct { + Config config.Config + DB *gorm.DB + Prefix string +} + +func NewServiceContext(c config.Config, db *gorm.DB) *ServiceContext { + return &ServiceContext{ + Config: c, + DB: db, + Prefix: utils.GetConfigString("mysql.prefix"), + } +} diff --git a/services/message/message.go b/services/message/message.go new file mode 100644 index 0000000..dd56330 --- /dev/null +++ b/services/message/message.go @@ -0,0 +1,170 @@ +package main + +import ( + "flag" + "lone-services/pkg/discovery" + "lone-services/pkg/logRedis" + "lone-services/pkg/modelbase" + "lone-services/pkg/mysql" + "lone-services/pkg/redis" + "lone-services/pkg/utils" + "lone-services/pkg/validate" + "net" + "os" + "strconv" + + "lone-services/services/message/internal/config" + "lone-services/services/message/internal/server" + "lone-services/services/message/internal/svc" + "lone-services/services/message/message" + + "github.com/zeromicro/go-zero/core/conf" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/service" + "github.com/zeromicro/go-zero/zrpc" + "google.golang.org/grpc" + "google.golang.org/grpc/reflection" +) + +var configFile = flag.String("f", "etc/message.yaml", "the config file") + +func main() { + flag.Parse() + var c config.Config + conf.MustLoad(*configFile, &c) + + // Nacos配置拉取初始化 + nacosParam := utils.NacosConfig{ + Hosts: c.Nacos.Hosts, + NamespaceId: c.Nacos.NamespaceId, + Group: c.Nacos.Group, + ConfigID: c.Nacos.ConfigID, + } + utils.InitConfig(nacosParam) + + // 日志配置 + logConf := logx.LogConf{ + ServiceName: utils.GetConfigString("log.serviceName"), + Mode: utils.GetConfigString("log.mode"), + Encoding: utils.GetConfigString("log.encoding"), + Level: utils.GetConfigString("log.level"), + Path: utils.GetConfigString("log.path"), + KeepDays: utils.GetConfigInt("log.keepDays"), + MaxSize: utils.GetConfigInt("log.maxSize"), + MaxBackups: utils.GetConfigInt("log.maxBackups"), + Compress: utils.GetConfigBool("log.compress"), + } + logx.SetUp(logConf) + logx.AddWriter(logx.NewWriter(os.Stdout)) + + listenOn := utils.GetConfigString("base.listenOn") + mode := utils.GetConfigString("base.mode") + serviceName := utils.GetConfigString("base.name") + + // 初始化服务发现 + if err := discovery.Init(discovery.Config{ + Hosts: c.Nacos.Hosts, + NamespaceId: c.Nacos.NamespaceId, + Group: c.Nacos.Group, + }); err != nil { + logx.Errorf("nacos init: %v", err) + os.Exit(1) + } + + port, err := listenPort(listenOn) + if err != nil { + logx.Errorf("parse ListenOn: %v", err) + os.Exit(1) + } + + // 注册服务 + if err := discovery.Register(discovery.Instance{ + ServiceName: serviceName, + IP: c.Nacos.RegisterIP, + Port: port, + Group: c.Nacos.Group, + }); err != nil { + logx.Errorf("nacos register: %v", err) + os.Exit(1) + } + logx.Infof("服务注册成功: %s:%d", c.Nacos.RegisterIP, port) + + defer func() { + if err := discovery.Deregister(); err != nil { + logx.Errorf("nacos deregister: %v", err) + } + }() + + // 初始化MySQL + db, err := mysql.New(mysql.Config{ + Host: utils.GetConfigString("mysql.host"), + Port: utils.GetConfigInt("mysql.port"), + User: utils.GetConfigString("mysql.user"), + Password: utils.GetConfigString("mysql.password"), + Database: utils.GetConfigString("mysql.database"), + Charset: utils.GetConfigString("mysql.charset"), + Prefix: utils.GetConfigString("mysql.prefix"), + ReadHost: utils.GetConfigString("mysql_read.host"), + ReadPort: utils.GetConfigInt("mysql_read.port"), + ReadUser: utils.GetConfigString("mysql_read.user"), + ReadPassword: utils.GetConfigString("mysql_read.password"), + ReadDatabase: utils.GetConfigString("mysql_read.database"), + }) + if err != nil { + logx.Errorf("mysql init: %v", err) + os.Exit(1) + } + + // 初始化Redis + if err := redis.Init(redis.Config{ + Host: utils.GetConfigString("redis.host"), + Port: utils.GetConfigInt("redis.port"), + Password: utils.GetConfigString("redis.password"), + DB: utils.GetConfigInt("redis.db"), + }); err != nil { + logx.Errorf("redis init: %v", err) + os.Exit(1) + } + + if err := logRedis.Init(logRedis.LogRedisConfig{ + Host: utils.GetConfigString("log-redis.host"), + Port: utils.GetConfigInt("log-redis.port"), + Password: utils.GetConfigString("log-redis.password"), + DB: utils.GetConfigInt("log-redis.db"), + }); err != nil { + logx.Errorf("log redis init: %v", err) + os.Exit(1) + } + + debug := utils.GetConfigBool("mysql.debug") + modelbase.Init(db, modelbase.Config{Prefix: utils.GetConfigString("mysql.prefix"), Debug: debug}) + + // 初始化服务信息 + rpcConf := zrpc.RpcServerConf{ + ListenOn: listenOn, + } + rpcConf.Mode = mode + ctx := svc.NewServiceContext(c, db) + + s := zrpc.MustNewServer(rpcConf, func(grpcServer *grpc.Server) { + message.RegisterMessageServer(grpcServer, server.NewMessageServer(ctx)) + if mode == service.DevMode || mode == service.TestMode { + reflection.Register(grpcServer) + } + }) + defer s.Stop() + + s.AddUnaryInterceptors(validate.UnaryServerInterceptor(validate.MustNew())) + + logx.Infof("Starting rpc server at %s...", listenOn) + s.Start() +} + +// listenPort 拆分端口 +func listenPort(listenOn string) (uint64, error) { + _, portStr, err := net.SplitHostPort(listenOn) + if err != nil { + return utils.NumberZero, err + } + return strconv.ParseUint(portStr, utils.NumberTen, utils.NumberSixtyFourth) +} diff --git a/services/message/messageclient/message.go b/services/message/messageclient/message.go new file mode 100644 index 0000000..d02c71b --- /dev/null +++ b/services/message/messageclient/message.go @@ -0,0 +1,59 @@ +// Code generated by goctl. DO NOT EDIT. +// goctl 1.10.2 +// Source: message.proto + +package messageClient + +import ( + "context" + + "lone-services/rpc/message/pb" + + "github.com/zeromicro/go-zero/zrpc" + "google.golang.org/grpc" +) + +type ( + AddRequest = message.AddRequest + AddResponse = message.AddResponse + ApiMessageNumberRequest = message.ApiMessageNumberRequest + ItemsRequest = message.ItemsRequest + Response = message.Response + + Message interface { + AdminMessage(ctx context.Context, in *ItemsRequest, opts ...grpc.CallOption) (*Response, error) + ApiMessage(ctx context.Context, in *ItemsRequest, opts ...grpc.CallOption) (*Response, error) + ApiMessageNumber(ctx context.Context, in *ApiMessageNumberRequest, opts ...grpc.CallOption) (*Response, error) + MessageAdd(ctx context.Context, in *AddRequest, opts ...grpc.CallOption) (*AddResponse, error) + } + + defaultMessage struct { + cli zrpc.Client + } +) + +func NewMessage(cli zrpc.Client) Message { + return &defaultMessage{ + cli: cli, + } +} + +func (m *defaultMessage) AdminMessage(ctx context.Context, in *ItemsRequest, opts ...grpc.CallOption) (*Response, error) { + client := message.NewMessageClient(m.cli.Conn()) + return client.AdminMessage(ctx, in, opts...) +} + +func (m *defaultMessage) ApiMessage(ctx context.Context, in *ItemsRequest, opts ...grpc.CallOption) (*Response, error) { + client := message.NewMessageClient(m.cli.Conn()) + return client.ApiMessage(ctx, in, opts...) +} + +func (m *defaultMessage) ApiMessageNumber(ctx context.Context, in *ApiMessageNumberRequest, opts ...grpc.CallOption) (*Response, error) { + client := message.NewMessageClient(m.cli.Conn()) + return client.ApiMessageNumber(ctx, in, opts...) +} + +func (m *defaultMessage) MessageAdd(ctx context.Context, in *AddRequest, opts ...grpc.CallOption) (*AddResponse, error) { + client := message.NewMessageClient(m.cli.Conn()) + return client.MessageAdd(ctx, in, opts...) +} diff --git a/services/message/validator/message.go b/services/message/validator/message.go new file mode 100644 index 0000000..7780094 --- /dev/null +++ b/services/message/validator/message.go @@ -0,0 +1,27 @@ +package validator + +import "lone-services/pkg/validate" + +type MessageItemsValidator struct { + Page int32 `form:"page" json:"page"` + Size int32 `form:"size" json:"size"` + Type int32 `form:"type" json:"type" validate:"required"` +} + +// GetMessage 提示消息 +func (p MessageItemsValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + validate.FieldType: validate.FieldType, + } +} + +type MessageNumberValidator struct { + Type int32 `form:"type" json:"type" binding:"required"` +} + +// GetMessage 提示消息 +func (p MessageNumberValidator) GetMessage() validate.ValidatorMessages { + return validate.ValidatorMessages{ + validate.FieldType: validate.FieldType, + } +}