feat: 新增用户信息获取功能及相关模型
- 在APIEndpoints.swift中新增getUserInfo端点以支持获取用户信息。 - 在APIModels.swift中实现获取用户信息请求和响应模型,处理用户信息的请求与解析。 - 在UserInfoManager中新增方法以从服务器获取用户信息,并在登录成功后自动获取用户信息。 - 在SettingFeature中新增用户信息刷新状态管理,支持用户信息的刷新操作。 - 在SettingView中集成用户信息刷新按钮,提升用户体验。 - 在SplashFeature中实现自动获取用户信息的逻辑,优化用户登录流程。 - 在yanaAPITests中添加用户信息相关的单元测试,确保功能的正确性。
This commit is contained in:
@@ -22,6 +22,7 @@ enum APIEndpoint: String, CaseIterable {
|
||||
case latestDynamics = "/dynamic/square/latestDynamics" // 新增:获取最新动态列表端点
|
||||
case tcToken = "/tencent/cos/getToken" // 新增:腾讯云 COS Token 获取端点
|
||||
case publishFeed = "/dynamic/square/publish" // 发布动态
|
||||
case getUserInfo = "/user/get" // 新增:获取用户信息端点
|
||||
|
||||
// Web 页面路径
|
||||
case userAgreement = "/modules/rule/protocol.html"
|
||||
|
@@ -722,3 +722,124 @@ struct TcTokenData: Codable, Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - User Info API Management
|
||||
extension UserInfoManager {
|
||||
|
||||
/// 从服务器获取用户信息
|
||||
/// - Parameters:
|
||||
/// - uid: 用户ID,如果为nil则使用当前登录用户的ID
|
||||
/// - apiService: API服务依赖
|
||||
/// - Returns: 用户信息,如果获取失败返回nil
|
||||
static func fetchUserInfoFromServer(
|
||||
uid: String? = nil,
|
||||
apiService: APIServiceProtocol
|
||||
) async -> UserInfo? {
|
||||
// 确定要查询的用户ID
|
||||
let targetUid: String
|
||||
if let uid = uid {
|
||||
targetUid = uid
|
||||
} else {
|
||||
// 使用当前登录用户的ID
|
||||
guard let currentUid = await getCurrentUserId() else {
|
||||
debugErrorSync("❌ 无法获取用户信息:当前用户未登录")
|
||||
return nil
|
||||
}
|
||||
targetUid = currentUid
|
||||
}
|
||||
|
||||
debugInfoSync("👤 开始获取用户信息")
|
||||
debugInfoSync(" 目标UID: \(targetUid)")
|
||||
|
||||
do {
|
||||
let request = UserInfoHelper.createGetUserInfoRequest(uid: targetUid)
|
||||
let response = try await apiService.request(request)
|
||||
|
||||
if response.isSuccess {
|
||||
debugInfoSync("✅ 用户信息获取成功")
|
||||
if let userInfo = response.data {
|
||||
// 保存到本地
|
||||
await saveUserInfo(userInfo)
|
||||
debugInfoSync("💾 用户信息已保存到本地")
|
||||
return userInfo
|
||||
} else {
|
||||
debugErrorSync("❌ 用户信息为空")
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
debugErrorSync("❌ 获取用户信息失败: \(response.errorMessage)")
|
||||
return nil
|
||||
}
|
||||
} catch {
|
||||
debugErrorSync("❌ 获取用户信息异常: \(error.localizedDescription)")
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
/// 刷新当前用户的用户信息
|
||||
/// - Parameter apiService: API服务依赖
|
||||
/// - Returns: 是否刷新成功
|
||||
static func refreshCurrentUserInfo(apiService: APIServiceProtocol) async -> Bool {
|
||||
guard let currentUid = await getCurrentUserId() else {
|
||||
debugErrorSync("❌ 无法刷新用户信息:当前用户未登录")
|
||||
return false
|
||||
}
|
||||
|
||||
debugInfoSync("🔄 开始刷新当前用户信息")
|
||||
debugInfoSync(" 当前UID: \(currentUid)")
|
||||
|
||||
if let userInfo = await fetchUserInfoFromServer(uid: currentUid, apiService: apiService) {
|
||||
debugInfoSync("✅ 用户信息刷新成功")
|
||||
return true
|
||||
} else {
|
||||
debugErrorSync("❌ 用户信息刷新失败")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/// 获取指定用户的用户信息(带缓存)
|
||||
/// - Parameters:
|
||||
/// - uid: 用户ID
|
||||
/// - apiService: API服务依赖
|
||||
/// - forceRefresh: 是否强制刷新,默认false
|
||||
/// - Returns: 用户信息,如果获取失败返回nil
|
||||
static func getUserInfoWithCache(
|
||||
uid: String,
|
||||
apiService: APIServiceProtocol,
|
||||
forceRefresh: Bool = false
|
||||
) async -> UserInfo? {
|
||||
// 如果不强制刷新,先检查本地缓存
|
||||
if !forceRefresh {
|
||||
if let cachedUserInfo = await getUserInfo() {
|
||||
debugInfoSync("📱 使用本地缓存的用户信息")
|
||||
return cachedUserInfo
|
||||
}
|
||||
}
|
||||
|
||||
// 从服务器获取
|
||||
debugInfoSync("🌐 从服务器获取用户信息")
|
||||
return await fetchUserInfoFromServer(uid: uid, apiService: apiService)
|
||||
}
|
||||
|
||||
/// 在APP启动时自动获取用户信息(如果用户已登录)
|
||||
/// - Parameter apiService: API服务依赖
|
||||
/// - Returns: 是否成功获取或已有缓存
|
||||
static func autoFetchUserInfoOnAppLaunch(apiService: APIServiceProtocol) async -> Bool {
|
||||
// 检查用户是否已登录
|
||||
let authStatus = await checkAuthenticationStatus()
|
||||
guard authStatus.canAutoLogin else {
|
||||
debugInfoSync("🔍 APP启动:用户未登录,跳过用户信息获取")
|
||||
return false
|
||||
}
|
||||
|
||||
// 检查是否已有用户信息缓存
|
||||
if let cachedUserInfo = await getUserInfo() {
|
||||
debugInfoSync("📱 APP启动:使用现有用户信息缓存")
|
||||
return true
|
||||
}
|
||||
|
||||
// 自动获取用户信息
|
||||
debugInfoSync("🔄 APP启动:自动获取用户信息")
|
||||
return await refreshCurrentUserInfo(apiService: apiService)
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -413,3 +413,66 @@ extension LoginHelper {
|
||||
return EmailLoginRequest(email: encryptedEmail, code: code)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - User Info API Models
|
||||
|
||||
/// 获取用户信息请求模型
|
||||
struct GetUserInfoRequest: APIRequestProtocol {
|
||||
typealias Response = GetUserInfoResponse
|
||||
|
||||
let endpoint = APIEndpoint.getUserInfo.path
|
||||
let method: HTTPMethod = .GET
|
||||
let includeBaseParameters = true
|
||||
let queryParameters: [String: String]?
|
||||
var bodyParameters: [String: Any]? { nil }
|
||||
let timeout: TimeInterval = 30.0
|
||||
let shouldShowLoading: Bool = false // 不显示loading,避免影响用户体验
|
||||
let shouldShowError: Bool = false // 不显示错误,静默处理
|
||||
|
||||
/// 初始化获取用户信息请求
|
||||
/// - Parameter uid: 要查询的用户ID
|
||||
init(uid: String) {
|
||||
self.queryParameters = [
|
||||
"uid": uid
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
/// 获取用户信息响应模型
|
||||
struct GetUserInfoResponse: Codable, Equatable {
|
||||
let code: Int?
|
||||
let message: String?
|
||||
let timestamp: Int64?
|
||||
let data: UserInfo?
|
||||
|
||||
/// 是否获取成功
|
||||
var isSuccess: Bool {
|
||||
return code == 200
|
||||
}
|
||||
|
||||
/// 错误消息(如果有)
|
||||
var errorMessage: String {
|
||||
return message ?? "获取用户信息失败,请重试"
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - User Info Helper
|
||||
struct UserInfoHelper {
|
||||
|
||||
/// 创建获取用户信息请求
|
||||
/// - Parameter uid: 用户ID
|
||||
/// - Returns: 配置好的API请求
|
||||
static func createGetUserInfoRequest(uid: String) -> GetUserInfoRequest {
|
||||
return GetUserInfoRequest(uid: uid)
|
||||
}
|
||||
|
||||
/// 调试打印获取用户信息请求
|
||||
/// - Parameter uid: 用户ID
|
||||
static func debugGetUserInfoRequest(uid: String) {
|
||||
debugInfoSync("👤 获取用户信息请求调试")
|
||||
debugInfoSync(" UID: \(uid)")
|
||||
debugInfoSync(" Endpoint: /user/get")
|
||||
debugInfoSync(" Method: GET")
|
||||
debugInfoSync(" Parameters: uid=\(uid)")
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user