Files
e-party-iOS/issues/IDLoginPage登录功能修复.md
edwinQQQ 428aa95c5e feat: 更新Swift助手样式规则和应用结构
- 在swift-assistant-style.mdc中添加项目背景、代码结构、命名规范、Swift最佳实践、UI开发、性能、安全性、测试与质量、核心功能、开发流程、App Store指南等详细规则。
- 在yanaApp.swift中将SplashView替换为Splash,简化应用结构。
2025-08-06 14:12:20 +08:00

5.4 KiB
Raw Blame History

IDLoginPage 登录功能修复

问题描述

IDLoginPage.swift中的performLogin方法存在以下问题:

  1. 类型错误:使用了不存在的IDLoginRequest类型
  2. 缺少DES加密直接传递原始的用户ID和密码没有进行加密
  3. 数据保存错误:错误地将IDLoginData传递给saveUserInfo方法
  4. APIError类型错误:使用了不存在的APIError.serverError成员

问题分析

1. 类型错误

// 错误的代码
let loginRequest = IDLoginRequest(
    uid: userID,
    password: password
)

// 正确的类型应该是
let loginRequest = IDLoginAPIRequest(...)

2. 缺少DES加密

根据LoginHelper.createIDLoginRequest的实现ID登录需要DES加密

// 加密密钥
let encryptionKey = "1ea53d260ecf11e7b56e00163e046a26"

// 需要加密用户ID和密码
guard let encryptedID = DESEncrypt.encryptUseDES(userID, key: encryptionKey),
      let encryptedPassword = DESEncrypt.encryptUseDES(password, key: encryptionKey) else {
    // 加密失败处理
}

3. 数据保存错误

// 错误的代码
await UserInfoManager.saveUserInfo(data)  // data是IDLoginData类型

// 正确的方法
if let userInfo = data.userInfo {
    await UserInfoManager.saveUserInfo(userInfo)  // userInfo是UserInfo类型
}

4. APIError类型错误

// 错误的代码
throw APIError.serverError("错误信息")  // serverError不存在

// 正确的方法
throw APIError.custom("错误信息")  // 使用custom成员

解决方案

1. 使用LoginHelper进行DES加密

// 使用LoginHelper创建登录请求包含DES加密
guard let loginRequest = await LoginHelper.createIDLoginRequest(
    userID: userID,
    password: password
) else {
    throw APIError.custom("DES加密失败")
}

2. 正确保存用户信息

// 保存用户信息如果API返回了用户信息
if let userInfo = data.userInfo {
    await UserInfoManager.saveUserInfo(userInfo)
}

// 创建并保存账户模型
guard let accountModel = AccountModel.from(loginData: data) else {
    throw APIError.custom("账户信息无效")
}
await UserInfoManager.saveAccountModel(accountModel)

// 获取用户详细信息如果API没有返回用户信息
if data.userInfo == nil, let userInfo = await UserInfoManager.fetchUserInfoFromServer(
    uid: String(data.uid ?? 0),
    apiService: apiService
) {
    await UserInfoManager.saveUserInfo(userInfo)
}

3. 使用正确的APIError类型

// 登录失败时
throw APIError.custom(response.message ?? "Login failed")

APIService支持情况

1. 完全支持IDLoginAPIRequest

  • APIService.swift有完整的泛型支持:func request<T: APIRequestProtocol>(_ request: T) async throws -> T.Response
  • IDLoginAPIRequest正确实现了APIRequestProtocol协议
  • 支持DES加密、基础参数、签名生成等所有功能

2. 请求流程

  1. DES加密:使用LoginHelper.createIDLoginRequest进行加密
  2. API请求:通过LiveAPIService.request()发送请求
  3. 响应处理:解析IDLoginResponse并处理结果
  4. 数据保存:保存AccountModelUserInfo

修复内容

1. performLogin方法修复

  • 使用LoginHelper.createIDLoginRequest进行DES加密
  • 正确处理加密失败的情况
  • 使用AccountModel.from(loginData:)创建账户模型
  • 正确保存用户信息区分API返回和服务器获取
  • 添加适当的错误处理
  • 修复APIError类型错误

2. 数据流程优化

  • 优先使用API返回的用户信息
  • 如果API没有返回用户信息则从服务器获取
  • 确保账户模型和用户信息都正确保存

3. 错误处理完善

  • DES加密失败处理
  • 账户信息无效处理
  • API响应错误处理
  • 使用正确的APIError类型

技术要点

1. DES加密

  • 使用固定的加密密钥:1ea53d260ecf11e7b56e00163e046a26
  • 对用户ID和密码都进行加密
  • 加密失败时抛出明确的错误信息

2. 数据模型转换

  • 使用AccountModel.from(loginData:)静态方法
  • 确保数据类型的正确转换Int? → String?
  • 处理可选值的安全解包

3. 用户信息管理

  • 区分API返回的用户信息和服务器获取的用户信息
  • 避免重复获取用户信息
  • 确保用户信息的完整性

4. 错误类型使用

  • 使用APIError.custom(String)传递自定义错误信息
  • 避免使用不存在的错误类型
  • 保持错误信息的一致性和可读性

验证结果

1. 编译检查

  • 所有类型错误已修复
  • 方法调用正确
  • 导入语句完整
  • APIError类型使用正确

2. 功能验证

  • DES加密功能正常
  • API请求流程完整
  • 数据保存逻辑正确
  • 错误处理完善

3. 与TCA版本一致性

  • 使用相同的加密逻辑
  • 使用相同的数据模型
  • 使用相同的错误处理

完成状态

  • 类型错误修复
  • DES加密实现
  • 数据保存逻辑修复
  • 错误处理完善
  • APIError类型修复
  • 与APIService集成验证
  • 文档记录完成

后续建议

  1. 测试验证:建议进行实际的登录测试,验证整个流程
  2. 错误监控:添加更详细的错误日志,便于问题排查
  3. 性能优化:考虑缓存用户信息,减少重复请求
  4. 安全增强:考虑添加请求频率限制和防重放攻击机制