Browse Source

电子教学 - 照片coll UI部分完成

openlockPPP 1 year ago
parent
commit
29ab311c81
46 changed files with 2043 additions and 46 deletions
  1. 82 2
      JiaPeiManage.xcodeproj/project.pbxproj
  2. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/arrow_down.imageset/Contents.json
  3. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/arrow_down.imageset/向下.png
  4. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/arrow_down.imageset/向下@2x.png
  5. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/arrow_down.imageset/向下@3x.png
  6. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/estu_log.imageset/Contents.json
  7. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/estu_log.imageset/电子教学日志.png
  8. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/estu_log.imageset/电子教学日志@2x.png
  9. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/estu_log.imageset/电子教学日志@3x.png
  10. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_left.imageset/Contents.json
  11. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_left.imageset/左.png
  12. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_left.imageset/左@2x.png
  13. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_left.imageset/左@3x.png
  14. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_right.imageset/Contents.json
  15. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_right.imageset/右.png
  16. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_right.imageset/右@2x.png
  17. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_right.imageset/右@3x.png
  18. 23 0
      JiaPeiManage/Assets.xcassets/Modules/Stu/stu_photo.imageset/Contents.json
  19. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/stu_photo.imageset/照片.png
  20. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/stu_photo.imageset/照片@2x.png
  21. BIN
      JiaPeiManage/Assets.xcassets/Modules/Stu/stu_photo.imageset/照片@3x.png
  22. 34 0
      JiaPeiManage/Sources/Main/Base/View/BaseCollectionViewCell.swift
  23. 23 9
      JiaPeiManage/Sources/Modulars/Login/Controllers/LoginViewController.swift
  24. 192 0
      JiaPeiManage/Sources/Modulars/学员/Controllers/EstuLogListViewController.swift
  25. 174 0
      JiaPeiManage/Sources/Modulars/学员/Controllers/EstuLogPhotoListViewController.swift
  26. 5 0
      JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeDetails/MeTraineeDetails01Controller.swift
  27. 71 32
      JiaPeiManage/Sources/Modulars/学员/ViewModel/MeTraineeSubjectViewModel.swift
  28. 18 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLog01HeaderView.swift
  29. 76 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLog01HeaderView.xib
  30. 21 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogHeaderView.swift
  31. 63 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogHeaderView.xib
  32. 39 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogListCell.swift
  33. 108 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogListCell.xib
  34. 38 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogListDetailsCell.swift
  35. 363 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogListDetailsCell.xib
  36. 161 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogPhotoCell.swift
  37. 99 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogPhotoCellReactor.swift
  38. 70 0
      JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogPhotoHeaderView.swift
  39. 10 1
      JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeDetails01HeaderView.swift
  40. 23 0
      JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeDetails01HeaderView.xib
  41. 15 2
      JiaPeiManage/Sources/Services/CoachAPI.swift
  42. 7 0
      JiaPeiManage/Sources/Services/CoachService.swift
  43. 192 0
      JiaPeiManage/Sources/Services/ElogCoachAPI.swift
  44. 28 0
      JiaPeiManage/Sources/Services/ElogCoachService.swift
  45. 6 0
      JiaPeiManage/Sources/Utils/NYSwRouter.swift
  46. 10 0
      JiaPeiManage/Sources/Utils/URLNavigationMap.swift

+ 82 - 2
JiaPeiManage.xcodeproj/project.pbxproj

@@ -40,6 +40,22 @@
 		9076C5DA2A386B2300E5E33F /* MineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9076C5D92A386B2300E5E33F /* MineViewController.swift */; };
 		9076C5DC2A386B2F00E5E33F /* MineViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9076C5DB2A386B2F00E5E33F /* MineViewController.xib */; };
 		9076C5DF2A387CBC00E5E33F /* MeTraineeListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9076C5DE2A387CBC00E5E33F /* MeTraineeListViewController.swift */; };
+		908261E32A9C89F10034104C /* EstuLogListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261E22A9C89F10034104C /* EstuLogListViewController.swift */; };
+		908261E62A9CA5210034104C /* EstuLogHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261E52A9CA5210034104C /* EstuLogHeaderView.swift */; };
+		908261E82A9CA55C0034104C /* EstuLogHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 908261E72A9CA55C0034104C /* EstuLogHeaderView.xib */; };
+		908261EA2A9D7BF90034104C /* EstuLog01HeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261E92A9D7BF90034104C /* EstuLog01HeaderView.swift */; };
+		908261EC2A9D7C070034104C /* EstuLog01HeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 908261EB2A9D7C070034104C /* EstuLog01HeaderView.xib */; };
+		908261EE2A9DD3ED0034104C /* EstuLogListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261ED2A9DD3ED0034104C /* EstuLogListCell.swift */; };
+		908261F02A9DD3FD0034104C /* EstuLogListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 908261EF2A9DD3FD0034104C /* EstuLogListCell.xib */; };
+		908261F22A9DD4570034104C /* EstuLogListDetailsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261F12A9DD4570034104C /* EstuLogListDetailsCell.swift */; };
+		908261F42A9DD4650034104C /* EstuLogListDetailsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 908261F32A9DD4650034104C /* EstuLogListDetailsCell.xib */; };
+		908261F62A9EF0840034104C /* ElogCoachAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261F52A9EF0840034104C /* ElogCoachAPI.swift */; };
+		908261F82A9EF0C70034104C /* ElogCoachService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261F72A9EF0C70034104C /* ElogCoachService.swift */; };
+		908261FA2A9EF1A70034104C /* EstuLogPhotoListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261F92A9EF1A70034104C /* EstuLogPhotoListViewController.swift */; };
+		908261FC2A9F312D0034104C /* EstuLogPhotoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261FB2A9F312D0034104C /* EstuLogPhotoCell.swift */; };
+		908261FF2A9F31A00034104C /* BaseCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908261FE2A9F31A00034104C /* BaseCollectionViewCell.swift */; };
+		908262012A9F35EC0034104C /* EstuLogPhotoCellReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908262002A9F35EC0034104C /* EstuLogPhotoCellReactor.swift */; };
+		908262032A9F3EAE0034104C /* EstuLogPhotoHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908262022A9F3EAE0034104C /* EstuLogPhotoHeaderView.swift */; };
 		908FEE992A42A1D300BEB81C /* StuResultDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908FEE982A42A1D300BEB81C /* StuResultDataModel.swift */; };
 		908FEE9B2A42CA1D00BEB81C /* MeTraineeDetails04HeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908FEE9A2A42CA1D00BEB81C /* MeTraineeDetails04HeaderView.swift */; };
 		908FEE9D2A42CA3F00BEB81C /* MeTraineeDetails04HeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 908FEE9C2A42CA3F00BEB81C /* MeTraineeDetails04HeaderView.xib */; };
@@ -233,6 +249,22 @@
 		9076C5D92A386B2300E5E33F /* MineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MineViewController.swift; sourceTree = "<group>"; };
 		9076C5DB2A386B2F00E5E33F /* MineViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MineViewController.xib; sourceTree = "<group>"; };
 		9076C5DE2A387CBC00E5E33F /* MeTraineeListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeListViewController.swift; sourceTree = "<group>"; };
+		908261E22A9C89F10034104C /* EstuLogListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLogListViewController.swift; sourceTree = "<group>"; };
+		908261E52A9CA5210034104C /* EstuLogHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLogHeaderView.swift; sourceTree = "<group>"; };
+		908261E72A9CA55C0034104C /* EstuLogHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EstuLogHeaderView.xib; sourceTree = "<group>"; };
+		908261E92A9D7BF90034104C /* EstuLog01HeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLog01HeaderView.swift; sourceTree = "<group>"; };
+		908261EB2A9D7C070034104C /* EstuLog01HeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EstuLog01HeaderView.xib; sourceTree = "<group>"; };
+		908261ED2A9DD3ED0034104C /* EstuLogListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLogListCell.swift; sourceTree = "<group>"; };
+		908261EF2A9DD3FD0034104C /* EstuLogListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EstuLogListCell.xib; sourceTree = "<group>"; };
+		908261F12A9DD4570034104C /* EstuLogListDetailsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLogListDetailsCell.swift; sourceTree = "<group>"; };
+		908261F32A9DD4650034104C /* EstuLogListDetailsCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EstuLogListDetailsCell.xib; sourceTree = "<group>"; };
+		908261F52A9EF0840034104C /* ElogCoachAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElogCoachAPI.swift; sourceTree = "<group>"; };
+		908261F72A9EF0C70034104C /* ElogCoachService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElogCoachService.swift; sourceTree = "<group>"; };
+		908261F92A9EF1A70034104C /* EstuLogPhotoListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLogPhotoListViewController.swift; sourceTree = "<group>"; };
+		908261FB2A9F312D0034104C /* EstuLogPhotoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLogPhotoCell.swift; sourceTree = "<group>"; };
+		908261FE2A9F31A00034104C /* BaseCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseCollectionViewCell.swift; sourceTree = "<group>"; };
+		908262002A9F35EC0034104C /* EstuLogPhotoCellReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLogPhotoCellReactor.swift; sourceTree = "<group>"; };
+		908262022A9F3EAE0034104C /* EstuLogPhotoHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstuLogPhotoHeaderView.swift; sourceTree = "<group>"; };
 		908FEE982A42A1D300BEB81C /* StuResultDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StuResultDataModel.swift; sourceTree = "<group>"; };
 		908FEE9A2A42CA1D00BEB81C /* MeTraineeDetails04HeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeTraineeDetails04HeaderView.swift; sourceTree = "<group>"; };
 		908FEE9C2A42CA3F00BEB81C /* MeTraineeDetails04HeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MeTraineeDetails04HeaderView.xib; sourceTree = "<group>"; };
@@ -534,6 +566,8 @@
 				90BC4BDF2A3C46C4006FD683 /* MeTraineeDetailsPageViewController.xib */,
 				90971E682A493BCB00267B7F /* MeTabBarController.swift */,
 				90971E6A2A493DE500267B7F /* MeTabBarViewReactor.swift */,
+				908261E22A9C89F10034104C /* EstuLogListViewController.swift */,
+				908261F92A9EF1A70034104C /* EstuLogPhotoListViewController.swift */,
 			);
 			path = Controllers;
 			sourceTree = "<group>";
@@ -541,6 +575,7 @@
 		9076C5D82A386B0C00E5E33F /* Views */ = {
 			isa = PBXGroup;
 			children = (
+				908261E42A9CA4AC0034104C /* EstuLog */,
 				909DA5C42A3AA1E60034501F /* MeTraineeNavBar.swift */,
 				909DA5C62A3AA1FF0034501F /* MeTraineeNavBar.xib */,
 				909DA5D22A3ADFD80034501F /* MeTraineeSubjectCell.swift */,
@@ -579,6 +614,32 @@
 			path = App;
 			sourceTree = "<group>";
 		};
+		908261E42A9CA4AC0034104C /* EstuLog */ = {
+			isa = PBXGroup;
+			children = (
+				908261E52A9CA5210034104C /* EstuLogHeaderView.swift */,
+				908261E72A9CA55C0034104C /* EstuLogHeaderView.xib */,
+				908261E92A9D7BF90034104C /* EstuLog01HeaderView.swift */,
+				908261EB2A9D7C070034104C /* EstuLog01HeaderView.xib */,
+				908261ED2A9DD3ED0034104C /* EstuLogListCell.swift */,
+				908261EF2A9DD3FD0034104C /* EstuLogListCell.xib */,
+				908261F12A9DD4570034104C /* EstuLogListDetailsCell.swift */,
+				908261F32A9DD4650034104C /* EstuLogListDetailsCell.xib */,
+				908261FB2A9F312D0034104C /* EstuLogPhotoCell.swift */,
+				908262002A9F35EC0034104C /* EstuLogPhotoCellReactor.swift */,
+				908262022A9F3EAE0034104C /* EstuLogPhotoHeaderView.swift */,
+			);
+			path = EstuLog;
+			sourceTree = "<group>";
+		};
+		908261FD2A9F31800034104C /* View */ = {
+			isa = PBXGroup;
+			children = (
+				908261FE2A9F31A00034104C /* BaseCollectionViewCell.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		90971E702A498A2000267B7F /* Statistics */ = {
 			isa = PBXGroup;
 			children = (
@@ -729,6 +790,7 @@
 		90CE522E2A36E4600033BD06 /* Base */ = {
 			isa = PBXGroup;
 			children = (
+				908261FD2A9F31800034104C /* View */,
 				90CE522F2A36E4600033BD06 /* BaseCollectionViewController.swift */,
 				90CE52302A36E4600033BD06 /* BaseViewController.swift */,
 				90CE52312A36E4600033BD06 /* BaseTableViewController.swift */,
@@ -990,6 +1052,8 @@
 				90CE53032A3834360033BD06 /* CoachService.swift */,
 				90971E6C2A4979D000267B7F /* StatisticsAPI.swift */,
 				90971E6E2A4979F300267B7F /* StatisticsService.swift */,
+				908261F52A9EF0840034104C /* ElogCoachAPI.swift */,
+				908261F72A9EF0C70034104C /* ElogCoachService.swift */,
 			);
 			path = Services;
 			sourceTree = "<group>";
@@ -1180,6 +1244,7 @@
 				908FEEA12A42CC1E00BEB81C /* MeTraineeDetails04Cell.xib in Resources */,
 				90CE52252A36C0720033BD06 /* LaunchScreen.storyboard in Resources */,
 				90BC4BE02A3C46C4006FD683 /* MeTraineeDetailsPageViewController.xib in Resources */,
+				908261EC2A9D7C070034104C /* EstuLog01HeaderView.xib in Resources */,
 				908FEEAD2A42E23C00BEB81C /* MeTraineeDetails03Cell.xib in Resources */,
 				90CE528A2A36E5460033BD06 /* PopOverViewCell.xib in Resources */,
 				909DA5D12A3AC2460034501F /* UpdatePasswordViewController.xib in Resources */,
@@ -1190,17 +1255,20 @@
 				90971E942A4AB18D00267B7F /* StatisticsPageHeaderView.xib in Resources */,
 				9076C5DC2A386B2F00E5E33F /* MineViewController.xib in Resources */,
 				903628C82A417B2D00F0AA6C /* MeTraineeDetails01Cell.xib in Resources */,
+				908261E82A9CA55C0034104C /* EstuLogHeaderView.xib in Resources */,
 				90CE52EB2A36E8680033BD06 /* LoginViewController.xib in Resources */,
 				909DA5D52A3AE0160034501F /* MeTraineeSubjectCell.xib in Resources */,
 				908FEE9D2A42CA3F00BEB81C /* MeTraineeDetails04HeaderView.xib in Resources */,
 				9043ADA82A5563A9005F6F81 /* CoachAppdownloadPageController.xib in Resources */,
 				90CE52852A36E5460033BD06 /* EmptyView.xib in Resources */,
 				908FEEA92A42E1BF00BEB81C /* MeTraineeDetails03HeaderView.xib in Resources */,
+				908261F02A9DD3FD0034104C /* EstuLogListCell.xib in Resources */,
 				90CE53002A36F7110033BD06 /* HomeViewController.xib in Resources */,
 				90BC4BE72A3DDF44006FD683 /* MeTraineeSubjectHeaderView.xib in Resources */,
 				9043ADA42A554E2E005F6F81 /* CoachQRPageController.xib in Resources */,
 				909DA5CD2A3AC00D0034501F /* MeTraineeSearchPageViewController.xib in Resources */,
 				903628D42A41AFD700F0AA6C /* MeTraineeDetails02Cell.xib in Resources */,
+				908261F42A9DD4650034104C /* EstuLogListDetailsCell.xib in Resources */,
 				903628CC2A417BE700F0AA6C /* MeTraineeDetails01HeaderView.xib in Resources */,
 				909DA5C72A3AA1FF0034501F /* MeTraineeNavBar.xib in Resources */,
 				90971E982A4AB20600267B7F /* StatisticsPageCell.xib in Resources */,
@@ -1281,23 +1349,27 @@
 				90CE53022A3834060033BD06 /* CoachAPI.swift in Sources */,
 				90CE52D82A36E6000033BD06 /* URLNavigationMap.swift in Sources */,
 				903628BB2A40431800F0AA6C /* TraineeInfoModel.swift in Sources */,
+				908262032A9F3EAE0034104C /* EstuLogPhotoHeaderView.swift in Sources */,
 				908FEE992A42A1D300BEB81C /* StuResultDataModel.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 */,
+				908261F82A9EF0C70034104C /* ElogCoachService.swift in Sources */,
 				90A8CD462A5E763E00C02402 /* MeTraineeSearchViewModel.swift in Sources */,
 				90CE52DD2A36E6250033BD06 /* CompositionRoot.swift in Sources */,
 				90CE52BE2A36E5B70033BD06 /* RequestError.swift in Sources */,
 				90CE52342A36E4600033BD06 /* BaseTableViewController.swift in Sources */,
 				90971E962A4AB1F400267B7F /* StatisticsPageCell.swift in Sources */,
+				908261E32A9C89F10034104C /* EstuLogListViewController.swift in Sources */,
 				90CE52892A36E5460033BD06 /* PopOverViewCell.swift in Sources */,
 				90CE52332A36E4600033BD06 /* BaseViewController.swift in Sources */,
 				9043ADB02A569309005F6F81 /* GTMBase64.m in Sources */,
 				90CE52A32A36E59A0033BD06 /* UIImageView+Kingfisher.swift in Sources */,
 				903628C22A41768400F0AA6C /* MeTraineeDetails03Controller.swift in Sources */,
 				90CE527D2A36E5460033BD06 /* Refreshable.swift in Sources */,
+				908261FF2A9F31A00034104C /* BaseCollectionViewCell.swift in Sources */,
 				90CE52472A36E5170033BD06 /* NYImage.swift in Sources */,
 				9043AD9B2A542267005F6F81 /* StatisticsOfficialPageHeaderView.swift in Sources */,
 				90CE52A42A36E59A0033BD06 /* DispatchQueue+Extension.swift in Sources */,
@@ -1314,6 +1386,7 @@
 				90CE52AA2A36E59A0033BD06 /* UIBarButtonItem+FixSpace.swift in Sources */,
 				903628C02A41767900F0AA6C /* MeTraineeDetails02Controller.swift in Sources */,
 				90CE52B42A36E5A40033BD06 /* Logger.swift in Sources */,
+				908261F62A9EF0840034104C /* ElogCoachAPI.swift in Sources */,
 				90CE52EF2A36EC950033BD06 /* NYArticleViewController.swift in Sources */,
 				90CE52D72A36E6000033BD06 /* Snap.swift in Sources */,
 				90E65C9C2A7B93AE0055B09C /* AuthorizationDataModel.swift in Sources */,
@@ -1323,7 +1396,9 @@
 				90CE527F2A36E5460033BD06 /* NibLoadable.swift in Sources */,
 				90CE52FA2A36F2570033BD06 /* LoginService.swift in Sources */,
 				90CE52812A36E5460033BD06 /* BilibiliCollectionViewLayout.swift in Sources */,
+				908261E62A9CA5210034104C /* EstuLogHeaderView.swift in Sources */,
 				90CE52AE2A36E59A0033BD06 /* UIScrollView+ScrollToBottom.swift in Sources */,
+				908261FC2A9F312D0034104C /* EstuLogPhotoCell.swift in Sources */,
 				90CE52AF2A36E59A0033BD06 /* UIColor+NY.swift in Sources */,
 				903B4E6A2A73A49D00FD7320 /* SwitchAccountCell.swift in Sources */,
 				90CE52B12A36E59A0033BD06 /* VTContentView+Gesture.swift in Sources */,
@@ -1334,6 +1409,7 @@
 				90CE53042A3834360033BD06 /* CoachService.swift in Sources */,
 				908FEEA52A42D62A00BEB81C /* StuTmsSignDataModel.swift in Sources */,
 				90BC4BDE2A3C4691006FD683 /* MeTraineeDetailsPageViewController.swift in Sources */,
+				908261EE2A9DD3ED0034104C /* EstuLogListCell.swift in Sources */,
 				90A8CD4B2A5F9EE000C02402 /* StatisticsPageViewModel.swift in Sources */,
 				90CE52CB2A36E5EC0033BD06 /* UILabel+Rx.swift in Sources */,
 				903C04AA2A651B1200935764 /* NYIDFA.swift in Sources */,
@@ -1343,6 +1419,7 @@
 				90CE52862A36E5460033BD06 /* EmptyView.swift in Sources */,
 				90971E802A4A7F4900267B7F /* ViewController.swift in Sources */,
 				90CE52452A36E5170033BD06 /* NYFitReal.swift in Sources */,
+				908261FA2A9EF1A70034104C /* EstuLogPhotoListViewController.swift in Sources */,
 				90CE52A52A36E59A0033BD06 /* UIButton+Kingfisher.swift in Sources */,
 				90CE52B02A36E59A0033BD06 /* NSAttributedString+BoundingRect.swift in Sources */,
 				90CE52C92A36E5EC0033BD06 /* Moya+Rx.swift in Sources */,
@@ -1366,7 +1443,9 @@
 				903B4E672A735FA600FD7320 /* SwitchAccountViewController.swift in Sources */,
 				90CE52832A36E5460033BD06 /* SearchBarView.swift in Sources */,
 				9076C5DA2A386B2300E5E33F /* MineViewController.swift in Sources */,
+				908261F22A9DD4570034104C /* EstuLogListDetailsCell.swift in Sources */,
 				903628CA2A417BA800F0AA6C /* MeTraineeDetails01HeaderView.swift in Sources */,
+				908262012A9F35EC0034104C /* EstuLogPhotoCellReactor.swift in Sources */,
 				903628D22A41AFA400F0AA6C /* MeTraineeDetails02Cell.swift in Sources */,
 				90CE52AC2A36E59A0033BD06 /* Array+SectionModel.swift in Sources */,
 				90CE52762A36E5460033BD06 /* LWPlayerSlider.swift in Sources */,
@@ -1390,6 +1469,7 @@
 				903B4E6E2A73C5D800FD7320 /* NYAccountManager.swift in Sources */,
 				90A8CD482A5EACB500C02402 /* MeTraineeSubjectViewModel.swift in Sources */,
 				90CE52BB2A36E5B70033BD06 /* LoadingPlugin.swift in Sources */,
+				908261EA2A9D7BF90034104C /* EstuLog01HeaderView.swift in Sources */,
 				90CE52F42A36EDCF0033BD06 /* NYArticleNavBar.swift in Sources */,
 				90CE52A62A36E59A0033BD06 /* String+BoundingRect.swift in Sources */,
 				908FEEA32A42D35000BEB81C /* BaseGroupTableViewController.swift in Sources */,
@@ -1560,7 +1640,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = JiaPeiManage/JiaPeiManage.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1232023080702;
+				CURRENT_PROJECT_VERSION = 1232023080703;
 				DEVELOPMENT_TEAM = K7T6CU5SW5;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = JiaPeiManage/Info.plist;
@@ -1603,7 +1683,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = JiaPeiManage/JiaPeiManage.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1232023080702;
+				CURRENT_PROJECT_VERSION = 1232023080703;
 				DEVELOPMENT_TEAM = K7T6CU5SW5;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = JiaPeiManage/Info.plist;

+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/arrow_down.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/arrow_down.imageset/向下.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/arrow_down.imageset/向下@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/arrow_down.imageset/向下@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/estu_log.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/estu_log.imageset/电子教学日志.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/estu_log.imageset/电子教学日志@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/estu_log.imageset/电子教学日志@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_left.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/log_head_left.imageset/左.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_left.imageset/左@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_left.imageset/左@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_right.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/log_head_right.imageset/右.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_right.imageset/右@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/log_head_right.imageset/右@3x.png


+ 23 - 0
JiaPeiManage/Assets.xcassets/Modules/Stu/stu_photo.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/stu_photo.imageset/照片.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/stu_photo.imageset/照片@2x.png


BIN
JiaPeiManage/Assets.xcassets/Modules/Stu/stu_photo.imageset/照片@3x.png


+ 34 - 0
JiaPeiManage/Sources/Main/Base/View/BaseCollectionViewCell.swift

@@ -0,0 +1,34 @@
+//
+//  BaseCollectionViewCell.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/30.
+//
+
+import UIKit
+
+import RxSwift
+
+
+class BaseCollectionViewCell: UICollectionViewCell {
+    
+    var disposeBag = DisposeBag()
+    
+    // MARK: Initializing
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        
+        self.backgroundColor = UIColor.db_white
+        
+        initialize()
+    }
+    
+    required convenience init?(coder aDecoder: NSCoder) {
+        self.init(frame: .zero)
+    }
+    
+    func initialize() {
+        
+    }
+}

+ 23 - 9
JiaPeiManage/Sources/Modulars/Login/Controllers/LoginViewController.swift

@@ -64,11 +64,6 @@ final class LoginViewController: BaseViewController {
             }
         },onError: { Error in
         }).disposed(by: disposeBag)
-        //是否审核
-        LocalManager.loginService.dictRequest(dictType: "coach_version").subscribe(onSuccess: { cityItems in
-            
-        },onError: { Error in
-        }).disposed(by: disposeBag)
     }
     // MARK: 私有方法
     func setupUI(){
@@ -136,15 +131,15 @@ final class LoginViewController: BaseViewController {
         //选择区域
         location_button.rx.tap.subscribe ({ [unowned self] (_)  in
             NSLog("点击了:选择区域- \(Thread.isMainThread)")
-            self.showDialog(type: 0)
+            self.getCityArray(type: 0)
         }).disposed(by: disposeBag)
         location_button_btn.rx.tap.subscribe ({ [unowned self] (_)  in
-            self.showDialog(type: 0)
+            self.getCityArray(type: 0)
         }).disposed(by: disposeBag)
         //wxin_button
         wxin_button.rx.tap.subscribe ({ [unowned self] (_)  in
             if WXApi.isWXAppInstalled() {
-                self.showDialog(type: 1)
+                self.getCityArray(type: 1)
             }else {
                 NYTips.showMsg(txt: "本地未安装微信")
             }
@@ -153,7 +148,7 @@ final class LoginViewController: BaseViewController {
         //apple id
         apple_button.rx.tap.subscribe ({ [unowned self] (_)  in
             if #available(iOS 13.0, *) {
-                self.showDialog(type: 2)
+                self.getCityArray(type: 2)
             } else {
                 // Fallback on earlier versions
                 NYTips.showMsg(txt: "请升级到iOS13.0以上")
@@ -275,6 +270,25 @@ final class LoginViewController: BaseViewController {
         view.addGestureRecognizer(tapBackground)
     }
     
+    func getCityArray(type:Int){
+        if self.cityItems.count == 0 {
+            NYTips.show()
+            //获取字典数据
+            loginService.dictRequest(dictType: "coach_city").subscribe(onSuccess: { [unowned self] cityItems in
+                self.cityItems = cityItems
+                for cityItem in cityItems {
+                    self.citys[cityItem.dictLabel] = cityItem.dictValue
+                }
+                NYTips.hide()
+                self.showDialog(type: type)
+            },onError: { Error in
+                NYTips.hide()
+            }).disposed(by: disposeBag)
+        }else{
+            self.showDialog(type: type)
+        }
+    }
+    
     func showDialog(type:Int){
         self.type = type
         let dialogViewController = QMUIDialogSelectionViewController()

+ 192 - 0
JiaPeiManage/Sources/Modulars/学员/Controllers/EstuLogListViewController.swift

@@ -0,0 +1,192 @@
+//
+//  EstuLogListViewController.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/28.
+//
+
+import UIKit
+import RxSwift
+import RxCocoa
+
+
+final class EstuLogListViewController: BaseTableViewController {
+    
+    let cellIdentifier:String = "_EstuLogListCell"
+    let dtcellIdentifier:String = "_EstuLogListDetailsCell"
+    // MARK: 服务属性
+    private let cocahService: CoachServiceType = CoachService(networking: CoachNetworking())
+    // MARK: 私有属性
+    
+
+    // MARK: UI let
+    let statusBar = UIView().then {
+        $0.backgroundColor = UIColor.db_theme
+    }
+    
+    let navBar = MeTraineeNavBar.loadFromNib().then {
+        $0.search_button.isHidden = true
+    }
+    
+    let estuLogHeaderView = EstuLogHeaderView.loadFromNib()
+    
+    let mtheader01_view = MeTraineeDetails01HeaderView.loadFromNib().then {
+        $0.title_label.text = "查询明细"
+    }
+    
+    let header01_view = EstuLog01HeaderView.loadFromNib()
+
+    var selectPath = -1;
+    
+    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)
+        }
+        
+        tableView.snp.remakeConstraints { make in
+            make.top.equalTo(self.navBar.snp.bottom)
+            make.left.right.bottom.equalTo(self.view)
+        }
+        self.loadViewIfNeeded()
+    }
+    func scrollViewDidScroll(_ scrollView: UIScrollView) {
+    }
+    // MARK: StatusBar
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        
+        self.navigationController?.setNavigationBarHidden(true, animated: true)
+    }
+    
+    init(type:TraineeType) {
+        super.init()
+        navBar.title_label.text = "电子教学日志"
+        
+    }
+    
+    required convenience init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        configureMagicController()
+        setupUI()
+        biandView()
+    }
+    
+    // MARK: 私有方法
+    
+    func setupUI(){
+        
+        self.navBar.back_button.addTarget(self, action: #selector(actionBackdo), for: .touchUpInside)
+    }
+    
+    func configureMagicController(){
+     
+        self.view.addSubview(navBar)
+        self.view.addSubview(statusBar)
+        
+    }
+    
+    func biandView(){
+        tableView.delegate = self
+        tableView.dataSource = self
+        tableView.separatorStyle = .none //去除分割线
+        tableView.register(UINib(nibName: "EstuLogListCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
+        tableView.register(UINib(nibName: "EstuLogListDetailsCell", bundle: nil), forCellReuseIdentifier: dtcellIdentifier)
+        setupRefreshHeader(tableView) {[unowned self] in
+//            self.getStuResultList()
+        }
+        self.isEmptyDisplay = false
+        self.hideLoadAnimation()
+        // 设置上拉加载更多
+        tableView.es.addInfiniteScrolling { [weak self] in
+//            self?.getLoadMore()
+        }
+        // tableView点击事件
+        tableView.rx.itemSelected.throttle(.seconds(1), scheduler: MainScheduler.instance)
+            .subscribe(onNext: { [weak self]indexPath in
+            print("点击\(indexPath)行")
+                self?.selectPath = indexPath.row
+                self?.tableView.reloadData()
+//            let rowInfo:RowInfo = self!.meTraineeSearchViewModel.rows[indexPath.row]
+//            if rowInfo != nil && rowInfo.bmType == "2"  {
+//                let context: Int = rowInfo.id!
+//                NYSwRouter.push(NYSwPushType.trainee_info,context: context)
+//            }
+//            self?.tableView.deselectRow(at: indexPath, animated: false)
+        }).disposed(by: disposeBag)
+    }
+    
+}
+
+//数据源
+extension EstuLogListViewController:UITableViewDataSource {
+    
+    
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+
+        return 10
+    }
+    
+    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
+        let header_view = UIView().then {
+            $0.backgroundColor = .db_theme
+        }
+        header_view.addSubview(estuLogHeaderView)
+        estuLogHeaderView.snp.makeConstraints { make in
+            make.left.right.top.equalTo(header_view)
+            make.height.equalTo(59.f)
+        }
+        header_view.addSubview(mtheader01_view)
+        mtheader01_view.snp.makeConstraints { make in
+            make.top.equalTo(estuLogHeaderView.bottom)
+            make.left.right.equalTo(header_view)
+            make.height.equalTo(52.f)
+        }
+        header_view.addSubview(header01_view)
+        header01_view.snp.makeConstraints { make in
+            make.top.equalTo(mtheader01_view.bottom)
+            make.left.right.equalTo(header_view)
+            make.height.equalTo(44.f)
+        }
+        header_view.layoutIfNeeded()
+        return header_view
+    }
+    
+    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
+        return 155.f
+    }
+    
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        var cell:UITableViewCell;
+        if self.selectPath == indexPath.row {
+            cell = tableView.dequeueReusableCell(withIdentifier: dtcellIdentifier, for: indexPath) as! EstuLogListDetailsCell
+        }else {
+            cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! EstuLogListCell
+        }
+        return cell
+    }
+    
+    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
+        if(selectPath==indexPath.row){
+            return 465.f;
+        }
+        return 80.f;
+    }
+}
+
+//事件
+extension EstuLogListViewController:UITableViewDelegate {
+
+    
+}

+ 174 - 0
JiaPeiManage/Sources/Modulars/学员/Controllers/EstuLogPhotoListViewController.swift

@@ -0,0 +1,174 @@
+//
+//  EstuLogPhotoListViewController.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/30.
+//
+
+import UIKit
+import RxSwift
+import RxCocoa
+import ReusableKit
+import Dollar
+
+final class EstuLogPhotoListViewController: BaseCollectionViewController {
+    
+    let cellIdentifier:String = "_EstuLogListCell"
+    // MARK: 服务属性
+    private let cocahService: CoachServiceType = CoachService(networking: CoachNetworking())
+
+    private struct Reusable {
+        static let ephotoCell = ReusableCell<EstuLogPhotoCell>()
+        static let headerView = ReusableView<EstuLogPhotoHeaderView>()
+    }
+
+    // MARK: UI let
+    let statusBar = UIView().then {
+        $0.backgroundColor = UIColor.db_theme
+    }
+    
+    let navBar = MeTraineeNavBar.loadFromNib().then {
+        $0.search_button.isHidden = true
+    }
+    
+    let estuLogHeaderView = EstuLogHeaderView.loadFromNib()
+    
+
+    var selectPath = -1;
+    
+    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)
+        }
+        
+        collectionView.snp.remakeConstraints { make in
+            make.top.equalTo(self.navBar.snp.bottom)
+            make.left.right.bottom.equalTo(self.view)
+        }
+        self.loadViewIfNeeded()
+    }
+    
+    // MARK: StatusBar
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        
+        self.navigationController?.setNavigationBarHidden(true, animated: true)
+    }
+    
+    init(type:TraineeType) {
+        super.init()
+        navBar.title_label.text = "电子教学日志"
+        
+    }
+    
+    required convenience init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        configureMagicController()
+        setupUI()
+        biandView()
+    }
+    
+    // MARK: 私有方法
+    
+    func setupUI(){
+        
+        self.navBar.back_button.addTarget(self, action: #selector(actionBackdo), for: .touchUpInside)
+    }
+    
+    func configureMagicController(){
+     
+        self.view.addSubview(navBar)
+        self.view.addSubview(statusBar)
+        
+    }
+    
+    func biandView(){
+        collectionView.backgroundColor = UIColor.db_theme
+//        collectionView.frame = self.view.bounds
+        collectionView.register(Reusable.ephotoCell)
+        collectionView.register(Reusable.headerView, kind: UICollectionView.elementKindSectionHeader)
+        collectionView.delegate = self
+        collectionView.dataSource = self
+        self.isEmptyDisplay = false
+        self.hideLoadAnimation()
+//        if !isRcmd {
+//
+//            setupRefreshHeader(collectionView,.rabbit) {[unowned self] in
+//                self.netRequest()
+//            }
+//
+//            self.autoSetRefreshStatus(header: collectionView.header).disposed(by: disposeBag)
+//        }
+//
+//        netRequest()
+    }
+    
+    
+}
+
+extension EstuLogPhotoListViewController: UICollectionViewDataSource {
+    
+    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
+        
+         return 10 //self.datasources.count
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+        
+         let cell = collectionView.dequeue(Reusable.ephotoCell, for: indexPath)
+//         cell.reactor = datasources[indexPath.item]
+         return cell
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+        
+        collectionView.deselectItem(at: indexPath, animated: true)
+    }
+    
+    // Provide header view for each section
+    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
+        let headerView = collectionView.dequeue(Reusable.headerView, kind: kind, for: indexPath)
+//        (ofKind: kind, withReuseIdentifier: Reusable.headerView, for: indexPath)
+        return headerView
+    }
+}
+
+extension EstuLogPhotoListViewController: UICollectionViewDelegateFlowLayout {
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
+        
+//        let cellReactor = datasources[indexPath.item]
+        
+        return  CGSize(width: NYFitReal.screenWidth*0.5, height: 172) //Reusable.rcmdCell.class.cellSize(reactor: cellReactor)
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
+
+        return UIEdgeInsets.zero
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
+        return 0.f
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
+        return 0.f
+    }
+    
+    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
+        
+        return CGSize(width: NYFitReal.screenWidth, height: 99.f)  //branchSectionDelegate.headerSize(collectionView: collectionView,section: dataSource[section])
+    }
+}

+ 5 - 0
JiaPeiManage/Sources/Modulars/学员/Controllers/MeTraineeDetails/MeTraineeDetails01Controller.swift

@@ -125,6 +125,11 @@ extension MeTraineeDetails01Controller:UITableViewDataSource {
     func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
         let header_view = MeTraineeDetails01HeaderView.loadFromNib()
         header_view.title_label.text = keys[section]
+        if section == 1 {
+            header_view.estu_log_button.isHidden = false
+        } else {
+            header_view.estu_log_button.isHidden = true
+        }
         return header_view
     }
     

+ 71 - 32
JiaPeiManage/Sources/Modulars/学员/ViewModel/MeTraineeSubjectViewModel.swift

@@ -36,7 +36,7 @@ class MeTraineeSubjectViewModel: NSObject {
     func getCoachInfoList(vc:MeTraineeSubjectPageViewController)
     {
         page = 1
-        let coachId = schoolId > 0 ? "" : "\(LocalManager.userInfo.id)"
+        let coachId = "\(LocalManager.userInfo.id)" //8-28 都传入coachId 都由服务端判断
         if (self.type == .advancet){ //预报名
             if state == "0" {
                 self.cocahService.coachTempListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: coachId, field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: "")
@@ -56,22 +56,43 @@ class MeTraineeSubjectViewModel: NSObject {
                     })
                     .disposed(by: vc.disposeBag)
             }else {
-                self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: coachId, field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
-                    .subscribe(onSuccess: {[unowned self] traineeDataModel in
-                        self.rows.removeAll()
-                        self.traineeDataModel = traineeDataModel
-                        self.rows += traineeDataModel.rows!
-                        itemsSubject.onNext(self.rows)//消息rx
-                        print("coachInfoListRequest成功")
-                        vc.isEmptyDisplay = true
-                        vc.hideLoadAnimation()
-                        vc.tableView.reloadData()
-                        vc.stopRefresh()
-                        NotificationCenter.default.post(name: Notification.updateItemTopTotalNameNotification, object: [traineeDataModel.total,Int(self.state)!])
-                    }, onError: { error in
-                        vc.stopRefresh()
-                    })
-                    .disposed(by: vc.disposeBag)
+                if (schoolId>0){//在校
+                    self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: coachId, field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
+                        .subscribe(onSuccess: {[unowned self] traineeDataModel in
+                            self.rows.removeAll()
+                            self.traineeDataModel = traineeDataModel
+                            self.rows += traineeDataModel.rows!
+                            itemsSubject.onNext(self.rows)//消息rx
+                            print("coachInfoListRequest成功")
+                            vc.isEmptyDisplay = true
+                            vc.hideLoadAnimation()
+                            vc.tableView.reloadData()
+                            vc.stopRefresh()
+                            NotificationCenter.default.post(name: Notification.updateItemTopTotalNameNotification, object: [traineeDataModel.total,Int(self.state)!])
+                        }, onError: { error in
+                            vc.stopRefresh()
+                        })
+                        .disposed(by: vc.disposeBag)
+                }else{//我的
+                    schoolId = LocalManager.userInfo.schoolId
+                    self.cocahService.coachInfoMyListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: coachId, field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
+                        .subscribe(onSuccess: {[unowned self] traineeDataModel in
+                            self.rows.removeAll()
+                            self.traineeDataModel = traineeDataModel
+                            self.rows += traineeDataModel.rows!
+                            itemsSubject.onNext(self.rows)//消息rx
+                            print("coachInfoListRequest成功")
+                            vc.isEmptyDisplay = true
+                            vc.hideLoadAnimation()
+                            vc.tableView.reloadData()
+                            vc.stopRefresh()
+                            NotificationCenter.default.post(name: Notification.updateItemTopTotalNameNotification, object: [traineeDataModel.total,Int(self.state)!])
+                        }, onError: { error in
+                            vc.stopRefresh()
+                        })
+                        .disposed(by: vc.disposeBag)
+                }
+                
             }
             
             
@@ -126,7 +147,7 @@ class MeTraineeSubjectViewModel: NSObject {
                 return //已经显示完
             }
         }
-        let coachId = schoolId > 0 ? "" : "\(LocalManager.userInfo.id)"
+        let coachId = "\(LocalManager.userInfo.id)" //8-28 都传入coachId 都由服务端判断
         if (self.type == .advancet){ //预报名
             if state == "0" {
                 self.cocahService.coachTempListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: coachId, field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: "")
@@ -144,20 +165,38 @@ class MeTraineeSubjectViewModel: NSObject {
                     })
                     .disposed(by: vc.disposeBag)
             }else {
-                self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: coachId, field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
-                    .subscribe(onSuccess: {[unowned self] traineeDataModel in
-                        self.traineeDataModel = traineeDataModel
-                        if(traineeDataModel.rows!.count>0){
-                            self.rows += traineeDataModel.rows!
-                        }
-                        itemsSubject.onNext(self.rows)//消息rx
-                        print("coachInfoListRequest成功")
-        //                vc.tableView.reloadData()
-                        vc.stopLoad()
-                    }, onError: { error in
-                        vc.stopRefresh()
-                    })
-                    .disposed(by: vc.disposeBag)
+                if (schoolId>0){//在校
+                    self.cocahService.coachInfoListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: coachId, field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
+                        .subscribe(onSuccess: {[unowned self] traineeDataModel in
+                            self.traineeDataModel = traineeDataModel
+                            if(traineeDataModel.rows!.count>0){
+                                self.rows += traineeDataModel.rows!
+                            }
+                            itemsSubject.onNext(self.rows)//消息rx
+                            print("coachInfoListRequest成功")
+            //                vc.tableView.reloadData()
+                            vc.stopLoad()
+                        }, onError: { error in
+                            vc.stopRefresh()
+                        })
+                        .disposed(by: vc.disposeBag)
+                }else {//我的
+                    self.cocahService.coachInfoMyListRequest(city: LocalManager.userInfo.city!, appCoachId: "", coachId: coachId, field: "", pageNum: page, pageSize: pageSize, schoolId: schoolId, state: state)
+                        .subscribe(onSuccess: {[unowned self] traineeDataModel in
+                            self.traineeDataModel = traineeDataModel
+                            if(traineeDataModel.rows!.count>0){
+                                self.rows += traineeDataModel.rows!
+                            }
+                            itemsSubject.onNext(self.rows)//消息rx
+                            print("coachInfoListRequest成功")
+            //                vc.tableView.reloadData()
+                            vc.stopLoad()
+                        }, onError: { error in
+                            vc.stopRefresh()
+                        })
+                        .disposed(by: vc.disposeBag)
+                }
+                
             }
             return
         }else if(self.type == .biandstu){ //绑定学员

+ 18 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLog01HeaderView.swift

@@ -0,0 +1,18 @@
+//
+//  EstuLog01HeaderView.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/29.
+//
+
+import UIKit
+
+final class EstuLog01HeaderView: UIView,NibLoadable {
+
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+    }
+    
+}

+ 76 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLog01HeaderView.xib

@@ -0,0 +1,76 @@
+<?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="retina5_5" 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="EstuLog01HeaderView" customModule="JiaPeiManage" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="44"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="教练员 " textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gcb-25-OFb">
+                    <rect key="frame" x="0.0" y="0.0" width="99" height="44"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="99" id="Xrh-J6-zYw"/>
+                        <constraint firstAttribute="height" constant="44" id="hXZ-sU-Zdr"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+                    <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="0.84705882349999995" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="开始时间" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ofU-mW-NwD">
+                    <rect key="frame" x="99" y="0.0" width="104" height="44"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="QZi-ZE-fcT"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+                    <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="0.84705882349999995" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="结束时间" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="scf-G8-nKx">
+                    <rect key="frame" x="211" y="0.0" width="104" height="44"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="jQC-Nl-fRg"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+                    <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="0.84705882349999995" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="有效时长" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SPc-2u-la1">
+                    <rect key="frame" x="315" y="0.0" width="99" height="44"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="99" id="YiJ-Pt-nZz"/>
+                        <constraint firstAttribute="height" constant="44" id="dlW-p1-LTK"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+                    <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="0.84705882349999995" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" red="0.14901960784313725" green="0.28235294117647058" blue="0.41960784313725491" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="scf-G8-nKx" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="4zG-Wn-fPm"/>
+                <constraint firstItem="scf-G8-nKx" firstAttribute="leading" secondItem="ofU-mW-NwD" secondAttribute="trailing" constant="8" symbolic="YES" id="5jt-bK-ziz"/>
+                <constraint firstItem="ofU-mW-NwD" firstAttribute="bottom" secondItem="vUN-kp-3ea" secondAttribute="bottom" id="6gy-Fl-RYA"/>
+                <constraint firstItem="scf-G8-nKx" firstAttribute="bottom" secondItem="vUN-kp-3ea" secondAttribute="bottom" id="A9k-ti-G6h"/>
+                <constraint firstItem="ofU-mW-NwD" firstAttribute="leading" secondItem="gcb-25-OFb" secondAttribute="trailing" id="CSa-dB-bC8"/>
+                <constraint firstItem="SPc-2u-la1" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="DmI-LJ-rvt"/>
+                <constraint firstItem="gcb-25-OFb" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="FtW-l2-3SJ"/>
+                <constraint firstItem="gcb-25-OFb" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Hvk-si-0UQ"/>
+                <constraint firstItem="SPc-2u-la1" firstAttribute="leading" secondItem="scf-G8-nKx" secondAttribute="trailing" id="Qu5-kj-4qH"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="SPc-2u-la1" secondAttribute="trailing" id="RzR-Kj-Cfv"/>
+                <constraint firstItem="ofU-mW-NwD" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="eTX-W9-Gw0"/>
+                <constraint firstItem="ofU-mW-NwD" firstAttribute="width" secondItem="scf-G8-nKx" secondAttribute="width" id="nDh-Tv-moH"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="-60" y="-12"/>
+        </view>
+    </objects>
+</document>

+ 21 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogHeaderView.swift

@@ -0,0 +1,21 @@
+//
+//  EstuLogHeaderView.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/28.
+//
+
+import UIKit
+
+final class EstuLogHeaderView: UIView,NibLoadable {
+
+    
+    @IBOutlet weak var total_label: UILabel!
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        
+    }
+    
+}

+ 63 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogHeaderView.xib

@@ -0,0 +1,63 @@
+<?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="retina5_5" 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="EstuLogHeaderView" customModule="JiaPeiManage" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="59"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="科目三" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ec7-3o-4R9">
+                    <rect key="frame" x="177" y="30" width="60" height="22"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="22" id="K91-4N-7wJ"/>
+                        <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="60" id="pZg-rK-O8i"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="19"/>
+                    <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="log_head_left" translatesAutoresizingMaskIntoConstraints="NO" id="9K7-TL-Pyr">
+                    <rect key="frame" x="130" y="32.666666666666664" width="39" height="17"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="17" id="5ag-sf-1q6"/>
+                        <constraint firstAttribute="width" constant="39" id="YaF-Jc-bE6"/>
+                    </constraints>
+                </imageView>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="log_head_right" translatesAutoresizingMaskIntoConstraints="NO" id="npm-cj-qaj">
+                    <rect key="frame" x="245" y="32.666666666666664" width="39" height="17"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="17" id="8cR-3F-T8g"/>
+                        <constraint firstAttribute="width" constant="39" id="dcX-Kg-yfl"/>
+                    </constraints>
+                </imageView>
+            </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="ec7-3o-4R9" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="K9l-HP-iyU"/>
+                <constraint firstItem="npm-cj-qaj" firstAttribute="centerY" secondItem="ec7-3o-4R9" secondAttribute="centerY" id="cCJ-Fh-g8l"/>
+                <constraint firstItem="npm-cj-qaj" firstAttribute="leading" secondItem="ec7-3o-4R9" secondAttribute="trailing" constant="8" id="dco-h5-3CL"/>
+                <constraint firstItem="ec7-3o-4R9" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" constant="10" id="l2k-Nc-WSc"/>
+                <constraint firstItem="ec7-3o-4R9" firstAttribute="leading" secondItem="9K7-TL-Pyr" secondAttribute="trailing" constant="8" id="y1n-4W-SN9"/>
+                <constraint firstItem="9K7-TL-Pyr" firstAttribute="centerY" secondItem="ec7-3o-4R9" secondAttribute="centerY" id="yGF-KF-qRW"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="total_label" destination="ec7-3o-4R9" id="qdX-RD-0qV"/>
+            </connections>
+            <point key="canvasLocation" x="44.927536231884062" y="-11.820652173913045"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="log_head_left" width="39" height="17"/>
+        <image name="log_head_right" width="39" height="17"/>
+    </resources>
+</document>

+ 39 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogListCell.swift

@@ -0,0 +1,39 @@
+//
+//  EstuLogListCell.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/29.
+//
+
+import UIKit
+import RxSwift
+
+final class EstuLogListCell: UITableViewCell,NibLoadable {
+    
+    // MARK: UI
+    @IBOutlet weak var name_label: UILabel!
+    
+    @IBOutlet weak var start_time_label: UILabel!
+    
+    @IBOutlet weak var end_time_label: UILabel!
+    
+    @IBOutlet weak var stu_time_label: UILabel!
+    
+    
+//    var disposeBag:DisposeBag?
+    var rowInfo:RowInfo?
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        self.backgroundColor = .db_theme
+        self.contentView.backgroundColor = .db_theme
+        self.selectionStyle = .none
+        
+    }
+    
+    func setRowInfo(rowInfo:RowInfo){
+        self.rowInfo = rowInfo
+       
+    }
+    
+}

+ 108 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogListCell.xib

@@ -0,0 +1,108 @@
+<?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="retina5_5" 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="EstuLogListCell" customModule="JiaPeiManage" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="80"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ZlG-SI-1n7" userLabel="View-(content)">
+                    <rect key="frame" x="0.0" y="0.0" width="414" height="62"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5iD-Iq-w4z">
+                            <rect key="frame" x="0.0" y="0.0" width="99" height="62"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="99" id="9r5-g3-rLW"/>
+                                <constraint firstAttribute="height" constant="62" id="zW8-Qr-mIj"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <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" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3ri-sY-21O">
+                            <rect key="frame" x="99" y="0.0" width="110.33333333333331" height="62"/>
+                            <string key="text"> 2023-08-23 
+13:47:21</string>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V47-e6-us6">
+                            <rect key="frame" x="315" y="0.0" width="99" height="62"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="99" id="LmB-sj-dj5"/>
+                                <constraint firstAttribute="height" constant="62" id="p5W-Pe-P23"/>
+                            </constraints>
+                            <string key="text">2学时
+41分钟</string>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mIn-fP-b6o">
+                            <rect key="frame" x="209.33333333333334" y="0.0" width="105.66666666666666" height="62"/>
+                            <string key="text"> 2023-08-23 
+13:47:21</string>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666666666666" green="0.20000000000000001" blue="0.3411764705882353" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="bottom" secondItem="5iD-Iq-w4z" secondAttribute="bottom" id="5z9-Xc-pQE"/>
+                        <constraint firstItem="5iD-Iq-w4z" firstAttribute="top" secondItem="ZlG-SI-1n7" secondAttribute="top" id="78l-Uk-fpS"/>
+                        <constraint firstItem="5iD-Iq-w4z" firstAttribute="leading" secondItem="ZlG-SI-1n7" secondAttribute="leading" id="8Vl-FT-B81"/>
+                        <constraint firstItem="V47-e6-us6" firstAttribute="leading" secondItem="mIn-fP-b6o" secondAttribute="trailing" id="ARg-mU-ehT"/>
+                        <constraint firstItem="3ri-sY-21O" firstAttribute="width" secondItem="mIn-fP-b6o" secondAttribute="width" multiplier="1.04348" id="CW6-8e-nFD"/>
+                        <constraint firstAttribute="trailing" secondItem="V47-e6-us6" secondAttribute="trailing" id="GWq-xc-Ouh"/>
+                        <constraint firstItem="mIn-fP-b6o" firstAttribute="leading" secondItem="3ri-sY-21O" secondAttribute="trailing" id="LFP-ro-rCR"/>
+                        <constraint firstAttribute="height" constant="62" id="LkO-c7-gEQ"/>
+                        <constraint firstAttribute="bottom" secondItem="3ri-sY-21O" secondAttribute="bottom" id="SbE-cA-JT0"/>
+                        <constraint firstItem="V47-e6-us6" firstAttribute="top" secondItem="ZlG-SI-1n7" secondAttribute="top" id="Zij-5L-FDp"/>
+                        <constraint firstItem="3ri-sY-21O" firstAttribute="top" secondItem="ZlG-SI-1n7" secondAttribute="top" id="bZ6-tB-azw"/>
+                        <constraint firstAttribute="bottom" secondItem="mIn-fP-b6o" secondAttribute="bottom" id="cs0-Za-IBE"/>
+                        <constraint firstItem="3ri-sY-21O" firstAttribute="leading" secondItem="5iD-Iq-w4z" secondAttribute="trailing" id="hAq-pV-ici"/>
+                        <constraint firstAttribute="bottom" secondItem="V47-e6-us6" secondAttribute="bottom" id="uVb-Xa-7zx"/>
+                        <constraint firstItem="mIn-fP-b6o" firstAttribute="top" secondItem="ZlG-SI-1n7" secondAttribute="top" id="uat-uD-lLa"/>
+                    </constraints>
+                </view>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrow_down" translatesAutoresizingMaskIntoConstraints="NO" id="KXL-5D-tqt">
+                    <rect key="frame" x="198.66666666666666" y="67" width="17" height="9"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="9" id="017-2m-TIz"/>
+                        <constraint firstAttribute="width" constant="17" id="MbO-Sa-L7M"/>
+                    </constraints>
+                </imageView>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" red="0.043137254901960784" green="0.16862745098039217" blue="0.30196078431372547" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="KXL-5D-tqt" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Nuy-sl-1zQ"/>
+                <constraint firstItem="ZlG-SI-1n7" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="Wgk-dn-e8N"/>
+                <constraint firstItem="ZlG-SI-1n7" firstAttribute="trailing" secondItem="vUN-kp-3ea" secondAttribute="trailing" id="dzT-ir-7KA"/>
+                <constraint firstItem="ZlG-SI-1n7" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="mvT-wt-0qH"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="KXL-5D-tqt" secondAttribute="bottom" constant="4" id="wKb-Ek-bIj"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="end_time_label" destination="mIn-fP-b6o" id="uca-lp-1VI"/>
+                <outlet property="name_label" destination="5iD-Iq-w4z" id="M47-2Z-GmI"/>
+                <outlet property="start_time_label" destination="3ri-sY-21O" id="UfC-Wc-GA2"/>
+                <outlet property="stu_time_label" destination="V47-e6-us6" id="iCo-0d-z5K"/>
+            </connections>
+            <point key="canvasLocation" x="47.826086956521742" y="-11.413043478260871"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="arrow_down" width="17" height="9.3333330154418945"/>
+    </resources>
+</document>

+ 38 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogListDetailsCell.swift

@@ -0,0 +1,38 @@
+//
+//  EstuLogListDetailsCell.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/29.
+//
+
+import UIKit
+import RxSwift
+
+final class EstuLogListDetailsCell: UITableViewCell,NibLoadable {
+    
+    // MARK: UI
+    //indexbtn
+    @IBOutlet weak var index_button: QMUIButton!
+    
+//    var disposeBag:DisposeBag?
+    var rowInfo:RowInfo?
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        self.backgroundColor = .db_theme
+        self.contentView.backgroundColor = .db_theme
+        self.selectionStyle = .none
+        
+    }
+    
+    func setRowInfo(rowInfo:RowInfo){
+        self.rowInfo = rowInfo
+       
+    }
+    
+    
+    //电子教学照片日志
+    @IBAction func estuLogPhotoAction(_ sender: QMUIButton) {
+        NYSwRouter.push(NYSwPushType.trainee_estu_log_photo.path)
+    }
+}

+ 363 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogListDetailsCell.xib

@@ -0,0 +1,363 @@
+<?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="retina5_5" 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="EstuLogListDetailsCell" customModule="JiaPeiManage" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="465"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ynt-at-eQ0" userLabel="View-(content)">
+                    <rect key="frame" x="0.0" y="5" width="414" height="62"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TjO-7K-E2t">
+                            <rect key="frame" x="0.0" y="0.0" width="99" height="62"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="99" id="45u-C2-2w5"/>
+                                <constraint firstAttribute="height" constant="62" id="kcQ-y6-LFU"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TTv-wk-fUI">
+                            <rect key="frame" x="99" y="0.0" width="110.33333333333331" height="62"/>
+                            <string key="text"> 2023-08-23 
+13:47:21</string>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mYb-CZ-idk">
+                            <rect key="frame" x="315" y="0.0" width="99" height="62"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="62" id="ki7-mL-gem"/>
+                                <constraint firstAttribute="width" constant="99" id="lTm-J3-O22"/>
+                            </constraints>
+                            <string key="text">2学时
+41分钟</string>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5kK-f7-qbp">
+                            <rect key="frame" x="209.33333333333334" y="0.0" width="105.66666666666666" height="62"/>
+                            <string key="text"> 2023-08-23 
+13:47:21</string>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666669999999" green="0.20000000000000001" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstItem="5kK-f7-qbp" firstAttribute="top" secondItem="Ynt-at-eQ0" secondAttribute="top" id="35w-0a-gmh"/>
+                        <constraint firstItem="5kK-f7-qbp" firstAttribute="leading" secondItem="TTv-wk-fUI" secondAttribute="trailing" id="7xO-yv-CN5"/>
+                        <constraint firstAttribute="bottom" secondItem="TTv-wk-fUI" secondAttribute="bottom" id="Bk9-o6-l1y"/>
+                        <constraint firstItem="TTv-wk-fUI" firstAttribute="leading" secondItem="TjO-7K-E2t" secondAttribute="trailing" id="JnU-Bf-Nt2"/>
+                        <constraint firstItem="TTv-wk-fUI" firstAttribute="width" secondItem="5kK-f7-qbp" secondAttribute="width" multiplier="1.04494" id="LIF-3l-7Sv"/>
+                        <constraint firstItem="mYb-CZ-idk" firstAttribute="leading" secondItem="5kK-f7-qbp" secondAttribute="trailing" id="RUf-L8-579"/>
+                        <constraint firstAttribute="bottom" secondItem="TjO-7K-E2t" secondAttribute="bottom" id="T2l-U1-GDT"/>
+                        <constraint firstAttribute="bottom" secondItem="mYb-CZ-idk" secondAttribute="bottom" id="ULC-NA-LXZ"/>
+                        <constraint firstAttribute="height" constant="62" id="i8Q-bd-V5B"/>
+                        <constraint firstItem="TjO-7K-E2t" firstAttribute="top" secondItem="Ynt-at-eQ0" secondAttribute="top" id="kcf-5M-H5Q"/>
+                        <constraint firstItem="mYb-CZ-idk" firstAttribute="top" secondItem="Ynt-at-eQ0" secondAttribute="top" id="n09-s5-J61"/>
+                        <constraint firstAttribute="trailing" secondItem="mYb-CZ-idk" secondAttribute="trailing" id="pj5-MK-czw"/>
+                        <constraint firstAttribute="bottom" secondItem="5kK-f7-qbp" secondAttribute="bottom" id="rdu-31-rCW"/>
+                        <constraint firstItem="TTv-wk-fUI" firstAttribute="top" secondItem="Ynt-at-eQ0" secondAttribute="top" id="tcs-Jp-XNl"/>
+                        <constraint firstItem="TjO-7K-E2t" firstAttribute="leading" secondItem="Ynt-at-eQ0" secondAttribute="leading" id="vpt-Qi-gW3"/>
+                    </constraints>
+                </view>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="arrow_down" translatesAutoresizingMaskIntoConstraints="NO" id="ToO-wy-ONc">
+                    <rect key="frame" x="198.66666666666666" y="448" width="17" height="9"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="17" id="OGf-0g-9PI"/>
+                        <constraint firstAttribute="height" constant="9" id="PCq-NQ-7qy"/>
+                    </constraints>
+                </imageView>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="v1c-8g-Voz" userLabel="View-cell">
+                    <rect key="frame" x="15" y="77" width="384" height="40"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="培训时长" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NdJ-tv-UdD">
+                            <rect key="frame" x="15" y="0.0" width="90" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="90" id="Iak-Hv-2Lc"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xlR-BZ-V0w">
+                            <rect key="frame" x="120" y="0.0" width="249" height="40"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666669999999" green="0.20000000000000001" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="40" id="1cR-pE-oew"/>
+                        <constraint firstItem="xlR-BZ-V0w" firstAttribute="leading" secondItem="NdJ-tv-UdD" secondAttribute="trailing" constant="15" id="3Fs-To-8rC"/>
+                        <constraint firstAttribute="bottom" secondItem="xlR-BZ-V0w" secondAttribute="bottom" id="8yD-fx-JGI"/>
+                        <constraint firstAttribute="bottom" secondItem="NdJ-tv-UdD" secondAttribute="bottom" id="UNd-Pp-fzq"/>
+                        <constraint firstItem="xlR-BZ-V0w" firstAttribute="top" secondItem="v1c-8g-Voz" secondAttribute="top" id="dUP-RE-XFo"/>
+                        <constraint firstAttribute="trailing" secondItem="xlR-BZ-V0w" secondAttribute="trailing" constant="15" id="e18-sO-z5A"/>
+                        <constraint firstItem="NdJ-tv-UdD" firstAttribute="leading" secondItem="v1c-8g-Voz" secondAttribute="leading" constant="15" id="lly-TN-3KY"/>
+                        <constraint firstItem="NdJ-tv-UdD" firstAttribute="top" secondItem="v1c-8g-Voz" secondAttribute="top" id="zh2-nz-yGa"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6zz-CY-b9P" userLabel="View-cell">
+                    <rect key="frame" x="15" y="122" width="384" height="40"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="培训里程" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YBb-cg-DaT">
+                            <rect key="frame" x="15" y="0.0" width="90" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="90" id="CdE-Ba-QZo"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="b6x-El-IrZ">
+                            <rect key="frame" x="120" y="0.0" width="249" height="40"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666669999999" green="0.20000000000000001" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstItem="b6x-El-IrZ" firstAttribute="top" secondItem="6zz-CY-b9P" secondAttribute="top" id="OB3-4r-0zs"/>
+                        <constraint firstAttribute="bottom" secondItem="YBb-cg-DaT" secondAttribute="bottom" id="QQX-tj-Cl0"/>
+                        <constraint firstItem="b6x-El-IrZ" firstAttribute="leading" secondItem="YBb-cg-DaT" secondAttribute="trailing" constant="15" id="aAP-Fe-m2w"/>
+                        <constraint firstAttribute="height" constant="40" id="gif-Of-tFM"/>
+                        <constraint firstItem="YBb-cg-DaT" firstAttribute="top" secondItem="6zz-CY-b9P" secondAttribute="top" id="i8O-oO-hGO"/>
+                        <constraint firstAttribute="trailing" secondItem="b6x-El-IrZ" secondAttribute="trailing" constant="15" id="jsw-y2-I1c"/>
+                        <constraint firstAttribute="bottom" secondItem="b6x-El-IrZ" secondAttribute="bottom" id="ud0-BW-jXc"/>
+                        <constraint firstItem="YBb-cg-DaT" firstAttribute="leading" secondItem="6zz-CY-b9P" secondAttribute="leading" constant="15" id="vQJ-Ob-cbB"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UHn-9D-ufG" userLabel="View-cell">
+                    <rect key="frame" x="15" y="167" width="384" height="40"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="学时类型" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Z6k-0r-gNk">
+                            <rect key="frame" x="15" y="0.0" width="90" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="90" id="7z3-2e-ED1"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QSe-Tl-KaZ">
+                            <rect key="frame" x="120" y="0.0" width="249" height="40"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666669999999" green="0.20000000000000001" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstItem="QSe-Tl-KaZ" firstAttribute="leading" secondItem="Z6k-0r-gNk" secondAttribute="trailing" constant="15" id="1XN-ZD-QhT"/>
+                        <constraint firstAttribute="bottom" secondItem="Z6k-0r-gNk" secondAttribute="bottom" id="4Lg-10-GdR"/>
+                        <constraint firstAttribute="bottom" secondItem="QSe-Tl-KaZ" secondAttribute="bottom" id="FqL-sS-Rqx"/>
+                        <constraint firstAttribute="trailing" secondItem="QSe-Tl-KaZ" secondAttribute="trailing" constant="15" id="T8c-ML-ffT"/>
+                        <constraint firstItem="Z6k-0r-gNk" firstAttribute="top" secondItem="UHn-9D-ufG" secondAttribute="top" id="bCW-zI-RO7"/>
+                        <constraint firstAttribute="height" constant="40" id="upi-5p-IB4"/>
+                        <constraint firstItem="QSe-Tl-KaZ" firstAttribute="top" secondItem="UHn-9D-ufG" secondAttribute="top" id="yzm-KI-Pva"/>
+                        <constraint firstItem="Z6k-0r-gNk" firstAttribute="leading" secondItem="UHn-9D-ufG" secondAttribute="leading" constant="15" id="z4e-z8-V6N"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Oeb-AO-wWP" userLabel="View-cell">
+                    <rect key="frame" x="15" y="212" width="384" height="40"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="培训车辆" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3Vv-PJ-a7e">
+                            <rect key="frame" x="15" y="0.0" width="90" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="90" id="8mq-MH-FE8"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="d6s-u5-I5K">
+                            <rect key="frame" x="120" y="0.0" width="249" height="40"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666669999999" green="0.20000000000000001" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstItem="d6s-u5-I5K" firstAttribute="top" secondItem="Oeb-AO-wWP" secondAttribute="top" id="2Ks-z2-X3p"/>
+                        <constraint firstAttribute="trailing" secondItem="d6s-u5-I5K" secondAttribute="trailing" constant="15" id="DDn-bZ-9xa"/>
+                        <constraint firstItem="3Vv-PJ-a7e" firstAttribute="leading" secondItem="Oeb-AO-wWP" secondAttribute="leading" constant="15" id="TcO-Uo-xYj"/>
+                        <constraint firstAttribute="bottom" secondItem="3Vv-PJ-a7e" secondAttribute="bottom" id="YPR-kN-vFx"/>
+                        <constraint firstAttribute="bottom" secondItem="d6s-u5-I5K" secondAttribute="bottom" id="ieW-oo-keM"/>
+                        <constraint firstItem="d6s-u5-I5K" firstAttribute="leading" secondItem="3Vv-PJ-a7e" secondAttribute="trailing" constant="15" id="rw5-Uj-F9J"/>
+                        <constraint firstAttribute="height" constant="40" id="tBE-EN-7HM"/>
+                        <constraint firstItem="3Vv-PJ-a7e" firstAttribute="top" secondItem="Oeb-AO-wWP" secondAttribute="top" id="tNd-CL-sHJ"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="v99-Ck-iAO" userLabel="View-cell">
+                    <rect key="frame" x="15" y="257" width="384" height="40"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="备案状态" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5Wh-Jl-me2">
+                            <rect key="frame" x="15" y="0.0" width="90" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="90" id="qhH-k5-q6v"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="882-CW-I0n">
+                            <rect key="frame" x="120" y="0.0" width="249" height="40"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.20784313725490194" green="0.74901960784313726" blue="0.36862745098039218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666669999999" green="0.20000000000000001" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstItem="882-CW-I0n" firstAttribute="leading" secondItem="5Wh-Jl-me2" secondAttribute="trailing" constant="15" id="0mo-gU-oPG"/>
+                        <constraint firstAttribute="height" constant="40" id="ATu-a5-Hei"/>
+                        <constraint firstAttribute="bottom" secondItem="882-CW-I0n" secondAttribute="bottom" id="N7p-Kg-TcK"/>
+                        <constraint firstAttribute="bottom" secondItem="5Wh-Jl-me2" secondAttribute="bottom" id="fau-Jn-heP"/>
+                        <constraint firstItem="5Wh-Jl-me2" firstAttribute="top" secondItem="v99-Ck-iAO" secondAttribute="top" id="hPw-Ot-jDP"/>
+                        <constraint firstItem="882-CW-I0n" firstAttribute="top" secondItem="v99-Ck-iAO" secondAttribute="top" id="qNh-3Y-Iii"/>
+                        <constraint firstAttribute="trailing" secondItem="882-CW-I0n" secondAttribute="trailing" constant="15" id="u0m-5N-Oee"/>
+                        <constraint firstItem="5Wh-Jl-me2" firstAttribute="leading" secondItem="v99-Ck-iAO" secondAttribute="leading" constant="15" id="xiF-qY-rTi"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5Kc-xn-0HH" userLabel="View-cell">
+                    <rect key="frame" x="15" y="302" width="384" height="40"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="监管审核" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="n2W-fU-UgD">
+                            <rect key="frame" x="15" y="0.0" width="90" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="90" id="wrN-ZD-BHy"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sVK-HJ-lST">
+                            <rect key="frame" x="120" y="0.0" width="249" height="40"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.20784313725490194" green="0.74901960784313726" blue="0.36862745098039218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666669999999" green="0.20000000000000001" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstItem="n2W-fU-UgD" firstAttribute="leading" secondItem="5Kc-xn-0HH" secondAttribute="leading" constant="15" id="1fl-NN-kni"/>
+                        <constraint firstAttribute="bottom" secondItem="sVK-HJ-lST" secondAttribute="bottom" id="Fez-we-bnh"/>
+                        <constraint firstAttribute="height" constant="40" id="N1H-mJ-h4U"/>
+                        <constraint firstAttribute="bottom" secondItem="n2W-fU-UgD" secondAttribute="bottom" id="Nf9-lm-0Ub"/>
+                        <constraint firstItem="sVK-HJ-lST" firstAttribute="leading" secondItem="n2W-fU-UgD" secondAttribute="trailing" constant="15" id="bZz-f2-mGE"/>
+                        <constraint firstItem="n2W-fU-UgD" firstAttribute="top" secondItem="5Kc-xn-0HH" secondAttribute="top" id="hOn-34-1Xw"/>
+                        <constraint firstAttribute="trailing" secondItem="sVK-HJ-lST" secondAttribute="trailing" constant="15" id="lUh-Gv-t2d"/>
+                        <constraint firstItem="sVK-HJ-lST" firstAttribute="top" secondItem="5Kc-xn-0HH" secondAttribute="top" id="xry-bJ-GZH"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="50h-s3-FxI" userLabel="View-cell">
+                    <rect key="frame" x="15" y="347" width="384" height="40"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="监管复核结果" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IGz-DC-s9Q">
+                            <rect key="frame" x="15" y="0.0" width="90" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="90" id="1oa-vk-cwp"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="果冻" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YVT-Qv-O4p">
+                            <rect key="frame" x="120" y="0.0" width="249" height="40"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.83137254900000002" green="0.86666666670000003" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" red="0.066666666669999999" green="0.20000000000000001" blue="0.3411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="40" id="9Fv-sj-g4G"/>
+                        <constraint firstItem="IGz-DC-s9Q" firstAttribute="top" secondItem="50h-s3-FxI" secondAttribute="top" id="Tve-q4-GWC"/>
+                        <constraint firstAttribute="trailing" secondItem="YVT-Qv-O4p" secondAttribute="trailing" constant="15" id="dU9-yH-ZcJ"/>
+                        <constraint firstItem="IGz-DC-s9Q" firstAttribute="leading" secondItem="50h-s3-FxI" secondAttribute="leading" constant="15" id="hZO-Yq-4Tj"/>
+                        <constraint firstItem="YVT-Qv-O4p" firstAttribute="top" secondItem="50h-s3-FxI" secondAttribute="top" id="koo-JD-I1G"/>
+                        <constraint firstAttribute="bottom" secondItem="IGz-DC-s9Q" secondAttribute="bottom" id="mko-3C-Wa4"/>
+                        <constraint firstItem="YVT-Qv-O4p" firstAttribute="leading" secondItem="IGz-DC-s9Q" secondAttribute="trailing" constant="15" id="x1f-4y-kyG"/>
+                        <constraint firstAttribute="bottom" secondItem="YVT-Qv-O4p" secondAttribute="bottom" id="xyb-X7-60D"/>
+                    </constraints>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rrg-ux-rHK">
+                    <rect key="frame" x="15" y="402" width="73" height="36"/>
+                    <color key="backgroundColor" red="0.20784313725490194" green="0.74901960784313726" blue="0.36862745098039218" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="73" id="6uJ-8t-wRf"/>
+                        <constraint firstAttribute="height" constant="36" id="F4t-mf-czY"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                    <inset key="titleEdgeInsets" minX="8" minY="0.0" maxX="0.0" maxY="0.0"/>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <state key="normal" title="照片" image="stu_photo"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="3"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="estuLogPhotoAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="196-W9-F3v"/>
+                    </connections>
+                </button>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" red="0.043137254901960784" green="0.16862745098039217" blue="0.30196078431372547" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+            <constraints>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="50h-s3-FxI" secondAttribute="trailing" constant="15" id="0Lj-GF-yqK"/>
+                <constraint firstItem="Oeb-AO-wWP" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="1pF-ya-Fia"/>
+                <constraint firstItem="6zz-CY-b9P" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="2BL-zh-9UM"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="UHn-9D-ufG" secondAttribute="trailing" constant="15" id="Bey-dq-Gw1"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="5Kc-xn-0HH" secondAttribute="trailing" constant="15" id="G9l-N5-qSA"/>
+                <constraint firstItem="Oeb-AO-wWP" firstAttribute="top" secondItem="UHn-9D-ufG" secondAttribute="bottom" constant="5" id="HBn-YU-PXD"/>
+                <constraint firstItem="5Kc-xn-0HH" firstAttribute="top" secondItem="v99-Ck-iAO" secondAttribute="bottom" constant="5" id="I5J-nw-vEt"/>
+                <constraint firstItem="Ynt-at-eQ0" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="5" id="IcX-4N-ZAc"/>
+                <constraint firstItem="v1c-8g-Voz" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="KDC-eh-F4W"/>
+                <constraint firstItem="UHn-9D-ufG" firstAttribute="top" secondItem="6zz-CY-b9P" secondAttribute="bottom" constant="5" id="NAt-wY-mlI"/>
+                <constraint firstItem="rrg-ux-rHK" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="QzN-JW-cjq"/>
+                <constraint firstItem="v1c-8g-Voz" firstAttribute="top" secondItem="Ynt-at-eQ0" secondAttribute="bottom" constant="10" id="RYh-6O-mWs"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="Ynt-at-eQ0" secondAttribute="trailing" id="TkJ-Gz-DiE"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="ToO-wy-ONc" secondAttribute="bottom" constant="8" id="Ww0-59-Zab"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="Oeb-AO-wWP" secondAttribute="trailing" constant="15" id="dmT-rm-3fg"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="v99-Ck-iAO" secondAttribute="trailing" constant="15" id="fOd-jE-RSS"/>
+                <constraint firstItem="v99-Ck-iAO" firstAttribute="top" secondItem="Oeb-AO-wWP" secondAttribute="bottom" constant="5" id="gFn-US-f0r"/>
+                <constraint firstItem="rrg-ux-rHK" firstAttribute="top" secondItem="50h-s3-FxI" secondAttribute="bottom" constant="15" id="hfR-ot-L2F"/>
+                <constraint firstItem="ToO-wy-ONc" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="kXy-F1-lGf"/>
+                <constraint firstItem="5Kc-xn-0HH" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="nne-cM-Hpf"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="v1c-8g-Voz" secondAttribute="trailing" constant="15" id="oTR-x9-piK"/>
+                <constraint firstItem="50h-s3-FxI" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="omN-er-JLW"/>
+                <constraint firstItem="6zz-CY-b9P" firstAttribute="top" secondItem="v1c-8g-Voz" secondAttribute="bottom" constant="5" id="ph1-Yk-Nj0"/>
+                <constraint firstItem="v99-Ck-iAO" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="rbv-6d-nwC"/>
+                <constraint firstItem="50h-s3-FxI" firstAttribute="top" secondItem="5Kc-xn-0HH" secondAttribute="bottom" constant="5" id="rtM-eM-IkS"/>
+                <constraint firstItem="Ynt-at-eQ0" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="tEc-ga-J0X"/>
+                <constraint firstItem="UHn-9D-ufG" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="15" id="tf2-d5-JSD"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="6zz-CY-b9P" secondAttribute="trailing" constant="15" id="x9V-QS-ffV"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <point key="canvasLocation" x="102.89855072463769" y="-12.635869565217392"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="arrow_down" width="17" height="9.3333330154418945"/>
+        <image name="stu_photo" width="21.666666030883789" height="18"/>
+    </resources>
+</document>

+ 161 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogPhotoCell.swift

@@ -0,0 +1,161 @@
+//
+//  EstuLogPhotoCell.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/30.
+//
+
+import UIKit
+
+import ReactorKit
+import RxSwift
+
+final class EstuLogPhotoCell: BaseCollectionViewCell,View {
+ 
+    let coverImageView = UIImageView().then{
+        $0.contentMode = .scaleToFill
+    }
+    
+    let timeLabel = UILabel().then{
+        $0.textColor = UIColor.db_fontSelColor
+        $0.font = NYFont.SysFont.sys_15
+        $0.text = " 2023-08-24 13:18:07"
+        $0.textAlignment = .center
+    }
+    
+    let titleLabel = UILabel().then{
+        $0.textColor = UIColor.db_fontSelColor
+        $0.font = NYFont.SysFont.sys_15
+        $0.text = "签退照片"
+        $0.textAlignment = .center
+    }
+    
+    
+    override func initialize() {
+        
+        let backgroundView = UIView()
+        backgroundView.backgroundColor = UIColor("#0B2B4D")
+        self.backgroundColor = UIColor("#0B2B4D")
+        selectedBackgroundView = backgroundView
+        
+        coverImageView.image = UIImage(named: "矩形B")
+        contentView.addSubview(coverImageView)
+        contentView.addSubview(timeLabel)
+        contentView.addSubview(titleLabel)
+        
+    }
+    
+    func bind(reactor: EstuLogPhotoCellReactor) {
+
+//        reactor.state.map{$0.coverURL}
+//            .bind(to: coverImageView.rx.image(placeholder: .placeholderImage(bgSize:placeholderSize)))
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.title}
+//            .distinctUntilChanged()
+//            .bind(to: titleLabel.rx.text)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.badge}
+//            .filterNil()
+//            .distinctUntilChanged()
+//            .bind(to: badgeButton.rx.title(for: .normal))
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.latestUpdate}
+//            .distinctUntilChanged()
+//            .bind(to: latestUpdateLabel.rx.text)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.tagDesc}
+//            .filterNil()
+//            .distinctUntilChanged()
+//            .bind(to: tagLabel.rx.text)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.latestUpdateColor}
+//            .distinctUntilChanged()
+//            .bind(to: latestUpdateLabel.rx.textColor)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.badge == nil}
+//            .distinctUntilChanged()
+//            .bind(to: badgeButton.rx.isHidden)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.tagDesc == nil}
+//            .distinctUntilChanged()
+//            .bind(to: tagLabel.rx.isHidden)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{!$0.isRcmd}
+//            .distinctUntilChanged()
+//            .bind(to: dramaButton.rx.isHidden)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.isHiddenLine}
+//            .distinctUntilChanged()
+//            .bind(to: bottomLine.rx.isHidden)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.favourites}
+//            .filterNil()
+//            .distinctUntilChanged()
+//            .bind(to: favouriteLabel.rx.text)
+//            .disposed(by: disposeBag)
+//
+//        reactor.state.map{$0.watchProgress}
+//            .filterNil()
+//            .distinctUntilChanged()
+//            .bind(to: favouriteLabel.rx.text)
+//            .disposed(by: disposeBag)
+//
+//
+//        dramaButton.rx.tap.subscribe(onNext: {[unowned self] (_) in
+//
+//            self.dramaButton.isSelected = !self.dramaButton.isSelected
+//            self.dramaButton.backgroundColor = self.dramaButton.isSelected ? UIColor.db_darkGray : UIColor.db_pink
+//            guard let season_id = reactor.currentState.season_id,
+//                  let season_type = reactor.currentState.season_type
+//            else { return }
+//
+//            if self.dramaButton.isSelected {
+//                reactor.action.onNext(.follow(season_id: season_id, season_type: season_type))
+//            }else{
+//                reactor.action.onNext(.unFollow(season_id: season_id, season_type: season_type))
+//            }
+//        }).disposed(by: disposeBag)
+//
+    }
+    
+    class func cellSize(reactor:EstuLogPhotoCellReactor) -> CGSize {
+    
+//        var cellHeight = reactor.currentState.isRcmd ? Metric.coverRcmdHeight : Metric.coverDramaHeight
+//        cellHeight += 2 * kCollectionItemPadding
+//
+        return CGSize(width: NYFitReal.screenWidth*0.5, height: 172.0)
+    }
+    
+
+    override func layoutSubviews() {
+        super.layoutSubviews()
+        
+        coverImageView.snp.makeConstraints { (make) in
+            make.left.equalTo(kCollectionItemPadding)
+            make.top.equalTo(10)
+            make.right.equalTo(-kCollectionItemPadding)
+            make.height.equalTo(112)
+        }
+        timeLabel.snp.makeConstraints { (make) in
+            make.left.right.equalToSuperview()
+            make.top.equalTo(coverImageView.snp.bottom).offset(10)
+            make.height.equalTo(20)
+        }
+        titleLabel.snp.makeConstraints { (make) in
+            make.left.right.equalToSuperview()
+            make.top.equalTo(timeLabel.snp.bottom)
+            make.height.equalTo(20)
+        }
+        
+    }
+}

+ 99 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogPhotoCellReactor.swift

@@ -0,0 +1,99 @@
+//
+//  EstuLogPhotoCellReactor.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/30.
+//
+
+import ReactorKit
+
+import RxSwift
+
+final class EstuLogPhotoCellReactor: Reactor {
+
+    enum Action {
+        case follow(season_id:String, season_type:String)
+        case unFollow(season_id:String, season_type:String)
+    }
+    
+    struct State {
+//        var coverURL: URL?
+        var favourites: String?
+        var title: String
+    }
+    
+    let initialState: State
+    
+//    private let service: HomeServiceType
+    
+    init(recommend: AnyObject, service: AnyObject) {
+        
+//        self.service = service
+//
+//        let coverURL = URL(string: recommend.cover)
+//        let favourites = "\(recommend.favorites ?? "")人追番"
+//        let latestUpdate = "更新至第\(recommend.newest_ep_index)话"
+//        var tagDesc: String = ""
+//        if let tags = recommend.tags {
+//            for tag in tags {
+//               tagDesc += ",\(tag.tag_name)"
+//            }
+//        }
+//
+//        if !tagDesc.isEmpty {
+//            tagDesc.remove(at: String.Index(utf16Offset: 0, in: tagDesc))
+//        }
+        self.initialState = State(
+//            coverURL: "",
+                                  favourites: "favourites",
+                                  title: "recommend.title"
+                                  )
+        _ = self.state
+    }
+    
+//    init(like: DramaLikeModel, service: HomeServiceType, isLast:Bool) {
+//
+//        self.service = service
+//
+//        let coverURL = URL(string: like.cover)
+//        let latestUpdate = "更新至第\(like.newest_ep_index)话"
+//        var watchProgress: String?
+//        if like.user_season.last_ep_index.isEmpty {
+//            watchProgress = "尚未观看"
+//        }else{
+//            if let num = Int(like.user_season.last_ep_index) {
+//                watchProgress = "看到第\(num)话"
+//            }else{
+//                watchProgress = "看到\(like.user_season.last_ep_index)"
+//            }
+//        }
+//
+//        self.initialState = State(coverURL: coverURL,
+//                                  favourites: nil,
+//                                  badge: like.badge,
+//                                  title: like.title,
+//                                  latestUpdate: latestUpdate,
+//                                  latestUpdateColor:UIColor.db_darkGray,
+//                                  watchProgress:watchProgress,
+//                                  tagDesc: nil,
+//                                  season_id:nil,
+//                                  season_type:nil,
+//                                  isRcmd:false,
+//                                  isHiddenLine: isLast)
+//        _ = self.state
+//    }
+//    //只需调用接口,其他不用处理
+//    func mutate(action: Action) -> Observable<Void> {
+//        switch action {
+//        case .follow(let season_id, let season_type):
+//
+//            BilibiliToaster.show("由于接口加密,所以需要看到类似B站的效果必须用自己手机抓包,将请求参数替换")
+//
+//           _ = service.dramaFollow(season_id: season_id, season_type: season_type).asObservable().subscribe()
+//            return .empty()
+//        case .unFollow(let season_id, let season_type):
+//           _ = service.dramaUnFollow(season_id: season_id, season_type: season_type).subscribe()
+//            return .empty()
+//        }
+//    }
+}

+ 70 - 0
JiaPeiManage/Sources/Modulars/学员/Views/EstuLog/EstuLogPhotoHeaderView.swift

@@ -0,0 +1,70 @@
+//
+//  EstuLogPhotoHeaderView.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/30.
+//
+
+import UIKit
+
+
+final class EstuLogPhotoHeaderView: UICollectionReusableView {
+    
+    let estuLogHeaderView = EstuLogHeaderView.loadFromNib().then {
+        $0.total_label.text = "查看照片"
+    }
+    let bottom_view = UIView().then {
+        $0.backgroundColor = UIColor("#0B2B4D")
+    }
+    let bottom_title_label = UILabel().then {
+        $0.font = NYFont.SysFont.sys_15
+        $0.text = "点击图片可查看大图"
+        $0.textColor = UIColor("#D4DDE6")
+        $0.textAlignment = .center
+    }
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        
+        self.backgroundColor = UIColor.db_theme
+        bottom_view.addSubview(bottom_title_label)
+        addSubview(estuLogHeaderView)
+        addSubview(bottom_view)
+//        mineDramaView.rx.tapGesture()
+//            .when(.recognized)
+//            .subscribe(onNext: { (_) in
+//
+//             if LocalManager.userInfo.isLogin {
+//                let context: [AnyHashable: Any] = ["isRcmd":true]
+//                BilibiliRouter.push(.drama_recommend,context:context)
+//             }else{
+//                BilibiliRouter.open(BilibiliOpenType.login.rawValue)
+//             }
+//         })
+//            .disposed(by: rx.disposeBag)
+        
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    override func layoutSubviews() {
+        super.layoutSubviews()
+        
+        estuLogHeaderView.snp.makeConstraints { (make) in
+            make.top.left.right.equalToSuperview()
+            make.height.equalTo(59)
+        }
+        bottom_view.snp.makeConstraints { (make) in
+            make.top.equalTo(estuLogHeaderView.snp.bottom)
+            make.left.right.equalToSuperview()
+            make.height.equalTo(40)
+        }
+        bottom_title_label.snp.makeConstraints { (make) in
+            make.top.equalTo(bottom_view.snp.top).offset(18)
+            make.bottom.left.right.equalToSuperview()
+        }
+    }
+    
+}

+ 10 - 1
JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeDetails01HeaderView.swift

@@ -10,10 +10,19 @@ final class MeTraineeDetails01HeaderView: UIView,NibLoadable {
     
     @IBOutlet weak var title_label: UILabel!
     
+    @IBOutlet weak var estu_log_button: QMUIButton!
+    
     override func awakeFromNib() {
         super.awakeFromNib()
         
-        
+        estu_log_button.spacingBetweenImageAndTitle = 5.f
+        estu_log_button.isHidden = true
+    }
+    
+    
+    //电子教学日志
+    @IBAction func estuLogAction(_ sender: QMUIButton) {
+        NYSwRouter.push(NYSwPushType.trainee_estu_log.path)
     }
     
 }

+ 23 - 0
JiaPeiManage/Sources/Modulars/学员/Views/MeTraineeDetails01HeaderView.xib

@@ -30,11 +30,32 @@
                     <color key="textColor" red="0.83137254901960778" green="0.8666666666666667" blue="0.90196078431372551" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                     <nil key="highlightedColor"/>
                 </label>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="g0r-c0-hqi" customClass="QMUIButton">
+                    <rect key="frame" x="250" y="11" width="110" height="28"/>
+                    <color key="backgroundColor" red="0.20784313725490194" green="0.74901960784313726" blue="0.36862745098039218" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="28" id="DFd-um-1ab"/>
+                        <constraint firstAttribute="width" constant="110" id="eZF-AP-Ya2"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <state key="normal" title="电子教学日志" image="estu_log"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="5"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="estuLogAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="9cG-EY-pIe"/>
+                    </connections>
+                </button>
             </subviews>
             <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
             <color key="backgroundColor" red="0.043137254901960784" green="0.16862745098039217" blue="0.30196078431372547" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
             <constraints>
                 <constraint firstItem="aDe-FJ-gKH" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" constant="23" id="5Sr-tZ-max"/>
+                <constraint firstItem="g0r-c0-hqi" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="ABN-bq-5QJ"/>
+                <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="g0r-c0-hqi" secondAttribute="trailing" constant="15" id="JmP-XM-hZ4"/>
                 <constraint firstItem="yod-sM-rOs" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="35" id="M2X-GR-W6k"/>
                 <constraint firstItem="yod-sM-rOs" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" constant="22" id="oGT-v1-W9X"/>
                 <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="yod-sM-rOs" secondAttribute="trailing" constant="35" id="rNX-tY-5gG"/>
@@ -42,12 +63,14 @@
             </constraints>
             <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
             <connections>
+                <outlet property="estu_log_button" destination="g0r-c0-hqi" id="e7a-z0-eQh"/>
                 <outlet property="title_label" destination="yod-sM-rOs" id="bJ1-LU-KYM"/>
             </connections>
             <point key="canvasLocation" x="67.938931297709928" y="-12.67605633802817"/>
         </view>
     </objects>
     <resources>
+        <image name="estu_log" width="14.333333015441895" height="16"/>
         <image name="stu_block" width="6" height="18"/>
     </resources>
 </document>

+ 15 - 2
JiaPeiManage/Sources/Services/CoachAPI.swift

@@ -16,6 +16,8 @@ enum CoachAPI {
     case coachQrInfo(id:String ,city:String)
     //获取教练的学员
     case coachInfoList(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String )
+    //获取教练的学员-我的学员
+    case coachInfoMyList(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String )
     //获取教练的学员-针对搜索专用-全局
     case allStudentInfoList(city:String,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int)
     //预报名-我的学员-搜索
@@ -38,7 +40,7 @@ extension CoachAPI: TargetType {
     
     var baseURL: URL {
         switch self {
-        case .coachInfo,.coachQrInfo,.coachInfoList,.coachTempList,.studentInfoById,
+        case .coachInfo,.coachQrInfo,.coachInfoList,.coachInfoMyList,.coachTempList,.studentInfoById,
                 .stuScoreByOutId,.stuTmsSignListByStuId,.stuTmsLogFaceListByStuId,
                 .allStudentInfoList,.yallStudentInfoList,.yallSchoolStudentInfoList:
             return URL(string: HttpRequest.api.path)!
@@ -54,6 +56,8 @@ extension CoachAPI: TargetType {
             return "/jsjp-admin/open-api/tms/coachInfo/getCoachQrInfo"
         case .coachInfoList(_,_,_,_,_,_,_,_):
             return "/jsjp-admin/open-api/tms/coachInfo/list"
+        case .coachInfoMyList(_,_,_,_,_,_,_,_):
+            return "/jsjp-admin/open-api/tms/coachInfo/myList"
         case .allStudentInfoList(_, _, _, _, _, _):
             return "/jsjp-admin/open-api/tms/coachInfo/allStudentInfoList"
         case .yallStudentInfoList(_, _, _, _, _, _):
@@ -91,7 +95,7 @@ extension CoachAPI: TargetType {
     
     var task: Moya.Task {
         switch self {
-        case .coachInfo(_,_),.coachQrInfo(_,_),.coachInfoList(_,_,_,_,_,_,_,_),.coachTempList(_,_,_,_,_,_,_,_),.studentInfoById(_,_)
+        case .coachInfo(_,_),.coachQrInfo(_,_),.coachInfoList(_,_,_,_,_,_,_,_),.coachInfoMyList(_,_,_,_,_,_,_,_),.coachTempList(_,_,_,_,_,_,_,_),.studentInfoById(_,_)
             ,.stuScoreByOutId(_,_,_),.stuTmsSignListByStuId(_,_,_,_),.stuTmsLogFaceListByStuId(_,_,_,_),
                 .allStudentInfoList(_, _, _, _, _, _),.yallStudentInfoList(_, _, _, _, _, _),.yallSchoolStudentInfoList(_, _, _, _, _, _):
             if let parameters = parameters {
@@ -123,6 +127,15 @@ extension CoachAPI: TargetType {
                     "pageSize": pageSize,
                     "schoolId": schoolId==0 ?"":"\(schoolId)",
                     "state": state,]
+        case let .coachInfoMyList(city,appCoachId ,coachId ,field ,pageNum ,pageSize ,schoolId ,state):
+            return ["city": city,
+                    "appCoachId": appCoachId,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "schoolId": schoolId==0 ?"":"\(schoolId)",
+                    "state": state,]
         case let .coachInfoList(city,appCoachId ,coachId ,field ,pageNum ,pageSize ,schoolId ,state):
             return ["city": city,
                     "appCoachId": appCoachId,

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

@@ -16,6 +16,8 @@ protocol CoachServiceType {
     func coachQrInfoRequest(id:String ,city:String) -> Single<CoachJsonInfo>
     //获取我的学员信息list
     func coachInfoListRequest(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String) -> Single<TraineeDataModel>
+    func coachInfoMyListRequest(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String) -> Single<TraineeDataModel>
+    
     //获取全局学员信息list
     func allStudentInfoListRequest(city:String,coachId:String,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ) -> Single<TraineeDataModel>
     //预报名-我的学员-搜索
@@ -59,6 +61,11 @@ final class CoachService: CoachServiceType {
         return networking.request(api).map(TraineeDataModel.self,isModel: true)
     }
     
+    func coachInfoMyListRequest(city: String, appCoachId: String, coachId: String, field: String, pageNum: Int, pageSize: Int, schoolId: Int, state: String) -> RxSwift.Single<TraineeDataModel> {
+        let api = CoachAPI.coachInfoMyList(city: city, appCoachId: appCoachId, coachId: coachId, field: field, pageNum: pageNum, pageSize: pageSize, schoolId: schoolId, state: state)
+        return networking.request(api).map(TraineeDataModel.self,isModel: true)
+    }
+    
     func allStudentInfoListRequest(city: String,coachId:String, field: String, pageNum: Int, pageSize: Int, schoolId: Int) -> RxSwift.Single<TraineeDataModel> {
         let api = CoachAPI.allStudentInfoList(city: city, coachId: coachId , field: field, pageNum: pageNum, pageSize: pageSize, schoolId: schoolId)
         return networking.request(api).map(TraineeDataModel.self,isModel: true)

+ 192 - 0
JiaPeiManage/Sources/Services/ElogCoachAPI.swift

@@ -0,0 +1,192 @@
+//
+//  ElogCoachAPI.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/30.
+//
+
+import Moya
+import SwiftyUserDefaults
+
+enum ElogCoachAPI {
+    
+    //获取教练信息
+    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 )
+    //获取教练的学员-我的学员
+    case coachInfoMyList(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String )
+    //获取教练的学员-针对搜索专用-全局
+    case allStudentInfoList(city:String,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int)
+    //预报名-我的学员-搜索
+    case yallStudentInfoList(city:String,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int)
+    //预报名-在校学员-搜索
+    case yallSchoolStudentInfoList(city:String,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int)
+    //获取教练预报名的学员
+    case coachTempList(city:String,appCoachId:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int ,state:String )
+    //通过id获取学员详细
+    case studentInfoById(city:String,id:Int )
+    //查询成绩
+    case stuScoreByOutId(pageNum:Int ,pageSize:Int ,stuOutId:Int)
+    //查询签到记录
+    case stuTmsSignListByStuId(pageNum:Int ,pageSize:Int ,stuOutId:Int,city:String)
+    //查询人脸比对记录
+    case stuTmsLogFaceListByStuId(pageNum:Int ,pageSize:Int ,stuOutId:Int,city:String)
+}
+
+extension ElogCoachAPI: TargetType {
+    
+    var baseURL: URL {
+        switch self {
+        case .coachInfo,.coachQrInfo,.coachInfoList,.coachInfoMyList,.coachTempList,.studentInfoById,
+                .stuScoreByOutId,.stuTmsSignListByStuId,.stuTmsLogFaceListByStuId,
+                .allStudentInfoList,.yallStudentInfoList,.yallSchoolStudentInfoList:
+            return URL(string: HttpRequest.api.path)!
+        }
+    }
+    
+    var path: String {
+//    city:String ,coachId:String ,field:String ,pageNum:Int ,pageSize:Int ,schoolId:Int
+        switch self {
+        case .coachInfo(_,_):
+            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"
+        case .coachInfoMyList(_,_,_,_,_,_,_,_):
+            return "/jsjp-admin/open-api/tms/coachInfo/myList"
+        case .allStudentInfoList(_, _, _, _, _, _):
+            return "/jsjp-admin/open-api/tms/coachInfo/allStudentInfoList"
+        case .yallStudentInfoList(_, _, _, _, _, _):
+            return "/jsjp-admin/open-api/tms/coachInfo/allStudentInfoList"
+        case .yallSchoolStudentInfoList(_, _, _, _, _, _):
+            return "/jsjp-admin/open-api/tms/coachInfo/allSchoolStudentInfoList"
+        case .coachTempList(_,_,_,_,_,_,_,_):
+            return "/jsjp-admin/open-api/tms/coachInfo/studenTempList"
+        case .studentInfoById(_,_):
+            return "/jsjp-admin/open-api/tms/coachInfo/getTmsStudentInfoById"
+        case .stuScoreByOutId(_,_,_):
+            return "/jsjp-admin/open-api/gzpt/userInfo/getUserScoreByOutId"
+        case .stuTmsSignListByStuId(_,_,_,_):
+            return "/jsjp-admin/open-api/tms/coachInfo/getTmsSignListByStuId"
+        case .stuTmsLogFaceListByStuId(_,_,_,_):
+            return "/jsjp-admin/open-api/tms/coachInfo/getTmsLogFaceListByStuId"
+            
+        }
+        
+    }
+    
+    var method: Moya.Method {
+        switch self {
+        case .coachInfo,.coachQrInfo,.coachInfoList,.coachTempList,
+                .studentInfoById,.stuScoreByOutId,.stuTmsLogFaceListByStuId:
+            return .get
+        default:
+            return .get
+        }
+    }
+    
+    var sampleData: Data {
+        return Data()
+    }
+    
+    var task: Moya.Task {
+        switch self {
+        case .coachInfo(_,_),.coachQrInfo(_,_),.coachInfoList(_,_,_,_,_,_,_,_),.coachInfoMyList(_,_,_,_,_,_,_,_),.coachTempList(_,_,_,_,_,_,_,_),.studentInfoById(_,_)
+            ,.stuScoreByOutId(_,_,_),.stuTmsSignListByStuId(_,_,_,_),.stuTmsLogFaceListByStuId(_,_,_,_),
+                .allStudentInfoList(_, _, _, _, _, _),.yallStudentInfoList(_, _, _, _, _, _),.yallSchoolStudentInfoList(_, _, _, _, _, _):
+            if let parameters = parameters {
+                return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
+            }
+            return .requestPlain
+        }
+    }
+    
+    var headers: [String: String]? {
+
+        return ["Content-Type":"application/json"]
+    }
+    
+    var parameters: [String : Any]? {
+        switch self {
+        case let .coachInfo(id,city):
+            return ["city": city,
+                    "id": id,]
+        case let .coachQrInfo(id,city):
+            return ["city": city,
+                    "id": id,]
+        case let .coachTempList(city,appCoachId ,coachId ,field ,pageNum ,pageSize ,schoolId ,state):
+            return ["city": city,
+                    "appCoachId": appCoachId,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "schoolId": schoolId==0 ?"":"\(schoolId)",
+                    "state": state,]
+        case let .coachInfoMyList(city,appCoachId ,coachId ,field ,pageNum ,pageSize ,schoolId ,state):
+            return ["city": city,
+                    "appCoachId": appCoachId,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "schoolId": schoolId==0 ?"":"\(schoolId)",
+                    "state": state,]
+        case let .coachInfoList(city,appCoachId ,coachId ,field ,pageNum ,pageSize ,schoolId ,state):
+            return ["city": city,
+                    "appCoachId": appCoachId,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "schoolId": schoolId==0 ?"":"\(schoolId)",
+                    "state": state,]
+        case let .allStudentInfoList(city, coachId, field, pageNum, pageSize, schoolId):
+            return ["city": city,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "schoolId": schoolId==0 ?"":"\(schoolId)"]
+        case let .yallStudentInfoList(city, coachId, field, pageNum, pageSize, schoolId):
+            return ["city": city,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "schoolId": schoolId==0 ?"":"\(schoolId)"]
+        case let .yallSchoolStudentInfoList(city, coachId, field, pageNum, pageSize, schoolId):
+            return ["city": city,
+                    "coachId": coachId,
+                    "field": field,
+                    "pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "schoolId": schoolId==0 ?"":"\(schoolId)"]
+        case let .studentInfoById(city,id):
+            return ["city": city,
+                    "id": id,]
+        case let .stuScoreByOutId(pageNum, pageSize, stuOutId):
+            return ["pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "stuOutId": stuOutId,]
+        case let .stuTmsSignListByStuId(pageNum, pageSize, stuOutId, city):
+            return ["pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "id": stuOutId,
+                    "city":city,]
+        case let .stuTmsLogFaceListByStuId(pageNum, pageSize, stuOutId, city):
+            return ["pageNum": pageNum,
+                    "pageSize": pageSize,
+                    "id": stuOutId,
+                    "city":city,]
+        default:
+            return nil
+        }
+    }
+    
+    
+}

+ 28 - 0
JiaPeiManage/Sources/Services/ElogCoachService.swift

@@ -0,0 +1,28 @@
+//
+//  ElogCoachService.swift
+//  JiaPeiManage
+//
+//  Created by Ning.ge on 2023/8/30.
+//
+
+import RxSwift
+import RxCocoa
+import SwiftyJSON
+
+protocol ElogCoachServiceType {
+   
+
+}
+
+final class ElogCoachService: ElogCoachServiceType {
+
+    
+    private let networking : CoachNetworking
+    
+    init(networking: CoachNetworking) {
+        self.networking = networking
+    }
+    
+    
+}
+

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

@@ -14,6 +14,8 @@ enum NYSwPushType {
     case trainee_search
     case trainee_list
     case trainee_list_biand
+    case trainee_estu_log
+    case trainee_estu_log_photo
     case mine_center
     case mine_uppassword
     case mine_switchaccount
@@ -43,6 +45,10 @@ extension NYSwPushType {
             return "JiaPeiManage://me/trainee/list"
         case .trainee_list_biand:
             return "JiaPeiManage://me/trainee/list/biand"
+        case .trainee_estu_log:
+            return "JiaPeiManage://me/trainee/estu/log"
+        case .trainee_estu_log_photo:
+            return "JiaPeiManage://me/trainee/estu/log/photo"
         case .trainee_search:
             return "JiaPeiManage://me/trainee/search"
         case .trainee_list_school:

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

@@ -68,6 +68,16 @@ final class URLNavigationMap {
             return meTraineeListViewController
         }
         
+        navigator.register(NYSwPushType.trainee_estu_log.path) { (url, values, context) -> UIViewController? in
+            let estuLogListViewController = EstuLogListViewController(type: .biandstu)
+            return estuLogListViewController
+        }
+        
+        navigator.register(NYSwPushType.trainee_estu_log_photo.path) { (url, values, context) -> UIViewController? in
+            let estuLogPhotoListViewController = EstuLogPhotoListViewController(type: .biandstu)
+            return estuLogPhotoListViewController
+        }
+        
         navigator.register(NYSwPushType.trainee_list_school.path) { (url, values, context) -> UIViewController? in
             if LocalManager.userInfo.cityPower == "1" && !LocalManager.isCheckAccount() {
                 let meTraineeListViewController = MeTraineeListViewController(type: .advancet)