From 225d73e83aa85fcea38650de6dfebf033d3df626 Mon Sep 17 00:00:00 2001 From: jinyaqiu Date: Wed, 20 Aug 2025 11:47:56 +0800 Subject: [PATCH] feat: token --- .../UserInterfaceState.xcuserstate | Bin 126571 -> 135850 bytes wake/Models/AuthState.swift | 49 ++ wake/Utils/APIConfig.swift | 16 +- wake/Utils/NetWork.swift | 34 -- wake/Utils/NetworkService.swift | 207 +++++++++ wake/Utils/TokenManager.swift | 424 ++++++++++++++++++ wake/Utils/User.swift | 80 ++-- wake/View/Owner/UserInfo/UserInfo.swift | 65 ++- wake/View/Welcome/SplashView.swift | 92 ++++ wake/WakeApp.swift | 97 ++-- 10 files changed, 938 insertions(+), 126 deletions(-) create mode 100644 wake/Models/AuthState.swift delete mode 100644 wake/Utils/NetWork.swift create mode 100644 wake/Utils/NetworkService.swift create mode 100644 wake/Utils/TokenManager.swift create mode 100644 wake/View/Welcome/SplashView.swift diff --git a/wake.xcodeproj/project.xcworkspace/xcuserdata/elliwood.xcuserdatad/UserInterfaceState.xcuserstate b/wake.xcodeproj/project.xcworkspace/xcuserdata/elliwood.xcuserdatad/UserInterfaceState.xcuserstate index ce3ab0a0f915cf11accc7aeb4c7122df9dd91f0a..ee572fb9537db34c3a457c2f865431554809d3d6 100644 GIT binary patch literal 135850 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 Q`TzUh|Nno6v>p6^0PQpk-T(jq diff --git a/wake/Models/AuthState.swift b/wake/Models/AuthState.swift new file mode 100644 index 0000000..c57917d --- /dev/null +++ b/wake/Models/AuthState.swift @@ -0,0 +1,49 @@ +import SwiftUI +import Combine + +/// 管理用户认证状态的类 +public class AuthState: ObservableObject { + @Published public var isAuthenticated: Bool = false { + didSet { + print("🔔 认证状态变更: \(isAuthenticated ? "已登录" : "已登出")") + } + } + @Published public var isLoading = false + @Published public var errorMessage: String? + @Published public var user: User? + + // 单例模式 + public static let shared = AuthState() + + private init() {} + + /// 登录成功时调用 + public func login(user: User? = nil) { + if let user = user { + self.user = user + } + isAuthenticated = true + errorMessage = nil + } + + /// 登出时调用 + public func logout() { + print("👋 用户登出") + user = nil + isAuthenticated = false + + // 清除用户数据 + TokenManager.shared.clearTokens() + UserDefaults.standard.removeObject(forKey: "lastLoginUser") + } + + /// 更新加载状态 + public func setLoading(_ loading: Bool) { + isLoading = loading + } + + /// 设置错误信息 + public func setError(_ message: String) { + errorMessage = message + } +} diff --git a/wake/Utils/APIConfig.swift b/wake/Utils/APIConfig.swift index a65ae2a..1210e68 100644 --- a/wake/Utils/APIConfig.swift +++ b/wake/Utils/APIConfig.swift @@ -5,12 +5,10 @@ public enum APIConfig { /// API 基础 URL public static let baseURL = "https://api-dev.memorywake.com:31274/api/v1" - /// 认证 token - 从 Keychain 中获取 + /// 获取认证token public static var authToken: String { let token = KeychainHelper.getAccessToken() ?? "" - if !token.isEmpty { - print("🔑 [APIConfig] 当前访问令牌: \(token.prefix(10))...") // 只打印前10个字符,避免敏感信息完全暴露 - } else { + if token.isEmpty { print("⚠️ [APIConfig] 未找到访问令牌") } return token @@ -18,10 +16,16 @@ public enum APIConfig { /// 认证请求头 public static var authHeaders: [String: String] { - return [ - "Authorization": "Bearer \(authToken)", + let token = authToken + var headers = [ "Content-Type": "application/json", "Accept": "application/json" ] + + if !token.isEmpty { + headers["Authorization"] = "Bearer \(token)" + } + + return headers } } \ No newline at end of file diff --git a/wake/Utils/NetWork.swift b/wake/Utils/NetWork.swift deleted file mode 100644 index 0cdffc9..0000000 --- a/wake/Utils/NetWork.swift +++ /dev/null @@ -1,34 +0,0 @@ -import SwiftUI - -class Network: ObservableObject { - @Published var users: [User] = [] - - func getUsers() { - guard let url = URL(string: "http://192.168.31.156:31646/api/iam/login/password-login") else { fatalError("Missing URL") } - - let urlRequest = URLRequest(url: url) - - let dataTask = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in - if let error = error { - print("Request error: ", error) - return - } - - guard let response = response as? HTTPURLResponse else { return } - - if response.statusCode == 200 { - guard let data = data else { return } - DispatchQueue.main.async { - do { - let decodedUsers = try JSONDecoder().decode([User].self, from: data) - self.users = decodedUsers - } catch let error { - print("Error decoding: ", error) - } - } - } - } - - dataTask.resume() - } -} diff --git a/wake/Utils/NetworkService.swift b/wake/Utils/NetworkService.swift new file mode 100644 index 0000000..ffe53b0 --- /dev/null +++ b/wake/Utils/NetworkService.swift @@ -0,0 +1,207 @@ +import Foundation + +enum NetworkError: Error { + case invalidURL + case noData + case decodingError(Error) + case serverError(String) + case unauthorized + case other(Error) + case networkError(Error) + case unknownError(Error) + + var localizedDescription: String { + switch self { + case .invalidURL: + return "无效的URL" + case .noData: + return "没有收到数据" + case .decodingError(let error): + return "数据解析错误: \(error.localizedDescription)" + case .serverError(let message): + return "服务器错误: \(message)" + case .unauthorized: + return "未授权,请重新登录" + case .other(let error): + return error.localizedDescription + case .networkError(let error): + return "网络请求错误: \(error.localizedDescription)" + case .unknownError(let error): + return "未知错误: \(error.localizedDescription)" + } + } +} + +class NetworkService { + static let shared = NetworkService() + + // 默认请求头 + private let defaultHeaders: [String: String] = [ + "Content-Type": "application/json", + "Accept": "application/json" + ] + + private init() {} + + // MARK: - 基础请求方法 + private func request( + _ method: String, + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + // 构建URL + guard let url = URL(string: APIConfig.baseURL + path) else { + completion(.failure(.invalidURL)) + return + } + + // 创建请求 + var request = URLRequest(url: url) + request.httpMethod = method + + // 设置请求头 - 合并默认头、认证头和自定义头 + defaultHeaders.forEach { key, value in + request.setValue(value, forHTTPHeaderField: key) + } + + // 添加认证头 + APIConfig.authHeaders.forEach { key, value in + request.setValue(value, forHTTPHeaderField: key) + } + + // 添加自定义头(如果提供) + headers?.forEach { key, value in + request.setValue(value, forHTTPHeaderField: key) + } + + // 设置请求体(如果是POST/PUT请求) + if let parameters = parameters, (method == "POST" || method == "PUT") { + do { + request.httpBody = try JSONSerialization.data(withJSONObject: parameters) + } catch { + completion(.failure(.other(error))) + return + } + } + + // 打印请求信息(调试用) + print("🌐 [Network] \(method) \(url.absoluteString)") + if let headers = request.allHTTPHeaderFields { + print("📤 Headers: \(headers)") + } + if let body = request.httpBody, let bodyString = String(data: body, encoding: .utf8) { + print("📦 Body: \(bodyString)") + } + + // 创建任务 + let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in + // 处理响应 + self?.handleResponse(data: data, response: response, error: error, completion: completion) + } + + // 开始请求 + task.resume() + } + + private func handleResponse( + data: Data?, + response: URLResponse?, + error: Error?, + completion: @escaping (Result) -> Void + ) { + // 打印响应信息(调试用) + if let httpResponse = response as? HTTPURLResponse { + print("📥 [Network] Status: \(httpResponse.statusCode) \(HTTPURLResponse.localizedString(forStatusCode: httpResponse.statusCode))") + if let headers = httpResponse.allHeaderFields as? [String: Any] { + print("📥 Headers: \(headers)") + } + + // 检查状态码 + if !(200...299).contains(httpResponse.statusCode) { + print("❌ [Network] 请求失败,状态码: \(httpResponse.statusCode)") + if let data = data, let errorResponse = String(data: data, encoding: .utf8) { + print("❌ [Network] 错误响应: \(errorResponse)") + } + } + } + + // 处理网络错误 + if let error = error { + print("❌ [Network] 网络请求错误: \(error.localizedDescription)") + completion(.failure(.networkError(error))) + return + } + + // 检查数据是否存在 + guard let data = data else { + print("❌ [Network] 没有收到数据") + completion(.failure(.noData)) + return + } + + // 打印响应数据(调试用) + if let responseString = String(data: data, encoding: .utf8) { + print("📥 [Network] 响应数据: \(responseString)") + } + + do { + // 解析JSON数据 + let decoder = JSONDecoder() + let result = try decoder.decode(T.self, from: data) + completion(.success(result)) + } catch let decodingError as DecodingError { + print("❌ [Network] JSON解析失败: \(decodingError.localizedDescription)") + if let dataString = String(data: data, encoding: .utf8) { + print("📋 [Network] 原始响应: \(dataString)") + } + completion(.failure(.decodingError(decodingError))) + } catch { + print("❌ [Network] 未知错误: \(error.localizedDescription)") + completion(.failure(.unknownError(error))) + } + } + + // MARK: - 公共方法 + + /// GET 请求 + func get( + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + request("GET", path: path, parameters: parameters, headers: headers, completion: completion) + } + + /// POST 请求 + func post( + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + request("POST", path: path, parameters: parameters, headers: headers, completion: completion) + } + + /// DELETE 请求 + func delete( + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + request("DELETE", path: path, parameters: parameters, headers: headers, completion: completion) + } + + /// PUT 请求 + func put( + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + request("PUT", path: path, parameters: parameters, headers: headers, completion: completion) + } +} diff --git a/wake/Utils/TokenManager.swift b/wake/Utils/TokenManager.swift new file mode 100644 index 0000000..3b11939 --- /dev/null +++ b/wake/Utils/TokenManager.swift @@ -0,0 +1,424 @@ +import Foundation + +/// Token管理器 +/// 负责管理应用的认证令牌,包括验证、刷新和过期处理 +class TokenManager { + /// 单例实例 + static let shared = TokenManager() + + /// token有效期阈值(秒),在token即将过期前进行刷新 + /// 例如:设置为300表示在token过期前5分钟开始刷新 + private let tokenValidityThreshold: TimeInterval = 300 + + /// 私有化初始化方法,确保单例模式 + private init() {} + + // MARK: - Token 状态检查 + + /// 检查是否存在有效的访问令牌 + var hasToken: Bool { + return KeychainHelper.getAccessToken()?.isEmpty == false + } + + // MARK: - Token 验证 + + /// 验证并刷新token(如果需要) + /// - 检查token是否存在 + /// - 检查token是否有效 + /// - 在token即将过期时自动刷新 + /// - Parameter completion: 完成回调,返回验证/刷新结果 + /// - isValid: token是否有效 + /// - error: 错误信息(如果有) + func validateAndRefreshTokenIfNeeded(completion: @escaping (Bool, Error?) -> Void) { + // 1. 检查token是否存在 + guard let token = KeychainHelper.getAccessToken(), !token.isEmpty else { + // token不存在,返回未授权错误 + let error = NSError( + domain: "TokenManager", + code: 401, + userInfo: [NSLocalizedDescriptionKey: "未找到访问令牌"] + ) + completion(false, error) + return + } + + // 2. 检查token是否有效 + if isTokenValid(token) { + // token有效,直接返回成功 + completion(true, nil) + return + } + + // 3. token无效或即将过期,尝试刷新 + refreshToken { [weak self] success, error in + if success { + // 刷新成功,返回成功 + completion(true, nil) + } else { + // 刷新失败,返回错误信息 + let finalError = error ?? NSError( + domain: "TokenManager", + code: 401, + userInfo: [NSLocalizedDescriptionKey: "Token刷新失败"] + ) + completion(false, finalError) + } + } + } + + /// 检查token是否有效 + /// - Parameter token: 要检查的token字符串 + /// - Returns: 如果token有效返回true,否则返回false + /// + /// 该方法会检查token的有效性,包括检查token是否为空、是否过期以及通过网络请求验证token。 + /// + /// - Note: 该方法会打印一些调试信息,包括token验证开始、token过期时间等。 + public func isTokenValid(_ token: String) -> Bool { + print("🔍 TokenManager: 开始验证token...") + + // 1. 基础验证:检查token是否为空 + guard !token.isEmpty else { + print("❌ TokenManager: Token为空") + return false + } + + // 2. 检查token是否过期(如果可能) + if let expiryDate = getTokenExpiryDate(token) { + print("⏰ TokenManager: Token过期时间: \(expiryDate)") + if Date() > expiryDate { + print("❌ TokenManager: Token已过期") + return false + } + } + + // 3. 创建信号量用于同步网络请求 + let semaphore = DispatchSemaphore(value: 0) + var isValid = false + var requestCompleted = false + + print("🌐 TokenManager: 发送验证请求到服务器...") + + // 4. 发送验证请求 + let task = URLSession.shared.dataTask(with: createValidationRequest(token: token)) { data, response, error in + defer { + requestCompleted = true + semaphore.signal() + } + + // 检查网络错误 + if let error = error { + print("❌ TokenManager: 验证请求错误: \(error.localizedDescription)") + return + } + + // 检查响应状态码 + guard let httpResponse = response as? HTTPURLResponse else { + print("❌ TokenManager: 无效的服务器响应") + return + } + + print("📡 TokenManager: 服务器响应状态码: \(httpResponse.statusCode)") + + // 检查状态码 + guard (200...299).contains(httpResponse.statusCode) else { + print("❌ TokenManager: 服务器返回错误状态码: \(httpResponse.statusCode)") + return + } + + // 检查是否有数据 + if let data = data, !data.isEmpty { + do { + // 尝试解析响应数据 + let response = try JSONDecoder().decode(IdentityCheckResponse.self, from: data) + isValid = response.isValid + print("✅ TokenManager: Token验证\(isValid ? "成功" : "失败")") + } catch { + print("❌ TokenManager: 解析响应数据失败: \(error.localizedDescription)") + // 如果解析失败但状态码是200,我们假设token是有效的 + isValid = true + print("ℹ️ TokenManager: 状态码200,假设token有效") + } + } else { + // 如果没有返回数据但状态码是200,我们假设token是有效的 + print("ℹ️ TokenManager: 没有返回数据,但状态码为200,假设token有效") + isValid = true + } + } + + task.resume() + + // 5. 设置超时时间(10秒) + let timeoutResult = semaphore.wait(timeout: .now() + 15) + + // 检查是否超时 + if !requestCompleted && timeoutResult == .timedOut { + print("⚠️ TokenManager: 验证请求超时") + task.cancel() + return false + } + + return isValid + } + + /// 创建验证请求 + private func createValidationRequest(token: String) -> URLRequest { + let url = URL(string: APIConfig.baseURL + "/iam/identity-check")! + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") + request.setValue("application/json", forHTTPHeaderField: "Accept") + return request + } + + /// 从token中提取过期时间(示例实现) + private func getTokenExpiryDate(_ token: String) -> Date? { + // 这里需要根据实际的JWT或其他token格式来解析过期时间 + // 以下是JWT token的示例解析 + let parts = token.components(separatedBy: ".") + guard parts.count > 1, let payloadData = base64UrlDecode(parts[1]) else { + return nil + } + + do { + if let payload = try JSONSerialization.jsonObject(with: payloadData) as? [String: Any], + let exp = payload["exp"] as? TimeInterval { + return Date(timeIntervalSince1970: exp) + } + } catch { + print("❌ TokenManager: 解析token过期时间失败: \(error.localizedDescription)") + } + + return nil + } + + private func base64UrlDecode(_ base64Url: String) -> Data? { + var base64 = base64Url + .replacingOccurrences(of: "-", with: "+") + .replacingOccurrences(of: "_", with: "/") + + // 添加必要的填充 + let length = Double(base64.lengthOfBytes(using: .utf8)) + let requiredLength = 4 * ceil(length / 4.0) + let paddingLength = requiredLength - length + if paddingLength > 0 { + let padding = "".padding(toLength: Int(paddingLength), withPad: "=", startingAt: 0) + base64 += padding + } + + return Data(base64Encoded: base64) + } + + /// 刷新token + /// - Parameter completion: 刷新完成回调 + /// - success: 是否刷新成功 + /// - error: 错误信息(如果有) + private func refreshToken(completion: @escaping (Bool, Error?) -> Void) { + // 获取刷新令牌 + guard let refreshToken = KeychainHelper.getRefreshToken(), !refreshToken.isEmpty else { + // 没有可用的刷新令牌 + let error = NSError( + domain: "TokenManager", + code: 401, + userInfo: [NSLocalizedDescriptionKey: "未找到刷新令牌"] + ) + completion(false, error) + return + } + + // 准备刷新请求参数 + let parameters: [String: Any] = [ + "refresh_token": refreshToken, + "grant_type": "refresh_token" + ] + + // 发送刷新请求 + NetworkService.shared.postWithToken(path: "/v1/iam/access-token-refresh", parameters: parameters) { + (result: Result) in + + switch result { + case .success(let tokenResponse): + // 1. 保存新的访问令牌 + KeychainHelper.saveAccessToken(tokenResponse.accessToken) + + // 2. 如果返回了新的刷新令牌,也保存起来 + if let newRefreshToken = tokenResponse.refreshToken { + KeychainHelper.saveRefreshToken(newRefreshToken) + } + + print("✅ Token刷新成功") + completion(true, nil) + + case .failure(let error): + print("❌ Token刷新失败: \(error.localizedDescription)") + + // 刷新失败,清除本地token,需要用户重新登录 + KeychainHelper.clearTokens() + + completion(false, error) + } + } + } + + /// 清除所有存储的 token + func clearTokens() { + print("🗑️ TokenManager: 清除所有 token") + KeychainHelper.clearTokens() + // 清除其他与 token 相关的存储 + UserDefaults.standard.removeObject(forKey: "tokenExpiryDate") + UserDefaults.standard.synchronize() + } +} + +// MARK: - Token响应模型 +/// 用于解析token刷新接口的响应数据 +private struct TokenResponse: Codable { + /// 访问令牌 + let accessToken: String + + /// 刷新令牌(可选) + let refreshToken: String? + + /// 过期时间(秒) + let expiresIn: TimeInterval? + + /// 令牌类型(如:Bearer) + let tokenType: String? + + // 使用CodingKeys自定义键名映射 + enum CodingKeys: String, CodingKey { + case accessToken = "access_token" + case refreshToken = "refresh_token" + case expiresIn = "expires_in" + case tokenType = "token_type" + } +} + +// MARK: - 身份验证响应模型 +/// 用于解析身份验证接口的响应数据 +private struct IdentityCheckResponse: Codable { + /// 是否有效 + let isValid: Bool + + /// 用户ID(可选) + let userId: String? + + /// 过期时间(可选) + let expiresAt: Date? + + enum CodingKeys: String, CodingKey { + case isValid = "is_valid" + case userId = "user_id" + case expiresAt = "expires_at" + } +} + +// MARK: - NetworkService扩展 +/// 为NetworkService添加带token验证的请求方法 +extension NetworkService { + // MARK: - 核心请求方法 + + /// 带token验证的网络请求 + /// - Parameters: + /// - method: HTTP方法(GET/POST/PUT/DELETE等) + /// - path: 接口路径 + /// - parameters: 请求参数 + /// - headers: 自定义请求头 + /// - completion: 完成回调 + func requestWithToken( + _ method: String, + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + // 1. 验证并刷新token + TokenManager.shared.validateAndRefreshTokenIfNeeded { [weak self] isValid, error in + guard let self = self else { return } + + if isValid { + // 2. token有效,继续发送原始请求 + switch method.uppercased() { + case "GET": + self.get(path: path, parameters: parameters, headers: headers, completion: completion) + case "POST": + self.post(path: path, parameters: parameters, headers: headers, completion: completion) + case "PUT": + self.put(path: path, parameters: parameters, headers: headers, completion: completion) + case "DELETE": + self.delete(path: path, parameters: parameters, headers: headers, completion: completion) + default: + let error = NSError( + domain: "NetworkService", + code: 400, + userInfo: [NSLocalizedDescriptionKey: "不支持的HTTP方法: \(method)"] + ) + completion(.failure(.other(error))) + } + } else { + // 3. token无效,返回未授权错误 + let error = error ?? NSError( + domain: "NetworkService", + code: 401, + userInfo: [NSLocalizedDescriptionKey: "未授权访问"] + ) + + DispatchQueue.main.async { + completion(.failure(.unauthorized)) + } + + // 4. 发送登出通知,让应用处理未授权情况 + NotificationCenter.default.post(name: .userDidLogout, object: nil) + } + } + } + + // MARK: - 便捷方法 + + /// 带token验证的GET请求 + func getWithToken( + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + requestWithToken("GET", path: path, parameters: parameters, headers: headers, completion: completion) + } + + /// 带token验证的POST请求 + func postWithToken( + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + requestWithToken("POST", path: path, parameters: parameters, headers: headers, completion: completion) + } + + /// 带token验证的PUT请求 + func putWithToken( + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + requestWithToken("PUT", path: path, parameters: parameters, headers: headers, completion: completion) + } + + /// 带token验证的DELETE请求 + func deleteWithToken( + path: String, + parameters: [String: Any]? = nil, + headers: [String: String]? = nil, + completion: @escaping (Result) -> Void + ) { + requestWithToken("DELETE", path: path, parameters: parameters, headers: headers, completion: completion) + } +} + +// MARK: - 通知名称 +/// 定义应用中使用的通知名称 +extension Notification.Name { + /// 用户登出通知 + /// 当token失效或用户主动登出时发送 + static let userDidLogout = Notification.Name("UserDidLogoutNotification") +} diff --git a/wake/Utils/User.swift b/wake/Utils/User.swift index 2587619..797be1a 100644 --- a/wake/Utils/User.swift +++ b/wake/Utils/User.swift @@ -1,31 +1,61 @@ import Foundation -struct User: Identifiable, Decodable { - var id: Int - var name: String - var username: String - var email: String - var address: Address - var phone: String - var website: String - var company: Company - - struct Address: Decodable { - var street: String - var suite: String - var city: String - var zipcode: String - var geo: Geo - - struct Geo: Decodable { - var lat: String - var lng: String +public struct User: Identifiable, Decodable { + public var id: Int + public var name: String + public var username: String + public var email: String + public var address: Address + public var phone: String + public var website: String + public var company: Company + + public init(id: Int, name: String, username: String, email: String, address: Address, phone: String, website: String, company: Company) { + self.id = id + self.name = name + self.username = username + self.email = email + self.address = address + self.phone = phone + self.website = website + self.company = company + } + + public struct Address: Decodable { + public var street: String + public var suite: String + public var city: String + public var zipcode: String + public var geo: Geo + + public init(street: String, suite: String, city: String, zipcode: String, geo: Geo) { + self.street = street + self.suite = suite + self.city = city + self.zipcode = zipcode + self.geo = geo + } + + public struct Geo: Decodable { + public var lat: String + public var lng: String + + public init(lat: String, lng: String) { + self.lat = lat + self.lng = lng + } } } - - struct Company: Decodable { - var name: String - var catchPhrase: String - var bs: String + + public struct Company: Decodable { + public var name: String + public var catchPhrase: String + public var bs: String + + public init(name: String, catchPhrase: String, bs: String) { + self.name = name + self.catchPhrase = catchPhrase + self.bs = bs + } } } diff --git a/wake/View/Owner/UserInfo/UserInfo.swift b/wake/View/Owner/UserInfo/UserInfo.swift index 7a49929..38c42b5 100644 --- a/wake/View/Owner/UserInfo/UserInfo.swift +++ b/wake/View/Owner/UserInfo/UserInfo.swift @@ -10,6 +10,7 @@ struct UserInfo: View { @State private var darkModeEnabled = false @State private var showLogoutAlert = false @State private var avatarImage: UIImage? // Add this line + @State private var name: String = "" var body: some View { VStack(spacing: 0) { @@ -39,53 +40,49 @@ struct UserInfo: View { .font(Typography.font(for: .title)) .frame(maxWidth: .infinity, alignment: .center) - // Avatar - ZStack { - // Show either the SVG or the uploaded image - if let avatarImage = avatarImage { - Image(uiImage: avatarImage) - .resizable() - .scaledToFill() - .frame(width: 200, height: 200) - .clipShape(Circle()) - } else { - SVGImage(svgName: "Avatar") - .frame(width: 200, height: 200) - } + // Avatar section + VStack { + Text("your name") + .font(.headline) + .padding(.bottom, 10) - // Make sure the AvatarUploader is on top and covers the entire area - AvatarUploader(selectedImage: $avatarImage, size: 200) - .contentShape(Rectangle()) // This makes the entire area tappable + // Avatar image or placeholder + Circle() + .fill(Color.gray.opacity(0.3)) + .frame(width: 100, height: 100) + .overlay( + Image(systemName: "person.fill") + .resizable() + .scaledToFit() + .foregroundColor(.white) + .padding(30) + ) } - .frame(width: 200, height: 200) - .padding(.vertical, 20) + .padding(.top, 30) - // Buttons - Button(action: { - // Action for first button - }) { - Text("Upload from Gallery") - .frame(maxWidth: .infinity) - .padding() - .foregroundColor(.black) - .background( - RoundedRectangle(cornerRadius: 25) - .fill(Color(red: 1.0, green: 0.973, blue: 0.871)) - ) - } + // Name input field + TextField("Enter your name", text: $name) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .padding(.horizontal, 40) + .padding(.top, 20) + Spacer() + + // Next/Open button Button(action: { - // Action for second button + // Action for open button }) { - Text("Take a Photo") + Text("Open") .frame(maxWidth: .infinity) .padding() .foregroundColor(.black) .background( RoundedRectangle(cornerRadius: 25) - .fill(Color(red: 1.0, green: 0.973, blue: 0.871)) + .fill(Color(red: 1.0, green: 0.714, blue: 0.271)) ) } + .padding(.bottom, 30) + .padding(.horizontal, 20) } .padding() .background(Color(.white)) diff --git a/wake/View/Welcome/SplashView.swift b/wake/View/Welcome/SplashView.swift new file mode 100644 index 0000000..c81fbb6 --- /dev/null +++ b/wake/View/Welcome/SplashView.swift @@ -0,0 +1,92 @@ +import SwiftUI + +struct SplashView: View { + @State private var isAnimating = false + @State private var showLogin = false + @EnvironmentObject private var authState: AuthState + + var body: some View { + NavigationView { + ZStack { + // 背景渐变 + LinearGradient( + gradient: Gradient(colors: [ + Theme.Colors.primary, // Primary color with some transparency + Theme.Colors.primaryDark, // Darker shade of the primary color + ]), + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + .edgesIgnoringSafeArea(.all) + VStack(spacing: 50) { + Spacer() + // 欢迎文字动画 + Text("Welcome") + .font(.system(size: 40, weight: .bold, design: .rounded)) + .foregroundColor(.primary) + .scaleEffect(isAnimating ? 1.1 : 0.9) + .opacity(isAnimating ? 1 : 0.3) + .animation( + .easeInOut(duration: 1.5) + .repeatForever(autoreverses: true), + value: isAnimating + ) + + // 动画图标 + Image(systemName: "moon.stars.fill") + .font(.system(size: 120)) + .foregroundColor(.accentColor) + .rotationEffect(.degrees(isAnimating ? 360 : 0)) + .scaleEffect(isAnimating ? 1.2 : 0.8) + .animation( + .easeInOut(duration: 2) + .repeatForever(autoreverses: true), + value: isAnimating + ) + + Spacer() + + // 圆形按钮 + Button(action: { + withAnimation { + showLogin = true + } + }) { + Image(systemName: "arrow.right") + .font(.title) + .foregroundColor(.white) + .frame(width: 140, height: 140) + .background( + Circle() + .fill(Color.accentColor.opacity(0.7)) // 80% opacity + .shadow(radius: 10) + ) + } + .padding(.bottom, 40) + .background( + NavigationLink(destination: LoginView().environmentObject(authState), isActive: $showLogin) { + EmptyView() + } + .hidden() + ) + Spacer() + } + .padding() + } + .onAppear { + isAnimating = true + } + } + .navigationViewStyle(StackNavigationViewStyle()) + } +} + +// 预览 +#if DEBUG +struct SplashView_Previews: PreviewProvider { + static var previews: some View { + SplashView() + .environmentObject(AuthState.shared) + } +} +#endif \ No newline at end of file diff --git a/wake/WakeApp.swift b/wake/WakeApp.swift index 49addd2..ec8fe09 100644 --- a/wake/WakeApp.swift +++ b/wake/WakeApp.swift @@ -1,20 +1,12 @@ - import SwiftUI import UIKit import SwiftData @main struct WakeApp: App { - // init() { - // // 打印所有可用的字体 - // print("\n=== 所有可用的字体 ===") - // for family in UIFont.familyNames.sorted() { - // print("\n\(family):") - // for name in UIFont.fontNames(forFamilyName: family).sorted() { - // print(" - \(name)") - // } - // } - // } + @StateObject private var authState = AuthState.shared + @State private var showSplash = true + // 使用更简单的方式创建模型容器 let container: ModelContainer @@ -32,26 +24,77 @@ struct WakeApp: App { // 3. 重新创建容器 container = try! ModelContainer(for: Login.self) } + + // 配置网络层 + configureNetwork() } - var body: some Scene { WindowGroup { - ContentView() -// SettingsView() - // 导航栏按钮 - // TabView{ - // ContentView() - // .tabItem{ - // Label("wake", systemImage: "book") - // } - // SettingView() - // .tabItem{ - // Label("setting", systemImage: "gear") - // } - // } + ZStack { + if showSplash { + // 显示启动页 + SplashView() + .environmentObject(authState) + .onAppear { + // 启动页显示时检查token有效性 + checkTokenValidity() + } + } else { + // 根据登录状态显示不同视图 + if authState.isAuthenticated { + // 已登录:显示主界面 + ContentView() + .environmentObject(authState) + } else { + // 未登录:显示登录界面 + ContentView() + .environmentObject(authState) + } + } + } + .onAppear { + // 3秒后自动隐藏启动页 + // DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + // withAnimation { + // showSplash = false + // } + // } + } } - // 注入模型容器到环境中 .modelContainer(container) } -} + + // MARK: - 私有方法 + + /// 配置网络层 + private func configureNetwork() { + // 配置网络请求超时时间等 + let configuration = URLSessionConfiguration.default + configuration.timeoutIntervalForRequest = 30 + configuration.timeoutIntervalForResource = 60 + + // 可以在这里添加其他网络配置 + } + + /// 检查token有效性 + private func checkTokenValidity() { + guard TokenManager.shared.hasToken, + let token = KeychainHelper.getAccessToken() else { + showSplash = false + return + } + + // 检查token是否有效 + if TokenManager.shared.isTokenValid(token) { + authState.isAuthenticated = true + } + + // 3秒后自动隐藏启动页 + // DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + // withAnimation { + // showSplash = false + // } + // } + } +} \ No newline at end of file