
主要变更: 1. 在 EPLoginTypesViewController 中添加了渐变背景到 actionButton,提升视觉效果。 2. 实现了输入框状态检查功能,确保在输入有效信息时启用登录按钮。 3. 更新了输入框配置,支持不同类型的键盘输入(如数字键盘和邮箱键盘)。 4. 在 EPLoginService 中添加了对手机号和邮箱的 DES 加密,增强安全性。 5. 更新了 EPLoginConfig,统一输入框和按钮的样式设置。 此更新旨在提升用户体验,确保登录过程的安全性和流畅性。
306 lines
9.9 KiB
Swift
306 lines
9.9 KiB
Swift
//
|
||
// 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 uniformHeight: CGFloat = 56
|
||
/// 输入框/按钮统一左右边距
|
||
static let uniformHorizontalPadding: CGFloat = 29
|
||
/// 输入框/按钮统一圆角
|
||
static let uniformCornerRadius: CGFloat = 28
|
||
/// 标准圆角半径(按钮/输入框)
|
||
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 = 56
|
||
/// 输入框圆角
|
||
static let inputCornerRadius: CGFloat = 28
|
||
/// 输入框左右内边距
|
||
static let inputHorizontalPadding: CGFloat = 24
|
||
/// 输入框 icon 尺寸
|
||
static let inputIconSize: CGFloat = 20
|
||
/// 输入框边框宽度
|
||
static let inputBorderWidth: CGFloat = 1
|
||
|
||
/// 验证码按钮宽度
|
||
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.white.withAlphaComponent(0.1)
|
||
static let inputText = UIColor(red: 0x1F/255.0, green: 0x1B/255.0, blue: 0x4F/255.0, alpha: 1.0)
|
||
static let inputBorder = UIColor.white
|
||
static let inputBorderFocused = UIColor.systemPurple
|
||
|
||
/// 渐变色(Login/Confirm按钮)
|
||
static let gradientStart = UIColor(red: 0xF8/255.0, green: 0x54/255.0, blue: 0xFC/255.0, alpha: 1.0) // #F854FC
|
||
static let gradientEnd = UIColor(red: 0x50/255.0, green: 0x0F/255.0, blue: 0xFF/255.0, alpha: 1.0) // #500FFF
|
||
|
||
/// 验证码按钮颜色
|
||
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 = "erban-client"
|
||
/// Grant Type
|
||
static let grantType = "password"
|
||
/// 版本号
|
||
static let version = "1"
|
||
|
||
/// 验证码类型:登录
|
||
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 iconPasswordSee = "icon_password_see"
|
||
static let iconPasswordUnsee = "icon_password_unsee"
|
||
|
||
/// 图标 - 返回
|
||
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"
|
||
}
|
||
}
|
||
|