Files
real-e-party-iOS/YuMi/E-P/NewLogin/Services/EPLoginService.swift
edwinQQQ 02a8335d70 feat: 更新登录模块以支持验证码和渐变背景
主要变更:
1. 在 EPLoginTypesViewController 中添加了渐变背景到 actionButton,提升视觉效果。
2. 实现了输入框状态检查功能,确保在输入有效信息时启用登录按钮。
3. 更新了输入框配置,支持不同类型的键盘输入(如数字键盘和邮箱键盘)。
4. 在 EPLoginService 中添加了对手机号和邮箱的 DES 加密,增强安全性。
5. 更新了 EPLoginConfig,统一输入框和按钮的样式设置。

此更新旨在提升用户体验,确保登录过程的安全性和流畅性。
2025-10-13 17:49:09 +08:00

305 lines
10 KiB
Swift
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.

//
// EPLoginService.swift
// YuMi
//
// Created by AI on 2025-01-27.
//
import Foundation
/// Swift
/// API OC LoginPresenter
@objc class EPLoginService: NSObject {
// MARK: - Constants
private let clientSecret = EPLoginConfig.API.clientSecret
private let clientId = EPLoginConfig.API.clientId
private let grantType = EPLoginConfig.API.grantType
private let version = EPLoginConfig.API.version
// MARK: - Private Helper Methods
/// AccountModel
/// - Parameters:
/// - data: API
/// - code:
/// - completion:
/// - failure:
private func parseAndSaveAccount(data: BaseModel?,
code: Int64,
completion: @escaping (AccountModel) -> Void,
failure: @escaping (Int, String) -> Void) {
if code == 200 {
if let accountDict = data?.data as? NSDictionary,
let accountModel = AccountModel.mj_object(withKeyValues: accountDict) {
//
AccountInfoStorage.instance().saveAccountInfo(accountModel)
completion(accountModel)
} else {
failure(Int(code), "账号信息解析失败")
}
} else {
failure(Int(code), "操作失败")
}
}
// MARK: - Request Ticket
/// Ticket
/// - Parameters:
/// - accessToken: 访
/// - completion: (ticket)
/// - failure: (, )
@objc func requestTicket(accessToken: String,
completion: @escaping (String) -> Void,
failure: @escaping (Int, String) -> Void) {
Api.requestTicket({ (data, code, msg) in
if code == 200, let dict = data?.data as? NSDictionary {
if let tickets = dict["tickets"] as? NSArray,
let firstTicket = tickets.firstObject as? NSDictionary,
let ticket = firstTicket["ticket"] as? String {
completion(ticket)
} else {
failure(Int(code), "Ticket 解析失败")
}
} else {
failure(Int(code), msg ?? "请求 Ticket 失败")
}
}, access_token: accessToken, issue_type: "multi")
}
// MARK: - Send Verification Code
///
/// - Parameters:
/// - email:
/// - type: (1=, 2=)
/// - completion:
/// - failure:
@objc func sendEmailCode(email: String,
type: Int,
completion: @escaping () -> Void,
failure: @escaping (Int, String) -> Void) {
// 🔐 DES
let encryptedEmail = encryptDES(email)
Api.emailGetCode({ (data, code, msg) in
if code == 200 {
completion()
} else {
failure(Int(code), msg ?? "发送邮箱验证码失败")
}
}, emailAddress: encryptedEmail, type: NSNumber(value: type))
}
///
/// - Parameters:
/// - phone:
/// - areaCode:
/// - type: (1=, 2=)
/// - completion:
/// - failure:
@objc func sendPhoneCode(phone: String,
areaCode: String,
type: Int,
completion: @escaping () -> Void,
failure: @escaping (Int, String) -> Void) {
// 🔐 DES
let encryptedPhone = encryptDES(phone)
Api.phoneSmsCode({ (data, code, msg) in
if code == 200 {
completion()
} else {
failure(Int(code), msg ?? "发送手机验证码失败")
}
}, mobile: encryptedPhone, type: String(type), phoneAreaCode: areaCode)
}
// MARK: - Login Methods
/// ID +
/// - Parameters:
/// - id: ID
/// - password:
/// - completion: (AccountModel)
/// - failure:
@objc func loginWithID(id: String,
password: String,
completion: @escaping (AccountModel) -> Void,
failure: @escaping (Int, String) -> Void) {
// 🔐 DES ID
let encryptedId = encryptDES(id)
let encryptedPassword = encryptDES(password)
Api.login(password: { [weak self] (data, code, msg) in
self?.parseAndSaveAccount(
data: data,
code: Int64(code),
completion: completion,
failure: { errorCode, _ in
failure(errorCode, msg ?? "登录失败")
})
},
phone: encryptedId,
password: encryptedPassword,
client_secret: clientSecret,
version: version,
client_id: clientId,
grant_type: grantType)
}
/// +
/// - Parameters:
/// - email:
/// - code:
/// - completion: (AccountModel)
/// - failure:
@objc func loginWithEmail(email: String,
code: String,
completion: @escaping (AccountModel) -> Void,
failure: @escaping (Int, String) -> Void) {
// 🔐 DES
let encryptedEmail = encryptDES(email)
Api.login(code: { [weak self] (data, code, msg) in
self?.parseAndSaveAccount(
data: data,
code: Int64(code),
completion: completion,
failure: { errorCode, _ in
failure(errorCode, msg ?? "登录失败")
})
},
email: encryptedEmail,
code: code,
client_secret: clientSecret,
version: version,
client_id: clientId,
grant_type: grantType)
}
/// +
/// - Parameters:
/// - phone:
/// - code:
/// - areaCode:
/// - completion: (AccountModel)
/// - failure:
@objc func loginWithPhone(phone: String,
code: String,
areaCode: String,
completion: @escaping (AccountModel) -> Void,
failure: @escaping (Int, String) -> Void) {
// 🔐 DES
let encryptedPhone = encryptDES(phone)
Api.login(code: { [weak self] (data, code, msg) in
self?.parseAndSaveAccount(
data: data,
code: Int64(code),
completion: completion,
failure: { errorCode, _ in
failure(errorCode, msg ?? "登录失败")
})
},
phone: encryptedPhone,
code: code,
client_secret: clientSecret,
version: version,
client_id: clientId,
grant_type: grantType,
phoneAreaCode: areaCode)
}
// MARK: - Reset Password
///
/// - Parameters:
/// - email:
/// - code:
/// - newPassword:
/// - completion:
/// - failure:
@objc func resetEmailPassword(email: String,
code: String,
newPassword: String,
completion: @escaping () -> Void,
failure: @escaping (Int, String) -> Void) {
// 🔐 DES
let encryptedEmail = encryptDES(email)
let encryptedPassword = encryptDES(newPassword)
Api.resetPassword(email: { (data, code, msg) in
if code == 200 {
completion()
} else {
failure(Int(code), msg ?? "重置密码失败")
}
}, email: encryptedEmail, newPwd: encryptedPassword, code: code)
}
///
/// - Parameters:
/// - phone:
/// - code:
/// - areaCode:
/// - newPassword:
/// - completion:
/// - failure:
@objc func resetPhonePassword(phone: String,
code: String,
areaCode: String,
newPassword: String,
completion: @escaping () -> Void,
failure: @escaping (Int, String) -> Void) {
// 🔐 DES
let encryptedPhone = encryptDES(phone)
let encryptedPassword = encryptDES(newPassword)
Api.resetPassword(phone: { (data, code, msg) in
if code == 200 {
completion()
} else {
failure(Int(code), msg ?? "重置密码失败")
}
}, phone: encryptedPhone, newPwd: encryptedPassword, smsCode: code, phoneAreaCode: areaCode)
}
// MARK: - Phone Quick Login ()
/// UI
/// - Parameters:
/// - accessToken: 访
/// - token:
/// - completion: (AccountModel)
/// - failure:
@objc func phoneQuickLogin(accessToken: String,
token: String,
completion: @escaping (AccountModel) -> Void,
failure: @escaping (Int, String) -> Void) {
Api.phoneQuickLogin({ [weak self] (data, code, msg) in
self?.parseAndSaveAccount(
data: data,
code: Int64(code),
completion: completion,
failure: { errorCode, _ in
failure(errorCode, msg ?? "快速登录失败")
})
},
accessToken: accessToken,
token: token)
}
}