huangguangrong 9 месяцев назад
Сommit
486b3105ad
5 измененных файлов с 2591 добавлено и 0 удалено
  1. 15 0
      go.mod
  2. 32 0
      go.sum
  3. 157 0
      proto/slowwild.proto
  4. 1915 0
      slowwild/slowwildserver/slowwild.pb.go
  5. 472 0
      slowwild/slowwildserver/slowwild_grpc.pb.go

+ 15 - 0
go.mod

@@ -0,0 +1,15 @@
+module slowwid_pb
+
+go 1.22.0
+
+require (
+	google.golang.org/grpc v1.70.0
+	google.golang.org/protobuf v1.36.5
+)
+
+require (
+	golang.org/x/net v0.32.0 // indirect
+	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect
+)

+ 32 - 0
go.sum

@@ -0,0 +1,32 @@
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
+go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
+go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
+go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
+go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
+go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
+go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
+go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
+go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
+go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
+golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
+golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a h1:hgh8P4EuoxpsuKMXX/To36nOFD7vixReXgn8lPGnt+o=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
+google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
+google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
+google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
+google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=

+ 157 - 0
proto/slowwild.proto

@@ -0,0 +1,157 @@
+syntax="proto3";
+
+package slowwildserver;
+
+option go_package="slowwild/slowwildserver";
+
+message UserEntity {
+    int64 id = 1;                // 用户id
+    string avatar = 2;            // 用户头像
+    string nickname = 3;          // 昵称
+    string username = 4;          // 用户名(唯一)
+    string phone  = 5;            // 手机号码
+    int32  status  = 6;           // 是否锁住1-正常2-停用
+    int32  sex = 7;               // 性别0-女1-男
+    int64 follows = 8;   //粉丝
+    int64 followings = 9; // 关注量
+    int32 get_likes_count = 10;    //获得点赞数量
+    int32 get_collection_count = 11;    //获得收藏的数量
+}
+
+message LoginAndRegisterRsp {
+    string token = 1; // token令牌
+    int64 expire = 2; // 到期时间
+}
+
+message LoginReq {
+    string  phone = 1; //手机号
+    string  password = 2; // 密码
+    string code  = 3; //验证码
+    int32 login_type = 4; // 登录类型
+}
+
+message RegisterReq{
+    string  phone = 1; // 手机号码
+    string  nickname = 2; // 用户名
+    string  password = 3; // 密码
+    string  avatar = 4; // 头像
+    int32   sex = 5; // 性别
+}
+
+message GetUserInfoReq {
+    int64 id = 1; // 用户id
+}
+
+message GetUserInfoResp {
+UserEntity user = 1; // 用户信息
+}
+
+message FindUserReq {
+    string username = 1; // 用户昵称
+    string phone = 2; // 用户手机号码
+    repeated int64 ids = 3; // 用户id
+}
+
+message FindUserResp {
+    repeated UserEntity user_list = 1; // 用户信息
+}
+
+// 用户关注
+message FollowUserReq {
+    int64 user_id = 1;  // 当前登录用户id
+    int64 follow_user_id = 2; // 被关注的用户id
+}
+message FollowUserRes {
+    bool success = 1; // 是否关注成功
+}
+// 用户取消关注
+message UnFollowUserReq {
+    int64 user_id = 1;  // 当前登录的用户id
+    int64 un_follow_user_id = 2; // 当前被取消关注的用户id
+}
+message UnFollowUserRes {
+    bool success = 1; // 是否关注成功
+}
+// 查询粉丝列表
+message GetFollowingReq {
+    int64 user_id = 1; // 当前登录用户的id
+    int32 limit = 2; // 数量限制
+    int32 offset = 3; // 分页开始偏移量
+    int64 query_user_id = 4; // 查询用户的id
+}
+
+message GetFollowingRes {
+    repeated UserEntity list = 1;
+    int64 total = 2;
+}
+
+// 查询我关注的列表
+message GetFollowReq {
+    int64 user_id = 1; // 当前登录用户的id
+    int32 limit = 2; // 数量限制
+    int32 offset = 3; // 分页开始偏移量
+    int64 query_user_id = 4; // 查询用户的id
+}
+
+message GetFollowRes {
+    repeated UserEntity list = 1;
+    int64 total = 2;
+}
+
+//查询用户信息
+message GetUserProfileReq {
+    string username = 1;
+    int64 user_id = 2;
+}
+message GetUserProfileRes {
+    int64 id = 1; // 用户id
+    string nickname = 2; // 用户昵称
+    string username = 3; // 用户名
+    int32 status = 4; // 用户状态0-正常1-封禁中2-禁言中3-删除
+    string avatar = 5; // 头像
+    bool is_friend = 7; // 是否是好友
+    bool is_following = 8; // 是否关注
+    int64 created_on = 9; // 注册时间
+    int64 follows = 10; // 关注数
+    int64 fans = 11; // 粉丝数
+    int32 get_likes_count = 12;    //获得点赞数量
+    int32 get_collection_count = 13;    //获得收藏的数量
+}
+
+// 模糊查询用户
+message SearchUsernameReq {
+    string username = 1;
+}
+
+message SearchUsernameItem {
+    string username = 1;
+    string avatar = 2;
+    int64 id = 3;
+}
+
+message SearchUsernameRes {
+    repeated SearchUsernameItem list = 1;
+}
+
+service SlowWildServer {
+    // 用户登录
+    rpc Login(LoginReq) returns (LoginAndRegisterRsp);
+    // 用户注册
+    rpc Register(RegisterReq) returns (LoginAndRegisterRsp);
+    // 获取用户信息
+    rpc GetUserInfo(GetUserInfoReq) returns (GetUserInfoResp);
+    // 查询用户信息
+    rpc FindUser(FindUserReq) returns (FindUserResp);
+    // 关注用户
+    rpc UserFollow (FollowUserReq) returns (FollowUserRes);
+    // 取消关注用户
+    rpc UnUserFollow (UnFollowUserReq) returns (UnFollowUserRes);
+    // 获取我得粉丝
+    rpc GetFans (GetFollowingReq) returns (GetFollowingRes);
+    // 查询我的关注
+    rpc GetFollows (GetFollowingReq) returns (GetFollowingRes);
+    // 查询用户的详细信息
+    rpc GetUserProfile (GetUserProfileReq) returns (GetUserProfileRes);
+    // 搜索用户名称
+    rpc SearchUsername (SearchUsernameReq) returns (SearchUsernameRes);
+}

+ 1915 - 0
slowwild/slowwildserver/slowwild.pb.go

@@ -0,0 +1,1915 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.34.2
+// 	protoc        v3.19.4
+// source: proto/slowwild.proto
+
+package slowwildserver
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type UserEntity struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id                 int64  `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`                                                              // 用户id
+	Avatar             string `protobuf:"bytes,2,opt,name=avatar,proto3" json:"avatar,omitempty"`                                                       // 用户头像
+	Nickname           string `protobuf:"bytes,3,opt,name=nickname,proto3" json:"nickname,omitempty"`                                                   // 昵称
+	Username           string `protobuf:"bytes,4,opt,name=username,proto3" json:"username,omitempty"`                                                   // 用户名(唯一)
+	Phone              string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"`                                                         // 手机号码
+	Status             int32  `protobuf:"varint,6,opt,name=status,proto3" json:"status,omitempty"`                                                      // 是否锁住1-正常2-停用
+	Sex                int32  `protobuf:"varint,7,opt,name=sex,proto3" json:"sex,omitempty"`                                                            // 性别0-女1-男
+	Follows            int64  `protobuf:"varint,8,opt,name=follows,proto3" json:"follows,omitempty"`                                                    //粉丝
+	Followings         int64  `protobuf:"varint,9,opt,name=followings,proto3" json:"followings,omitempty"`                                              // 关注量
+	GetLikesCount      int32  `protobuf:"varint,10,opt,name=get_likes_count,json=getLikesCount,proto3" json:"get_likes_count,omitempty"`                //获得点赞数量
+	GetCollectionCount int32  `protobuf:"varint,11,opt,name=get_collection_count,json=getCollectionCount,proto3" json:"get_collection_count,omitempty"` //获得收藏的数量
+}
+
+func (x *UserEntity) Reset() {
+	*x = UserEntity{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UserEntity) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UserEntity) ProtoMessage() {}
+
+func (x *UserEntity) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UserEntity.ProtoReflect.Descriptor instead.
+func (*UserEntity) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *UserEntity) GetId() int64 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
+func (x *UserEntity) GetAvatar() string {
+	if x != nil {
+		return x.Avatar
+	}
+	return ""
+}
+
+func (x *UserEntity) GetNickname() string {
+	if x != nil {
+		return x.Nickname
+	}
+	return ""
+}
+
+func (x *UserEntity) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *UserEntity) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+func (x *UserEntity) GetStatus() int32 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+func (x *UserEntity) GetSex() int32 {
+	if x != nil {
+		return x.Sex
+	}
+	return 0
+}
+
+func (x *UserEntity) GetFollows() int64 {
+	if x != nil {
+		return x.Follows
+	}
+	return 0
+}
+
+func (x *UserEntity) GetFollowings() int64 {
+	if x != nil {
+		return x.Followings
+	}
+	return 0
+}
+
+func (x *UserEntity) GetGetLikesCount() int32 {
+	if x != nil {
+		return x.GetLikesCount
+	}
+	return 0
+}
+
+func (x *UserEntity) GetGetCollectionCount() int32 {
+	if x != nil {
+		return x.GetCollectionCount
+	}
+	return 0
+}
+
+type LoginAndRegisterRsp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Token  string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`    // token令牌
+	Expire int64  `protobuf:"varint,2,opt,name=expire,proto3" json:"expire,omitempty"` // 到期时间
+}
+
+func (x *LoginAndRegisterRsp) Reset() {
+	*x = LoginAndRegisterRsp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LoginAndRegisterRsp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginAndRegisterRsp) ProtoMessage() {}
+
+func (x *LoginAndRegisterRsp) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LoginAndRegisterRsp.ProtoReflect.Descriptor instead.
+func (*LoginAndRegisterRsp) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *LoginAndRegisterRsp) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *LoginAndRegisterRsp) GetExpire() int64 {
+	if x != nil {
+		return x.Expire
+	}
+	return 0
+}
+
+type LoginReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Phone     string `protobuf:"bytes,1,opt,name=phone,proto3" json:"phone,omitempty"`                           //手机号
+	Password  string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`                     // 密码
+	Code      string `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"`                             //验证码
+	LoginType int32  `protobuf:"varint,4,opt,name=login_type,json=loginType,proto3" json:"login_type,omitempty"` // 登录类型
+}
+
+func (x *LoginReq) Reset() {
+	*x = LoginReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *LoginReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LoginReq) ProtoMessage() {}
+
+func (x *LoginReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_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 LoginReq.ProtoReflect.Descriptor instead.
+func (*LoginReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *LoginReq) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+func (x *LoginReq) GetPassword() string {
+	if x != nil {
+		return x.Password
+	}
+	return ""
+}
+
+func (x *LoginReq) GetCode() string {
+	if x != nil {
+		return x.Code
+	}
+	return ""
+}
+
+func (x *LoginReq) GetLoginType() int32 {
+	if x != nil {
+		return x.LoginType
+	}
+	return 0
+}
+
+type RegisterReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Phone    string `protobuf:"bytes,1,opt,name=phone,proto3" json:"phone,omitempty"`       // 手机号码
+	Nickname string `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"` // 用户名
+	Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` // 密码
+	Avatar   string `protobuf:"bytes,4,opt,name=avatar,proto3" json:"avatar,omitempty"`     // 头像
+	Sex      int32  `protobuf:"varint,5,opt,name=sex,proto3" json:"sex,omitempty"`          // 性别
+}
+
+func (x *RegisterReq) Reset() {
+	*x = RegisterReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *RegisterReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RegisterReq) ProtoMessage() {}
+
+func (x *RegisterReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_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 RegisterReq.ProtoReflect.Descriptor instead.
+func (*RegisterReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *RegisterReq) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+func (x *RegisterReq) GetNickname() string {
+	if x != nil {
+		return x.Nickname
+	}
+	return ""
+}
+
+func (x *RegisterReq) GetPassword() string {
+	if x != nil {
+		return x.Password
+	}
+	return ""
+}
+
+func (x *RegisterReq) GetAvatar() string {
+	if x != nil {
+		return x.Avatar
+	}
+	return ""
+}
+
+func (x *RegisterReq) GetSex() int32 {
+	if x != nil {
+		return x.Sex
+	}
+	return 0
+}
+
+type GetUserInfoReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // 用户id
+}
+
+func (x *GetUserInfoReq) Reset() {
+	*x = GetUserInfoReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetUserInfoReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetUserInfoReq) ProtoMessage() {}
+
+func (x *GetUserInfoReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_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 GetUserInfoReq.ProtoReflect.Descriptor instead.
+func (*GetUserInfoReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetUserInfoReq) GetId() int64 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
+type GetUserInfoResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	User *UserEntity `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // 用户信息
+}
+
+func (x *GetUserInfoResp) Reset() {
+	*x = GetUserInfoResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetUserInfoResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetUserInfoResp) ProtoMessage() {}
+
+func (x *GetUserInfoResp) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_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 GetUserInfoResp.ProtoReflect.Descriptor instead.
+func (*GetUserInfoResp) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *GetUserInfoResp) GetUser() *UserEntity {
+	if x != nil {
+		return x.User
+	}
+	return nil
+}
+
+type FindUserReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Username string  `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` // 用户昵称
+	Phone    string  `protobuf:"bytes,2,opt,name=phone,proto3" json:"phone,omitempty"`       // 用户手机号码
+	Ids      []int64 `protobuf:"varint,3,rep,packed,name=ids,proto3" json:"ids,omitempty"`   // 用户id
+}
+
+func (x *FindUserReq) Reset() {
+	*x = FindUserReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FindUserReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FindUserReq) ProtoMessage() {}
+
+func (x *FindUserReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_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 FindUserReq.ProtoReflect.Descriptor instead.
+func (*FindUserReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *FindUserReq) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *FindUserReq) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+func (x *FindUserReq) GetIds() []int64 {
+	if x != nil {
+		return x.Ids
+	}
+	return nil
+}
+
+type FindUserResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserList []*UserEntity `protobuf:"bytes,1,rep,name=user_list,json=userList,proto3" json:"user_list,omitempty"` // 用户信息
+}
+
+func (x *FindUserResp) Reset() {
+	*x = FindUserResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FindUserResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FindUserResp) ProtoMessage() {}
+
+func (x *FindUserResp) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_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 FindUserResp.ProtoReflect.Descriptor instead.
+func (*FindUserResp) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *FindUserResp) GetUserList() []*UserEntity {
+	if x != nil {
+		return x.UserList
+	}
+	return nil
+}
+
+// 用户关注
+type FollowUserReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserId       int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`                     // 当前登录用户id
+	FollowUserId int64 `protobuf:"varint,2,opt,name=follow_user_id,json=followUserId,proto3" json:"follow_user_id,omitempty"` // 被关注的用户id
+}
+
+func (x *FollowUserReq) Reset() {
+	*x = FollowUserReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FollowUserReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FollowUserReq) ProtoMessage() {}
+
+func (x *FollowUserReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[8]
+	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 FollowUserReq.ProtoReflect.Descriptor instead.
+func (*FollowUserReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *FollowUserReq) GetUserId() int64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *FollowUserReq) GetFollowUserId() int64 {
+	if x != nil {
+		return x.FollowUserId
+	}
+	return 0
+}
+
+type FollowUserRes struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` // 是否关注成功
+}
+
+func (x *FollowUserRes) Reset() {
+	*x = FollowUserRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *FollowUserRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FollowUserRes) ProtoMessage() {}
+
+func (x *FollowUserRes) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[9]
+	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 FollowUserRes.ProtoReflect.Descriptor instead.
+func (*FollowUserRes) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *FollowUserRes) GetSuccess() bool {
+	if x != nil {
+		return x.Success
+	}
+	return false
+}
+
+// 用户取消关注
+type UnFollowUserReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserId         int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`                             // 当前登录的用户id
+	UnFollowUserId int64 `protobuf:"varint,2,opt,name=un_follow_user_id,json=unFollowUserId,proto3" json:"un_follow_user_id,omitempty"` // 当前被取消关注的用户id
+}
+
+func (x *UnFollowUserReq) Reset() {
+	*x = UnFollowUserReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UnFollowUserReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnFollowUserReq) ProtoMessage() {}
+
+func (x *UnFollowUserReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[10]
+	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 UnFollowUserReq.ProtoReflect.Descriptor instead.
+func (*UnFollowUserReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *UnFollowUserReq) GetUserId() int64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *UnFollowUserReq) GetUnFollowUserId() int64 {
+	if x != nil {
+		return x.UnFollowUserId
+	}
+	return 0
+}
+
+type UnFollowUserRes struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` // 是否关注成功
+}
+
+func (x *UnFollowUserRes) Reset() {
+	*x = UnFollowUserRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UnFollowUserRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UnFollowUserRes) ProtoMessage() {}
+
+func (x *UnFollowUserRes) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[11]
+	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 UnFollowUserRes.ProtoReflect.Descriptor instead.
+func (*UnFollowUserRes) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *UnFollowUserRes) GetSuccess() bool {
+	if x != nil {
+		return x.Success
+	}
+	return false
+}
+
+// 查询粉丝列表
+type GetFollowingReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserId      int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`                  // 当前登录用户的id
+	Limit       int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"`                                  // 数量限制
+	Offset      int32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"`                                // 分页开始偏移量
+	QueryUserId int64 `protobuf:"varint,4,opt,name=query_user_id,json=queryUserId,proto3" json:"query_user_id,omitempty"` // 查询用户的id
+}
+
+func (x *GetFollowingReq) Reset() {
+	*x = GetFollowingReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetFollowingReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetFollowingReq) ProtoMessage() {}
+
+func (x *GetFollowingReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[12]
+	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 GetFollowingReq.ProtoReflect.Descriptor instead.
+func (*GetFollowingReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *GetFollowingReq) GetUserId() int64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *GetFollowingReq) GetLimit() int32 {
+	if x != nil {
+		return x.Limit
+	}
+	return 0
+}
+
+func (x *GetFollowingReq) GetOffset() int32 {
+	if x != nil {
+		return x.Offset
+	}
+	return 0
+}
+
+func (x *GetFollowingReq) GetQueryUserId() int64 {
+	if x != nil {
+		return x.QueryUserId
+	}
+	return 0
+}
+
+type GetFollowingRes struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	List  []*UserEntity `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"`
+	Total int64         `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"`
+}
+
+func (x *GetFollowingRes) Reset() {
+	*x = GetFollowingRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetFollowingRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetFollowingRes) ProtoMessage() {}
+
+func (x *GetFollowingRes) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[13]
+	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 GetFollowingRes.ProtoReflect.Descriptor instead.
+func (*GetFollowingRes) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *GetFollowingRes) GetList() []*UserEntity {
+	if x != nil {
+		return x.List
+	}
+	return nil
+}
+
+func (x *GetFollowingRes) GetTotal() int64 {
+	if x != nil {
+		return x.Total
+	}
+	return 0
+}
+
+// 查询我关注的列表
+type GetFollowReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserId      int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`                  // 当前登录用户的id
+	Limit       int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"`                                  // 数量限制
+	Offset      int32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"`                                // 分页开始偏移量
+	QueryUserId int64 `protobuf:"varint,4,opt,name=query_user_id,json=queryUserId,proto3" json:"query_user_id,omitempty"` // 查询用户的id
+}
+
+func (x *GetFollowReq) Reset() {
+	*x = GetFollowReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetFollowReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetFollowReq) ProtoMessage() {}
+
+func (x *GetFollowReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[14]
+	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 GetFollowReq.ProtoReflect.Descriptor instead.
+func (*GetFollowReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *GetFollowReq) GetUserId() int64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *GetFollowReq) GetLimit() int32 {
+	if x != nil {
+		return x.Limit
+	}
+	return 0
+}
+
+func (x *GetFollowReq) GetOffset() int32 {
+	if x != nil {
+		return x.Offset
+	}
+	return 0
+}
+
+func (x *GetFollowReq) GetQueryUserId() int64 {
+	if x != nil {
+		return x.QueryUserId
+	}
+	return 0
+}
+
+type GetFollowRes struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	List  []*UserEntity `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"`
+	Total int64         `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"`
+}
+
+func (x *GetFollowRes) Reset() {
+	*x = GetFollowRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetFollowRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetFollowRes) ProtoMessage() {}
+
+func (x *GetFollowRes) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[15]
+	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 GetFollowRes.ProtoReflect.Descriptor instead.
+func (*GetFollowRes) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *GetFollowRes) GetList() []*UserEntity {
+	if x != nil {
+		return x.List
+	}
+	return nil
+}
+
+func (x *GetFollowRes) GetTotal() int64 {
+	if x != nil {
+		return x.Total
+	}
+	return 0
+}
+
+// 查询用户信息
+type GetUserProfileReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
+	UserId   int64  `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
+}
+
+func (x *GetUserProfileReq) Reset() {
+	*x = GetUserProfileReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetUserProfileReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetUserProfileReq) ProtoMessage() {}
+
+func (x *GetUserProfileReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[16]
+	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 GetUserProfileReq.ProtoReflect.Descriptor instead.
+func (*GetUserProfileReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *GetUserProfileReq) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *GetUserProfileReq) GetUserId() int64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+type GetUserProfileRes struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id                 int64  `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`                                                              // 用户id
+	Nickname           string `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"`                                                   // 用户昵称
+	Username           string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"`                                                   // 用户名
+	Status             int32  `protobuf:"varint,4,opt,name=status,proto3" json:"status,omitempty"`                                                      // 用户状态0-正常1-封禁中2-禁言中3-删除
+	Avatar             string `protobuf:"bytes,5,opt,name=avatar,proto3" json:"avatar,omitempty"`                                                       // 头像
+	IsFriend           bool   `protobuf:"varint,7,opt,name=is_friend,json=isFriend,proto3" json:"is_friend,omitempty"`                                  // 是否是好友
+	IsFollowing        bool   `protobuf:"varint,8,opt,name=is_following,json=isFollowing,proto3" json:"is_following,omitempty"`                         // 是否关注
+	CreatedOn          int64  `protobuf:"varint,9,opt,name=created_on,json=createdOn,proto3" json:"created_on,omitempty"`                               // 注册时间
+	Follows            int64  `protobuf:"varint,10,opt,name=follows,proto3" json:"follows,omitempty"`                                                   // 关注数
+	Fans               int64  `protobuf:"varint,11,opt,name=fans,proto3" json:"fans,omitempty"`                                                         // 粉丝数
+	GetLikesCount      int32  `protobuf:"varint,12,opt,name=get_likes_count,json=getLikesCount,proto3" json:"get_likes_count,omitempty"`                //获得点赞数量
+	GetCollectionCount int32  `protobuf:"varint,13,opt,name=get_collection_count,json=getCollectionCount,proto3" json:"get_collection_count,omitempty"` //获得收藏的数量
+}
+
+func (x *GetUserProfileRes) Reset() {
+	*x = GetUserProfileRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetUserProfileRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetUserProfileRes) ProtoMessage() {}
+
+func (x *GetUserProfileRes) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[17]
+	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 GetUserProfileRes.ProtoReflect.Descriptor instead.
+func (*GetUserProfileRes) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *GetUserProfileRes) GetId() int64 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
+func (x *GetUserProfileRes) GetNickname() string {
+	if x != nil {
+		return x.Nickname
+	}
+	return ""
+}
+
+func (x *GetUserProfileRes) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *GetUserProfileRes) GetStatus() int32 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+func (x *GetUserProfileRes) GetAvatar() string {
+	if x != nil {
+		return x.Avatar
+	}
+	return ""
+}
+
+func (x *GetUserProfileRes) GetIsFriend() bool {
+	if x != nil {
+		return x.IsFriend
+	}
+	return false
+}
+
+func (x *GetUserProfileRes) GetIsFollowing() bool {
+	if x != nil {
+		return x.IsFollowing
+	}
+	return false
+}
+
+func (x *GetUserProfileRes) GetCreatedOn() int64 {
+	if x != nil {
+		return x.CreatedOn
+	}
+	return 0
+}
+
+func (x *GetUserProfileRes) GetFollows() int64 {
+	if x != nil {
+		return x.Follows
+	}
+	return 0
+}
+
+func (x *GetUserProfileRes) GetFans() int64 {
+	if x != nil {
+		return x.Fans
+	}
+	return 0
+}
+
+func (x *GetUserProfileRes) GetGetLikesCount() int32 {
+	if x != nil {
+		return x.GetLikesCount
+	}
+	return 0
+}
+
+func (x *GetUserProfileRes) GetGetCollectionCount() int32 {
+	if x != nil {
+		return x.GetCollectionCount
+	}
+	return 0
+}
+
+// 模糊查询用户
+type SearchUsernameReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
+}
+
+func (x *SearchUsernameReq) Reset() {
+	*x = SearchUsernameReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SearchUsernameReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SearchUsernameReq) ProtoMessage() {}
+
+func (x *SearchUsernameReq) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[18]
+	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 SearchUsernameReq.ProtoReflect.Descriptor instead.
+func (*SearchUsernameReq) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *SearchUsernameReq) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+type SearchUsernameItem struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
+	Avatar   string `protobuf:"bytes,2,opt,name=avatar,proto3" json:"avatar,omitempty"`
+	Id       int64  `protobuf:"varint,3,opt,name=id,proto3" json:"id,omitempty"`
+}
+
+func (x *SearchUsernameItem) Reset() {
+	*x = SearchUsernameItem{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SearchUsernameItem) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SearchUsernameItem) ProtoMessage() {}
+
+func (x *SearchUsernameItem) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[19]
+	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 SearchUsernameItem.ProtoReflect.Descriptor instead.
+func (*SearchUsernameItem) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *SearchUsernameItem) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *SearchUsernameItem) GetAvatar() string {
+	if x != nil {
+		return x.Avatar
+	}
+	return ""
+}
+
+func (x *SearchUsernameItem) GetId() int64 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
+type SearchUsernameRes struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	List []*SearchUsernameItem `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"`
+}
+
+func (x *SearchUsernameRes) Reset() {
+	*x = SearchUsernameRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_proto_slowwild_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SearchUsernameRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SearchUsernameRes) ProtoMessage() {}
+
+func (x *SearchUsernameRes) ProtoReflect() protoreflect.Message {
+	mi := &file_proto_slowwild_proto_msgTypes[20]
+	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 SearchUsernameRes.ProtoReflect.Descriptor instead.
+func (*SearchUsernameRes) Descriptor() ([]byte, []int) {
+	return file_proto_slowwild_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *SearchUsernameRes) GetList() []*SearchUsernameItem {
+	if x != nil {
+		return x.List
+	}
+	return nil
+}
+
+var File_proto_slowwild_proto protoreflect.FileDescriptor
+
+var file_proto_slowwild_proto_rawDesc = []byte{
+	0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64,
+	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0xc0, 0x02, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x45,
+	0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x1a, 0x0a,
+	0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65,
+	0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65,
+	0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73,
+	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61,
+	0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x03, 0x73, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x12,
+	0x1e, 0x0a, 0x0a, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x09, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x73, 0x12,
+	0x26, 0x0a, 0x0f, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6b, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x67, 0x65, 0x74, 0x4c, 0x69, 0x6b,
+	0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x67, 0x65, 0x74, 0x5f, 0x63,
+	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
+	0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x43, 0x0a, 0x13, 0x4c, 0x6f, 0x67,
+	0x69, 0x6e, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x73, 0x70,
+	0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x22, 0x6f,
+	0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68,
+	0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 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, 0x12, 0x12, 0x0a, 0x04,
+	0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65,
+	0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22,
+	0x85, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12,
+	0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d,
+	0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a,
+	0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61,
+	0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x03, 0x73, 0x65, 0x78, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x41, 0x0a, 0x0f, 0x47, 0x65, 0x74,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2e, 0x0a, 0x04,
+	0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x6c, 0x6f,
+	0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72,
+	0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x51, 0x0a, 0x0b,
+	0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 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, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x10, 0x0a,
+	0x03, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22,
+	0x47, 0x0a, 0x0c, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x37, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72,
+	0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08,
+	0x75, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x4e, 0x0a, 0x0d, 0x46, 0x6f, 0x6c, 0x6c,
+	0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65,
+	0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,
+	0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65,
+	0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x66, 0x6f, 0x6c, 0x6c,
+	0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x0d, 0x46, 0x6f, 0x6c, 0x6c,
+	0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63,
+	0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63,
+	0x65, 0x73, 0x73, 0x22, 0x55, 0x0a, 0x0f, 0x55, 0x6e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55,
+	0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12,
+	0x29, 0x0a, 0x11, 0x75, 0x6e, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x65,
+	0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x75, 0x6e, 0x46, 0x6f,
+	0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x0f, 0x55, 0x6e,
+	0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x12, 0x18, 0x0a,
+	0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
+	0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x7c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x6f,
+	0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,
+	0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65,
+	0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66,
+	0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65,
+	0x74, 0x12, 0x22, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f,
+	0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c,
+	0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c,
+	0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x69,
+	0x74, 0x79, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61,
+	0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x79,
+	0x0a, 0x0c, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x12, 0x17,
+	0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a,
+	0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f,
+	0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x75,
+	0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x71, 0x75,
+	0x65, 0x72, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x54, 0x0a, 0x0c, 0x47, 0x65, 0x74,
+	0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x6c, 0x69, 0x73,
+	0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69,
+	0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x6e, 0x74,
+	0x69, 0x74, 0x79, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74,
+	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22,
+	0x48, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+	0x65, 0x52, 0x65, 0x71, 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, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xf2, 0x02, 0x0a, 0x11, 0x47, 0x65,
+	0x74, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12,
+	0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75,
+	0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75,
+	0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x66, 0x72,
+	0x69, 0x65, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x46, 0x72,
+	0x69, 0x65, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f,
+	0x77, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x6f,
+	0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x64, 0x4f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77,
+	0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73,
+	0x12, 0x12, 0x0a, 0x04, 0x66, 0x61, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04,
+	0x66, 0x61, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6b, 0x65,
+	0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x67,
+	0x65, 0x74, 0x4c, 0x69, 0x6b, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14,
+	0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x67, 0x65, 0x74, 0x43,
+	0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2f,
+	0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65,
+	0x52, 0x65, 0x71, 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, 0x22,
+	0x58, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d,
+	0x65, 0x49, 0x74, 0x65, 0x6d, 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, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4b, 0x0a, 0x11, 0x53, 0x65, 0x61,
+	0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x12, 0x36,
+	0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73,
+	0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65,
+	0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x49, 0x74, 0x65, 0x6d,
+	0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x32, 0xa8, 0x06, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x57,
+	0x69, 0x6c, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x05, 0x4c, 0x6f, 0x67,
+	0x69, 0x6e, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72,
+	0x76, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x73,
+	0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x6f,
+	0x67, 0x69, 0x6e, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x73,
+	0x70, 0x12, 0x4c, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x2e,
+	0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52,
+	0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x73, 0x6c, 0x6f,
+	0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x69,
+	0x6e, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x73, 0x70, 0x12,
+	0x4e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1e,
+	0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
+	0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x1f,
+	0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
+	0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x45, 0x0a, 0x08, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x73, 0x6c,
+	0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6e,
+	0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77,
+	0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x55, 0x73,
+	0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4a, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f,
+	0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x1d, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72,
+	0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65,
+	0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72, 0x52,
+	0x65, 0x73, 0x12, 0x50, 0x0a, 0x0c, 0x55, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x6f, 0x6c, 0x6c,
+	0x6f, 0x77, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72,
+	0x76, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x72,
+	0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65,
+	0x72, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x55, 0x73, 0x65,
+	0x72, 0x52, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x61, 0x6e, 0x73, 0x12,
+	0x1f, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71,
+	0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65,
+	0x73, 0x12, 0x4e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x12,
+	0x1f, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71,
+	0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x52, 0x65,
+	0x73, 0x12, 0x56, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66,
+	0x69, 0x6c, 0x65, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65,
+	0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66,
+	0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c,
+	0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x50,
+	0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x0e, 0x53, 0x65, 0x61,
+	0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x2e, 0x73, 0x6c,
+	0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61,
+	0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x21,
+	0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e,
+	0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65,
+	0x73, 0x42, 0x19, 0x5a, 0x17, 0x73, 0x6c, 0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x2f, 0x73, 0x6c,
+	0x6f, 0x77, 0x77, 0x69, 0x6c, 0x64, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_proto_slowwild_proto_rawDescOnce sync.Once
+	file_proto_slowwild_proto_rawDescData = file_proto_slowwild_proto_rawDesc
+)
+
+func file_proto_slowwild_proto_rawDescGZIP() []byte {
+	file_proto_slowwild_proto_rawDescOnce.Do(func() {
+		file_proto_slowwild_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_slowwild_proto_rawDescData)
+	})
+	return file_proto_slowwild_proto_rawDescData
+}
+
+var file_proto_slowwild_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
+var file_proto_slowwild_proto_goTypes = []any{
+	(*UserEntity)(nil),          // 0: slowwildserver.UserEntity
+	(*LoginAndRegisterRsp)(nil), // 1: slowwildserver.LoginAndRegisterRsp
+	(*LoginReq)(nil),            // 2: slowwildserver.LoginReq
+	(*RegisterReq)(nil),         // 3: slowwildserver.RegisterReq
+	(*GetUserInfoReq)(nil),      // 4: slowwildserver.GetUserInfoReq
+	(*GetUserInfoResp)(nil),     // 5: slowwildserver.GetUserInfoResp
+	(*FindUserReq)(nil),         // 6: slowwildserver.FindUserReq
+	(*FindUserResp)(nil),        // 7: slowwildserver.FindUserResp
+	(*FollowUserReq)(nil),       // 8: slowwildserver.FollowUserReq
+	(*FollowUserRes)(nil),       // 9: slowwildserver.FollowUserRes
+	(*UnFollowUserReq)(nil),     // 10: slowwildserver.UnFollowUserReq
+	(*UnFollowUserRes)(nil),     // 11: slowwildserver.UnFollowUserRes
+	(*GetFollowingReq)(nil),     // 12: slowwildserver.GetFollowingReq
+	(*GetFollowingRes)(nil),     // 13: slowwildserver.GetFollowingRes
+	(*GetFollowReq)(nil),        // 14: slowwildserver.GetFollowReq
+	(*GetFollowRes)(nil),        // 15: slowwildserver.GetFollowRes
+	(*GetUserProfileReq)(nil),   // 16: slowwildserver.GetUserProfileReq
+	(*GetUserProfileRes)(nil),   // 17: slowwildserver.GetUserProfileRes
+	(*SearchUsernameReq)(nil),   // 18: slowwildserver.SearchUsernameReq
+	(*SearchUsernameItem)(nil),  // 19: slowwildserver.SearchUsernameItem
+	(*SearchUsernameRes)(nil),   // 20: slowwildserver.SearchUsernameRes
+}
+var file_proto_slowwild_proto_depIdxs = []int32{
+	0,  // 0: slowwildserver.GetUserInfoResp.user:type_name -> slowwildserver.UserEntity
+	0,  // 1: slowwildserver.FindUserResp.user_list:type_name -> slowwildserver.UserEntity
+	0,  // 2: slowwildserver.GetFollowingRes.list:type_name -> slowwildserver.UserEntity
+	0,  // 3: slowwildserver.GetFollowRes.list:type_name -> slowwildserver.UserEntity
+	19, // 4: slowwildserver.SearchUsernameRes.list:type_name -> slowwildserver.SearchUsernameItem
+	2,  // 5: slowwildserver.SlowWildServer.Login:input_type -> slowwildserver.LoginReq
+	3,  // 6: slowwildserver.SlowWildServer.Register:input_type -> slowwildserver.RegisterReq
+	4,  // 7: slowwildserver.SlowWildServer.GetUserInfo:input_type -> slowwildserver.GetUserInfoReq
+	6,  // 8: slowwildserver.SlowWildServer.FindUser:input_type -> slowwildserver.FindUserReq
+	8,  // 9: slowwildserver.SlowWildServer.UserFollow:input_type -> slowwildserver.FollowUserReq
+	10, // 10: slowwildserver.SlowWildServer.UnUserFollow:input_type -> slowwildserver.UnFollowUserReq
+	12, // 11: slowwildserver.SlowWildServer.GetFans:input_type -> slowwildserver.GetFollowingReq
+	12, // 12: slowwildserver.SlowWildServer.GetFollows:input_type -> slowwildserver.GetFollowingReq
+	16, // 13: slowwildserver.SlowWildServer.GetUserProfile:input_type -> slowwildserver.GetUserProfileReq
+	18, // 14: slowwildserver.SlowWildServer.SearchUsername:input_type -> slowwildserver.SearchUsernameReq
+	1,  // 15: slowwildserver.SlowWildServer.Login:output_type -> slowwildserver.LoginAndRegisterRsp
+	1,  // 16: slowwildserver.SlowWildServer.Register:output_type -> slowwildserver.LoginAndRegisterRsp
+	5,  // 17: slowwildserver.SlowWildServer.GetUserInfo:output_type -> slowwildserver.GetUserInfoResp
+	7,  // 18: slowwildserver.SlowWildServer.FindUser:output_type -> slowwildserver.FindUserResp
+	9,  // 19: slowwildserver.SlowWildServer.UserFollow:output_type -> slowwildserver.FollowUserRes
+	11, // 20: slowwildserver.SlowWildServer.UnUserFollow:output_type -> slowwildserver.UnFollowUserRes
+	13, // 21: slowwildserver.SlowWildServer.GetFans:output_type -> slowwildserver.GetFollowingRes
+	13, // 22: slowwildserver.SlowWildServer.GetFollows:output_type -> slowwildserver.GetFollowingRes
+	17, // 23: slowwildserver.SlowWildServer.GetUserProfile:output_type -> slowwildserver.GetUserProfileRes
+	20, // 24: slowwildserver.SlowWildServer.SearchUsername:output_type -> slowwildserver.SearchUsernameRes
+	15, // [15:25] is the sub-list for method output_type
+	5,  // [5:15] is the sub-list for method input_type
+	5,  // [5:5] is the sub-list for extension type_name
+	5,  // [5:5] is the sub-list for extension extendee
+	0,  // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_proto_slowwild_proto_init() }
+func file_proto_slowwild_proto_init() {
+	if File_proto_slowwild_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_proto_slowwild_proto_msgTypes[0].Exporter = func(v any, i int) any {
+			switch v := v.(*UserEntity); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[1].Exporter = func(v any, i int) any {
+			switch v := v.(*LoginAndRegisterRsp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[2].Exporter = func(v any, i int) any {
+			switch v := v.(*LoginReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[3].Exporter = func(v any, i int) any {
+			switch v := v.(*RegisterReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[4].Exporter = func(v any, i int) any {
+			switch v := v.(*GetUserInfoReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[5].Exporter = func(v any, i int) any {
+			switch v := v.(*GetUserInfoResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[6].Exporter = func(v any, i int) any {
+			switch v := v.(*FindUserReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[7].Exporter = func(v any, i int) any {
+			switch v := v.(*FindUserResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[8].Exporter = func(v any, i int) any {
+			switch v := v.(*FollowUserReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[9].Exporter = func(v any, i int) any {
+			switch v := v.(*FollowUserRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[10].Exporter = func(v any, i int) any {
+			switch v := v.(*UnFollowUserReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[11].Exporter = func(v any, i int) any {
+			switch v := v.(*UnFollowUserRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[12].Exporter = func(v any, i int) any {
+			switch v := v.(*GetFollowingReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[13].Exporter = func(v any, i int) any {
+			switch v := v.(*GetFollowingRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[14].Exporter = func(v any, i int) any {
+			switch v := v.(*GetFollowReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[15].Exporter = func(v any, i int) any {
+			switch v := v.(*GetFollowRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[16].Exporter = func(v any, i int) any {
+			switch v := v.(*GetUserProfileReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[17].Exporter = func(v any, i int) any {
+			switch v := v.(*GetUserProfileRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[18].Exporter = func(v any, i int) any {
+			switch v := v.(*SearchUsernameReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[19].Exporter = func(v any, i int) any {
+			switch v := v.(*SearchUsernameItem); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto_slowwild_proto_msgTypes[20].Exporter = func(v any, i int) any {
+			switch v := v.(*SearchUsernameRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_proto_slowwild_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   21,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_proto_slowwild_proto_goTypes,
+		DependencyIndexes: file_proto_slowwild_proto_depIdxs,
+		MessageInfos:      file_proto_slowwild_proto_msgTypes,
+	}.Build()
+	File_proto_slowwild_proto = out.File
+	file_proto_slowwild_proto_rawDesc = nil
+	file_proto_slowwild_proto_goTypes = nil
+	file_proto_slowwild_proto_depIdxs = nil
+}

+ 472 - 0
slowwild/slowwildserver/slowwild_grpc.pb.go

@@ -0,0 +1,472 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.4.0
+// - protoc             v3.19.4
+// source: proto/slowwild.proto
+
+package slowwildserver
+
+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.62.0 or later.
+const _ = grpc.SupportPackageIsVersion8
+
+const (
+	SlowWildServer_Login_FullMethodName          = "/slowwildserver.SlowWildServer/Login"
+	SlowWildServer_Register_FullMethodName       = "/slowwildserver.SlowWildServer/Register"
+	SlowWildServer_GetUserInfo_FullMethodName    = "/slowwildserver.SlowWildServer/GetUserInfo"
+	SlowWildServer_FindUser_FullMethodName       = "/slowwildserver.SlowWildServer/FindUser"
+	SlowWildServer_UserFollow_FullMethodName     = "/slowwildserver.SlowWildServer/UserFollow"
+	SlowWildServer_UnUserFollow_FullMethodName   = "/slowwildserver.SlowWildServer/UnUserFollow"
+	SlowWildServer_GetFans_FullMethodName        = "/slowwildserver.SlowWildServer/GetFans"
+	SlowWildServer_GetFollows_FullMethodName     = "/slowwildserver.SlowWildServer/GetFollows"
+	SlowWildServer_GetUserProfile_FullMethodName = "/slowwildserver.SlowWildServer/GetUserProfile"
+	SlowWildServer_SearchUsername_FullMethodName = "/slowwildserver.SlowWildServer/SearchUsername"
+)
+
+// SlowWildServerClient is the client API for SlowWildServer 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 SlowWildServerClient interface {
+	// 用户登录
+	Login(ctx context.Context, in *LoginReq, opts ...grpc.CallOption) (*LoginAndRegisterRsp, error)
+	// 用户注册
+	Register(ctx context.Context, in *RegisterReq, opts ...grpc.CallOption) (*LoginAndRegisterRsp, error)
+	// 获取用户信息
+	GetUserInfo(ctx context.Context, in *GetUserInfoReq, opts ...grpc.CallOption) (*GetUserInfoResp, error)
+	// 查询用户信息
+	FindUser(ctx context.Context, in *FindUserReq, opts ...grpc.CallOption) (*FindUserResp, error)
+	// 关注用户
+	UserFollow(ctx context.Context, in *FollowUserReq, opts ...grpc.CallOption) (*FollowUserRes, error)
+	// 取消关注用户
+	UnUserFollow(ctx context.Context, in *UnFollowUserReq, opts ...grpc.CallOption) (*UnFollowUserRes, error)
+	// 获取我得粉丝
+	GetFans(ctx context.Context, in *GetFollowingReq, opts ...grpc.CallOption) (*GetFollowingRes, error)
+	// 查询我的关注
+	GetFollows(ctx context.Context, in *GetFollowingReq, opts ...grpc.CallOption) (*GetFollowingRes, error)
+	// 查询用户的详细信息
+	GetUserProfile(ctx context.Context, in *GetUserProfileReq, opts ...grpc.CallOption) (*GetUserProfileRes, error)
+	// 搜索用户名称
+	SearchUsername(ctx context.Context, in *SearchUsernameReq, opts ...grpc.CallOption) (*SearchUsernameRes, error)
+}
+
+type slowWildServerClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewSlowWildServerClient(cc grpc.ClientConnInterface) SlowWildServerClient {
+	return &slowWildServerClient{cc}
+}
+
+func (c *slowWildServerClient) Login(ctx context.Context, in *LoginReq, opts ...grpc.CallOption) (*LoginAndRegisterRsp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(LoginAndRegisterRsp)
+	err := c.cc.Invoke(ctx, SlowWildServer_Login_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) Register(ctx context.Context, in *RegisterReq, opts ...grpc.CallOption) (*LoginAndRegisterRsp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(LoginAndRegisterRsp)
+	err := c.cc.Invoke(ctx, SlowWildServer_Register_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) GetUserInfo(ctx context.Context, in *GetUserInfoReq, opts ...grpc.CallOption) (*GetUserInfoResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetUserInfoResp)
+	err := c.cc.Invoke(ctx, SlowWildServer_GetUserInfo_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) FindUser(ctx context.Context, in *FindUserReq, opts ...grpc.CallOption) (*FindUserResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(FindUserResp)
+	err := c.cc.Invoke(ctx, SlowWildServer_FindUser_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) UserFollow(ctx context.Context, in *FollowUserReq, opts ...grpc.CallOption) (*FollowUserRes, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(FollowUserRes)
+	err := c.cc.Invoke(ctx, SlowWildServer_UserFollow_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) UnUserFollow(ctx context.Context, in *UnFollowUserReq, opts ...grpc.CallOption) (*UnFollowUserRes, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(UnFollowUserRes)
+	err := c.cc.Invoke(ctx, SlowWildServer_UnUserFollow_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) GetFans(ctx context.Context, in *GetFollowingReq, opts ...grpc.CallOption) (*GetFollowingRes, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetFollowingRes)
+	err := c.cc.Invoke(ctx, SlowWildServer_GetFans_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) GetFollows(ctx context.Context, in *GetFollowingReq, opts ...grpc.CallOption) (*GetFollowingRes, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetFollowingRes)
+	err := c.cc.Invoke(ctx, SlowWildServer_GetFollows_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) GetUserProfile(ctx context.Context, in *GetUserProfileReq, opts ...grpc.CallOption) (*GetUserProfileRes, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetUserProfileRes)
+	err := c.cc.Invoke(ctx, SlowWildServer_GetUserProfile_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *slowWildServerClient) SearchUsername(ctx context.Context, in *SearchUsernameReq, opts ...grpc.CallOption) (*SearchUsernameRes, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SearchUsernameRes)
+	err := c.cc.Invoke(ctx, SlowWildServer_SearchUsername_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// SlowWildServerServer is the server API for SlowWildServer service.
+// All implementations must embed UnimplementedSlowWildServerServer
+// for forward compatibility
+type SlowWildServerServer interface {
+	// 用户登录
+	Login(context.Context, *LoginReq) (*LoginAndRegisterRsp, error)
+	// 用户注册
+	Register(context.Context, *RegisterReq) (*LoginAndRegisterRsp, error)
+	// 获取用户信息
+	GetUserInfo(context.Context, *GetUserInfoReq) (*GetUserInfoResp, error)
+	// 查询用户信息
+	FindUser(context.Context, *FindUserReq) (*FindUserResp, error)
+	// 关注用户
+	UserFollow(context.Context, *FollowUserReq) (*FollowUserRes, error)
+	// 取消关注用户
+	UnUserFollow(context.Context, *UnFollowUserReq) (*UnFollowUserRes, error)
+	// 获取我得粉丝
+	GetFans(context.Context, *GetFollowingReq) (*GetFollowingRes, error)
+	// 查询我的关注
+	GetFollows(context.Context, *GetFollowingReq) (*GetFollowingRes, error)
+	// 查询用户的详细信息
+	GetUserProfile(context.Context, *GetUserProfileReq) (*GetUserProfileRes, error)
+	// 搜索用户名称
+	SearchUsername(context.Context, *SearchUsernameReq) (*SearchUsernameRes, error)
+	mustEmbedUnimplementedSlowWildServerServer()
+}
+
+// UnimplementedSlowWildServerServer must be embedded to have forward compatible implementations.
+type UnimplementedSlowWildServerServer struct {
+}
+
+func (UnimplementedSlowWildServerServer) Login(context.Context, *LoginReq) (*LoginAndRegisterRsp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Login not implemented")
+}
+func (UnimplementedSlowWildServerServer) Register(context.Context, *RegisterReq) (*LoginAndRegisterRsp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Register not implemented")
+}
+func (UnimplementedSlowWildServerServer) GetUserInfo(context.Context, *GetUserInfoReq) (*GetUserInfoResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetUserInfo not implemented")
+}
+func (UnimplementedSlowWildServerServer) FindUser(context.Context, *FindUserReq) (*FindUserResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method FindUser not implemented")
+}
+func (UnimplementedSlowWildServerServer) UserFollow(context.Context, *FollowUserReq) (*FollowUserRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UserFollow not implemented")
+}
+func (UnimplementedSlowWildServerServer) UnUserFollow(context.Context, *UnFollowUserReq) (*UnFollowUserRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UnUserFollow not implemented")
+}
+func (UnimplementedSlowWildServerServer) GetFans(context.Context, *GetFollowingReq) (*GetFollowingRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetFans not implemented")
+}
+func (UnimplementedSlowWildServerServer) GetFollows(context.Context, *GetFollowingReq) (*GetFollowingRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetFollows not implemented")
+}
+func (UnimplementedSlowWildServerServer) GetUserProfile(context.Context, *GetUserProfileReq) (*GetUserProfileRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetUserProfile not implemented")
+}
+func (UnimplementedSlowWildServerServer) SearchUsername(context.Context, *SearchUsernameReq) (*SearchUsernameRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SearchUsername not implemented")
+}
+func (UnimplementedSlowWildServerServer) mustEmbedUnimplementedSlowWildServerServer() {}
+
+// UnsafeSlowWildServerServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SlowWildServerServer will
+// result in compilation errors.
+type UnsafeSlowWildServerServer interface {
+	mustEmbedUnimplementedSlowWildServerServer()
+}
+
+func RegisterSlowWildServerServer(s grpc.ServiceRegistrar, srv SlowWildServerServer) {
+	s.RegisterService(&SlowWildServer_ServiceDesc, srv)
+}
+
+func _SlowWildServer_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(LoginReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).Login(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_Login_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).Login(ctx, req.(*LoginReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(RegisterReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).Register(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_Register_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).Register(ctx, req.(*RegisterReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_GetUserInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetUserInfoReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).GetUserInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_GetUserInfo_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).GetUserInfo(ctx, req.(*GetUserInfoReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_FindUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FindUserReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).FindUser(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_FindUser_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).FindUser(ctx, req.(*FindUserReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_UserFollow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(FollowUserReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).UserFollow(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_UserFollow_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).UserFollow(ctx, req.(*FollowUserReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_UnUserFollow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UnFollowUserReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).UnUserFollow(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_UnUserFollow_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).UnUserFollow(ctx, req.(*UnFollowUserReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_GetFans_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetFollowingReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).GetFans(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_GetFans_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).GetFans(ctx, req.(*GetFollowingReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_GetFollows_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetFollowingReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).GetFollows(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_GetFollows_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).GetFollows(ctx, req.(*GetFollowingReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_GetUserProfile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetUserProfileReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).GetUserProfile(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_GetUserProfile_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).GetUserProfile(ctx, req.(*GetUserProfileReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _SlowWildServer_SearchUsername_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SearchUsernameReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(SlowWildServerServer).SearchUsername(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: SlowWildServer_SearchUsername_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(SlowWildServerServer).SearchUsername(ctx, req.(*SearchUsernameReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// SlowWildServer_ServiceDesc is the grpc.ServiceDesc for SlowWildServer service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SlowWildServer_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "slowwildserver.SlowWildServer",
+	HandlerType: (*SlowWildServerServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "Login",
+			Handler:    _SlowWildServer_Login_Handler,
+		},
+		{
+			MethodName: "Register",
+			Handler:    _SlowWildServer_Register_Handler,
+		},
+		{
+			MethodName: "GetUserInfo",
+			Handler:    _SlowWildServer_GetUserInfo_Handler,
+		},
+		{
+			MethodName: "FindUser",
+			Handler:    _SlowWildServer_FindUser_Handler,
+		},
+		{
+			MethodName: "UserFollow",
+			Handler:    _SlowWildServer_UserFollow_Handler,
+		},
+		{
+			MethodName: "UnUserFollow",
+			Handler:    _SlowWildServer_UnUserFollow_Handler,
+		},
+		{
+			MethodName: "GetFans",
+			Handler:    _SlowWildServer_GetFans_Handler,
+		},
+		{
+			MethodName: "GetFollows",
+			Handler:    _SlowWildServer_GetFollows_Handler,
+		},
+		{
+			MethodName: "GetUserProfile",
+			Handler:    _SlowWildServer_GetUserProfile_Handler,
+		},
+		{
+			MethodName: "SearchUsername",
+			Handler:    _SlowWildServer_SearchUsername_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "proto/slowwild.proto",
+}