// // account.swift // 74 桌 // // Created by yunli on 2023/5/20. // import SwiftUI import Alamofire struct Constant{ var cookiesDefaultsKey:String } let Constants:Constant=(Constant(cookiesDefaultsKey: "JSESSIONID")) class CookieHandler { static let shared: CookieHandler = CookieHandler() let defaults = UserDefaults.standard let cookieStorage = HTTPCookieStorage.shared func getCookie(forURL url: String) -> [HTTPCookie] { let computedUrl = URL(string: url) let cookies = cookieStorage.cookies(for: computedUrl!) ?? [] return cookies } func backupCookies(forURL url: String) -> Void { var cookieDict = [String : AnyObject]() for cookie in self.getCookie(forURL: url) { cookieDict[cookie.name] = cookie.properties as AnyObject? } defaults.set(cookieDict, forKey: Constants.cookiesDefaultsKey) } func restoreCookies() { if let cookieDictionary = defaults.dictionary(forKey: Constants.cookiesDefaultsKey) { for (_, cookieProperties) in cookieDictionary { if let cookie = HTTPCookie(properties: cookieProperties as! [HTTPCookiePropertyKey : Any] ) { cookieStorage.setCookie(cookie) } } } } } struct Login: Encodable { let user: String let pwd: String let cook: String } class APIFetchHandler { static let sharedInstance = APIFetchHandler() func getCookie(name:String)->HTTPCookie?{ if let cookie=CookieHandler().getCookie(forURL: "https://debug.sdsz.icu:81/").filter({cookie->Bool in return cookie.name==name }).first { return cookie } return nil } func fetchLoginCookie(action:@escaping(_:String)->Void) { if let cookie=getCookie(name:"JSESSOINID") {HTTPCookieStorage.shared.deleteCookie(cookie)} let url = "https://debug.sdsz.icu:81/sso/login"; AF.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).response{res in if let cookie=self.getCookie(name:"JSESSIONID"){ action(cookie.value) } } } } func doLogin(user:String,password:String,action:@escaping(_:Int)->Void){ APIFetchHandler().fetchLoginCookie(){(cookie:String) in let login = Login(user: user, pwd: password, cook: cookie) print(login) AF.request("https://debug.sdsz.icu/andlogin", method: .post, parameters: login,encoder:JSONParameterEncoder.default, headers: nil).responseString{res in print("\(res)") } action(1) } } struct loginView:View{ @State var username: String = "" @State var password: String = "" @FocusState private var isFocused:Bool @Binding var isLoggedIn: Int var body: some View { VStack{ Form { Section{ HStack { Image(systemName:"person.fill").foregroundColor(Color(red: 0.7, green: 0.7, blue: 0.7)) TextField(text: $username, prompt: Text("数字校园号")) { Text("数字校园号") }.focused($isFocused) .keyboardType(.numberPad) } HStack { Image(systemName:"lock.fill").foregroundColor(Color(red: 0.7, green: 0.7, blue: 0.7)) SecureField(text: $password, prompt: Text("密码")) { Text("密码") }.focused($isFocused) } }.onTapGesture { isFocused=false } Section{ HStack{ Spacer() Button(action:{doLogin(user:username,password: password){(ret:Int) in isLoggedIn=ret }}){ VStack{ Text("登录") } }.font(.title3) Spacer() } } } Spacer() } } } struct accountView:View{ @State var username: String = "" @State var password: String = "" @FocusState private var isFocused:Bool @Binding var isLoggedIn: Int var body: some View { VStack{ Form { Section(header:Text("hi")){ Text("一些") Text("一些") Text("东西") } Section{ Button(action:{isLoggedIn=0}){ VStack{ Text("退出").foregroundColor(.red) } } } } Spacer() } } } struct accountView_Previews: PreviewProvider { @State static var isLoggedIn = 0 static var previews: some View { loginView(isLoggedIn:$isLoggedIn) } }