feat: 添加新的登录模块及相关组件
主要变更: 1. 新增 EPLoginViewController 和 EPLoginTypesViewController,提供新的登录界面和功能。 2. 引入 EPLoginInputView 和 EPLoginButton 组件,支持输入框和按钮的自定义。 3. 实现 EPLoginService 和 EPLoginManager,封装登录逻辑和 API 请求。 4. 添加 EPLoginConfig 和 EPLoginState,统一配置和状态管理。 5. 更新 Bridging Header,确保 Swift 和 Objective-C 代码的互操作性。 此更新旨在提升用户登录体验,简化登录流程,并提供更好的代码结构和可维护性。
This commit is contained in:
288
YuMi/E-P/NewLogin/Models/EPLoginConfig.swift
Normal file
288
YuMi/E-P/NewLogin/Models/EPLoginConfig.swift
Normal file
@@ -0,0 +1,288 @@
|
||||
//
|
||||
// EPLoginConfig.swift
|
||||
// YuMi
|
||||
//
|
||||
// Created by AI on 2025-01-27.
|
||||
// 统一配置文件 - 消除硬编码
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
/// 登录模块统一配置
|
||||
struct EPLoginConfig {
|
||||
|
||||
// MARK: - Layout 布局尺寸
|
||||
|
||||
struct Layout {
|
||||
/// 标准按钮宽度
|
||||
static let buttonWidth: CGFloat = 294
|
||||
/// 标准按钮高度
|
||||
static let buttonHeight: CGFloat = 46
|
||||
/// 登录按钮高度
|
||||
static let loginButtonHeight: CGFloat = 56
|
||||
/// 登录按钮间距
|
||||
static let loginButtonSpacing: CGFloat = 24
|
||||
/// 登录按钮左右边距
|
||||
static let loginButtonHorizontalPadding: CGFloat = 30
|
||||
/// 标准圆角半径(按钮/输入框)
|
||||
static let cornerRadius: CGFloat = 23
|
||||
|
||||
/// Logo 尺寸
|
||||
static let logoHeight: CGFloat = 400
|
||||
/// Logo 距离顶部的距离
|
||||
static let logoTopOffset: CGFloat = 80
|
||||
|
||||
/// E-PARTI 标题字号
|
||||
static let epartiTitleFontSize: CGFloat = 56
|
||||
/// E-PARTI 标题距离 view leading
|
||||
static let epartiTitleLeading: CGFloat = 40
|
||||
/// E-PARTI 标题距离 logoImage bottom 的偏移(负值表示向上)
|
||||
static let epartiTitleBottomOffset: CGFloat = -30
|
||||
|
||||
/// 输入框之间的垂直间距
|
||||
static let inputVerticalSpacing: CGFloat = 16
|
||||
/// 输入框距离标题的距离
|
||||
static let inputTitleSpacing: CGFloat = 60
|
||||
|
||||
/// 按钮距离输入框的距离
|
||||
static let buttonTopSpacing: CGFloat = 40
|
||||
|
||||
/// 页面左右边距
|
||||
static let horizontalPadding: CGFloat = 40
|
||||
/// 紧凑左右边距
|
||||
static let compactHorizontalPadding: CGFloat = 16
|
||||
|
||||
/// 标题字体大小
|
||||
static let titleFontSize: CGFloat = 28
|
||||
/// 按钮字体大小
|
||||
static let buttonFontSize: CGFloat = 16
|
||||
/// 输入框字体大小
|
||||
static let inputFontSize: CGFloat = 14
|
||||
/// 小字体大小(提示文字等)
|
||||
static let smallFontSize: CGFloat = 12
|
||||
|
||||
/// 图标尺寸
|
||||
static let iconSize: CGFloat = 24
|
||||
/// 登录按钮图标尺寸
|
||||
static let loginButtonIconSize: CGFloat = 30
|
||||
/// 登录按钮图标左边距(距离白色背景)
|
||||
static let loginButtonIconLeading: CGFloat = 33
|
||||
/// 图标左边距
|
||||
static let iconLeading: CGFloat = 15
|
||||
/// 图标与文字间距
|
||||
static let iconTextSpacing: CGFloat = 12
|
||||
|
||||
/// Checkbox 尺寸
|
||||
static let checkboxSize: CGFloat = 18
|
||||
|
||||
/// 返回按钮尺寸
|
||||
static let backButtonSize: CGFloat = 44
|
||||
|
||||
/// Feedback 按钮高度
|
||||
static let feedbackButtonHeight: CGFloat = 22
|
||||
static let feedbackButtonCornerRadius: CGFloat = 10.5
|
||||
|
||||
/// 输入框高度
|
||||
static let inputHeight: CGFloat = 52
|
||||
/// 输入框圆角
|
||||
static let inputCornerRadius: CGFloat = 26
|
||||
/// 输入框左右内边距
|
||||
static let inputHorizontalPadding: CGFloat = 24
|
||||
/// 输入框 icon 尺寸
|
||||
static let inputIconSize: CGFloat = 20
|
||||
|
||||
/// 验证码按钮宽度
|
||||
static let codeButtonWidth: CGFloat = 102
|
||||
/// 验证码按钮高度
|
||||
static let codeButtonHeight: CGFloat = 38
|
||||
}
|
||||
|
||||
// MARK: - Colors 颜色主题
|
||||
|
||||
struct Colors {
|
||||
/// 主题色(按钮背景)
|
||||
static let primary = UIColor.systemPurple
|
||||
|
||||
/// 背景色
|
||||
static let background = UIColor.white
|
||||
static let backgroundTransparent = UIColor.white.withAlphaComponent(0.5)
|
||||
|
||||
/// 文字颜色
|
||||
static let text = UIColor.darkText
|
||||
static let textSecondary = UIColor.darkGray
|
||||
static let textLight = UIColor.white
|
||||
|
||||
/// 图标颜色
|
||||
static let icon = UIColor.darkGray
|
||||
static let iconDisabled = UIColor.gray
|
||||
|
||||
/// 输入框颜色
|
||||
static let inputBackground = UIColor(red: 0xF3/255.0, green: 0xF5/255.0, blue: 0xFA/255.0, alpha: 1.0)
|
||||
static let inputText = UIColor(red: 0x1F/255.0, green: 0x1B/255.0, blue: 0x4F/255.0, alpha: 1.0)
|
||||
static let inputBorder = UIColor.lightGray.withAlphaComponent(0.3)
|
||||
static let inputBorderFocused = UIColor.systemPurple
|
||||
|
||||
/// 验证码按钮颜色
|
||||
static let codeButtonBackground = UIColor(red: 0x91/255.0, green: 0x68/255.0, blue: 0xFA/255.0, alpha: 1.0)
|
||||
|
||||
/// 按钮状态颜色
|
||||
static let buttonEnabled = UIColor.systemPurple
|
||||
static let buttonDisabled = UIColor.lightGray
|
||||
|
||||
/// 错误提示色
|
||||
static let error = UIColor.systemRed
|
||||
static let success = UIColor.systemGreen
|
||||
|
||||
/// 链接颜色
|
||||
static let link = UIColor.black
|
||||
static let linkUnderline = UIColor.black
|
||||
}
|
||||
|
||||
// MARK: - Animation 动画配置
|
||||
|
||||
struct Animation {
|
||||
/// 标准动画时长
|
||||
static let duration: TimeInterval = 0.3
|
||||
/// 短动画时长
|
||||
static let shortDuration: TimeInterval = 0.15
|
||||
/// 长动画时长
|
||||
static let longDuration: TimeInterval = 0.5
|
||||
|
||||
/// 弹簧动画阻尼
|
||||
static let springDamping: CGFloat = 0.75
|
||||
/// 弹簧动画初速度
|
||||
static let springVelocity: CGFloat = 0.5
|
||||
|
||||
/// 按钮点击缩放比例
|
||||
static let buttonPressScale: CGFloat = 0.95
|
||||
|
||||
/// 错误抖动距离
|
||||
static let shakeOffset: CGFloat = 10
|
||||
/// 错误抖动次数
|
||||
static let shakeCount: Int = 3
|
||||
}
|
||||
|
||||
// MARK: - Validation 验证规则
|
||||
|
||||
struct Validation {
|
||||
/// 密码最小长度
|
||||
static let passwordMinLength = 6
|
||||
/// 密码最大长度
|
||||
static let passwordMaxLength = 16
|
||||
|
||||
/// 验证码长度
|
||||
static let codeLength = 6
|
||||
|
||||
/// 手机号最小长度
|
||||
static let phoneMinLength = 10
|
||||
/// 手机号最大长度
|
||||
static let phoneMaxLength = 15
|
||||
|
||||
/// 邮箱正则表达式
|
||||
static let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
|
||||
/// 手机号正则表达式
|
||||
static let phoneRegex = "^[0-9]{10,15}$"
|
||||
}
|
||||
|
||||
// MARK: - Timing 时间配置
|
||||
|
||||
struct Timing {
|
||||
/// 验证码倒计时秒数
|
||||
static let codeCountdownSeconds = 60
|
||||
|
||||
/// Toast 显示时长
|
||||
static let toastDuration: TimeInterval = 2.0
|
||||
|
||||
/// 加载超时时间
|
||||
static let requestTimeout: TimeInterval = 30.0
|
||||
}
|
||||
|
||||
// MARK: - API 接口配置
|
||||
|
||||
struct API {
|
||||
/// Client Secret
|
||||
static let clientSecret = "uyzjdhds"
|
||||
/// Client ID
|
||||
static let clientId = "1"
|
||||
/// Grant Type
|
||||
static let grantType = "sms_code"
|
||||
/// 版本号
|
||||
static let version = "1.0.31"
|
||||
|
||||
/// 验证码类型:登录
|
||||
static let codeTypeLogin = 1
|
||||
/// 验证码类型:找回密码
|
||||
static let codeTypeReset = 2
|
||||
}
|
||||
|
||||
// MARK: - UserDefaults Keys
|
||||
|
||||
struct Keys {
|
||||
/// 隐私协议已同意
|
||||
static let policyAgreed = "HadAgreePrivacy"
|
||||
/// 首次启动标识
|
||||
static let hasLaunchedBefore = "HasLaunchedBefore"
|
||||
}
|
||||
|
||||
// MARK: - Images 图片资源名称
|
||||
|
||||
struct Images {
|
||||
/// 背景图
|
||||
static let background = "vc_bg"
|
||||
/// Logo 背景图
|
||||
static let loginBg = "login_bg"
|
||||
|
||||
/// 登录按钮图标 - ID
|
||||
static let iconLoginId = "icon_login_id"
|
||||
/// 登录按钮图标 - Email
|
||||
static let iconLoginEmail = "icon_login_email"
|
||||
|
||||
/// 图标 - 用户
|
||||
static let iconPerson = "person.circle"
|
||||
static let iconPersonFill = "person"
|
||||
/// 图标 - 邮箱
|
||||
static let iconEmail = "envelope.circle"
|
||||
static let iconEmailFill = "envelope"
|
||||
/// 图标 - 手机
|
||||
static let iconPhone = "phone.circle"
|
||||
static let iconPhoneFill = "phone"
|
||||
/// 图标 - Apple
|
||||
static let iconApple = "apple.logo"
|
||||
/// 图标 - 锁
|
||||
static let iconLock = "lock"
|
||||
/// 图标 - 数字
|
||||
static let iconNumber = "number"
|
||||
|
||||
/// 图标 - 返回
|
||||
static let iconBack = "chevron.left"
|
||||
/// 图标 - 眼睛(隐藏)
|
||||
static let iconEyeSlash = "eye.slash"
|
||||
/// 图标 - 眼睛(显示)
|
||||
static let iconEye = "eye"
|
||||
|
||||
/// Checkbox - 未选中
|
||||
static let checkboxEmpty = "circle"
|
||||
/// Checkbox - 已选中
|
||||
static let checkboxFilled = "checkmark.circle"
|
||||
}
|
||||
|
||||
// MARK: - Localized Strings Keys
|
||||
|
||||
struct LocalizedKeys {
|
||||
/// ID 登录
|
||||
static let idLogin = "1.0.37_text_26"
|
||||
/// 邮箱登录
|
||||
static let emailLogin = "20.20.51_text_1"
|
||||
|
||||
/// 隐私协议完整文本
|
||||
static let policyFullText = "XPLoginViewController6"
|
||||
/// 用户协议
|
||||
static let userAgreement = "XPLoginViewController7"
|
||||
/// 隐私政策
|
||||
static let privacyPolicy = "XPLoginViewController9"
|
||||
|
||||
/// 反馈
|
||||
static let feedback = "XPMineFeedbackViewController0"
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user