From 65582f0842386fa2d95c6be63e5006de56a622a9 Mon Sep 17 00:00:00 2001 From: secminhr Date: Fri, 6 Jul 2018 23:01:43 +0800 Subject: [PATCH] Use MVVM style Finish login part --- StudyCK/StudyCK.xcodeproj/project.pbxproj | 12 +- .../UserInterfaceState.xcuserstate | Bin 9681 -> 27566 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + StudyCK/StudyCK/Base.lproj/Main.storyboard | 130 +++++++++++++++++- StudyCK/StudyCK/Info.plist | 5 + StudyCK/StudyCK/LoginViewController.swift | 50 +++++++ StudyCK/StudyCK/LoginViewModel.swift | 44 ++++++ StudyCK/StudyCK/ViewController.swift | 25 ---- 8 files changed, 236 insertions(+), 35 deletions(-) create mode 100644 StudyCK/StudyCK.xcodeproj/xcuserdata/secminhr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 StudyCK/StudyCK/LoginViewController.swift create mode 100644 StudyCK/StudyCK/LoginViewModel.swift delete mode 100644 StudyCK/StudyCK/ViewController.swift diff --git a/StudyCK/StudyCK.xcodeproj/project.pbxproj b/StudyCK/StudyCK.xcodeproj/project.pbxproj index a082d22..d77adf9 100644 --- a/StudyCK/StudyCK.xcodeproj/project.pbxproj +++ b/StudyCK/StudyCK.xcodeproj/project.pbxproj @@ -8,20 +8,22 @@ /* Begin PBXBuildFile section */ 4F2F116220EDB07B0074B9A6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2F116120EDB07B0074B9A6 /* AppDelegate.swift */; }; - 4F2F116420EDB07B0074B9A6 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2F116320EDB07B0074B9A6 /* ViewController.swift */; }; + 4F2F116420EDB07B0074B9A6 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2F116320EDB07B0074B9A6 /* LoginViewController.swift */; }; 4F2F116720EDB07B0074B9A6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4F2F116520EDB07B0074B9A6 /* Main.storyboard */; }; 4F2F116920EDB07E0074B9A6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F2F116820EDB07E0074B9A6 /* Assets.xcassets */; }; 4F2F116C20EDB07E0074B9A6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4F2F116A20EDB07E0074B9A6 /* LaunchScreen.storyboard */; }; + 4F2F117420EF0E5B0074B9A6 /* LoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2F117320EF0E5B0074B9A6 /* LoginViewModel.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 4F2F115E20EDB07B0074B9A6 /* StudyCK.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StudyCK.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4F2F116120EDB07B0074B9A6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 4F2F116320EDB07B0074B9A6 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 4F2F116320EDB07B0074B9A6 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; 4F2F116620EDB07B0074B9A6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 4F2F116820EDB07E0074B9A6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 4F2F116B20EDB07E0074B9A6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 4F2F116D20EDB07E0074B9A6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4F2F117320EF0E5B0074B9A6 /* LoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewModel.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -55,7 +57,8 @@ isa = PBXGroup; children = ( 4F2F116120EDB07B0074B9A6 /* AppDelegate.swift */, - 4F2F116320EDB07B0074B9A6 /* ViewController.swift */, + 4F2F116320EDB07B0074B9A6 /* LoginViewController.swift */, + 4F2F117320EF0E5B0074B9A6 /* LoginViewModel.swift */, 4F2F116520EDB07B0074B9A6 /* Main.storyboard */, 4F2F116820EDB07E0074B9A6 /* Assets.xcassets */, 4F2F116A20EDB07E0074B9A6 /* LaunchScreen.storyboard */, @@ -135,8 +138,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4F2F116420EDB07B0074B9A6 /* ViewController.swift in Sources */, + 4F2F116420EDB07B0074B9A6 /* LoginViewController.swift in Sources */, 4F2F116220EDB07B0074B9A6 /* AppDelegate.swift in Sources */, + 4F2F117420EF0E5B0074B9A6 /* LoginViewModel.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/StudyCK/StudyCK.xcodeproj/project.xcworkspace/xcuserdata/secminhr.xcuserdatad/UserInterfaceState.xcuserstate b/StudyCK/StudyCK.xcodeproj/project.xcworkspace/xcuserdata/secminhr.xcuserdatad/UserInterfaceState.xcuserstate index 1dea264dc3ad1621b7a5744b7f4e3f948c91bc28..d20efcc0cef029b5d136e7ae63f4b8a438e4e5a7 100644 GIT binary patch literal 27566 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 R6-ePz^wOOCd+i@R~D zwTie~YoDUF)mBAot+lNiYPGh{T5GM{)LQ$j-QEod-M-&9^Gjxud(S=F|NPIruY3rn z`z^AnRd$u+yOP!(K3<#}?CneXk^UruWRd}7Aju+w$S^XTj3VPm2^mi&kWw;{RFHp> zX~aurljq1>GLO7SR+BZPmaHXpWF6T;wvvC79prVgm+T{NkVE8ca+JJJ&X5b_Kjcet zgWMrMkl)DfK)?oekiY>lIKc%91bV>@VbBgDAQIvs0TQ7zbccbE1%n_P215=EfuS%A ziogS7p%}(N8C1axm&T74X_bjf|p?j?1MMpAiNDn;W)ep zC!rBOgbQ#HF2iT=1zd+a@B`ch?~m|bs-kN85DlPhC`XOdL`5o5g+5H%(-;~{<7qdV zLi^JUnn{Pz;WU?yp{2BvPNDyz)97@H^eOr*olh6jjdT;;Ot;Xj^d-8DzD&2%U34#f zn;xad=}CHuUZ5B0W%?<-LhsTa>3``x`jbrW)1T=t^jG>D{ar;=prWb(m0o33nSH#v zn;Lgxuy25Rx+)&Sd?(b`&FXt&DoRVLs-vRL0#&IW3h3UWDVbK^?T4&fPH5TW($ajR zGs^agpJu3kT69d}E=!y4ps`Jx78MZ`7wsFV z$&Sr88Zxu{d1^dG$(4oUN~U-!FB=U>$tkI6={cN;05MD-t@ZkZ6dB$RvbBk{A-t(3wN3$YO@F zgQSss$*|N01csCt(12VEf<`ZKspff|_2ps^TUgf+01fnoz}g6(h&K4Gc90#{j% zZPZD_X(WxK16dxu)hv}$S^BopSLlA)z!G+bo}<@Q8kJ2IsESbyQWdC5R28Zk)jZYn zs(RG{)oImD)o*H|rfRi1K;1^IQFCgYnpYdtCbdOvQ`H>QtlhDniGwDLQl5V6s=|Pgvh$a-#j25(_Z8J$BK_rc&lb-C^ z8|^5dgzc~!d-h})Y1B=E2;YCg9lmP4*|$_5;%FpV!Vw+GW)TdnBZJXVM~0xx=APEe z@wsH=Ix>Rfp%dF;Xv^GuQb@%0WHc!tW6*^P2CgSXOy5{^Gd)2JlWqBEueaH&W>?Bc zd0u9AT1jDbNqJd8Wz9NLMmn~vH;GLCKi8Yuv|b1Xha^?3ZCb5)vFT*SsLbq)$<+m8 zN>%ny4{si&~oQYx``|x3&|pe z!X?Cq;rJ*_s5h-A8;Mv)Hehre*@Q7H ze6?|O^b<-j__?4c`tc~yxS^x9J~G@_yIZDYMozg zSj&oymPINZchq{X^nDllTSGm_#}T=NpZE($aIPOG-j0WEOY3wvW9?2G-dKW1Pi4%kXUfM<)Q zkQ6Y12xhRbJP%|F?ChS4wYV0yu$*_cMfhge7MX&eEejO{V^$r6;2<^@UpK{yV^u)!GxC1npBVT2aL9D&CeuSH`H4#A=8A(rXuh{KqUXBl?p+s9;gfo^rs z6^CO@i(C)r#i#?47!RgEDx^U=^u$~ofq6I*M`1pW-VD8=5A=n8?9PBpEWj~14WDB7 z9DJJDmLe_cV=pY9*rA}JqSVve20Hlr04t9cEyH0H5jQ|CjDS2CiG^5%9vr&?@?kU- zz!)sXGAze`F)L?2ws!!Ozy#)M6X!rFj(dO=C}*St6)*`)u(TB?Pz_W6o--GX zvdngPrMWQA!A_`W#_fXLum@g+*Wh*7>znKxq@9g3@JXDGvwWwV@k#Ke-=qCFljR&5 z;1Clz%y4lew@(o>yJT#Mr!uEcS&?TddKpl#g(8}?!#i-y_l(P}S_kj?=D32x%--Ld zug0dpEM{T(08TKcpFp;8W335J!D(NeVq+3#e6@)xBx8+H^6sr6K=t6 zT!hQRwX_6TD zXI^A`oQ};fYcVl_c5XGX3)Z!m*xhep59&?Ab-3{l8&heozbmA@nZmxfo+;db!NVD; zrWcj4wi%LC@>gRA(CmN64kjUV2yS9Q-|VMk1CvhkjG0_q?5S*GWJgk7LzDey=?I!f zM-m+!1t;ieTHxE$zHcz@U@+Q>yUx=>TExaYbSy1qKokG@*`GG1Sp&e7Uuz=;QvH!tH-9q5rQ~{$dH8#cUZLPO{(x z$-Ex%8MYt?iCUFf?M z{;--ZV%2sjyj@mH{+7^HBy8t*M zOnkbIzJ>??7}!S-`fKW+ZGax4hnw0!10G^+Ak6o5l$=H1@jHJE5C4ga>3j5jKNsT> ze9O&->DfQiEIr3)_H94S`cEZ+Q4W!QL_cO*7kUZbsiU9ZF-H85tn{Uy z(XWZPgnIAuEg@AKm6iq3|6iSo!;23JPQ|xQYyybNL`JT~(B^lGp9@*kvBqc0 zHG5SKm7J4ZT~O^oV86{F{&!n0@Vstt!9;GwPurMr)Hn#nC7JB zyymjzp5`a5H$ZFE+O-a?Q>$p*+F)&nHbxt#?W9f6cGh;)cGo6pQ?w(rW!g2`o!U>e zcR1iwoRKqgR!-t%&c#J>iClLsiA&+qxGZiMm&@gGqc{&&%$0BxxQW~}?ip?s_ae8E zdxd+0Yv4ZM&T{9u3*1NC749l`&C6ZqZgAgoKkGQ1N$1eD)g|b9==$rjblJKbU9K)q zH%d2JSFKy2+o0R2+ojv1drh}j_l9o2?zrxK-3i?(-5K3k-Fe*w-A%n&pQ10&SLkQ! z7wVVjm+DvOSL#>kx9j)m_v;Vp59^QUkLpk8FX=zkf2RLje?$MZ{#(8Grv8@xp8h93 zfYTJM+ExzI=av0H4KY^P~Af-ouaM$MdCp4L_Zq$wwF&{hZ)+6nE2aG{&fQ^*#^3gd+FLa9(DR0x$qwJ=4PD$Et;3k!wCf=^f` ztPoZTtAy1;txzw#CtMV62|pW5hB!lSL$+bGq0rzlj5CZklp2;A>I@qUn+#hG+YH+c z^@f9nqlROKfrW<=12OA5G9%Hew#5ln?(O7Pr zWJKd^Q-UeolxZ4h8e|%58e+;f6_^T5 z9#gTY#I)4(mg#%ZDYh3M6(hwcF-D9NyNM}cn%Gn9E#`=M;wY~;S{x&mh!ez#V!1d; zTqdp&w~6)QZt+#|b@8BhNPJ6tTYN`6C0-N16K{)m#JlDIv(YS@+nL*&!_5)q4(7?` zndZ6XMdl^urRJ69Rp!;^TJt9JcJpELadV^jj`_YtwnSMHE!{2sEd4DRmI0O`%j1?g zmX(%07Vm48y_PpD`z;48w=MTAzgm8`f>p3OtZr+tHN+ZbjkI>M=2&yBHP+eIh1SJZ zpLLmajdizmul1z$f=y-9*kWy6Y?E!XZO_@3+n%?*V0+QF(YDRD!?xGMQk^GNlpH z7^z4aD~*%NrAbniG+BCFLTSFVR9Y@QFTEhuN$aJJ(q?I^R4*NrybaPJ=`HD$)F_>k zE=V6qA4}JyucU9J@1$GOuMV{%z@c$)4wJ*|usZAxhaYn?ls_0HYSSDmjr_c`Bm9&k1|Pdgi(=bRrpFFG$dKXG1mUU6P^-gntu zp{_2j4A*$qbk_>k2G?fSR@cj}S6n+>-u;#3sHtwbp?N}SS3Nl=oNOeI^%QHCmc$|z;DGDdk^c~W^=c~+UH zEKn9HYm`mOF6D@FR5_*`SKe1nD5sP&%30-_a$UKhe64(|+*EEWcgmEz%6|hPP#+i; z*flUKaBSerz!ibp1HTKr8~BU6joaupyRB}!JJkKK`w@49yMsH*o#^iB?(R-<_i^`i j_jl*Ghq-gzdG0cImAj^CdqpVQ`}!}Hv-#Qb?Vk2OV4HG7 diff --git a/StudyCK/StudyCK.xcodeproj/xcuserdata/secminhr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/StudyCK/StudyCK.xcodeproj/xcuserdata/secminhr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/StudyCK/StudyCK.xcodeproj/xcuserdata/secminhr.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/StudyCK/StudyCK/Base.lproj/Main.storyboard b/StudyCK/StudyCK/Base.lproj/Main.storyboard index 03c13c2..464653f 100644 --- a/StudyCK/StudyCK/Base.lproj/Main.storyboard +++ b/StudyCK/StudyCK/Base.lproj/Main.storyboard @@ -1,24 +1,142 @@ - + + + + - + + - + + + + + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/StudyCK/StudyCK/Info.plist b/StudyCK/StudyCK/Info.plist index 16be3b6..5ee6264 100644 --- a/StudyCK/StudyCK/Info.plist +++ b/StudyCK/StudyCK/Info.plist @@ -2,6 +2,11 @@ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable diff --git a/StudyCK/StudyCK/LoginViewController.swift b/StudyCK/StudyCK/LoginViewController.swift new file mode 100644 index 0000000..adf5e6e --- /dev/null +++ b/StudyCK/StudyCK/LoginViewController.swift @@ -0,0 +1,50 @@ +import UIKit + +class LoginViewController: UIViewController { + + let viewModel = LoginViewModel() + + @IBOutlet weak var loginIndicator: UIActivityIndicatorView! + + @IBAction func loginFieldChanged(_ sender: UITextField) { + if sender.tag == 0 { + viewModel.username = sender.text! + } else { + viewModel.password = sender.text! + } + } + + @IBAction func loginButtonClicked() { + viewModel.login() + } + + override func viewDidLoad() { + viewModel.showLoginFailedAlert = { (title:String, message:String) -> Void in + DispatchQueue.main.async { + let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "重試", style: .cancel, handler: nil)) + self.present(alertController, animated: true, completion: nil) + } + } + viewModel.loginStateChanged = { (loggingIn: Bool) -> Void in + DispatchQueue.main.async { + self.loginIndicator.setAnimating(to: loggingIn) + } + } + viewModel.loginSuccessfully = { + DispatchQueue.main.async { + + } + } + } +} + +extension UIActivityIndicatorView { + func setAnimating(to animating: Bool) { + if animating { + startAnimating() + } else { + stopAnimating() + } + } +} diff --git a/StudyCK/StudyCK/LoginViewModel.swift b/StudyCK/StudyCK/LoginViewModel.swift new file mode 100644 index 0000000..5138323 --- /dev/null +++ b/StudyCK/StudyCK/LoginViewModel.swift @@ -0,0 +1,44 @@ +import Foundation +class LoginViewModel { + + var username: String = "" + var password: String = "" + var loginState = false { + didSet { + self.loginStateChanged?(loginState) + } + } + + let loginURL = "http://study.ck.tp.edu.tw/login_chk.asp" + let requestBody = "f_mnuid=&f_uid=%@&f_pwd=%@&submit=%B5n%A4J" + + var showLoginFailedAlert: ((String, String) -> Void)? = nil + var loginStateChanged: ((Bool) -> Void)? = nil + var loginSuccessfully: (() -> Void)? = nil + + func login() { + loginState = true + var request = URLRequest(url: URL(string: loginURL)!) + request.httpMethod = "POST" + let cfEnc = CFStringEncodings.big5 + let nsEnc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(cfEnc.rawValue)) + let big5encoding = String.Encoding(rawValue: nsEnc) + let body = String(format: requestBody, username, password) + request.httpBody = body.data(using: big5encoding) + URLSession.shared.dataTask(with: request) { data, response, error in + self.handleData(string: String(data: data!, encoding: big5encoding)!) + self.loginState = false + }.resume() + } + + private func handleData(string data: String) { + print(data) + if data.contains("密碼錯誤") { + showLoginFailedAlert?("錯誤", "密碼錯誤,請再試一次") + } else if data.contains("帳號") && data.contains("不存在") { + showLoginFailedAlert?("錯誤", "帳號\(username)不存在") + } else { //login successfully + loginSuccessfully?() + } + } +} diff --git a/StudyCK/StudyCK/ViewController.swift b/StudyCK/StudyCK/ViewController.swift deleted file mode 100644 index 708cfbe..0000000 --- a/StudyCK/StudyCK/ViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// ViewController.swift -// StudyCK -// -// Created by secminhr on 2018/7/5. -// Copyright © 2018年 secminhr. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - -} -