Browse Source

ninggege。提交了新的 CRUD

openlockPPP 1 year ago
parent
commit
d63c8d7582
30 changed files with 2738 additions and 1774 deletions
  1. 26 4
      JSJP_Student_sw.xcodeproj/project.pbxproj
  2. 1 1
      JSJP_Student_sw.xcodeproj/xcuserdata/mimasigeling.xcuserdatad/xcschemes/xcschememanagement.plist
  3. 15 0
      JSJP_Student_sw/Info.plist
  4. 2 0
      JSJP_Student_sw/JSJP-Brigding-Header.h
  5. 46 0
      JSJP_Student_sw/Sources/Constants/NYMacros.swift
  6. 286 0
      JSJP_Student_sw/Sources/Models/UserInfoModel.swift
  7. 18 6
      JSJP_Student_sw/Sources/Modulars/Login/Controllers/LoginViewController.swift
  8. 6 0
      JSJP_Student_sw/Sources/Networking/NetEnvironment.swift
  9. 1 0
      JSJP_Student_sw/Sources/Networking/Networking.swift
  10. 3 1
      JSJP_Student_sw/Sources/Networking/RequestError.swift
  11. 1 0
      JSJP_Student_sw/Sources/Rx/Moya+Rx.swift
  12. 173 1
      JSJP_Student_sw/Sources/Services/LoginAPI.swift
  13. 52 27
      JSJP_Student_sw/Sources/Services/LoginService.swift
  14. 30 0
      JSJP_Student_sw/Sources/Thirdparty/Keychain/SAMKeychain+RQUtil.h
  15. 65 0
      JSJP_Student_sw/Sources/Thirdparty/Keychain/SAMKeychain+RQUtil.m
  16. 0 54
      JSJP_Student_sw/Sources/Utils/LocalManager.swift
  17. 3 1
      Podfile
  18. 13 1
      Podfile.lock
  19. 13 1
      Pods/Manifest.lock
  20. 1783 1633
      Pods/Pods.xcodeproj/project.pbxproj
  21. 63 42
      Pods/Pods.xcodeproj/xcuserdata/mimasigeling.xcuserdatad/xcschemes/xcschememanagement.plist
  22. 51 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-acknowledgements.markdown
  23. 69 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-acknowledgements.plist
  24. 3 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Debug-input-files.xcfilelist
  25. 3 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Debug-output-files.xcfilelist
  26. 3 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Release-input-files.xcfilelist
  27. 3 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks-Release-output-files.xcfilelist
  28. 6 0
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-frameworks.sh
  29. 0 1
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.debug.xcconfig
  30. 0 1
      Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.release.xcconfig

+ 26 - 4
JSJP_Student_sw.xcodeproj/project.pbxproj

@@ -56,6 +56,9 @@
 		90A64BDA2A2604F600D8BED6 /* UIView+GJRatioAutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 90A64BD72A2604F600D8BED6 /* UIView+GJRatioAutoLayout.m */; };
 		90E71CD42A2B81AB00E4086E /* LoginAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E71CD32A2B81AB00E4086E /* LoginAPI.swift */; };
 		90E71CD62A2C7FBA00E4086E /* LocalManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E71CD52A2C7FBA00E4086E /* LocalManager.swift */; };
+		90E71CD82A2DB64400E4086E /* UserInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E71CD72A2DB64400E4086E /* UserInfoModel.swift */; };
+		90E71CDA2A2ECBAD00E4086E /* NYMacros.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E71CD92A2ECBAD00E4086E /* NYMacros.swift */; };
+		90E71CDF2A30990100E4086E /* SAMKeychain+RQUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 90E71CDD2A30990100E4086E /* SAMKeychain+RQUtil.m */; };
 		B204266C2A1B0E50009FAC45 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B204266B2A1B0E50009FAC45 /* AppDelegate.swift */; };
 		B20426752A1B0E52009FAC45 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B20426742A1B0E52009FAC45 /* Assets.xcassets */; };
 		B20426782A1B0E52009FAC45 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B20426762A1B0E52009FAC45 /* LaunchScreen.storyboard */; };
@@ -191,6 +194,10 @@
 		90A64BDB2A2605C500D8BED6 /* JSJP-Brigding-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JSJP-Brigding-Header.h"; sourceTree = "<group>"; };
 		90E71CD32A2B81AB00E4086E /* LoginAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginAPI.swift; sourceTree = "<group>"; };
 		90E71CD52A2C7FBA00E4086E /* LocalManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalManager.swift; sourceTree = "<group>"; };
+		90E71CD72A2DB64400E4086E /* UserInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoModel.swift; sourceTree = "<group>"; };
+		90E71CD92A2ECBAD00E4086E /* NYMacros.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NYMacros.swift; sourceTree = "<group>"; };
+		90E71CDD2A30990100E4086E /* SAMKeychain+RQUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SAMKeychain+RQUtil.m"; sourceTree = "<group>"; };
+		90E71CDE2A30990100E4086E /* SAMKeychain+RQUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SAMKeychain+RQUtil.h"; sourceTree = "<group>"; };
 		B20426682A1B0E50009FAC45 /* JSJP_Student_sw.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JSJP_Student_sw.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		B204266B2A1B0E50009FAC45 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		B20426742A1B0E52009FAC45 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -373,6 +380,7 @@
 		90A64B9C2A25A9BE00D8BED6 /* Models */ = {
 			isa = PBXGroup;
 			children = (
+				90E71CD72A2DB64400E4086E /* UserInfoModel.swift */,
 			);
 			path = Models;
 			sourceTree = "<group>";
@@ -478,6 +486,7 @@
 		90A64BCF2A2604DC00D8BED6 /* Thirdparty */ = {
 			isa = PBXGroup;
 			children = (
+				90E71CDC2A30990100E4086E /* Keychain */,
 				90A64BD02A2604F600D8BED6 /* GJRatioAutoLayout */,
 			);
 			path = Thirdparty;
@@ -497,6 +506,15 @@
 			path = GJRatioAutoLayout;
 			sourceTree = "<group>";
 		};
+		90E71CDC2A30990100E4086E /* Keychain */ = {
+			isa = PBXGroup;
+			children = (
+				90E71CDD2A30990100E4086E /* SAMKeychain+RQUtil.m */,
+				90E71CDE2A30990100E4086E /* SAMKeychain+RQUtil.h */,
+			);
+			path = Keychain;
+			sourceTree = "<group>";
+		};
 		B204265F2A1B0E50009FAC45 = {
 			isa = PBXGroup;
 			children = (
@@ -792,6 +810,7 @@
 				B204273E2A1B5691009FAC45 /* NYFont.swift */,
 				B20427402A1B56B1009FAC45 /* NYNumber.swift */,
 				904B259D2A28731A001F7C9C /* NYFitReal.swift */,
+				90E71CD92A2ECBAD00E4086E /* NYMacros.swift */,
 			);
 			path = Constants;
 			sourceTree = "<group>";
@@ -960,6 +979,7 @@
 				B20426B12A1B4738009FAC45 /* UICollectionView+Rx.swift in Sources */,
 				90A64BD82A2604F600D8BED6 /* UILabel+GJRatioAutoLayout.m in Sources */,
 				908E44182A27225100DA2536 /* BaseCollectionViewController.swift in Sources */,
+				90E71CD82A2DB64400E4086E /* UserInfoModel.swift in Sources */,
 				B20426D52A1B4DB6009FAC45 /* UIScrollView+ScrollToBottom.swift in Sources */,
 				B20426B32A1B4738009FAC45 /* Logger.swift in Sources */,
 				908E44212A274B2A00DA2536 /* Exam02_ParentViewController.swift in Sources */,
@@ -999,6 +1019,7 @@
 				90A64BCC2A2603CB00D8BED6 /* HomeNavBar.swift in Sources */,
 				904B25A62A289EE5001F7C9C /* NYArticleViewController.swift in Sources */,
 				B20426AE2A1B4738009FAC45 /* NotificationCenter+Rx.swift in Sources */,
+				90E71CDF2A30990100E4086E /* SAMKeychain+RQUtil.m in Sources */,
 				B20426AC2A1B4738009FAC45 /* UIScrollView+Rx.swift in Sources */,
 				B20426D32A1B4DB6009FAC45 /* Array+SectionModel.swift in Sources */,
 				B20427182A1B4ED2009FAC45 /* LWPlayerEnum.swift in Sources */,
@@ -1037,6 +1058,7 @@
 				90A64BAF2A25C35700D8BED6 /* HomeEnum.swift in Sources */,
 				B20426B02A1B4738009FAC45 /* UICollectionViewFlexLayout+Rx.swift in Sources */,
 				B20427112A1B4ED2009FAC45 /* LWPlayerManager.swift in Sources */,
+				90E71CDA2A2ECBAD00E4086E /* NYMacros.swift in Sources */,
 				B20426D62A1B4DB6009FAC45 /* UIColor+Bilibili.swift in Sources */,
 				B204273A2A1B558F009FAC45 /* NYAppCongfigure.swift in Sources */,
 				B20427152A1B4ED2009FAC45 /* Timer+LWPlayer.swift in Sources */,
@@ -1191,7 +1213,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2023060801;
 				DEVELOPMENT_TEAM = K7T6CU5SW5;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = JSJP_Student_sw/Info.plist;
@@ -1206,7 +1228,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0;
+				MARKETING_VERSION = 1.1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = "zhongZhengJpsw.com.JSJP-Student-sw";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_EMIT_LOC_STRINGS = YES;
@@ -1223,7 +1245,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2023060801;
 				DEVELOPMENT_TEAM = K7T6CU5SW5;
 				GENERATE_INFOPLIST_FILE = YES;
 				INFOPLIST_FILE = JSJP_Student_sw/Info.plist;
@@ -1238,7 +1260,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0;
+				MARKETING_VERSION = 1.1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = "zhongZhengJpsw.com.JSJP-Student-sw";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_EMIT_LOC_STRINGS = YES;

+ 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>45</integer>
+			<integer>48</integer>
 		</dict>
 	</dict>
 </dict>

+ 15 - 0
JSJP_Student_sw/Info.plist

@@ -2,6 +2,21 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoads</key>
+		<true/>
+		<key>NSExceptionDomains</key>
+		<dict>
+			<key>fj.jppt.com.cn</key>
+			<dict>
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
+				<true/>
+				<key>NSIncludesSubdomains</key>
+				<true/>
+			</dict>
+		</dict>
+	</dict>
 	<key>UIApplicationSceneManifest</key>
 	<dict>
 		<key>UIApplicationSupportsMultipleScenes</key>

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

@@ -12,5 +12,7 @@
 #import "GJRatioAutoLayout.h"
 #import "VTMagic.h"
 #import <QMUIKit/QMUIKit.h>
+#import "SAMKeychain+RQUtil.h"
+#import <CocoaSecurity/CocoaSecurity.h>
 
 #endif /* JSJP_Brigding_Header_h */

+ 46 - 0
JSJP_Student_sw/Sources/Constants/NYMacros.swift

@@ -0,0 +1,46 @@
+//
+//  NYMacros.swift
+//  JSJP_Student_sw
+//
+//  Created by Ning.ge on 2023/6/6.
+//
+
+struct NYMacros {
+    //应用名
+    static let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName")
+    //应用版本
+    static let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
+    //应用build
+    static let appBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
+
+    ///------
+    /// iOS Version
+    ///------
+    static let iOSVersion = Float(UIDevice.current.systemVersion) ?? 0.0
+    static let iOS7OrLater = iOSVersion >= 7.0
+    static let iOS8OrLater = iOSVersion >= 8.0
+    static let iOS9OrLater = iOSVersion >= 9.0
+    static let iOS10OrLater = iOSVersion >= 10.0
+    static let iOS11OrLater = iOSVersion >= 11.0
+    static let iOS12OrLater = iOSVersion >= 12.0
+    static let iOS13OrLater = iOSVersion >= 13.0
+    static let iOS14OrLater = iOSVersion >= 14.0
+    static let iOS15OrLater = iOSVersion >= 15.0
+    
+    //时间戳
+    static func t() -> String {
+        return String(format: "%.f", Date().timeIntervalSince1970)
+    }
+    static func ts() -> String {
+        return String(format: "%.f", Date().timeIntervalSince1970*1000)
+    }
+    //生成设备ID
+    static func deviceID() -> String {
+        var deviceIDStr: String? = nil
+        if deviceIDStr == nil {
+            deviceIDStr = SAMKeychain.deviceId()
+        }
+        return deviceIDStr?.isEmpty == false ? deviceIDStr! : ""
+    }
+
+}

+ 286 - 0
JSJP_Student_sw/Sources/Models/UserInfoModel.swift

@@ -0,0 +1,286 @@
+//
+//  UserModel.swift
+//  JSJP_Student_sw
+//
+//  Created by Ning.ge on 2023/6/5.
+//
+
+import ObjectMapper
+import SwiftyUserDefaults
+
+// 用户登录的渠道
+enum UserLoginChannelType : Int{
+    case Default = -1       ///    未登录
+    case Phone = 0          /// 手机号登录
+    case QQ                 /// qq登录
+    case Email              /// 邮箱登录
+    case ChatID             /// 微信号登录
+    case AutoLogin          /// 自动登录
+}
+
+struct ParamsItem :ImmutableMappable{
+    
+    var ID:String = ""
+    var VALUE:String = ""
+    var REMARK:String = ""
+    var KEY:String = ""
+    var NAME:String = ""
+    
+    init(map: Map) throws {
+        ID = try map.value("ID")
+        VALUE = try map.value("VALUE")
+        REMARK = try map.value("REMARK")
+        KEY = try map.value("KEY")
+        NAME = try map.value("NAME")
+    }
+}
+
+
+struct SchInfo :ImmutableMappable{
+    
+    var address:String = ""
+    var bussinessLicenseNum:String = ""
+    var cityName:String = ""
+    var contactor:String  = ""
+    var count:String  = ""
+    var countryId:String  = ""
+    var countryName:String  = ""
+    var desc:String  = ""
+    var distance:String  = ""
+    var experienceRange:String  = ""
+    var headimg:String  = ""
+    var _id:String  = ""
+    var jxbh:String  = ""
+    var key:String  = ""
+    var latitude:String  = ""
+    var legalRepresentative:String  = ""
+    var legalTel:String  = ""
+    var licenseDeadline:String  = ""
+    var licenseNum:String  = ""
+    var longitude:String  = ""
+    var macId:String  = ""
+    var name:String  = ""
+    var price:String  = ""
+    var provinceId:String  = ""
+    var provinceName:String  = ""
+    var regDate:String  = ""
+    var route:String  = ""
+    var score:String  = ""
+    var serviceStar:String  = ""
+    var shortName:String  = ""
+    var siteStar:String  = ""
+    var star:String  = ""
+    var telePhone:String  = ""
+    var tollStar:String  = ""
+    var trainLevel:String  = ""
+    var unit:String  = ""
+    var vip:String  = ""
+    var watch:String  = ""
+    
+    init(map: Map) throws {
+        address = try map.value("address")
+        bussinessLicenseNum = try map.value("bussinessLicenseNum")
+        cityName = try map.value("cityName")
+        contactor = try map.value("contactor")
+        count = try map.value("count")
+        countryId = try map.value("countryId")
+        countryName = try map.value("countryName")
+        desc = try map.value("desc")
+        distance = try map.value("distance")
+        experienceRange = try map.value("experienceRange")
+        headimg = try map.value("headimg")
+        _id = try map.value("_id")
+        jxbh = try map.value("jxbh")
+        key = try map.value("key")
+        latitude = try map.value("latitude")
+        legalRepresentative = try map.value("legalRepresentative")
+        legalTel = try map.value("legalTel")
+        licenseDeadline = try map.value("licenseDeadline")
+        licenseNum = try map.value("licenseNum")
+        longitude = try map.value("longitude")
+        macId = try map.value("macId")
+        name = try map.value("name")
+        price = try map.value("price")
+        provinceId = try map.value("provinceId")
+        provinceName = try map.value("provinceName")
+        regDate = try map.value("regDate")
+        route = try map.value("count")
+        score = try map.value("count")
+        serviceStar = try map.value("count")
+        shortName = try map.value("count")
+        siteStar = try map.value("count")
+        star = try map.value("count")
+        telePhone = try map.value("count")
+        tollStar = try map.value("count")
+        trainLevel = try map.value("count")
+        unit = try map.value("count")
+        vip = try map.value("count")
+        watch = try map.value("count")
+        
+
+    }
+}
+
+
+struct UserInfo :ImmutableMappable{
+    /// 登录渠道
+    var channel:UserLoginChannelType?
+
+    var address:String = ""
+    var appType:String = ""
+    var birthday:String = ""
+    var carType:String  = ""
+    var city:String  = ""
+    var cityName:String  = ""
+    var country:String  = ""
+    var countryName:String  = ""
+    var crDate:String  = ""
+    var eduStatus:String  = ""
+    var email:String  = ""
+    var expireTime:String  = ""
+    var _id:String  = ""
+    var imei:String  = ""
+    var isycbd:String  = ""
+    var loginCode:String  = ""
+    var mnStatus:String  = ""
+    var mnqFaceCount:String  = ""
+    var mnqFacePorcess:String  = ""
+    var mnqThreeOpen:String  = ""
+    var mnqTwoOpen:String  = ""
+    var nickName:String  = ""
+    var outId:String  = ""
+    var params:[ParamsItem]?
+    var payPwd:String  = ""
+    var photo:String  = ""
+    var pxjd:String  = ""
+    var pxkm:String  = ""
+    var qzgx:String  = ""
+    var schInfo:SchInfo?
+    var school:String  = ""
+    var schoolName:String  = ""
+    var sex:String  = ""
+    var sfzb:String  = ""
+    var status:String  = ""
+    var stuDevNum:String  = ""
+    var stuNum:String  = ""
+    var systemVersion:String  = ""
+    var telphone:String  = ""
+    var userName:String  = ""
+    var verifyLevel:String  = ""
+    var version:String  = ""
+    var ycbdFaceCount:String  = ""
+    var busitype:String  = ""
+    var isOpenScan:String  = ""
+    var qzVideo:String  = ""
+    var sjjlbh:String  = ""
+    var a_c:String  = ""
+    
+    
+    var isLogin: Bool {
+        set {
+           Defaults.isLogin = newValue
+        }
+        get {
+           return Defaults.isLogin
+        }
+    }
+    
+    var openTimes: Int {
+        set {
+            Defaults.openTimes = newValue
+        }
+        get {
+            return Defaults.openTimes
+        }
+    }
+    
+    var avater: UIImage? {
+        set {
+            if newValue != nil {
+                Defaults.avater = newValue!.pngData() ?? Data()
+            }
+        }
+        get {
+            return UIImage(data: Defaults.avater)
+        }
+    }
+    
+    
+    var userAccount:String? {
+        set {
+            if newValue != nil{
+                Defaults.userAccount = newValue! ?? ""
+            }
+        }
+        get {
+            return Defaults.userAccount
+        }
+    }
+    
+    var password:String? {
+        set {
+            if newValue != nil{
+                Defaults.userPassword = newValue! ?? ""
+            }
+        }
+        get {
+            return Defaults.userPassword
+        }
+    }
+    
+    init(){}
+    init(map: Map) throws {
+
+        
+        channel = try map.value("channel")
+        address = try map.value("address")
+        appType = try map.value("appType")
+        birthday = try map.value("birthday")
+        carType = try map.value("carType")
+        city = try map.value("city")
+        cityName = try map.value("cityName")
+        country = try map.value("country")
+        countryName = try map.value("countryName")
+        crDate = try map.value("crDate")
+        eduStatus = try map.value("eduStatus")
+        email = try map.value("email")
+        expireTime = try map.value("expireTime")
+        _id = try map.value("_id")
+        imei = try map.value("imei")
+        isycbd = try map.value("isycbd")
+        loginCode = try map.value("loginCode")
+        mnStatus = try map.value("mnStatus")
+        mnqFaceCount = try map.value("mnqFaceCount")
+        mnqFacePorcess = try map.value("mnqFacePorcess")
+        mnqThreeOpen = try map.value("mnqThreeOpen")
+        mnqTwoOpen = try map.value("mnqTwoOpen")
+        nickName = try map.value("nickName")
+        outId = try map.value("outId")
+        params = try map.value("params")
+        payPwd = try map.value("payPwd")
+        photo = try map.value("photo")
+        pxjd = try map.value("pxjd")
+        pxkm = try map.value("pxkm")
+        qzgx = try map.value("qzgx")
+        schInfo = try map.value("schInfo")
+        school = try map.value("school")
+        schoolName = try map.value("schoolName")
+        sex = try map.value("sex")
+        sfzb = try map.value("sfzb")
+        status = try map.value("status")
+        stuDevNum = try map.value("stuDevNum")
+        stuNum = try map.value("stuNum")
+        systemVersion = try map.value("systemVersion")
+        telphone = try map.value("telphone")
+        userName = try map.value("userName")
+        verifyLevel = try map.value("verifyLevel")
+        version = try map.value("version")
+        ycbdFaceCount = try map.value("ycbdFaceCount")
+        busitype = try map.value("busitype")
+        isOpenScan = try map.value("isOpenScan")
+        qzVideo = try map.value("qzVideo")
+        sjjlbh = try map.value("sjjlbh")
+        a_c = try map.value("a_c")
+
+    }
+}

+ 18 - 6
JSJP_Student_sw/Sources/Modulars/Login/Controllers/LoginViewController.swift

@@ -13,6 +13,7 @@ final class LoginViewController: BaseViewController {
   
     
     // MARK: 私有属性
+    private let loginService: LoginServiceType = LoginService(networking: LoginNetworking())
     
     private var loginModel:LoginViewModel!
     
@@ -37,8 +38,8 @@ final class LoginViewController: BaseViewController {
         $0.backgroundColor = UIColor(242, 243, 245)
         $0.layer.cornerRadius = 20.f
         $0.layer.masksToBounds = true
-        if ((LocalManager.userInfo.userPassword?.count) != nil) {
-            $0.textField.text = LocalManager.userInfo.userPassword
+        if ((LocalManager.userInfo.password?.count) != nil) {
+            $0.textField.text = LocalManager.userInfo.password
         }
     }
     //同意
@@ -194,14 +195,25 @@ final class LoginViewController: BaseViewController {
                         self.loginBtn.isEnabled = false
                         self.view.endEditing(true)
                     })
-                    .subscribeOn(MainScheduler.instance)//主线程
+//                    .subscribeOn(MainScheduler.instance)//主线程
                     .subscribe(onNext: {[unowned self]isLogin in
                         NSLog("登录 - 登录: login %@","123")
                         //保存用户信息
-                        LocalManager.userInfo.userAccount = self.phoneView.textField.text
-                        LocalManager.userInfo.userPassword = self.passwordView.textField.text
-                        
+                        var account:String = self.phoneView.textField.text!
+                        var password:String = self.passwordView.textField.text!
+                        LocalManager.userInfo.userAccount = account
+                        LocalManager.userInfo.password = password
                         self.loginBtn.isEnabled = true
+                        //登录api RX 订阅 观察 销毁 三部曲
+                        self.loginService.loginRequest(user_name: account, user_password: password)
+                            .subscribe(onSuccess: { userinfo in
+                                print("登录成功:%@", userinfo)
+                                self.navigationController?.popViewController(animated: true)
+                            }, onError: { error in
+                                print("%@",error)
+                            })
+                            .disposed(by: disposeBag)
+                        
                     })
                     .disposed(by: disposeBag)
     }

+ 6 - 0
JSJP_Student_sw/Sources/Networking/NetEnvironment.swift

@@ -23,6 +23,8 @@ enum HttpRequest {
     case api
     case bangumi
     case live
+    case http
+    case another
 }
 
 extension HttpRequest {
@@ -40,6 +42,10 @@ extension HttpRequest {
             return environment == .res ? "http://bangumi.bilibili.com" : "bangumi"
         case .live:
             return environment == .res ? "http://api.live.bilibili.com" : "live"
+        case .http:
+            return environment == .res ? "http://fj.jppt.com.cn/" : "http://192.168.8.87:8080/xm"
+        case .another:
+            return environment == .res ? "https://zzjs.zzxcx.net" : "http://192.168.8.87:8080"
         }
     }
 }

+ 1 - 0
JSJP_Student_sw/Sources/Networking/Networking.swift

@@ -10,6 +10,7 @@ import RxSwift
 import Alamofire
 
 typealias HomeNetworking = Networking<HomeAPI>
+typealias LoginNetworking = Networking<LoginAPI>
 
 final class Networking<Target: TargetType>: MoyaProvider<Target> {
     

+ 3 - 1
JSJP_Student_sw/Sources/Networking/RequestError.swift

@@ -12,9 +12,11 @@ import RxSwift
 
 ///定义返回的JSON数据字段
 let RESULT_CODE = "code"//状态码
-let RESULT_MESSAGE = "message"//错误消息提示
+let RESULT_MESSAGE = "msg"//错误消息提示
 let RESULT_DATA = "data"//数据包
 let RESULT_RESULT = "result"//数据包
+let RESULT_BODY = "body"//数据包
+let RESULT_OTHER = "other"//数据包
 
 enum RequestError: Swift.Error {
     case noCodeKey

+ 1 - 0
JSJP_Student_sw/Sources/Rx/Moya+Rx.swift

@@ -11,6 +11,7 @@ import RxSwift
 import SwiftyJSON
 import ObjectMapper
 
+
 extension PrimitiveSequence where Trait == SingleTrait, Element == Moya.Response {
     
     func map<T: ImmutableMappable>(_ type: T.Type) -> PrimitiveSequence<Trait, T> {

+ 173 - 1
JSJP_Student_sw/Sources/Services/LoginAPI.swift

@@ -5,4 +5,176 @@
 //  Created by Ning.ge on 2023/6/3.
 //
 
-import Foundation
+import Moya
+import SwiftyUserDefaults
+import CryptoSwift
+
+enum LoginAPI {
+    
+    //登录
+    case loginUser(user_name:String, user_password:String)
+    //注册
+    case registerUser(user_name:String, user_password:String)
+    //修改密码
+    case updateUser(user_name:String, user_password:String,code:String)
+    
+}
+
+extension LoginAPI: TargetType {
+    var baseURL: URL {
+        switch self {
+        case .loginUser,.registerUser,.updateUser:
+            return URL(string: HttpRequest.http.path)!
+        }
+    }
+    
+    var path: String {
+        switch self {
+        case .loginUser(_,_):
+            return "appservice/student/stuLogin" //basePath(path: "appservice/student/stuLogin")
+        case .registerUser(_,_):
+            return "appservice/student/register"
+        case .updateUser(_,_,_):
+            return "appservice/student/update"
+       
+        }
+    }
+    
+    var method: Moya.Method {
+        switch self {
+        case .loginUser,.registerUser,.updateUser:
+            return .post
+        default:
+            return .get
+        }
+    }
+    
+    var sampleData: Data {
+        return Data()
+    }
+    
+    var task: Moya.Task {
+        switch self {
+        case .loginUser(_,_):
+            if let parameters = parameters {
+                return .requestCompositeParameters(bodyParameters: parameters, bodyEncoding: URLEncoding.httpBody, urlParameters: sign(with: urlParameters!)!)
+//                return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
+            }
+            return .requestPlain
+        case .registerUser(_,_):
+            if let parameters = parameters {
+                return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
+            }
+            return .requestPlain
+        case .updateUser(_,_,_):
+            if let parameters = parameters {
+                return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
+            }
+            return .requestPlain
+        }
+    }
+    
+    var headers: [String: String]? {
+        switch self {
+        case .loginUser:
+            var urlParameters = urlParameters!
+            let sgin = signStr(with: urlParameters)
+            urlParameters["sign"] = sgin
+            // 遍历字典的键值对及索引
+            var hs:[String: String] = [:]
+            for (index, (key, value)) in urlParameters.enumerated() {
+                // 如果 value 为空则跳过
+                let vv = value as? String
+                if vv!.count == 0 { continue }
+                hs[key] = vv
+            }
+            return hs
+        default:
+            return ["Content-Type":"application/json"]
+        }
+    }
+    
+    var parameters: [String : Any]? {
+        switch self {
+        case let .loginUser(user_name, user_password):
+            
+            return ["loginCode": user_name,
+                    "password": user_password.md5(),
+                    "version": NYMacros.appVersion ?? "1.1.0",
+                    "appType": "2",
+                    "systemVersion": String(format: "iOS %.1f", NYMacros.iOSVersion),//手机操作系统版本
+                    "photo": "",
+                    "sex": "",
+                    "nickName": "",
+                    "openId": "",
+                    "loginType": "1",]
+        case let .updateUser(user_name, user_password, code):
+            return ["username": user_name, "password": user_password,"code":code];
+        default:
+            return nil
+        }
+    }
+    
+    var urlParameters: [String: Any]? {
+        var parameters = parameters
+        if let extendsParameters = extendsParameters {
+            parameters = parameters?.merging(extendsParameters) { $1 } //组合
+        }
+        return parameters
+    }
+    
+    var extendsParameters:[String : Any]? {
+        return ["channel": "AppStore",
+                "deviceid": NYMacros.deviceID(),
+                "platform": "iOS",
+                "t": NYMacros.t(),
+                "token": "",
+                "ver": NYMacros.appVersion!,]
+    }
+    
+    /// 带签名的请求参数
+    func signStr(with parameters: [String: Any]) -> String {
+        var valueStr = ""
+        for (index, (key, value)) in sign(with: parameters)!.enumerated() {
+            if index == parameters.count-1 {
+                valueStr.appending("\(key)=\(value)")
+            }
+            else
+            {
+                valueStr.appending("\(key)=\(value)&")
+            }
+        }
+        return valueStr
+    }
+    func sign(with parameters: [String: Any]) -> [String: Any]? {
+        // 按照 ASCII 码排序
+        let sortedKeys = parameters.keys.sorted(by: { $0.compare($1, options: .numeric) == .orderedAscending })
+
+        var kvs = [String]()
+        for key in sortedKeys {
+            // 如果 value 为空则跳过
+            guard let value = parameters[key] else {
+                continue
+            }
+            var stringValue = value
+            kvs.append("\(key)=\(stringValue)")
+        }
+
+        let paramString = kvs.joined(separator: "&")
+        
+        // 拼接时间戳
+        let ts = NYMacros.ts() // "\(Int(Date().timeIntervalSince1970 * 1000))"
+        let sign = "\(paramString)&key=\(ts)"
+        // MD5
+//        let signedString = sign.md5().bytes.toHexString()
+        let signedString = CocoaSecurity.md5(sign)?.hex ?? ""
+//        let signed = "ts=\(ts)&sign=\(signedString)&user=ios&v=jsjp"
+
+        return ["ts":ts,
+                "sign":signedString,
+                "user":"ios",
+                "v":"jsjp"]
+    }
+
+    
+}

+ 52 - 27
JSJP_Student_sw/Sources/Services/LoginService.swift

@@ -6,36 +6,61 @@
 //
 import RxSwift
 import RxCocoa
+import SwiftyJSON
 
-enum ValidationResult {
-    case ok(message:String)//输入正确
-    case empty//输入为空
-    case validating
-    case failed(message:String)//输入不合法
-}
-
-enum SignupState {
-    case signedUp(signedUp: Bool)
-}
+protocol LoginServiceType {
 
-protocol LoginAPI {
-    func usernameAvailable(_ username: String) -> Observable<Bool>
-    func signup(_ username: String, password: String) -> Observable<Bool>
+    func loginRequest(user_name: String, user_password: String) -> Single<UserInfo>
+    
 }
 
-protocol GitHubValidationService {
-    func validateUsername(_ username: String) -> Observable<ValidationResult>
-    func validatePassword(_ password: String) -> ValidationResult
-    func validateRepeatedPassword(_ password: String, repeatedPassword: String) -> ValidationResult
-}
-
-extension ValidationResult {
-    var isValid: Bool {
-        switch self {
-        case .ok:
-            return true
-        default:
-            return false
-        }
+final class LoginService: LoginServiceType {
+    
+    private let networking : LoginNetworking
+    
+    init(networking: LoginNetworking) {
+        self.networking = networking
+    }
+    
+    func loginRequest(user_name: String, user_password: String) -> RxSwift.Single<UserInfo> {
+        
+        let api = LoginAPI.loginUser(user_name: user_name, user_password: user_password)
+        return networking.request(api).map(UserInfo.self)
     }
+    
+ 
+    
 }
+
+//enum ValidationResult {
+//    case ok(message:String)//输入正确
+//    case empty//输入为空
+//    case validating
+//    case failed(message:String)//输入不合法
+//}
+//
+//enum SignupState {
+//    case signedUp(signedUp: Bool)
+//}
+//
+//protocol LoginAPI1 {
+//    func usernameAvailable(_ username: String) -> Observable<Bool>
+//    func signup(_ username: String, password: String) -> Observable<Bool>
+//}
+//
+//protocol GitHubValidationService {
+//    func validateUsername(_ username: String) -> Observable<ValidationResult>
+//    func validatePassword(_ password: String) -> ValidationResult
+//    func validateRepeatedPassword(_ password: String, repeatedPassword: String) -> ValidationResult
+//}
+//
+//extension ValidationResult {
+//    var isValid: Bool {
+//        switch self {
+//        case .ok:
+//            return true
+//        default:
+//            return false
+//        }
+//    }
+//}

+ 30 - 0
JSJP_Student_sw/Sources/Thirdparty/Keychain/SAMKeychain+RQUtil.h

@@ -0,0 +1,30 @@
+//
+//  SAMKeychain+RQUtil.h
+//  RQCommon
+//
+//  Created by 张嵘 on 2018/11/16.
+//  Copyright © 2018 张嵘. All rights reserved.
+//
+
+#import "SAMKeychain.h"
+
+@interface SAMKeychain (RQUtil)
++ (NSString *)rawLogin ;
+
++ (BOOL)setRawLogin:(NSString *)rawLogin ;
+
++ (BOOL)deleteRawLogin;
+
++ (NSString *)rawLoginPassword ;
+
++ (BOOL)setRawLoginPassword:(NSString *)rawLoginPassword ;
+
++ (BOOL)deleteRawLoginPassword;
+
+
+
+/// 设备ID or UUID
++ (NSString *)deviceId;
+
+@end
+

+ 65 - 0
JSJP_Student_sw/Sources/Thirdparty/Keychain/SAMKeychain+RQUtil.m

@@ -0,0 +1,65 @@
+//
+//  SAMKeychain+RQUtil.m
+//  RQCommon
+//
+//  Created by 张嵘 on 2018/11/16.
+//  Copyright © 2018 张嵘. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "SAMKeychain+RQUtil.h"
+
+/// 登录账号的key
+static NSString *const RQ_RAW_LOGIN = @"RQRawJSJPStudentLogin";
+static NSString *const RQ_RAW_LOGIN_PASSWORD = @"RQRawJSJPStudentLoginPassword";
+static NSString *const RQ_SERVICE_NAME_IN_KEYCHAIN = @"com.kestrel.JSJPStudent";
+static NSString *const RQ_DEVICEID_ACCOUNT         = @"DeviceID";
+
+
+@implementation SAMKeychain (RQUtil)
++ (NSString *)rawLogin {
+	return [[NSUserDefaults standardUserDefaults] objectForKey:RQ_RAW_LOGIN];
+}
++ (BOOL)setRawLogin:(NSString *)rawLogin {
+	if (rawLogin == nil) NSLog(@"+setRawLogin: %@", rawLogin);
+	
+	[[NSUserDefaults standardUserDefaults] setObject:rawLogin forKey:RQ_RAW_LOGIN];
+	[[NSUserDefaults standardUserDefaults] synchronize];
+	
+	return YES;
+}
++ (BOOL)deleteRawLogin {
+	[[NSUserDefaults standardUserDefaults] removeObjectForKey:RQ_RAW_LOGIN];
+	[[NSUserDefaults standardUserDefaults] synchronize];
+	return YES;
+}
+
++ (NSString *)rawLoginPassword {
+    return [[NSUserDefaults standardUserDefaults] objectForKey:RQ_RAW_LOGIN_PASSWORD];
+}
++ (BOOL)setRawLoginPassword:(NSString *)rawLoginPassword {
+    if (rawLoginPassword == nil) NSLog(@"+setRawLoginPassword: %@", rawLoginPassword);
+    
+    [[NSUserDefaults standardUserDefaults] setObject:rawLoginPassword forKey:RQ_RAW_LOGIN_PASSWORD];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    
+    return YES;
+}
++ (BOOL)deleteRawLoginPassword {
+    [[NSUserDefaults standardUserDefaults] removeObjectForKey:RQ_RAW_LOGIN_PASSWORD];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    return YES;
+}
+
+
+
++ (NSString *)deviceId {
+	NSString * deviceidStr = [SAMKeychain passwordForService:RQ_SERVICE_NAME_IN_KEYCHAIN account:RQ_DEVICEID_ACCOUNT];
+	if (deviceidStr == nil) {
+		deviceidStr = [UIDevice currentDevice].identifierForVendor.UUIDString;
+		[SAMKeychain setPassword:deviceidStr forService:RQ_SERVICE_NAME_IN_KEYCHAIN account:RQ_DEVICEID_ACCOUNT];
+	}
+	return deviceidStr;
+}
+
+@end

+ 0 - 54
JSJP_Student_sw/Sources/Utils/LocalManager.swift

@@ -11,60 +11,6 @@ import SwiftyUserDefaults
 
 class LocalManager {
     
-    struct UserInfo {
-        var isLogin: Bool {
-            set {
-               Defaults.isLogin = newValue
-            }
-            get {
-               return Defaults.isLogin
-            }
-        }
-        
-        var openTimes: Int {
-            set {
-                Defaults.openTimes = newValue
-            }
-            get {
-                return Defaults.openTimes
-            }
-        }
-        
-        var avater: UIImage? {
-            set {
-                if newValue != nil {
-                    Defaults.avater = newValue!.pngData() ?? Data()
-                }
-            }
-            get {
-                return UIImage(data: Defaults.avater)
-            }
-        }
-        
-        
-        var userAccount:String? {
-            set {
-                if newValue != nil{
-                    Defaults.userAccount = newValue! ?? ""
-                }
-            }
-            get {
-                return Defaults.userAccount
-            }
-        }
-        
-        var userPassword:String? {
-            set {
-                if newValue != nil{
-                    Defaults.userPassword = newValue! ?? ""
-                }
-            }
-            get {
-                return Defaults.userPassword
-            }
-        }
-        
-    }
     
     static var userInfo: UserInfo = UserInfo()
     

+ 3 - 1
Podfile

@@ -62,7 +62,9 @@ target 'JSJP_Student_sw' do
   pod 'CGFloatLiteral'
   pod 'Dollar'
   pod 'SwiftyFitsize'   #适配-iphone-ipad等方案 支持 xib 和 storyboard
-  
+  pod 'SAMKeychain'     #钥匙串存储
+  pod 'CryptoSwift', '~> 1.7.1'
+  pod 'CocoaSecurity'   # 加密
   
 end
 

+ 13 - 1
Podfile.lock

@@ -4,6 +4,8 @@ PODS:
   - CocoaLumberjack/Core (3.8.0)
   - CocoaLumberjack/Swift (3.8.0):
     - CocoaLumberjack/Core
+  - CocoaSecurity (1.2.4)
+  - CryptoSwift (1.7.1)
   - Differentiator (4.0.1)
   - Dollar (9.0.0)
   - EmptyKit (4.2.0)
@@ -351,6 +353,7 @@ PODS:
   - RxViewController (1.0.0):
     - RxCocoa (~> 5.0)
     - RxSwift (~> 5.0)
+  - SAMKeychain (1.5.3)
   - SectionReactor (1.0.0):
     - ReactorKit (>= 2.0.0)
     - RxDataSources (>= 4.0.0)
@@ -375,6 +378,8 @@ DEPENDENCIES:
   - Alamofire
   - CGFloatLiteral
   - CocoaLumberjack/Swift
+  - CocoaSecurity
+  - CryptoSwift (~> 1.7.1)
   - Dollar
   - EmptyKit
   - ESPullToRefresh
@@ -397,6 +402,7 @@ DEPENDENCIES:
   - RxOptional
   - RxSwift
   - RxViewController
+  - SAMKeychain
   - SectionReactor
   - SnapKit
   - SwiftDate
@@ -417,6 +423,8 @@ SPEC REPOS:
     - Alamofire
     - CGFloatLiteral
     - CocoaLumberjack
+    - CocoaSecurity
+    - CryptoSwift
     - Differentiator
     - Dollar
     - EmptyKit
@@ -441,6 +449,7 @@ SPEC REPOS:
     - RxRelay
     - RxSwift
     - RxViewController
+    - SAMKeychain
     - SectionReactor
     - SnapKit
     - SwiftDate
@@ -469,6 +478,8 @@ SPEC CHECKSUMS:
   Alamofire: 0123a34370cb170936ae79a8df46cc62b2edeb88
   CGFloatLiteral: 0328648f666e3cb2263d5ee3972df9d320786d25
   CocoaLumberjack: 78abfb691154e2a9df8ded4350d504ee19d90732
+  CocoaSecurity: d288a6f87e0f363823d2cb83e753814a6944f71a
+  CryptoSwift: d3d18dc357932f7e6d580689e065cf1f176007c1
   Differentiator: 886080237d9f87f322641dedbc5be257061b0602
   Dollar: 2fc9bdeeb2d3ae1f251461803240d5c93829ee0c
   EmptyKit: 95d75cad79476379124e929488116e409043c1d5
@@ -493,6 +504,7 @@ SPEC CHECKSUMS:
   RxRelay: 5a18c2eb2d68326ebaf0112f80d837ae41b92b97
   RxSwift: 915abbdfb62214aa89ccd0b194d44fb478019b27
   RxViewController: 7330a46e5c31cd680db169da4c9fc8676e975a81
+  SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
   SectionReactor: 88cf2b79bdf33632c98583a574a17181a277fc33
   SnapKit: e01d52ebb8ddbc333eefe2132acf85c8227d9c25
   SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2
@@ -509,6 +521,6 @@ SPEC CHECKSUMS:
   WeakMapTable: 05c694ce8439a7a9ebabb56187287a63c57673d6
   YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
 
-PODFILE CHECKSUM: 78d17151b878a0472a634ba2f0503b5d141827f9
+PODFILE CHECKSUM: c913942da580254fe1476e0577dcb223c3c97167
 
 COCOAPODS: 1.12.1

+ 13 - 1
Pods/Manifest.lock

@@ -4,6 +4,8 @@ PODS:
   - CocoaLumberjack/Core (3.8.0)
   - CocoaLumberjack/Swift (3.8.0):
     - CocoaLumberjack/Core
+  - CocoaSecurity (1.2.4)
+  - CryptoSwift (1.7.1)
   - Differentiator (4.0.1)
   - Dollar (9.0.0)
   - EmptyKit (4.2.0)
@@ -351,6 +353,7 @@ PODS:
   - RxViewController (1.0.0):
     - RxCocoa (~> 5.0)
     - RxSwift (~> 5.0)
+  - SAMKeychain (1.5.3)
   - SectionReactor (1.0.0):
     - ReactorKit (>= 2.0.0)
     - RxDataSources (>= 4.0.0)
@@ -375,6 +378,8 @@ DEPENDENCIES:
   - Alamofire
   - CGFloatLiteral
   - CocoaLumberjack/Swift
+  - CocoaSecurity
+  - CryptoSwift (~> 1.7.1)
   - Dollar
   - EmptyKit
   - ESPullToRefresh
@@ -397,6 +402,7 @@ DEPENDENCIES:
   - RxOptional
   - RxSwift
   - RxViewController
+  - SAMKeychain
   - SectionReactor
   - SnapKit
   - SwiftDate
@@ -417,6 +423,8 @@ SPEC REPOS:
     - Alamofire
     - CGFloatLiteral
     - CocoaLumberjack
+    - CocoaSecurity
+    - CryptoSwift
     - Differentiator
     - Dollar
     - EmptyKit
@@ -441,6 +449,7 @@ SPEC REPOS:
     - RxRelay
     - RxSwift
     - RxViewController
+    - SAMKeychain
     - SectionReactor
     - SnapKit
     - SwiftDate
@@ -469,6 +478,8 @@ SPEC CHECKSUMS:
   Alamofire: 0123a34370cb170936ae79a8df46cc62b2edeb88
   CGFloatLiteral: 0328648f666e3cb2263d5ee3972df9d320786d25
   CocoaLumberjack: 78abfb691154e2a9df8ded4350d504ee19d90732
+  CocoaSecurity: d288a6f87e0f363823d2cb83e753814a6944f71a
+  CryptoSwift: d3d18dc357932f7e6d580689e065cf1f176007c1
   Differentiator: 886080237d9f87f322641dedbc5be257061b0602
   Dollar: 2fc9bdeeb2d3ae1f251461803240d5c93829ee0c
   EmptyKit: 95d75cad79476379124e929488116e409043c1d5
@@ -493,6 +504,7 @@ SPEC CHECKSUMS:
   RxRelay: 5a18c2eb2d68326ebaf0112f80d837ae41b92b97
   RxSwift: 915abbdfb62214aa89ccd0b194d44fb478019b27
   RxViewController: 7330a46e5c31cd680db169da4c9fc8676e975a81
+  SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
   SectionReactor: 88cf2b79bdf33632c98583a574a17181a277fc33
   SnapKit: e01d52ebb8ddbc333eefe2132acf85c8227d9c25
   SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2
@@ -509,6 +521,6 @@ SPEC CHECKSUMS:
   WeakMapTable: 05c694ce8439a7a9ebabb56187287a63c57673d6
   YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
 
-PODFILE CHECKSUM: 78d17151b878a0472a634ba2f0503b5d141827f9
+PODFILE CHECKSUM: c913942da580254fe1476e0577dcb223c3c97167
 
 COCOAPODS: 1.12.1

File diff suppressed because it is too large
+ 1783 - 1633
Pods/Pods.xcodeproj/project.pbxproj


+ 63 - 42
Pods/Pods.xcodeproj/xcuserdata/mimasigeling.xcuserdatad/xcschemes/xcschememanagement.plist

@@ -25,299 +25,320 @@
 			<key>orderHint</key>
 			<integer>2</integer>
 		</dict>
-		<key>Differentiator.xcscheme</key>
+		<key>CocoaSecurity.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
 			<integer>3</integer>
 		</dict>
-		<key>Dollar.xcscheme</key>
+		<key>CryptoSwift.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
 			<integer>4</integer>
 		</dict>
+		<key>Differentiator.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+			<key>orderHint</key>
+			<integer>5</integer>
+		</dict>
+		<key>Dollar.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+			<key>orderHint</key>
+			<integer>6</integer>
+		</dict>
 		<key>ESPullToRefresh-ESPullToRefresh.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>7</integer>
+			<integer>9</integer>
 		</dict>
 		<key>ESPullToRefresh.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>6</integer>
+			<integer>8</integer>
 		</dict>
 		<key>EmptyKit.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>5</integer>
+			<integer>7</integer>
 		</dict>
 		<key>FSPagerView.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>8</integer>
+			<integer>10</integer>
 		</dict>
 		<key>GDPerformanceView-Swift.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>9</integer>
+			<integer>11</integer>
 		</dict>
 		<key>Kingfisher.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>10</integer>
+			<integer>12</integer>
 		</dict>
 		<key>ManualLayout.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>11</integer>
+			<integer>13</integer>
 		</dict>
 		<key>Moya.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>12</integer>
+			<integer>14</integer>
 		</dict>
 		<key>NSObject+Rx.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>13</integer>
+			<integer>15</integer>
 		</dict>
 		<key>ObjectMapper.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>14</integer>
+			<integer>16</integer>
 		</dict>
 		<key>Pods-JSJP_Student_sw.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>15</integer>
+			<integer>17</integer>
 		</dict>
 		<key>QMUIKit-QMUIResources.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>17</integer>
+			<integer>19</integer>
 		</dict>
 		<key>QMUIKit.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>16</integer>
+			<integer>18</integer>
 		</dict>
 		<key>ReachabilitySwift.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>18</integer>
+			<integer>20</integer>
 		</dict>
 		<key>ReactorKit.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>19</integer>
+			<integer>21</integer>
 		</dict>
 		<key>Realm.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>20</integer>
+			<integer>22</integer>
 		</dict>
 		<key>RealmSwift.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>21</integer>
+			<integer>23</integer>
 		</dict>
 		<key>ReusableKit.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>22</integer>
+			<integer>24</integer>
 		</dict>
 		<key>RxCocoa.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>23</integer>
+			<integer>25</integer>
 		</dict>
 		<key>RxDataSources.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>24</integer>
+			<integer>26</integer>
 		</dict>
 		<key>RxGesture.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>25</integer>
+			<integer>27</integer>
 		</dict>
 		<key>RxOptional.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>26</integer>
+			<integer>28</integer>
 		</dict>
 		<key>RxRelay.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>27</integer>
+			<integer>29</integer>
 		</dict>
 		<key>RxSwift.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>28</integer>
+			<integer>30</integer>
 		</dict>
 		<key>RxViewController.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>29</integer>
+			<integer>31</integer>
+		</dict>
+		<key>SAMKeychain.xcscheme</key>
+		<dict>
+			<key>isShown</key>
+			<false/>
+			<key>orderHint</key>
+			<integer>32</integer>
 		</dict>
 		<key>SectionReactor.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>30</integer>
+			<integer>33</integer>
 		</dict>
 		<key>SnapKit.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>31</integer>
+			<integer>34</integer>
 		</dict>
 		<key>SwiftDate.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>32</integer>
+			<integer>35</integer>
 		</dict>
 		<key>SwiftTimer.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>33</integer>
+			<integer>36</integer>
 		</dict>
 		<key>SwiftyColor.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>34</integer>
+			<integer>37</integer>
 		</dict>
 		<key>SwiftyFitsize.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>35</integer>
+			<integer>38</integer>
 		</dict>
 		<key>SwiftyImage.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>36</integer>
+			<integer>39</integer>
 		</dict>
 		<key>SwiftyJSON.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>37</integer>
+			<integer>40</integer>
 		</dict>
 		<key>SwiftyUserDefaults.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>38</integer>
+			<integer>41</integer>
 		</dict>
 		<key>Then.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>39</integer>
+			<integer>42</integer>
 		</dict>
 		<key>Toaster.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>40</integer>
+			<integer>43</integer>
 		</dict>
 		<key>URLNavigator.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>41</integer>
+			<integer>44</integer>
 		</dict>
 		<key>VTMagic.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>42</integer>
+			<integer>45</integer>
 		</dict>
 		<key>WeakMapTable.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>43</integer>
+			<integer>46</integer>
 		</dict>
 		<key>YYText.xcscheme</key>
 		<dict>
 			<key>isShown</key>
 			<false/>
 			<key>orderHint</key>
-			<integer>44</integer>
+			<integer>47</integer>
 		</dict>
 	</dict>
 	<key>SuppressBuildableAutocreation</key>

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

@@ -67,6 +67,33 @@ Redistribution and use in source and binary forms, with or without modification,
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
+## CocoaSecurity
+
+The MIT License (MIT)
+Copyright (c) 2013 Kelp https://github.com/kelp404
+
+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.
+
+
+## CryptoSwift
+
+Copyright (C) 2014-2017 Marcin Krzyżanowski <marcin.krzyzanowski@gmail.com>
+This software is provided 'as-is', without any express or implied warranty.
+
+In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+- The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required.
+- Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+- This notice may not be removed or altered from any source or binary distribution.
+- Redistributions of any form whatsoever must retain the following acknowledgment: 'This product includes software developed by the "Marcin Krzyzanowski" (http://krzyzanowskim.com/).'
+
+
 ## Differentiator
 
 MIT License
@@ -913,6 +940,30 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 
 
+## SAMKeychain
+
+Copyright (c) 2010-2016 Sam Soffes, http://soff.es
+
+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.
+
+
 ## SectionReactor
 
 The MIT License (MIT)

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

@@ -96,6 +96,45 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 			<key>Type</key>
 			<string>PSGroupSpecifier</string>
 		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>The MIT License (MIT)
+Copyright (c) 2013 Kelp https://github.com/kelp404
+
+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>CocoaSecurity</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (C) 2014-2017 Marcin Krzyżanowski &lt;marcin.krzyzanowski@gmail.com&gt;
+This software is provided 'as-is', without any express or implied warranty.
+
+In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+- The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required.
+- Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+- This notice may not be removed or altered from any source or binary distribution.
+- Redistributions of any form whatsoever must retain the following acknowledgment: 'This product includes software developed by the "Marcin Krzyzanowski" (http://krzyzanowskim.com/).'
+</string>
+			<key>License</key>
+			<string>Attribution</string>
+			<key>Title</key>
+			<string>CryptoSwift</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
 		<dict>
 			<key>FooterText</key>
 			<string>MIT License
@@ -1086,6 +1125,36 @@ SOFTWARE.
 			<key>Type</key>
 			<string>PSGroupSpecifier</string>
 		</dict>
+		<dict>
+			<key>FooterText</key>
+			<string>Copyright (c) 2010-2016 Sam Soffes, http://soff.es
+
+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>SAMKeychain</string>
+			<key>Type</key>
+			<string>PSGroupSpecifier</string>
+		</dict>
 		<dict>
 			<key>FooterText</key>
 			<string>The MIT License (MIT)

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

@@ -2,6 +2,8 @@ ${PODS_ROOT}/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-fram
 ${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework
 ${BUILT_PRODUCTS_DIR}/CGFloatLiteral/CGFloatLiteral.framework
 ${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework
+${BUILT_PRODUCTS_DIR}/CocoaSecurity/CocoaSecurity.framework
+${BUILT_PRODUCTS_DIR}/CryptoSwift/CryptoSwift.framework
 ${BUILT_PRODUCTS_DIR}/Differentiator/Differentiator.framework
 ${BUILT_PRODUCTS_DIR}/Dollar/Dollar.framework
 ${BUILT_PRODUCTS_DIR}/ESPullToRefresh/ESPullToRefresh.framework
@@ -26,6 +28,7 @@ ${BUILT_PRODUCTS_DIR}/RxOptional/RxOptional.framework
 ${BUILT_PRODUCTS_DIR}/RxRelay/RxRelay.framework
 ${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework
 ${BUILT_PRODUCTS_DIR}/RxViewController/RxViewController.framework
+${BUILT_PRODUCTS_DIR}/SAMKeychain/SAMKeychain.framework
 ${BUILT_PRODUCTS_DIR}/SectionReactor/SectionReactor.framework
 ${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
 ${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework

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

@@ -1,6 +1,8 @@
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CGFloatLiteral.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaSecurity.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CryptoSwift.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Differentiator.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Dollar.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ESPullToRefresh.framework
@@ -25,6 +27,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxOptional.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxRelay.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxViewController.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SAMKeychain.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SectionReactor.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework

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

@@ -2,6 +2,8 @@ ${PODS_ROOT}/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw-fram
 ${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework
 ${BUILT_PRODUCTS_DIR}/CGFloatLiteral/CGFloatLiteral.framework
 ${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework
+${BUILT_PRODUCTS_DIR}/CocoaSecurity/CocoaSecurity.framework
+${BUILT_PRODUCTS_DIR}/CryptoSwift/CryptoSwift.framework
 ${BUILT_PRODUCTS_DIR}/Differentiator/Differentiator.framework
 ${BUILT_PRODUCTS_DIR}/Dollar/Dollar.framework
 ${BUILT_PRODUCTS_DIR}/ESPullToRefresh/ESPullToRefresh.framework
@@ -26,6 +28,7 @@ ${BUILT_PRODUCTS_DIR}/RxOptional/RxOptional.framework
 ${BUILT_PRODUCTS_DIR}/RxRelay/RxRelay.framework
 ${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework
 ${BUILT_PRODUCTS_DIR}/RxViewController/RxViewController.framework
+${BUILT_PRODUCTS_DIR}/SAMKeychain/SAMKeychain.framework
 ${BUILT_PRODUCTS_DIR}/SectionReactor/SectionReactor.framework
 ${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
 ${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework

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

@@ -1,6 +1,8 @@
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CGFloatLiteral.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaLumberjack.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CocoaSecurity.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CryptoSwift.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Differentiator.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Dollar.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ESPullToRefresh.framework
@@ -25,6 +27,7 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxOptional.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxRelay.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxViewController.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SAMKeychain.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SectionReactor.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
 ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework

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

@@ -179,6 +179,8 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/CGFloatLiteral/CGFloatLiteral.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/CocoaSecurity/CocoaSecurity.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/CryptoSwift/CryptoSwift.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/Differentiator/Differentiator.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/Dollar/Dollar.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/ESPullToRefresh/ESPullToRefresh.framework"
@@ -203,6 +205,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/RxRelay/RxRelay.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/RxViewController/RxViewController.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SAMKeychain/SAMKeychain.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SectionReactor/SectionReactor.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework"
@@ -223,6 +226,8 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/CGFloatLiteral/CGFloatLiteral.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/CocoaLumberjack/CocoaLumberjack.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/CocoaSecurity/CocoaSecurity.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/CryptoSwift/CryptoSwift.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/Differentiator/Differentiator.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/Dollar/Dollar.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/ESPullToRefresh/ESPullToRefresh.framework"
@@ -247,6 +252,7 @@ if [[ "$CONFIGURATION" == "Release" ]]; then
   install_framework "${BUILT_PRODUCTS_DIR}/RxRelay/RxRelay.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/RxViewController/RxViewController.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SAMKeychain/SAMKeychain.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SectionReactor/SectionReactor.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
   install_framework "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework"

File diff suppressed because it is too large
+ 0 - 1
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.debug.xcconfig


File diff suppressed because it is too large
+ 0 - 1
Pods/Target Support Files/Pods-JSJP_Student_sw/Pods-JSJP_Student_sw.release.xcconfig


Some files were not shown because too many files changed in this diff