# Provider层实现文档 ## 一、认证Provider(AuthProvider) ### 1.1 功能概述 实现了认证相关的Dubbo-go Provider接口,作为Service层和Dubbo-go框架之间的桥梁。 ### 1.2 实现的方法 - `Register` - 用户注册 - `Login` - 用户登录 - `Logout` - 用户登出 - `RefreshToken` - 刷新Token - `ValidateToken` - 验证Token - `Reference` - 返回服务引用名称 ### 1.2 接口实现 ```go type AuthProvider struct { authService service.AuthService } // Reference 返回服务引用名称(Dubbo-go要求) func (p *AuthProvider) Reference() string // Register 用户注册 func (p *AuthProvider) Register(ctx context.Context, req *pb.RegisterRequest) (*pb.RegisterResponse, error) // Login 用户登录 func (p *AuthProvider) Login(ctx context.Context, req *pb.LoginRequest) (*pb.LoginResponse, error) // Logout 用户登出 func (p *AuthProvider) Logout(ctx context.Context, req *pb.LogoutRequest) (*pb.LogoutResponse, error) // RefreshToken 刷新Token func (p *AuthProvider) RefreshToken(ctx context.Context, req *pb.RefreshTokenRequest) (*pb.RefreshTokenResponse, error) // ValidateToken 验证Token func (p *AuthProvider) ValidateToken(ctx context.Context, req *pb.ValidateTokenRequest) (*pb.ValidateTokenResponse, error) ``` ### 1.3 实现要点 1. **请求日志记录**:记录所有请求,便于追踪和调试 2. **Service层调用**:直接调用Service层方法,不包含业务逻辑 3. **错误处理**:捕获Service层错误,转换为proto响应格式 4. **Reference方法**:实现Dubbo-go要求的Reference()方法,返回服务名称 ### 1.4 使用示例 ```go // 创建Service实例 userRepo := repository.NewUserRepository() fanProfileRepo := repository.NewFanProfileRepository() starRepo := repository.NewStarRepository() db := database.GetDB() authService := service.NewAuthService(userRepo, fanProfileRepo, starRepo, db) // 创建Provider实例 authProvider := provider.NewAuthProvider(authService) // 在Dubbo-go中注册Provider config.SetProviderService(authProvider) ``` ### 1.5 错误处理 Provider层负责: - 捕获Service层返回的错误 - 如果响应为空,构建包含错误信息的响应 - 确保所有错误都转换为proto格式的响应 Service层已经处理了详细的错误和状态码,Provider层主要确保响应格式正确。 ### 1.6 日志记录 - **Info级别**:记录所有请求和成功响应 - **Error级别**:记录所有错误 - **Debug级别**:记录Token验证等敏感操作的详细信息 --- ## 二、用户信息Provider(UserProvider) ### 2.1 功能概述 实现了用户信息和粉丝身份相关的Dubbo-go Provider接口,包括: - 用户信息查询 - 粉丝档案管理 - 个人信息管理 - 密码管理 - 粉丝身份管理 ### 2.2 实现的方法 #### 用户信息相关: - `GetUser` - 获取用户信息 - `GetFanProfile` - 获取粉丝档案 - `GetCurrentUser` - 获取当前登录用户信息 - `GetMyProfile` - 获取个人信息页 - `UpdateNickname` - 修改昵称 - `UpdatePassword` - 修改密码 #### 粉丝身份相关: - `GetFanIdentities` - 获取可选粉丝身份列表 - `AddIdentity` - 新增粉丝身份 - `SwitchIdentity` - 切换粉丝身份 #### Provider接口: - `Reference` - 返回服务引用名称 ### 2.3 实现要点 1. **Context中提取用户信息**: - 需要认证的接口(GetCurrentUser, GetMyProfile, UpdateNickname等)需要从Context中提取userID和starID - 目前使用`extractUserInfoFromContext`辅助函数,该函数需要在认证中间件中设置userID和starID到context 2. **Service层调用**: - 直接调用Service层方法 - 对于需要userID/starID的方法,从Context中提取后传递给Service层 3. **响应格式转换**: - `GetCurrentUser`需要将`GetMyProfileResponse`转换为`GetCurrentUserResponse`格式 ### 2.4 依赖的Service - `service.UserService` - 用户信息服务 - `service.IdentityService` - 粉丝身份服务 ### 2.5 使用示例 ```go // 创建Service实例 userRepo := repository.NewUserRepository() fanProfileRepo := repository.NewFanProfileRepository() starRepo := repository.NewStarRepository() db := database.GetDB() userService := service.NewUserService(userRepo, fanProfileRepo, db) identityService := service.NewIdentityService(fanProfileRepo, starRepo, userRepo, db) // 创建Provider实例 userProvider := provider.NewUserProvider(userService, identityService) // 在Dubbo-go中注册Provider config.SetProviderService(userProvider) ``` ### 2.6 注意事项 1. **认证中间件依赖**: - 需要认证的接口依赖认证中间件从Token中提取userID和starID并设置到Context - `extractUserInfoFromContext`函数目前返回错误,需要在实现认证中间件后完善 2. **Context使用**: - 所有方法都接收`context.Context`作为第一个参数 - 需要认证的接口从Context中提取用户信息 - 不需要认证的接口(如GetUser, GetFanProfile)直接使用请求参数 3. **错误处理**: - 捕获Service层错误并转换为proto响应格式 - 确保所有错误都有对应的响应结构 ### 2.7 待完善的功能 - **extractUserInfoFromContext函数**:需要实现认证中间件后,从Context中正确提取userID和starID - 方案1:从context.Values中获取(需要中间件设置) - 方案2:从metadata中获取(Dubbo-go支持) - 方案3:从请求头中提取Token并解析