Add login flow, session routing, and MainTab shell aligned with reference UI.
Implement token-based root routing, Android-matched login screen, five-slot MainTabBar with scan action, and placeholder tab pages. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
44
suixinkan/DataStore/AppStore.swift
Normal file
44
suixinkan/DataStore/AppStore.swift
Normal file
@ -0,0 +1,44 @@
|
||||
//
|
||||
// AppStore.swift
|
||||
// suixinkan
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
/// 本地会话存储,与 Android `AppStoreDataSource` 对齐。
|
||||
/// 当前以 Token 是否非空判断登录态。
|
||||
final class AppStore {
|
||||
|
||||
static let shared = AppStore()
|
||||
|
||||
private enum Key {
|
||||
static let token = "key_in_token"
|
||||
}
|
||||
|
||||
private let defaults: UserDefaults
|
||||
|
||||
init(defaults: UserDefaults = .standard) {
|
||||
self.defaults = defaults
|
||||
}
|
||||
|
||||
/// 登录 Token。
|
||||
var token: String {
|
||||
get { defaults.string(forKey: Key.token) ?? "" }
|
||||
set { defaults.set(newValue, forKey: Key.token) }
|
||||
}
|
||||
|
||||
/// Token 非空视为已登录。
|
||||
var isLoggedIn: Bool {
|
||||
!token.isEmpty
|
||||
}
|
||||
|
||||
/// 保存登录 Token。
|
||||
func saveToken(_ token: String) {
|
||||
self.token = token
|
||||
}
|
||||
|
||||
/// 清除登录态。
|
||||
func logout() {
|
||||
token = ""
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user