Przeglądaj źródła

我的页面,账户安全测试完成,绑定微信又有问题

南鑫林 6 lat temu
rodzic
commit
32e45efab7
36 zmienionych plików z 938 dodań i 184 usunięć
  1. 40 4
      RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj
  2. 2 2
      RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+Window.swift
  3. 28 0
      RainbowPlanet/RainbowPlanet/Base/BaseViewController/BaseViewController.swift
  4. 4 0
      RainbowPlanet/RainbowPlanet/Macro/Common.swift
  5. 8 8
      RainbowPlanet/RainbowPlanet/Manager/UMManager/UMManager.swift
  6. 6 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/AccountSecurity/View/AccountSecuritySetTableViewCell.swift
  7. 41 1
      RainbowPlanet/RainbowPlanet/Modules/MineModule/AccountSecurity/View/AccountSecurityTableViewCell.swift
  8. 1 1
      RainbowPlanet/RainbowPlanet/Modules/MineModule/AccountSecurity/View/AccountSecurityView.swift
  9. 76 1
      RainbowPlanet/RainbowPlanet/Modules/MineModule/AccountSecurity/ViewController/AccountSecurityViewController.swift
  10. 9 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/AddressManager/View/AddressManagerView.swift
  11. 7 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/AddressManager/ViewController/AddressManagerViewController.swift
  12. 20 1
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Message/View/MessageNoticeHeaderCollectionReusableView.swift
  13. 53 2
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Message/View/MessageView.swift
  14. 1 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/MessageDetailes/View/MessageDetailesTableViewCell.swift
  15. 1 1
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/View/MineNavigationBarView.swift
  16. 4 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/View/MineServiceTableViewCell.swift
  17. 8 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/View/MineTableViewHeaderView.swift
  18. 2 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/View/MineView.swift
  19. 5 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/ViewController/MineViewController.swift
  20. 5 2
      RainbowPlanet/RainbowPlanet/Modules/MineModule/Set/ViewController/SetViewController.swift
  21. 44 2
      RainbowPlanet/RainbowPlanet/Modules/MineModule/SetPassword/View/SetPasswordView.swift
  22. 24 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/SetPassword/ViewController/SetPasswordViewController.swift
  23. 39 11
      RainbowPlanet/RainbowPlanet/Modules/RegisterLoginModule/BindPhoneNumber/ViewController/BindPhoneNumberViewController.swift
  24. 6 6
      RainbowPlanet/RainbowPlanet/Modules/RegisterLoginModule/RegisterLogin/ViewController/RegisterLoginViewController.swift
  25. 54 0
      RainbowPlanet/RainbowPlanet/Service/Model/UserModel/AddressManagerListModel.swift
  26. 23 15
      RainbowPlanet/RainbowPlanet/Service/Model/UserModel/LoginModel.swift
  27. 2 2
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkManager/ApiMacro.swift
  28. 18 16
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkManager/SwiftMoyaNetWorkManager.swift
  29. 39 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceConfig/SwiftMoyaNetWorkServiceConfig.swift
  30. 81 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceConfig/SwiftMoyaServiceConfigApi.swift
  31. 1 1
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceSMS/SwiftMoyaNetWorkServiceSMS.swift
  32. 156 76
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceUser/SwiftMoyaNetWorkServiceUser.swift
  33. 52 31
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceUser/SwiftMoyaServiceUserApi.swift
  34. 1 1
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftSign/SwiftSign.swift
  35. 50 0
      RainbowPlanet/RainbowPlanet/Tools/AuthorizationSwift/AuthorizationSwift.swift
  36. 27 0
      RainbowPlanet/RainbowPlanet/Tools/Extension/Extension+UINavigationController.swift

+ 40 - 4
RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj

@@ -15,6 +15,11 @@
 		A71AA5152272160A008FF1A5 /* ExpressAddressListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA5142272160A008FF1A5 /* ExpressAddressListTableViewCell.swift */; };
 		A71AA519227219D7008FF1A5 /* EditExpressAddressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA518227219D7008FF1A5 /* EditExpressAddressViewController.swift */; };
 		A71AA51C227219EF008FF1A5 /* EditExpressAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA51B227219EF008FF1A5 /* EditExpressAddressView.swift */; };
+		A71AA51F22729F35008FF1A5 /* AuthorizationSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA51E22729F35008FF1A5 /* AuthorizationSwift.swift */; };
+		A71AA5212272E527008FF1A5 /* Extension+UINavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA5202272E527008FF1A5 /* Extension+UINavigationController.swift */; };
+		A71AA52322731CFB008FF1A5 /* AddressManagerListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA52222731CFB008FF1A5 /* AddressManagerListModel.swift */; };
+		A71AA52622732068008FF1A5 /* SwiftMoyaServiceConfigApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA52522732068008FF1A5 /* SwiftMoyaServiceConfigApi.swift */; };
+		A71AA52822732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AA52722732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift */; };
 		A71AF0A6226EDDC8001730FE /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AF0A5226EDDC8001730FE /* SearchViewController.swift */; };
 		A71AF0AA226EDDF5001730FE /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AF0A9226EDDF5001730FE /* SearchView.swift */; };
 		A71AF0AC226EDE37001730FE /* SearchNavigationbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A71AF0AB226EDE37001730FE /* SearchNavigationbarView.swift */; };
@@ -29,7 +34,7 @@
 		A71D2A6522657D5900A55D16 /* UIScrollView+MJRefreshEX.m in Sources */ = {isa = PBXBuildFile; fileRef = A71D2A6322657D5900A55D16 /* UIScrollView+MJRefreshEX.m */; };
 		A72843FC224DB6B800F82F30 /* SwiftMoyaServiceUserApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72843FB224DB6B800F82F30 /* SwiftMoyaServiceUserApi.swift */; };
 		A7284401224DBB7700F82F30 /* SwiftMoyaNetWorkServiceUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7284400224DBB7700F82F30 /* SwiftMoyaNetWorkServiceUser.swift */; };
-		A7284404224DBFBD00F82F30 /* LoginModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7284403224DBFBD00F82F30 /* LoginModel.swift */; };
+		A7284404224DBFBD00F82F30 /* UserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7284403224DBFBD00F82F30 /* UserModel.swift */; };
 		A7284440224DFACD00F82F30 /* InfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A728443F224DFACD00F82F30 /* InfoModel.swift */; };
 		A7284A522252EE9A000BAEC4 /* RootModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7284A512252EE9A000BAEC4 /* RootModel.swift */; };
 		A7284A542252FB5C000BAEC4 /* PaginationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7284A532252FB5C000BAEC4 /* PaginationModel.swift */; };
@@ -220,6 +225,11 @@
 		A71AA5142272160A008FF1A5 /* ExpressAddressListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpressAddressListTableViewCell.swift; sourceTree = "<group>"; };
 		A71AA518227219D7008FF1A5 /* EditExpressAddressViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditExpressAddressViewController.swift; sourceTree = "<group>"; };
 		A71AA51B227219EF008FF1A5 /* EditExpressAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditExpressAddressView.swift; sourceTree = "<group>"; };
+		A71AA51E22729F35008FF1A5 /* AuthorizationSwift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthorizationSwift.swift; sourceTree = "<group>"; };
+		A71AA5202272E527008FF1A5 /* Extension+UINavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extension+UINavigationController.swift"; sourceTree = "<group>"; };
+		A71AA52222731CFB008FF1A5 /* AddressManagerListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressManagerListModel.swift; sourceTree = "<group>"; };
+		A71AA52522732068008FF1A5 /* SwiftMoyaServiceConfigApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaServiceConfigApi.swift; sourceTree = "<group>"; };
+		A71AA52722732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaNetWorkServiceConfig.swift; sourceTree = "<group>"; };
 		A71AF0A5226EDDC8001730FE /* SearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = "<group>"; };
 		A71AF0A9226EDDF5001730FE /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = "<group>"; };
 		A71AF0AB226EDE37001730FE /* SearchNavigationbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationbarView.swift; sourceTree = "<group>"; };
@@ -235,7 +245,7 @@
 		A71D2A6422657D5900A55D16 /* UIScrollView+MJRefreshEX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+MJRefreshEX.h"; sourceTree = "<group>"; };
 		A72843FB224DB6B800F82F30 /* SwiftMoyaServiceUserApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaServiceUserApi.swift; sourceTree = "<group>"; };
 		A7284400224DBB7700F82F30 /* SwiftMoyaNetWorkServiceUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaNetWorkServiceUser.swift; sourceTree = "<group>"; };
-		A7284403224DBFBD00F82F30 /* LoginModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginModel.swift; sourceTree = "<group>"; };
+		A7284403224DBFBD00F82F30 /* UserModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserModel.swift; sourceTree = "<group>"; };
 		A728443F224DFACD00F82F30 /* InfoModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InfoModel.swift; sourceTree = "<group>"; };
 		A7284A512252EE9A000BAEC4 /* RootModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootModel.swift; sourceTree = "<group>"; };
 		A7284A532252FB5C000BAEC4 /* PaginationModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaginationModel.swift; sourceTree = "<group>"; };
@@ -515,6 +525,23 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		A71AA51D22729F0B008FF1A5 /* AuthorizationSwift */ = {
+			isa = PBXGroup;
+			children = (
+				A71AA51E22729F35008FF1A5 /* AuthorizationSwift.swift */,
+			);
+			path = AuthorizationSwift;
+			sourceTree = "<group>";
+		};
+		A71AA5242273202E008FF1A5 /* SwiftMoyaServiceConfig */ = {
+			isa = PBXGroup;
+			children = (
+				A71AA52522732068008FF1A5 /* SwiftMoyaServiceConfigApi.swift */,
+				A71AA52722732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift */,
+			);
+			path = SwiftMoyaServiceConfig;
+			sourceTree = "<group>";
+		};
 		A71AF0A3226E9D8A001730FE /* SearchModule */ = {
 			isa = PBXGroup;
 			children = (
@@ -590,6 +617,7 @@
 		A71D2A612265756E00A55D16 /* SwiftMoyaServiceApi */ = {
 			isa = PBXGroup;
 			children = (
+				A71AA5242273202E008FF1A5 /* SwiftMoyaServiceConfig */,
 				A72843FD224DB79400F82F30 /* SwiftMoyaServiceUser */,
 				A7C3DD182264229900FA262E /* SwiftMoyaServiceSMS */,
 				A7284A7122546441000BAEC4 /* SwiftMoyaServicePay */,
@@ -619,8 +647,9 @@
 		A7284402224DBE3500F82F30 /* UserModel */ = {
 			isa = PBXGroup;
 			children = (
-				A7284403224DBFBD00F82F30 /* LoginModel.swift */,
+				A7284403224DBFBD00F82F30 /* UserModel.swift */,
 				A7CC74E52270628B003C4F38 /* DeliveryMethodTypeModel.swift */,
+				A71AA52222731CFB008FF1A5 /* AddressManagerListModel.swift */,
 			);
 			path = UserModel;
 			sourceTree = "<group>";
@@ -874,6 +903,7 @@
 				A7778CB92244F14B00C7C47A /* Extension+UIViewController.swift */,
 				A70EBBBF22561179000AD74F /* Extension+UITableView.swift */,
 				A738D201225AD6AD00EEE860 /* Extension+UICollectionView.swift */,
+				A71AA5202272E527008FF1A5 /* Extension+UINavigationController.swift */,
 			);
 			path = Extension;
 			sourceTree = "<group>";
@@ -1384,6 +1414,7 @@
 		A77F2CBC2232022A001BD3F6 /* Tools */ = {
 			isa = PBXGroup;
 			children = (
+				A71AA51D22729F0B008FF1A5 /* AuthorizationSwift */,
 				A73D7C662268A032002A4CE3 /* SwiftyStarRatingView */,
 				A729B5A62266DBFA004AE098 /* AlertSheetView */,
 				A71D2A6222657D5900A55D16 /* MJRefreshEX */,
@@ -2016,7 +2047,7 @@
 				A7BB68672269B1DD00AB07A2 /* AddressPOIViewController.swift in Sources */,
 				A7284A7322546460000BAEC4 /* SwiftMoyaServicePayApi.swift in Sources */,
 				A7CC74DC2270352F003C4F38 /* MineOrderCollectionViewCell.swift in Sources */,
-				A7284404224DBFBD00F82F30 /* LoginModel.swift in Sources */,
+				A7284404224DBFBD00F82F30 /* UserModel.swift in Sources */,
 				A7CC74D822700359003C4F38 /* MineTableViewHeaderView.swift in Sources */,
 				A71D2A602265673A00A55D16 /* RegisterLoginView.swift in Sources */,
 				A73D7C682268A032002A4CE3 /* SwiftyStarRatingView.swift in Sources */,
@@ -2037,6 +2068,7 @@
 				A72A726822321DBD00B21995 /* UMManager.swift in Sources */,
 				A729B5AD2266FF45004AE098 /* BindPhoneNumberView.swift in Sources */,
 				A7CC74E62270628B003C4F38 /* DeliveryMethodTypeModel.swift in Sources */,
+				A71AA51F22729F35008FF1A5 /* AuthorizationSwift.swift in Sources */,
 				A7824AFD2271EAC900ABA381 /* SelfMentionAddressListTableViewCell.swift in Sources */,
 				A7CC74DA22702E41003C4F38 /* MineOrderTableViewCell.swift in Sources */,
 				A77F2CB92232010F001BD3F6 /* ShoppingCartViewController.swift in Sources */,
@@ -2056,6 +2088,7 @@
 				A72A73142232475E00B21995 /* AlipayManager.swift in Sources */,
 				A7824B042271F10300ABA381 /* EditSelfMentionAddressView.swift in Sources */,
 				A71AF0B6226EF99A001730FE /* SearchResultViewController.swift in Sources */,
+				A71AA52322731CFB008FF1A5 /* AddressManagerListModel.swift in Sources */,
 				A72A72D522321E2700B21995 /* ColorMacro.swift in Sources */,
 				A72A7333223256E100B21995 /* PayManager.swift in Sources */,
 				A775CC00223774A300EBDCF8 /* ShoppingMallView.swift in Sources */,
@@ -2076,6 +2109,7 @@
 				A7CC75432271E038003C4F38 /* SelfMentionAddressListViewController.swift in Sources */,
 				A7778CDF22461BAD00C7C47A /* PhoneCountryAreaSectionHeaderView.swift in Sources */,
 				A7CC751A22716254003C4F38 /* SetTableViewCell.swift in Sources */,
+				A71AA52822732173008FF1A5 /* SwiftMoyaNetWorkServiceConfig.swift in Sources */,
 				A775CC0322377C6500EBDCF8 /* EmptyView.swift in Sources */,
 				A72A72A922321DE000B21995 /* NumberKeyboard.swift in Sources */,
 				A72A72AA22321DE000B21995 /* Log.swift in Sources */,
@@ -2106,6 +2140,7 @@
 				A72A72C322321DE000B21995 /* Extension+Date.swift in Sources */,
 				A7778CAB2244B12500C7C47A /* CountDownManager.swift in Sources */,
 				A775CBFE2237493600EBDCF8 /* ShoppingMallNavigationBarView.swift in Sources */,
+				A71AA5212272E527008FF1A5 /* Extension+UINavigationController.swift in Sources */,
 				A7CC751822716202003C4F38 /* SetView.swift in Sources */,
 				A72A72C622321DE000B21995 /* WebView.swift in Sources */,
 				A72A72D122321E2700B21995 /* HTMLURLMacro.swift in Sources */,
@@ -2121,6 +2156,7 @@
 				A71AF0AA226EDDF5001730FE /* SearchView.swift in Sources */,
 				A7284A542252FB5C000BAEC4 /* PaginationModel.swift in Sources */,
 				A72A72D022321E2700B21995 /* FontMacro.swift in Sources */,
+				A71AA52622732068008FF1A5 /* SwiftMoyaServiceConfigApi.swift in Sources */,
 				A77F2C982231FD25001BD3F6 /* BaseNavigationViewController.swift in Sources */,
 				A7824AFB2271EA2600ABA381 /* SelfMentionAddressListView.swift in Sources */,
 				A72A72AB22321DE000B21995 /* SwiftProgressHUD.swift in Sources */,

+ 2 - 2
RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+Window.swift

@@ -16,7 +16,7 @@ extension AppDelegate {
         window?.backgroundColor = UIColor.white
         window?.makeKeyAndVisible()
 
-        if (LoginModel.shared().getLoginModel()?.token) != nil && (DeliveryMethodTypeModel.shared().getModel()?.deliveryMethodType) != nil {
+        if (UserModel.shared().getModel()?.token) != nil && (DeliveryMethodTypeModel.shared().getModel()?.deliveryMethodType) != nil {
             /// 设置Tabbar
            setTabbarController()
         } else {
@@ -33,7 +33,7 @@ extension AppDelegate {
         /// 引导页
         setGuidePageView()
 
-        if (LoginModel.shared().getLoginModel()?.token) != nil && (DeliveryMethodTypeModel.shared().getModel()?.deliveryMethodType) != nil  {
+        if (UserModel.shared().getModel()?.token) != nil && (DeliveryMethodTypeModel.shared().getModel()?.deliveryMethodType) != nil  {
             /// 刷新token
             SwiftMoyaNetWorkServiceUser.shared().userRefreshApi {_ in }
         }

+ 28 - 0
RainbowPlanet/RainbowPlanet/Base/BaseViewController/BaseViewController.swift

@@ -12,6 +12,9 @@ import RxSwift
 class BaseViewController: UIViewController {
 
     let disposeBag = DisposeBag()
+    
+    typealias PanClosure = () -> Void
+    var panClosure : PanClosure?
 
     lazy var navigationBar = WRCustomNavigationBar.CustomNavigationBar()
 
@@ -27,8 +30,17 @@ class BaseViewController: UIViewController {
                 self.automaticallyAdjustsScrollViewInsets = true
             }
         }
+        let target = self.navigationController?.interactivePopGestureRecognizer!.delegate
+        let pan = UIPanGestureRecognizer(target:target,
+                                         action:Selector(("handleNavigationTransition:")))
+        pan.delegate = self
+        self.view.addGestureRecognizer(pan)
+        //同时禁用系统原先的侧滑返回功能
+        self.navigationController?.interactivePopGestureRecognizer!.isEnabled = false
         setupNavigationBar()
     }
+    
+    
 
     fileprivate func setupNavigationBar()
     {
@@ -64,3 +76,19 @@ class BaseViewController: UIViewController {
     func setupLayouts() {}
 
 }
+
+extension BaseViewController: UIGestureRecognizerDelegate {
+    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
+                           shouldRecognizeSimultaneouslyWith otherGestureRecognizer:
+        UIGestureRecognizer) -> Bool {
+        if self.children.count == 1 {
+            return false
+        }
+        if self.panClosure != nil {
+            self.panClosure!()
+            return false
+        }
+        return true
+    
+    }
+}

+ 4 - 0
RainbowPlanet/RainbowPlanet/Macro/Common.swift

@@ -151,3 +151,7 @@ private func viewForController(view:UIView)->UIViewController?{
     }while next != nil
     return nil
 }
+
+func showSwiftProgressHUDInfo() {
+    SwiftProgressHUD.shared().showText("该功能暂未开通,敬请期待!!!")
+}

+ 8 - 8
RainbowPlanet/RainbowPlanet/Manager/UMManager/UMManager.swift

@@ -324,36 +324,36 @@ extension UMManager {
 
                     let resp = result as? UMSocialUserInfoResponse
 
-                    let loginModel = UMLoginModel()
+                    let UserModel = UMLoginModel()
                     // 第三方登录数据(为空表示平台未提供)
                     // 授权数据
                     if let anUid = resp?.uid {
                         NXLLog(" uid: \(anUid)")
-                        loginModel.union_id = anUid
+                        UserModel.union_id = anUid
                     }
                     if let anOpenid = resp?.openid {
                         NXLLog(" openid: \(anOpenid)")
-                        loginModel.open_id = anOpenid
+                        UserModel.open_id = anOpenid
                     }
 
                     // 用户数据
                     if let aName = resp?.name {
                         NXLLog(" name: \(aName)")
-                        loginModel.username = aName
+                        UserModel.username = aName
                     }
                     if let anIconurl = resp?.iconurl {
                         NXLLog(" iconurl: \(anIconurl)")
-                        loginModel.avatar = anIconurl
+                        UserModel.avatar = anIconurl
                     }
                     if let aGender = resp?.unionGender {
                         NXLLog(" gender: \(aGender)")
                         if aGender == "男" {
-                            loginModel.gender = 1
+                            UserModel.gender = 1
                         }else if aGender == "女" {
-                            loginModel.gender = 2
+                            UserModel.gender = 2
                         }
                     }
-                    callBack(loginModel)
+                    callBack(UserModel)
                 }
             }
         }

+ 6 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/AccountSecurity/View/AccountSecuritySetTableViewCell.swift

@@ -70,6 +70,12 @@ class AccountSecuritySetTableViewCell: UITableViewCell {
     
     var titles : [String]? {
         didSet {
+            let userModel = UserModel.shared().getModel()
+            if userModel?.isPassword == 0 {
+                detailsLabel.text = "未设置"
+            }else if userModel?.isPassword == 1 {
+                detailsLabel.text = "已设置"
+            }
             titleLabel.text = titles?[(indexPath?.row)!]
         }
     }

+ 41 - 1
RainbowPlanet/RainbowPlanet/Modules/MineModule/AccountSecurity/View/AccountSecurityTableViewCell.swift

@@ -40,6 +40,7 @@ class AccountSecurityTableViewCell: UITableViewCell {
         accessoryType = .disclosureIndicator
         addSubview(iconImageView)
         addSubview(titleLabel)
+        addSubview(accountSecurityLabel)
         contentView.addSubview(detailsLabel)
         addSubview(lineLabel)
 
@@ -84,7 +85,6 @@ class AccountSecurityTableViewCell: UITableViewCell {
         let detailsLabel = UILabel()
         detailsLabel.textColor = k999999Color
         detailsLabel.font = kRegularFont14
-        detailsLabel.text = "未绑定"
         return detailsLabel
     }()
     
@@ -94,9 +94,49 @@ class AccountSecurityTableViewCell: UITableViewCell {
         return lineLabel
     }()
     
+    private lazy var accountSecurityLabel: UILabel = {
+        let accountSecurityLabel = UILabel()
+        accountSecurityLabel.textColor = k999999Color
+        accountSecurityLabel.font = kRegularFont14
+        accountSecurityLabel.isHidden = true
+        return accountSecurityLabel
+    }()
+    
     var titles : [String]? {
         didSet {
             titleLabel.text = titles?[(indexPath?.row)!]
+            let userModel = UserModel.shared().getModel()
+            switch indexPath?.row {
+            case 0:
+                if userModel?.mobile == nil || userModel?.mobile == "" {
+                    accountSecurityLabel.isHidden = true
+                    detailsLabel.text = "未绑定"
+                }else {
+                    accountSecurityLabel.isHidden = false
+                    accountSecurityLabel.text = userModel?.mobile
+                    detailsLabel.text = "更换手机号码"
+                    titleLabel.snp.remakeConstraints { (make) in
+                        make.bottom.equalTo(self.snp.centerY)
+                        make.left.equalTo(iconImageView.snp.right).offset(10)
+                    }
+                    accountSecurityLabel.snp.remakeConstraints { (make) in
+                        make.top.equalTo(self.snp.centerY)
+                        make.left.equalTo(iconImageView.snp.right).offset(10)
+                    }
+                }
+                break
+            case 1:
+                accountSecurityLabel.isHidden = true
+                if userModel?.unionId == nil || userModel?.unionId == "" {
+                    detailsLabel.text = "未绑定"
+                }else {
+                    detailsLabel.text = "解除绑定"
+                }
+                break
+            default:
+                break
+            }
+            
         }
     }
     

+ 1 - 1
RainbowPlanet/RainbowPlanet/Modules/MineModule/AccountSecurity/View/AccountSecurityView.swift

@@ -26,7 +26,7 @@ class AccountSecurityView: BaseView {
         }
     }
     
-    private lazy var tableView: UITableView = {
+    lazy var tableView: UITableView = {
         let tableView = UITableView(frame: CGRect.zero, style: UITableView.Style.grouped)
         tableView.backgroundColor = kf7f8faColor
         tableView.delegate = self

+ 76 - 1
RainbowPlanet/RainbowPlanet/Modules/MineModule/AccountSecurity/ViewController/AccountSecurityViewController.swift

@@ -14,6 +14,11 @@ class AccountSecurityViewController: BaseViewController {
         super.viewDidLoad()
         setupViews()
         setupLayouts()
+        let operationQueue = OperationQueue.main
+        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "AccountSecurity"), object: nil, queue: operationQueue) {
+            [weak self] (notification) in
+            self?.accountSecurityView.tableView.reloadData()
+        }
     }
     
     override func setupViews() {
@@ -32,11 +37,27 @@ class AccountSecurityViewController: BaseViewController {
         let accountSecurityView = AccountSecurityView()
         accountSecurityView.didSelectRowClosure = {
             [weak self] indexPath in
+            let userModel = UserModel.shared().getModel()
             switch indexPath.section {
+            case 0:
+                switch indexPath.row {
+                //设置手机号
+                case 0:
+                    self?.setMobile(userModel: userModel)
+                    break
+                //设置微信
+                case 1:
+                    self?.setWeiXin(userModel: userModel)
+                    break
+                default:
+                    break
+                }
+                break
             case 1:
                 switch indexPath.row {
+                //设置密码
                 case 0:
-                    self?.navigationController?.pushViewController(SetPasswordViewController(), animated: true)
+                    self?.setPassword(userModel: userModel)
                     break
                 default:
                     break
@@ -48,4 +69,58 @@ class AccountSecurityViewController: BaseViewController {
         }
         return accountSecurityView
     }()
+    
+    /// 设置手机号
+    ///
+    /// - Parameter userModel: 用户
+    func setMobile(userModel:UserModel?) {
+        if userModel?.mobile == nil ||  userModel?.mobile == "" {
+            self.pushBindPhoneNumberVC(bindPhoneNumberVCType: .accountSecurityBindMobile)
+        }else {
+            AlertSheetView.alert(title: "确认更换您的手机号", cancelTitle: "取消", sureTitle: "确认", cancelBlock: { (popupView, index, string) in
+                
+            }) {[weak self] (popupView, index, string) in
+                self?.pushBindPhoneNumberVC(bindPhoneNumberVCType: .accountSecurityBindMobile)
+            }
+        }
+    }
+    
+    
+    /// 设置微信
+    ///
+    /// - Parameter userModel: 用户
+    func setWeiXin(userModel:UserModel?) {
+        if userModel?.unionId == nil ||  userModel?.unionId == "" { //绑定微信
+            UMManager.shared().loginGetUserInfo(platformType: UMSocialPlatformType.wechatSession) { (wxLoginModel) -> (Void) in
+                SwiftMoyaNetWorkServiceUser.shared().userIsBindWeixinBindApi(umLoginModel: wxLoginModel, completion: { [weak self] (data) -> (Void) in
+                    self?.accountSecurityView.tableView.reloadData()
+                    
+                })
+            }
+        }else { //解绑微信
+            SwiftMoyaNetWorkServiceUser.shared().userIsBindWeixinUnBindApi(completion: { [weak self] (data) -> (Void) in
+                self?.accountSecurityView.tableView.reloadData()
+            })
+        }
+    }
+    
+    /// 设置密码
+    ///
+    /// - Parameters:
+    ///   - userModel: 用户
+    func setPassword(userModel:UserModel?) {
+        if userModel?.mobile == nil ||  userModel?.mobile == "" {
+            self.pushBindPhoneNumberVC(bindPhoneNumberVCType: .accountSecuritySet)
+        }else {
+            let vc = SetPasswordViewController()
+            self.navigationController?.pushViewController(vc, animated: true)
+        }
+    }
+    
+    /// 绑定手机号,更改换手机号
+    func pushBindPhoneNumberVC(bindPhoneNumberVCType : BindPhoneNumberVCType) {
+        let vc = BindPhoneNumberViewController()
+        vc.bindPhoneNumberVCType = bindPhoneNumberVCType
+        self.navigationController?.pushViewController(vc, animated: true)
+    }
 }

+ 9 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/AddressManager/View/AddressManagerView.swift

@@ -16,9 +16,17 @@ class AddressManagerView: BaseView {
     typealias ManagerClosur = (_ section: Int) -> Void
     var managerClosur : ManagerClosur?
     
+    var addressManagerListModel : AddressManagerListModel? {
+        didSet {
+            
+        }
+    }
     
     let headerTitls = ["自提地址","快递收货地址"]
     let addAddresses = [["添加自提地址"],["添加快递收货地址"]]
+    
+    let headerOneTitls = ["快递收货地址"]
+    let addOneAddresses = [["添加快递收货地址"]]
 
     override func setupViews() {
         addSubview(tableView)
@@ -46,6 +54,7 @@ extension AddressManagerView: UITableViewDelegate,UITableViewDataSource {
     
     
     func numberOfSections(in tableView: UITableView) -> Int {
+        
         return headerTitls.count
     }
     

+ 7 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/AddressManager/ViewController/AddressManagerViewController.swift

@@ -14,6 +14,7 @@ class AddressManagerViewController: BaseViewController {
         super.viewDidLoad()
         setupViews()
         setupLayouts()
+        setupData()
     }
     
     override func setupViews() {
@@ -28,6 +29,12 @@ class AddressManagerViewController: BaseViewController {
         }
     }
     
+    func setupData() {
+        SwiftMoyaNetWorkServiceUser.shared().userSelfAndExpressAddressListApi(type: 0) { (addressManagerListModel) -> (Void) in
+            
+        }
+    }
+    
     private lazy var addressManagerView: AddressManagerView = {
         let addressManagerView = AddressManagerView()
         addressManagerView.managerClosur = {

+ 20 - 1
RainbowPlanet/RainbowPlanet/Modules/MineModule/Message/View/MessageNoticeHeaderCollectionReusableView.swift

@@ -7,8 +7,11 @@
 //
 
 import UIKit
-
+import RxSwift
+import RxCocoa
 class MessageNoticeHeaderCollectionReusableView: UICollectionReusableView {
+    let disposeBag = DisposeBag()
+    
     class func headerWith(collectionView:UICollectionView,kind: String,indexPath: IndexPath) -> UICollectionReusableView {
         let ID = "MessageNoticeHeaderCollectionReusableView"
         collectionView.register(MessageNoticeHeaderCollectionReusableView.self, forSupplementaryViewOfKind: kind, withReuseIdentifier: ID)
@@ -71,6 +74,22 @@ class MessageNoticeHeaderCollectionReusableView: UICollectionReusableView {
         toOpenButton.layer.borderColor = k9F9F9FColor.cgColor
         toOpenButton.layer.borderWidth = 0.5
         toOpenButton.backgroundColor = kf2f2f2Color
+        toOpenButton.rx.tap.subscribe(onNext: { (data) in
+            DispatchQueue.main.async(execute: { () -> Void in
+                let url = URL(string: UIApplication.openSettingsURLString)
+                if let url = url, UIApplication.shared.canOpenURL(url) {
+                    if #available(iOS 10.0, *) {
+                        UIApplication.shared.open(url, options: [:],
+                                                  completionHandler: {
+                                                    (success) in
+                        })
+                    }else {
+                        UIApplication.shared.openURL(url)
+                    }
+                }
+                
+            })
+        }).disposed(by: disposeBag)
         return toOpenButton
     }()
 }

+ 53 - 2
RainbowPlanet/RainbowPlanet/Modules/MineModule/Message/View/MessageView.swift

@@ -20,8 +20,47 @@ class MessageView: BaseView {
     typealias DidSelectClosure = (_ indexPath: IndexPath) -> Void
     var didSelectClosure : DidSelectClosure?
     
+    enum NotificationAuthorizationStatus {
+        case authorized
+        case notDetermined
+        case denied
+    }
+    
+    var authorizationStatus :NotificationAuthorizationStatus?
+    
+    
     override func setupViews() {
         addSubview(collectionView)
+        if #available(iOS 10.0, *) {
+            let unUserNotificationCenter = UNUserNotificationCenter.current()
+            unUserNotificationCenter.getNotificationSettings {
+                settings in
+                switch settings.authorizationStatus {
+                case .authorized:
+                   self.authorizationStatus = .authorized
+                    return
+                case .notDetermined:
+                     self.authorizationStatus = .notDetermined
+//                    //请求授权
+//                    UNUserNotificationCenter.current()
+//                        .requestAuthorization(options: [.alert, .sound, .badge]) {
+//                            (accepted, error) in
+//                            if !accepted {
+//                                print("用户不允许消息通知。")
+//                            }
+//                    }
+                    break
+                case .denied:
+                    self.authorizationStatus = .denied
+                    break
+                default:
+                    break
+                }
+            }
+             self.collectionView.reloadData()
+        } else {
+            // Fallback on earlier versions
+        }
     }
     
     override func setupLayouts() {
@@ -95,7 +134,14 @@ extension MessageView: UICollectionViewDelegateFlowLayout,UICollectionViewDataSo
     func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
         switch section {
         case 0:
-            return UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
+            if self.authorizationStatus == .notDetermined || self.authorizationStatus == .denied {
+                return UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
+
+            }else if self.authorizationStatus == .authorized {
+                return UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0)
+
+            }
+            return UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0)
         default:
             return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
         }
@@ -135,7 +181,12 @@ extension MessageView: UICollectionViewDelegateFlowLayout,UICollectionViewDataSo
     func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
         switch section {
         case 0:
-            return CGSize(width: kScreenWidth, height: kScaleValue(value: 36))
+            if self.authorizationStatus == .notDetermined || self.authorizationStatus == .denied {
+                return CGSize(width: kScreenWidth, height: kScaleValue(value: 36))
+            }else if self.authorizationStatus == .authorized {
+                return CGSize(width: kScreenWidth, height: 0)
+            }
+            return CGSize(width: kScreenWidth, height: 0)
         default:
             return CGSize(width: kScreenWidth, height: 0)
         }

+ 1 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/MessageDetailes/View/MessageDetailesTableViewCell.swift

@@ -117,6 +117,7 @@ class MessageDetailesTableViewCell: UITableViewCell {
         detailsIconImageView.backgroundColor = kf7f8faColor
         detailsIconImageView.cornerRadius = 2
         detailsIconImageView.masksToBounds = true
+        detailsIconImageView.image = kImage(name: "logo")
         return detailsIconImageView
     }()
     

+ 1 - 1
RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/View/MineNavigationBarView.swift

@@ -41,7 +41,7 @@ class MineNavigationBarView: BaseView {
     private lazy var messageButton: UIButton = {
         let messageButton = UIButton(type: UIButton.ButtonType.custom)
         messageButton.setImage(kImage(name: "navbar_message_entrance"), for: UIControl.State.normal)
-        messageButton.pp.addBadge(number: 2)
+        messageButton.pp.addBadge(number: 0)
         messageButton.pp.badgeView.size = CGSize(width: 14, height: 14)
         messageButton.rx.tap.subscribe(onNext: {[weak self] (data) in
             if let messageBlock = self?.messageBlock {

+ 4 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/View/MineServiceTableViewCell.swift

@@ -156,6 +156,10 @@ extension MineServiceTableViewCell: UICollectionViewDelegateFlowLayout,UICollect
         
     }
     
+    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+        showSwiftProgressHUDInfo()
+    }
+    
     func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
         return CGSize(width:kScreenWidth-28, height: 48)
     }

+ 8 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/View/MineTableViewHeaderView.swift

@@ -155,5 +155,13 @@ class MineTableViewHeaderView: BaseView {
         goAddressButton.setImage(kImage(name: "my_arrows_unfold"), for: UIControl.State.normal)
         return goAddressButton
     }()
+    
+    var userModel : UserModel? {
+        didSet {
+            avatarButton.kf.setImage(with: kURLImage(name: userModel?.avatarurl ?? ""), for: UIControl.State.normal, placeholder: kImage(name: "logo"))
+            nickNameLabel.text = userModel?.username
+        }
+    }
+    
 
 }

+ 2 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/View/MineView.swift

@@ -41,6 +41,8 @@ class MineView: BaseView {
     
     private lazy var mineTableViewHeaderView: MineTableViewHeaderView = {
         let mineTableViewHeaderView = MineTableViewHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kNavBarTotalHeight + 46+78))
+        let userModel = UserModel.shared().getModel()
+        mineTableViewHeaderView.userModel = userModel
         mineTableViewHeaderView.addressClosure = {
             [weak self] in
             if let addressClosure = self?.addressClosure {

+ 5 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/Mine/ViewController/MineViewController.swift

@@ -15,6 +15,11 @@ class MineViewController: BaseViewController {
         super.viewDidLoad()
         setupViews()
         setupLayouts()
+        let operationQueue = OperationQueue.main
+        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "AccountSecurity"), object: nil, queue: operationQueue) {
+            [weak self] (notification) in
+            self?.mineView.tableView.reloadData()
+        }
     }
     
     override func setupViews() {

+ 5 - 2
RainbowPlanet/RainbowPlanet/Modules/MineModule/Set/ViewController/SetViewController.swift

@@ -40,15 +40,18 @@ class SetViewController: BaseViewController {
                     self?.navigationController?.pushViewController(AccountSecurityViewController(), animated: true)
                     break
                 default:
+                   showSwiftProgressHUDInfo()
                     break
                 }
                 break
+            case 3:
+                SwiftMoyaNetWorkServiceUser.shared().userLogoutApi()
+                break
             default:
+                showSwiftProgressHUDInfo()
                 break
             }
         }
         return setView
     }()
-
 }
-

+ 44 - 2
RainbowPlanet/RainbowPlanet/Modules/MineModule/SetPassword/View/SetPasswordView.swift

@@ -7,9 +7,17 @@
 //
 
 import UIKit
+import RxSwift
+import RxCocoa
 
 class SetPasswordView: BaseView {
-
+    
+    var password : String = ""
+    var surePassword : String = ""
+    
+    typealias FinishClosure = (_ password : String,_ surePassword : String) -> Void
+    var finishClosure : FinishClosure?
+    
     override func setupViews() {
         backgroundColor = kf7f8faColor
         addSubview(passwordBgView)
@@ -92,6 +100,12 @@ class SetPasswordView: BaseView {
         passwordTextField.textColor = k333333Color
         passwordTextField.font = kRegularFont14
         passwordTextField.tintColor = kEnabledButtonColor
+        passwordTextField.rx.text.orEmpty.changed.subscribe(onNext: {
+            [weak self] (text) in
+            self?.passwordTextField.text = String(text.prefix(16)) as String
+            self?.password = self?.passwordTextField.text ?? ""
+            self?.observableString()
+        }).disposed(by: disposeBag)
         return passwordTextField
     }()
     
@@ -115,6 +129,12 @@ class SetPasswordView: BaseView {
         surePasswordTextField.textColor = k333333Color
         surePasswordTextField.font = kRegularFont14
         surePasswordTextField.tintColor = kEnabledButtonColor
+        surePasswordTextField.rx.text.orEmpty.changed.subscribe(onNext: {
+            [weak self] (text) in
+            self?.surePasswordTextField.text = String(text.prefix(16)) as String
+            self?.surePassword = self?.surePasswordTextField.text ?? ""
+            self?.observableString()
+        }).disposed(by: disposeBag)
         return surePasswordTextField
     }()
     
@@ -126,7 +146,7 @@ class SetPasswordView: BaseView {
     
     private lazy var tipsLabel : UILabel = {
         let tipsLabel = UILabel()
-        tipsLabel.text = "6-12位密码,数字或字母"
+        tipsLabel.text = "6-16位密码,数字或字母"
         tipsLabel.textColor = k999999Color
         tipsLabel.font = kRegularFont14
         return tipsLabel
@@ -142,7 +162,29 @@ class SetPasswordView: BaseView {
         finishButton.isEnabled = false
         finishButton.cornerRadius = 22
         finishButton.masksToBounds = true
+        finishButton.rx.tap.subscribe(onNext: {
+            [weak self] (data) in
+            if self?.password == self?.surePassword {
+                if let finishClosure = self?.finishClosure {
+                    finishClosure(self?.password ?? "",self?.surePassword ?? "")
+                }
+            }else {
+                SwiftProgressHUD.shared().showText("两次输入的密码不一致,请重新输入")
+            }
+        }).disposed(by: self.disposeBag)
         return finishButton
     }()
+    
+    func observableString() {
+        Observable.combineLatest(Observable.just(password), Observable.just(surePassword)) { (textValue1, textValue2) -> Bool in
+            let textValue1 = String(textValue1.prefix(16))as String
+            let textValue2 = String(textValue2.prefix(16)) as String
+            let isSuccess = (textValue1.count >= 6) && (textValue1.count <= 16) && (textValue2.count >= 6) && (textValue2.count <= 16)
+            return isSuccess
+            }.subscribe(onNext: {
+                [weak self] isEmpty in
+                self?.finishButton.isEnabled = isEmpty
+            }).disposed(by: self.disposeBag)
+    }
 
 }

+ 24 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/SetPassword/ViewController/SetPasswordViewController.swift

@@ -10,6 +10,11 @@ import UIKit
 
 class SetPasswordViewController: BaseViewController {
 
+    deinit {
+        //记得移除通知监听
+        NotificationCenter.default.removeObserver(self)
+    }
+    
     override func viewDidLoad() {
         super.viewDidLoad()
         setupViews()
@@ -18,9 +23,22 @@ class SetPasswordViewController: BaseViewController {
     
     override func setupViews() {
         navigationBar.title = "设置密码"
+        navigationBar.onClickLeftButton = {
+            let userModel = UserModel.shared().getModel()
+            if userModel?.mobile == nil || userModel?.mobile == ""  {
+                self.navigationController?.popViewController(animated: true)
+            }else {
+                self.poptoAccountSecurity()
+            }
+        }
         view.addSubview(setPasswordView)
     }
     
+    func poptoAccountSecurity() {
+        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "AccountSecurity"), object: nil)
+        self.navigationController?.popToClass(type: AccountSecurityViewController.self)
+    }
+    
     override func setupLayouts() {
         setPasswordView.snp.makeConstraints { (make) in
             make.top.equalTo(kNavBarTotalHeight)
@@ -30,6 +48,12 @@ class SetPasswordViewController: BaseViewController {
     
     private lazy var setPasswordView: SetPasswordView = {
         let setPasswordView = SetPasswordView()
+        setPasswordView.finishClosure = {
+            [weak self] password,surePassword in
+            SwiftMoyaNetWorkServiceUser.shared().userSetPasswordApi(mobile: UserModel.shared().getModel()?.mobile ?? "", password: password, password_confirmation: surePassword, completion: { [weak self] (data) -> (Void) in
+                self?.poptoAccountSecurity()
+            })
+        }
         return setPasswordView
     }()
 

+ 39 - 11
RainbowPlanet/RainbowPlanet/Modules/RegisterLoginModule/BindPhoneNumber/ViewController/BindPhoneNumberViewController.swift

@@ -8,26 +8,45 @@
 
 import UIKit
 
-class BindPhoneNumberViewController: BaseViewController {
+/// 跳转过来的类型
+///
+/// - weixinlogin: 微信登录
+/// - accountSecuritySet: 账号安全设置
+/// - accountSecurityBindMobile: 账号安全手机绑定
+enum BindPhoneNumberVCType {
+    case weixinlogin
+    case accountSecuritySet
+    case accountSecurityBindMobile
+}
 
-    var wxLoginModel : UMLoginModel?
+class BindPhoneNumberViewController: BaseViewController {
+    
+    var bindPhoneNumberVCType : BindPhoneNumberVCType?
+    
+    deinit {
+        //记得移除通知监听
+        NotificationCenter.default.removeObserver(self)
+    }
     
     override func viewDidLoad() {
         super.viewDidLoad()
-
         setupViews()
         setupLayouts()
     }
 
     override  func setupViews() {
-        navigationBar.wr_setLeftButton(image: UIImage())
-        navigationBar.wr_setRightButton(title: "跳过", titleColor: k333333Color)
-        navigationBar.onClickLeftButton = nil
-        navigationBar.onClickRightButton = {
-            [weak self] in
+        if bindPhoneNumberVCType == .weixinlogin {
+            navigationBar.wr_setLeftButton(image: UIImage())
+            navigationBar.wr_setRightButton(title: "跳过", titleColor: k333333Color)
+            navigationBar.onClickLeftButton = nil
+            navigationBar.onClickRightButton = {
+                [weak self] in
+                self?.navigationController?.pushViewController(LocationViewController(), animated: true)
+            }
+        }else if bindPhoneNumberVCType == .accountSecuritySet  {
             
-            self?.navigationController?.pushViewController(LocationViewController(), animated: true)
         }
+       
         view.addSubview(bindPhoneNumberView)
     }
 
@@ -48,8 +67,17 @@ class BindPhoneNumberViewController: BaseViewController {
         }
         bindPhoneNumberView.loginBlock = {
             [weak self] (phoneNumber,sms) in
-            SwiftMoyaNetWorkServiceUser.shared().userBindMobileApi(mobile: phoneNumber, smsCode: sms, unionId: self?.wxLoginModel?.union_id ?? "", openId: self?.wxLoginModel?.open_id ?? "", completion: { [weak self] (data) -> (Void) in
-                self?.navigationController?.pushViewController(LocationViewController(), animated: true)
+            SwiftMoyaNetWorkServiceUser.shared().userBindMobileApi(mobile: phoneNumber, smsCode: sms, unionId: UserModel.shared().getModel()?.unionId ?? "", openId: UserModel.shared().getModel()?.openId ?? "", completion: { [weak self] (data) -> (Void) in
+                if self?.bindPhoneNumberVCType == .weixinlogin {
+                    self?.navigationController?.pushViewController(LocationViewController(), animated: true)
+
+                }else if self?.bindPhoneNumberVCType == .accountSecuritySet  {
+                        let vc = SetPasswordViewController()
+                        self?.navigationController?.pushViewController(vc, animated: true)
+                }else if self?.bindPhoneNumberVCType == .accountSecurityBindMobile  {
+                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "AccountSecurity"), object: nil)
+                    self?.navigationController?.popViewController(animated: true)
+                }
 
             })
         }

+ 6 - 6
RainbowPlanet/RainbowPlanet/Modules/RegisterLoginModule/RegisterLogin/ViewController/RegisterLoginViewController.swift

@@ -33,16 +33,16 @@ class RegisterLoginViewController: BaseViewController {
         let registerLoginView = RegisterLoginView()
         // 微信注册登录
         registerLoginView.weiXinLoginBlock = { [weak self] in
-            UMManager.shared().loginGetUserInfo(platformType: UMSocialPlatformType.wechatSession) { (loginModel) -> (Void) in
-                let wxLoginModel = loginModel
-                SwiftMoyaNetWorkServiceUser.shared().userWeiXinRegisterApi(open_id: wxLoginModel.open_id, union_id: wxLoginModel.union_id, avatar: wxLoginModel.avatar, username: wxLoginModel.username, gender: wxLoginModel.gender, completion: { (loginModel) -> (Void) in
-                    let loginModel =  loginModel as! LoginModel
-                    if (loginModel.mobile != nil && loginModel.mobile != "" ) {
+            UMManager.shared().loginGetUserInfo(platformType: UMSocialPlatformType.wechatSession) { (UserModel) -> (Void) in
+                let wxLoginModel = UserModel
+                SwiftMoyaNetWorkServiceUser.shared().userWeiXinRegisterApi(open_id: wxLoginModel.open_id, union_id: wxLoginModel.union_id, avatar: wxLoginModel.avatar, username: wxLoginModel.username, gender: wxLoginModel.gender, completion: { (UserModel) -> (Void) in
+                    let UserModel =  UserModel as! UserModel
+                    if (UserModel.mobile != nil && UserModel.mobile != "" ) {
                         self?.navigationController?.pushViewController(LocationViewController(), animated: true)
 
                     }else {
                         let vc = BindPhoneNumberViewController()
-                        vc.wxLoginModel = wxLoginModel
+                        vc.bindPhoneNumberVCType = .weixinlogin
                         let nav = BaseNavigationViewController.init(rootViewController: vc)
                         self?.present(nav, animated: true, completion: {
 

+ 54 - 0
RainbowPlanet/RainbowPlanet/Service/Model/UserModel/AddressManagerListModel.swift

@@ -0,0 +1,54 @@
+//
+//	AddressManagerListModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class AddressManagerListModel : NSObject, NSCoding, Mappable{
+
+	var expressAddress : [AnyObject]?
+	var selfAddress : [AnyObject]?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return AddressManagerListModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		expressAddress <- map["expressAddress"]
+		selfAddress <- map["selfAddress"]
+		
+	}
+
+    /**
+    * NSCoding required initializer.
+    * Fills the data from the passed decoder
+    */
+    @objc required init(coder aDecoder: NSCoder)
+	{
+         expressAddress = aDecoder.decodeObject(forKey: "expressAddress") as? [AnyObject]
+         selfAddress = aDecoder.decodeObject(forKey: "selfAddress") as? [AnyObject]
+
+	}
+
+    /**
+    * NSCoding required method.
+    * Encodes mode properties into the decoder
+    */
+    @objc func encode(with aCoder: NSCoder)
+	{
+		if expressAddress != nil{
+			aCoder.encode(expressAddress, forKey: "expressAddress")
+		}
+		if selfAddress != nil{
+			aCoder.encode(selfAddress, forKey: "selfAddress")
+		}
+
+	}
+
+}

+ 23 - 15
RainbowPlanet/RainbowPlanet/Service/Model/UserModel/LoginModel.swift

@@ -1,24 +1,25 @@
 //
-//	LoginModel.swift
+//	UserModel.swift
 //	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
 
 import Foundation 
 import ObjectMapper
 
 
-class LoginModel : NSObject, NSCoding, Mappable{
+class UserModel : NSObject, NSCoding, Mappable{
 
-    private static let _sharedInstance = LoginModel()
+    private static let _sharedInstance = UserModel()
 
     private override init() {} // 私有化init方法
 
-    class func shared() -> LoginModel {
+    class func shared() -> UserModel {
         return _sharedInstance
     }
 
     var accessToken : String?
     var avatarurl : String?
     var gender : Int?
+    var isPassword : Int?
     var mobile : String?
     var openId : String?
     var token : String?
@@ -27,8 +28,9 @@ class LoginModel : NSObject, NSCoding, Mappable{
     var unionId : String?
     var username : String?
 
+
 	class func newInstance(map: Map) -> Mappable?{
-		return LoginModel()
+		return UserModel()
 	}
 	required init?(map: Map){}
 
@@ -37,6 +39,7 @@ class LoginModel : NSObject, NSCoding, Mappable{
         accessToken <- map["access_token"]
         avatarurl <- map["avatarurl"]
         gender <- map["gender"]
+        isPassword <- map["is_password"]
         mobile <- map["mobile"]
         openId <- map["open_id"]
         token <- map["token"]
@@ -56,6 +59,7 @@ class LoginModel : NSObject, NSCoding, Mappable{
         accessToken = aDecoder.decodeObject(forKey: "access_token") as? String
         avatarurl = aDecoder.decodeObject(forKey: "avatarurl") as? String
         gender = aDecoder.decodeObject(forKey: "gender") as? Int
+        isPassword = aDecoder.decodeObject(forKey: "is_password") as? Int
         mobile = aDecoder.decodeObject(forKey: "mobile") as? String
         openId = aDecoder.decodeObject(forKey: "open_id") as? String
         token = aDecoder.decodeObject(forKey: "token") as? String
@@ -81,6 +85,9 @@ class LoginModel : NSObject, NSCoding, Mappable{
         if gender != nil{
             aCoder.encode(gender, forKey: "gender")
         }
+        if isPassword != nil{
+            aCoder.encode(isPassword, forKey: "is_password")
+        }
         if mobile != nil{
             aCoder.encode(mobile, forKey: "mobile")
         }
@@ -102,37 +109,38 @@ class LoginModel : NSObject, NSCoding, Mappable{
         if username != nil{
             aCoder.encode(username, forKey: "username")
         }
+
 	}
 
     /// 存储个人信息
     ///
     /// - Parameter locationModel: 定位模型
-    func setLoginModel(loginModel:LoginModel) -> Void {
+    func setModel(model:UserModel) -> Void {
         //实例对象转换成Data
-        let modelData = NSKeyedArchiver.archivedData(withRootObject: loginModel)
+        let modelData = NSKeyedArchiver.archivedData(withRootObject: model)
         //存储Data对象
-        UserDefaults.standard.set(modelData, forKey: "LoginModel")
-        NXLLog("LoginModel存储成功")
+        UserDefaults.standard.set(modelData, forKey: "UserModel")
+        NXLLog("UserModel存储成功")
     }
 
 
     /// 获取个人信息
     ///
     /// - Returns: 定位模型
-    func getLoginModel() -> LoginModel? {
+    func getModel() -> UserModel? {
         //自定义对象读取
-        let modelData = UserDefaults.standard.data(forKey: "LoginModel")
-        var model = LoginModel()
+        let modelData = UserDefaults.standard.data(forKey: "UserModel")
+        var model = UserModel()
         if modelData != nil {
-            model = NSKeyedUnarchiver.unarchiveObject(with: modelData!) as! LoginModel
-            NXLLog("LoginModel读取成功")
+            model = NSKeyedUnarchiver.unarchiveObject(with: modelData!) as! UserModel
+            NXLLog("UserModel读取成功")
         }
         return model
     }
 
     /// 移除个人信息
     func removeLoginModel() {
-        UserDefaults.standard.removeObject(forKey: "LoginModel")
+        UserDefaults.standard.removeObject(forKey: "UserModel")
     }
 
 }

+ 2 - 2
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkManager/ApiMacro.swift

@@ -54,13 +54,13 @@ public func headerParameters(headerType:HeaderType = .defaultHeader) -> Dictiona
         break
     case .tokenHeader:
         parameters.updateValue("application/x-www-form-urlencoded", forKey: "Content-Type")
-        let token = LoginModel.shared().getLoginModel()?.token ?? ""
+        let token = UserModel.shared().getModel()?.token ?? ""
         parameters.updateValue(token, forKey: "Authorization")
         break
     case .tokenMoreHeader:
         parameters.updateValue("application/x-www-form-urlencoded", forKey: "Content-Type")
         parameters = appInfoHeader(parameters: parameters)
-        let token = LoginModel.shared().getLoginModel()?.token ?? ""
+        let token = UserModel.shared().getModel()?.token ?? ""
         parameters.updateValue(token, forKey: "Authorization")
         break
     }

+ 18 - 16
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaNetWorkManager/SwiftMoyaNetWorkManager.swift

@@ -119,7 +119,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
     ///   - target: 请求地址加参数
     ///   - isCache: 是否缓存
     ///   - completion: <#completion description#>
-    func request<T: BaseMappable>(_ type: T.Type,target: MultiTarget,completion: @escaping successCallTBack) -> Void {
+    func request<T: BaseMappable>(_ type: T.Type ,target: MultiTarget,isCustomAlert:Bool = false,completion: @escaping successCallTBack) -> Void {
         //判断是否链接网络
         if !isNetworkConnect{
              SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
@@ -157,7 +157,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
     ///   - alwaysFetchCache: 是否总是缓存
     ///   - cacheType: 缓存类型
     ///   - completion: 请求成功回调
-    func cacheRequest<T: BaseMappable>(_ type: T.Type,target: MultiTarget,alwaysFetchCache: Bool = false,cacheType: MMCache.CacheKeyType = .default,completion: @escaping successCallback) -> Void {
+    func cacheRequest<T: BaseMappable>(_ type: T.Type,target: MultiTarget,isCustomAlert:Bool = false,alwaysFetchCache: Bool = false,cacheType: MMCache.CacheKeyType = .default,completion: @escaping successCallback) -> Void {
 
         //判断是否链接网络
         if !isNetworkConnect{
@@ -169,12 +169,12 @@ public class SwiftMoyaNetWorkManager: NSObject {
 
         if alwaysFetchCache {
             cacheResponse = MMCache.shared.fetchResponseCache(target: target)
-            self.getResponseStatusCode(response: cacheResponse!, completion: completion)
+            self.getResponseStatusCode(response: cacheResponse!, isCustomAlert: isCustomAlert, completion: completion)
         } else {
             if MMCache.shared.isNoRecord(target, cacheType: cacheType) {
                 MMCache.shared.record(target)
                 cacheResponse = MMCache.shared.fetchResponseCache(target: target)
-                self.getResponseStatusCode(response: cacheResponse!, completion: completion)
+                self.getResponseStatusCode(response: cacheResponse!, isCustomAlert: isCustomAlert, completion: completion)
             }
         }
 
@@ -185,7 +185,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
             .observeOn(MainScheduler.instance)
             .subscribe(onSuccess: { [weak self] response in
                 MMCache.shared.cacheResponse(response as!  Response, target: target)
-                self?.getResponseStatusCode(response: response as! Response, completion: completion)
+                self?.getResponseStatusCode(response: response as! Response, isCustomAlert: isCustomAlert, completion: completion)
             }) {
                 [weak self] (error) in
                 if let falseCallback = self?.falseCallback  {
@@ -203,7 +203,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
     /// - Parameters:
     ///   - target: 请求地址加参数
     ///   - completion: 请求成功回调
-    func request(target: MultiTarget,completion: @escaping successCallback) -> Void {
+    func request(target: MultiTarget,isCustomAlert:Bool = false,completion: @escaping successCallback) -> Void {
         //判断是否链接网络
         if !isNetworkConnect{
             SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
@@ -215,7 +215,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
             .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
             .observeOn(MainScheduler.instance)
             .subscribe(onSuccess: { [weak self] response in
-                self?.getResponseStatusCode(response: response, completion: completion)
+                self?.getResponseStatusCode(response: response, isCustomAlert: isCustomAlert, completion: completion)
             }) {
                 [weak self] (error) in
                 if let falseCallback = self?.falseCallback  {
@@ -234,7 +234,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
     ///   - alwaysFetchCache: 是否总是缓存
     ///   - cacheType: 缓存类型
     ///   - completion: 请求成功回调
-    func cacheRequest(target: MultiTarget,alwaysFetchCache: Bool = false,cacheType: MMCache.CacheKeyType = .default,completion: @escaping successCallback) -> Void {
+    func cacheRequest(target: MultiTarget,isCustomAlert:Bool = false,alwaysFetchCache: Bool = false,cacheType: MMCache.CacheKeyType = .default,completion: @escaping successCallback) -> Void {
 
         //判断是否链接网络
         if !isNetworkConnect{
@@ -246,12 +246,12 @@ public class SwiftMoyaNetWorkManager: NSObject {
 
         if alwaysFetchCache {
             cacheResponse = MMCache.shared.fetchResponseCache(target: target)
-            self.getResponseStatusCode(response: cacheResponse!, completion: completion)
+            self.getResponseStatusCode(response: cacheResponse!, isCustomAlert: isCustomAlert, completion: completion)
         } else {
             if MMCache.shared.isNoRecord(target, cacheType: cacheType) {
                 MMCache.shared.record(target)
                 cacheResponse = MMCache.shared.fetchResponseCache(target: target)
-                self.getResponseStatusCode(response: cacheResponse!, completion: completion)
+                self.getResponseStatusCode(response: cacheResponse!, isCustomAlert: isCustomAlert, completion: completion)
             }
         }
 
@@ -261,7 +261,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
             .observeOn(MainScheduler.instance)
             .subscribe(onSuccess: { [weak self] response in
                 MMCache.shared.cacheResponse(response, target: target)
-                self?.getResponseStatusCode(response: response, completion: completion)
+                self?.getResponseStatusCode(response: response, isCustomAlert: isCustomAlert, completion: completion)
             }) {
                 [weak self] (error) in
                 if let falseCallback = self?.falseCallback  {
@@ -280,7 +280,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
     /// - Parameters:
     ///   - response: 响应结果
     ///   - completion: 回调
-    private func getResponseStatusCode(response:Response, completion: @escaping successCallback) -> Void {
+    private func getResponseStatusCode(response:Response, isCustomAlert:Bool , completion: @escaping successCallback) -> Void {
         let json = try? JSON(response.mapJSON())
         if response.statusCode == 200 {
             NXLLog("\nstatusCode=\(response.statusCode)\njson=\n\(json!.description)");
@@ -291,13 +291,15 @@ public class SwiftMoyaNetWorkManager: NSObject {
             if rootModel!.code == 0 {
                  completion(rootModel as Any)
             }else if rootModel!.code  == 1 {
-                SwiftProgressHUD.shared().showText(rootModel!.msg ?? "信息有误!!!", textAlignment: .left)
+                if !isCustomAlert {
+                     SwiftProgressHUD.shared().showText(rootModel!.msg ?? "信息有误!!!", textAlignment: .left)
+                }
                 if let falseCallback = self.falseCallback  {
                     falseCallback()
                 }
+                
             }else {
                 SwiftProgressHUD.shared().showError(rootModel!.msg ?? "信息有误!!!")
-
                 if let falseCallback = self.falseCallback  {
                     falseCallback()
                 }
@@ -305,7 +307,7 @@ public class SwiftMoyaNetWorkManager: NSObject {
         }else if response.statusCode == 401 {
             NXLLog("\nstatusCode=\(response.statusCode)\njson=\n\(json!.description)");
             let infoModel = InfoModel(JSONString: json?.description ?? "")
-            LoginModel.shared().removeLoginModel()
+            UserModel.shared().removeLoginModel()
             kAppDelegate.setLoginController()
             SwiftProgressHUD.shared().showText(infoModel!.message ?? "登录过期,请重新登录")
 
@@ -377,7 +379,7 @@ extension PrimitiveSequence where TraitType == SingleTrait, ElementType == Respo
                     let infoModel = InfoModel(JSONString: json.description)
                     SwiftProgressHUD.shared().showText(infoModel!.message ?? "登录过期,请重新登录")
 
-                    LoginModel.shared().removeLoginModel()
+                    UserModel.shared().removeLoginModel()
                     kAppDelegate.setLoginController()
                     return Single<T?>.just(nil)
                 }else {                NXLLog("\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)");

+ 39 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceConfig/SwiftMoyaNetWorkServiceConfig.swift

@@ -0,0 +1,39 @@
+//
+//  SwiftMoyaNetWorkServiceConfig.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/4/26.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import UIKit
+import Moya
+import SwiftyJSON
+import ObjectMapper
+
+class SwiftMoyaNetWorkServiceConfig: NSObject {
+    private static let _sharedInstance = SwiftMoyaNetWorkServiceConfig()
+    
+    private override init() {} // 私有化init方法
+    
+    class func shared() -> SwiftMoyaNetWorkServiceConfig {
+        return _sharedInstance
+    }
+    /// 数据回调
+    typealias apiCallBack = (Any) -> (Void)
+    
+    /// 自提点列表
+    func configPickupNodeIndexApi(cityId:String,keyword:String = "",status:String = "",page:String = "",completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(cityId, forKey: "city_id")
+        parameters.updateValue(keyword, forKey: "keyword")
+        parameters.updateValue(status, forKey: "status")
+        parameters.updateValue(page, forKey: "page")
+        
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceConfigApi.configPickupNodeIndex(parameters: parameters))) {(data) in
+            SwiftProgressHUD.shared().hide()
+            completion("")
+        }
+    }
+}

+ 81 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceConfig/SwiftMoyaServiceConfigApi.swift

@@ -0,0 +1,81 @@
+//
+//  SwiftMoyaServiceConfigApi.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/4/26.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import Foundation
+import Moya
+
+// MARK: - 自提点列表
+/// 自提点列表
+public let kConfigPickupNodeIndexApi = "/config/pickupNode/index"
+
+/// 用户
+///
+/// - userLogout: 登出
+public enum SwiftMoyaServiceConfigApi {
+    case configPickupNodeIndex(parameters:Dictionary<String, Any>)
+}
+
+extension SwiftMoyaServiceConfigApi: TargetType {
+    
+    public var baseURL: URL {
+        switch self {
+        case .configPickupNodeIndex
+            :
+            return URL(string: kApiDataPrefix())!
+        }
+    }
+    
+    public var path: String {
+        switch self {
+        case .configPickupNodeIndex
+            :
+            return kConfigPickupNodeIndexApi
+        }
+    }
+    
+    public var method: Moya.Method {
+        switch self {
+        case .configPickupNodeIndex
+            :
+            return .post
+        }
+    }
+    
+    // MARK: - 请求任务事件(这里附带上参数)
+    public var task: Task {
+        switch self {
+        case .configPickupNodeIndex(var parameters)
+            :
+            let sign = SwiftSign.shared().sign(signType:.AccessToken, parameters: parameters)
+            parameters.updateValue(sign, forKey: "sign")
+            return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
+        }
+    }
+    
+    
+    // MARK: - 是否执行Alamofire验证
+    public var validate: Bool {
+        return false
+    }
+    
+    // MARK: - 这个就是做单元测试模拟的数据,只会在单元测试文件中有作用
+    public var sampleData: Data {
+        return "{}".data(using: String.Encoding.utf8)!
+    }
+    
+    // MARK: - 请求头
+    public var headers: [String : String]? {
+        //同task,具体选择看后台 有application/x-www-form-urlencoded 、application/json
+        switch self {
+        case .configPickupNodeIndex
+            :
+            return (headerParameters(headerType: .tokenHeader) as! [String : String])
+        }
+    }
+    
+}

+ 1 - 1
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceSMS/SwiftMoyaNetWorkServiceSMS.swift

@@ -39,7 +39,7 @@ class SwiftMoyaNetWorkServiceSMS: NSObject {
         parameters.updateValue(AppInfo.ipAddress, forKey: "ip")
 
         SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceSMSApi.smsSend(parameters: parameters))) { (loginModel) in
+        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceSMSApi.smsSend(parameters: parameters))) { (UserModel) in
             SwiftProgressHUD.shared().hide()
             completion("")
         }

+ 156 - 76
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceUser/SwiftMoyaNetWorkServiceUser.swift

@@ -20,57 +20,10 @@ public class SwiftMoyaNetWorkServiceUser: NSObject {
     public class func shared() -> SwiftMoyaNetWorkServiceUser {
         return sharedInstance
     }
-
+    
     /// 数据回调
     typealias apiCallBack = (Any) -> (Void)
 
-    /// 登录
-    ///
-    /// - Parameters:
-    ///   - mobile: 电话号码
-    ///   - password: 用户密码
-    ///   - completion: 回调
-    func userLoginApi(mobile:String,password:String,completion: @escaping apiCallBack) {
-        var parameters = Dictionary<String,Any>()
-        parameters.updateValue(mobile, forKey: "mobile")
-        parameters.updateValue(password, forKey: "password")
-        SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(LoginModel.self ,target: MultiTarget(SwiftMoyaServiceUserApi.userLogin(parameters: parameters))) { (loginModel) in
-            LoginModel.shared().setLoginModel(loginModel: loginModel as! LoginModel)
-            SwiftProgressHUD.shared().hide()
-            completion("")
-        }
-    }
-
-
-    /// 登出
-    ///
-    /// - Parameters:
-    ///   - completion: 回调
-    func userLogoutApi() {
-        let parameters = Dictionary<String,Any>()
-        SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceUserApi.userLogout(parameters: parameters))) { (data) in
-            LoginModel.shared().removeLoginModel()
-            kAppDelegate.setLoginController()
-            SwiftProgressHUD.shared().hide()
-        }
-    }
-
-    /// 刷新令牌
-    ///
-    /// - Parameters:
-    ///   - completion: 回调
-    func userRefreshApi(completion: @escaping apiCallBack) {
-        let parameters = Dictionary<String,Any>()
-        SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(LoginModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userRefresh(parameters: parameters))) { (loginModel) in
-            LoginModel.shared().setLoginModel(loginModel: loginModel as! LoginModel)
-            SwiftProgressHUD.shared().hide()
-            completion("")
-        }
-    }
-
     /// 微信注册/登录
     ///
     /// - Parameters:
@@ -88,10 +41,10 @@ public class SwiftMoyaNetWorkServiceUser: NSObject {
         parameters.updateValue(username, forKey: "username")
         parameters.updateValue(gender, forKey: "gender")
         SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(LoginModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userWeiXinRegister(parameters: parameters))) { (loginModel) in
-            LoginModel.shared().setLoginModel(loginModel: loginModel as! LoginModel)
+        SwiftMoyaNetWorkManager.shared().request(UserModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userWeiXinRegister(parameters: parameters))) { (userModel) in
+            UserModel.shared().setModel(model: userModel as! UserModel)
             SwiftProgressHUD.shared().hide()
-            completion(LoginModel.shared().getLoginModel() as Any)
+            completion(UserModel.shared().getModel() as Any)
         }
     }
 
@@ -107,8 +60,8 @@ public class SwiftMoyaNetWorkServiceUser: NSObject {
         parameters.updateValue(mobile, forKey: "mobile")
         parameters.updateValue(sms_code, forKey: "sms_code")
         SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(LoginModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userMobileRegister(parameters: parameters))) { (loginModel) in
-            LoginModel.shared().setLoginModel(loginModel: loginModel as! LoginModel)
+        SwiftMoyaNetWorkManager.shared().request(UserModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userMobileRegister(parameters: parameters))) { (userModel) in
+            UserModel.shared().setModel(model: userModel as! UserModel)
             SwiftProgressHUD.shared().hide()
             completion("")
         }
@@ -126,41 +79,48 @@ public class SwiftMoyaNetWorkServiceUser: NSObject {
         parameters.updateValue(mobile, forKey: "mobile")
         parameters.updateValue(password, forKey: "password")
         SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(LoginModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userMobileLogin(parameters: parameters))) { (loginModel) in
-            LoginModel.shared().setLoginModel(loginModel: loginModel as! LoginModel)
+        SwiftMoyaNetWorkManager.shared().request(UserModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userMobileLogin(parameters: parameters))) { (userModel) in
+            UserModel.shared().setModel(model: userModel as! UserModel)
             SwiftProgressHUD.shared().hide()
             completion("")
         }
     }
-
-    /// 绑定微信
+    
+    /// 刷新令牌
     ///
     /// - Parameters:
-    ///   - mobile: 手机号
-    ///   - umLoginModel: 微信模型
     ///   - completion: 回调
-    func userBindWeixinApi(mobile:String,umLoginModel:UMLoginModel,completion: @escaping apiCallBack) {
-        var parameters = Dictionary<String,Any>()
-        parameters.updateValue(mobile, forKey: "mobile")
-        parameters.updateValue(umLoginModel.open_id, forKey: "open_id")
-        parameters.updateValue(umLoginModel.union_id, forKey: "open_id")
-        parameters.updateValue(umLoginModel.avatar, forKey: "open_id")
-        parameters.updateValue(umLoginModel.username, forKey: "open_id")
-        parameters.updateValue(umLoginModel.gender, forKey: "open_id")
-
+    func userRefreshApi(completion: @escaping apiCallBack) {
+        let parameters = Dictionary<String,Any>()
         SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceUserApi.userBindWeixin(parameters: parameters))) { (rootModel) in
-            let rootModel = rootModel as! RootModel
-            SwiftProgressHUD.shared().showText(rootModel.msg!)
+        SwiftMoyaNetWorkManager.shared().request(UserModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userRefresh(parameters: parameters))) { (userModel) in
+            UserModel.shared().setModel(model: userModel as! UserModel)
+            SwiftProgressHUD.shared().hide()
             completion("")
         }
     }
+    
+    /// 登出
+    ///
+    /// - Parameters:
+    ///   - completion: 回调
+    func userLogoutApi() {
+        let parameters = Dictionary<String,Any>()
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceUserApi.userLogout(parameters: parameters))) { (data) in
+            UserModel.shared().removeLoginModel()
+            kAppDelegate.setLoginController()
+            SwiftProgressHUD.shared().hide()
+        }
+    }
 
     /// 绑定手机号
     ///
     /// - Parameters:
     ///   - mobile: 手机号
     ///   - smsCode: 验证码
+    ///   - unionId: 微信unioId
+    ///   - openId: 微信openId
     ///   - completion: 回调
     func userBindMobileApi(mobile:String,smsCode:String,unionId:String,openId:String,completion: @escaping apiCallBack) {
         var parameters = Dictionary<String,Any>()
@@ -170,9 +130,109 @@ public class SwiftMoyaNetWorkServiceUser: NSObject {
         parameters.updateValue(openId, forKey: "open_id")
 
         SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceUserApi.userBindMobile(parameters: parameters))) { (rootModel) in
+        SwiftMoyaNetWorkManager.shared().request(UserModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userBindMobile(parameters: parameters))) { (userModel) in
+            UserModel.shared().setModel(model: userModel as! UserModel)
+            SwiftProgressHUD.shared().hide()
+            completion("")
+        }
+    }
+    
+    /// 检查是否绑定微信 解绑
+    ///
+    /// - Parameters:
+    ///   - umLoginModel: UMLoginModel
+    ///   - completion: 回调
+    func userIsBindWeixinUnBindApi(completion: @escaping apiCallBack) {
+        let userModel = UserModel.shared().getModel()
+
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(userModel?.unionId as Any, forKey: "union_id")
+        parameters.updateValue(userModel?.openId as Any, forKey: "open_id")
+        if userModel?.mobile == nil ||  userModel?.mobile == "" {
+            SwiftProgressHUD.shared().showText("暂时不可以解绑,请先绑定手机号")
+        }else {
+            SwiftProgressHUD.shared().showWait()
+            SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceUserApi.userIsBindWeixin(parameters: parameters))) {
+                [weak self] (rootModel) in
+                self?.userUnbindWeixinApi(completion: completion)
+            }
+        }
+        
+        
+    }
+    
+    /// 检查是否绑定微信 绑定
+    ///
+    /// - Parameters:
+    ///   - umLoginModel: UMLoginModel
+    ///   - completion: 回调
+    func userIsBindWeixinBindApi(umLoginModel:UMLoginModel,completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(umLoginModel.union_id, forKey: "union_id")
+        parameters.updateValue(umLoginModel.open_id, forKey: "open_id")
+        
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceUserApi.userIsBindWeixin(parameters: parameters)),isCustomAlert: true) {
+            [weak self] (rootModel) in
             let rootModel = rootModel as! RootModel
-            SwiftProgressHUD.shared().showText(rootModel.msg!)
+            SwiftProgressHUD.shared().hide()
+            if rootModel.code == 0 {
+                self?.userBindWeixinApi(mobile: UserModel.shared().getModel()?.mobile ?? "", umLoginModel: umLoginModel, completion: completion)
+
+            }else if rootModel.code == 1 {
+                AlertSheetView.alert(title: rootModel.msg ?? "此微信号被其他账号绑定,是否要将此微信号绑定至本账号,并解绑另一起账号?", cancelTitle: "取消", sureTitle: "确认", cancelBlock: { (popupView, index, string) in
+                    
+                }, confirmBlock: { (popupView, index, string) in
+                    AlertSheetView.alert(title: "确认后,原账号将无法以此微信登录,请确保原账号有其他登录方式,否则原账号将无法登录", cancelTitle: "取消", sureTitle: "确认", cancelBlock: { (popupView, index, string) in
+                        
+                    }, confirmBlock: {
+                        [weak self] (popupView, index, string) in
+                        self?.userBindWeixinApi(mobile: UserModel.shared().getModel()?.mobile ?? "", umLoginModel: umLoginModel, completion: completion)
+
+                    })
+                })
+            }
+        }
+    }
+    
+    /// 绑定微信
+    ///
+    /// - Parameters:
+    ///   - mobile: 手机号
+    ///   - umLoginModel: 微信模型
+    ///   - completion: 回调
+    func userBindWeixinApi(mobile:String,umLoginModel:UMLoginModel,completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(mobile, forKey: "mobile")
+        parameters.updateValue(umLoginModel.open_id, forKey: "open_id")
+        parameters.updateValue(umLoginModel.union_id, forKey: "union_id")
+        parameters.updateValue(umLoginModel.avatar, forKey: "avatar")
+        parameters.updateValue(umLoginModel.username, forKey: "username")
+        parameters.updateValue(umLoginModel.gender, forKey: "gender")
+        
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared().request(UserModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userBindWeixin(parameters: parameters))) { (userModel) in
+            UserModel.shared().setModel(model: userModel as! UserModel)
+            SwiftProgressHUD.shared().hide()
+            completion("")
+        }
+    }
+    
+    /// 解绑微信
+    ///
+    /// - Parameters:
+    ///   - unionId: 微信unionId
+    ///   - openId: 微信openId
+    ///   - completion: 回调
+    func userUnbindWeixinApi(completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        let userModel = UserModel.shared().getModel()
+        parameters.updateValue(userModel?.unionId as Any, forKey: "union_id")
+        parameters.updateValue(userModel?.openId as Any, forKey: "open_id")
+        
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared().request(UserModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userUnbindWeixin(parameters: parameters))) {(userModel) in
+            UserModel.shared().setModel(model: userModel as! UserModel)
             completion("")
         }
     }
@@ -191,10 +251,30 @@ public class SwiftMoyaNetWorkServiceUser: NSObject {
         parameters.updateValue(password_confirmation, forKey: "password_confirmation")
 
         SwiftProgressHUD.shared().showWait()
-        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceUserApi.userSetPassword(parameters: parameters))) { (rootModel) in
+        SwiftMoyaNetWorkManager.shared().request(target: MultiTarget(SwiftMoyaServiceUserApi.userSetPassword(parameters: parameters))) {
+            [weak self] (rootModel) in
             let rootModel = rootModel as! RootModel
-            SwiftProgressHUD.shared().showText(rootModel.msg!)
-            completion("")
+            SwiftProgressHUD.shared().hide()
+            self?.userRefreshApi(completion: { (userModel) in
+                SwiftProgressHUD.shared().showText(rootModel.msg!)
+                completion("")
+            })
+        }
+    }
+    
+    /// 用户自提点,快递地址列表
+    ///
+    /// - Parameters:
+    ///   - type: 手机号 0所有列表,1自提点列表,2快递列表
+    ///   - completion: 回调
+    func userSelfAndExpressAddressListApi(type:Int,completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(type, forKey: "type")
+        
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared().request(AddressManagerListModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userSelfAddressList(parameters: parameters))) {(addressManagerListModel) in
+            SwiftProgressHUD.shared().hide()
+            completion(addressManagerListModel)
         }
     }
 

+ 52 - 31
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceUser/SwiftMoyaServiceUserApi.swift

@@ -9,10 +9,6 @@
 import Foundation
 import Moya
 
-// MARK: - 登录
-/// 登录
-public let kUserLoginApi = "/user/login"
-
 // MARK: - 登出
 /// 登出
 public let kUserLogoutApi = "/user/logout"
@@ -43,24 +39,34 @@ public let kUserBindMobileApi = "/user/bindMobile"
 
 // MARK: - 设置密码
 /// 设置密码
-public let kUserSetPasswordApi = "/user/SetPassword"
+public let kUserSetPasswordApi = "/user/setPassword"
+
+// MARK: - 解绑微信
+/// 解绑微信
+public let kUserUnbindWeixinApi = "/user/unbindWeixin"
 
+// MARK: - 检查是否绑定微信
+/// 检查是否绑定微信
+public let kUserIsBindWeixinApi = "/user/isBindWeixin"
 
+// MARK: - 用户自提点,快递地址列表
+/// 用户自提点,快递地址列表
+public let kUserSelfAddressListApi = "/user/selfAddressList"
 
 /// 用户
 ///
-/// - login: 登录
-/// - logout: 登出
-/// - refresh: 刷新用户信息
-/// - sendSms: 发送短信验证码
-/// - weiXinRegister: 微信注册/登录
-/// - mobileRegister: 手机验证码注册/登录
-/// - mobileLogin: 手机密码登录
-/// - bindWeixin: 绑定微信
-/// - bindMobile: 绑定手机号码
-/// - setPassword: 设置密码
+/// - userLogout: 登出
+/// - userRefresh: 刷新用户信息
+/// - userWeiXinRegister: 微信注册/登录
+/// - userMobileRegister: 手机验证码注册/登录
+/// - userMobileLogin: 手机密码登录
+/// - userBindWeixin: 绑定微信
+/// - userBindMobile: 绑定手机号码
+/// - userSetPassword: 设置密码
+/// - userUnbindWeixin: 解绑微信
+/// - userIsBindWeixin: 检查是否绑定微信
+/// - UserSelfAddressList: 用户自提点,快递地址列表
 public enum SwiftMoyaServiceUserApi {
-    case userLogin(parameters:Dictionary<String, Any>)
     case userLogout(parameters:Dictionary<String, Any>)
     case userRefresh(parameters:Dictionary<String, Any>)
     case userWeiXinRegister(parameters:Dictionary<String, Any>)
@@ -69,21 +75,26 @@ public enum SwiftMoyaServiceUserApi {
     case userBindWeixin(parameters:Dictionary<String, Any>)
     case userBindMobile(parameters:Dictionary<String, Any>)
     case userSetPassword(parameters:Dictionary<String, Any>)
+    case userUnbindWeixin(parameters:Dictionary<String, Any>)
+    case userIsBindWeixin(parameters:Dictionary<String, Any>)
+    case userSelfAddressList(parameters:Dictionary<String, Any>)
 }
 
 extension SwiftMoyaServiceUserApi: TargetType {
 
     public var baseURL: URL {
         switch self {
-        case .userLogin,
-             .userLogout,
+        case .userLogout,
              .userRefresh,
              .userWeiXinRegister,
              .userMobileRegister,
              .userMobileLogin,
              .userBindWeixin,
              .userBindMobile,
-             .userSetPassword
+             .userSetPassword,
+             .userUnbindWeixin,
+             .userIsBindWeixin,
+             .userSelfAddressList
             :
             return URL(string: kApiDataPrefix())!
         }
@@ -91,8 +102,6 @@ extension SwiftMoyaServiceUserApi: TargetType {
 
     public var path: String {
         switch self {
-        case .userLogin:
-            return kUserLoginApi
         case .userLogout:
             return kUserLogoutApi
         case .userRefresh:
@@ -104,25 +113,33 @@ extension SwiftMoyaServiceUserApi: TargetType {
         case .userMobileLogin:
             return kUserMobileLoginApi
         case .userBindWeixin:
-            return kUserBindMobileApi
+            return kUserBindWeixinApi
         case .userBindMobile:
             return kUserBindMobileApi
         case .userSetPassword:
             return kUserSetPasswordApi
+        case .userUnbindWeixin:
+            return kUserUnbindWeixinApi
+        case .userIsBindWeixin:
+            return kUserIsBindWeixinApi
+        case .userSelfAddressList:
+            return kUserSelfAddressListApi
         }
     }
 
     public var method: Moya.Method {
         switch self {
-        case .userLogin,
-             .userLogout,
+        case .userLogout,
              .userRefresh,
              .userWeiXinRegister,
              .userMobileRegister,
              .userMobileLogin,
              .userBindWeixin,
              .userBindMobile,
-             .userSetPassword
+             .userSetPassword,
+             .userUnbindWeixin,
+             .userIsBindWeixin,
+             .userSelfAddressList
             :
             return .post
         }
@@ -131,8 +148,7 @@ extension SwiftMoyaServiceUserApi: TargetType {
     // MARK: - 请求任务事件(这里附带上参数)
     public var task: Task {
         switch self {
-        case .userLogin(let parameters),
-             .userWeiXinRegister(let parameters),
+        case .userWeiXinRegister(let parameters),
              .userMobileRegister(let parameters),
              .userMobileLogin(let parameters)
              :
@@ -141,7 +157,10 @@ extension SwiftMoyaServiceUserApi: TargetType {
              .userRefresh(var parameters),
              .userBindWeixin(var parameters),
              .userBindMobile(var parameters),
-             .userSetPassword(var parameters)
+             .userSetPassword(var parameters),
+             .userUnbindWeixin(var parameters),
+             .userIsBindWeixin(var parameters),
+             .userSelfAddressList(var parameters)
             :
             let sign = SwiftSign.shared().sign(signType:.AccessToken, parameters: parameters)
             parameters.updateValue(sign, forKey: "sign")
@@ -164,8 +183,7 @@ extension SwiftMoyaServiceUserApi: TargetType {
     public var headers: [String : String]? {
         //同task,具体选择看后台 有application/x-www-form-urlencoded 、application/json
         switch self {
-        case .userLogin,
-             .userWeiXinRegister,
+        case .userWeiXinRegister,
              .userMobileRegister,
              .userMobileLogin
             :
@@ -174,7 +192,10 @@ extension SwiftMoyaServiceUserApi: TargetType {
              .userRefresh,
              .userBindWeixin,
              .userBindMobile,
-             .userSetPassword
+             .userSetPassword,
+             .userUnbindWeixin,
+             .userIsBindWeixin,
+             .userSelfAddressList
             :
             return (headerParameters(headerType: .tokenHeader) as! [String : String])
         }

+ 1 - 1
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftSign/SwiftSign.swift

@@ -122,7 +122,7 @@ public class SwiftSign: NSObject {
 
     private func setAccessTokenchxq_key() -> String {
         //获取当前时间
-        let access_token = LoginModel.shared().getLoginModel()?.accessToken ?? ""
+        let access_token = UserModel.shared().getModel()?.accessToken ?? ""
         return access_token
     }
 

+ 50 - 0
RainbowPlanet/RainbowPlanet/Tools/AuthorizationSwift/AuthorizationSwift.swift

@@ -0,0 +1,50 @@
+//
+//  AuthorizationSwift.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/4/26.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import UIKit
+
+class AuthorizationSwift: NSObject {
+    
+    static let shared : AuthorizationSwift = AuthorizationSwift()
+
+    
+    @available(iOS 10.0, *)
+    func userNotificationCenterAuthorization() {
+        UNUserNotificationCenter.current().getNotificationSettings {
+            settings in
+            switch settings.authorizationStatus {
+            case .authorized:
+                return
+            case .notDetermined:
+                //请求授权
+              
+                    UNUserNotificationCenter.current()
+                        .requestAuthorization(options: [.alert, .sound, .badge]) {
+                            (accepted, error) in
+                            if !accepted {
+                                print("用户不允许消息通知。")
+                            }
+                    }
+                 break
+            case .denied:
+                DispatchQueue.main.async(execute: { () -> Void in
+                    let url = URL(string: UIApplication.openSettingsURLString)
+                    if let url = url, UIApplication.shared.canOpenURL(url) {
+                        UIApplication.shared.open(url, options: [:],
+                                                  completionHandler: {
+                                                    (success) in
+                        })
+                    }
+                })
+                 break
+            default:
+                break
+            }
+        }
+    }
+}

+ 27 - 0
RainbowPlanet/RainbowPlanet/Tools/Extension/Extension+UINavigationController.swift

@@ -0,0 +1,27 @@
+//
+//  Extension+UINavigationController.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/4/26.
+//  Copyright © 2019 南鑫林. All rights reserved.
+//
+
+import Foundation
+
+// MARK - UINavigationController
+extension UINavigationController {
+    
+    /// pop到指定的页面
+    ///
+    /// - Parameter type: 控制器
+    /// - Returns: 失败
+    func popToClass<T: UIViewController>(type:T.Type) {
+        for viewController in self.viewControllers {
+            guard let _ = viewController as? T else {
+                continue
+            }
+            self.popToViewController(viewController, animated: true)
+        }
+    }
+    
+}