Przeglądaj źródła

我的学员 页面逻辑up

openlockPPP 1 rok temu
rodzic
commit
6e03826388
77 zmienionych plików z 1392 dodań i 32 usunięć
  1. 40 0
      JiaPeiManage.xcodeproj/project.pbxproj
  2. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Common/search-white.imageset/Contents.json
  3. BIN
      JiaPeiManage/Assets.xcassets/Modules/Common/search-white.imageset/search-white.png
  4. BIN
      JiaPeiManage/Assets.xcassets/Modules/Common/search-white.imageset/search-white@2x.png
  5. BIN
      JiaPeiManage/Assets.xcassets/Modules/Common/search-white.imageset/search-white@3x.png
  6. 6 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/Contents.json
  7. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/K1_no.imageset/Contents.json
  8. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K1_no.imageset/K1灰.png
  9. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K1_no.imageset/K1灰@2x.png
  10. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K1_no.imageset/K1灰@3x.png
  11. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/K1_yes.imageset/Contents.json
  12. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K1_yes.imageset/K1绿.png
  13. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K1_yes.imageset/K1绿@2x.png
  14. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K1_yes.imageset/K1绿@3x.png
  15. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/K3_no.imageset/Contents.json
  16. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K3_no.imageset/K3灰.png
  17. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K3_no.imageset/K3灰@2x.png
  18. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K3_no.imageset/K3灰@3x.png
  19. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/K3_yes.imageset/Contents.json
  20. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K3_yes.imageset/K3绿.png
  21. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K3_yes.imageset/K3绿@2x.png
  22. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K3_yes.imageset/K3绿@3x.png
  23. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/K4_no.imageset/Contents.json
  24. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K4_no.imageset/K4灰.png
  25. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K4_no.imageset/K4灰@2x.png
  26. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K4_no.imageset/K4灰@3x.png
  27. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/K4_yes.imageset/Contents.json
  28. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K4_yes.imageset/K4绿.png
  29. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K4_yes.imageset/K4绿@2x.png
  30. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/K4_yes.imageset/K4绿@3x.png
  31. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/call_phone.imageset/Contents.json
  32. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/call_phone.imageset/打电话.png
  33. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/call_phone.imageset/打电话@2x.png
  34. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/call_phone.imageset/打电话@3x.png
  35. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/k2_no.imageset/Contents.json
  36. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/k2_no.imageset/k2灰.png
  37. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/k2_no.imageset/k2灰@2x.png
  38. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/k2_no.imageset/k2灰@3x.png
  39. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/k2_yes.imageset/Contents.json
  40. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/k2_yes.imageset/k2绿.png
  41. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/k2_yes.imageset/k2绿@2x.png
  42. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/k2_yes.imageset/k2绿@3x.png
  43. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/send_msg.imageset/Contents.json
  44. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/send_msg.imageset/发短信.png
  45. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/send_msg.imageset/发短信@2x.png
  46. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/send_msg.imageset/发短信@3x.png
  47. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/矩形A.imageset/Contents.json
  48. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/矩形A.imageset/矩形A.png
  49. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/矩形A.imageset/矩形A@2x.png
  50. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/矩形A.imageset/矩形A@3x.png
  51. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/矩形B.imageset/Contents.json
  52. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/矩形B.imageset/矩形B.png
  53. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/矩形B.imageset/矩形B@2x.png
  54. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/矩形B.imageset/矩形B@3x.png
  55. 2 0
      JiaPeiManage/Sources/Extensions/DefaultsKeys+Key.swift
  56. 8 3
      JiaPeiManage/Sources/Extensions/UIColor+NY.swift
  57. 72 0
      JiaPeiManage/Sources/Models/TraineeDataModel.swift
  58. 11 0
      JiaPeiManage/Sources/Models/UserInfoModel.swift
  59. 2 1
      JiaPeiManage/Sources/Modulars/Login/Controllers/LoginViewController.swift
  60. 4 0
      JiaPeiManage/Sources/Modulars/Mine/Controllers/MineViewController.swift
  61. 35 0
      JiaPeiManage/Sources/Modulars/Mine/Controllers/UpdatePasswordViewController.swift
  62. 31 0
      JiaPeiManage/Sources/Modulars/Mine/Controllers/UpdatePasswordViewController.xib
  63. 197 1
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeListViewController.swift
  64. 21 0
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSearchPageViewController.swift
  65. 31 0
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSearchPageViewController.xib
  66. 82 0
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSubjectPageViewController.swift
  67. 24 0
      JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeNavBar.swift
  68. 68 0
      JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeNavBar.xib
  69. 77 0
      JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeSubjectCell.swift
  70. 297 0
      JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeSubjectCell.xib
  71. 4 2
      JiaPeiManage/Sources/Networking/RequestError.swift
  72. 40 0
      JiaPeiManage/Sources/Rx/Moya+Rx.swift
  73. 17 4
      JiaPeiManage/Sources/Services/CoachAPI.swift
  74. 7 0
      JiaPeiManage/Sources/Services/CoachService.swift
  75. 5 5
      JiaPeiManage/Sources/Utils/LocalManager.swift
  76. 6 6
      JiaPeiManage/Sources/Utils/NYSwRouter.swift
  77. 6 10
      JiaPeiManage/Sources/Utils/URLNavigationMap.swift

+ 40 - 0
JiaPeiManage.xcodeproj/project.pbxproj

@@ -12,6 +12,16 @@
 		9076C5DF2A387CBC00E5E33F /* MeTraineeListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9076C5DE2A387CBC00E5E33F /* MeTraineeListViewController.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 */; };
+		909DA5C72A3AA1FF0034501F /* MeTraineeNavBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 909DA5C62A3AA1FF0034501F /* MeTraineeNavBar.xib */; };
+		909DA5C92A3ABEFF0034501F /* MeTraineeSubjectPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5C82A3ABEFF0034501F /* MeTraineeSubjectPageViewController.swift */; };
+		909DA5CB2A3ABFFD0034501F /* MeTraineeSearchPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5CA2A3ABFFD0034501F /* MeTraineeSearchPageViewController.swift */; };
+		909DA5CD2A3AC00D0034501F /* MeTraineeSearchPageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 909DA5CC2A3AC00D0034501F /* MeTraineeSearchPageViewController.xib */; };
+		909DA5CF2A3AC23B0034501F /* UpdatePasswordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5CE2A3AC23B0034501F /* UpdatePasswordViewController.swift */; };
+		909DA5D12A3AC2460034501F /* UpdatePasswordViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 909DA5D02A3AC2460034501F /* UpdatePasswordViewController.xib */; };
+		909DA5D32A3ADFD80034501F /* MeTraineeSubjectCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909DA5D22A3ADFD80034501F /* MeTraineeSubjectCell.swift */; };
+		909DA5D52A3AE0160034501F /* MeTraineeSubjectCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 909DA5D42A3AE0160034501F /* MeTraineeSubjectCell.xib */; };
+		90BC4BD92A3B0F98006FD683 /* TraineeDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90BC4BD82A3B0F98006FD683 /* TraineeDataModel.swift */; };
 		90CE52192A36C0710033BD06 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90CE52182A36C0710033BD06 /* AppDelegate.swift */; };
 		90CE521D2A36C0710033BD06 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90CE521C2A36C0710033BD06 /* ViewController.swift */; };
 		90CE52202A36C0710033BD06 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 90CE521E2A36C0710033BD06 /* Main.storyboard */; };
@@ -117,6 +127,16 @@
 		9076C5DE2A387CBC00E5E33F /* MeTraineeListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeListViewController.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>"; };
+		909DA5C62A3AA1FF0034501F /* MeTraineeNavBar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeTraineeNavBar.xib; sourceTree = "<group>"; };
+		909DA5C82A3ABEFF0034501F /* MeTraineeSubjectPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeSubjectPageViewController.swift; sourceTree = "<group>"; };
+		909DA5CA2A3ABFFD0034501F /* MeTraineeSearchPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeSearchPageViewController.swift; sourceTree = "<group>"; };
+		909DA5CC2A3AC00D0034501F /* MeTraineeSearchPageViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeTraineeSearchPageViewController.xib; sourceTree = "<group>"; };
+		909DA5CE2A3AC23B0034501F /* UpdatePasswordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePasswordViewController.swift; sourceTree = "<group>"; };
+		909DA5D02A3AC2460034501F /* UpdatePasswordViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdatePasswordViewController.xib; sourceTree = "<group>"; };
+		909DA5D22A3ADFD80034501F /* MeTraineeSubjectCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeSubjectCell.swift; sourceTree = "<group>"; };
+		909DA5D42A3AE0160034501F /* MeTraineeSubjectCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeTraineeSubjectCell.xib; sourceTree = "<group>"; };
+		90BC4BD82A3B0F98006FD683 /* TraineeDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TraineeDataModel.swift; sourceTree = "<group>"; };
 		90CE52152A36C0700033BD06 /* JiaPeiManage.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JiaPeiManage.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		90CE52182A36C0710033BD06 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		90CE521C2A36C0710033BD06 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
@@ -245,6 +265,8 @@
 			children = (
 				9076C5D92A386B2300E5E33F /* MineViewController.swift */,
 				9076C5DB2A386B2F00E5E33F /* MineViewController.xib */,
+				909DA5CE2A3AC23B0034501F /* UpdatePasswordViewController.swift */,
+				909DA5D02A3AC2460034501F /* UpdatePasswordViewController.xib */,
 			);
 			path = Controllers;
 			sourceTree = "<group>";
@@ -262,6 +284,9 @@
 			isa = PBXGroup;
 			children = (
 				9076C5DE2A387CBC00E5E33F /* MeTraineeListViewController.swift */,
+				909DA5C82A3ABEFF0034501F /* MeTraineeSubjectPageViewController.swift */,
+				909DA5CA2A3ABFFD0034501F /* MeTraineeSearchPageViewController.swift */,
+				909DA5CC2A3AC00D0034501F /* MeTraineeSearchPageViewController.xib */,
 			);
 			path = Controllers;
 			sourceTree = "<group>";
@@ -269,6 +294,10 @@
 		9076C5D82A386B0C00E5E33F /* Views */ = {
 			isa = PBXGroup;
 			children = (
+				909DA5C42A3AA1E60034501F /* MeTraineeNavBar.swift */,
+				909DA5C62A3AA1FF0034501F /* MeTraineeNavBar.xib */,
+				909DA5D22A3ADFD80034501F /* MeTraineeSubjectCell.swift */,
+				909DA5D42A3AE0160034501F /* MeTraineeSubjectCell.xib */,
 			);
 			path = Views;
 			sourceTree = "<group>";
@@ -376,6 +405,7 @@
 			children = (
 				90CE52EC2A36EBE70033BD06 /* UserInfoModel.swift */,
 				909DA5C22A3A01220034501F /* CoachcityModel.swift */,
+				90BC4BD82A3B0F98006FD683 /* TraineeDataModel.swift */,
 			);
 			path = Models;
 			sourceTree = "<group>";
@@ -767,12 +797,16 @@
 				90CE52F52A36EDCF0033BD06 /* NYArticleNavBar.xib in Resources */,
 				90CE52252A36C0720033BD06 /* LaunchScreen.storyboard in Resources */,
 				90CE528A2A36E5460033BD06 /* PopOverViewCell.xib in Resources */,
+				909DA5D12A3AC2460034501F /* UpdatePasswordViewController.xib in Resources */,
 				90CE52222A36C0720033BD06 /* Assets.xcassets in Resources */,
 				9076C5DC2A386B2F00E5E33F /* MineViewController.xib in Resources */,
 				90CE52202A36C0710033BD06 /* Main.storyboard in Resources */,
 				90CE52EB2A36E8680033BD06 /* LoginViewController.xib in Resources */,
+				909DA5D52A3AE0160034501F /* MeTraineeSubjectCell.xib in Resources */,
 				90CE52852A36E5460033BD06 /* EmptyView.xib in Resources */,
 				90CE53002A36F7110033BD06 /* HomeViewController.xib in Resources */,
+				909DA5CD2A3AC00D0034501F /* MeTraineeSearchPageViewController.xib in Resources */,
+				909DA5C72A3AA1FF0034501F /* MeTraineeNavBar.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -828,12 +862,14 @@
 				90CE52A22A36E59A0033BD06 /* UIColor+Hex.swift in Sources */,
 				90CE52CA2A36E5EC0033BD06 /* UIScrollView+Rx.swift in Sources */,
 				90CE52F82A36F0BD0033BD06 /* LoginAPI.swift in Sources */,
+				909DA5CB2A3ABFFD0034501F /* MeTraineeSearchPageViewController.swift in Sources */,
 				90CE53022A3834060033BD06 /* CoachAPI.swift in Sources */,
 				90CE52D82A36E6000033BD06 /* URLNavigationMap.swift in Sources */,
 				90CE52752A36E5460033BD06 /* LWPlayerControlView.swift in Sources */,
 				90CE52A92A36E59A0033BD06 /* UIBarButtonItem+Init.swift in Sources */,
 				90CE528C2A36E5460033BD06 /* Action.swift in Sources */,
 				90CE52CE2A36E5EC0033BD06 /* UICollectionViewFlexLayout+Rx.swift in Sources */,
+				909DA5CF2A3AC23B0034501F /* UpdatePasswordViewController.swift in Sources */,
 				90CE52DD2A36E6250033BD06 /* CompositionRoot.swift in Sources */,
 				90CE52BE2A36E5B70033BD06 /* RequestError.swift in Sources */,
 				90CE52342A36E4600033BD06 /* BaseTableViewController.swift in Sources */,
@@ -864,7 +900,9 @@
 				90CE52AF2A36E59A0033BD06 /* UIColor+NY.swift in Sources */,
 				90CE52B12A36E59A0033BD06 /* VTContentView+Gesture.swift in Sources */,
 				90CE52722A36E5460033BD06 /* LWPlayer.swift in Sources */,
+				909DA5C52A3AA1E60034501F /* MeTraineeNavBar.swift in Sources */,
 				90CE521D2A36C0710033BD06 /* ViewController.swift in Sources */,
+				909DA5C92A3ABEFF0034501F /* MeTraineeSubjectPageViewController.swift in Sources */,
 				90CE53042A3834360033BD06 /* CoachService.swift in Sources */,
 				90CE52CB2A36E5EC0033BD06 /* UILabel+Rx.swift in Sources */,
 				90CE52E12A36E73A0033BD06 /* SplashModel.swift in Sources */,
@@ -889,6 +927,7 @@
 				9076C5DA2A386B2300E5E33F /* MineViewController.swift in Sources */,
 				90CE52AC2A36E59A0033BD06 /* Array+SectionModel.swift in Sources */,
 				90CE52762A36E5460033BD06 /* LWPlayerSlider.swift in Sources */,
+				90BC4BD92A3B0F98006FD683 /* TraineeDataModel.swift in Sources */,
 				90CE52F12A36ECC80033BD06 /* NYWebViewController.swift in Sources */,
 				90CE52AD2A36E59A0033BD06 /* UIView+CornerRadius.swift in Sources */,
 				90CE52792A36E5460033BD06 /* LWPlayerUtils.swift in Sources */,
@@ -897,6 +936,7 @@
 				9076C5DF2A387CBC00E5E33F /* MeTraineeListViewController.swift in Sources */,
 				90CE52822A36E5460033BD06 /* GesConflictCollectionView.swift in Sources */,
 				90CE523A2A36E4720033BD06 /* MainTabBarViewReactor.swift in Sources */,
+				909DA5D32A3ADFD80034501F /* MeTraineeSubjectCell.swift in Sources */,
 				90CE52BD2A36E5B70033BD06 /* NetEnvironment.swift in Sources */,
 				90CE52BB2A36E5B70033BD06 /* LoadingPlugin.swift in Sources */,
 				90CE52F42A36EDCF0033BD06 /* NYArticleNavBar.swift in Sources */,

+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Common/search-white.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Common/search-white.imageset/search-white.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Common/search-white.imageset/search-white@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Common/search-white.imageset/search-white@3x.png


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

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

+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/K1_no.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K1_no.imageset/K1灰.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K1_no.imageset/K1灰@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K1_no.imageset/K1灰@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/K1_yes.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K1_yes.imageset/K1绿.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K1_yes.imageset/K1绿@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K1_yes.imageset/K1绿@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/K3_no.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K3_no.imageset/K3灰.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K3_no.imageset/K3灰@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K3_no.imageset/K3灰@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/K3_yes.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K3_yes.imageset/K3绿.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K3_yes.imageset/K3绿@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K3_yes.imageset/K3绿@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/K4_no.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K4_no.imageset/K4灰.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K4_no.imageset/K4灰@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K4_no.imageset/K4灰@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/K4_yes.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K4_yes.imageset/K4绿.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K4_yes.imageset/K4绿@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/K4_yes.imageset/K4绿@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/call_phone.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/call_phone.imageset/打电话.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/call_phone.imageset/打电话@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/call_phone.imageset/打电话@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/k2_no.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/k2_no.imageset/k2灰.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/k2_no.imageset/k2灰@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/k2_no.imageset/k2灰@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/k2_yes.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/k2_yes.imageset/k2绿.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/k2_yes.imageset/k2绿@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/k2_yes.imageset/k2绿@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/send_msg.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/send_msg.imageset/发短信.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/send_msg.imageset/发短信@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/send_msg.imageset/发短信@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/矩形A.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/矩形A.imageset/矩形A.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/矩形A.imageset/矩形A@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/矩形A.imageset/矩形A@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/矩形B.imageset/Contents.json

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

BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/矩形B.imageset/矩形B.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/矩形B.imageset/矩形B@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/矩形B.imageset/矩形B@3x.png


+ 2 - 0
JiaPeiManage/Sources/Extensions/DefaultsKeys+Key.swift

@@ -22,5 +22,7 @@ extension DefaultsKeys {
     
     var userPassword:DefaultsKey<String?> { .init("userPassword", defaultValue:"") }
     
+    var city:DefaultsKey<String?> { .init("userCity", defaultValue:"") }
+    
     var currentEnvironment: DefaultsKey<NetEnvironment> { .init("currentEnvironment", defaultValue: .res) }
 }

+ 8 - 3
JiaPeiManage/Sources/Extensions/UIColor+NY.swift

@@ -21,9 +21,14 @@ extension UIColor {
     
     //新增
     class var db_theme: UIColor { return UIColor("#06203A")! }
+    class var db_theme_L2: UIColor { return UIColor("#0B2B4D")! }
     class var db_place: UIColor { return UIColor("#657380")! }
-    class var db_fontGray: UIColor { return UIColor(92, 96, 102) }
-    class var db_fontBlack: UIColor { return UIColor(10, 26, 51) }
-    class var db_sliderColor: UIColor { return UIColor(73, 142, 245) }
+    class var db_fontGray: UIColor { return UIColor("#899199")! }
+    class var db_fontSelColor: UIColor { return UIColor("#D4DDE6")! }
+    class var db_sliderColor: UIColor { return UIColor("#30B05C")! }
+    
+    //字体色
+    class var db_fontDefRegular: UIColor { return UIColor("#B6C1CC")! }
+    class var db_fontDef: UIColor { return UIColor("#B6C1CC")! }
     
 }

+ 72 - 0
JiaPeiManage/Sources/Models/TraineeDataModel.swift

@@ -0,0 +1,72 @@
+//
+//  TraineeDataModel.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/6/15.
+//
+
+import ObjectMapper
+
+struct RowInfo : ImmutableMappable{
+
+    var applydate : String?
+    var id : Int?
+    var idcard : String?
+    var name : String?
+    var phone : String?
+    var photoPath : String?
+    var remark : String?
+    var state : String?
+    var trainFourExamStatus : String?
+    var trainFourExamTime : String?
+    var trainOneExamStatus : String?
+    var trainOneExamTime : String?
+    var trainThreeExamStatus : String?
+    var trainThreeExamTime : String?
+    var trainTwoExamStatus : String?
+    var trainTwoExamTime : String?
+    var trainType : String?
+
+    init(map: Map) throws {
+        applydate = try map.value("applydate")
+        id = try map.value("id")
+        idcard = try map.value("idcard")
+        name = try map.value("name")
+        phone = try map.value("phone")
+        photoPath = try map.value("photoPath")
+        remark = try map.value("remark")
+        state = try map.value("state")
+        trainFourExamStatus = try map.value("trainFourExamStatus")
+        trainFourExamTime = try map.value("trainFourExamTime")
+        trainOneExamStatus = try map.value("trainOneExamStatus")
+        trainOneExamTime = try map.value("trainOneExamTime")
+        trainThreeExamStatus = try map.value("trainThreeExamStatus")
+        trainThreeExamTime = try map.value("trainThreeExamTime")
+        trainTwoExamStatus = try map.value("trainTwoExamStatus")
+        trainTwoExamTime = try map.value("trainTwoExamTime")
+        trainType = try map.value("trainType")
+        
+    }
+
+}
+
+
+
+struct TraineeDataModel : ImmutableMappable{
+
+    var code : Int?
+    var data : AnyObject?
+    var msg : String?
+    var rows : [RowInfo]?
+    var total : Int?
+
+    init(map: Map) throws {
+        code = try map.value("code")
+        data = try map.value("data")
+        msg = try map.value("msg")
+        rows = try map.value("rows")
+        total = try map.value("total")
+        
+    }
+
+}

+ 11 - 0
JiaPeiManage/Sources/Models/UserInfoModel.swift

@@ -223,6 +223,17 @@ struct UserInfo :ImmutableMappable{
             return Defaults.userPassword
         }
     }
+    var city:String? {
+        set {
+            if newValue != nil{
+                Defaults.city = newValue! ?? ""
+            }
+        }
+        get {
+            return Defaults.city
+        }
+    }
+    
     
     init(){}
     init(map: Map) throws {

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

@@ -134,6 +134,7 @@ final class LoginViewController: BaseViewController {
                     })
                     .subscribe(onNext: {[unowned self]isLogin in
                         NSLog("登录 - 登录: login %@","123")
+                        self.login_button.isEnabled = true
                         //保存用户信息
                         var account:String = self.username_textField.text!
                         var password:String = self.userpassword_textField.text!
@@ -143,7 +144,7 @@ final class LoginViewController: BaseViewController {
                         }
                         LocalManager.userInfo.userAccount = account
                         LocalManager.userInfo.password = password
-                        self.login_button.isEnabled = true
+                        LocalManager.userInfo.city = city
                         //登录api RX 订阅 观察 销毁 三部曲
                         NYTips.show()
                         self.loginService.loginRequest(user_name: account, user_password: password,city: city)

+ 4 - 0
JiaPeiManage/Sources/Modulars/Mine/Controllers/MineViewController.swift

@@ -66,6 +66,10 @@ final class MineViewController: BaseViewController {
         self.schoolname_label.text = LocalManager.userInfo.schoolName
         //驾校地址
         self.school_address_label.text = LocalManager.userInfo.address
+        //跳修改密码
+        update_password_button.rx.tap.subscribe ({ _  in
+            NYSwRouter.push(NYSwPushType.mine_uppassword.path)
+        }).disposed(by: disposeBag)
     }
     
 }

+ 35 - 0
JiaPeiManage/Sources/Modulars/Mine/Controllers/UpdatePasswordViewController.swift

@@ -0,0 +1,35 @@
+//
+//  UpdatePasswordViewController.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/6/15.
+//
+
+import UIKit
+import RxSwift
+import RxCocoa
+
+
+final class UpdatePasswordViewController: BaseViewController {
+    
+    // MARK: 服务属性
+    
+    
+    // MARK: UI属性
+   
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        setupUI()
+       
+    }
+    
+    // MARK: 私有方法
+    func setupUI(){
+        self.view.backgroundColor = .db_theme
+    }
+    //绑定-rx
+    func biandView(){
+       
+    }
+    
+}

+ 31 - 0
JiaPeiManage/Sources/Modulars/Mine/Controllers/UpdatePasswordViewController.xib

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="UpdatePasswordViewController" customModule="JiaPeiManage" customModuleProvider="target">
+            <connections>
+                <outlet property="view" destination="iN0-l3-epB" id="ISs-ER-yC4"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+            <point key="canvasLocation" x="56" y="-11"/>
+        </view>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 197 - 1
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeListViewController.swift

@@ -12,15 +12,211 @@ import RxCocoa
 
 final class MeTraineeListViewController: BaseViewController {
     
+    private struct Metric {
+        static let statusBarHeight = isIphoneX ? 44.f : 20.f
+        static let navBarHeight = 44.f
+    }
+    
+    // MARK: 私有属性
+    
+    private var menuTitles : [String] = ["科一", "科二", "科三", "科四", "毕业"]
+    
+    private var idxs: [UInt] = []
+    
+    private var menuItemCurrentBtn : UIButton?
+    
+    // MARK: UI let
+    let statusBar = UIView().then {
+        $0.backgroundColor = UIColor.db_theme
+    }
+    
+    let navBar = MeTraineeNavBar.loadFromNib()
+    
+    let pageController = VTMagicController().then {
+        $0.view.translatesAutoresizingMaskIntoConstraints = false
+        $0.magicView.navigationColor = .db_theme_L2
+        $0.magicView.sliderColor = .db_sliderColor
+        $0.magicView.switchStyle = .default
+        $0.magicView.layoutStyle = .divide
+        $0.magicView.navigationHeight = 57.f
+//        $0.magicView.sliderExtension = -10
+        $0.magicView.sliderWidth = 22.f
+        $0.magicView.sliderOffset = -8
+        $0.magicView.sliderHeight = 4
+        $0.magicView.isSeparatorHidden = false
+        $0.magicView.bubbleRadius = 2
+        $0.magicView.needPreloading = true
+        $0.magicView.separatorHeight = 0 //下划线h
+    }
+    
+    override func setupConstraints() {
+        
+        statusBar.snp.makeConstraints { (make) in
+            make.left.right.top.equalToSuperview()
+            make.height.equalTo(Metric.statusBarHeight)
+        }
+        
+        navBar.snp.remakeConstraints { (make) in
+            make.left.right.equalToSuperview()
+            make.height.equalTo(Metric.navBarHeight)
+            make.top.equalTo(statusBar.snp.bottom)
+        }
+        
+        pageController.view.snp.makeConstraints { (make) in
+            make.left.right.bottom.equalToSuperview()
+            make.top.equalTo(navBar.snp.bottom)
+        }
+        
+    }
+    func scrollViewDidScroll(_ scrollView: UIScrollView) {
+    }
+    // MARK: StatusBar
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        
+        self.navigationController?.setNavigationBarHidden(true, animated: true)
+    }
     
     override func viewDidLoad() {
         super.viewDidLoad()
         setupUI()
+        configureMagicController()
     }
     
     // MARK: 私有方法
     func setupUI(){
-        self.view.backgroundColor = UIColor("#06203A")
+        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)
     }
     
+    func configureMagicController(){
+     
+        self.view.addSubview(navBar)
+        self.view.addSubview(statusBar)
+        self.addChild(pageController)
+        self.view.addSubview(pageController.view)
+        
+        //设置VTMagicController代理,初始页码
+        pageController.magicView.delegate = self
+        pageController.magicView.dataSource = self
+        pageController.magicView.reloadData(toPage: 0)
+        
+    }
+}
+//VTMagicViewDelegate view代理
+extension MeTraineeListViewController : VTMagicViewDelegate {
+    
+    func magicView(_ magicView: VTMagicView, didSelectItemAt itemIndex: UInt) {
+        var menuItem = magicView.menuItem(at: itemIndex)
+        if (menuItemCurrentBtn != nil) {
+            menuItemCurrentBtn?.titleLabel?.font = NYFont.SysFont.sys_15
+        }
+        menuItemCurrentBtn = menuItem
+        menuItem?.titleLabel?.font = UIFont.boldSystemFont(ofSize: 19)
+        if itemIndex == 0 || itemIndex == 1 {
+            guard let currentVc = pageController.currentViewController else { return }
+            
+            let currentPage = pageController.currentPage
+            
+            if currentPage == itemIndex {
+//                TogetherDataManager.refreshDataForVTMagic(currentVc,true)
+            }
+        }
+    }
+    
+    func magicView(_ magicView: VTMagicView, viewDidAppear viewController: UIViewController, atPage pageIndex: UInt) {
+        
+        if pageIndex == 0 || pageIndex == 1 {
+            var canRefresh: Bool = false
+            
+            if let collectionVc = viewController as? BaseCollectionViewController {
+                
+                if collectionVc.totalItems() > 0 {
+                    canRefresh = true
+                }
+            }
+            
+            if idxs.contains(pageIndex) || canRefresh {
+                
+//                TogetherDataManager.refreshDataForVTMagic(viewController, false)
+            }
+        }
+    }
+    
+    func magicView(_ magicView: VTMagicView, viewDidDisappear viewController: UIViewController, atPage pageIndex: UInt) {
+        
+        if pageIndex == 0 || pageIndex == 1 {
+            if !idxs.contains(pageIndex) {
+                idxs.append(pageIndex)
+            }
+        }
+        
+        if pageIndex == 1 {
+//            TogetherDataManager.referenceDate = Date()
+        }
+    }
+}
+
+//VTMagicViewDataSource 数据源代理
+extension MeTraineeListViewController : VTMagicViewDataSource{
+    func menuTitles(for magicView: VTMagicView) -> [String] {
+        return menuTitles
+    }
+    
+    func magicView(_ magicView: VTMagicView, menuItemAt itemIndex: UInt) -> UIButton {
+        
+        var menuItem = magicView.dequeueReusableItem(withIdentifier: "homeItemIdentifier")
+        if menuItem == nil  {
+            menuItem = UIButton(type: .custom)
+            menuItem?.setTitleColor(.db_fontGray, for: .normal)
+            menuItem?.setTitleColor(.db_fontSelColor, for: .selected)
+            menuItem?.titleLabel?.font = NYFont.SysFont.sys_15
+            if itemIndex==0 {
+                menuItemCurrentBtn = menuItem
+                menuItem?.titleLabel?.font = UIFont.boldSystemFont(ofSize: 17)
+            }
+        }
+        
+        return menuItem ?? UIButton()
+    }
+    
+    func magicView(_ magicView: VTMagicView, viewControllerAtPage pageIndex: UInt) -> UIViewController {
+        
+        if pageIndex == 0 {
+            var meTraineeSubjectPageViewController = magicView.dequeueReusablePage(withIdentifier: "MeTraineeSubjectPageViewController01")
+            if meTraineeSubjectPageViewController == nil {
+                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController()
+            }
+            return meTraineeSubjectPageViewController ?? UIViewController()
+        } else if pageIndex == 1 {
+            var meTraineeSubjectPageViewController = magicView.dequeueReusablePage(withIdentifier: "MeTraineeSubjectPageViewController02")
+            if meTraineeSubjectPageViewController == nil {
+                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController()
+            }
+            return meTraineeSubjectPageViewController ?? UIViewController()
+        } else if pageIndex == 2 {
+            var meTraineeSubjectPageViewController = magicView.dequeueReusablePage(withIdentifier: "MeTraineeSubjectPageViewController03")
+            if meTraineeSubjectPageViewController == nil {
+                meTraineeSubjectPageViewController = MeTraineeSubjectPageViewController()
+            }
+            return meTraineeSubjectPageViewController ?? UIViewController()
+        } else if pageIndex == 3{
+            
+            return UIViewController()
+        } else {
+//            var branchController = magicView.dequeueReusablePage(withIdentifier: "BranchViewController")
+//            if branchController == nil {
+//                let reactor = BranchViewReactor(homeService: homeService)
+//                branchController = BranchViewController(reactor: reactor, branchSectionDelegateFactory: { () -> BranchSectionDelegate in
+//                    BranchSectionDelegate()
+//                })
+//            }
+//            (branchController as! BranchViewController).setId(id: requestIds[Int(pageIndex) - 3])
+//            return branchController ?? UIViewController()
+            return UIViewController()
+        }
+    }
 }

+ 21 - 0
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSearchPageViewController.swift

@@ -0,0 +1,21 @@
+//
+//  MeTraineeSearchPageViewController.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/6/15.
+//
+import UIKit
+import RxSwift
+import RxCocoa
+
+final class MeTraineeSearchPageViewController: BaseViewController {
+    
+    // MARK: UI属性
+    
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        
+    }
+    
+}

+ 31 - 0
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSearchPageViewController.xib

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MeTraineeSearchPageViewController" customModule="JiaPeiManage" customModuleProvider="target">
+            <connections>
+                <outlet property="view" destination="iN0-l3-epB" id="uwr-i2-6nI"/>
+            </connections>
+        </placeholder>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+            <point key="canvasLocation" x="56" y="-11"/>
+        </view>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 82 - 0
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeSubjectPageViewController.swift

@@ -0,0 +1,82 @@
+//
+//  MeTraineeSubjectPageViewController.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/6/15.
+//
+
+import UIKit
+import RxSwift
+import RxCocoa
+
+
+final class MeTraineeSubjectPageViewController: BaseTableViewController {
+    
+    let cellIdentifier:String = "_MeTraineeSubjectCell"
+    // MARK: 服务属性
+    private let cocahService: CoachServiceType = CoachService(networking: CoachNetworking())
+   
+    // MARK: UI属性
+    
+    // MARK: 数据
+    var traineeDataModel:TraineeDataModel?
+    
+    var page:Int = 1
+    var pageSize:Int = 10
+    var state = "1"
+    
+    
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        
+        self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: "\(LocalManager.userInfo.id)", field: "", pageNum: page, pageSize: pageSize, schoolId: 0, state: state)
+            .subscribe(onSuccess: { traineeDataModel in
+                self.traineeDataModel = traineeDataModel
+                print("coachInfoListRequest成功")
+                self.tableView.reloadData()
+            }, onError: { error in
+            })
+            .disposed(by: disposeBag)
+        //绑定
+        biandView()
+    }
+    
+    // MARK: 私有方法
+    
+    func getCoachInfoList()
+    {
+        
+    }
+    
+    func biandView(){
+        tableView.delegate = self
+        tableView.dataSource = self
+        tableView.separatorStyle = .none //去除分割线
+        tableView.register(UINib(nibName: "MeTraineeSubjectCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
+        tableView.rowHeight = 288.f
+        self.isEmptyDisplay = false
+        
+    }
+    
+}
+
+//数据源
+extension MeTraineeSubjectPageViewController:UITableViewDataSource {
+    
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return self.traineeDataModel?.rows?.count ?? 0
+    }
+    
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! MeTraineeSubjectCell
+        cell.index_button.setTitle("\(indexPath.row+1)", for: .normal)
+        cell.setRowInfo(rowInfo: (self.traineeDataModel?.rows?[indexPath.row])!)
+        return cell
+    }
+}
+
+//事件
+extension MeTraineeSubjectPageViewController:UITableViewDelegate {
+    
+}

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

@@ -0,0 +1,24 @@
+//
+//  MeTraineeNavBar.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/6/15.
+//
+
+import UIKit
+
+final class MeTraineeNavBar: UIView,NibLoadable {
+
+    
+    @IBOutlet weak var back_button: UIButton!
+    
+    @IBOutlet weak var search_button: UIButton!
+    
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        
+    }
+    
+}

+ 68 - 0
JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeNavBar.xib

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="MeTraineeNavBar" customModule="JiaPeiManage" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="TuQ-3p-qxM">
+                    <rect key="frame" x="0.0" y="0.0" width="44" height="44"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="44" id="F3c-xW-92E"/>
+                        <constraint firstAttribute="height" constant="44" id="YmT-5B-FWD"/>
+                    </constraints>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <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"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="90" id="DEo-Se-EWT"/>
+                        <constraint firstAttribute="height" constant="44" id="eQe-Iw-dSz"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                    <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="S9t-pm-aGk">
+                    <rect key="frame" x="331" y="0.0" width="44" height="44"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="QNk-6v-Blz"/>
+                        <constraint firstAttribute="width" constant="44" id="d5O-gt-Y1Z"/>
+                    </constraints>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <state key="normal" image="search-white"/>
+                </button>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" red="0.023529411764705882" green="0.12549019607843137" blue="0.22745098039215686" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="elb-1k-lgc" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="3si-ts-NUz"/>
+                <constraint firstItem="TuQ-3p-qxM" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Hc8-Ux-EU6"/>
+                <constraint firstItem="elb-1k-lgc" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Pgs-dA-Dis"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="S9t-pm-aGk" secondAttribute="trailing" id="UjN-5C-kns"/>
+                <constraint firstItem="TuQ-3p-qxM" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="dkY-8y-WSt"/>
+                <constraint firstItem="S9t-pm-aGk" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="kqV-iq-bOH"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="back_button" destination="TuQ-3p-qxM" id="yGZ-cf-bXb"/>
+                <outlet property="search_button" destination="S9t-pm-aGk" id="XXf-ZV-enb"/>
+            </connections>
+            <point key="canvasLocation" x="89.312977099236633" y="138.73239436619718"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="back-white" width="9.3333330154418945" height="17"/>
+        <image name="search-white" width="21" height="21"/>
+    </resources>
+</document>

+ 77 - 0
JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeSubjectCell.swift

@@ -0,0 +1,77 @@
+//
+//  MeTraineeSubjectCell.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/6/15.
+//
+import UIKit
+
+final class MeTraineeSubjectCell: UITableViewCell,NibLoadable {
+    
+    // MARK: UI
+    //indexbtn
+    @IBOutlet weak var index_button: QMUIButton!
+    //用户头像
+    @IBOutlet weak var user_imageview: UIImageView!
+    //报名时间
+    @IBOutlet weak var jointime_label: UILabel!
+    //电话btn
+    @IBOutlet weak var phone_button: UIButton!
+    //消息btn
+    @IBOutlet weak var message_button: UIButton!
+    //用户名
+    @IBOutlet weak var username_label: UILabel!
+    //身份证
+    @IBOutlet weak var idcart_label: UILabel!
+    //电话
+    @IBOutlet weak var phone_label: UILabel!
+    //阶段btn
+    @IBOutlet weak var state_button: UIButton!
+    //科目1-4
+    @IBOutlet weak var k1_imageview: UIImageView!
+    @IBOutlet weak var k1_label: UILabel!
+    @IBOutlet weak var k2_imageview: UIImageView!
+    @IBOutlet weak var k2_label: UILabel!
+    @IBOutlet weak var k3_imageview: UIImageView!
+    @IBOutlet weak var k3_label: UILabel!
+    @IBOutlet weak var k4_imageview: UIImageView!
+    @IBOutlet weak var k4_label: UILabel!
+    //备注
+    @IBOutlet weak var remark_label: UILabel!
+    
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        self.backgroundColor = .db_theme
+        self.contentView.backgroundColor = .db_theme
+        
+    }
+    
+    func setRowInfo(rowInfo:RowInfo){
+        //用户头像
+        self.user_imageview.sd_setImage(with: rowInfo.photoPath?.urlValue)
+        //报名时间
+        self.jointime_label.text = "报名时间:\(rowInfo.applydate?.utf8CString)"
+        //用户名
+        self.username_label.text = rowInfo.name
+        //身份证
+        self.idcart_label.text = rowInfo.idcard
+        //电话
+        self.phone_label.text = rowInfo.phone
+        //阶段btn
+        self.state_button.setTitle("阶段\(rowInfo.state ?? "")", for: .normal)
+//        //科目1-4
+//        @IBOutlet weak var k1_imageview: UIImageView!
+//        @IBOutlet weak var k1_label: UILabel!
+//        @IBOutlet weak var k2_imageview: UIImageView!
+//        @IBOutlet weak var k2_label: UILabel!
+//        @IBOutlet weak var k3_imageview: UIImageView!
+//        @IBOutlet weak var k3_label: UILabel!
+//        @IBOutlet weak var k4_imageview: UIImageView!
+//        @IBOutlet weak var k4_label: UILabel!
+//        //备注
+//        @IBOutlet weak var remark_label: UILabel!
+        
+    }
+    
+}

+ 297 - 0
JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeSubjectCell.xib

@@ -0,0 +1,297 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="MeTraineeSubjectCell" customModule="JiaPeiManage" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="375" height="288"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8GC-L9-kgq" userLabel="View-content">
+                    <rect key="frame" x="15" y="10" width="345" height="278"/>
+                    <subviews>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="CcQ-HC-rwy" customClass="QMUIButton">
+                            <rect key="frame" x="-15" y="10" width="50" height="20"/>
+                            <color key="backgroundColor" red="0.20784313730000001" green="0.74901960779999999" blue="0.36862745099999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="50" id="X0f-Nj-h2q"/>
+                                <constraint firstAttribute="height" constant="20" id="kaL-33-Leq"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <inset key="contentEdgeInsets" minX="10" minY="0.0" maxX="0.0" maxY="0.0"/>
+                            <state key="normal" title="1"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="10"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </button>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="矩形A" translatesAutoresizingMaskIntoConstraints="NO" id="adu-yu-H5N">
+                            <rect key="frame" x="15" y="52" width="74" height="102"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="74" id="dw9-Mk-KTJ"/>
+                                <constraint firstAttribute="height" constant="102" id="kaA-WZ-A9K"/>
+                            </constraints>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="报名时间:2023-01-31" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="plQ-03-a5S">
+                            <rect key="frame" x="195" y="11" width="135" height="18"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="18" id="bc5-pX-Fqg"/>
+                                <constraint firstAttribute="width" constant="135" id="seh-65-LX9"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                            <color key="textColor" red="0.53725490196078429" green="0.56862745098039214" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="26Z-Ih-zAP" userLabel="Button-message">
+                            <rect key="frame" x="294" y="44" width="36" height="36"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="36" id="QMg-or-YT5"/>
+                                <constraint firstAttribute="width" constant="36" id="Vpl-f0-YAL"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" image="send_msg"/>
+                        </button>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BFL-4s-fhV" userLabel="Button-phone">
+                            <rect key="frame" x="250" y="44" width="36" height="36"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="36" id="2tK-gz-vgV"/>
+                                <constraint firstAttribute="height" constant="36" id="8Og-2v-tmu"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" image="call_phone"/>
+                        </button>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="李泽楷" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e6H-nJ-vBG">
+                            <rect key="frame" x="102" y="48" width="150" height="22"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="22" id="8AK-RC-b3J"/>
+                                <constraint firstAttribute="width" constant="150" id="zso-Fa-FYT"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="boldSystem" pointSize="19"/>
+                            <color key="textColor" red="0.83137254901960778" green="0.8666666666666667" blue="0.90196078431372551" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="350230199305261348" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hcU-Lv-pf4">
+                            <rect key="frame" x="102" y="82" width="160" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="Nbp-eZ-FbG"/>
+                                <constraint firstAttribute="width" constant="160" id="Sxp-L7-0Oe"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.71372549019607845" green="0.75686274509803919" blue="0.80000000000000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="13055442863" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PdA-Nu-qhi">
+                            <rect key="frame" x="102" y="106" width="130" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="130" id="AfK-6U-hHy"/>
+                                <constraint firstAttribute="height" constant="20" id="HBc-Qt-KOs"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.71372549019999998" green="0.75686274509999996" blue="0.80000000000000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Kf-rl-yaG">
+                            <rect key="frame" x="15" y="165" width="315" height="70"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="K1_yes" translatesAutoresizingMaskIntoConstraints="NO" id="QUD-2Q-Nej">
+                                    <rect key="frame" x="20" y="7" width="24" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="24" id="Qpf-FP-4fT"/>
+                                        <constraint firstAttribute="height" constant="24" id="fQ1-P4-OLE"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2025-05-24" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SIZ-3h-LeX">
+                                    <rect key="frame" x="49" y="9" width="85" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="85" id="3Ll-4B-MrH"/>
+                                        <constraint firstAttribute="height" constant="20" id="sOE-UV-rEn"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="textColor" red="0.71372549019607845" green="0.75686274509803919" blue="0.80000000000000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="k2_yes" translatesAutoresizingMaskIntoConstraints="NO" id="1U8-M0-twU">
+                                    <rect key="frame" x="181" y="7" width="24" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="24" id="WO6-yC-Vt5"/>
+                                        <constraint firstAttribute="height" constant="24" id="aXd-0e-YlD"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2025-05-24" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AZo-dC-4iu">
+                                    <rect key="frame" x="210" y="9" width="85" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="85" id="YOe-CQ-IRc"/>
+                                        <constraint firstAttribute="height" constant="20" id="vvz-mL-1BB"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="textColor" red="0.71372549019999998" green="0.75686274509999996" blue="0.80000000000000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="K3_no" translatesAutoresizingMaskIntoConstraints="NO" id="8Dg-8s-8DR">
+                                    <rect key="frame" x="20" y="39" width="24" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="24" id="Lfr-08-T2q"/>
+                                        <constraint firstAttribute="height" constant="24" id="hHj-6o-3NK"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="未通过" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yxZ-cO-GDM">
+                                    <rect key="frame" x="49" y="41" width="85" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="20" id="6ZQ-X5-dI8"/>
+                                        <constraint firstAttribute="width" constant="85" id="pHJ-jo-KRL"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="textColor" red="0.71372549019999998" green="0.75686274509999996" blue="0.80000000000000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="K4_no" translatesAutoresizingMaskIntoConstraints="NO" id="Kwx-EB-6Ff">
+                                    <rect key="frame" x="181" y="39" width="24" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="24" id="7S1-Ie-P6G"/>
+                                        <constraint firstAttribute="height" constant="24" id="Jfc-Yh-Agv"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="未通过" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5qf-KY-LhA">
+                                    <rect key="frame" x="210" y="41" width="85" height="20"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="85" id="FGK-qI-7lX"/>
+                                        <constraint firstAttribute="height" constant="20" id="W51-2h-cp2"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="textColor" red="0.71372549019999998" green="0.75686274509999996" blue="0.80000000000000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" red="0.062745098039215685" green="0.20784313725490194" blue="0.3529411764705882" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstItem="yxZ-cO-GDM" firstAttribute="leading" secondItem="8Dg-8s-8DR" secondAttribute="trailing" constant="5" id="2Ry-3h-U5V"/>
+                                <constraint firstItem="SIZ-3h-LeX" firstAttribute="leading" secondItem="QUD-2Q-Nej" secondAttribute="trailing" constant="5" id="6cQ-Pe-Sdb"/>
+                                <constraint firstItem="AZo-dC-4iu" firstAttribute="top" secondItem="8Kf-rl-yaG" secondAttribute="top" constant="9" id="DGd-mq-dd5"/>
+                                <constraint firstItem="QUD-2Q-Nej" firstAttribute="leading" secondItem="8Kf-rl-yaG" secondAttribute="leading" constant="20" id="E50-u9-uSM"/>
+                                <constraint firstItem="8Dg-8s-8DR" firstAttribute="top" secondItem="QUD-2Q-Nej" secondAttribute="bottom" constant="8" id="Fv9-59-arP"/>
+                                <constraint firstItem="Kwx-EB-6Ff" firstAttribute="top" secondItem="1U8-M0-twU" secondAttribute="bottom" constant="8" symbolic="YES" id="JmO-Ju-rlR"/>
+                                <constraint firstItem="yxZ-cO-GDM" firstAttribute="centerY" secondItem="8Dg-8s-8DR" secondAttribute="centerY" id="RFm-2b-eyo"/>
+                                <constraint firstAttribute="trailing" secondItem="5qf-KY-LhA" secondAttribute="trailing" constant="20" id="Y5x-SN-Uet"/>
+                                <constraint firstItem="SIZ-3h-LeX" firstAttribute="centerY" secondItem="QUD-2Q-Nej" secondAttribute="centerY" id="b5c-fQ-3Gc"/>
+                                <constraint firstItem="8Dg-8s-8DR" firstAttribute="leading" secondItem="8Kf-rl-yaG" secondAttribute="leading" constant="20" id="dAb-e0-9Rp"/>
+                                <constraint firstAttribute="trailing" secondItem="AZo-dC-4iu" secondAttribute="trailing" constant="20" id="fuJ-ZG-u65"/>
+                                <constraint firstAttribute="height" constant="70" id="gf6-nH-FtT"/>
+                                <constraint firstItem="1U8-M0-twU" firstAttribute="top" secondItem="8Kf-rl-yaG" secondAttribute="top" constant="7" id="ipD-8v-o35"/>
+                                <constraint firstItem="5qf-KY-LhA" firstAttribute="top" secondItem="1U8-M0-twU" secondAttribute="bottom" constant="10" id="jyc-lt-FCV"/>
+                                <constraint firstItem="5qf-KY-LhA" firstAttribute="leading" secondItem="Kwx-EB-6Ff" secondAttribute="trailing" constant="5" id="nWD-9C-o2S"/>
+                                <constraint firstItem="AZo-dC-4iu" firstAttribute="leading" secondItem="1U8-M0-twU" secondAttribute="trailing" constant="5" id="rQK-hc-rMg"/>
+                                <constraint firstItem="QUD-2Q-Nej" firstAttribute="top" secondItem="8Kf-rl-yaG" secondAttribute="top" constant="7" id="tLt-Vs-tL0"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="5"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </view>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="备注:A-KD,违章未裁决" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qmu-Cp-oqw">
+                            <rect key="frame" x="37" y="242" width="271" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="tDk-LM-GFz"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="12"/>
+                            <color key="textColor" red="0.53725490200000003" green="0.56862745100000001" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="35n-mh-gYb">
+                            <rect key="frame" x="102" y="130" width="48" height="20"/>
+                            <color key="backgroundColor" red="0.070588235294117646" green="0.2627450980392157" blue="0.31764705882352939" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="48" id="GmL-wL-CjX"/>
+                                <constraint firstAttribute="height" constant="20" id="tg3-gn-QEC"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="11"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" title="阶段二">
+                                <color key="titleColor" red="0.20784313725490194" green="0.74901960784313726" blue="0.36862745098039218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            </state>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" red="0.043137254901960784" green="0.16862745098039217" blue="0.30196078431372547" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstItem="adu-yu-H5N" firstAttribute="leading" secondItem="8GC-L9-kgq" secondAttribute="leading" constant="15" id="0Qz-uG-voY"/>
+                        <constraint firstItem="35n-mh-gYb" firstAttribute="top" secondItem="PdA-Nu-qhi" secondAttribute="bottom" constant="4" id="0ig-0z-WRS"/>
+                        <constraint firstAttribute="trailing" secondItem="26Z-Ih-zAP" secondAttribute="trailing" constant="15" id="6gx-Zf-d3L"/>
+                        <constraint firstItem="BFL-4s-fhV" firstAttribute="top" secondItem="plQ-03-a5S" secondAttribute="bottom" constant="15" id="8yP-3E-HX6"/>
+                        <constraint firstItem="PdA-Nu-qhi" firstAttribute="leading" secondItem="adu-yu-H5N" secondAttribute="trailing" constant="13" id="98q-XL-b6Z"/>
+                        <constraint firstItem="hcU-Lv-pf4" firstAttribute="top" secondItem="e6H-nJ-vBG" secondAttribute="bottom" constant="12" id="9G0-bk-Mi9"/>
+                        <constraint firstItem="8Kf-rl-yaG" firstAttribute="leading" secondItem="8GC-L9-kgq" secondAttribute="leading" constant="15" id="B0T-Lh-guw"/>
+                        <constraint firstItem="26Z-Ih-zAP" firstAttribute="top" secondItem="plQ-03-a5S" secondAttribute="bottom" constant="15" id="Bqc-UI-6PL"/>
+                        <constraint firstItem="8Kf-rl-yaG" firstAttribute="top" secondItem="adu-yu-H5N" secondAttribute="bottom" constant="11" id="DZj-Uu-CMN"/>
+                        <constraint firstItem="35n-mh-gYb" firstAttribute="leading" secondItem="adu-yu-H5N" secondAttribute="trailing" constant="13" id="Fkb-uX-BTt"/>
+                        <constraint firstItem="adu-yu-H5N" firstAttribute="top" secondItem="CcQ-HC-rwy" secondAttribute="bottom" constant="22" id="JG9-xt-qvM"/>
+                        <constraint firstItem="PdA-Nu-qhi" firstAttribute="top" secondItem="hcU-Lv-pf4" secondAttribute="bottom" constant="4" id="JI6-ZJ-oSe"/>
+                        <constraint firstAttribute="trailing" secondItem="8Kf-rl-yaG" secondAttribute="trailing" constant="15" id="MzX-Fd-o9N"/>
+                        <constraint firstAttribute="trailing" secondItem="qmu-Cp-oqw" secondAttribute="trailing" constant="37" id="OX4-4k-QpT"/>
+                        <constraint firstItem="e6H-nJ-vBG" firstAttribute="leading" secondItem="adu-yu-H5N" secondAttribute="trailing" constant="13" id="PQD-lj-5DS"/>
+                        <constraint firstItem="qmu-Cp-oqw" firstAttribute="leading" secondItem="8GC-L9-kgq" secondAttribute="leading" constant="37" id="Yux-iA-66b"/>
+                        <constraint firstItem="26Z-Ih-zAP" firstAttribute="leading" secondItem="BFL-4s-fhV" secondAttribute="trailing" constant="8" id="d6y-Xo-ziI"/>
+                        <constraint firstItem="CcQ-HC-rwy" firstAttribute="top" secondItem="8GC-L9-kgq" secondAttribute="top" constant="10" id="eDC-gm-sMc"/>
+                        <constraint firstItem="CcQ-HC-rwy" firstAttribute="leading" secondItem="8GC-L9-kgq" secondAttribute="leading" constant="-15" id="ftA-6G-qsq"/>
+                        <constraint firstAttribute="trailing" secondItem="plQ-03-a5S" secondAttribute="trailing" constant="15" id="iKa-37-IlX"/>
+                        <constraint firstItem="hcU-Lv-pf4" firstAttribute="leading" secondItem="adu-yu-H5N" secondAttribute="trailing" constant="13" id="oZe-ZV-K1h"/>
+                        <constraint firstItem="plQ-03-a5S" firstAttribute="top" secondItem="8GC-L9-kgq" secondAttribute="top" constant="11" id="rC0-CH-Oyx"/>
+                        <constraint firstItem="qmu-Cp-oqw" firstAttribute="top" secondItem="8Kf-rl-yaG" secondAttribute="bottom" constant="7" id="xUp-VP-KM5"/>
+                        <constraint firstItem="e6H-nJ-vBG" firstAttribute="top" secondItem="8GC-L9-kgq" secondAttribute="top" constant="48" id="yPg-X5-imt"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="5"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" red="0.023529411764705882" green="0.12549019607843137" blue="0.22745098039215686" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="8GC-L9-kgq" secondAttribute="trailing" constant="15" id="WgA-a7-8x0"/>
+                <constraint firstItem="8GC-L9-kgq" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="fgw-Co-XSf"/>
+                <constraint firstItem="8GC-L9-kgq" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="lWT-mI-Yun"/>
+                <constraint firstAttribute="bottom" secondItem="8GC-L9-kgq" secondAttribute="bottom" id="nt0-Ls-M6u"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="idcart_label" destination="hcU-Lv-pf4" id="3em-er-l3C"/>
+                <outlet property="index_button" destination="CcQ-HC-rwy" id="VPA-cL-6JU"/>
+                <outlet property="jointime_label" destination="plQ-03-a5S" id="KXl-Jq-mP4"/>
+                <outlet property="k1_imageview" destination="QUD-2Q-Nej" id="96J-WI-kDV"/>
+                <outlet property="k1_label" destination="SIZ-3h-LeX" id="Fn0-Ae-Waj"/>
+                <outlet property="k2_imageview" destination="1U8-M0-twU" id="rZM-m8-ag4"/>
+                <outlet property="k2_label" destination="AZo-dC-4iu" id="Qnn-cl-Snf"/>
+                <outlet property="k3_imageview" destination="8Dg-8s-8DR" id="3KU-TK-iVx"/>
+                <outlet property="k3_label" destination="yxZ-cO-GDM" id="uHf-FC-o3U"/>
+                <outlet property="k4_imageview" destination="Kwx-EB-6Ff" id="c8W-mD-2m9"/>
+                <outlet property="k4_label" destination="5qf-KY-LhA" id="Ddy-VH-SWR"/>
+                <outlet property="message_button" destination="26Z-Ih-zAP" id="3VA-x9-WNh"/>
+                <outlet property="phone_button" destination="BFL-4s-fhV" id="FNm-Mr-GiA"/>
+                <outlet property="phone_label" destination="PdA-Nu-qhi" id="Fec-qD-AFX"/>
+                <outlet property="remark_label" destination="qmu-Cp-oqw" id="4gi-NM-y3I"/>
+                <outlet property="state_button" destination="35n-mh-gYb" id="9ap-PT-w1d"/>
+                <outlet property="user_imageview" destination="adu-yu-H5N" id="jZj-NF-ANi"/>
+                <outlet property="username_label" destination="e6H-nJ-vBG" id="Te5-Et-SkA"/>
+            </connections>
+            <point key="canvasLocation" x="64.885496183206101" y="-12.67605633802817"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="K1_yes" width="24" height="24"/>
+        <image name="K3_no" width="24" height="24"/>
+        <image name="K4_no" width="24" height="24"/>
+        <image name="call_phone" width="36" height="36"/>
+        <image name="k2_yes" width="24" height="24"/>
+        <image name="send_msg" width="36" height="36"/>
+        <image name="矩形A" width="74" height="102"/>
+    </resources>
+</document>

+ 4 - 2
JiaPeiManage/Sources/Networking/RequestError.swift

@@ -17,6 +17,8 @@ let RESULT_DATA = "data"//数据包
 let RESULT_RESULT = "result"//数据包
 let RESULT_BODY = "body"//数据包
 let RESULT_OTHER = "other"//数据包
+let RESULT_TOTAL = "total"
+
 
 enum RequestError: Swift.Error {
     case noCodeKey
@@ -58,9 +60,9 @@ extension Single {
         }else {
             return self.asObservable().do(onError: { (error) in
                 if error is RequestError {
-//                    BilibiliToaster.show((error as! RequestError).errorDescription)
+                    NYSwToaster.show((error as! RequestError).errorDescription)
                 }else{
-//                    BilibiliToaster.show(showText,bottomOffsetPortrait:bottomOffset)
+                    NYSwToaster.show(showText,bottomOffsetPortrait:bottomOffset)
                 }
             }).asSingle()
             

+ 40 - 0
JiaPeiManage/Sources/Rx/Moya+Rx.swift

@@ -20,6 +20,11 @@ extension PrimitiveSequence where Trait == SingleTrait, Element == Moya.Response
                 let json = try JSON(data: response.data)
                 guard let code = json[RESULT_CODE].int else { throw RequestError.noCodeKey }
                 if code != StatusCode.success.rawValue { throw RequestError.sysError(statusCode:"\(code)" , errorMsg: json[RESULT_MESSAGE].string) }
+                if(T.self == TraineeDataModel.self){
+                    if let data = json.dictionaryObject {
+                        return try Mapper<T>().map(JSON: data)
+                    }
+                }
                 if let data = json[RESULT_DATA].dictionaryObject {
                     return try Mapper<T>().map(JSON: data)
                 } else if let data = json[RESULT_RESULT].dictionaryObject {
@@ -36,6 +41,41 @@ extension PrimitiveSequence where Trait == SingleTrait, Element == Moya.Response
             })
     }
     
+    func map<T: ImmutableMappable>(_ type: T.Type,isModel:Bool) -> PrimitiveSequence<Trait, T> {
+        return self
+            .map { (response) -> T in
+                if(isModel){
+                    let json = try JSON(data: response.data)
+                    guard let code = json[RESULT_CODE].int else { throw RequestError.noCodeKey }
+                    if code != StatusCode.success.rawValue { throw RequestError.sysError(statusCode:"\(code)" , errorMsg: json[RESULT_MESSAGE].string) }
+                    if let data = json.dictionaryObject {
+                        return try Mapper<T>().map(JSON: data)
+                    }
+                }else {
+                    let json = try JSON(data: response.data)
+                    guard let code = json[RESULT_CODE].int else { throw RequestError.noCodeKey }
+                    if code != StatusCode.success.rawValue { throw RequestError.sysError(statusCode:"\(code)" , errorMsg: json[RESULT_MESSAGE].string) }
+                    if(T.self == TraineeDataModel.self){
+                        if let data = json.dictionaryObject {
+                            return try Mapper<T>().map(JSON: data)
+                        }
+                    }
+                    if let data = json[RESULT_DATA].dictionaryObject {
+                        return try Mapper<T>().map(JSON: data)
+                    } else if let data = json[RESULT_RESULT].dictionaryObject {
+                        return try Mapper<T>().map(JSON: data)
+                    }
+                }
+                throw RequestError.noDataKey
+            }.do(onSuccess: { _ in
+                
+            }, onError: { error in
+                if error is MapError {
+                    log.error(error)
+                }
+            })
+    }
+    
     func map<T: ImmutableMappable>(_ type: T.Type) -> PrimitiveSequence<Trait, [T]> {
         return self
             .map { response -> [T] in

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

@@ -14,14 +14,15 @@ enum CoachAPI {
     case coachInfo(id:String ,city:String)
     //获取教练二维码
     case coachQrInfo(id:String ,city:String)
-    
+    //获取教练的学员
+    case coachInfoList(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String )
 }
 
 extension CoachAPI: TargetType {
     
     var baseURL: URL {
         switch self {
-        case .coachInfo,.coachQrInfo:
+        case .coachInfo,.coachQrInfo,.coachInfoList:
             return URL(string: HttpRequest.api.path)!
         }
     }
@@ -32,12 +33,15 @@ extension CoachAPI: TargetType {
             return "/jsjp-admin/open-api/tms/coachInfo/getCoachInfo"
         case .coachQrInfo(_,_):
             return "/jsjp-admin/open-api/tms/coachInfo/getCoachQrInfo"
+        case .coachInfoList(_,_,_,_,_,_,_,_):
+            return "/jsjp-admin/open-api/tms/coachInfo/list"
+            
         }
     }
     
     var method: Moya.Method {
         switch self {
-        case .coachInfo,.coachQrInfo:
+        case .coachInfo,.coachQrInfo,.coachInfoList:
             return .get
         default:
             return .get
@@ -50,7 +54,7 @@ extension CoachAPI: TargetType {
     
     var task: Moya.Task {
         switch self {
-        case .coachInfo(_,_),.coachQrInfo(_,_):
+        case .coachInfo(_,_),.coachQrInfo(_,_),.coachInfoList(_,_,_,_,_,_,_,_):
             if let parameters = parameters {
                 return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
             }
@@ -71,6 +75,15 @@ extension CoachAPI: TargetType {
         case let .coachQrInfo(id,city):
             return ["city": city,
                     "id": id,]
+        case let .coachInfoList(city,appCoachId ,coachId ,field ,pageNum ,pageSize ,schoolId ,state):
+            return ["city": city,
+                    "appCoachId": appCoachId,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+//                    "schoolId": schoolId,
+                    "state": state,]
         default:
             return nil
         }

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

@@ -14,6 +14,8 @@ protocol CoachServiceType {
     func coachInfoRequest(id:String ,city:String) -> Single<UserInfo>
     //获取教练二维码
     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>
     
 }
 
@@ -35,5 +37,10 @@ final class CoachService: CoachServiceType {
         return networking.request(api).map(UserInfo.self)
     }
     
+    func coachInfoListRequest(city: String, appCoachId: String, coachId: String, field: String, pageNum: Int, pageSize: Int, schoolId: Int, state: String) -> RxSwift.Single<TraineeDataModel> {
+        let api = CoachAPI.coachInfoList(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)
+    }
+    
 }
 

+ 5 - 5
JiaPeiManage/Sources/Utils/LocalManager.swift

@@ -14,9 +14,9 @@ class LocalManager {
     
     static var disposeBag = DisposeBag()
     static let loginService: LoginServiceType = LoginService(networking: LoginNetworking())
-    
+    //本地用户信息
     static var userInfo: UserInfo = UserInfo()
-    
+    //清理
     class func clearUserInfo() {
         
         
@@ -25,9 +25,9 @@ class LocalManager {
     //自动登录
     static func autoLogin(){
         if LocalManager.userInfo.isLogin {
-            var account = LocalManager.userInfo.userAccount!
-            var password = LocalManager.userInfo.password!
-            var city = "3501"
+            let account = LocalManager.userInfo.userAccount!
+            let password = LocalManager.userInfo.password!
+            let city = LocalManager.userInfo.city!
             LocalManager.loginService.loginRequest(user_name: account, user_password: password,city: city)
                  .subscribe(onSuccess: { userinfo in
                      NYTips.hide()

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

@@ -12,10 +12,10 @@ import URLNavigator
 
 enum NYSwPushType {
     case recommend_rank
-    case recommend_player
-    case live_room
+    case trainee_search
     case trainee_list
     case mine_center
+    case mine_uppassword
 }
 
 
@@ -32,14 +32,14 @@ extension NYSwPushType {
         switch self {
         case .recommend_rank:
             return "JiaPeiManage://recommend/rank"
-        case .recommend_player:
-            return "JiaPeiManage://recommend/player"
         case .trainee_list:
             return "JiaPeiManage://me/trainee/list"
-        case .live_room:
-            return "JiaPeiManage://live/room"
+        case .trainee_search:
+            return "JiaPeiManage://me/trainee/search"
         case .mine_center:
             return "JiaPeiManage://mine/center"
+        case .mine_uppassword:
+            return "JiaPeiManage://mine/updatepassword"
 
         }
     }

+ 6 - 10
JiaPeiManage/Sources/Utils/URLNavigationMap.swift

@@ -26,23 +26,19 @@ final class URLNavigationMap {
             return rankParentVc
         }
         
-        navigator.register(NYSwPushType.live_room.path) { (url, values, context) -> UIViewController? in
-            let roomViewController = UIViewController()
-            
-            //LiveRoomViewController()
-            return roomViewController
+        navigator.register(NYSwPushType.trainee_search.path) { (url, values, context) -> UIViewController? in
+            let meTraineeSearchPageViewController = MeTraineeSearchPageViewController(nibName: "MeTraineeSearchPageViewController")
+            return meTraineeSearchPageViewController
         }
         
         navigator.register(NYSwPushType.trainee_list.path) { (url, values, context) -> UIViewController? in
-            //LiveAllParentViewController(service:HomeService(networking: HomeNetworking()))
             let meTraineeListViewController = MeTraineeListViewController()
             return meTraineeListViewController
         }
         
-        navigator.register(NYSwPushType.recommend_player.path) { (url, values, context) -> UIViewController? in
-            let testVc = UIViewController()
-//            TestViewController()
-            return testVc
+        navigator.register(NYSwPushType.mine_uppassword.path) { (url, values, context) -> UIViewController? in
+            let updatePasswordViewController = UpdatePasswordViewController(nibName: "UpdatePasswordViewController")
+            return updatePasswordViewController
         }
         
         navigator.register(NYSwPushType.mine_center.path) { (url, values, context) -> UIViewController? in