topfans/backend/services/userService/provider
2026-04-07 22:29:48 +08:00
..
auth_provider.go 提交后端代码 2026-04-07 22:29:48 +08:00
README.md 提交后端代码 2026-04-07 22:29:48 +08:00
unified_provider.go 提交后端代码 2026-04-07 22:29:48 +08:00
user_provider.go 提交后端代码 2026-04-07 22:29:48 +08:00

Provider层实现文档

一、认证ProviderAuthProvider

1.1 功能概述

实现了认证相关的Dubbo-go Provider接口作为Service层和Dubbo-go框架之间的桥梁。

1.2 实现的方法

  • Register - 用户注册
  • Login - 用户登录
  • Logout - 用户登出
  • RefreshToken - 刷新Token
  • ValidateToken - 验证Token
  • Reference - 返回服务引用名称

1.2 接口实现

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 使用示例

// 创建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验证等敏感操作的详细信息

二、用户信息ProviderUserProvider

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 使用示例

// 创建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并解析