Files
frontend/profileServiceREADME (1).md

291 lines
8.5 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.

# ProfileService - 角色管理服务
ProfileService是CarrotSkin皮肤站的角色管理微服务负责处理Minecraft角色的创建、管理、RSA密钥生成和签名验证等核心功能。
## 📋 目录
- [功能特性](#功能特性)
- [技术架构](#技术架构)
- [数据模型](#数据模型)
- [API接口](#api接口)
- [部署指南](#部署指南)
- [开发指南](#开发指南)
- [故障排查](#故障排查)
## 🚀 功能特性
### 核心功能
- **角色管理**: 创建、查询、更新、删除Minecraft角色
- **RSA密钥管理**: 自动生成RSA-2048密钥对支持数据签名和验证
- **皮肤/披风关联**: 管理角色与皮肤、披风的关联关系
- **用户角色列表**: 支持查询用户下的所有角色
- **数据验证**: 完整的参数验证和业务逻辑检查
### 安全特性
- **RSA签名**: 支持使用私钥对数据进行签名
- **签名验证**: 支持使用公钥验证数据签名
- **权限控制**: 确保用户只能操作自己的角色
- **数据完整性**: 完整的事务处理和数据一致性保证
## 🏗️ 技术架构
### 技术栈
- **框架**: go-zero微服务框架
- **数据库**: MySQL 8.0+
- **缓存**: Redis (通过go-zero集成)
- **通信协议**: gRPC
- **密钥算法**: RSA-2048
### 服务架构
```
ProfileService
├── internal/
│ ├── config/ # 配置管理
│ ├── handler/ # gRPC处理器
│ ├── logic/ # 业务逻辑层
│ ├── model/ # 数据模型层
│ └── svc/ # 服务上下文
├── pb/ # Protocol Buffers定义
└── docs/ # 文档和SQL脚本
```
## 📊 数据模型
### 数据库表结构
```sql
CREATE TABLE `profiles` (
`uuid` VARCHAR(36) NOT NULL COMMENT '角色的UUID通常为Minecraft玩家的UUID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '关联的用户ID',
`name` VARCHAR(16) NOT NULL COMMENT '角色名 (Minecraft In-Game Name)',
`skin_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '当前使用的皮肤ID',
`cape_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '当前使用的披风ID',
`rsa_private_key` TEXT NOT NULL COMMENT 'RSA-2048私钥 (PEM格式)',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`uuid`),
INDEX `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
### 数据类型映射
| 字段 | SQL类型 | Go Model类型 | Proto类型 | 说明 |
|------|---------|-------------|-----------|------|
| uuid | VARCHAR(36) | string | string | 角色UUID |
| user_id | BIGINT UNSIGNED | uint64 | int64 | 用户ID |
| name | VARCHAR(16) | string | string | 角色名 |
| skin_id | BIGINT UNSIGNED NULL | sql.NullInt64 | int64 | 皮肤ID (0表示无皮肤) |
| cape_id | BIGINT UNSIGNED NULL | sql.NullInt64 | int64 | 披风ID (0表示无披风) |
| rsa_private_key | TEXT | string | string | RSA私钥 |
| created_at | TIMESTAMP | time.Time | string | 创建时间 |
| updated_at | TIMESTAMP | time.Time | string | 更新时间 |
## 🔌 API接口
### 对外接口 (Public APIs)
#### 1. CreateProfile - 创建角色
```protobuf
rpc CreateProfile(CreateProfileRequest) returns (CreateProfileResponse);
```
- **功能**: 创建新的Minecraft角色
- **验证**: UUID格式、角色名格式、用户权限
- **特性**: 自动生成RSA密钥对、角色名去重检查
#### 2. GetProfile - 获取角色信息
```protobuf
rpc GetProfile(GetProfileRequest) returns (GetProfileResponse);
```
- **功能**: 根据UUID获取角色基本信息
- **返回**: 不包含私钥的公开信息
#### 3. GetProfilesByUserId - 获取用户角色列表
```protobuf
rpc GetProfilesByUserId(GetProfilesByUserIdRequest) returns (GetProfilesByUserIdResponse);
```
- **功能**: 获取指定用户的所有角色列表
- **特性**: 支持空结果返回
#### 4. UpdateProfile - 更新角色信息
```protobuf
rpc UpdateProfile(UpdateProfileRequest) returns (UpdateProfileResponse);
```
- **功能**: 更新角色名、皮肤ID、披风ID
- **验证**: 角色名重复检查、权限验证
- **特性**: 支持NULL值处理 (0表示移除)
#### 5. DeleteProfile - 删除角色
```protobuf
rpc DeleteProfile(DeleteProfileRequest) returns (DeleteProfileResponse);
```
- **功能**: 删除指定角色
- **验证**: 权限检查
#### 6. GetProfilePublicKey - 获取角色公钥
```protobuf
rpc GetProfilePublicKey(GetProfilePublicKeyRequest) returns (GetProfilePublicKeyResponse);
```
- **功能**: 获取角色的RSA公钥
- **用途**: 用于验证角色签名
#### 7. VerifyProfileSignature - 验证角色签名
```protobuf
rpc VerifyProfileSignature(VerifyProfileSignatureRequest) returns (VerifyProfileSignatureResponse);
```
- **功能**: 验证使用角色私钥生成的签名
- **算法**: RSA-2048 + SHA-256
#### 8. GetProfileWithProperties - 查询角色属性
```protobuf
rpc GetProfileWithProperties(GetProfileWithPropertiesRequest) returns (GetProfileWithPropertiesResponse);
```
- **功能**: 查询角色完整信息包含Minecraft协议兼容的属性和签名
- **用途**: 用于游戏客户端获取皮肤、披风等信息
- **特性**: 支持生成带签名和不带签名的属性
#### 9. GetProfilesByNames - 批量查询角色
```protobuf
rpc GetProfilesByNames(GetProfilesByNamesRequest) returns (GetProfilesByNamesResponse);
```
- **功能**: 根据角色名称列表批量查询角色信息
- **返回**: 简化的角色信息列表UUID和名称
#### 10. GetUserIdByProfileName - 根据角色名获取用户ID
```protobuf
rpc GetUserIdByProfileName(GetUserIdByProfileNameRequest) returns (GetUserIdByProfileNameResponse);
```
- **功能**: 根据角色名称查找关联的用户ID
- **用途**: 支持使用角色名进行登录等操作
### 对内接口 (Internal APIs)
#### 11. GetProfileInternalInfo - 获取角色内部信息
```protobuf
rpc GetProfileInternalInfo(GetProfileInternalInfoRequest) returns (ProfileInternalInfo);
```
- **功能**: 获取包含私钥的完整角色信息
- **权限**: 仅供内部微服务调用
- **安全**: 包含敏感信息,需要严格权限控制
#### 12. SignData - 使用私钥签名数据
```protobuf
rpc SignData(SignDataRequest) returns (SignDataResponse);
```
- **功能**: 使用角色私钥对数据进行签名
- **算法**: RSA-2048 + SHA-256
- **返回**: Base64编码的签名结果
## 🚀 部署指南
### 环境要求
- Go 1.19+
- MySQL 8.0+
- Redis 6.0+
### 配置文件示例
```yaml
# etc/profile.yaml
Name: profile.rpc
ListenOn: 0.0.0.0:8082
#Etcd:
# Hosts:
# - 127.0.0.1:2379
# Key: profile.rpc
DataSource: root:password@tcp(localhost:3306)/carrot_skin?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai
CacheConf:
- Host: 127.0.0.1:6379
Pass: ""
Type: node
```
### 部署步骤
1. **数据库初始化**
```bash
mysql -u root -p carrot_skin < docs/profiles.sql
```
2. **编译服务**
```bash
go build -o profile-service .
```
3. **启动服务**
```bash
./profile-service -f etc/profile.yaml
```
## 🛠️ 开发指南
### 代码生成
使用提供的脚本重新生成代码:
```bash
# Windows
generate.bat
# Linux/Mac
chmod +x generate.sh
./generate.sh
```
### 业务逻辑扩展
所有业务逻辑都在 `internal/logic/` 目录下:
- `createProfileLogic.go` - 角色创建逻辑
- `getProfileLogic.go` - 角色查询逻辑
- `updateProfileLogic.go` - 角色更新逻辑
- `deleteProfileLogic.go` - 角色删除逻辑
- 等等...
### 数据模型扩展
如需添加新的数据库方法,在 `internal/model/profilesmodel.go` 中扩展:
```go
type ProfilesModel interface {
profilesModel
// 添加自定义方法
FindByUserId(ctx context.Context, userId uint64) ([]*Profiles, error)
}
```
## 🔧 故障排查
### 常见问题
#### 1. 数据类型转换错误
**问题**: `sql.NullInt64` 类型处理错误
**解决**: 使用 `nullInt64ToValue()` 函数进行正确转换
#### 2. RSA密钥生成失败
**问题**: RSA密钥生成或解析失败
**解决**: 检查系统随机数生成器,确保有足够的熵
#### 3. 角色名重复
**问题**: 同一用户下角色名重复
**解决**: 创建和更新时都会进行重复检查
#### 4. UUID格式错误
**问题**: UUID格式不符合标准
**解决**: 确保UUID为36位标准格式 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
### 日志级别
- **INFO**: 正常业务操作
- **ERROR**: 业务错误和系统错误
- **DEBUG**: 详细的调试信息
### 性能监控
- 数据库连接池状态
- Redis缓存命中率
- gRPC请求响应时间
- RSA密钥操作耗时