Ver Fonte

预报名 及 tab vc 完成

openlockPPP há 1 ano atrás
pai
commit
3e51e06c17
35 ficheiros alterados com 373 adições e 31 exclusões
  1. 18 0
      JiaPeiManage.xcodeproj/project.pbxproj
  2. 6 0
      JiaPeiManage/Assets.xcassets/Modules/tab/Contents.json
  3. 23 0
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_nor.imageset/Contents.json
  4. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_nor.imageset/tab_00_nor.png
  5. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_nor.imageset/tab_00_nor@2x.png
  6. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_nor.imageset/tab_00_nor@3x.png
  7. 23 0
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_sel.imageset/Contents.json
  8. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_sel.imageset/tab_00_sel.png
  9. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_sel.imageset/tab_00_sel@2x.png
  10. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_sel.imageset/tab_00_sel@3x.png
  11. 23 0
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_nor.imageset/Contents.json
  12. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_nor.imageset/tab_01_nor.png
  13. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_nor.imageset/tab_01_nor@2x.png
  14. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_nor.imageset/tab_01_nor@3x.png
  15. 23 0
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_sel.imageset/Contents.json
  16. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_sel.imageset/tab_01_sel.png
  17. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_sel.imageset/tab_01_sel@2x.png
  18. BIN
      JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_sel.imageset/tab_01_sel@3x.png
  19. 4 4
      JiaPeiManage/Sources/Constants/NYImage.swift
  20. 1 0
      JiaPeiManage/Sources/Extensions/UIColor+NY.swift
  21. 7 0
      JiaPeiManage/Sources/Main/Base/BaseViewController.swift
  22. 2 1
      JiaPeiManage/Sources/Modulars/Home/Controllers/HomeViewController.swift
  23. 1 1
      JiaPeiManage/Sources/Modulars/Mine/Controllers/MineViewController.swift
  24. 1 1
      JiaPeiManage/Sources/Modulars/Mine/Controllers/UpdatePasswordViewController.swift
  25. 91 0
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTabBarController.swift
  26. 17 0
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTabBarViewReactor.swift
  27. 47 8
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeListViewController.swift
  28. 4 3
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSearchPageViewController.swift
  29. 36 2
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSubjectPageViewController.swift
  30. 1 0
      JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeNavBar.swift
  31. 4 3
      JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeNavBar.xib
  32. 18 4
      JiaPeiManage/Sources/Services/CoachAPI.swift
  33. 7 1
      JiaPeiManage/Sources/Services/CoachService.swift
  34. 1 1
      JiaPeiManage/Sources/Utils/NYSwRouter.swift
  35. 15 2
      JiaPeiManage/Sources/Utils/URLNavigationMap.swift

+ 18 - 0
JiaPeiManage.xcodeproj/project.pbxproj

@@ -35,6 +35,8 @@
 		908FEEAB2A42E21900BEB81C /* MeTraineeDetails03Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908FEEAA2A42E21900BEB81C /* MeTraineeDetails03Cell.swift */; };
 		908FEEAD2A42E23C00BEB81C /* MeTraineeDetails03Cell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 908FEEAC2A42E23C00BEB81C /* MeTraineeDetails03Cell.xib */; };
 		908FEEAF2A42FA4F00BEB81C /* StuLogFacDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908FEEAE2A42FA4F00BEB81C /* StuLogFacDataModel.swift */; };
+		90971E692A493BCB00267B7F /* MeTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90971E682A493BCB00267B7F /* MeTabBarController.swift */; };
+		90971E6B2A493DE500267B7F /* MeTabBarViewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90971E6A2A493DE500267B7F /* MeTabBarViewReactor.swift */; };
 		909DA5C12A3999B30034501F /* NYTips.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5C02A3999B30034501F /* NYTips.swift */; };
 		909DA5C32A3A01220034501F /* CoachcityModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5C22A3A01220034501F /* CoachcityModel.swift */; };
 		909DA5C52A3AA1E60034501F /* MeTraineeNavBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5C42A3AA1E60034501F /* MeTraineeNavBar.swift */; };
@@ -180,6 +182,8 @@
 		908FEEAA2A42E21900BEB81C /* MeTraineeDetails03Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeDetails03Cell.swift; sourceTree = "<group>"; };
 		908FEEAC2A42E23C00BEB81C /* MeTraineeDetails03Cell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeTraineeDetails03Cell.xib; sourceTree = "<group>"; };
 		908FEEAE2A42FA4F00BEB81C /* StuLogFacDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StuLogFacDataModel.swift; sourceTree = "<group>"; };
+		90971E682A493BCB00267B7F /* MeTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTabBarController.swift; sourceTree = "<group>"; };
+		90971E6A2A493DE500267B7F /* MeTabBarViewReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTabBarViewReactor.swift; sourceTree = "<group>"; };
 		909DA5C02A3999B30034501F /* NYTips.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NYTips.swift; sourceTree = "<group>"; };
 		909DA5C22A3A01220034501F /* CoachcityModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoachcityModel.swift; sourceTree = "<group>"; };
 		909DA5C42A3AA1E60034501F /* MeTraineeNavBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeNavBar.swift; sourceTree = "<group>"; };
@@ -295,6 +299,7 @@
 		90CE52FF2A36F7110033BD06 /* HomeViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeViewController.xib; sourceTree = "<group>"; };
 		90CE53012A3834060033BD06 /* CoachAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoachAPI.swift; sourceTree = "<group>"; };
 		90CE53032A3834360033BD06 /* CoachService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoachService.swift; sourceTree = "<group>"; };
+		90E109CD2A4927A100091BC6 /* libswift_Concurrency.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libswift_Concurrency.tbd; path = usr/lib/swift/libswift_Concurrency.tbd; sourceTree = SDKROOT; };
 		A8171123E8F401C7CF842A4C /* Pods-JiaPeiManage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JiaPeiManage.debug.xcconfig"; path = "Target Support Files/Pods-JiaPeiManage/Pods-JiaPeiManage.debug.xcconfig"; sourceTree = "<group>"; };
 		D9F65764266FE5C95D1940F5 /* Pods-JiaPeiManage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JiaPeiManage.release.xcconfig"; path = "Target Support Files/Pods-JiaPeiManage/Pods-JiaPeiManage.release.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -361,6 +366,8 @@
 				909DA5CC2A3AC00D0034501F /* MeTraineeSearchPageViewController.xib */,
 				90BC4BDD2A3C4691006FD683 /* MeTraineeDetailsPageViewController.swift */,
 				90BC4BDF2A3C46C4006FD683 /* MeTraineeDetailsPageViewController.xib */,
+				90971E682A493BCB00267B7F /* MeTabBarController.swift */,
+				90971E6A2A493DE500267B7F /* MeTabBarViewReactor.swift */,
 			);
 			path = Controllers;
 			sourceTree = "<group>";
@@ -834,6 +841,7 @@
 		A24D99DBE7A92F9485B15E3A /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				90E109CD2A4927A100091BC6 /* libswift_Concurrency.tbd */,
 				1FC2879EF62A9D4DF6777C62 /* Pods_JiaPeiManage.framework */,
 			);
 			name = Frameworks;
@@ -1032,6 +1040,7 @@
 				90CE52EF2A36EC950033BD06 /* NYArticleViewController.swift in Sources */,
 				90CE52D72A36E6000033BD06 /* Snap.swift in Sources */,
 				90CE52882A36E5460033BD06 /* PopOverView.swift in Sources */,
+				90971E6B2A493DE500267B7F /* MeTabBarViewReactor.swift in Sources */,
 				90CE527F2A36E5460033BD06 /* NibLoadable.swift in Sources */,
 				90CE52FA2A36F2570033BD06 /* LoginService.swift in Sources */,
 				90CE52812A36E5460033BD06 /* BilibiliCollectionViewLayout.swift in Sources */,
@@ -1086,6 +1095,7 @@
 				90CE523A2A36E4720033BD06 /* MainTabBarViewReactor.swift in Sources */,
 				909DA5D32A3ADFD80034501F /* MeTraineeSubjectCell.swift in Sources */,
 				90CE52BD2A36E5B70033BD06 /* NetEnvironment.swift in Sources */,
+				90971E692A493BCB00267B7F /* MeTabBarController.swift in Sources */,
 				90CE52BB2A36E5B70033BD06 /* LoadingPlugin.swift in Sources */,
 				90CE52F42A36EDCF0033BD06 /* NYArticleNavBar.swift in Sources */,
 				90CE52A62A36E59A0033BD06 /* String+BoundingRect.swift in Sources */,
@@ -1271,6 +1281,10 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(SDKROOT)/usr/lib/swift",
+				);
 				MARKETING_VERSION = 1.0.1;
 				PRODUCT_BUNDLE_IDENTIFIER = zhongZheng.com.jsmanage.JiaPeiManage;
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1304,6 +1318,10 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
+				LIBRARY_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(SDKROOT)/usr/lib/swift",
+				);
 				MARKETING_VERSION = 1.0.1;
 				PRODUCT_BUNDLE_IDENTIFIER = zhongZheng.com.jsmanage.JiaPeiManage;
 				PRODUCT_NAME = "$(TARGET_NAME)";

+ 6 - 0
JiaPeiManage/Assets.xcassets/Modules/tab/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_nor.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_nor.imageset/tab_00_nor.png


BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_nor.imageset/tab_00_nor@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_nor.imageset/tab_00_nor@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_sel.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_sel.imageset/tab_00_sel.png


BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_sel.imageset/tab_00_sel@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_00_sel.imageset/tab_00_sel@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_nor.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_nor.imageset/tab_01_nor.png


BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_nor.imageset/tab_01_nor@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_nor.imageset/tab_01_nor@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_sel.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_sel.imageset/tab_01_sel.png


BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_sel.imageset/tab_01_sel@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/tab/tab_01_sel.imageset/tab_01_sel@3x.png


+ 4 - 4
JiaPeiManage/Sources/Constants/NYImage.swift

@@ -14,10 +14,10 @@ struct NYImage {
         static let background = UIImage(named: "launch_background")
     }
     struct TabBar {
-        static let home = UIImage(named: "tabBar_exam")
-        static let home_s = UIImage(named: "tabBar_exam_s")
-        static let timeKeep =  UIImage(named: "tabBar_timer")
-        static let timeKeep_s = UIImage(named: "tabBar_timer_s")
+        static let advancet = UIImage(named: "tab_00_nor")
+        static let advancet_s = UIImage(named: "tab_00_sel")
+        static let official =  UIImage(named: "tab_01_nor")
+        static let official_s = UIImage(named: "tab_01_sel")
         static let mine = UIImage(named: "tabBar_mine")
         static let mine_s = UIImage(named: "tabBar_mine_s")
     }

+ 1 - 0
JiaPeiManage/Sources/Extensions/UIColor+NY.swift

@@ -18,6 +18,7 @@ extension UIColor {
     class var db_black: UIColor { return UIColor(38,38,38) }
     class var db_lightBlack: UIColor { return UIColor(63,63,63) }
     class var db_orange: UIColor { return UIColor(231,157,105) }
+    class var db_tbbg: UIColor { return UIColor("#021933")! }
     
     //新增
     class var db_theme: UIColor { return UIColor("#06203A")! }

+ 7 - 0
JiaPeiManage/Sources/Main/Base/BaseViewController.swift

@@ -20,6 +20,13 @@ class BaseViewController: UIViewController, NetAnimationLoadable {
     }()
     
     @IBAction func actionBackdo(_ sender: Any) {
+        if let presentingViewController = self.presentingViewController {
+            // 视图控制器是通过 presentViewController 呈现的
+            if self.navigationController?.viewControllers.count == 1 {
+                self.dismiss(animated: true)
+                return
+            }
+        }
         self.navigationController?.popViewController(animated: true)
     }
     /// There is a bug when trying to go back to previous view controller in a navigation controller

+ 2 - 1
JiaPeiManage/Sources/Modulars/Home/Controllers/HomeViewController.swift

@@ -52,7 +52,8 @@ final class HomeViewController: BaseViewController {
         //我的学员-action-btn
         self.meStuAction_button.rx.tap.subscribe ({ [unowned self] (_)  in
             
-            NYSwRouter.push(NYSwPushType.trainee_list.path)
+            NYSwRouter.open(NYSwOpenType.traineetab.rawValue)
+            //NYSwRouter.push(NYSwPushType.trainee_list.path)
         }).disposed(by: disposeBag)
         //在校学员-action
         self.onSchoolAction_button.rx.tap.subscribe ({ [unowned self] (_)  in

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

@@ -50,7 +50,7 @@ final class MineViewController: BaseViewController {
     func setupUI(){
         self.view.backgroundColor = .db_theme
         //跳修改密码
-        update_password_button.rx.tap.subscribe ({ _  in
+        update_password_button.rx.tap.subscribe ({  [unowned self] (_) in
             NYSwRouter.push(NYSwPushType.mine_uppassword.path)
         }).disposed(by: disposeBag)
     }

+ 1 - 1
JiaPeiManage/Sources/Modulars/Mine/Controllers/UpdatePasswordViewController.swift

@@ -55,7 +55,7 @@ final class UpdatePasswordViewController: BaseViewController {
         two_pwdshow_button.rx.tap.subscribe ({ [unowned self] (_)  in
             self.two_pwdshow_button.isSelected = !self.two_pwdshow_button.isSelected;
             self.two_password_textfield.isSecureTextEntry = !self.two_pwdshow_button.isSelected
-        }).disposed(by: disposeBag)
+        }).disposed(by: disposeBag) 
         
         //判断密码的输入是否可用
         let old_passwordValid = old_password_textfield.rx.text.orEmpty.map{ value in

+ 91 - 0
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTabBarController.swift

@@ -0,0 +1,91 @@
+//
+//  MeTabBarController.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/6/26.
+//
+
+import UIKit
+
+import ReactorKit
+import RxCocoa
+import RxSwift
+
+final class MeTabBarController: UITabBarController, View {
+
+    
+    // MARK: Constants
+    
+    fileprivate struct Metric {
+        static let tabBarHeight = 50.f
+    }
+    
+    // MARK: Properties
+    
+    var disposeBag = DisposeBag()
+
+    init(
+       reactor: MainTabBarViewReactor,
+       advancetViewController:MeTraineeListViewController,
+       officialViewController:MeTraineeListViewController
+     ) {
+        defer { self.reactor = reactor }
+        super.init(nibName: nil, bundle: nil)
+        self.viewControllers = [advancetViewController,
+                                officialViewController]
+            .map{ (viewController) -> UINavigationController in
+                let navigationController = MainNavigationController(rootViewController: viewController)
+//                navigationController.tabBarItem.imageInsets.top = 5
+//                navigationController.tabBarItem.imageInsets.bottom = 5
+                navigationController.tabBarItem.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: -3)
+                return navigationController
+             }
+         // 获取当前 tabBar 的选中项
+         if let items = self.tabBar.items {
+             for item in items {
+                 // 设置选中项的标题字体和颜色
+                 item.setTitleTextAttributes([NSAttributedString.Key.font: NYFont.SysFont.sys_10,
+                                              NSAttributedString.Key.foregroundColor: UIColor("#30B05C") as Any],
+                                             for: .selected)
+             }
+         }
+         self.selectedIndex = 1
+         self.tabBar.barTintColor = .db_tbbg
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    // MARK: Configuring
+    
+    func bind(reactor: MainTabBarViewReactor) {
+        
+        self.rx.didSelect
+            .scan((nil, nil)) { state, viewController in
+                return (state.1, viewController)
+            }.subscribe(onNext: { (fromVc,toVc) in
+                
+//                if fromVc == toVc || fromVc == nil {
+//                    TogetherDataManager.refreshDataForTab(toVc, true)
+//                } else {
+//                    TogetherDataManager.refreshDataForTab(toVc, false)
+//                }
+//                if TogetherDataManager.homePageController(toVc) == nil {
+//                   TogetherDataManager.referenceDate = Date()
+//                }
+            }).disposed(by: disposeBag)
+    }
+    
+    
+    override func viewDidLayoutSubviews() {
+        super.viewDidLayoutSubviews()
+        if #available(iOS 11.0, *) {
+            self.tabBar.height = Metric.tabBarHeight + self.view.safeAreaInsets.bottom
+        } else {
+            self.tabBar.height = Metric.tabBarHeight
+        }
+        self.tabBar.bottom = self.view.height
+    }
+}
+

+ 17 - 0
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTabBarViewReactor.swift

@@ -0,0 +1,17 @@
+//
+//  MeTabBarViewReactor.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/6/26.
+//
+
+import ReactorKit
+
+final class MeTabBarViewReactor: Reactor {
+    
+    typealias Action = NoAction
+    
+    struct State {}
+    
+    let initialState: State = State()
+}

+ 47 - 8
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeListViewController.swift

@@ -9,6 +9,11 @@ import UIKit
 import RxSwift
 import RxCocoa
 
+enum TraineeType {
+    case advancet
+    case official
+    case none
+}
 
 final class MeTraineeListViewController: BaseViewController {
     
@@ -27,6 +32,8 @@ final class MeTraineeListViewController: BaseViewController {
     
     var schoolId:Int = 0
     
+    var type:TraineeType?
+    
     // MARK: UI let
     let statusBar = UIView().then {
         $0.backgroundColor = UIColor.db_theme
@@ -79,6 +86,33 @@ final class MeTraineeListViewController: BaseViewController {
         self.navigationController?.setNavigationBarHidden(true, animated: true)
     }
     
+    init(type:TraineeType) {
+        self.type = type
+        super.init()
+        
+        switch type {
+        case .advancet:
+            self.navBar.title_label.text = "我的学员-预报名"
+            self.title = "预报名学员"
+            self.tabBarItem.image = NYImage.TabBar.advancet
+            self.tabBarItem.selectedImage = NYImage.TabBar.advancet_s?.withRenderingMode(.alwaysOriginal)
+          return
+        case .official:
+            self.navBar.title_label.text = "我的学员-正式"
+            self.title = "正式学员"
+            self.tabBarItem.image = NYImage.TabBar.official
+            self.tabBarItem.selectedImage = NYImage.TabBar.official_s?.withRenderingMode(.alwaysOriginal)
+            return
+        case .none:
+            return
+        }
+        
+    }
+    
+    required convenience init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
     override func viewDidLoad() {
         super.viewDidLoad()
         setupUI()
@@ -89,9 +123,10 @@ final class MeTraineeListViewController: BaseViewController {
     func setupUI(){
         self.view.backgroundColor = .db_theme
         self.navBar.back_button.addTarget(self, action: #selector(actionBackdo), for: .touchUpInside)
-        self.navBar.search_button.rx.tap.subscribe ({ _  in
-            NYSwRouter.push(NYSwPushType.trainee_search.path)
-        }).disposed(by: disposeBag)
+        self.navBar.search_button.addTarget(self, action: #selector(jumpSearchdo), for: .touchUpInside)
+//        self.navBar.search_button.rx.tap.subscribe ({  [unowned self] (_) in
+//            self.jumpSearch()
+//        }).disposed(by: self.disposeBag)
     }
     
     func configureMagicController(){
@@ -107,6 +142,10 @@ final class MeTraineeListViewController: BaseViewController {
         pageController.magicView.reloadData(toPage: 0)
         
     }
+    
+    @objc func jumpSearchdo(_ sender: Any){
+        NYSwRouter.push(NYSwPushType.trainee_search.path)
+    }
 }
 //VTMagicViewDelegate view代理
 extension MeTraineeListViewController : VTMagicViewDelegate {
@@ -201,31 +240,31 @@ extension MeTraineeListViewController : VTMagicViewDataSource{
         if pageIndex == 0 {
             var meTraineeSubjectPageViewController = magicView.dequeueReusablePage(withIdentifier: "MeTraineeSubjectPageViewController01")
             if meTraineeSubjectPageViewController == nil {
-                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(state: "1",schoolId: schoolId)
+                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(type: self.type!,state: "1",schoolId: schoolId)
             }
             return meTraineeSubjectPageViewController ?? UIViewController()
         } else if pageIndex == 1 {
             var meTraineeSubjectPageViewController = magicView.dequeueReusablePage(withIdentifier: "MeTraineeSubjectPageViewController02")
             if meTraineeSubjectPageViewController == nil {
-                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(state: "2",schoolId: schoolId)
+                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(type: self.type!,state: "2",schoolId: schoolId)
             }
             return meTraineeSubjectPageViewController ?? UIViewController()
         } else if pageIndex == 2 {
             var meTraineeSubjectPageViewController = magicView.dequeueReusablePage(withIdentifier: "MeTraineeSubjectPageViewController03")
             if meTraineeSubjectPageViewController == nil {
-                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(state: "3",schoolId: schoolId)
+                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(type: self.type!,state: "3",schoolId: schoolId)
             }
             return meTraineeSubjectPageViewController ?? UIViewController()
         } else if pageIndex == 3{
             var meTraineeSubjectPageViewController = magicView.dequeueReusablePage(withIdentifier: "MeTraineeSubjectPageViewController04")
             if meTraineeSubjectPageViewController == nil {
-                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(state: "4",schoolId: schoolId)
+                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(type: self.type!,state: "4",schoolId: schoolId)
             }
             return meTraineeSubjectPageViewController ?? UIViewController()
         } else {
             var meTraineeSubjectPageViewController = magicView.dequeueReusablePage(withIdentifier: "MeTraineeSubjectPageViewController05")
             if meTraineeSubjectPageViewController == nil {
-                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(state: "5",schoolId: schoolId)
+                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController(type: self.type!,state: "5",schoolId: schoolId)
             }
             return meTraineeSubjectPageViewController ?? UIViewController()
         }

+ 4 - 3
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSearchPageViewController.swift

@@ -33,7 +33,7 @@ final class MeTraineeSearchPageViewController: BaseTableViewController {
     // MARK: 数据
     var traineeDataModel:TraineeDataModel?
     var page:Int = 1
-    var pageSize:Int = 10
+    var pageSize:Int = 100
     var state = ""
     //重置约束
     override func setupConstraints() {
@@ -148,9 +148,10 @@ extension MeTraineeSearchPageViewController:UITableViewDelegate {
     
     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         tableView.deselectRow(at: indexPath, animated: false)
-        let rowInfo = self.traineeDataModel?.rows![indexPath.row]
+        let rowInfo:RowInfo = (self.traineeDataModel?.rows![indexPath.row])!
         if rowInfo != nil {
-            NYSwRouter.push(NYSwPushType.trainee_info.path)
+            let context: Int = rowInfo.id!
+            NYSwRouter.push(NYSwPushType.trainee_info,context: context)
         }
     }
     

+ 36 - 2
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSubjectPageViewController.swift

@@ -27,8 +27,10 @@ final class MeTraineeSubjectPageViewController: BaseTableViewController {
     var pageSize:Int = 10
     var state = "1"
     var schoolId:Int = 0
+    var type:TraineeType?
     
-    init(state:String,schoolId:Int) {
+    init(type:TraineeType,state:String,schoolId:Int) {
+        self.type = type
         super.init()
         self.state = state
         self.schoolId = schoolId
@@ -52,6 +54,23 @@ final class MeTraineeSubjectPageViewController: BaseTableViewController {
     func getCoachInfoList()
     {
         page = 1
+        if (self.type == .advancet){ //预报名
+            self.cocahService.coachTempListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: "\(LocalManager.userInfo.id)", field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
+                .subscribe(onSuccess: { traineeDataModel in
+                    self.rows.removeAll()
+                    self.traineeDataModel = traineeDataModel
+                    self.rows += traineeDataModel.rows!
+                    print("coachInfoListRequest成功")
+                    self.hideLoadAnimation()
+                    self.tableView.reloadData()
+                    self.stopRefresh()
+                }, onError: { error in
+                    self.stopRefresh()
+                })
+                .disposed(by: disposeBag)
+            
+            return
+        }
         self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: "\(LocalManager.userInfo.id)", field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
             .subscribe(onSuccess: { traineeDataModel in
                 self.rows.removeAll()
@@ -79,6 +98,22 @@ final class MeTraineeSubjectPageViewController: BaseTableViewController {
                 return //已经显示完
             }
         }
+        if (self.type == .advancet){ //预报名
+            self.cocahService.coachTempListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: "\(LocalManager.userInfo.id)", field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
+                .subscribe(onSuccess: { traineeDataModel in
+                    self.traineeDataModel = traineeDataModel
+                    if(traineeDataModel.rows!.count>0){
+                        self.rows += traineeDataModel.rows!
+                    }
+                    print("coachInfoListRequest成功")
+                    self.tableView.reloadData()
+                    self.stopLoad()
+                }, onError: { error in
+                    self.stopLoad()
+                })
+                .disposed(by: disposeBag)
+            return
+        }
         //请求网络-加载
         self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: "\(LocalManager.userInfo.id)", field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
             .subscribe(onSuccess: { traineeDataModel in
@@ -93,7 +128,6 @@ final class MeTraineeSubjectPageViewController: BaseTableViewController {
                 self.stopLoad()
             })
             .disposed(by: disposeBag)
-
     }
     
     func biandView(){

+ 1 - 0
JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeNavBar.swift

@@ -14,6 +14,7 @@ final class MeTraineeNavBar: UIView,NibLoadable {
     
     @IBOutlet weak var search_button: UIButton!
     
+    @IBOutlet weak var title_label: UILabel!
     
     override func awakeFromNib() {
         super.awakeFromNib()

+ 4 - 3
JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeNavBar.xib

@@ -24,9 +24,9 @@
                     <state key="normal" image="back-white"/>
                 </button>
                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="我的学员" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="elb-1k-lgc">
-                    <rect key="frame" x="142.66666666666666" y="0.0" width="90" height="44"/>
+                    <rect key="frame" x="87.666666666666686" y="0.0" width="200" height="44"/>
                     <constraints>
-                        <constraint firstAttribute="width" constant="90" id="DEo-Se-EWT"/>
+                        <constraint firstAttribute="width" constant="200" id="DEo-Se-EWT"/>
                         <constraint firstAttribute="height" constant="44" id="eQe-Iw-dSz"/>
                     </constraints>
                     <fontDescription key="fontDescription" type="system" pointSize="15"/>
@@ -55,8 +55,9 @@
             </constraints>
             <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
             <connections>
-                <outlet property="back_button" destination="TuQ-3p-qxM" id="yGZ-cf-bXb"/>
+                <outlet property="back_button" destination="TuQ-3p-qxM" id="1GW-pm-8qm"/>
                 <outlet property="search_button" destination="S9t-pm-aGk" id="XXf-ZV-enb"/>
+                <outlet property="title_label" destination="elb-1k-lgc" id="Nte-Z6-13n"/>
             </connections>
             <point key="canvasLocation" x="89.312977099236633" y="138.73239436619718"/>
         </view>

+ 18 - 4
JiaPeiManage/Sources/Services/CoachAPI.swift

@@ -16,6 +16,8 @@ enum CoachAPI {
     case coachQrInfo(id:String ,city:String)
     //获取教练的学员
     case coachInfoList(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String )
+    //获取教练预报名的学员
+    case coachTempList(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String )
     //通过id获取学员详细
     case studentInfoById(city:String,id:Int )
     //查询成绩
@@ -30,8 +32,8 @@ extension CoachAPI: TargetType {
     
     var baseURL: URL {
         switch self {
-        case .coachInfo,.coachQrInfo,.coachInfoList,.studentInfoById,.stuScoreByOutId
-            ,.stuTmsSignListByStuId,.stuTmsLogFacListByStuId:
+        case .coachInfo,.coachQrInfo,.coachInfoList,.coachTempList,.studentInfoById,
+                .stuScoreByOutId,.stuTmsSignListByStuId,.stuTmsLogFacListByStuId:
             return URL(string: HttpRequest.api.path)!
         }
     }
@@ -44,6 +46,8 @@ extension CoachAPI: TargetType {
             return "/jsjp-admin/open-api/tms/coachInfo/getCoachQrInfo"
         case .coachInfoList(_,_,_,_,_,_,_,_):
             return "/jsjp-admin/open-api/tms/coachInfo/list"
+        case .coachTempList(_,_,_,_,_,_,_,_):
+            return "/jsjp-admin/open-api/tms/coachInfo/studenTempList"
         case .studentInfoById(_,_):
             return "/jsjp-admin/open-api/tms/coachInfo/getTmsStudentInfoById"
         case .stuScoreByOutId(_,_,_):
@@ -59,7 +63,8 @@ extension CoachAPI: TargetType {
     
     var method: Moya.Method {
         switch self {
-        case .coachInfo,.coachQrInfo,.coachInfoList,.studentInfoById,.stuScoreByOutId,.stuTmsLogFacListByStuId:
+        case .coachInfo,.coachQrInfo,.coachInfoList,.coachTempList,
+                .studentInfoById,.stuScoreByOutId,.stuTmsLogFacListByStuId:
             return .get
         default:
             return .get
@@ -72,7 +77,7 @@ extension CoachAPI: TargetType {
     
     var task: Moya.Task {
         switch self {
-        case .coachInfo(_,_),.coachQrInfo(_,_),.coachInfoList(_,_,_,_,_,_,_,_),.studentInfoById(_,_)
+        case .coachInfo(_,_),.coachQrInfo(_,_),.coachInfoList(_,_,_,_,_,_,_,_),.coachTempList(_,_,_,_,_,_,_,_),.studentInfoById(_,_)
             ,.stuScoreByOutId(_,_,_),.stuTmsSignListByStuId(_,_,_,_),.stuTmsLogFacListByStuId(_,_,_,_):
             if let parameters = parameters {
                 return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
@@ -94,6 +99,15 @@ extension CoachAPI: TargetType {
         case let .coachQrInfo(id,city):
             return ["city": city,
                     "id": id,]
+        case let .coachTempList(city,appCoachId ,coachId ,field ,pageNum ,pageSize ,schoolId ,state):
+            return ["city": city,
+                    "appCoachId": appCoachId,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "schoolId": schoolId==0 ?"":"\(schoolId)",
+                    "state": state,]
         case let .coachInfoList(city,appCoachId ,coachId ,field ,pageNum ,pageSize ,schoolId ,state):
             return ["city": city,
                     "appCoachId": appCoachId,

+ 7 - 1
JiaPeiManage/Sources/Services/CoachService.swift

@@ -16,6 +16,8 @@ protocol CoachServiceType {
     func coachQrInfoRequest(id:String ,city:String) -> Single<UserInfo>
     //获取我的学员信息list
     func coachInfoListRequest(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String) -> Single<TraineeDataModel>
+    //获取我的预报名学员信息list
+    func coachTempListRequest(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String) -> Single<TraineeDataModel>
     //通过id获取学员详细
     func studentInfoByIdRequest(city:String,id:Int) -> Single<TraineeInfoModel>
     //通过id获取学员成绩
@@ -29,7 +31,6 @@ protocol CoachServiceType {
 
 final class CoachService: CoachServiceType {
 
-    
     private let networking : CoachNetworking
     
     init(networking: CoachNetworking) {
@@ -51,6 +52,11 @@ final class CoachService: CoachServiceType {
         return networking.request(api).map(TraineeDataModel.self,isModel: true)
     }
     
+    func coachTempListRequest(city: String, appCoachId: String, coachId: String, field: String, pageNum: Int, pageSize: Int, schoolId: Int, state: String) -> RxSwift.Single<TraineeDataModel> {
+        let api = CoachAPI.coachTempList(city: city, appCoachId: appCoachId, coachId: coachId, field: field, pageNum: pageNum, pageSize: pageSize, schoolId: schoolId, state: state)
+        return networking.request(api).map(TraineeDataModel.self,isModel: true)
+    }
+    
     func studentInfoByIdRequest(city: String, id: Int) -> RxSwift.Single<TraineeInfoModel> {
         let api = CoachAPI.studentInfoById(city: city, id: id)
         return networking.request(api).map(TraineeInfoModel.self)

+ 1 - 1
JiaPeiManage/Sources/Utils/NYSwRouter.swift

@@ -23,7 +23,7 @@ enum NYSwPushType {
 enum NYSwOpenType: String {
     case uprotocol = "https://ys.zzxcx.net/xy_jsjp.html"
     case all = "http://live.bilibili.com/app/all-live/"
-    
+    case traineetab = "JiaPeiManage://app/traineetab"
     case login = "JiaPeiManage://app/login"
 }
 

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

@@ -27,13 +27,13 @@ final class URLNavigationMap {
         }
         
         navigator.register(NYSwPushType.trainee_list.path) { (url, values, context) -> UIViewController? in
-            let meTraineeListViewController = MeTraineeListViewController()
+            let meTraineeListViewController = MeTraineeListViewController(type: .none)
             return meTraineeListViewController
         }
         
         navigator.register(NYSwPushType.trainee_list_school.path) { (url, values, context) -> UIViewController? in
             
-            let meTraineeListViewController = MeTraineeListViewController()
+            let meTraineeListViewController = MeTraineeListViewController(type: .none)
             meTraineeListViewController.schoolId = context as! Int
             return meTraineeListViewController
         }
@@ -50,11 +50,13 @@ final class URLNavigationMap {
             return mineViewController
         }
         
+        //open api
         navigator.register("http://<path:_>",self.webViewControllerFactory)
         navigator.register("https://<path:_>",self.webViewControllerFactory)
 //        navigator.handle(NYSwOpenType.area.rawValue, self.area(navigator: navigator))
 //        navigator.handle(NYSwOpenType.all.rawValue, self.all(navigator: navigator))
         navigator.handle(NYSwOpenType.login.rawValue, self.login(navigator: navigator))
+        navigator.handle(NYSwOpenType.traineetab.rawValue, self.meTraineeTab(navigator: navigator))
     }
     
     private static func webViewControllerFactory(
@@ -109,5 +111,16 @@ final class URLNavigationMap {
         }
     }
     
+    private static func meTraineeTab(navigator: NavigatorType) -> URLOpenHandlerFactory {
+        return { url, values, context in
+            let meTabBarController = MeTabBarController(reactor: MainTabBarViewReactor(),
+                                                        advancetViewController: MeTraineeListViewController(type: .advancet),
+                                                        officialViewController: MeTraineeListViewController(type: .official)
+                                                           )
+            navigator.present(meTabBarController)
+            return true
+        }
+    }
+    
 }