Procházet zdrojové kódy

配置 URL 路由, 导航 , 科目1-4 结构布局 update 添加 login vc

openlockPPP před 1 rokem
rodič
revize
5fb20894f9
39 změnil soubory, kde provedl 2056 přidání a 1323 odebrání
  1. 52 8
      JSJP_Student_sw.xcodeproj/project.pbxproj
  2. 1 1
      JSJP_Student_sw.xcodeproj/xcuserdata/mimasigeling.xcuserdatad/xcschemes/xcschememanagement.plist
  3. 0 0
      JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/jsjp_img.imageset/Contents.json
  4. 0 0
      JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/jsjp_img.imageset/极速驾培.png
  5. 0 0
      JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/jsjp_img.imageset/极速驾培@2x.png
  6. 0 0
      JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/jsjp_img.imageset/极速驾培@3x.png
  7. 0 0
      JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/user_img.imageset/Contents.json
  8. 0 0
      JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/user_img.imageset/头像.png
  9. 0 0
      JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/user_img.imageset/头像@2x.png
  10. 0 0
      JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/user_img.imageset/头像@3x.png
  11. 2 0
      JSJP_Student_sw/JSJP-Brigding-Header.h
  12. 1 1
      JSJP_Student_sw/Sources/CompositionRoot.swift
  13. 1 0
      JSJP_Student_sw/Sources/Constants/NYFont.swift
  14. 6 0
      JSJP_Student_sw/Sources/Extensions/UIColor+Bilibili.swift
  15. 150 0
      JSJP_Student_sw/Sources/Main/BaseCollectionViewController.swift
  16. 2 0
      JSJP_Student_sw/Sources/Main/BaseViewController.swift
  17. 233 4
      JSJP_Student_sw/Sources/Modulars/Home/Controllers/HomeParentViewController.swift
  18. 11 0
      JSJP_Student_sw/Sources/Modulars/Home/Controllers/考试/Exam01_ParentViewController.swift
  19. 10 0
      JSJP_Student_sw/Sources/Modulars/Home/Controllers/考试/Exam02_ParentViewController.swift
  20. 10 0
      JSJP_Student_sw/Sources/Modulars/Home/Controllers/考试/Exam03_ParentViewController.swift
  21. 10 0
      JSJP_Student_sw/Sources/Modulars/Home/Controllers/考试/Exam04_ParentViewController.swift
  22. 27 1
      JSJP_Student_sw/Sources/Modulars/Home/Views/HomeNavBar.swift
  23. 105 6
      JSJP_Student_sw/Sources/Modulars/Home/Views/HomeNavBar.xib
  24. 33 0
      JSJP_Student_sw/Sources/Modulars/Login/Controllers/LoginStoryboard.storyboard
  25. 11 0
      JSJP_Student_sw/Sources/Modulars/Login/Controllers/LoginViewController.swift
  26. 2 1
      Podfile
  27. 5 1
      Podfile.lock
  28. 5 1
      Pods/Manifest.lock
  29. 1312 1297
      Pods/Pods.xcodeproj/project.pbxproj
  30. 7 0
      Pods/Pods.xcodeproj/xcuserdata/mimasigeling.xcuserdatad/xcschemes/xcschememanagement.plist
  31. 23 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-acknowledgements.markdown
  32. 29 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-acknowledgements.plist
  33. 1 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Debug-input-files.xcfilelist
  34. 1 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Debug-output-files.xcfilelist
  35. 1 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Release-input-files.xcfilelist
  36. 1 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Release-output-files.xcfilelist
  37. 2 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks.sh
  38. 1 1
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.debug.xcconfig
  39. 1 1
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.release.xcconfig

+ 52 - 8
JSJP_Student_sw.xcodeproj/project.pbxproj

@@ -8,6 +8,13 @@
 
 /* Begin PBXBuildFile section */
 		2281B61AEFC76AFFBF9C29DD /* Pods_JSJP_Student_sw.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C45679F20E7108A4E8C08D40 /* Pods_JSJP_Student_sw.framework */; };
+		908E44182A27225100DA2536 /* BaseCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908E44172A27225100DA2536 /* BaseCollectionViewController.swift */; };
+		908E441D2A2749E100DA2536 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908E441C2A2749E100DA2536 /* LoginViewController.swift */; };
+		908E441F2A274AAC00DA2536 /* Exam01_ParentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908E441E2A274AAC00DA2536 /* Exam01_ParentViewController.swift */; };
+		908E44212A274B2A00DA2536 /* Exam02_ParentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908E44202A274B2A00DA2536 /* Exam02_ParentViewController.swift */; };
+		908E44232A274B3700DA2536 /* Exam03_ParentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908E44222A274B3700DA2536 /* Exam03_ParentViewController.swift */; };
+		908E44252A274B4300DA2536 /* Exam04_ParentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908E44242A274B4300DA2536 /* Exam04_ParentViewController.swift */; };
+		908E44272A2753D000DA2536 /* LoginStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 908E44262A2753D000DA2536 /* LoginStoryboard.storyboard */; };
 		90A64B902A25A49500D8BED6 /* URLNavigationMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A64B8F2A25A49500D8BED6 /* URLNavigationMap.swift */; };
 		90A64B922A25A4DC00D8BED6 /* NYSwRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A64B912A25A4DC00D8BED6 /* NYSwRouter.swift */; };
 		90A64B972A25A57C00D8BED6 /* NYSwToaster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90A64B962A25A57C00D8BED6 /* NYSwToaster.swift */; };
@@ -115,6 +122,13 @@
 
 /* Begin PBXFileReference section */
 		0F56AF3A85733CC3ECD33CC5 /* Pods-JSJP_Student_sw.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSJP_Student_sw.debug.xcconfig"; path = "Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.debug.xcconfig"; sourceTree = "<group>"; };
+		908E44172A27225100DA2536 /* BaseCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseCollectionViewController.swift; sourceTree = "<group>"; };
+		908E441C2A2749E100DA2536 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = "<group>"; };
+		908E441E2A274AAC00DA2536 /* Exam01_ParentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Exam01_ParentViewController.swift; sourceTree = "<group>"; };
+		908E44202A274B2A00DA2536 /* Exam02_ParentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Exam02_ParentViewController.swift; sourceTree = "<group>"; };
+		908E44222A274B3700DA2536 /* Exam03_ParentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Exam03_ParentViewController.swift; sourceTree = "<group>"; };
+		908E44242A274B4300DA2536 /* Exam04_ParentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Exam04_ParentViewController.swift; sourceTree = "<group>"; };
+		908E44262A2753D000DA2536 /* LoginStoryboard.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LoginStoryboard.storyboard; sourceTree = "<group>"; };
 		90A64B8F2A25A49500D8BED6 /* URLNavigationMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLNavigationMap.swift; sourceTree = "<group>"; };
 		90A64B912A25A4DC00D8BED6 /* NYSwRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NYSwRouter.swift; sourceTree = "<group>"; };
 		90A64B962A25A57C00D8BED6 /* NYSwToaster.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NYSwToaster.swift; sourceTree = "<group>"; };
@@ -255,6 +269,34 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		908E44192A2746FC00DA2536 /* 考试 */ = {
+			isa = PBXGroup;
+			children = (
+				908E441E2A274AAC00DA2536 /* Exam01_ParentViewController.swift */,
+				908E44202A274B2A00DA2536 /* Exam02_ParentViewController.swift */,
+				908E44222A274B3700DA2536 /* Exam03_ParentViewController.swift */,
+				908E44242A274B4300DA2536 /* Exam04_ParentViewController.swift */,
+			);
+			path = "考试";
+			sourceTree = "<group>";
+		};
+		908E441A2A27495400DA2536 /* Login */ = {
+			isa = PBXGroup;
+			children = (
+				908E441B2A27496700DA2536 /* Controllers */,
+			);
+			path = Login;
+			sourceTree = "<group>";
+		};
+		908E441B2A27496700DA2536 /* Controllers */ = {
+			isa = PBXGroup;
+			children = (
+				908E441C2A2749E100DA2536 /* LoginViewController.swift */,
+				908E44262A2753D000DA2536 /* LoginStoryboard.storyboard */,
+			);
+			path = Controllers;
+			sourceTree = "<group>";
+		};
 		90A64B932A25A55F00D8BED6 /* Toaster */ = {
 			isa = PBXGroup;
 			children = (
@@ -273,6 +315,7 @@
 		90A64B9D2A25A9D000D8BED6 /* Modulars */ = {
 			isa = PBXGroup;
 			children = (
+				908E441A2A27495400DA2536 /* Login */,
 				90A64BB82A25D60500D8BED6 /* Mine */,
 				90A64BB42A25D4E600D8BED6 /* Timekeep */,
 				90A64BA92A25C28A00D8BED6 /* Home */,
@@ -290,13 +333,6 @@
 			path = Splash;
 			sourceTree = "<group>";
 		};
-		90A64BA12A25BCAD00D8BED6 /* New Group */ = {
-			isa = PBXGroup;
-			children = (
-			);
-			path = "New Group";
-			sourceTree = "<group>";
-		};
 		90A64BA22A25BCFA00D8BED6 /* Plugins */ = {
 			isa = PBXGroup;
 			children = (
@@ -327,6 +363,7 @@
 		90A64BAB2A25C2BE00D8BED6 /* Controllers */ = {
 			isa = PBXGroup;
 			children = (
+				908E44192A2746FC00DA2536 /* 考试 */,
 				90A64BAC2A25C32900D8BED6 /* HomeParentViewController.swift */,
 			);
 			path = Controllers;
@@ -431,7 +468,6 @@
 			isa = PBXGroup;
 			children = (
 				90A64BCF2A2604DC00D8BED6 /* Thirdparty */,
-				90A64BA12A25BCAD00D8BED6 /* New Group */,
 				90A64B9D2A25A9D000D8BED6 /* Modulars */,
 				90A64B9C2A25A9BE00D8BED6 /* Models */,
 				B204266B2A1B0E50009FAC45 /* AppDelegate.swift */,
@@ -457,6 +493,7 @@
 				90A64BB22A25D11800D8BED6 /* BaseViewController.swift */,
 				90A64BBC2A25D9D300D8BED6 /* MainTabBarController.swift */,
 				90A64BBE2A25DFDA00D8BED6 /* MainTabBarViewReactor.swift */,
+				908E44172A27225100DA2536 /* BaseCollectionViewController.swift */,
 			);
 			path = Main;
 			sourceTree = "<group>";
@@ -781,6 +818,7 @@
 				90A64BCE2A2603DD00D8BED6 /* HomeNavBar.xib in Resources */,
 				B20427242A1B4ED2009FAC45 /* SearchBarView.xib in Resources */,
 				B20426782A1B0E52009FAC45 /* LaunchScreen.storyboard in Resources */,
+				908E44272A2753D000DA2536 /* LoginStoryboard.storyboard in Resources */,
 				B20427302A1B4ED2009FAC45 /* PopOverViewCell.xib in Resources */,
 				90A64BC82A25E98C00D8BED6 /* Main.storyboard in Resources */,
 				B20426752A1B0E52009FAC45 /* Assets.xcassets in Resources */,
@@ -837,6 +875,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				908E441D2A2749E100DA2536 /* LoginViewController.swift in Sources */,
 				B20426CE2A1B4DB6009FAC45 /* UIImage+Placeholder.swift in Sources */,
 				B20427412A1B56B1009FAC45 /* NYNumber.swift in Sources */,
 				90A64BBB2A25D76100D8BED6 /* MineParentViewController.swift in Sources */,
@@ -844,13 +883,16 @@
 				B20427322A1B4ED2009FAC45 /* Action.swift in Sources */,
 				B20426B12A1B4738009FAC45 /* UICollectionView+Rx.swift in Sources */,
 				90A64BD82A2604F600D8BED6 /* UILabel+GJRatioAutoLayout.m in Sources */,
+				908E44182A27225100DA2536 /* BaseCollectionViewController.swift in Sources */,
 				B20426D52A1B4DB6009FAC45 /* UIScrollView+ScrollToBottom.swift in Sources */,
 				B20426B32A1B4738009FAC45 /* Logger.swift in Sources */,
+				908E44212A274B2A00DA2536 /* Exam02_ParentViewController.swift in Sources */,
 				B20426CF2A1B4DB6009FAC45 /* UIScrollView+Direction.swift in Sources */,
 				B204271A2A1B4ED2009FAC45 /* Refreshable.swift in Sources */,
 				90A64B922A25A4DC00D8BED6 /* NYSwRouter.swift in Sources */,
 				B20427272A1B4ED2009FAC45 /* NetAnimationView.swift in Sources */,
 				B20427262A1B4ED2009FAC45 /* EmptyView.swift in Sources */,
+				908E44252A274B4300DA2536 /* Exam04_ParentViewController.swift in Sources */,
 				B20427432A1B5846009FAC45 /* Snap.swift in Sources */,
 				B204270F2A1B4ED2009FAC45 /* LWPlayer.swift in Sources */,
 				B20427162A1B4ED2009FAC45 /* LWPlayerUtils.swift in Sources */,
@@ -863,6 +905,7 @@
 				B20426B22A1B4738009FAC45 /* PullToRefresh+Rx.swift in Sources */,
 				B204271E2A1B4ED2009FAC45 /* BilibiliCollectionViewLayout.swift in Sources */,
 				B20427102A1B4ED2009FAC45 /* LWPlayerView.swift in Sources */,
+				908E441F2A274AAC00DA2536 /* Exam01_ParentViewController.swift in Sources */,
 				B20426C82A1B4DB6009FAC45 /* DefaultsKeys+Key.swift in Sources */,
 				B20427192A1B4ED2009FAC45 /* LWPlayerFullScreenViewController.swift in Sources */,
 				90A64BA82A25BF8100D8BED6 /* HomeAPI.swift in Sources */,
@@ -897,6 +940,7 @@
 				B20426AD2A1B4738009FAC45 /* UILabel+Rx.swift in Sources */,
 				B20426D72A1B4DB6009FAC45 /* NSAttributedString+BoundingRect.swift in Sources */,
 				B20426D02A1B4DB6009FAC45 /* UIBarButtonItem+Init.swift in Sources */,
+				908E44232A274B3700DA2536 /* Exam03_ParentViewController.swift in Sources */,
 				B20426AF2A1B4738009FAC45 /* UIView+Rx.swift in Sources */,
 				90A64B992A25A7F100D8BED6 /* MainNavigationController.swift in Sources */,
 				90A64BB72A25D56700D8BED6 /* TimeKeepParentViewController.swift in Sources */,

+ 1 - 1
JSJP_Student_sw.xcodeproj/xcuserdata/mimasigeling.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -7,7 +7,7 @@
 		<key>JSJP_Student_sw.xcscheme_^#shared#^_</key>
 		<dict>
 			<key>orderHint</key>
-			<integer>42</integer>
+			<integer>43</integer>
 		</dict>
 	</dict>
 </dict>

+ 0 - 0
JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/极速驾培.imageset/Contents.json → JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/jsjp_img.imageset/Contents.json


+ 0 - 0
JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/极速驾培.imageset/极速驾培.png → JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/jsjp_img.imageset/极速驾培.png


+ 0 - 0
JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/极速驾培.imageset/极速驾培@2x.png → JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/jsjp_img.imageset/极速驾培@2x.png


+ 0 - 0
JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/极速驾培.imageset/极速驾培@3x.png → JSJP_Student_sw/Assets.xcassets/Modules/HomePageModule/jsjp_img.imageset/极速驾培@3x.png


+ 0 - 0
JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/头像.imageset/Contents.json → JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/user_img.imageset/Contents.json


+ 0 - 0
JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/头像.imageset/头像.png → JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/user_img.imageset/头像.png


+ 0 - 0
JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/头像.imageset/头像@2x.png → JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/user_img.imageset/头像@2x.png


+ 0 - 0
JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/头像.imageset/头像@3x.png → JSJP_Student_sw/Assets.xcassets/Modules/ProfileModule/user_img.imageset/头像@3x.png


+ 2 - 0
JSJP_Student_sw/JSJP-Brigding-Header.h

@@ -8,6 +8,8 @@
 #ifndef JSJP_Brigding_Header_h
 #define JSJP_Brigding_Header_h
 
+//第三方
 #import "GJRatioAutoLayout.h"
+#import "VTMagic.h"
 
 #endif /* JSJP_Brigding_Header_h */

+ 1 - 1
JSJP_Student_sw/Sources/CompositionRoot.swift

@@ -56,7 +56,7 @@ final class CompositionRoot {
         presentMainScreen = {
 
             let mainTabBarController = MainTabBarController(reactor: MainTabBarViewReactor(),
-                                                            homeParentViewController: HomeParentViewController(),
+                                                            homeParentViewController: HomeParentViewController(service: homeService),
                                                             timekeepViewController: TimeKeepParentViewController(),
                                                             mineListViewController: MineParentViewController())
 

+ 1 - 0
JSJP_Student_sw/Sources/Constants/NYFont.swift

@@ -37,6 +37,7 @@ struct NYFont {
         
         static let sys_18 = UIFont.systemFont(ofSize: 18)
         static let sys_18_heave = UIFont.systemFont(ofSize: 18, weight: .heavy)
+        
     }
     
 }

+ 6 - 0
JSJP_Student_sw/Sources/Extensions/UIColor+Bilibili.swift

@@ -18,4 +18,10 @@ extension UIColor {
     class var db_black: UIColor { return UIColor(38,38,38) }
     class var db_lightBlack: UIColor { return UIColor(63,63,63) }
     class var db_orange: UIColor { return UIColor(231,157,105) }
+    
+    //新增
+    class var db_fontGray: UIColor { return UIColor(92, 96, 102) }
+    class var db_fontBlack: UIColor { return UIColor(10, 26, 51) }
+    class var db_sliderColor: UIColor { return UIColor(73, 142, 245) }
+    
 }

+ 150 - 0
JSJP_Student_sw/Sources/Main/BaseCollectionViewController.swift

@@ -0,0 +1,150 @@
+//
+//  BaseCollectionViewController.swift
+//  JSJP_Student_sw
+//
+//  Created by Ning.ge on 2023/5/31.
+//
+
+import UIKit
+
+import RxSwift
+import EmptyKit
+
+class BaseCollectionViewController: BaseViewController,Refreshable {
+    
+    var isEmptyDisplay: Bool = true
+    
+    var allowListenScroll: Bool = false
+    
+    let collectionView: UICollectionView = UICollectionView(
+        frame: .zero,
+        collectionViewLayout: UICollectionViewFlowLayout()
+        ).then{
+            $0.backgroundColor = .db_gray
+            $0.alwaysBounceVertical = true
+            $0.showsVerticalScrollIndicator = false
+    }
+    
+    override func setupConstraints() {
+        collectionView.snp.makeConstraints { (make) in
+            make.edges.equalTo(0)
+        }
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        collectionView.ept.dataSource = self
+        collectionView.ept.delegate = self
+        
+        view.addSubview(collectionView)
+        
+        showLoadAnimation()
+        
+        registerNetErrorNotification()
+        
+    }
+    
+    //MARK: Public Method
+    func startRefresh() {
+       
+        self.collectionView.setContentOffset(.zero, animated: true)
+        DispatchQueue.delay(time: 0.3, action: {
+            self.collectionView.es.startPullToRefresh()
+        })
+    }
+    
+    func registerNetErrorNotification() {
+        
+        NotificationCenter.default.rx.notification(custom: .netError)
+            .subscribe(onNext: {[unowned self] (_) in
+                
+                self.stopRefresh()
+                
+                self.showNetErrorView()
+            })
+            .disposed(by: disposeBag)
+    }
+    
+    func showNetErrorView() {
+        
+        if totalItems() > 0 { return }
+        
+        self.showAnimationView(self.collectionView, animationType: .failure)
+    }
+    
+    func showLoadAnimation() {
+        self.showAnimationView(self.collectionView)
+    }
+    
+    func hideLoadAnimation() {
+        self.hideAnimationView(self.collectionView)
+    }
+    
+    func stopRefresh() {
+        
+        guard let isRefreshing = collectionView.header?.isRefreshing else { return }
+        
+        if isRefreshing {
+            collectionView.es.stopPullToRefresh()
+        }
+    }
+    
+    //MARK: Private Method
+    private func stopLoad() {
+        
+        guard let isLoading = collectionView.footer?.isRefreshing else { return }
+        
+        if isLoading {
+            collectionView.es.stopLoadingMore()
+        }
+    }
+}
+
+//MARK: Notification
+extension BaseCollectionViewController {
+    
+   func totalItems() -> Int {
+       
+       var totalItems: Int = 0
+        
+       let sectionCount = self.collectionView.numberOfSections
+
+       for i in 0 ..< sectionCount {
+        
+          let items = self.collectionView.numberOfItems(inSection: i)
+        
+          totalItems += items
+       }
+        
+       return totalItems
+    }
+}
+
+extension BaseCollectionViewController:EmptyDelegate,EmptyDataSource {
+    
+    func customViewForEmpty(in view: UIView) -> UIView? {
+
+        return EmptyView.loadFromNib()
+    }
+
+    func emptyShouldAllowScroll(in view: UIView) -> Bool {
+        return true
+    }
+    
+    func emptyShouldDisplay(in view: UIView) -> Bool {
+        return isEmptyDisplay
+    }
+}
+
+extension BaseCollectionViewController: UIScrollViewDelegate {
+    
+    func scrollViewDidScroll(_ scrollView: UIScrollView) {
+        
+        guard self.collectionView.enableDirection,
+              let homeParentVc = UIViewController.topMost?.parent as? HomeParentViewController
+        else { return }
+        
+        homeParentVc.scrollViewDidScroll(scrollView)
+    }
+}

+ 2 - 0
JSJP_Student_sw/Sources/Main/BaseViewController.swift

@@ -8,6 +8,8 @@
 import UIKit
 
 import RxSwift
+import ReactorKit
+import RxDataSources
 
 class BaseViewController: UIViewController, NetAnimationLoadable {
 

+ 233 - 4
JSJP_Student_sw/Sources/Modulars/Home/Controllers/HomeParentViewController.swift

@@ -6,8 +6,48 @@
 //
 
 final class HomeParentViewController: BaseViewController {
-
-    override init() {
+    
+    private struct Metric {
+        static let statusBarHeight = isIphoneX ? 44.f : 20.f
+        static let navBarHeight = 44.f
+    }
+    // MARK: 私有属性
+    private var homeService : HomeServiceType
+    
+    private var menuTitles : [String] = ["科一", "科二", "科三", "科四"]
+    
+    private var idxs: [UInt] = []
+    
+    private var menuItemCurrentBtn : UIButton?
+    
+    // MARK: UI let
+    let statusBar = UIView().then {
+        $0.backgroundColor = UIColor.db_white
+    }
+    
+    let navBar = HomeNavBar.loadFromNib().then {
+        $0.backgroundColor = UIColor.db_white
+    }
+    
+    let pageController = VTMagicController().then {
+        $0.view.translatesAutoresizingMaskIntoConstraints = false
+        $0.magicView.navigationColor = .db_white
+        $0.magicView.sliderColor = .db_sliderColor
+        $0.magicView.switchStyle = .default
+        $0.magicView.layoutStyle = .divide
+        $0.magicView.navigationHeight = 44.f
+        $0.magicView.sliderExtension = 3
+        $0.magicView.sliderOffset = 0
+        $0.magicView.sliderHeight = 4
+        $0.magicView.separatorColor = UIColor.db_fontGray
+        $0.magicView.isSeparatorHidden = false
+        $0.magicView.bubbleRadius = 2
+        $0.magicView.needPreloading = true
+        $0.magicView.separatorHeight = 0 //下划线h
+    }
+    
+    init(service:HomeServiceType) {
+        self.homeService = service
         super.init()
         
         self.title = "考试"
@@ -15,13 +55,202 @@ final class HomeParentViewController: BaseViewController {
         self.tabBarItem.selectedImage = NYImage.TabBar.home_s?.withRenderingMode(.alwaysOriginal)
     }
     
+    required convenience init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    override func setupConstraints() {
+        
+        statusBar.snp.makeConstraints { (make) in
+            make.left.right.top.equalToSuperview()
+            make.height.equalTo(Metric.statusBarHeight)
+        }
+        
+        navBar.snp.remakeConstraints { (make) in
+            make.left.right.equalToSuperview()
+            make.height.equalTo(Metric.navBarHeight)
+            make.top.equalTo(statusBar.snp.bottom)
+        }
+        
+        pageController.view.snp.makeConstraints { (make) in
+            make.left.right.bottom.equalToSuperview()
+            make.top.equalTo(navBar.snp.bottom)
+        }
+        
+    }
+    func scrollViewDidScroll(_ scrollView: UIScrollView) {
+    }
+    // MARK: StatusBar
+    override var prefersStatusBarHidden: Bool {
+        return false
+    }
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        
+        self.navigationController?.setNavigationBarHidden(true, animated: true)
+    }
+    
     override func viewDidLoad() {
         super.viewDidLoad()
+        //注册配置
+        configureMagicController()
+        //配置 homeService
+        
+//        @IBAction func actionUserClickdo(_ sender: UIButton) {
+//
+//    //        BilibiliRouter.push(.live_room)
+//
+//        }
+    }
 
-        // Do any additional setup after loading the view.
+    // MARK: 私有方法
+    func configureMagicController(){
+     
+        self.view.addSubview(navBar)
+        self.view.addSubview(statusBar)
+        self.addChild(pageController)
+        self.view.addSubview(pageController.view)
+        
+        //设置VTMagicController代理,初始页码
+        pageController.magicView.delegate = self
+        pageController.magicView.dataSource = self
+        pageController.magicView.reloadData(toPage: 0)
+        
     }
 
-    
+}
 
 
+//VTMagicViewDelegate view代理
+extension HomeParentViewController : VTMagicViewDelegate {
+    
+    func magicView(_ magicView: VTMagicView, didSelectItemAt itemIndex: UInt) {
+        var menuItem = magicView.menuItem(at: itemIndex)
+        if (menuItemCurrentBtn != nil) {
+            menuItemCurrentBtn?.titleLabel?.font = NYFont.SysFont.sys_15
+        }
+        menuItemCurrentBtn = menuItem
+        menuItem?.titleLabel?.font = UIFont.boldSystemFont(ofSize: 19)
+        if itemIndex == 0 || itemIndex == 1 {
+            guard let currentVc = pageController.currentViewController else { return }
+            
+            let currentPage = pageController.currentPage
+            
+            if currentPage == itemIndex {
+                TogetherDataManager.refreshDataForVTMagic(currentVc,true)
+            }
+        }
+    }
+    
+    func magicView(_ magicView: VTMagicView, viewDidAppear viewController: UIViewController, atPage pageIndex: UInt) {
+        
+        if pageIndex == 0 || pageIndex == 1 {
+            var canRefresh: Bool = false
+            
+            if let collectionVc = viewController as? BaseCollectionViewController {
+                
+                if collectionVc.totalItems() > 0 {
+                    canRefresh = true
+                }
+            }
+            
+            if idxs.contains(pageIndex) || canRefresh {
+                
+                TogetherDataManager.refreshDataForVTMagic(viewController, false)
+            }
+        }
+    }
+    
+    func magicView(_ magicView: VTMagicView, viewDidDisappear viewController: UIViewController, atPage pageIndex: UInt) {
+        
+        if pageIndex == 0 || pageIndex == 1 {
+            if !idxs.contains(pageIndex) {
+                idxs.append(pageIndex)
+            }
+        }
+        
+        if pageIndex == 1 {
+            TogetherDataManager.referenceDate = Date()
+        }
+    }
+}
+
+//VTMagicViewDataSource 数据源代理
+extension HomeParentViewController : VTMagicViewDataSource{
+    func menuTitles(for magicView: VTMagicView) -> [String] {
+        return menuTitles
+    }
+    
+    func magicView(_ magicView: VTMagicView, menuItemAt itemIndex: UInt) -> UIButton {
+        
+        var menuItem = magicView.dequeueReusableItem(withIdentifier: "homeItemIdentifier")
+        if menuItem == nil  {
+            menuItem = UIButton(type: .custom)
+            menuItem?.setTitleColor(.db_fontGray, for: .normal)
+            menuItem?.setTitleColor(.db_fontBlack, for: .selected)
+            menuItem?.titleLabel?.font = NYFont.SysFont.sys_15
+            if itemIndex==0 {
+                menuItemCurrentBtn = menuItem
+                menuItem?.titleLabel?.font = UIFont.boldSystemFont(ofSize: 19)
+            }
+        }
+        
+        return menuItem ?? UIButton()
+    }
+    
+    func magicView(_ magicView: VTMagicView, viewControllerAtPage pageIndex: UInt) -> UIViewController {
+        
+        if pageIndex == 0 {
+//            var liveController = magicView.dequeueReusablePage(withIdentifier: "LiveListViewController")
+//            if liveController == nil {
+//                let liveSectionReactorFactory: (LiveModuleListModel) -> LiveListSectionReactor = { moduleList in
+//                    return LiveListSectionReactor(module: moduleList)
+//                }
+//                let reactor = LiveListViewReactor(service: homeService, liveSectionReactorFactory: liveSectionReactorFactory)
+//                liveController = LiveListViewController(reactor: reactor, liveListSectionDelegateFactory: { () -> LiveListSectionDelegate in
+//                    LiveListSectionDelegate()
+//                })
+//            }
+//            return liveController ?? UIViewController()
+            var exam01_Controller = magicView.dequeueReusablePage(withIdentifier: "Exam01_ParentViewController")
+            if exam01_Controller == nil {
+//                let exam01SectionReactorFactory: ()
+                
+                exam01_Controller = Exam01_ParentViewController().then{ $0.view.backgroundColor = UIColor.green}
+            }
+            
+            return exam01_Controller ?? UIViewController()
+        } else if pageIndex == 1 {
+//            var recommendController = magicView.dequeueReusablePage(withIdentifier: "RecommendParentViewController")
+//            if recommendController == nil {
+//                recommendController = RecommendParentViewController()
+//            }
+//            return recommendController ?? UIViewController()
+            return UIViewController().then { $0.view.backgroundColor = UIColor.red }
+        } else if pageIndex == 2 {
+            //            var dramaController = magicView.dequeueReusablePage(withIdentifier: "DramaViewController")
+            //            if dramaController == nil {
+            //                let reactor = DramaViewReactor(service: homeService)
+            //                dramaController = DramaViewController(reactor: reactor, dramaSectionDelegateFactory: { () -> DramaSectionDelegate in
+            //                    DramaSectionDelegate()
+            //                })
+            //            }
+            //            return dramaController ?? UIViewController()
+            return UIViewController()
+        } else if pageIndex == 3{
+            
+            return UIViewController()
+        } else {
+//            var branchController = magicView.dequeueReusablePage(withIdentifier: "BranchViewController")
+//            if branchController == nil {
+//                let reactor = BranchViewReactor(homeService: homeService)
+//                branchController = BranchViewController(reactor: reactor, branchSectionDelegateFactory: { () -> BranchSectionDelegate in
+//                    BranchSectionDelegate()
+//                })
+//            }
+//            (branchController as! BranchViewController).setId(id: requestIds[Int(pageIndex) - 3])
+//            return branchController ?? UIViewController()
+            return UIViewController()
+        }
+    }
 }

+ 11 - 0
JSJP_Student_sw/Sources/Modulars/Home/Controllers/考试/Exam01_ParentViewController.swift

@@ -0,0 +1,11 @@
+//
+//  Exam01_ParentViewController.swift
+//  JSJP_Student_sw
+//
+//  Created by Ning.ge on 2023/5/31.
+//
+
+
+final class Exam01_ParentViewController: BaseViewController {
+    
+}

+ 10 - 0
JSJP_Student_sw/Sources/Modulars/Home/Controllers/考试/Exam02_ParentViewController.swift

@@ -0,0 +1,10 @@
+//
+//  Exam02_ParentViewController.swift
+//  JSJP_Student_sw
+//
+//  Created by Ning.ge on 2023/5/31.
+//
+
+final class Exam02_ParentViewController: BaseViewController {
+    
+}

+ 10 - 0
JSJP_Student_sw/Sources/Modulars/Home/Controllers/考试/Exam03_ParentViewController.swift

@@ -0,0 +1,10 @@
+//
+//  Exam03_ParentViewController.swift
+//  JSJP_Student_sw
+//
+//  Created by Ning.ge on 2023/5/31.
+//
+
+final class Exam03_ParentViewController: BaseViewController {
+    
+}

+ 10 - 0
JSJP_Student_sw/Sources/Modulars/Home/Controllers/考试/Exam04_ParentViewController.swift

@@ -0,0 +1,10 @@
+//
+//  Exam04_ParentViewController.swift
+//  JSJP_Student_sw
+//
+//  Created by Ning.ge on 2023/5/31.
+//
+
+final class Exam04_ParentViewController: BaseViewController {
+    
+}

+ 27 - 1
JSJP_Student_sw/Sources/Modulars/Home/Views/HomeNavBar.swift

@@ -5,4 +5,30 @@
 //  Created by Ning.ge on 2023/5/30.
 //
 
-import Foundation
+import UIKit
+
+final class HomeNavBar: UIView,NibLoadable {
+
+    
+    @IBOutlet weak var user_Icon_btn: UIButton!
+    
+    @IBOutlet weak var logo_Icon_img: UIImageView!
+    
+    @IBOutlet weak var title_txt_lab: UILabel!
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        //bind 绑定
+        user_Icon_btn.rx.tap.subscribe(onNext:{ [unowned self] (_) in
+            
+            NSLog("user_Icon_btnuser_Icon_btnuser_Icon_btn")
+//            let loginController = LoginViewController()
+//            navigator.push(loginController)
+            
+            let loginController = UIStoryboard(name: "LoginStoryboard", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController")
+            navigator.push(loginController)
+        }).disposed(by: rx.disposeBag)
+    }
+    
+}

+ 105 - 6
JSJP_Student_sw/Sources/Modulars/Home/Views/HomeNavBar.xib

@@ -1,18 +1,117 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
-        <view contentMode="scaleToFill" id="iN0-l3-epB">
-            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="HomeNavBar" customModule="JSJP_Student_sw" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="44"/>
             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-            <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zNw-wU-7jb" userLabel="View-content">
+                    <rect key="frame" x="0.0" y="0.0" width="393" height="44"/>
+                    <subviews>
+                        <button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Tib-4M-xrA">
+                            <rect key="frame" x="15" y="7" width="30" height="30"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="30" id="QAA-TJ-usy"/>
+                                <constraint firstAttribute="height" constant="30" id="jnd-Lf-0wy"/>
+                            </constraints>
+                            <state key="normal" title="Button"/>
+                            <buttonConfiguration key="configuration" style="plain" image="user_img"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="fontFitType">
+                                    <integer key="value" value="0"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="15"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                    <color key="value" systemColor="linkColor"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                    <real key="value" value="1"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </button>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XXR-be-CIp" userLabel="View-center">
+                            <rect key="frame" x="126.66666666666669" y="0.0" width="140" height="44"/>
+                            <subviews>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="jsjp_img" translatesAutoresizingMaskIntoConstraints="NO" id="1Iq-KY-jZm">
+                                    <rect key="frame" x="13.999999999999986" y="14" width="80" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="80" id="QBv-wX-fhX"/>
+                                        <constraint firstAttribute="height" constant="16" id="ZCV-Ol-MUL"/>
+                                    </constraints>
+                                </imageView>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="小车" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YQW-tW-0ax">
+                                    <rect key="frame" x="101.99999999999999" y="13" width="48.000000000000014" height="18"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="48" id="aEG-Kh-onu"/>
+                                        <constraint firstAttribute="height" constant="18" id="wSt-3b-PEr"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
+                                    <color key="textColor" red="0.36078431372549019" green="0.37647058823529411" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="YQW-tW-0ax" firstAttribute="centerY" secondItem="XXR-be-CIp" secondAttribute="centerY" id="4nZ-Eh-IKK"/>
+                                <constraint firstAttribute="width" constant="140" id="Btr-Zi-d3z"/>
+                                <constraint firstItem="1Iq-KY-jZm" firstAttribute="leading" secondItem="XXR-be-CIp" secondAttribute="leading" constant="14" id="CU6-5k-WR6"/>
+                                <constraint firstItem="1Iq-KY-jZm" firstAttribute="centerY" secondItem="XXR-be-CIp" secondAttribute="centerY" id="LMb-pk-sxc"/>
+                                <constraint firstAttribute="height" constant="44" id="nmJ-kh-jx2"/>
+                                <constraint firstItem="YQW-tW-0ax" firstAttribute="leading" secondItem="1Iq-KY-jZm" secondAttribute="trailing" constant="8" symbolic="YES" id="yu3-NR-aiQ"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="Tib-4M-xrA" firstAttribute="centerY" secondItem="zNw-wU-7jb" secondAttribute="centerY" id="23i-NJ-m8c"/>
+                        <constraint firstItem="Tib-4M-xrA" firstAttribute="leading" secondItem="zNw-wU-7jb" secondAttribute="leading" constant="15" id="8VR-Ch-s6v"/>
+                        <constraint firstItem="XXR-be-CIp" firstAttribute="top" secondItem="zNw-wU-7jb" secondAttribute="top" id="FX8-aw-3NJ"/>
+                        <constraint firstItem="XXR-be-CIp" firstAttribute="centerX" secondItem="zNw-wU-7jb" secondAttribute="centerX" id="N4p-ku-3Kh"/>
+                    </constraints>
+                </view>
+            </subviews>
             <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+            <constraints>
+                <constraint firstItem="zNw-wU-7jb" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="CFR-JE-WeU"/>
+                <constraint firstItem="zNw-wU-7jb" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="RTW-ga-VSS"/>
+                <constraint firstItem="zNw-wU-7jb" firstAttribute="trailing" secondItem="vUN-kp-3ea" secondAttribute="trailing" id="pDs-fu-U7W"/>
+                <constraint firstAttribute="bottom" secondItem="zNw-wU-7jb" secondAttribute="bottom" id="vDM-hX-aco"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <userDefinedRuntimeAttributes>
+                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                    <real key="value" value="0.0"/>
+                </userDefinedRuntimeAttribute>
+            </userDefinedRuntimeAttributes>
+            <connections>
+                <outlet property="logo_Icon_img" destination="1Iq-KY-jZm" id="Wyb-XH-cCC"/>
+                <outlet property="title_txt_lab" destination="YQW-tW-0ax" id="As7-Ek-Nd6"/>
+                <outlet property="user_Icon_btn" destination="Tib-4M-xrA" id="6Mm-69-5WO"/>
+            </connections>
+            <point key="canvasLocation" x="41.984732824427482" y="-11.267605633802818"/>
         </view>
     </objects>
+    <resources>
+        <image name="jsjp_img" width="80" height="16.333333969116211"/>
+        <image name="user_img" width="69" height="69"/>
+        <systemColor name="linkColor">
+            <color red="0.0" green="0.47843137254901963" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </systemColor>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
 </document>

+ 33 - 0
JSJP_Student_sw/Sources/Modulars/Login/Controllers/LoginStoryboard.storyboard

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.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="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--Login View Controller-->
+        <scene sceneID="s0d-6b-0kx">
+            <objects>
+                <viewController storyboardIdentifier="LoginViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="Y6W-OH-hqX" customClass="LoginViewController" customModule="JSJP_Student_sw" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="5EZ-qb-Rvc">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="24" y="-28"/>
+        </scene>
+    </scenes>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 11 - 0
JSJP_Student_sw/Sources/Modulars/Login/Controllers/LoginViewController.swift

@@ -0,0 +1,11 @@
+//
+//  LoginViewController.swift
+//  JSJP_Student_sw
+//
+//  Created by Ning.ge on 2023/5/31.
+//
+import UIKit
+
+final class LoginViewController: BaseViewController {
+    
+}

+ 2 - 1
Podfile

@@ -84,7 +84,8 @@ target 'JSJP_Student_sw' do
   pod 'SwiftyUserDefaults'#, '4.0.0-alpha.1'
   pod 'CGFloatLiteral'
   pod 'Dollar'
-
+  pod 'SwiftyFitsize'   #适配-iphone-ipad等方案 支持 xib 和 storyboard
+  
 end
 
 post_install do |installer|

+ 5 - 1
Podfile.lock

@@ -62,6 +62,7 @@ PODS:
   - SwiftDate (6.3.1)
   - SwiftTimer (2.0)
   - SwiftyColor (1.2.1)
+  - SwiftyFitsize (1.4.2)
   - SwiftyImage (1.6.0)
   - SwiftyJSON (5.0.1)
   - SwiftyUserDefaults (5.3.0)
@@ -104,6 +105,7 @@ DEPENDENCIES:
   - SwiftDate
   - SwiftTimer
   - SwiftyColor
+  - SwiftyFitsize
   - SwiftyImage
   - SwiftyJSON
   - SwiftyUserDefaults
@@ -146,6 +148,7 @@ SPEC REPOS:
     - SwiftDate
     - SwiftTimer
     - SwiftyColor
+    - SwiftyFitsize
     - SwiftyImage
     - SwiftyJSON
     - SwiftyUserDefaults
@@ -196,6 +199,7 @@ SPEC CHECKSUMS:
   SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2
   SwiftTimer: 4d25ff045d81c3132e1161a3ba2353d06ff63c30
   SwiftyColor: a2f468071c1b96be1ba41a0be7cf70d645cd7dcc
+  SwiftyFitsize: b5801bf659c0cf9c86bca0be123fffb1291caedf
   SwiftyImage: 65c71a147f417fc0fe137d17b135aaa666279a09
   SwiftyJSON: 2f33a42c6fbc52764d96f13368585094bfd8aa5e
   SwiftyUserDefaults: 63f80248cf5bfb3458825d9a78f2eb7e1293a040
@@ -206,6 +210,6 @@ SPEC CHECKSUMS:
   WeakMapTable: 05c694ce8439a7a9ebabb56187287a63c57673d6
   YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
 
-PODFILE CHECKSUM: bb736d2641a838b8e5f0c5d76e8eb31062f15b37
+PODFILE CHECKSUM: dbf715d65f974336c4a4562269e6653ae13b5c04
 
 COCOAPODS: 1.12.1

+ 5 - 1
Pods/Manifest.lock

@@ -62,6 +62,7 @@ PODS:
   - SwiftDate (6.3.1)
   - SwiftTimer (2.0)
   - SwiftyColor (1.2.1)
+  - SwiftyFitsize (1.4.2)
   - SwiftyImage (1.6.0)
   - SwiftyJSON (5.0.1)
   - SwiftyUserDefaults (5.3.0)
@@ -104,6 +105,7 @@ DEPENDENCIES:
   - SwiftDate
   - SwiftTimer
   - SwiftyColor
+  - SwiftyFitsize
   - SwiftyImage
   - SwiftyJSON
   - SwiftyUserDefaults
@@ -146,6 +148,7 @@ SPEC REPOS:
     - SwiftDate
     - SwiftTimer
     - SwiftyColor
+    - SwiftyFitsize
     - SwiftyImage
     - SwiftyJSON
     - SwiftyUserDefaults
@@ -196,6 +199,7 @@ SPEC CHECKSUMS:
   SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2
   SwiftTimer: 4d25ff045d81c3132e1161a3ba2353d06ff63c30
   SwiftyColor: a2f468071c1b96be1ba41a0be7cf70d645cd7dcc
+  SwiftyFitsize: b5801bf659c0cf9c86bca0be123fffb1291caedf
   SwiftyImage: 65c71a147f417fc0fe137d17b135aaa666279a09
   SwiftyJSON: 2f33a42c6fbc52764d96f13368585094bfd8aa5e
   SwiftyUserDefaults: 63f80248cf5bfb3458825d9a78f2eb7e1293a040
@@ -206,6 +210,6 @@ SPEC CHECKSUMS:
   WeakMapTable: 05c694ce8439a7a9ebabb56187287a63c57673d6
   YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
 
-PODFILE CHECKSUM: bb736d2641a838b8e5f0c5d76e8eb31062f15b37
+PODFILE CHECKSUM: dbf715d65f974336c4a4562269e6653ae13b5c04
 
 COCOAPODS: 1.12.1

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1312 - 1297
Pods/Pods.xcodeproj/project.pbxproj


+ 7 - 0
Pods/Pods.xcodeproj/xcuserdata/mimasigeling.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -235,6 +235,13 @@
 			<key>orderHint</key>
 			<integer>32</integer>
 		</dict>
+		<key>SwiftyFitsize.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+			<key>orderHint</key>
+			<integer>42</integer>
+		</dict>
 		<key>SwiftyImage.xcscheme</key>
 		<dict>
 			<key>isShown</key>

+ 23 - 0
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-acknowledgements.markdown

@@ -1019,6 +1019,29 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 
 
+## SwiftyFitsize
+
+Copyright (c) 2018 LinXunFeng <598600855@qq.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
 ## SwiftyImage
 
 The MIT License (MIT)

+ 29 - 0
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-acknowledgements.plist

@@ -1216,6 +1216,35 @@ SOFTWARE.
 			<key>Type</key>
 			<string>PSGroupSpecifier</string>
 		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (c) 2018 LinXunFeng &lt;598600855@qq.com&gt;
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+</string>
+			<key>License</key>
+			<string>MIT</string>
+			<key>Title</key>
+			<string>SwiftyFitsize</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
 		<dict>
 			<key>FooterText</key>
 			<string>The MIT License (MIT)

+ 1 - 0
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Debug-input-files.xcfilelist

@@ -30,6 +30,7 @@ ${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
 ${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework
 ${BUILT_PRODUCTS_DIR}/SwiftTimer/SwiftTimer.framework
 ${BUILT_PRODUCTS_DIR}/SwiftyColor/SwiftyColor.framework
+${BUILT_PRODUCTS_DIR}/SwiftyFitsize/SwiftyFitsize.framework
 ${BUILT_PRODUCTS_DIR}/SwiftyImage/SwiftyImage.framework
 ${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework
 ${BUILT_PRODUCTS_DIR}/SwiftyUserDefaults/SwiftyUserDefaults.framework

+ 1 - 0
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Debug-output-files.xcfilelist

@@ -29,6 +29,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftTimer.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyColor.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyFitsize.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyImage.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyJSON.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyUserDefaults.framework

+ 1 - 0
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Release-input-files.xcfilelist

@@ -30,6 +30,7 @@ ${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
 ${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework
 ${BUILT_PRODUCTS_DIR}/SwiftTimer/SwiftTimer.framework
 ${BUILT_PRODUCTS_DIR}/SwiftyColor/SwiftyColor.framework
+${BUILT_PRODUCTS_DIR}/SwiftyFitsize/SwiftyFitsize.framework
 ${BUILT_PRODUCTS_DIR}/SwiftyImage/SwiftyImage.framework
 ${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework
 ${BUILT_PRODUCTS_DIR}/SwiftyUserDefaults/SwiftyUserDefaults.framework

+ 1 - 0
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Release-output-files.xcfilelist

@@ -29,6 +29,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftTimer.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyColor.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyFitsize.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyImage.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyJSON.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyUserDefaults.framework

+ 2 - 0
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks.sh

@@ -207,6 +207,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftTimer/SwiftTimer.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyColor/SwiftyColor.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SwiftyFitsize/SwiftyFitsize.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyImage/SwiftyImage.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyUserDefaults/SwiftyUserDefaults.framework"
@@ -249,6 +250,7 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftTimer/SwiftTimer.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyColor/SwiftyColor.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SwiftyFitsize/SwiftyFitsize.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyImage/SwiftyImage.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftyUserDefaults/SwiftyUserDefaults.framework"

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.debug.xcconfig


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.release.xcconfig


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů