Преглед на файлове

微信登录完成, apple登录初配置

openlockPPP преди 1 година
родител
ревизия
19806c1b87

+ 4 - 0
JiaPeiManage.xcodeproj/project.pbxproj

@@ -189,6 +189,7 @@
 		90E65C982A7B4BD60055B09C /* BindingViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 90E65C972A7B4BD60055B09C /* BindingViewController.xib */; };
 		90E65C9A2A7B56070055B09C /* NYWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E65C992A7B56070055B09C /* NYWindow.swift */; };
 		90E65C9C2A7B93AE0055B09C /* AuthorizationDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E65C9B2A7B93AE0055B09C /* AuthorizationDataModel.swift */; };
+		90E65C9E2A7CA09D0055B09C /* JpMsgDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E65C9D2A7CA09D0055B09C /* JpMsgDataModel.swift */; };
 		FD091E28E4C2EF8E654AE2C6 /* Pods_JiaPeiManage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FC2879EF62A9D4DF6777C62 /* Pods_JiaPeiManage.framework */; };
 /* End PBXBuildFile section */
 
@@ -389,6 +390,7 @@
 		90E65C972A7B4BD60055B09C /* BindingViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BindingViewController.xib; sourceTree = "<group>"; };
 		90E65C992A7B56070055B09C /* NYWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NYWindow.swift; sourceTree = "<group>"; };
 		90E65C9B2A7B93AE0055B09C /* AuthorizationDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorizationDataModel.swift; sourceTree = "<group>"; };
+		90E65C9D2A7CA09D0055B09C /* JpMsgDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JpMsgDataModel.swift; sourceTree = "<group>"; };
 		A8171123E8F401C7CF842A4C /* Pods-JiaPeiManage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JiaPeiManage.debug.xcconfig"; path = "Target Support Files/Pods-JiaPeiManage/Pods-JiaPeiManage.debug.xcconfig"; sourceTree = "<group>"; };
 		D9F65764266FE5C95D1940F5 /* Pods-JiaPeiManage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JiaPeiManage.release.xcconfig"; path = "Target Support Files/Pods-JiaPeiManage/Pods-JiaPeiManage.release.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -756,6 +758,7 @@
 				908FEEAE2A42FA4F00BEB81C /* StuLogFacDataModel.swift */,
 				90971E772A499BF200267B7F /* StuCountDataModel.swift */,
 				90E65C9B2A7B93AE0055B09C /* AuthorizationDataModel.swift */,
+				90E65C9D2A7CA09D0055B09C /* JpMsgDataModel.swift */,
 			);
 			path = Models;
 			sourceTree = "<group>";
@@ -1374,6 +1377,7 @@
 				90971E922A4AB07B00267B7F /* StatisticsPageHeaderView.swift in Sources */,
 				909DA5D32A3ADFD80034501F /* MeTraineeSubjectCell.swift in Sources */,
 				90CE52BD2A36E5B70033BD06 /* NetEnvironment.swift in Sources */,
+				90E65C9E2A7CA09D0055B09C /* JpMsgDataModel.swift in Sources */,
 				90971E692A493BCB00267B7F /* MeTabBarController.swift in Sources */,
 				903B4E6E2A73C5D800FD7320 /* NYAccountManager.swift in Sources */,
 				90A8CD482A5EACB500C02402 /* MeTraineeSubjectViewModel.swift in Sources */,

BIN
JiaPeiManage/Assets.xcassets/Modules/Login/Apple.imageset/Apple.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Login/Apple.imageset/Apple@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Login/Apple.imageset/Apple@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Login/Apple.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "Apple.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "Apple@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "Apple@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 4 - 0
JiaPeiManage/JiaPeiManage.entitlements

@@ -2,6 +2,10 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
+	<key>com.apple.developer.applesignin</key>
+	<array>
+		<string>Default</string>
+	</array>
 	<key>com.apple.developer.associated-domains</key>
 	<array>
 		<string>applinks:app.jppt.com.cn</string>

+ 4 - 5
JiaPeiManage/Sources/Main/App/CompositionRoot.swift

@@ -91,11 +91,10 @@ final class CompositionRoot {
         LocalManager.userInfo.openTimes += 1
         //设置环境  --默认是线上环境
         Defaults.currentEnvironment = .res
-//#if DEBUG || _DEBUG
-//        //设置环境
-//        Defaults.currentEnvironment = .dev
-//#endif
-
+#if DEBUG || _DEBUG
+        //设置环境
+        Defaults.currentEnvironment = .dev
+#endif
         //ToastView
         ToastView.appearance().font = NYFont.SysFont.sys_15
         

+ 22 - 0
JiaPeiManage/Sources/Models/JpMsgDataModel.swift

@@ -0,0 +1,22 @@
+//
+//  JpMsgDataModel.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/4.
+//
+
+import ObjectMapper
+
+struct JpMsgDataModel : ImmutableMappable{
+
+    var code : Int!
+    var data : Any!
+    var msg : String!
+
+    init(map: Map) throws {
+        code = try map.value("code") ?? 0
+        data = try? map.value("data")
+        msg = try map.value("msg") ?? ""
+    }
+    
+}

+ 92 - 125
JiaPeiManage/Sources/Modulars/Login/Controllers/BindingViewController.swift

@@ -28,13 +28,11 @@ final class BindingViewController: BaseViewController {
     @IBOutlet weak var location_button_btn: UIButton!
     //区域
     @IBOutlet weak var userlocation_textField: QMUITextField!
-    //登录按钮
+    //绑定按钮
     @IBOutlet weak var login_button: UIButton!
-    //已同意
-    @IBOutlet weak var agree_button: QMUIButton!
 
     
-    
+    var openid:String = ""
     var city:String = ""
     var cityPower:String = ""  //地区权限
     var cityItems:[CityItem] = []
@@ -57,119 +55,91 @@ final class BindingViewController: BaseViewController {
     // MARK: 私有方法
     func setupUI(){
         self.view.backgroundColor = .db_theme
-//        self.username_textField.placeholderColor = .db_place
-//        self.userpassword_textField.placeholderColor = .db_place
-//        self.userlocation_textField.placeholderColor = .db_place
+        self.username_textField.placeholderColor = .db_place
+        self.userpassword_textField.placeholderColor = .db_place
+        self.userlocation_textField.placeholderColor = .db_place
     }
     func biandView(){
-//        //判断账号的输入是否可用
-//        let accountValid = username_textField.rx.text.orEmpty.map{ value in
-//            return value.count >= 18
-//        }
-//        //判断密码的输入是否可用
-//        let passwordValid = userpassword_textField.rx.text.orEmpty.map{ value in
-//            return value.count >= 6
-//        }
-//        
-//        //判断同意
-//        let agreeValid = agree_button.rx.tap.map { [unowned self] in
-//            NSLog("agreeValid")
-//                return self.agree_button.isSelected
-//        }
-//        //同意
-//        agree_button.rx.tap.subscribe ({ [unowned self] (_)  in
-//            NSLog("tap.subscribe")
-//            self.agree_button.isSelected = !self.agree_button.isSelected
-//        }).disposed(by: disposeBag)
-//        //登录按钮的可用与否
-//        let loginObserver = Observable.combineLatest(accountValid,passwordValid,agreeValid){(account,password,agree) in
-//            account && password && agree
-//        }
-//
-//        //绑定按钮
-//        loginObserver.bind(to: login_button.rx.isEnabled).disposed(by: disposeBag)
-//        loginObserver.subscribe(onNext: { [unowned self] valid in
-//            NSLog("loginObserver")
-//            self.login_button.alpha = valid ? 1 : 0.5
-//        }).disposed(by: disposeBag)
-//        
-//        //用户协议
-//        userprotocol_button.rx.tap.subscribe ({ [unowned self] (_)  in
-//            //跳web
-//            navigator.push("https://ys.zzxcx.net/xy_jlgj.html")
-//        }).disposed(by: disposeBag)
-//        //隐私
-//        userprivacy_button.rx.tap.subscribe ({ [unowned self] (_)  in
-//            //跳web
-//            navigator.push("https://ys.zzxcx.net/xy_jlgj.html")
-//        }).disposed(by: disposeBag)
-//        //显示密码
-//        pwdshow_button.rx.tap.subscribe ({ [unowned self] (_)  in
-//            self.pwdshow_button.isSelected = !self.pwdshow_button.isSelected;
-//            self.userpassword_textField.isSecureTextEntry = !self.pwdshow_button.isSelected
-//        }).disposed(by: disposeBag)
-//        //选择区域
-//        location_button.rx.tap.subscribe ({ [unowned self] (_)  in
-//            NSLog("点击了:选择区域- \(Thread.isMainThread)")
-//            self.showDialog()
-//        }).disposed(by: disposeBag)
-//        location_button_btn.rx.tap.subscribe ({ [unowned self] (_)  in
-//            self.showDialog()
-//        }).disposed(by: disposeBag)
-//        //wxin_button
-//        wxin_button.rx.tap.subscribe ({ [unowned self] (_)  in
-//            
-//        }).disposed(by: disposeBag)
-//        //登录
-//        login_button.rx.tap
-//                    .asObservable()
-//                    .withLatestFrom(loginObserver)
-//                    .do(onNext: {
-//                        [unowned self]_ in
-//                        self.login_button.isEnabled = false
-//                        self.view.endEditing(true)
-//                    })
-//                    .subscribe(onNext: {[unowned self]isLogin in
-//                        NSLog("登录 - 登录: login %@","123")
-//                        self.login_button.isEnabled = true
-//                        //保存用户信息
-//                        var account:String = self.username_textField.text!
-//                        var password:String = self.userpassword_textField.text!
-//                        if city=="" {
-//                            NYTips.showMsg(txt: "请选择地区!")
-//                            return
-//                        }
-//                        LocalManager.userInfo.userAccount = account
-//                        LocalManager.userInfo.password = password
-//                        LocalManager.userInfo.city = city
-//                        LocalManager.userInfo.cityPower = cityPower
-//                        //登录api RX 订阅 观察 销毁 三部曲
-//                        NYTips.show()
-//                        self.loginService.loginRequest(user_name: account, user_password: password,city: city)
-//                            .subscribe(onSuccess: { userinfo in
-//                                NYTips.hide()
-//                                LocalManager.userInfo = userinfo
-//                                LocalManager.userInfo.isLogin = true //设置已经登录
-//                                NYAccountManager.shared.addUserinfo(user: userinfo)//添加用户信息
-//                                print("登录成功:%@", userinfo)
-//                                self.dismiss(animated: true)
-//                            }, onError: { error in
-//                                NYTips.hide()
-//                                NYTips.showErr(txt: (error as! RequestError).errorDescription)
-//                                print("%@",error)
-//                            })
-//                            .disposed(by: disposeBag)
-//                        
-//                    })
-//                    .disposed(by: disposeBag)
-//        //添加手势
-//        let tapBackground = UITapGestureRecognizer()
-//        tapBackground.rx.event
-//        .subscribe(onNext: { [weak self] _ in
-//            self?.view.endEditing(true)
-//        })
-//        .disposed(by: disposeBag)
-//        view.addGestureRecognizer(tapBackground)
+        //判断账号的输入是否可用
+        let accountValid = username_textField.rx.text.orEmpty.map{ value in
+            return value.count >= 18
+        }
+        //判断密码的输入是否可用
+        let passwordValid = userpassword_textField.rx.text.orEmpty.map{ value in
+            return value.count >= 6
+        }
+        //登录按钮的可用与否
+        let loginObserver = Observable.combineLatest(accountValid,passwordValid){(account,password) in
+            account && password
+        }
+        //绑定按钮
+        loginObserver.bind(to: login_button.rx.isEnabled).disposed(by: disposeBag)
+        loginObserver.subscribe(onNext: { [unowned self] valid in
+            NSLog("loginObserver")
+            self.login_button.alpha = valid ? 1 : 0.5
+        }).disposed(by: disposeBag)
+        //显示密码
+        pwdshow_button.rx.tap.subscribe ({ [unowned self] (_)  in
+            self.pwdshow_button.isSelected = !self.pwdshow_button.isSelected;
+            self.userpassword_textField.isSecureTextEntry = !self.pwdshow_button.isSelected
+        }).disposed(by: disposeBag)
+        //选择区域
+        location_button.rx.tap.subscribe ({ [unowned self] (_)  in
+            NSLog("点击了:选择区域- \(Thread.isMainThread)")
+            self.showDialog()
+        }).disposed(by: disposeBag)
+        location_button_btn.rx.tap.subscribe ({ [unowned self] (_)  in
+            self.showDialog()
+        }).disposed(by: disposeBag)
+        //登录
+        login_button.rx.tap
+                    .asObservable()
+                    .withLatestFrom(loginObserver)
+                    .do(onNext: {
+                        [unowned self]_ in
+                        self.login_button.isEnabled = false
+                        self.view.endEditing(true)
+                    })
+                    .subscribe(onNext: {[unowned self]isLogin in
+                        self.login_button.isEnabled = true
+                        //保存用户信息
+                        var account:String = self.username_textField.text!
+                        var password:String = self.userpassword_textField.text!
+                        if city=="" {
+                            NYTips.showMsg(txt: "请选择地区!")
+                            return
+                        }
+                        LocalManager.userInfo.userAccount = account
+                        LocalManager.userInfo.password = password
+                        LocalManager.userInfo.city = city
+                        LocalManager.userInfo.cityPower = cityPower
+                        //登录api RX 订阅 观察 销毁 三部曲
+                        NYTips.show()
+                        self.loginService.biandUserRequest(idcard: account, user_password: password,openid: self.openid,city: city)
+                            .subscribe(onSuccess: {[unowned self] userinfo in
+                                NYTips.hide()
+                                LocalManager.userInfo = userinfo
+                                LocalManager.userInfo.isLogin = true //设置已经登录
+                                NYAccountManager.shared.addUserinfo(user: userinfo)//添加用户信息
+                                print("登录成功:%@", userinfo)
+                                self.dismiss(animated: true)
+                            }, onError: { error in
+                                NYTips.hide()
+                                NYTips.showErr(txt: (error as! RequestError).errorDescription)
+                                print("%@",error)
+                            })
+                            .disposed(by: self.disposeBag)
+                        
+                    })
+                    .disposed(by: disposeBag)
+        //添加手势
+        let tapBackground = UITapGestureRecognizer()
+        tapBackground.rx.event
+        .subscribe(onNext: { [weak self] _ in
+            self?.view.endEditing(true)
+        })
+        .disposed(by: disposeBag)
+        view.addGestureRecognizer(tapBackground)
     }
     
     
@@ -180,31 +150,28 @@ final class BindingViewController: BaseViewController {
         dialogViewController.items = Array(citys.keys)
         dialogViewController.selectedItemIndex = selectedItemIndex
         dialogViewController.addCancelButton(withText: "取消", block: nil)
-        dialogViewController.addSubmitButton(withText: "确定") { [weak self] dialogViewController in
+        dialogViewController.addSubmitButton(withText: "确定") { [unowned self] dialogViewController in
             guard let dialogViewController:QMUIDialogSelectionViewController = dialogViewController as? QMUIDialogSelectionViewController else { return }
             if dialogViewController.selectedItemIndex == QMUIDialogSelectionViewControllerSelectedItemIndexNone {
                 NYTips.showErr(txt: "请至少选一个")
                 return
             }
-            self?.selectedItemIndex = dialogViewController.selectedItemIndex
-            let keyname = dialogViewController.items![self!.selectedItemIndex]
+            self.selectedItemIndex = dialogViewController.selectedItemIndex
+            let keyname = dialogViewController.items![self.selectedItemIndex]
 //            self.citys[cityItem.dictLabel] = cityItem.dictValue
             var item:CityItem?
-            for cityItem in self!.cityItems {
+            for cityItem in self.cityItems {
                 if cityItem.dictLabel == keyname {
                     item = cityItem
                     break
                 }
             }
-            self?.city = item!.dictValue //编码
-            self?.cityPower = item!.remark //地区权重
-            self?.userlocation_textField.text = item?.dictLabel
+            self.city = item!.dictValue //编码
+            self.cityPower = item!.remark //地区权重
+            self.userlocation_textField.text = item?.dictLabel
             dialogViewController.hide()
         }
         dialogViewController.show()
-
     }
-
-    
     
 }

+ 17 - 11
JiaPeiManage/Sources/Modulars/Login/Controllers/BindingViewController.xib

@@ -11,6 +11,13 @@
     <objects>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BindingViewController" customModule="JiaPeiManage" customModuleProvider="target">
             <connections>
+                <outlet property="location_button" destination="h2F-xd-s0h" id="qXE-eS-L9R"/>
+                <outlet property="location_button_btn" destination="pvK-s6-zf7" id="NrE-RQ-z1i"/>
+                <outlet property="login_button" destination="EJi-fK-0p4" id="ktx-fR-ccX"/>
+                <outlet property="pwdshow_button" destination="cMu-ej-fDA" id="R9C-LT-rRZ"/>
+                <outlet property="userlocation_textField" destination="4Ib-QF-0bd" id="72l-Gf-zfM"/>
+                <outlet property="username_textField" destination="hP1-v2-PLq" id="eAc-ej-VD6"/>
+                <outlet property="userpassword_textField" destination="7Yx-vl-07y" id="NWa-b4-Twx"/>
                 <outlet property="view" destination="iN0-l3-epB" id="rnj-Vy-rbC"/>
             </connections>
         </placeholder>
@@ -26,19 +33,19 @@
                             <rect key="frame" x="0.0" y="0.0" width="375" height="700"/>
                             <subviews>
                                 <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="login_biand_wx" translatesAutoresizingMaskIntoConstraints="NO" id="ap2-6X-Dyy">
-                                    <rect key="frame" x="21" y="78" width="333" height="113"/>
+                                    <rect key="frame" x="26" y="90" width="323" height="79"/>
                                     <constraints>
-                                        <constraint firstAttribute="height" constant="113" id="OOa-z5-Kix"/>
+                                        <constraint firstAttribute="height" constant="79" id="OOa-z5-Kix"/>
                                     </constraints>
                                     <userDefinedRuntimeAttributes>
                                         <userDefinedRuntimeAttribute type="boolean" keyPath="aLRatio" value="YES"/>
                                     </userDefinedRuntimeAttributes>
                                 </imageView>
                                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eYE-nE-IRp">
-                                    <rect key="frame" x="15" y="236" width="345" height="380"/>
+                                    <rect key="frame" x="15" y="229" width="345" height="330"/>
                                     <subviews>
                                         <button opaque="NO" clipsSubviews="YES" alpha="0.5" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="EJi-fK-0p4">
-                                            <rect key="frame" x="28" y="285" width="289" height="45"/>
+                                            <rect key="frame" x="28" y="245" width="289" height="45"/>
                                             <color key="backgroundColor" red="0.20784313730000001" green="0.74901960779999999" blue="0.36862745099999999" alpha="1" colorSpace="calibratedRGB"/>
                                             <constraints>
                                                 <constraint firstAttribute="height" constant="45" id="xlq-e0-ZlO"/>
@@ -195,12 +202,11 @@
                                         <constraint firstItem="EJi-fK-0p4" firstAttribute="centerX" secondItem="VvG-ss-dbf" secondAttribute="centerX" id="6Ye-rz-ubj"/>
                                         <constraint firstItem="I8s-bJ-2lf" firstAttribute="leading" secondItem="eYE-nE-IRp" secondAttribute="leading" constant="25" id="9hD-04-n5k"/>
                                         <constraint firstItem="VvG-ss-dbf" firstAttribute="top" secondItem="I8s-bJ-2lf" secondAttribute="bottom" constant="20" id="B3J-PZ-NaE"/>
-                                        <constraint firstAttribute="bottom" secondItem="EJi-fK-0p4" secondAttribute="bottom" constant="50" id="Eeo-Xi-dj9"/>
-                                        <constraint firstItem="EJi-fK-0p4" firstAttribute="top" secondItem="mVu-Hc-WdF" secondAttribute="bottom" constant="70" id="F9R-2e-JcA"/>
+                                        <constraint firstItem="EJi-fK-0p4" firstAttribute="top" secondItem="mVu-Hc-WdF" secondAttribute="bottom" constant="30" id="F9R-2e-JcA"/>
                                         <constraint firstItem="VvG-ss-dbf" firstAttribute="top" secondItem="I8s-bJ-2lf" secondAttribute="bottom" constant="20" id="Iha-K1-svL"/>
                                         <constraint firstAttribute="trailing" secondItem="mVu-Hc-WdF" secondAttribute="trailing" constant="25" id="PB4-vT-Krg"/>
                                         <constraint firstAttribute="trailing" secondItem="I8s-bJ-2lf" secondAttribute="trailing" constant="25" id="UuL-mQ-fx3"/>
-                                        <constraint firstAttribute="height" constant="380" id="at4-6l-amg"/>
+                                        <constraint firstAttribute="height" constant="330" id="at4-6l-amg"/>
                                         <constraint firstItem="mVu-Hc-WdF" firstAttribute="top" secondItem="VvG-ss-dbf" secondAttribute="bottom" constant="20" id="lnu-hz-BDq"/>
                                         <constraint firstItem="VvG-ss-dbf" firstAttribute="leading" secondItem="eYE-nE-IRp" secondAttribute="leading" constant="25" id="nGW-Ae-6fQ"/>
                                         <constraint firstItem="EJi-fK-0p4" firstAttribute="centerX" secondItem="mVu-Hc-WdF" secondAttribute="centerX" id="p6h-QN-6o2"/>
@@ -222,10 +228,10 @@
                                 <constraint firstAttribute="height" constant="700" id="D8i-7f-ykn"/>
                                 <constraint firstAttribute="trailing" secondItem="eYE-nE-IRp" secondAttribute="trailing" constant="15" id="O3G-c2-N0Z"/>
                                 <constraint firstItem="eYE-nE-IRp" firstAttribute="leading" secondItem="6ve-8a-5wn" secondAttribute="leading" constant="15" id="PJr-is-kmv"/>
-                                <constraint firstAttribute="trailing" secondItem="ap2-6X-Dyy" secondAttribute="trailing" constant="21" id="edD-sm-hXs"/>
-                                <constraint firstItem="eYE-nE-IRp" firstAttribute="top" secondItem="ap2-6X-Dyy" secondAttribute="bottom" constant="45" id="fC6-Wv-rdh"/>
-                                <constraint firstItem="ap2-6X-Dyy" firstAttribute="leading" secondItem="6ve-8a-5wn" secondAttribute="leading" constant="21" id="leI-mU-NuS"/>
-                                <constraint firstItem="ap2-6X-Dyy" firstAttribute="top" secondItem="6ve-8a-5wn" secondAttribute="top" constant="78" id="qLv-bv-SKX"/>
+                                <constraint firstAttribute="trailing" secondItem="ap2-6X-Dyy" secondAttribute="trailing" constant="26" id="edD-sm-hXs"/>
+                                <constraint firstItem="eYE-nE-IRp" firstAttribute="top" secondItem="ap2-6X-Dyy" secondAttribute="bottom" constant="60" id="fC6-Wv-rdh"/>
+                                <constraint firstItem="ap2-6X-Dyy" firstAttribute="leading" secondItem="6ve-8a-5wn" secondAttribute="leading" constant="26" id="leI-mU-NuS"/>
+                                <constraint firstItem="ap2-6X-Dyy" firstAttribute="top" secondItem="6ve-8a-5wn" secondAttribute="top" constant="90" id="qLv-bv-SKX"/>
                             </constraints>
                         </view>
                     </subviews>

+ 76 - 16
JiaPeiManage/Sources/Modulars/Login/Controllers/LoginViewController.swift

@@ -9,6 +9,7 @@ import UIKit
 import RxSwift
 import RxCocoa
 import SwiftyUserDefaults
+import AuthenticationServices
 
 final class LoginViewController: BaseViewController {
     
@@ -47,6 +48,8 @@ final class LoginViewController: BaseViewController {
     var cityItems:[CityItem] = []
     var citys: [String:String] = [:]
     var selectedItemIndex = 0
+    
+    var type = 0
     override func viewDidLoad() {
         super.viewDidLoad()
         setupUI()
@@ -105,12 +108,10 @@ final class LoginViewController: BaseViewController {
             NSLog("loginObserver")
             self.login_button.alpha = valid ? 1 : 0.5
         }).disposed(by: disposeBag)
-        
         //用户协议
         userprotocol_button.rx.tap.subscribe ({ [unowned self] (_)  in
-            NYSwRouter.push(NYSwPushType.login_biand_wx.path)
             //跳web
-//            navigator.push("https://ys.zzxcx.net/xy_jlgj.html")
+            navigator.push("https://ys.zzxcx.net/xy_jlgj.html")
         }).disposed(by: disposeBag)
         //隐私
         userprivacy_button.rx.tap.subscribe ({ [unowned self] (_)  in
@@ -134,6 +135,10 @@ final class LoginViewController: BaseViewController {
         wxin_button.rx.tap.subscribe ({ [unowned self] (_)  in
             self.showDialog(type: 1)
         }).disposed(by: disposeBag)
+        //apple id
+        apple_button.rx.tap.subscribe ({ [unowned self] (_)  in
+            self.performSignIn()
+        }).disposed(by: disposeBag)
         //登录
         login_button.rx.tap
                     .asObservable()
@@ -184,7 +189,7 @@ final class LoginViewController: BaseViewController {
                 NYTips.hide()
                 //判断是否有 openid
                 let data = model.data as AuthorizationDataInfoModel
-                if data.openid == "" {
+                if data.coach != nil  {
                     //已经绑定直接登录
                     LocalManager.userInfo.userAccount = data.coach?.idcard
                     LocalManager.userInfo.password = data.coach?.password
@@ -196,14 +201,18 @@ final class LoginViewController: BaseViewController {
                     self.dismiss(animated: true)
                 }else{
                     //未绑定-跳转绑定
-                    NYSwRouter.push(NYSwPushType.login_biand_wx.path)
+//                    NYSwRouter.push(NYSwPushType.login_biand_wx,context: data.openid)
+                    let bindingViewController = BindingViewController(nibName: "BindingViewController")
+                    bindingViewController.openid = data.openid
+                    self.addChild(bindingViewController)
+                    self.view.addSubview(bindingViewController.view)
                 }
             }, onError: { error in
                 NYTips.hide()
                 //NYTips.showErr(txt: (error as! RequestError).errorDescription)
                 print("%@",error)
             })
-            .disposed(by: disposeBag)
+            .disposed(by: self.disposeBag)
         }).disposed(by: disposeBag)
         //添加手势
         let tapBackground = UITapGestureRecognizer()
@@ -215,39 +224,40 @@ final class LoginViewController: BaseViewController {
         view.addGestureRecognizer(tapBackground)
     }
     
-    
     func showDialog(type:Int){
-        
+        self.type = type
         let dialogViewController = QMUIDialogSelectionViewController()
         dialogViewController.title = "请选择地区"
         dialogViewController.items = Array(citys.keys)
         dialogViewController.selectedItemIndex = selectedItemIndex
         dialogViewController.addCancelButton(withText: "取消", block: nil)
-        dialogViewController.addSubmitButton(withText: "确定") { [weak self] dialogViewController in
+        dialogViewController.addSubmitButton(withText: "确定") { [unowned self] dialogViewController in
             guard let dialogViewController:QMUIDialogSelectionViewController = dialogViewController as? QMUIDialogSelectionViewController else { return }
             if dialogViewController.selectedItemIndex == QMUIDialogSelectionViewControllerSelectedItemIndexNone {
                 NYTips.showErr(txt: "请至少选一个")
                 return
             }
-            self?.selectedItemIndex = dialogViewController.selectedItemIndex
-            let keyname = dialogViewController.items![self!.selectedItemIndex]
+            if dialogViewController.items?.count == 0 {return}
+            let ItemIndex = dialogViewController.selectedItemIndex
+            self.selectedItemIndex = ItemIndex
+            let keyname = dialogViewController.items![self.selectedItemIndex]
 //            self.citys[cityItem.dictLabel] = cityItem.dictValue
             var item:CityItem?
-            for cityItem in self!.cityItems {
+            for cityItem in self.cityItems {
                 if cityItem.dictLabel == keyname {
                     item = cityItem
                     break
                 }
             }
-            self?.city = item!.dictValue //编码
-            self?.cityPower = item!.remark //地区权重
-            if (type==1){//微信登录
+            self.city = item!.dictValue //编码
+            self.cityPower = item!.remark //地区权重
+            if (self.type==1){//微信登录
                 let city = item!.dictValue //编码
                 NYWXApiManager.shared.sendWxapi(city: city)
                 dialogViewController.hide()
                 return
             }
-            self?.userlocation_textField.text = item?.dictLabel
+            self.userlocation_textField.text = item?.dictLabel
             dialogViewController.hide()
         }
         dialogViewController.show()
@@ -255,3 +265,53 @@ final class LoginViewController: BaseViewController {
     }
     
 }
+
+extension LoginViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {
+    func performSignIn() {
+        if #available(iOS 13.0, *) {
+            let appleIDProvider = ASAuthorizationAppleIDProvider()
+            let request = appleIDProvider.createRequest()
+            request.requestedScopes = [.fullName, .email]
+            
+            let authorizationController = ASAuthorizationController(authorizationRequests: [request])
+            authorizationController.delegate = self
+            authorizationController.presentationContextProvider = self
+            authorizationController.performRequests()
+        } else {
+            // Fallback on earlier versions
+        }
+        
+    }
+    
+    // ASAuthorizationControllerDelegate methods
+    @available(iOS 13.0, *)
+    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
+        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
+            // Get the user's unique Apple ID and user information
+            let userIdentifier = appleIDCredential.user
+            let fullName = appleIDCredential.fullName
+            let email = appleIDCredential.email
+            
+            // Handle the user data as needed
+            print("User ID: \(userIdentifier)")
+            if let fullName = fullName {
+                print("Full Name: \(fullName.givenName ?? "") \(fullName.familyName ?? "")")
+            }
+            if let email = email {
+                print("Email: \(email)")
+            }
+        }
+    }
+    
+    @available(iOS 13.0, *)
+    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
+        // Handle sign-in errors
+        print("Sign In with Apple failed: \(error.localizedDescription)")
+    }
+    
+    // ASAuthorizationControllerPresentationContextProviding method
+    @available(iOS 13.0, *)
+    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
+        return view.window!
+    }
+}

+ 2 - 1
JiaPeiManage/Sources/Modulars/Login/Controllers/LoginViewController.xib

@@ -322,7 +322,7 @@
                                         <constraint firstAttribute="height" constant="42" id="l9i-N1-Qbl"/>
                                     </constraints>
                                     <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
-                                    <state key="normal" image="login_sdx"/>
+                                    <state key="normal" image="Apple"/>
                                 </button>
                             </subviews>
                             <color key="backgroundColor" red="0.023529411764705882" green="0.12549019607843137" blue="0.22745098039215686" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -364,6 +364,7 @@
         </view>
     </objects>
     <resources>
+        <image name="Apple" width="42" height="42"/>
         <image name="login_ID" width="32" height="26"/>
         <image name="login_arrow" width="16" height="12"/>
         <image name="login_hello" width="334" height="113"/>

+ 16 - 1
JiaPeiManage/Sources/Modulars/Mine/Controllers/MineViewController.swift

@@ -14,6 +14,7 @@ final class MineViewController: BaseViewController {
     
     // MARK: 服务属性
     private let cocahService: CoachServiceType = CoachService(networking: CoachNetworking())
+    private let loginService: LoginServiceType = LoginService(networking: LoginNetworking())
     
     // MARK: UI属性
 //    @IBOutlet weak var nav_top_layout: NSLayoutConstraint!
@@ -39,7 +40,8 @@ final class MineViewController: BaseViewController {
     @IBOutlet weak var quit_button: UIButton!
     //教练身份
     @IBOutlet weak var classType_button: UIButton!
-    
+    //解除绑定
+    @IBOutlet weak var unbindwx_button: UIButton!
     
     override func viewDidLoad() {
         super.viewDidLoad()
@@ -76,6 +78,19 @@ final class MineViewController: BaseViewController {
         switch_button.rx.tap.subscribe ({  [unowned self] (_) in
             NYSwRouter.push(NYSwPushType.mine_switchaccount.path)
         }).disposed(by: disposeBag)
+        //解除绑定
+        unbindwx_button.rx.tap.subscribe ({  [unowned self] (_) in
+            self.loginService.unbiandUserRequest(idcard: LocalManager.userInfo.idcard, user_password: LocalManager.userInfo.password!, city: LocalManager.userInfo.city!).subscribe(onSuccess: {[unowned self] msgData in
+                if msgData.data as! Int == 1 {
+                    NYTips.showMsg(txt: "解绑成功")
+                }
+            }, onError: { error in
+                NYTips.hide()
+                NYTips.showErr(txt: (error as! RequestError).errorDescription)
+                print("%@",error)
+            })
+            .disposed(by: self.disposeBag)
+        }).disposed(by: disposeBag)
         
     }
     //绑定-rx

+ 21 - 0
JiaPeiManage/Sources/Modulars/Mine/Controllers/MineViewController.xib

@@ -19,6 +19,7 @@
                 <outlet property="school_address_label" destination="fJC-Qf-3Nv" id="C7z-R9-ERM"/>
                 <outlet property="schoolname_label" destination="h6R-dN-eLm" id="Si0-F8-vLI"/>
                 <outlet property="switch_button" destination="LC7-q3-Z4X" id="KEB-Ol-9Kk"/>
+                <outlet property="unbindwx_button" destination="hnq-la-yDy" id="Q8i-xB-e19"/>
                 <outlet property="update_password_button" destination="BM3-xf-AcJ" id="zkl-E6-hkN"/>
                 <outlet property="user_icon_imageview" destination="3wG-uo-AO3" id="XUw-Ei-afC"/>
                 <outlet property="user_name_label" destination="km9-Iu-GaJ" id="PYp-mh-Ugs"/>
@@ -186,6 +187,24 @@
                                                 </userDefinedRuntimeAttribute>
                                             </userDefinedRuntimeAttributes>
                                         </button>
+                                        <button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hnq-la-yDy">
+                                            <rect key="frame" x="274" y="126.66666666666666" width="86" height="24"/>
+                                            <color key="backgroundColor" red="0.20784313730000001" green="0.74901960779999999" blue="0.36862745099999999" alpha="1" colorSpace="calibratedRGB"/>
+                                            <constraints>
+                                                <constraint firstAttribute="height" constant="24" id="GOh-oR-xwD"/>
+                                                <constraint firstAttribute="width" constant="86" id="NKn-Il-of3"/>
+                                            </constraints>
+                                            <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                                            <state key="normal" title="解除微信绑定"/>
+                                            <userDefinedRuntimeAttributes>
+                                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                                    <real key="value" value="12"/>
+                                                </userDefinedRuntimeAttribute>
+                                                <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                                    <real key="value" value="0.0"/>
+                                                </userDefinedRuntimeAttribute>
+                                            </userDefinedRuntimeAttributes>
+                                        </button>
                                     </subviews>
                                     <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                     <constraints>
@@ -196,6 +215,7 @@
                                         <constraint firstAttribute="height" constant="204" id="Ehx-NT-r98"/>
                                         <constraint firstItem="hHJ-eR-539" firstAttribute="leading" secondItem="r8b-Dg-5b7" secondAttribute="leading" id="EsH-tx-CqQ"/>
                                         <constraint firstItem="yyB-jf-xyI" firstAttribute="top" secondItem="km9-Iu-GaJ" secondAttribute="bottom" constant="8" id="GX3-Wd-0Ob"/>
+                                        <constraint firstAttribute="trailing" secondItem="hnq-la-yDy" secondAttribute="trailing" constant="15" id="IYA-Qc-8Dd"/>
                                         <constraint firstItem="km9-Iu-GaJ" firstAttribute="centerX" secondItem="r8b-Dg-5b7" secondAttribute="centerX" id="Jrg-Ue-459"/>
                                         <constraint firstItem="yyB-jf-xyI" firstAttribute="centerX" secondItem="r8b-Dg-5b7" secondAttribute="centerX" id="LE2-5Y-7uQ"/>
                                         <constraint firstItem="3wG-uo-AO3" firstAttribute="top" secondItem="r8b-Dg-5b7" secondAttribute="top" constant="46" id="OES-He-aCg"/>
@@ -204,6 +224,7 @@
                                         <constraint firstItem="SJe-10-4Xc" firstAttribute="trailing" secondItem="BM3-xf-AcJ" secondAttribute="trailing" constant="-30" id="U4c-uA-sHd"/>
                                         <constraint firstItem="3wG-uo-AO3" firstAttribute="centerX" secondItem="r8b-Dg-5b7" secondAttribute="centerX" id="VZN-Pc-o04"/>
                                         <constraint firstItem="SJe-10-4Xc" firstAttribute="centerY" secondItem="BM3-xf-AcJ" secondAttribute="centerY" id="eht-5b-5n2"/>
+                                        <constraint firstItem="hnq-la-yDy" firstAttribute="centerY" secondItem="9Kk-gv-HeL" secondAttribute="centerY" id="fC0-9y-YQX"/>
                                         <constraint firstItem="km9-Iu-GaJ" firstAttribute="top" secondItem="3wG-uo-AO3" secondAttribute="bottom" constant="15" id="hmj-Pp-NL1"/>
                                         <constraint firstAttribute="trailing" secondItem="yvy-Cs-c2n" secondAttribute="trailing" id="rtq-ee-ox9"/>
                                         <constraint firstItem="yvy-Cs-c2n" firstAttribute="leading" secondItem="r8b-Dg-5b7" secondAttribute="leading" id="tPb-7C-JnJ"/>

+ 1 - 1
JiaPeiManage/Sources/Services/LoginAPI.swift

@@ -100,7 +100,7 @@ extension LoginAPI: TargetType {
     
     var headers: [String: String]? {
         switch self {
-        case .updateUser,.authorizationCode:
+        case .updateUser,.authorizationCode,.biandUser,.unbiandUser:
             return ["Content-Type":"application/x-www-form-urlencoded"]
         default:
             return ["Content-Type":"application/json"]

+ 6 - 6
JiaPeiManage/Sources/Services/LoginService.swift

@@ -20,9 +20,9 @@ protocol LoginServiceType {
     //授权
     func authorizationRequest(code: String, city:String) -> Single<AuthorizationDataModel>
     //绑定
-    func biandUserRequest(idcard:String, user_password:String, openid:String,city:String) -> Single<AuthorizationDataModel>
+    func biandUserRequest(idcard:String, user_password:String, openid:String,city:String) -> Single<UserInfo>
     //解绑
-    func unbiandUserRequest(idcard:String, user_password:String, city:String) -> Single<AuthorizationDataModel>
+    func unbiandUserRequest(idcard:String, user_password:String, city:String) -> Single<JpMsgDataModel>
     
 }
 
@@ -58,13 +58,13 @@ final class LoginService: LoginServiceType {
         return networking.request(api).map(AuthorizationDataModel.self,isModel: true)
     }
     
-    func biandUserRequest(idcard: String, user_password: String, openid: String, city: String) -> RxSwift.Single<AuthorizationDataModel> {
+    func biandUserRequest(idcard: String, user_password: String, openid: String, city: String) -> RxSwift.Single<UserInfo> {
         let api = LoginAPI.biandUser(idcard: idcard, user_password: user_password, openid: openid, city: city)
-        return networking.request(api).map(AuthorizationDataModel.self,isModel: true)
+        return networking.request(api).map(UserInfo.self)
     }
     
-    func unbiandUserRequest(idcard: String, user_password: String, city: String) -> RxSwift.Single<AuthorizationDataModel> {
+    func unbiandUserRequest(idcard: String, user_password: String, city: String) -> RxSwift.Single<JpMsgDataModel> {
         let api = LoginAPI.unbiandUser(idcard: idcard, user_password: user_password, city: city)
-        return networking.request(api).map(AuthorizationDataModel.self,isModel: true)
+        return networking.request(api).map(JpMsgDataModel.self,isModel: true)
     }
 }

+ 8 - 7
JiaPeiManage/Sources/Utils/NYWXApiManager.swift

@@ -10,11 +10,13 @@ import SwiftyJSON
 import RxSwift
 
 class NYWXApiManager : NSObject {
-    
+    // MARK: Rx
+    var disposeBag = DisposeBag()
+    // MARK: 服务属性
+    private let loginService: LoginServiceType = LoginService(networking: LoginNetworking())
     //rxcode 回调
     let blockSubject = PublishSubject<String>()
     var city:String = ""
-    var code:String = ""
     // 静态属性,用于存储单例实例
     static let shared = NYWXApiManager()
     override init() {
@@ -31,10 +33,10 @@ class NYWXApiManager : NSObject {
         if  isSuccess {
             print("微信初始化成功")
         }
-        //调用自检函数
-        WXApi.checkUniversalLinkReady { step, result in
-            print("%@, %u, %@, %@", step, result.success, result.errorInfo, result.suggestion)
-        }
+//        //调用自检函数
+//        WXApi.checkUniversalLinkReady { step, result in
+//            print("%@, %u, %@, %@", step, result.success, result.errorInfo, result.suggestion)
+//        }
     }
     
     //发起微信send
@@ -82,7 +84,6 @@ extension NYWXApiManager :WXApiDelegate {
             DispatchQueue.main.async { [unowned self] in
                 if aresp.errCode == 0 {
                     if let code = aresp.code {
-                        self.code = code
                         //这里拿到code之后 对接服务器接口
                         //这步 相当于账号密码登录的流程 返回用户信息
                         //后端这个接口返回的数据需要判断是第一次授权还是 不是第一次授权,第一次授权需要去绑定手机号界面,不是第一次授权就直接跳转到首页,登录成功

+ 5 - 2
JiaPeiManage/Sources/Utils/URLNavigationMap.swift

@@ -110,9 +110,12 @@ final class URLNavigationMap {
             return switchAccountViewController
         }
         navigator.register(NYSwPushType.login_biand_wx.path) { (url, values, context) -> UIViewController? in
-
+            
             let bindingViewController = BindingViewController(nibName: "BindingViewController")
-            return bindingViewController ?? UIViewController()
+            bindingViewController.openid = context as! String
+            return bindingViewController
+//            let testBingVC = testBingVC(nibName: "testBingVC")
+//            return testBingVC
         }
         
         //open api