UI逻辑完善

This commit is contained in:
anlicheng 2026-03-06 16:37:57 +08:00
parent a96fe640bd
commit df72f2e5fa
2 changed files with 72 additions and 31 deletions

View File

@ -74,12 +74,13 @@ struct LoginView: View {
struct LoginTokenView: View { struct LoginTokenView: View {
@Environment(UserContext.self) var userContext: UserContext @Environment(UserContext.self) var userContext: UserContext
@State private var token: String = "49974818809840025617726088179154" @State private var token: String = ""
@State private var showAlert = false @State private var showAlert = false
@State private var errorMessage = "" @State private var errorMessage = ""
var body: some View { var body: some View {
VStack {
TextField("认证密钥", text: $token) TextField("认证密钥", text: $token)
.multilineTextAlignment(.leading) .multilineTextAlignment(.leading)
.textFieldStyle(PlainTextFieldStyle()) .textFieldStyle(PlainTextFieldStyle())
@ -108,6 +109,12 @@ struct LoginTokenView: View {
} }
} }
} }
.onAppear {
if let cacheToken = self.userContext.loadCacheToken() {
self.token = cacheToken
}
}
}
// //
private func doLogin() async { private func doLogin() async {
@ -139,8 +146,8 @@ struct LoginTokenView: View {
struct LoginAccountView: View { struct LoginAccountView: View {
@Environment(UserContext.self) var userContext: UserContext @Environment(UserContext.self) var userContext: UserContext
@State private var username: String = "test3" @State private var username: String = ""
@State private var password: String = "111111" @State private var password: String = ""
@State private var showAlert = false @State private var showAlert = false
@State private var errorMessage = "" @State private var errorMessage = ""
@ -208,6 +215,12 @@ struct LoginAccountView: View {
.alert(isPresented: $showAlert) { .alert(isPresented: $showAlert) {
Alert(title: Text("错误提示"), message: Text("账号密码为空")) Alert(title: Text("错误提示"), message: Text("账号密码为空"))
} }
.onAppear {
if let (cacheUsername, cachePassword) = self.userContext.loadCacheUsernameAndPassword() {
self.username = cacheUsername
self.password = cachePassword
}
}
} }
// //

View File

@ -11,10 +11,10 @@ import Observation
@Observable @Observable
class UserContext { class UserContext {
var isLogined: Bool = false var isLogined: Bool = false
var loginCredit: LoginCredit? var loginCredit: Credit?
var networkSession: NetworkSession? var networkSession: NetworkSession?
enum LoginCredit { enum Credit {
case token(token: String) case token(token: String)
case accountAndPasword(account: String, password: String) case accountAndPasword(account: String, password: String)
} }
@ -68,6 +68,11 @@ class UserContext {
self.networkSession = try await SDLAPIClient.doPost(path: "/auth/login", params: params, as: NetworkSession.self) self.networkSession = try await SDLAPIClient.doPost(path: "/auth/login", params: params, as: NetworkSession.self)
self.loginCredit = .accountAndPasword(account: username, password: password) self.loginCredit = .accountAndPasword(account: username, password: password)
self.isLogined = true self.isLogined = true
// keychain
if let data = "\(username):\(password)".data(using: .utf8) {
try KeychainStore.shared.save(data, account: "accountAndPasword")
}
} }
@MainActor @MainActor
@ -80,6 +85,29 @@ class UserContext {
self.networkSession = try await SDLAPIClient.doPost(path: "/auth/token", params: params, as: NetworkSession.self) self.networkSession = try await SDLAPIClient.doPost(path: "/auth/token", params: params, as: NetworkSession.self)
self.loginCredit = .token(token: token) self.loginCredit = .token(token: token)
self.isLogined = true self.isLogined = true
// keychain
if let data = token.data(using: .utf8) {
try KeychainStore.shared.save(data, account: "token")
}
}
func loadCacheToken() -> String? {
if let data = try? KeychainStore.shared.load(account: "token") {
return String(data: data, encoding: .utf8)
}
return nil
}
func loadCacheUsernameAndPassword() -> (String, String)? {
if let data = try? KeychainStore.shared.load(account: "accountAndPasword"),
let str = String(data: data, encoding: .utf8) {
let parts = str.split(separator: ":")
if parts.count == 2 {
return (String(parts[0]), String(parts[1]))
}
}
return nil
} }
} }