topfans/backend/proto/README.md
2026-04-07 22:29:48 +08:00

322 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Proto 文件说明
> **目录**Protocol Buffers 定义文件
> **用途**:定义服务接口和数据结构
---
## 📁 文件结构
```
proto/
├── common.proto # 通用消息定义BaseResponse, PageRequest 等)
├── user.proto # 用户服务定义(认证、身份、个人资料等)
├── social.proto # 社交服务定义(好友、关注等功能)
└── README.md # 本文档
```
---
## 🔧 编译 Proto 文件
### 1. 安装依赖
需要安装以下工具:
```bash
# 安装 protoc 编译器
# macOS
brew install protobuf
# Ubuntu/Debian
apt-get install protobuf-compiler
# 安装 Go 插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
go install github.com/dubbogo/triple/cmd/protoc-gen-triple@latest
# 安装 HTTP 注解插件(可选)
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
```
### 2. 编译 Proto 文件
```bash
# 进入 backend 目录
cd /path/to/backend
# 编译 user.proto
protoc --proto_path=. \
--go_out=. \
--go_opt=module=github.com/topfans/backend \
--go-triple_out=. \
--go-triple_opt=module=github.com/topfans/backend \
proto/user.proto
# 编译 social.proto
protoc --proto_path=. \
--go_out=. \
--go_opt=module=github.com/topfans/backend \
--go-triple_out=. \
--go-triple_opt=module=github.com/topfans/backend \
proto/social.proto
# 生成的文件:
# - pkg/proto/user/user.pb.go # 用户服务消息定义
# - pkg/proto/user/user.triple.go # 用户服务 Dubbo Triple 接口
# - pkg/proto/social/social.pb.go # 社交服务消息定义
# - pkg/proto/social/social.triple.go # 社交服务 Dubbo Triple 接口
```
### 3. 批量编译所有 proto 文件
创建编译脚本 `scripts/compile-proto.sh`
```bash
#!/bin/bash
set -e
# 进入项目根目录
cd "$(dirname "$0")/.."
echo "编译 Proto 文件..."
# 模块路径
MODULE_PATH="github.com/topfans/backend"
# 编译 user.proto
protoc --proto_path=. \
--go_out=. \
--go_opt=module=$MODULE_PATH \
--go-triple_out=. \
--go-triple_opt=module=$MODULE_PATH \
proto/user.proto
echo "✅ user.proto 编译完成"
# 编译 social.proto
protoc --proto_path=. \
--go_out=. \
--go_opt=module=$MODULE_PATH \
--go-triple_out=. \
--go-triple_opt=module=$MODULE_PATH \
proto/social.proto
echo "✅ social.proto 编译完成"
echo "所有 Proto 文件编译完成!"
```
使用脚本:
```bash
chmod +x scripts/compile-proto.sh
./scripts/compile-proto.sh
```
---
## 📋 social.proto 说明
### 核心 Message
#### 1. FriendRequest好友请求
```protobuf
message FriendRequest {
int64 id = 1; // 请求ID
int64 from_user_id = 2; // 发送者用户ID
int64 to_user_id = 3; // 接收者用户ID
int64 star_id = 4; // 明星ID
string message = 5; // 请求附带消息
string status = 6; // 状态
// ... 更多字段
}
```
**状态枚举**
- `pending` - 待处理
- `accepted` - 已接受
- `rejected` - 已拒绝
- `expired` - 已过期
---
#### 2. Friendship好友关系
```protobuf
message Friendship {
int64 id = 1; // 关系ID
int64 user_id = 2; // 用户ID
int64 friend_id = 3; // 好友用户ID
int64 star_id = 4; // 明星ID
string status = 5; // 状态
string remark = 6; // 备注名
// ... 更多字段
}
```
**状态枚举**
- `accepted` - 正常好友关系
- `blocked` - 已屏蔽(预留)
---
### 服务接口
#### SocialService
```protobuf
service SocialService {
// 好友请求相关
rpc SendFriendRequest(...) // 发送好友请求
rpc GetFriendRequests(...) // 获取请求列表
rpc HandleFriendRequest(...) // 处理请求(接受/拒绝)
// 好友关系相关
rpc GetFriendList(...) // 获取好友列表
rpc DeleteFriend(...) // 删除好友
rpc SetFriendRemark(...) // 设置备注
rpc CheckFriendship(...) // 检查好友关系
rpc GetFriendCount(...) // 获取好友数量
}
```
---
## 🎯 使用示例
### 1. 在 Service 层实现接口
```go
package service
import (
pb "github.com/topfans/backend/pkg/proto/social"
)
type SocialService struct {
// 依赖注入
socialRepo repository.SocialRepository
config *config.SocialConfig
}
// 实现 SendFriendRequest
func (s *SocialService) SendFriendRequest(
ctx context.Context,
req *pb.SendFriendRequestRequest,
) (*pb.SendFriendRequestResponse, error) {
// 从 Dubbo Attachments 获取用户信息
userID := dubbo.GetAttachment(ctx, "user_id")
starID := dubbo.GetAttachment(ctx, "star_id")
// 业务逻辑...
return &pb.SendFriendRequestResponse{
Base: &common.BaseResponse{
Code: common.StatusCode_STATUS_OK,
Message: "ok",
Timestamp: time.Now().UnixMilli(),
},
RequestId: requestID,
Status: "pending",
}, nil
}
```
---
### 2. 在 Gateway 层调用服务
```go
package controller
import (
pb "github.com/topfans/backend/pkg/proto/social"
)
type SocialController struct {
socialServiceClient pb.SocialServiceClient
}
func (c *SocialController) SendFriendRequest(ctx *gin.Context) {
var req pb.SendFriendRequestRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
response.BadRequest(ctx, err.Error())
return
}
// 创建 Dubbo Context设置 Attachments
dubboCtx := context.Background()
dubboCtx = context.WithValue(dubboCtx, constant.AttachmentKey,
map[string]interface{}{
"user_id": ctx.GetInt64("user_id"),
"star_id": ctx.GetInt64("star_id"),
})
// 调用 Dubbo 服务
resp, err := c.socialServiceClient.SendFriendRequest(dubboCtx, &req)
if err != nil {
response.HandleError(ctx, err)
return
}
response.Success(ctx, resp)
}
```
---
## 📊 HTTP 路由映射
基于 proto 文件中的 `google.api.http` 注解,自动生成以下路由:
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/v1/friends/requests` | 发送好友请求 |
| GET | `/api/v1/friends/requests` | 获取请求列表 |
| POST | `/api/v1/friends/requests/{request_id}/handle` | 处理请求 |
| GET | `/api/v1/friends` | 获取好友列表 |
| DELETE | `/api/v1/friends/{friend_user_id}` | 删除好友 |
| PUT | `/api/v1/friends/{friend_user_id}/remark` | 设置备注 |
| GET | `/api/v1/friends/check/{user_id}/{friend_user_id}` | 检查好友关系 |
| GET | `/api/v1/friends/count` | 获取好友数量 |
---
## 🔄 Proto 文件修改流程
1. **修改 proto 文件**
2. **重新编译**`./scripts/compile-proto.sh`
3. **更新 Service 实现**
4. **更新 Gateway Controller**
5. **测试验证**
---
## ✅ 检查清单
- [x] common.proto - 通用定义
- [x] user.proto - 用户服务(认证、身份、个人资料)
- [x] social.proto - 社交服务(好友、关注等功能)
- [x] 编译所有 proto 文件
- [ ] 实现 SocialService
- [ ] 创建 Provider
- [ ] 注册 Dubbo 服务
---
## 📚 参考资料
- [Protocol Buffers 官方文档](https://developers.google.com/protocol-buffers)
- [Dubbo-go 官方文档](https://dubbogo.github.io/)
- [gRPC HTTP 注解](https://github.com/googleapis/googleapis/blob/master/google/api/http.proto)
---
**最后更新**2026-01-06
**版本**v2.0(已重命名为 Social 服务)