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,39 +74,46 @@ 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 {
TextField("认证密钥", text: $token) VStack {
.multilineTextAlignment(.leading) TextField("认证密钥", text: $token)
.textFieldStyle(PlainTextFieldStyle()) .multilineTextAlignment(.leading)
.frame(width: 200, height: 25) .textFieldStyle(PlainTextFieldStyle())
.background(Color.clear) .frame(width: 200, height: 25)
.foregroundColor(Color.black) .background(Color.clear)
.overlay( .foregroundColor(Color.black)
Rectangle() .overlay(
.frame(height: 1) Rectangle()
.foregroundColor(.blue) .frame(height: 1)
.padding(.top, 25) .foregroundColor(.blue)
, alignment: .topLeading) .padding(.top, 25)
, alignment: .topLeading)
Rectangle()
.overlay { Rectangle()
Text("登陆") .overlay {
.font(.system(size: 14, weight: .regular)) Text("登陆")
.foregroundColor(.black) .font(.system(size: 14, weight: .regular))
} .foregroundColor(.black)
.frame(width: 120, height: 35)
.foregroundColor(Color(red: 74 / 255, green: 207 / 255, blue: 154 / 255))
.cornerRadius(5.0)
.onTapGesture {
Task {
await self.doLogin()
} }
.frame(width: 120, height: 35)
.foregroundColor(Color(red: 74 / 255, green: 207 / 255, blue: 154 / 255))
.cornerRadius(5.0)
.onTapGesture {
Task {
await self.doLogin()
}
}
}
.onAppear {
if let cacheToken = self.userContext.loadCacheToken() {
self.token = cacheToken
} }
}
} }
// //
@ -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
} }
} }