Commit 96e9b1b736882eaf6f612509af1608552de2a68d
1 parent
bd330553
添加更新弹框,对接界面数据,添加空白视图
Showing
35 changed files
with
1074 additions
and
152 deletions
metaCode.xcodeproj/project.pbxproj
| ... | ... | @@ -9,6 +9,9 @@ |
| 9 | 9 | /* Begin PBXBuildFile section */ |
| 10 | 10 | 0D39E93D7229931C86EB1161 /* Pods_metaCode_metaCodeUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63D879B49B1E42F1584DD75E /* Pods_metaCode_metaCodeUITests.framework */; }; |
| 11 | 11 | 1DD2808DF02C120276F99F4D /* Pods_metaCode.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F1C55A719CFEE073C06D37CE /* Pods_metaCode.framework */; }; |
| 12 | + 790B1FB42A4153E90074CF00 /* CNLiveMineBaseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790B1FB32A4153E90074CF00 /* CNLiveMineBaseModel.swift */; }; | |
| 13 | + 790B1FB62A41938F0074CF00 /* UIImage+CNLiveColorImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790B1FB52A41938F0074CF00 /* UIImage+CNLiveColorImage.swift */; }; | |
| 14 | + 790B1FB82A41B6A60074CF00 /* CNLiveMineMessageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790B1FB72A41B6A60074CF00 /* CNLiveMineMessageViewController.swift */; }; | |
| 12 | 15 | 790D01822A2D88FC00C5978D /* CNLiveConfigMacro.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790D01812A2D88FC00C5978D /* CNLiveConfigMacro.swift */; }; |
| 13 | 16 | 790D01852A2D89E100C5978D /* UIColor+CNHexColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790D01842A2D89E100C5978D /* UIColor+CNHexColor.swift */; }; |
| 14 | 17 | 790D018B2A2D8B3300C5978D /* CNLiveLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 790D018A2A2D8B3300C5978D /* CNLiveLoginViewController.swift */; }; |
| ... | ... | @@ -100,6 +103,9 @@ |
| 100 | 103 | 63D879B49B1E42F1584DD75E /* Pods_metaCode_metaCodeUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_metaCode_metaCodeUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; |
| 101 | 104 | 67F8190701D1AB7F7724E8BA /* Pods-metaCodeTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCodeTests.release.xcconfig"; path = "Target Support Files/Pods-metaCodeTests/Pods-metaCodeTests.release.xcconfig"; sourceTree = "<group>"; }; |
| 102 | 105 | 721865F548C997EFAE525B6F /* Pods-metaCode-metaCodeUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-metaCode-metaCodeUITests.release.xcconfig"; path = "Target Support Files/Pods-metaCode-metaCodeUITests/Pods-metaCode-metaCodeUITests.release.xcconfig"; sourceTree = "<group>"; }; |
| 106 | + 790B1FB32A4153E90074CF00 /* CNLiveMineBaseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveMineBaseModel.swift; sourceTree = "<group>"; }; | |
| 107 | + 790B1FB52A41938F0074CF00 /* UIImage+CNLiveColorImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+CNLiveColorImage.swift"; sourceTree = "<group>"; }; | |
| 108 | + 790B1FB72A41B6A60074CF00 /* CNLiveMineMessageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveMineMessageViewController.swift; sourceTree = "<group>"; }; | |
| 103 | 109 | 790D01812A2D88FC00C5978D /* CNLiveConfigMacro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CNLiveConfigMacro.swift; sourceTree = "<group>"; }; |
| 104 | 110 | 790D01842A2D89E100C5978D /* UIColor+CNHexColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+CNHexColor.swift"; sourceTree = "<group>"; }; |
| 105 | 111 | 790D018A2A2D8B3300C5978D /* CNLiveLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveLoginViewController.swift; sourceTree = "<group>"; }; |
| ... | ... | @@ -226,6 +232,7 @@ |
| 226 | 232 | 798A44EF2A305BC200815935 /* UIButton+CNLiveExtension.swift */, |
| 227 | 233 | 79396EEC2A319F220053E1AF /* NSObject+CNLiveCurrentVC.swift */, |
| 228 | 234 | 79BDDCBD2A3C3FC8008560FC /* NSObject+CNLiveJSONTool.swift */, |
| 235 | + 790B1FB52A41938F0074CF00 /* UIImage+CNLiveColorImage.swift */, | |
| 229 | 236 | ); |
| 230 | 237 | path = Extensions; |
| 231 | 238 | sourceTree = "<group>"; |
| ... | ... | @@ -294,6 +301,7 @@ |
| 294 | 301 | 79396EF02A31C21B0053E1AF /* CNLiveInfoShowViewController.swift */, |
| 295 | 302 | 79F4B1152A32B96B00993C03 /* CNLiveMineInfoViewController.swift */, |
| 296 | 303 | 79F4B1192A32F21400993C03 /* CNLiveMineNickViewController.swift */, |
| 304 | + 790B1FB72A41B6A60074CF00 /* CNLiveMineMessageViewController.swift */, | |
| 297 | 305 | ); |
| 298 | 306 | path = Controller; |
| 299 | 307 | sourceTree = "<group>"; |
| ... | ... | @@ -423,6 +431,7 @@ |
| 423 | 431 | isa = PBXGroup; |
| 424 | 432 | children = ( |
| 425 | 433 | 7978A8422A396632007C86B8 /* CNLiveMineViewModel.swift */, |
| 434 | + 790B1FB32A4153E90074CF00 /* CNLiveMineBaseModel.swift */, | |
| 426 | 435 | ); |
| 427 | 436 | path = ViewModel; |
| 428 | 437 | sourceTree = "<group>"; |
| ... | ... | @@ -805,10 +814,12 @@ |
| 805 | 814 | 798A44FB2A30999900815935 /* CNLiveAlertTool.swift in Sources */, |
| 806 | 815 | 790D01A52A2DF65E00C5978D /* CNLiveLoginPickerView.swift in Sources */, |
| 807 | 816 | 79282A3C2A2EDC2500B5F8CF /* NSString+CNLiveExtensions.swift in Sources */, |
| 817 | + 790B1FB82A41B6A60074CF00 /* CNLiveMineMessageViewController.swift in Sources */, | |
| 808 | 818 | 798A44F22A30674200815935 /* CNLiveMineSubBodyListView.swift in Sources */, |
| 809 | 819 | 790D01822A2D88FC00C5978D /* CNLiveConfigMacro.swift in Sources */, |
| 810 | 820 | 7CD675482A274167008354C1 /* PGIndexBannerSubiew.m in Sources */, |
| 811 | 821 | 790D019F2A2DD66E00C5978D /* CNLiveLoginViewModel.swift in Sources */, |
| 822 | + 790B1FB62A41938F0074CF00 /* UIImage+CNLiveColorImage.swift in Sources */, | |
| 812 | 823 | 790D019D2A2DCBD000C5978D /* UIView+CNGradient.swift in Sources */, |
| 813 | 824 | 798A44F72A3077ED00815935 /* CNLiveHotButton.swift in Sources */, |
| 814 | 825 | 7CD6753D2A2740B0008354C1 /* CNMainView.swift in Sources */, |
| ... | ... | @@ -843,6 +854,7 @@ |
| 843 | 854 | 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */, |
| 844 | 855 | 790D01912A2DAC5E00C5978D /* CNLiveConfigFontMacro.swift in Sources */, |
| 845 | 856 | 790D01852A2D89E100C5978D /* UIColor+CNHexColor.swift in Sources */, |
| 857 | + 790B1FB42A4153E90074CF00 /* CNLiveMineBaseModel.swift in Sources */, | |
| 846 | 858 | 7978A8432A396632007C86B8 /* CNLiveMineViewModel.swift in Sources */, |
| 847 | 859 | 798A44EE2A305AAC00815935 /* CNLiveBaseNavigationController.swift in Sources */, |
| 848 | 860 | 7CD675422A2740F8008354C1 /* CNCustomIndexView.swift in Sources */, |
| ... | ... | @@ -1048,7 +1060,7 @@ |
| 1048 | 1060 | "$(inherited)", |
| 1049 | 1061 | "@executable_path/Frameworks", |
| 1050 | 1062 | ); |
| 1051 | - MARKETING_VERSION = 1.0; | |
| 1063 | + MARKETING_VERSION = 0.9; | |
| 1052 | 1064 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.metaCode.debug; |
| 1053 | 1065 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 1054 | 1066 | SWIFT_EMIT_LOC_STRINGS = YES; |
| ... | ... | @@ -1082,7 +1094,7 @@ |
| 1082 | 1094 | "$(inherited)", |
| 1083 | 1095 | "@executable_path/Frameworks", |
| 1084 | 1096 | ); |
| 1085 | - MARKETING_VERSION = 1.0; | |
| 1097 | + MARKETING_VERSION = 0.9; | |
| 1086 | 1098 | PRODUCT_BUNDLE_IDENTIFIER = com.cnlive.metaCode.debug; |
| 1087 | 1099 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 1088 | 1100 | SWIFT_EMIT_LOC_STRINGS = YES; | ... | ... |
metaCode/Classes/Common/Base/CNLiveBaseTabBarViewController.swift
| ... | ... | @@ -34,6 +34,8 @@ class CNLiveBaseTabBarViewController: UITabBarController |
| 34 | 34 | |
| 35 | 35 | self.setUpTabBar() |
| 36 | 36 | self.setupBackgroup() |
| 37 | + | |
| 38 | + selectedIndex = 1 | |
| 37 | 39 | |
| 38 | 40 | } |
| 39 | 41 | |
| ... | ... | @@ -43,6 +45,12 @@ class CNLiveBaseTabBarViewController: UITabBarController |
| 43 | 45 | override func viewDidAppear(_ animated: Bool) { |
| 44 | 46 | super.viewDidAppear(animated) |
| 45 | 47 | print("获取用户用户数据=====>\(UserInfoManager.shared.userInfo.uid)") |
| 48 | + | |
| 49 | + CNLiveMineViewModel.requestSystemNews { result, respStatue in | |
| 50 | + if respStatue == .success { | |
| 51 | + UpdataAlertView.showUpdataView(updataModel: result as! UpdateInfoModel) | |
| 52 | + } | |
| 53 | + } | |
| 46 | 54 | } |
| 47 | 55 | // MARK: - 控制器的信息 |
| 48 | 56 | func setUpTabBar() { | ... | ... |
metaCode/Classes/Common/Util/CNLiveCommonQiniuTool.swift
| ... | ... | @@ -10,13 +10,12 @@ import Qiniu |
| 10 | 10 | import YYCategories |
| 11 | 11 | import CNLiveRequestBastKit |
| 12 | 12 | |
| 13 | -typealias ProgressBlcok = (String,CGFloat) | |
| 14 | -typealias SuccessBlock = (String,String) | |
| 13 | +typealias ProgressBlcok = (_ key: String,_ percent: CGFloat) -> Void | |
| 14 | +typealias SuccessBlock = (_ key: String,_ url: String) -> Void | |
| 15 | 15 | class UploadManager: NSObject { |
| 16 | 16 | |
| 17 | - var successBlock: SuccessBlock? | |
| 18 | - var progressBlcok: ProgressBlcok? | |
| 19 | - private var _qnUploadManager = QNUploadManager() | |
| 17 | + var uploadModels = NSMutableArray() | |
| 18 | + var qnUploadManager = QNUploadManager() | |
| 20 | 19 | static let shared = UploadManager() |
| 21 | 20 | private override init() { |
| 22 | 21 | super.init() |
| ... | ... | @@ -26,48 +25,77 @@ class UploadManager: NSObject { |
| 26 | 25 | builder?.recorder = try QNFileRecorder(folder: "元码") |
| 27 | 26 | } catch {} |
| 28 | 27 | } |
| 29 | - _qnUploadManager = QNUploadManager(configuration: config) | |
| 28 | + qnUploadManager = QNUploadManager(configuration: config) | |
| 30 | 29 | } |
| 31 | 30 | |
| 32 | 31 | |
| 33 | 32 | |
| 34 | - static func uploadImage(imageData: NSData, progressBlock: ProgressBlcok, successBlock: SuccessBlock) { | |
| 33 | + /// 上传图片 | |
| 34 | + /// - Parameters: | |
| 35 | + /// - imageData: 图片数据 | |
| 36 | + /// - progressBlock: 进度回调 | |
| 37 | + /// - successBlock: 成功回调 | |
| 38 | + static func uploadImage(imageData: NSData, progressBlock:@escaping ProgressBlcok, successBlock: @escaping SuccessBlock) { | |
| 35 | 39 | let key = UploadManager.createImageFileName() |
| 36 | - UploadManager.shared.successBlock = successBlock | |
| 37 | - UploadManager.shared.progressBlcok = progressBlock | |
| 38 | - UploadManager.uploadData(data: imageData, key: key) | |
| 40 | + UploadManager.uploadData(madiaData: imageData, key: key, progress: progressBlock, success: successBlock) | |
| 39 | 41 | } |
| 40 | 42 | |
| 41 | 43 | |
| 42 | 44 | |
| 43 | - /// 上传图片 | |
| 45 | + /// 上传到七牛 | |
| 44 | 46 | /// - Parameters: |
| 45 | 47 | /// - data: 上传数据 |
| 46 | 48 | /// - key: key |
| 47 | 49 | /// - uploadProgress: 上传进度 |
| 48 | 50 | /// - resultBlock: 结果 |
| 49 | - static private func uploadData(data: NSData, key: String) { | |
| 50 | - | |
| 51 | + static private func uploadData(madiaData: NSData, key: String, progress: ProgressBlcok?, success: SuccessBlock?) { | |
| 52 | + let param = NSMutableDictionary() | |
| 53 | + param.setValue(APPId, forKey: "appId") | |
| 54 | + param.setValue("POST", forKey: "verb") | |
| 55 | + param.setValue("2", forKey: "storageType") | |
| 56 | + param.setValue(kBucketName_QN, forKey: "bucket") | |
| 57 | + showLoading(message: "上传处理中...") | |
| 51 | 58 | CNLiveNetworking.setAllowRequestDefaultArgument(true) |
| 52 | 59 | CNLiveNetworking.setupShowDataResult(false) |
| 53 | - CNLiveNetworking.requestNetwork(with: .POST, urlString: "\(CNLiveEnvironmentManager.shared.baseUrl_shop)/Api/Index3/getQiniuToken", param: [:], cacheType: .networkOnly) { task, result, error in | |
| 60 | + CNLiveNetworking.requestNetwork(with: .POST, urlString: "\(CNLiveEnvironmentManager.shared.img_token_url)/vod_epg/getUploadAuthForApp", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in | |
| 61 | + hiddenLoading() | |
| 54 | 62 | if (error == nil) { |
| 55 | 63 | let resp = result as! NSDictionary |
| 56 | - let errorCode = "\(resp["code"] ?? 0)" | |
| 64 | + let errorCode = "\(resp["errorCode"] ?? 0)" | |
| 57 | 65 | if (errorCode == "0") { |
| 58 | 66 | let data = resp["data"] as! Dictionary<String, Any> |
| 59 | 67 | let token = data["token"] as! String |
| 60 | 68 | if token.isNotBlank() { |
| 61 | - var uploadModel = QiNiuUploadModel.init() | |
| 69 | + let uploadModel = QiNiuUploadModel.init() | |
| 62 | 70 | uploadModel.isCancel = false |
| 63 | 71 | uploadModel.key = key |
| 64 | 72 | let uploadOption = QNUploadOption.init(mime: nil, progressHandler: { key, percent in |
| 65 | 73 | DispatchQueue.main.async { |
| 66 | -// UploadManager.shared.progressBlock | |
| 74 | + progress!(key!, CGFloat(percent)) | |
| 67 | 75 | } |
| 68 | 76 | }, params: nil, checkCrc: false) { |
| 69 | 77 | return uploadModel.isCancel |
| 70 | 78 | } |
| 79 | + uploadModel.uploadOption = uploadOption! | |
| 80 | + UploadManager.shared.uploadModels.add(uploadModel) | |
| 81 | + showLoading(message: "上传中...") | |
| 82 | + let url_key = "http://wjjtest.ys2.cnliveimg.com/"+key | |
| 83 | + UploadManager.shared.qnUploadManager?.put(madiaData as Data, key: key, token: token, complete: { info, key, resp in | |
| 84 | + hiddenLoading() | |
| 85 | + //删除上传选项 | |
| 86 | + UploadManager.shared.uploadModels.remove(uploadModel) | |
| 87 | + if info?.statusCode == 200 { | |
| 88 | + if success != nil { | |
| 89 | + success!(key!, url_key) | |
| 90 | + } | |
| 91 | + } else { | |
| 92 | + if info?.statusCode == -999 { | |
| 93 | + showMessage(message: "上传取消") | |
| 94 | + } else { | |
| 95 | + showLoading(message: "上传失败") | |
| 96 | + } | |
| 97 | + } | |
| 98 | + }, option: uploadOption) | |
| 71 | 99 | } |
| 72 | 100 | } else { |
| 73 | 101 | showMessage(message: resp["message"] as! String) |
| ... | ... | @@ -81,9 +109,7 @@ class UploadManager: NSObject { |
| 81 | 109 | /// 设置图片名称 |
| 82 | 110 | /// - Returns: 图片名 |
| 83 | 111 | static private func createImageFileName() -> String { |
| 84 | - let date = NSDate() | |
| 85 | - let currentTimeInterval = NSDate(timeIntervalSince1970: 0) | |
| 86 | - let imageName = "802/mateCode/img/\(date.string(withFormat: "yyyyMMdd") ?? "0000")/\(arc4random()%10).jpg" | |
| 112 | + let imageName = "802/mateCode/img/\(NSDate().string(withFormat: "yyyyMMdd") ?? "0000")/\(arc4random()).jpg" | |
| 87 | 113 | return imageName |
| 88 | 114 | } |
| 89 | 115 | } | ... | ... |
metaCode/Classes/Constant/CNLiveConstant.swift
| ... | ... | @@ -19,6 +19,9 @@ let KNavigationHeight:CGFloat = (KStatusBarHeight + 44) |
| 19 | 19 | ///tabbar高度 |
| 20 | 20 | let KTabBarHeight:CGFloat = (KStatusBarHeight == 44 ? 83 : 49) |
| 21 | 21 | |
| 22 | +//MARK: - 常用三方key | |
| 23 | +let kBucketName_QN:String = "mam-wjjtest-802" | |
| 24 | + | |
| 22 | 25 | //MARK: - 常用背景色 |
| 23 | 26 | ///控制器背景色 |
| 24 | 27 | let KVCBackgroupColor = UIColor("#F9F9F9") | ... | ... |
metaCode/Classes/Environment/CNLiveEnvironment.swift
| ... | ... | @@ -15,6 +15,8 @@ let APPKey: String = CNLiveEnvironmentManager.shared.appKey |
| 15 | 15 | let APPBaseUrl: String! = CNLiveEnvironmentManager.shared.baseUrl |
| 16 | 16 | ///当前应用的Secret |
| 17 | 17 | let APPSecret: String = CNLiveEnvironmentManager.shared.appSecret |
| 18 | +///当前应用的部分请求接口 | |
| 19 | +let APPBaseMCUrl: String = CNLiveEnvironmentManager.shared.base_mc_url | |
| 18 | 20 | |
| 19 | 21 | ///当前APP的环境 |
| 20 | 22 | let APPCurrentEnvironment: CNLiveEnvironment = CNLiveEnvironmentManager.shared.currentEnvironment |
| ... | ... | @@ -46,7 +48,9 @@ class CNLiveEnvironmentManager: NSObject{ |
| 46 | 48 | var appKey: String |
| 47 | 49 | var baseUrl: String |
| 48 | 50 | var appSecret: String |
| 49 | - var baseUrl_shop: String | |
| 51 | + var base_mc_url: String | |
| 52 | + var img_token_url: String | |
| 53 | + | |
| 50 | 54 | |
| 51 | 55 | ///当前环境 |
| 52 | 56 | var currentEnvironment: CNLiveEnvironment |
| ... | ... | @@ -57,7 +61,8 @@ class CNLiveEnvironmentManager: NSObject{ |
| 57 | 61 | self.appKey = "" |
| 58 | 62 | self.baseUrl = "" |
| 59 | 63 | self.appSecret = "" |
| 60 | - self.baseUrl_shop = "" | |
| 64 | + self.base_mc_url = "" | |
| 65 | + self.img_token_url = "" | |
| 61 | 66 | self.currentEnvironment = .development |
| 62 | 67 | } |
| 63 | 68 | //重新copy 和 mutableCopy 方法 |
| ... | ... | @@ -90,7 +95,8 @@ class CNLiveEnvironmentManager: NSObject{ |
| 90 | 95 | self.appKey = "ae3a7ad3e4b9beb7cfe2078db648ebb89aa249ca2e82ac" |
| 91 | 96 | self.appSecret = "3cc9f12db322a3d3656012ef929604cf6d6847471535f9" |
| 92 | 97 | self.baseUrl = "https://api.cnlive.com" |
| 93 | - self.baseUrl_shop = "https://wjjshop.cnlive.com" | |
| 98 | + self.img_token_url = "https://api.cnlive.com/open/api2" | |
| 99 | + self.base_mc_url = "https://metacode.cnlive.com/api" | |
| 94 | 100 | } |
| 95 | 101 | //testFlight 环境配置 |
| 96 | 102 | func testFlightEnvironment(){ |
| ... | ... | @@ -98,7 +104,8 @@ class CNLiveEnvironmentManager: NSObject{ |
| 98 | 104 | self.appKey = "ae3a7ad3e4b9beb7cfe2078db648ebb89aa249ca2e82ac" |
| 99 | 105 | self.appSecret = "3cc9f12db322a3d3656012ef929604cf6d6847471535f9" |
| 100 | 106 | self.baseUrl = "https://api.cnlive.com" |
| 101 | - self.baseUrl_shop = "https://wjjshop.cnlive.com" | |
| 107 | + self.img_token_url = "https://api.cnlive.com/open/api2" | |
| 108 | + self.base_mc_url = "https://metacode.cnlive.com/api" | |
| 102 | 109 | } |
| 103 | 110 | //production 生产环境配置 |
| 104 | 111 | func productionEnvironment(){ |
| ... | ... | @@ -106,7 +113,8 @@ class CNLiveEnvironmentManager: NSObject{ |
| 106 | 113 | self.appKey = "064f392f84dfe7bbe9f1eabeda53ea02044213019b0406" |
| 107 | 114 | self.appSecret = "68b5cc42fbdb466d56c2e22b00b1494feec8149f9dd32e" |
| 108 | 115 | self.baseUrl = "https://api.cnlive.com" |
| 109 | - self.baseUrl_shop = "https://managemall.cnlive.com" | |
| 116 | + self.img_token_url = "https://api.cnlive.com/open/api2" | |
| 117 | + self.base_mc_url = "https://metacode.cnlive.com/api" | |
| 110 | 118 | } |
| 111 | 119 | |
| 112 | 120 | } | ... | ... |
metaCode/Classes/Extensions/NSObject+CNLiveJSONTool.swift
| ... | ... | @@ -35,7 +35,7 @@ func jsonArrayToModel(_ jsonArrayStr:String, _ modelType:HandyJSON.Type) ->[Base |
| 35 | 35 | let data = jsonArrayStr.data(using: String.Encoding.utf8) |
| 36 | 36 | let peoplesArray = try! JSONSerialization.jsonObject(with:data!, options: JSONSerialization.ReadingOptions()) as? [AnyObject] |
| 37 | 37 | for people in peoplesArray! { |
| 38 | - modelArray.append(dictionaryToModel(people as! [String : Any], modelType)) | |
| 38 | + modelArray.append(dictionaryToModel(people as! [String : Any], modelType,"")) | |
| 39 | 39 | } |
| 40 | 40 | return modelArray |
| 41 | 41 | |
| ... | ... | @@ -43,14 +43,14 @@ func jsonArrayToModel(_ jsonArrayStr:String, _ modelType:HandyJSON.Type) ->[Base |
| 43 | 43 | /** |
| 44 | 44 | * 字典转对象 |
| 45 | 45 | */ |
| 46 | -func dictionaryToModel(_ dictionStr:[String:Any],_ modelType:HandyJSON.Type) -> BaseModel { | |
| 46 | +func dictionaryToModel(_ dictionStr:[String:Any],_ modelType:HandyJSON.Type,_ path: String) -> BaseModel { | |
| 47 | 47 | if dictionStr.count == 0 { |
| 48 | 48 | #if DEBUG |
| 49 | 49 | print("dictionaryToModel:字符串为空") |
| 50 | 50 | #endif |
| 51 | 51 | return BaseModel() |
| 52 | 52 | } |
| 53 | - return modelType.deserialize(from: dictionStr) as! BaseModel | |
| 53 | + return modelType.deserialize(from: dictionStr, designatedPath: path) as! BaseModel | |
| 54 | 54 | } |
| 55 | 55 | |
| 56 | 56 | /** | ... | ... |
metaCode/Classes/Extensions/UIImage+CNLiveColorImage.swift
0 → 100644
| 1 | +// | |
| 2 | +// UIImage+CNLiveColorImage.swift | |
| 3 | +// metaCode | |
| 4 | +// | |
| 5 | +// Created by open on 2023/6/20. | |
| 6 | +// | |
| 7 | + | |
| 8 | +import Foundation | |
| 9 | + | |
| 10 | +extension UIImage { | |
| 11 | + class func imageWithColor(color: UIColor, size: CGSize) -> UIImage { | |
| 12 | + let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) | |
| 13 | + UIGraphicsBeginImageContextWithOptions(rect.size, false, 0) | |
| 14 | + let context = UIGraphicsGetCurrentContext() | |
| 15 | + context?.setFillColor(color.cgColor) | |
| 16 | + context?.fill(rect) | |
| 17 | + let image = UIGraphicsGetImageFromCurrentImageContext() | |
| 18 | + UIGraphicsEndImageContext() | |
| 19 | + return image! | |
| 20 | + } | |
| 21 | +} | ... | ... |
metaCode/Classes/Main/LoginPage/Controller/CNLiveLoginViewController.swift
| ... | ... | @@ -254,17 +254,17 @@ class CNLiveLoginViewController : CNLiveBaseViewController, UITextViewDelegate { |
| 254 | 254 | extension CNLiveLoginViewController { |
| 255 | 255 | |
| 256 | 256 | @objc func changeCityNumberMothod(sender : UIButton) { |
| 257 | - CNLiveLoginPickerView.showSelectView { [self] text in | |
| 258 | - country = text | |
| 259 | - areaButton.setTitle("+\(text)", for: .normal) | |
| 260 | - areaButton.setTitle("+\(text)", for: .highlighted) | |
| 257 | + CNLiveLoginPickerView.showSelectView { [weak self] text in | |
| 258 | + self!.country = text | |
| 259 | + self!.areaButton.setTitle("+\(text)", for: .normal) | |
| 260 | + self!.areaButton.setTitle("+\(text)", for: .highlighted) | |
| 261 | 261 | } |
| 262 | 262 | } |
| 263 | 263 | |
| 264 | 264 | @objc func sendVerifiCodeMothod(sender : UIButton) { |
| 265 | 265 | view.endEditing(true) |
| 266 | - CNLiveLoginViewModel.requestVerCodeAction(phone: phoneText.text ?? "", code: country) { [self] in | |
| 267 | - setupCountdownAction(sender: sender) | |
| 266 | + CNLiveLoginViewModel.requestVerCodeAction(phone: phoneText.text ?? "", code: country) { [weak self] in | |
| 267 | + self!.setupCountdownAction(sender: sender) | |
| 268 | 268 | } |
| 269 | 269 | } |
| 270 | 270 | ... | ... |
metaCode/Classes/Main/LoginPage/ViewModel/CNLiveLoginViewModel.swift
| ... | ... | @@ -17,6 +17,11 @@ typealias resultLoginBlock = () -> Void |
| 17 | 17 | |
| 18 | 18 | class CNLiveLoginViewModel : NSObject { |
| 19 | 19 | |
| 20 | + /// 获取验证码 | |
| 21 | + /// - Parameters: | |
| 22 | + /// - phone: 手机号 | |
| 23 | + /// - code: 验证码 | |
| 24 | + /// - resultBlock: 登陆结果 | |
| 20 | 25 | static func requestVerCodeAction(phone: String, code: String, resultBlock: @escaping resultCodeBlock) { |
| 21 | 26 | |
| 22 | 27 | if !phone.isNotBlank() { |
| ... | ... | @@ -52,6 +57,12 @@ class CNLiveLoginViewModel : NSObject { |
| 52 | 57 | } |
| 53 | 58 | } |
| 54 | 59 | |
| 60 | + /// 登陆 | |
| 61 | + /// - Parameters: | |
| 62 | + /// - userName: 手机号 | |
| 63 | + /// - countryCode: 国家区号 | |
| 64 | + /// - verCode: 验证码 | |
| 65 | + /// - resultBlock: 结果回调 | |
| 55 | 66 | static func requestLoginAction(userName: String, countryCode: String, verCode: String, resultBlock: @escaping resultLoginBlock) { |
| 56 | 67 | if !userName.isNotBlank() { |
| 57 | 68 | showMessage(message: "请输入手机号") |
| ... | ... | @@ -91,7 +102,7 @@ class CNLiveLoginViewModel : NSObject { |
| 91 | 102 | if resp.allKeys.contains(where: { item in |
| 92 | 103 | return item as! String == "data" |
| 93 | 104 | }) { |
| 94 | - let userInfoModel = dictionaryToModel(resp["data"] as! [String : Any], UserInfoModel.self) | |
| 105 | + let userInfoModel = dictionaryToModel(resp as! [String : Any], UserInfoModel.self,"data") | |
| 95 | 106 | UserInfoManager.cacheUserInfo(userInfo: userInfoModel as! UserInfoModel) |
| 96 | 107 | UserDefaults.standard.set(true,forKey: "is_login") |
| 97 | 108 | resultBlock() |
| ... | ... | @@ -103,22 +114,5 @@ class CNLiveLoginViewModel : NSObject { |
| 103 | 114 | showMessage(message: "登陆失败") |
| 104 | 115 | } |
| 105 | 116 | } |
| 106 | -// DispatchQueue.main.asyncAfter(deadline: .now()+0.5, execute: { | |
| 107 | -// hiddenLoading() | |
| 108 | -// let resp = CNLiveLoginViewModel.dict() as NSDictionary | |
| 109 | -// let errorCode = resp["errorCode"] | |
| 110 | -// if (errorCode as! String == "0") { | |
| 111 | -// if resp.allKeys.contains(where: { item in | |
| 112 | -// return item as! String == "data" | |
| 113 | -// }) { | |
| 114 | -// let userInfoModel = JsonUtil.dictionaryToModel(resp["data"] as! [String : Any], UserInfoModel.self) | |
| 115 | -// UserInfoManager.cacheUserInfo(userInfo: userInfoModel as! UserInfoModel) | |
| 116 | -// UserDefaults.standard.set(true,forKey: "is_login") | |
| 117 | -// resultBlock() | |
| 118 | -// } | |
| 119 | -// } else { | |
| 120 | -// showMessage(message: resp["errorMessage"] as! String) | |
| 121 | -// } | |
| 122 | -// }) | |
| 123 | 117 | } |
| 124 | 118 | } | ... | ... |
metaCode/Classes/Main/MinePage/Controller/CNLiveInputFeedBackViewController.swift
| ... | ... | @@ -59,12 +59,14 @@ class CNLiveInputFeedBackViewController: CNLiveBaseViewController, UITextViewDel |
| 59 | 59 | }() |
| 60 | 60 | |
| 61 | 61 | lazy var photoView: MinePhotoUploadView = { |
| 62 | - let pView = MinePhotoUploadView.init(frame: .zero) { [self] index in | |
| 62 | + | |
| 63 | + let pView = MinePhotoUploadView.init(frame: .zero, resutBlock: { [weak self] index, imageUrl in | |
| 63 | 64 | let mString = NSMutableAttributedString(string: "上传截图 (选填 \(index)/3)") |
| 64 | 65 | mString.addAttributes([.foregroundColor: UIColor.black,.font: BoldFont_18], range: NSRange(location: 0, length: 4)) |
| 65 | 66 | mString.addAttributes([.foregroundColor: HexColor("#B4B4B4")!,.font: Font_14], range: NSRange(location: 4, length: 9)) |
| 66 | - photoLabel.attributedText = mString | |
| 67 | - } | |
| 67 | + self!.photoLabel.attributedText = mString | |
| 68 | + self!.imageUrlArray.replaceObject(at: Int(index)! - 1, with: imageUrl) | |
| 69 | + }) | |
| 68 | 70 | pView.backgroundColor = .clear |
| 69 | 71 | return pView |
| 70 | 72 | }() |
| ... | ... | @@ -109,6 +111,8 @@ class CNLiveInputFeedBackViewController: CNLiveBaseViewController, UITextViewDel |
| 109 | 111 | return sendButton |
| 110 | 112 | }() |
| 111 | 113 | |
| 114 | + lazy var imageUrlArray: NSMutableArray = ["","",""] | |
| 115 | + | |
| 112 | 116 | required init?(coder aDecoder:NSCoder) { |
| 113 | 117 | fatalError("init(coder:) has not been implemented") |
| 114 | 118 | } |
| ... | ... | @@ -208,9 +212,12 @@ class CNLiveInputFeedBackViewController: CNLiveBaseViewController, UITextViewDel |
| 208 | 212 | } |
| 209 | 213 | |
| 210 | 214 | @objc func sendInfoActionMothod() { |
| 211 | - let array = photoView.selectedImages | |
| 212 | - array.remove("") | |
| 213 | - print("获取的图片:\(array) 内容:\(p_textView.text ?? "") 手机号:\(mobileField.text ?? "")") | |
| 215 | + CNLiveMineViewModel.requestFeedBack(text: p_textView.text ?? "", contactWay: UserInfoManager.shared.userInfo.mobile, images: imageUrlArray) { result in | |
| 216 | + if result { | |
| 217 | + showMessage(message: "内容提交成功") | |
| 218 | + self.navigationController?.popViewController(animated: true) | |
| 219 | + } | |
| 220 | + } | |
| 214 | 221 | } |
| 215 | 222 | } |
| 216 | 223 | ... | ... |
metaCode/Classes/Main/MinePage/Controller/CNLiveMineAddInfoViewController.swift
| ... | ... | @@ -14,6 +14,7 @@ enum CNLiveMineInfoShowType { |
| 14 | 14 | case message//消息中心 |
| 15 | 15 | } |
| 16 | 16 | |
| 17 | + | |
| 17 | 18 | class CNLiveMineAddInfoViewController : CNLiveBaseViewController, UITableViewDelegate, UITableViewDataSource, UITableViewDragDelegate, UITableViewDropDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate{ |
| 18 | 19 | |
| 19 | 20 | let kCNLiveMineInfoLListTableViewIdentifier = "kCNLiveMineInfoLListTableViewIdentifier" |
| ... | ... | @@ -37,7 +38,7 @@ class CNLiveMineAddInfoViewController : CNLiveBaseViewController, UITableViewDel |
| 37 | 38 | }() |
| 38 | 39 | |
| 39 | 40 | lazy var dataArray: NSMutableArray = { |
| 40 | - let dataArray = NSMutableArray() | |
| 41 | + var dataArray = NSMutableArray() | |
| 41 | 42 | if _show_type == .add { |
| 42 | 43 | dataArray.add(["image":"mine_header_icon_defult_ava","name":"志愿者身份"]) |
| 43 | 44 | dataArray.add(["image":"mine_header_icon_defult_ava","name":"退伍军人身份"]) |
| ... | ... | @@ -46,13 +47,14 @@ class CNLiveMineAddInfoViewController : CNLiveBaseViewController, UITableViewDel |
| 46 | 47 | dataArray.add(["image":"mine_header_icon_defult_ava","name":"志愿者身份","number":"证件编号:410800111127954"]) |
| 47 | 48 | dataArray.add(["image":"mine_header_icon_defult_ava","name":"退伍军人身份","number":"证件编号:410800111127954"]) |
| 48 | 49 | } |
| 49 | - if _show_type == .message { | |
| 50 | -// dataArray.add(["image":"mine_header_icon_defult_ava","name":"志愿者云","number":"志愿者大礼包发放中,快来领取吧!","time":"03-12"]) | |
| 51 | -// dataArray.add(["image":"mine_header_icon_defult_ava","name":"志愿者·志愿云","number":"志愿者大礼包快来领取吧~","time":"03-12"]) | |
| 52 | - } | |
| 53 | 50 | return dataArray |
| 54 | 51 | }() |
| 55 | 52 | |
| 53 | + private lazy var listArray: Array<NewsListModel> = { | |
| 54 | + let listArray = Array<NewsListModel>() | |
| 55 | + return listArray | |
| 56 | + }() | |
| 57 | + | |
| 56 | 58 | lazy var setButton = { |
| 57 | 59 | let setButton = UIButton.init(type: .custom) |
| 58 | 60 | setButton.frame = CGRectMake(KSreenWidth - 35, (get_system_nav_height() - (get_system_statusBar_height() + 20))/2 + get_system_statusBar_height(), 20, 20) |
| ... | ... | @@ -73,6 +75,7 @@ class CNLiveMineAddInfoViewController : CNLiveBaseViewController, UITableViewDel |
| 73 | 75 | return copyButton |
| 74 | 76 | }() |
| 75 | 77 | |
| 78 | + var network_type: CNLiveMineResponseType! | |
| 76 | 79 | var _show_type:CNLiveMineInfoShowType! |
| 77 | 80 | init(show_type:CNLiveMineInfoShowType) { |
| 78 | 81 | super.init(nibName:nil, bundle:nil) |
| ... | ... | @@ -93,8 +96,10 @@ class CNLiveMineAddInfoViewController : CNLiveBaseViewController, UITableViewDel |
| 93 | 96 | tableView.dragInteractionEnabled = true |
| 94 | 97 | case .message: |
| 95 | 98 | titleName = "消息中心" |
| 96 | - topNavView.addSubview(setButton) | |
| 97 | - topNavView.addSubview(copyButton) | |
| 99 | + loadData() | |
| 100 | +// topNavView.addSubview(setButton) | |
| 101 | +// topNavView.addSubview(copyButton) | |
| 102 | + | |
| 98 | 103 | case .none: |
| 99 | 104 | break |
| 100 | 105 | } |
| ... | ... | @@ -107,6 +112,21 @@ class CNLiveMineAddInfoViewController : CNLiveBaseViewController, UITableViewDel |
| 107 | 112 | } |
| 108 | 113 | } |
| 109 | 114 | |
| 115 | + func loadData() { | |
| 116 | + CNLiveMineViewModel.requestMessage { [weak self] result, respStatue in | |
| 117 | + self!.network_type = respStatue | |
| 118 | + if respStatue == .success { | |
| 119 | + DispatchQueue.main.asyncAfter(deadline: .now()+2) { | |
| 120 | + self!.listArray = (result as! NewsModel).list | |
| 121 | + self!.tableView.reloadData() | |
| 122 | + } | |
| 123 | + }else{ | |
| 124 | + self!.tableView.reloadEmptyDataSet() | |
| 125 | + } | |
| 126 | + } | |
| 127 | + } | |
| 128 | + | |
| 129 | + | |
| 110 | 130 | @objc func noteSetAction() { |
| 111 | 131 | |
| 112 | 132 | } |
| ... | ... | @@ -117,23 +137,52 @@ class CNLiveMineAddInfoViewController : CNLiveBaseViewController, UITableViewDel |
| 117 | 137 | |
| 118 | 138 | extension CNLiveMineAddInfoViewController { |
| 119 | 139 | func image(forEmptyDataSet scrollView: UIScrollView!) -> UIImage! { |
| 120 | - return UIImage(named: "mine_list_source_empty") | |
| 140 | + if network_type == .failed || network_type == .unkonw { | |
| 141 | + return UIImage(named: "mine_list_source_unusual_failed") | |
| 142 | + } | |
| 143 | + if _show_type == .message && listArray.count == 0 { | |
| 144 | + return UIImage(named: "mine_list_source_unusual_empty") | |
| 145 | + } | |
| 146 | + if network_type == .noNetwork { | |
| 147 | + return UIImage(named: "mine_list_source_unusual_noNet") | |
| 148 | + } | |
| 149 | + return UIImage(named: "mine_list_source_unusual_empty") | |
| 121 | 150 | } |
| 122 | 151 | |
| 123 | 152 | func title(forEmptyDataSet scrollView: UIScrollView!) -> NSAttributedString! { |
| 124 | 153 | var defult_string = "" |
| 154 | + if network_type == .failed || network_type == .unkonw { | |
| 155 | + defult_string = "接口请求错误,刷新试试~" | |
| 156 | + } | |
| 157 | + if network_type == .noNetwork { | |
| 158 | + defult_string = "网络开小差了,刷新试试~" | |
| 159 | + } | |
| 125 | 160 | switch _show_type { |
| 126 | 161 | case .add: |
| 127 | 162 | defult_string = "暂时没有可添加的身份~" |
| 128 | 163 | case .info: |
| 129 | 164 | defult_string = "暂时没有身份信息~" |
| 130 | 165 | case .message: |
| 131 | - defult_string = "暂时没有可读的消息~" | |
| 166 | + if listArray.count == 0 && network_type == .success{ | |
| 167 | + defult_string = "暂时没有可读的消息~" | |
| 168 | + } | |
| 132 | 169 | case .none: |
| 133 | 170 | break |
| 134 | 171 | } |
| 135 | 172 | return NSAttributedString(string: defult_string, attributes: [.font: Font_17,.foregroundColor: HexColor("#666666")!]) |
| 136 | 173 | } |
| 174 | + func buttonTitle(forEmptyDataSet scrollView: UIScrollView!, for state: UIControl.State) -> NSAttributedString! { | |
| 175 | + if _show_type == .message && (network_type == .failed || network_type == .noNetwork) { | |
| 176 | + let attributes = [NSAttributedString.Key.font:Font_16_Fit, | |
| 177 | + NSAttributedString.Key.foregroundColor: HexColor("#609BFF")] | |
| 178 | + return NSAttributedString(string: "刷新", attributes: attributes as [NSAttributedString.Key : Any]) | |
| 179 | + } | |
| 180 | + return nil | |
| 181 | + } | |
| 182 | + | |
| 183 | + func emptyDataSet(_ scrollView: UIScrollView!, didTap button: UIButton!) { | |
| 184 | + loadData() | |
| 185 | + } | |
| 137 | 186 | |
| 138 | 187 | } |
| 139 | 188 | |
| ... | ... | @@ -143,6 +192,9 @@ extension CNLiveMineAddInfoViewController { |
| 143 | 192 | return 1 |
| 144 | 193 | } |
| 145 | 194 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
| 195 | + if _show_type == .message { | |
| 196 | + return listArray.count | |
| 197 | + } | |
| 146 | 198 | return dataArray.count |
| 147 | 199 | } |
| 148 | 200 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
| ... | ... | @@ -159,8 +211,8 @@ extension CNLiveMineAddInfoViewController { |
| 159 | 211 | guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveMineStandInfoTableViewIdentifier) as? MineStandInfoTableViewCell else { |
| 160 | 212 | return MineStandInfoTableViewCell() |
| 161 | 213 | } |
| 162 | - let dict = dataArray[indexPath.row] as! Dictionary<String, Any> | |
| 163 | - cell.setupWithDataSource(icon: dict["image"] as! String, name: dict["name"] as! String,number: dict["number"] as! String, time: dict["time"] as! String) | |
| 214 | + let listModel = listArray[indexPath.row] | |
| 215 | + cell.setupWithDataSource(icon: listModel.poster, name: listModel.title,number: listModel.subTitle, time: listModel.createTimeString) | |
| 164 | 216 | cell.userInteractionEnabledWhileDragging = true |
| 165 | 217 | return cell |
| 166 | 218 | } else { |
| ... | ... | @@ -173,6 +225,12 @@ extension CNLiveMineAddInfoViewController { |
| 173 | 225 | return cell |
| 174 | 226 | } |
| 175 | 227 | } |
| 228 | + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { | |
| 229 | + if _show_type == .message { | |
| 230 | + let listModel = listArray[indexPath.row] | |
| 231 | + self.navigationController?.pushViewController(CNLiveMineMessageViewController.init(listModel: listModel), animated: true) | |
| 232 | + } | |
| 233 | + } | |
| 176 | 234 | func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { |
| 177 | 235 | return 100 |
| 178 | 236 | } | ... | ... |
metaCode/Classes/Main/MinePage/Controller/CNLiveMineInfoViewController.swift
| ... | ... | @@ -123,10 +123,12 @@ class CNLiveMineInfoViewController: CNLiveBaseViewController, PhotoPickerControl |
| 123 | 123 | } |
| 124 | 124 | |
| 125 | 125 | @objc func changeSendAction() { |
| 126 | - CNLiveMineViewModel.requestUploadIconAction(_select_image) { [self] in | |
| 127 | - //再这里进行图片上传 | |
| 128 | - self.reslut(_select_image) | |
| 129 | - self.navigationController?.popViewController(animated: true) | |
| 126 | + CNLiveMineViewModel.requestUploadIconAction(_select_image) { [weak self] statue in | |
| 127 | + if statue { | |
| 128 | + //再这里进行图片上传 | |
| 129 | + self!.reslut(self!._select_image) | |
| 130 | + self!.navigationController?.popViewController(animated: true) | |
| 131 | + } | |
| 130 | 132 | } |
| 131 | 133 | } |
| 132 | 134 | |
| ... | ... | @@ -153,17 +155,17 @@ extension CNLiveMineInfoViewController { |
| 153 | 155 | |
| 154 | 156 | func pickerController(_ pickerController: PhotoPickerController, |
| 155 | 157 | didFinishSelection result: PickerResult) { |
| 156 | - result.getImage { [self] (image, photoAsset, index) in | |
| 158 | + result.getImage { [weak self] (image, photoAsset, index) in | |
| 157 | 159 | if let image = image { |
| 158 | - _select_image = image | |
| 160 | + self!._select_image = image | |
| 159 | 161 | }else { |
| 160 | 162 | print("failed") |
| 161 | 163 | } |
| 162 | - } completionHandler: { [self] (images) in | |
| 163 | - imageView.image = images.first | |
| 164 | - cancelBtn.isHidden = false | |
| 165 | - sendBtn.isHidden = false | |
| 166 | - changeBtn.isHidden = true | |
| 164 | + } completionHandler: { [weak self] (images) in | |
| 165 | + self!.imageView.image = images.first | |
| 166 | + self!.cancelBtn.isHidden = false | |
| 167 | + self!.sendBtn.isHidden = false | |
| 168 | + self!.changeBtn.isHidden = true | |
| 167 | 169 | } |
| 168 | 170 | } |
| 169 | 171 | } | ... | ... |
metaCode/Classes/Main/MinePage/Controller/CNLiveMineMessageViewController.swift
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveMineMessageViewController.swift | |
| 3 | +// metaCode | |
| 4 | +// | |
| 5 | +// Created by open on 2023/6/20. | |
| 6 | +// | |
| 7 | + | |
| 8 | +import Foundation | |
| 9 | + | |
| 10 | +class CNLiveMineMessageViewController: CNLiveBaseViewController, UITableViewDelegate, UITableViewDataSource { | |
| 11 | + | |
| 12 | + let kCNLiveMineMessageIdentifier = "kCNLiveMineMessageIdentifier" | |
| 13 | + var _listModel : NewsListModel! | |
| 14 | + init(listModel: NewsListModel) { | |
| 15 | + super.init(nibName: nil, bundle: nil) | |
| 16 | + _listModel = listModel | |
| 17 | + } | |
| 18 | + | |
| 19 | + required init?(coder: NSCoder) { | |
| 20 | + fatalError("init(coder:) has not been implemented") | |
| 21 | + } | |
| 22 | + | |
| 23 | + lazy var tableView: UITableView = { | |
| 24 | + let tableView = UITableView(frame: .zero, style: .plain) | |
| 25 | + tableView.backgroundColor = HexColor("#F7F8FA") | |
| 26 | + tableView.delegate = self | |
| 27 | + tableView.dataSource = self | |
| 28 | + tableView.separatorStyle = .none | |
| 29 | + tableView.tableFooterView = UIView.init() | |
| 30 | + tableView.tableHeaderView = UIView.init() | |
| 31 | + tableView.register(MessageDescTableViewCell.self, forCellReuseIdentifier: kCNLiveMineMessageIdentifier) | |
| 32 | + return tableView | |
| 33 | + }() | |
| 34 | + | |
| 35 | + override func viewDidLoad() { | |
| 36 | + super.viewDidLoad() | |
| 37 | + navigationBarHidden = false | |
| 38 | + titleName = _listModel.title | |
| 39 | + | |
| 40 | + view.addSubview(tableView) | |
| 41 | + tableView.snp.makeConstraints { make in | |
| 42 | + make.top.equalTo(get_system_nav_height()) | |
| 43 | + make.left.right.bottom.equalToSuperview() | |
| 44 | + } | |
| 45 | + } | |
| 46 | + | |
| 47 | +} | |
| 48 | + | |
| 49 | +extension CNLiveMineMessageViewController { | |
| 50 | + func numberOfSections(in tableView: UITableView) -> Int { | |
| 51 | + return 1 | |
| 52 | + } | |
| 53 | + | |
| 54 | + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | |
| 55 | + return 1 | |
| 56 | + } | |
| 57 | + | |
| 58 | + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { | |
| 59 | + guard let cell = tableView.dequeueReusableCell(withIdentifier: kCNLiveMineMessageIdentifier) as? MessageDescTableViewCell else { | |
| 60 | + return MessageDescTableViewCell() | |
| 61 | + } | |
| 62 | + cell.setupWithDataSource(listModel: _listModel) | |
| 63 | + return cell | |
| 64 | + } | |
| 65 | + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { | |
| 66 | + return 100 + _listModel.textHeight | |
| 67 | + } | |
| 68 | + | |
| 69 | +} | ... | ... |
metaCode/Classes/Main/MinePage/Controller/CNLiveMineNickViewController.swift
| ... | ... | @@ -86,10 +86,12 @@ class CNLiveMineNickViewController: CNLiveBaseViewController, UITextFieldDelegat |
| 86 | 86 | |
| 87 | 87 | |
| 88 | 88 | @objc func clickSaveAction() { |
| 89 | - CNLiveMineViewModel.requestUpdateUserInfoAction(type: .nickName, value: nickField.text ?? "", resultBlock: { [self] in | |
| 90 | - let userInfo = UserInfoManager.shared.userInfo | |
| 91 | - userInfo.nickName = nickField.text ?? "" | |
| 92 | - UserInfoManager.cacheUserInfo(userInfo: userInfo) | |
| 89 | + CNLiveMineViewModel.requestUpdateUserInfoAction(type: .nickName, value: nickField.text ?? "", resultBlock: { [weak self] result in | |
| 90 | + if result { | |
| 91 | + let userInfo = UserInfoManager.shared.userInfo | |
| 92 | + userInfo.nickName = self!.nickField.text ?? "" | |
| 93 | + UserInfoManager.cacheUserInfo(userInfo: userInfo) | |
| 94 | + } | |
| 93 | 95 | }) |
| 94 | 96 | } |
| 95 | 97 | ... | ... |
metaCode/Classes/Main/MinePage/Controller/CNLiveTypeFeedBackViewController.swift
| ... | ... | @@ -287,13 +287,13 @@ extension CNLiveTypeFeedBackViewController { |
| 287 | 287 | self.navigationController?.pushViewController(mineInfoVC, animated: true) |
| 288 | 288 | } |
| 289 | 289 | if indexPath.section == 2 { |
| 290 | - MineInfoAlertView.showSelectView(showType: .gender) { [self] text in | |
| 291 | - updateWithDataSource() | |
| 290 | + MineInfoAlertView.showSelectView(showType: .gender) { [weak self] text in | |
| 291 | + self!.updateWithDataSource() | |
| 292 | 292 | } |
| 293 | 293 | } |
| 294 | 294 | if indexPath.section == 3 { |
| 295 | - MineInfoAlertView.showSelectView(showType: .birthday) { [self] text in | |
| 296 | - updateWithDataSource() | |
| 295 | + MineInfoAlertView.showSelectView(showType: .birthday) { [weak self] text in | |
| 296 | + self!.updateWithDataSource() | |
| 297 | 297 | } |
| 298 | 298 | } |
| 299 | 299 | } | ... | ... |
metaCode/Classes/Main/MinePage/View/CNLiveMineHeaderView.swift
| ... | ... | @@ -139,7 +139,7 @@ class MineAboutHeaderView: UIView { |
| 139 | 139 | } |
| 140 | 140 | |
| 141 | 141 | |
| 142 | -typealias ClickResultBlock = (_ index: String) ->Void | |
| 142 | +typealias ClickResultBlock = (_ index: String,_ imageUrl: String) ->Void | |
| 143 | 143 | class MinePhotoUploadView: UIView, PhotoPickerControllerDelegate { |
| 144 | 144 | |
| 145 | 145 | lazy var imageView01: UIImageView = { |
| ... | ... | @@ -252,22 +252,34 @@ extension MinePhotoUploadView { |
| 252 | 252 | |
| 253 | 253 | func pickerController(_ pickerController: PhotoPickerController, |
| 254 | 254 | didFinishSelection result: PickerResult) { |
| 255 | - result.getImage { [self] (image, photoAsset, index) in | |
| 255 | + result.getImage { [weak self] (image, photoAsset, index) in | |
| 256 | 256 | if let image = image { |
| 257 | - temp_imageView.image = image | |
| 258 | - if temp_imageView == imageView01 { | |
| 259 | - imageView02.isHidden = false | |
| 260 | - selectedImages.replaceObject(at: 0, with: image) | |
| 261 | - _resutBlock!("1") | |
| 257 | + self!.temp_imageView.image = image | |
| 258 | + if self!.temp_imageView == self!.imageView01 { | |
| 259 | + UploadManager.uploadImage(imageData: image.jpegData(compressionQuality: 1.0)! as NSData, progressBlock: {key, progress in | |
| 260 | + print("获取进度==>\(progress)") | |
| 261 | + }, successBlock: { [weak self] key,url in | |
| 262 | + self!.imageView02.isHidden = false | |
| 263 | + self!.selectedImages.replaceObject(at: 0, with: image) | |
| 264 | + self!._resutBlock!("1",url) | |
| 265 | + }) | |
| 262 | 266 | } |
| 263 | - if temp_imageView == imageView02 { | |
| 264 | - imageView03.isHidden = false | |
| 265 | - selectedImages.replaceObject(at: 1, with: image) | |
| 266 | - _resutBlock!("2") | |
| 267 | + if self!.temp_imageView == self!.imageView02 { | |
| 268 | + UploadManager.uploadImage(imageData: image.jpegData(compressionQuality: 1.0)! as NSData, progressBlock: {key, progress in | |
| 269 | + print("获取进度==>\(progress)") | |
| 270 | + }, successBlock: { [weak self] key,url in | |
| 271 | + self!.imageView03.isHidden = false | |
| 272 | + self!.selectedImages.replaceObject(at: 1, with: image) | |
| 273 | + self!._resutBlock!("2",url) | |
| 274 | + }) | |
| 267 | 275 | } |
| 268 | - if temp_imageView == imageView03 { | |
| 269 | - selectedImages.replaceObject(at: 2, with: image) | |
| 270 | - _resutBlock!("3") | |
| 276 | + if self!.temp_imageView == self!.imageView03 { | |
| 277 | + UploadManager.uploadImage(imageData: image.jpegData(compressionQuality: 1.0)! as NSData, progressBlock: {key, progress in | |
| 278 | + print("获取进度==>\(progress)") | |
| 279 | + }, successBlock: { [weak self] key,url in | |
| 280 | + self!.selectedImages.replaceObject(at: 2, with: image) | |
| 281 | + self!._resutBlock!("3",url) | |
| 282 | + }) | |
| 271 | 283 | } |
| 272 | 284 | }else { |
| 273 | 285 | print("failed") | ... | ... |
metaCode/Classes/Main/MinePage/View/CNLiveMineInfoAlertView.swift
| ... | ... | @@ -310,16 +310,18 @@ class MineInfoAlertView: UIView { |
| 310 | 310 | if type == .gender { |
| 311 | 311 | value = gender ?? "" |
| 312 | 312 | } |
| 313 | - CNLiveMineViewModel.requestUpdateUserInfoAction(type: type!, value: value) { [self] in | |
| 314 | - let userInfo = UserInfoManager.shared.userInfo | |
| 315 | - if type == .gender { | |
| 316 | - userInfo.gender = (value == "m" ? "男" : "女") | |
| 317 | - } | |
| 318 | - if type == .birthday { | |
| 319 | - userInfo.birthday = value | |
| 313 | + CNLiveMineViewModel.requestUpdateUserInfoAction(type: type!, value: value) { [weak self] statue in | |
| 314 | + if statue { | |
| 315 | + let userInfo = UserInfoManager.shared.userInfo | |
| 316 | + if self!.type == .gender { | |
| 317 | + userInfo.gender = (value == "m" ? "男" : "女") | |
| 318 | + } | |
| 319 | + if self!.type == .birthday { | |
| 320 | + userInfo.birthday = value | |
| 321 | + } | |
| 322 | + UserInfoManager.cacheUserInfo(userInfo: userInfo) | |
| 323 | + self!.result!(value) | |
| 320 | 324 | } |
| 321 | - UserInfoManager.cacheUserInfo(userInfo: userInfo) | |
| 322 | - result!(value) | |
| 323 | 325 | } |
| 324 | 326 | } |
| 325 | 327 | |
| ... | ... | @@ -343,3 +345,184 @@ class MineInfoAlertView: UIView { |
| 343 | 345 | gender = "m" |
| 344 | 346 | } |
| 345 | 347 | } |
| 348 | + | |
| 349 | + | |
| 350 | +class UpdataAlertView: UIView { | |
| 351 | + | |
| 352 | + lazy var grayMaskView: UIView = { | |
| 353 | + let grayMaskView = UIView() | |
| 354 | + grayMaskView.backgroundColor = UIColor.black.withAlphaComponent(0.2) | |
| 355 | + return grayMaskView | |
| 356 | + }() | |
| 357 | + | |
| 358 | + lazy var backView: UIView = { | |
| 359 | + let backView = UIView() | |
| 360 | + backView.backgroundColor = .clear | |
| 361 | + backView.layer.cornerRadius = 15 | |
| 362 | + backView.layer.masksToBounds = true | |
| 363 | + return backView | |
| 364 | + }() | |
| 365 | + | |
| 366 | + lazy var contentView : UIView = { | |
| 367 | + let contentView = UIView.init() | |
| 368 | + contentView.backgroundColor = .white | |
| 369 | + contentView.layer.cornerRadius = 15 | |
| 370 | + contentView.clipsToBounds = true | |
| 371 | + return contentView | |
| 372 | + }() | |
| 373 | + | |
| 374 | + lazy var headerView: UIImageView = { | |
| 375 | + let headerView = UIImageView.init() | |
| 376 | + headerView.backgroundColor = .clear | |
| 377 | + headerView.image = UIImage(named: "main_apper_alert_header_updata") | |
| 378 | + headerView.contentMode = .scaleToFill | |
| 379 | + return headerView | |
| 380 | + }() | |
| 381 | + | |
| 382 | + lazy var versionLabel: UILabel = { | |
| 383 | + let versionLabel = UILabel.init() | |
| 384 | + versionLabel.backgroundColor = .clear | |
| 385 | + versionLabel.textColor = .white | |
| 386 | + versionLabel.font = BoldFont_18_Fit | |
| 387 | + return versionLabel | |
| 388 | + }() | |
| 389 | + | |
| 390 | + lazy var descLabel: UILabel = { | |
| 391 | + let descLabel = UILabel.init() | |
| 392 | + descLabel.textColor = HexColor("#333333") | |
| 393 | + descLabel.font = Font_15 | |
| 394 | + descLabel.lineBreakMode = .byWordWrapping | |
| 395 | + descLabel.numberOfLines = 0 | |
| 396 | + return descLabel | |
| 397 | + }() | |
| 398 | + | |
| 399 | + lazy var updataButton: UIButton = { | |
| 400 | + let updataButton = UIButton(type: .custom) | |
| 401 | + updataButton.setTitle("立即更新", for: .normal) | |
| 402 | + updataButton.setTitleColor(.white, for: .normal) | |
| 403 | + updataButton.titleLabel?.font = BoldFont_16_Fit | |
| 404 | + updataButton.layer.cornerRadius = 20 | |
| 405 | + updataButton.layer.masksToBounds = true | |
| 406 | + updataButton.addTarget(self, action: #selector(sendLoginActionMothod), for: .touchUpInside) | |
| 407 | + return updataButton | |
| 408 | + }() | |
| 409 | + | |
| 410 | + lazy var cancelButton: UIButton = { | |
| 411 | + let cancelButton = UIButton(type: .custom) | |
| 412 | + cancelButton.setTitleColor(HexColor("#999999"), for: .normal) | |
| 413 | + cancelButton.setTitle("下次再说", for: .normal) | |
| 414 | + cancelButton.titleLabel?.font = Font_13 | |
| 415 | + cancelButton.backgroundColor = .white | |
| 416 | + cancelButton.addTarget(self, action: #selector(setupCloseButtonAction), for: .touchUpInside) | |
| 417 | + return cancelButton | |
| 418 | + }() | |
| 419 | + | |
| 420 | + var _updateModel: UpdateInfoModel? | |
| 421 | + init(frame: CGRect, updateModel: UpdateInfoModel) { | |
| 422 | + super.init(frame: frame) | |
| 423 | + | |
| 424 | + _updateModel = updateModel | |
| 425 | + addSubview(grayMaskView) | |
| 426 | + addSubview(backView) | |
| 427 | + backView.addSubview(headerView) | |
| 428 | + headerView.addSubview(versionLabel) | |
| 429 | + backView.addSubview(contentView) | |
| 430 | + contentView.addSubview(descLabel) | |
| 431 | + contentView.addSubview(updataButton) | |
| 432 | + contentView.addSubview(cancelButton) | |
| 433 | + | |
| 434 | + cancelButton.isHidden = ((_updateModel?.isForce) == nil) | |
| 435 | + versionLabel.text = updateModel.version | |
| 436 | + | |
| 437 | + let paraph = NSMutableParagraphStyle() | |
| 438 | + paraph.lineSpacing = 10 | |
| 439 | + let attributes = [NSAttributedString.Key.font:Font_16_Fit, | |
| 440 | + NSAttributedString.Key.paragraphStyle: paraph] | |
| 441 | + descLabel.attributedText = NSAttributedString(string: updateModel.upgradePoint, attributes: attributes) | |
| 442 | + | |
| 443 | + | |
| 444 | + setConstraints() | |
| 445 | + } | |
| 446 | + | |
| 447 | + func setConstraints() { | |
| 448 | + grayMaskView.snp.makeConstraints { make in | |
| 449 | + make.edges.equalToSuperview() | |
| 450 | + } | |
| 451 | + backView.snp.makeConstraints { make in | |
| 452 | + make.center.equalToSuperview() | |
| 453 | + make.width.equalTo(KSreenWidth - 60) | |
| 454 | + make.height.equalTo((KSreenWidth - 60) * 1.4) | |
| 455 | + } | |
| 456 | + headerView.snp.makeConstraints { make in | |
| 457 | + make.centerX.equalToSuperview() | |
| 458 | + make.top.left.right.equalToSuperview() | |
| 459 | + make.height.equalTo(200) | |
| 460 | + } | |
| 461 | + versionLabel.snp.makeConstraints { make in | |
| 462 | + make.left.equalToSuperview().offset(23) | |
| 463 | + make.bottom.equalToSuperview().offset(-55) | |
| 464 | + } | |
| 465 | + contentView.snp.makeConstraints { make in | |
| 466 | + make.centerX.equalToSuperview() | |
| 467 | + make.top.equalTo(headerView.snp.bottom).offset(-15) | |
| 468 | + make.left.right.equalToSuperview() | |
| 469 | + make.height.equalTo((KSreenWidth - 60) * 1.4 - 185) | |
| 470 | + } | |
| 471 | + descLabel.snp.makeConstraints { make in | |
| 472 | + make.centerX.equalToSuperview() | |
| 473 | + make.top.equalToSuperview().offset(45) | |
| 474 | + make.left.equalToSuperview().offset(20) | |
| 475 | + make.right.equalToSuperview().offset(-20) | |
| 476 | + } | |
| 477 | + cancelButton.snp.makeConstraints { make in | |
| 478 | + make.centerX.equalToSuperview() | |
| 479 | + make.bottom.equalToSuperview().offset(-20) | |
| 480 | + make.width.equalTo(KSreenWidth - 100) | |
| 481 | + make.height.equalTo(20) | |
| 482 | + } | |
| 483 | + updataButton.snp.makeConstraints { make in | |
| 484 | + make.centerX.equalToSuperview() | |
| 485 | + if ((_updateModel?.isForce) == nil) { | |
| 486 | + make.bottom.equalToSuperview().offset(-30) | |
| 487 | + } else { | |
| 488 | + make.bottom.equalToSuperview().offset(-50) | |
| 489 | + } | |
| 490 | + make.left.equalToSuperview().offset(30) | |
| 491 | + make.right.equalToSuperview().offset(-30) | |
| 492 | + make.height.equalTo(40) | |
| 493 | + } | |
| 494 | + | |
| 495 | + updataButton.setGradient(colors: [UIColor(red: 103/255.0, green: 197/255.0, blue: 255/255.0, alpha: 1),UIColor(red: 96/255.0, green: 154/255.0, blue: 255/255.0, alpha: 1)], startPoint: CGPoint(x: 0, y: 0.5), endPoint: CGPoint(x: 1, y: 0.5)) | |
| 496 | + } | |
| 497 | + | |
| 498 | + required init?(coder: NSCoder) { | |
| 499 | + fatalError("init(coder:) has not been implemented") | |
| 500 | + } | |
| 501 | + | |
| 502 | + static public func showUpdataView(updataModel: UpdateInfoModel){ | |
| 503 | + | |
| 504 | + let updateView = UpdataAlertView(frame: .zero, updateModel: updataModel) | |
| 505 | + | |
| 506 | + let window = UIApplication.shared.windows.last | |
| 507 | + window?.addSubview(updateView) | |
| 508 | + updateView.snp.makeConstraints { make in | |
| 509 | + make.edges.equalToSuperview() | |
| 510 | + } | |
| 511 | + window?.layoutIfNeeded() | |
| 512 | + updateView.alpha = 0 | |
| 513 | + UIView.animate(withDuration: 0.1) { | |
| 514 | + updateView.alpha = 1 | |
| 515 | + } | |
| 516 | + } | |
| 517 | + | |
| 518 | + | |
| 519 | + @objc func sendLoginActionMothod() -> Void { | |
| 520 | + print("跳转到appstore") | |
| 521 | + showMessage(message: "跳转到AppStore") | |
| 522 | + } | |
| 523 | + | |
| 524 | + @objc func setupCloseButtonAction() -> Void { | |
| 525 | + removeFromSuperview() | |
| 526 | + } | |
| 527 | + | |
| 528 | +} | ... | ... |
metaCode/Classes/Main/MinePage/View/CNLiveMineSubBodyListView.swift
| ... | ... | @@ -146,7 +146,11 @@ class MineStandInfoTableViewCell: UITableViewCell { |
| 146 | 146 | } |
| 147 | 147 | |
| 148 | 148 | public func setupWithDataSource(icon: String, name: String,number: String, time: String) { |
| 149 | - iconView.image = UIImage(named: icon) | |
| 149 | + if !icon.isEmpty { | |
| 150 | + iconView.kf.setImage(with: URL(string: icon), placeholder: UIImage.imageWithColor(color: HexColor("#f9f9f9")!, size: CGSize(width: 40, height: 40))) | |
| 151 | + } else { | |
| 152 | + iconView.image = UIImage.imageWithColor(color: HexColor("#f9f9f9")!, size: CGSize(width: 40, height: 40)) | |
| 153 | + } | |
| 150 | 154 | titleLabel.text = name |
| 151 | 155 | numberLabel.text = number |
| 152 | 156 | timeLabel.text = time |
| ... | ... | @@ -259,3 +263,152 @@ class MineFeedBackListCollectViewCell : UICollectionViewCell { |
| 259 | 263 | fatalError("init(coder:) has not been implemented") |
| 260 | 264 | } |
| 261 | 265 | } |
| 266 | + | |
| 267 | + | |
| 268 | +class MessageDescTableViewCell: UITableViewCell { | |
| 269 | + | |
| 270 | + lazy var timeLabel: UILabel = { | |
| 271 | + let timeLabel = UILabel.init() | |
| 272 | + timeLabel.textColor = HexColor("#9F9F9F") | |
| 273 | + timeLabel.font = Font_13 | |
| 274 | + timeLabel.textAlignment = .center | |
| 275 | + return timeLabel | |
| 276 | + }() | |
| 277 | + | |
| 278 | + lazy var iconView: UIImageView = { | |
| 279 | + let iconView = UIImageView.init() | |
| 280 | + iconView.backgroundColor = .white | |
| 281 | + iconView.layer.cornerRadius = 20 | |
| 282 | + iconView.layer.masksToBounds = true | |
| 283 | + iconView.contentMode = .scaleToFill | |
| 284 | + iconView.image = UIImage.imageWithColor(color: .red, size: CGSizeMake(40, 40)) | |
| 285 | + return iconView | |
| 286 | + }() | |
| 287 | + | |
| 288 | + lazy var cView: UIView = { | |
| 289 | + let cView = UIView.init() | |
| 290 | + cView.backgroundColor = .white | |
| 291 | + cView.layer.cornerRadius = 10 | |
| 292 | + cView.layer.masksToBounds = true | |
| 293 | + return cView | |
| 294 | + }() | |
| 295 | + | |
| 296 | + lazy var contentLabel: UILabel = { | |
| 297 | + let contentLabel = UILabel.init() | |
| 298 | + contentLabel.backgroundColor = .white | |
| 299 | + contentLabel.textColor = HexColor("#666666") | |
| 300 | + contentLabel.lineBreakMode = .byCharWrapping | |
| 301 | + contentLabel.numberOfLines = 0 | |
| 302 | + contentLabel.font = Font_14_Fit | |
| 303 | + return contentLabel | |
| 304 | + }() | |
| 305 | + | |
| 306 | + lazy var lineLabel: UILabel = { | |
| 307 | + let lineLabel = UILabel.init() | |
| 308 | + lineLabel.backgroundColor = HexColor("#EAEAEA") | |
| 309 | + return lineLabel | |
| 310 | + }() | |
| 311 | + | |
| 312 | + lazy var textButton: UIButton = { | |
| 313 | + let textButton = UIButton.init(type: .custom) | |
| 314 | + textButton.setTitle("查看详情", for: .normal) | |
| 315 | + textButton.setTitleColor(HexColor("#609BFF"), for: .normal) | |
| 316 | + textButton.titleLabel?.font = Font_13 | |
| 317 | + textButton.addTarget(self, action: #selector(textButtonAction), for: .touchUpInside) | |
| 318 | + return textButton | |
| 319 | + }() | |
| 320 | + | |
| 321 | + lazy var textView: UIImageView = { | |
| 322 | + let textView = UIImageView.init() | |
| 323 | + textView.image = UIImage(named: "mine_header_message_blue_more") | |
| 324 | + textView.contentMode = .scaleToFill | |
| 325 | + textView.backgroundColor = .white | |
| 326 | + return textView | |
| 327 | + }() | |
| 328 | + | |
| 329 | + | |
| 330 | + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { | |
| 331 | + super.init(style: style, reuseIdentifier: reuseIdentifier) | |
| 332 | + self.selectionStyle = .none | |
| 333 | + self.backgroundColor = .clear | |
| 334 | + | |
| 335 | + addSubview(timeLabel) | |
| 336 | + addSubview(iconView) | |
| 337 | + addSubview(cView) | |
| 338 | + cView.addSubview(contentLabel) | |
| 339 | + cView.addSubview(lineLabel) | |
| 340 | + cView.addSubview(textButton) | |
| 341 | + cView.addSubview(textView) | |
| 342 | + | |
| 343 | + setConstraints() | |
| 344 | + } | |
| 345 | + | |
| 346 | + func setConstraints() { | |
| 347 | + timeLabel.snp.makeConstraints { make in | |
| 348 | + make.centerX.equalToSuperview() | |
| 349 | + make.top.equalToSuperview().offset(10) | |
| 350 | + } | |
| 351 | + iconView.snp.makeConstraints { make in | |
| 352 | + make.top.equalTo(timeLabel.snp.bottom).offset(10) | |
| 353 | + make.left.equalToSuperview().offset(10) | |
| 354 | + make.size.equalTo(40) | |
| 355 | + } | |
| 356 | + cView.snp.makeConstraints { make in | |
| 357 | + make.top.equalTo(timeLabel.snp.bottom).offset(10) | |
| 358 | + make.left.equalTo(iconView.snp.right).offset(10) | |
| 359 | + make.right.equalToSuperview().offset(-30) | |
| 360 | + make.height.equalTo(0) | |
| 361 | + } | |
| 362 | + textButton.snp.makeConstraints { make in | |
| 363 | + make.bottom.equalToSuperview().offset(-10) | |
| 364 | + make.right.equalToSuperview().offset(-20) | |
| 365 | + make.height.equalTo(20) | |
| 366 | + } | |
| 367 | + textView.snp.makeConstraints { make in | |
| 368 | + make.centerY.equalTo(textButton) | |
| 369 | + make.height.equalTo(10) | |
| 370 | + make.right.equalToSuperview().offset(-10) | |
| 371 | + make.width.equalTo(5) | |
| 372 | + } | |
| 373 | + lineLabel.snp.makeConstraints { make in | |
| 374 | + make.bottom.equalTo(textButton.snp.top).offset(-10) | |
| 375 | + make.left.equalToSuperview().offset(10) | |
| 376 | + make.right.equalToSuperview().offset(-10) | |
| 377 | + make.height.equalTo(1) | |
| 378 | + } | |
| 379 | + contentLabel.snp.makeConstraints { make in | |
| 380 | + make.left.top.equalToSuperview().offset(10) | |
| 381 | + make.right.equalToSuperview().offset(-10) | |
| 382 | + make.width.equalTo(KSreenWidth - 110) | |
| 383 | + make.height.equalTo(0) | |
| 384 | + } | |
| 385 | + } | |
| 386 | + | |
| 387 | + public func setupWithDataSource(listModel: NewsListModel) { | |
| 388 | + let paraph = NSMutableParagraphStyle() | |
| 389 | + paraph.lineSpacing = 10 | |
| 390 | + let attributes = [NSAttributedString.Key.font:Font_16_Fit, | |
| 391 | + NSAttributedString.Key.paragraphStyle: paraph] | |
| 392 | + contentLabel.attributedText = NSAttributedString(string: listModel.content, attributes: attributes) | |
| 393 | + timeLabel.text = listModel.timeString | |
| 394 | + if listModel.poster.isEmpty { | |
| 395 | + iconView.image = UIImage.imageWithColor(color: .red, size: CGSizeMake(40, 40)) | |
| 396 | + } else { | |
| 397 | + iconView.kf.setImage(with: URL(string: listModel.poster), placeholder: UIImage.imageWithColor(color: .red, size: CGSizeMake(40, 40))) | |
| 398 | + } | |
| 399 | + cView.snp.updateConstraints { make in | |
| 400 | + make.height.equalTo(listModel.textHeight + 60) | |
| 401 | + } | |
| 402 | + contentLabel.snp.updateConstraints { make in | |
| 403 | + make.height.equalTo(listModel.textHeight) | |
| 404 | + } | |
| 405 | + } | |
| 406 | + | |
| 407 | + required init?(coder: NSCoder) { | |
| 408 | + fatalError("init(coder:) has not been implemented") | |
| 409 | + } | |
| 410 | + | |
| 411 | + @objc func textButtonAction() { | |
| 412 | + | |
| 413 | + } | |
| 414 | +} | ... | ... |
metaCode/Classes/Main/MinePage/ViewModel/CNLiveMineBaseModel.swift
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveMineBaseModel.swift | |
| 3 | +// metaCode | |
| 4 | +// | |
| 5 | +// Created by open on 2023/6/20. | |
| 6 | +// | |
| 7 | + | |
| 8 | +import Foundation | |
| 9 | +import HandyJSON | |
| 10 | + | |
| 11 | + | |
| 12 | +class UpdateInfoModel: BaseModel { | |
| 13 | + | |
| 14 | + required init() {} | |
| 15 | + | |
| 16 | + var id:String = "" | |
| 17 | + var appId:String = "" | |
| 18 | + var appType:String = "" | |
| 19 | + var version:String = "" | |
| 20 | + var versionCode:String = "" | |
| 21 | + var isForce:Bool = false//是不是强制更新 | |
| 22 | + var apkUrl:String = "" | |
| 23 | + var upgradePoint:String = "" | |
| 24 | + var status:String = "" | |
| 25 | + var createTime:String = "" | |
| 26 | +} | |
| 27 | + | |
| 28 | +class NewsModel: BaseModel { | |
| 29 | + required init() {} | |
| 30 | + | |
| 31 | + var prePage: Int = 0 | |
| 32 | + var pageSize: Int = 0 | |
| 33 | + var startRow: Int = 0 | |
| 34 | + var navigateLastPage: Int = 0 | |
| 35 | + var firstPage: Int = 0 | |
| 36 | + var nextPage: Int = 0 | |
| 37 | + var size: Int = 0 | |
| 38 | + var endRow: Int = 0 | |
| 39 | + var isLastPage: Bool = false | |
| 40 | + var hasNextPage: Bool = false | |
| 41 | + var navigateFirstPage: Int = 0 | |
| 42 | + var lastPage: Int = 0 | |
| 43 | + var total: Int = 0 | |
| 44 | + var list = [NewsListModel]() | |
| 45 | + var navigatepageNums = [Int]() | |
| 46 | + var isFirstPage: Bool = false | |
| 47 | + var hasPreviousPage: Bool = false | |
| 48 | + var navigatePages: Int = 0 | |
| 49 | + var pageNum: Int = 0 | |
| 50 | + var pages: Int = 0 | |
| 51 | +} | |
| 52 | + | |
| 53 | + | |
| 54 | +class NewsListModel: BaseModel { | |
| 55 | + var content: String = "" | |
| 56 | + var status: Int = 0 | |
| 57 | + var id: Int = 0 | |
| 58 | + var poster: String = "" | |
| 59 | + var title: String = "" | |
| 60 | + var sid: String = "" | |
| 61 | + var createTime: Int = 0 | |
| 62 | + var createTimeString: String = "" | |
| 63 | + var timeString: String = "" | |
| 64 | + var subTitle: String = "" | |
| 65 | + var read: Bool = false | |
| 66 | + | |
| 67 | + var textHeight: CGFloat { | |
| 68 | + get { | |
| 69 | + let paraph = NSMutableParagraphStyle() | |
| 70 | + paraph.lineSpacing = 10 | |
| 71 | + let attributes = [NSAttributedString.Key.font:Font_16_Fit, | |
| 72 | + NSAttributedString.Key.paragraphStyle: paraph] | |
| 73 | + let h = content.boundingRect(with: CGSize(width: KSreenWidth - 110, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: attributes, context: nil).size.height | |
| 74 | + return h | |
| 75 | + } | |
| 76 | + } | |
| 77 | + | |
| 78 | + override func mapping(mapper: HelpingMapper) { | |
| 79 | + mapper <<< | |
| 80 | + self.createTime <-- TransformOf(fromJSON: { [weak self] (raw) -> Int in | |
| 81 | + if (raw ?? 0)! > 0 { | |
| 82 | + let date = NSDate(timeIntervalSince1970: TimeInterval((raw!)/1000)) | |
| 83 | + let dateFormatter = DateFormatter() | |
| 84 | + dateFormatter.locale = Locale.init(identifier: "zh_CN") | |
| 85 | + dateFormatter.dateFormat = "MM-dd" | |
| 86 | + self?.createTimeString = dateFormatter.string(from: date as Date) | |
| 87 | + let dateFormatter_time = DateFormatter() | |
| 88 | + dateFormatter_time.locale = Locale.init(identifier: "zh_CN") | |
| 89 | + dateFormatter_time.dateFormat = "yyyy年MM月dd日 HH:mm" | |
| 90 | + self?.timeString = dateFormatter_time.string(from: date as Date) | |
| 91 | + } | |
| 92 | + return raw! | |
| 93 | + }, toJSON: { (tuple) -> Int? in | |
| 94 | + return tuple | |
| 95 | + }) | |
| 96 | +// mapper <<< | |
| 97 | +// self.content <-- TransformOf(fromJSON: { result -> String in | |
| 98 | +// return result! + "金正恩和老兵有说有笑,欣赏着精彩绝伦的烟花表演,一起憧憬朝鲜走向繁荣富强。金正恩最后面向全体朝鲜老兵进行90度的鞠躬,再次对他们表达深深的尊重和感激。他没有忘记为国家立下汗马功劳的朝鲜老兵,更没有忘记老一辈。" | |
| 99 | +// }, toJSON: { result -> String? in | |
| 100 | +// return result | |
| 101 | +// }) | |
| 102 | + } | |
| 103 | +} | ... | ... |
metaCode/Classes/Main/MinePage/ViewModel/CNLiveMineViewModel.swift
| ... | ... | @@ -15,16 +15,21 @@ enum CNLiveMineRequestType { |
| 15 | 15 | case location |
| 16 | 16 | case birthday |
| 17 | 17 | } |
| 18 | -// 成功 | |
| 19 | -typealias resultSuccessBlock = () -> Void | |
| 20 | - | |
| 18 | +enum CNLiveMineResponseType { | |
| 19 | + case success | |
| 20 | + case failed | |
| 21 | + case noNetwork | |
| 22 | + case unkonw | |
| 23 | +} | |
| 24 | +typealias resultBlock = (_ result: Bool) -> Void | |
| 25 | +typealias resultNewsBlock = (_ result: Any,_ respStatue :CNLiveMineResponseType) -> Void | |
| 21 | 26 | class CNLiveMineViewModel: NSObject { |
| 22 | 27 | |
| 23 | 28 | /// 提交更新用户单项数据 |
| 24 | 29 | /// - Parameters: |
| 25 | 30 | /// - type: nickName-昵称,gender-性别,email-邮箱, location-联系方式,birthday-生日yyyy-MM-dd |
| 26 | 31 | /// - value: 对应的信息,性别,m:男、f:女、n:未知 |
| 27 | - static func requestUpdateUserInfoAction(type: CNLiveMineRequestType,value: String, resultBlock: @escaping resultSuccessBlock) { | |
| 32 | + static func requestUpdateUserInfoAction(type: CNLiveMineRequestType,value: String, resultBlock: @escaping resultBlock) { | |
| 28 | 33 | |
| 29 | 34 | let param = NSMutableDictionary.init() |
| 30 | 35 | if type == .nickName { |
| ... | ... | @@ -60,12 +65,14 @@ class CNLiveMineViewModel: NSObject { |
| 60 | 65 | let errorCode = resp["errorCode"] |
| 61 | 66 | if (errorCode as! String == "0") { |
| 62 | 67 | showMessage(message: "更改成功") |
| 63 | - resultBlock() | |
| 68 | + resultBlock(true) | |
| 64 | 69 | } else { |
| 65 | 70 | showMessage(message: resp["errorMessage"] as! String) |
| 71 | + resultBlock(false) | |
| 66 | 72 | } |
| 67 | 73 | } else { |
| 68 | 74 | showMessage(message: "修改信息失败") |
| 75 | + resultBlock(false) | |
| 69 | 76 | } |
| 70 | 77 | } |
| 71 | 78 | } |
| ... | ... | @@ -75,47 +82,53 @@ class CNLiveMineViewModel: NSObject { |
| 75 | 82 | /// - Parameters: |
| 76 | 83 | /// - image: 头像 |
| 77 | 84 | /// - resultBlock: 返回 |
| 78 | - static func requestUploadIconAction(_ image: UIImage,resultBlock: @escaping resultSuccessBlock) { | |
| 85 | + static func requestUploadIconAction(_ image: UIImage,resultBlock: @escaping resultBlock) { | |
| 79 | 86 | |
| 80 | - CNLiveMineViewModel.requestAccessTokenAction() { | |
| 81 | - let param = NSMutableDictionary.init() | |
| 82 | - param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "uid") | |
| 83 | - param.setValue(UserInfoManager.shared.userInfo.token, forKey: "token") | |
| 84 | - param.setValue(UserInfoManager.shared.userInfo.access_token, forKey: "access_token") | |
| 85 | - showLoading(message: "修改头像中...") | |
| 86 | - CNLiveNetworking.setAllowRequestDefaultArgument(true) | |
| 87 | - CNLiveNetworking.setupShowDataResult(false) | |
| 88 | - CNLiveNetworking.uploadNetwork(withURLString: "/open/api2/user/updateUserFaceById", param: param as? [AnyHashable : Any]) { formData in | |
| 89 | - let imageData = image.jpegData(compressionQuality: 1.0) | |
| 90 | - formData?.appendPart(withFileData: imageData! as Data, name: "face", fileName: ".jpg", mimeType: "image/jpg") | |
| 91 | - } progressBlock: { progress in | |
| 92 | - print("已上传==>\(progress!.fractionCompleted*100)") | |
| 93 | - } completionBlock: { task, result, error in | |
| 94 | - hiddenLoading() | |
| 95 | - if (error == nil) { | |
| 96 | - let resp = result as! NSDictionary | |
| 97 | - let errorCode = resp["errorCode"] | |
| 98 | - if (errorCode as! String == "0") { | |
| 99 | - showMessage(message: "头像更改成功") | |
| 100 | - let data = resp["data"] as! Dictionary<String, Any> | |
| 101 | - let userInfo = UserInfoManager.shared.userInfo | |
| 102 | - userInfo.faceUrl = data["faceUrl"] as! String | |
| 103 | - userInfo.bigFaceUrl = data["bigFaceUrl"] as! String | |
| 104 | - UserInfoManager.cacheUserInfo(userInfo: userInfo) | |
| 105 | - resultBlock() | |
| 87 | + CNLiveMineViewModel.requestAccessTokenAction() { result in | |
| 88 | + if result { | |
| 89 | + let param = NSMutableDictionary.init() | |
| 90 | + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "uid") | |
| 91 | + param.setValue(UserInfoManager.shared.userInfo.token, forKey: "token") | |
| 92 | + param.setValue(UserInfoManager.shared.userInfo.access_token, forKey: "access_token") | |
| 93 | + showLoading(message: "修改头像中...") | |
| 94 | + CNLiveNetworking.setAllowRequestDefaultArgument(true) | |
| 95 | + CNLiveNetworking.setupShowDataResult(false) | |
| 96 | + CNLiveNetworking.uploadNetwork(withURLString: "/open/api2/user/updateUserFaceById", param: param as? [AnyHashable : Any]) { formData in | |
| 97 | + let imageData = image.jpegData(compressionQuality: 1.0) | |
| 98 | + formData?.appendPart(withFileData: imageData! as Data, name: "face", fileName: ".jpg", mimeType: "image/jpg") | |
| 99 | + } progressBlock: { progress in | |
| 100 | + print("已上传==>\(progress!.fractionCompleted*100)") | |
| 101 | + } completionBlock: { task, result, error in | |
| 102 | + hiddenLoading() | |
| 103 | + if (error == nil) { | |
| 104 | + let resp = result as! NSDictionary | |
| 105 | + let errorCode = resp["errorCode"] | |
| 106 | + if (errorCode as! String == "0") { | |
| 107 | + showMessage(message: "头像更改成功") | |
| 108 | + let data = resp["data"] as! Dictionary<String, Any> | |
| 109 | + let userInfo = UserInfoManager.shared.userInfo | |
| 110 | + userInfo.faceUrl = data["faceUrl"] as! String | |
| 111 | + userInfo.bigFaceUrl = data["bigFaceUrl"] as! String | |
| 112 | + UserInfoManager.cacheUserInfo(userInfo: userInfo) | |
| 113 | + resultBlock(true) | |
| 114 | + } else { | |
| 115 | + showMessage(message: resp["errorMessage"] as! String) | |
| 116 | + resultBlock(false) | |
| 117 | + } | |
| 106 | 118 | } else { |
| 107 | - showMessage(message: resp["errorMessage"] as! String) | |
| 119 | + showMessage(message: "头像更改成功") | |
| 120 | + resultBlock(false) | |
| 108 | 121 | } |
| 109 | - } else { | |
| 110 | - showMessage(message: "头像更改成功") | |
| 111 | 122 | } |
| 123 | + } else { | |
| 124 | + resultBlock(false) | |
| 112 | 125 | } |
| 113 | 126 | } |
| 114 | 127 | } |
| 115 | 128 | |
| 116 | 129 | /// 获取access_token |
| 117 | 130 | /// - Parameter resultBlock: 结果返回 |
| 118 | - static func requestAccessTokenAction(resultBlock: @escaping resultSuccessBlock) { | |
| 131 | + static func requestAccessTokenAction(resultBlock: @escaping resultBlock) { | |
| 119 | 132 | //当前时间大于最大允许时间则表明当前access_token已经过期需要重新请求 |
| 120 | 133 | if CNLiveMineViewModel.timeStamp > NSNumber(string: UserInfoManager.shared.userInfo.expires_in)?.intValue ?? 0 { |
| 121 | 134 | let param = NSMutableDictionary.init() |
| ... | ... | @@ -136,16 +149,129 @@ class CNLiveMineViewModel: NSObject { |
| 136 | 149 | let expires_in = data["expires_in"] as! NSNumber |
| 137 | 150 | userInfo.expires_in = "\(expires_in.intValue+CNLiveMineViewModel.timeStamp)" |
| 138 | 151 | UserInfoManager.cacheUserInfo(userInfo: userInfo) |
| 139 | - resultBlock() | |
| 152 | + resultBlock(true) | |
| 140 | 153 | } else { |
| 141 | 154 | showMessage(message: resp["errorMessage"] as! String) |
| 155 | + resultBlock(false) | |
| 142 | 156 | } |
| 143 | 157 | } else { |
| 144 | 158 | showMessage(message: "修改头像失败") |
| 159 | + resultBlock(false) | |
| 145 | 160 | } |
| 146 | 161 | } |
| 147 | 162 | } else { |
| 148 | - resultBlock() | |
| 163 | + resultBlock(false) | |
| 164 | + } | |
| 165 | + } | |
| 166 | + | |
| 167 | + /// 上传反馈意见接口 | |
| 168 | + /// - Parameter resultBlock: 成功回调 | |
| 169 | + static func requestFeedBack(text: String,contactWay: String,images: NSMutableArray,resultBlock: @escaping resultBlock) { | |
| 170 | + if (text.count == 0) { | |
| 171 | + showMessage(message: "反馈内容不能为空") | |
| 172 | + return | |
| 173 | + } | |
| 174 | + images.remove("") | |
| 175 | + let imageUrl = NSMutableString() | |
| 176 | + if images.count > 0 { | |
| 177 | + images.forEach { image_url in | |
| 178 | + imageUrl.append(image_url as! String) | |
| 179 | + imageUrl.append(",") | |
| 180 | + } | |
| 181 | + imageUrl.deleteCharacters(in: NSRange(location: imageUrl.length - 1, length: 1)) | |
| 182 | + } | |
| 183 | + let param = NSMutableDictionary() | |
| 184 | + param.setValue(imageUrl, forKey: "images") | |
| 185 | + param.setValue(text, forKey: "text") | |
| 186 | + param.setValue(UserInfoManager.shared.userInfo.uid, forKey: "sid") | |
| 187 | + param.setValue(contactWay, forKey: "contactWay") | |
| 188 | + param.setValue(UserInfoManager.shared.userInfo.nickName, forKey: "contactName") | |
| 189 | + param.setValue("", forKey: "category") | |
| 190 | + param.setValue("ios", forKey: "plat") | |
| 191 | + param.setValue(Bundle.main.infoDictionary?["CFBundleVersion"] as! String, forKey: "version") | |
| 192 | + param.setValue(UIDevice.current.identifierForVendor?.uuidString.replacingOccurrences(of: "-", with: "") ?? "", forKey: "deviceId") | |
| 193 | + showLoading(message: "") | |
| 194 | + CNLiveNetworking.setAllowRequestDefaultArgument(true) | |
| 195 | + CNLiveNetworking.setupShowDataResult(false) | |
| 196 | + CNLiveNetworking.requestNetwork(with: .POST, urlString: APPBaseMCUrl+"/commonApi/collectFeedback", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in | |
| 197 | + hiddenLoading() | |
| 198 | + if (error == nil) { | |
| 199 | + let resp = result as! NSDictionary | |
| 200 | + let errorCode = "\(resp["errorCode"] ?? "0")" | |
| 201 | + if (errorCode == "0") { | |
| 202 | + resultBlock(true) | |
| 203 | + } else { | |
| 204 | + showMessage(message: resp["errorMessage"] as! String) | |
| 205 | + resultBlock(false) | |
| 206 | + } | |
| 207 | + } else { | |
| 208 | + showMessage(message: "提交失败") | |
| 209 | + resultBlock(false) | |
| 210 | + } | |
| 211 | + } | |
| 212 | + } | |
| 213 | + | |
| 214 | + /// 获取系统消息 | |
| 215 | + /// - Parameter resultBlock: 结果返回 | |
| 216 | + static func requestMessage(resultBlock: @escaping resultNewsBlock) { | |
| 217 | + showLoading(message: "") | |
| 218 | + CNLiveNetworking.setAllowRequestDefaultArgument(true) | |
| 219 | + CNLiveNetworking.setupShowDataResult(false) | |
| 220 | + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseMCUrl+"/newsApi/getNews", param: ["sid":UserInfoManager.shared.userInfo.uid], cacheType: .networkOnly) { task, result, error in | |
| 221 | + hiddenLoading() | |
| 222 | + if (error == nil) { | |
| 223 | + let resp = result as! NSDictionary | |
| 224 | + let errorCode = "\(resp["errorCode"] ?? "0")" | |
| 225 | + if (errorCode == "0") { | |
| 226 | + let newsModel = dictionaryToModel(resp as! [String : Any], NewsModel.self,"data") as! NewsModel | |
| 227 | + resultBlock(newsModel,.success) | |
| 228 | + } else { | |
| 229 | + showMessage(message: resp["errorMessage"] as! String) | |
| 230 | + resultBlock(NSNull(),.failed) | |
| 231 | + } | |
| 232 | + } else { | |
| 233 | + if CNLiveNetworking.isNetworking() { | |
| 234 | + showMessage(message: "获取失败") | |
| 235 | + resultBlock(NSNull(),.failed) | |
| 236 | + } else { | |
| 237 | + showMessage(message: "似乎与网络断开链接") | |
| 238 | + resultBlock(NSNull(),.noNetwork) | |
| 239 | + } | |
| 240 | + } | |
| 241 | + } | |
| 242 | + } | |
| 243 | + | |
| 244 | + /// 获取最新app版本 | |
| 245 | + /// - Parameter resultBlock: 结果回调 | |
| 246 | + static func requestSystemNews(resultBlock: @escaping resultNewsBlock) { | |
| 247 | + let param = NSMutableDictionary() | |
| 248 | + param.setValue("2", forKey: "appType") | |
| 249 | + CNLiveNetworking.setAllowRequestDefaultArgument(true) | |
| 250 | + CNLiveNetworking.setupShowDataResult(false) | |
| 251 | + CNLiveNetworking.requestNetwork(with: .GET, urlString: APPBaseMCUrl+"/commonApi/getVersion", param: param as! [String : String], cacheType: .networkOnly) { task, result, error in | |
| 252 | + if (error == nil) { | |
| 253 | + let resp = result as! NSDictionary | |
| 254 | + let errorCode = "\(resp["errorCode"] ?? "0")" | |
| 255 | + if (errorCode == "0") { | |
| 256 | + let userInfoModel = dictionaryToModel(resp as! [String : Any], UpdateInfoModel.self,"data") as! UpdateInfoModel | |
| 257 | + let ver1 = "\(userInfoModel.version.split(separator: "_").last ?? "0")" | |
| 258 | + let ver2 = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String | |
| 259 | + print("获取的新版本号=>\(ver1),原来的版本号=>\(ver2)") | |
| 260 | + if CNLiveMineViewModel.compare(v1: ver1, v2: ver2) { | |
| 261 | + resultBlock(userInfoModel,.success) | |
| 262 | + } else { | |
| 263 | + print("没有新版本") | |
| 264 | + } | |
| 265 | + } else { | |
| 266 | + resultBlock(NSNull(),.failed) | |
| 267 | + } | |
| 268 | + } else { | |
| 269 | + if CNLiveNetworking.isNetworking() { | |
| 270 | + resultBlock(NSNull(),.failed) | |
| 271 | + } else { | |
| 272 | + resultBlock(NSNull(),.noNetwork) | |
| 273 | + } | |
| 274 | + } | |
| 149 | 275 | } |
| 150 | 276 | } |
| 151 | 277 | |
| ... | ... | @@ -155,4 +281,51 @@ class CNLiveMineViewModel: NSObject { |
| 155 | 281 | let timeStamp = Int(timeInterval) |
| 156 | 282 | return timeStamp |
| 157 | 283 | } |
| 284 | + | |
| 285 | + /// 比较版本大小,返回是否需要更新 | |
| 286 | + /// - Parameters: | |
| 287 | + /// - v1: 版本1-新版本 | |
| 288 | + /// - v2: 版本2-当前版本 | |
| 289 | + /// - Returns: true:v1>v2 false: v1<=v2 | |
| 290 | + static fileprivate func compare(v1: String, v2: String) -> Bool { | |
| 291 | + | |
| 292 | + if v1.isEmpty && v2.isEmpty || v1.isEmpty { | |
| 293 | + return false | |
| 294 | + } | |
| 295 | + | |
| 296 | + if v2.isEmpty { | |
| 297 | + return true | |
| 298 | + } | |
| 299 | + | |
| 300 | + let array1 = v1.components(separatedBy: ".") | |
| 301 | + let array2 = v2.components(separatedBy: ".") | |
| 302 | + let mineCount = array1.count > array2.count ? (array2.count - 1) : (array1.count - 1) | |
| 303 | + | |
| 304 | + var value1: Int = 0 | |
| 305 | + var value2: Int = 0 | |
| 306 | + | |
| 307 | + for i in 0...mineCount { | |
| 308 | + | |
| 309 | + if !(array1[i]).isPurnInt() || !(array2[i]).isPurnInt() { | |
| 310 | + return false | |
| 311 | + } | |
| 312 | + value1 = Int(array1[i])! | |
| 313 | + value2 = Int(array2[i])! | |
| 314 | + | |
| 315 | + //v1版本字段大于v2版本字段 | |
| 316 | + if value1 > value2 { | |
| 317 | + return true | |
| 318 | + } else if (value1 < value2) { | |
| 319 | + return false | |
| 320 | + } | |
| 321 | + //v1版本==v2版本字段 继续循环 | |
| 322 | + } | |
| 323 | + if array1.count > array2.count { | |
| 324 | + return true | |
| 325 | + } else if (array1.count <= array2.count) { | |
| 326 | + return false | |
| 327 | + } | |
| 328 | + return false | |
| 329 | + } | |
| 330 | + | |
| 158 | 331 | } | ... | ... |
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_header_message_blue_more.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_header_message_blue_more@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_header_message_blue_more@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_header_message_blue_more.imageset/mine_header_message_blue_more@2x.png
0 → 100644
358 Bytes
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_header_message_blue_more.imageset/mine_header_message_blue_more@3x.png
0 → 100644
645 Bytes
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_empty.imageset/Contents.json renamed to metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_empty.imageset/Contents.json
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_empty.imageset/mine_list_source_empty@2x.png renamed to metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_empty.imageset/mine_list_source_empty@2x.png
21.8 KB
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_empty.imageset/mine_list_source_empty@3x.png renamed to metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_empty.imageset/mine_list_source_empty@3x.png
48.1 KB
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_failed.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_list_source_unusual_failed@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_list_source_unusual_failed@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_failed.imageset/mine_list_source_unusual_failed@2x.png
0 → 100644
21.2 KB
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_failed.imageset/mine_list_source_unusual_failed@3x.png
0 → 100644
44.7 KB
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_noNet.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "mine_list_source_unusual_noNet@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "mine_list_source_unusual_noNet@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_noNet.imageset/mine_list_source_unusual_noNet@2x.png
0 → 100644
24 KB
metaCode/Supporting Files/Assets.xcassets/MinePage/mine_list_source_unusual_noNet.imageset/mine_list_source_unusual_noNet@3x.png
0 → 100644
48.8 KB
metaCode/Supporting Files/Assets.xcassets/TabBar/main_apper_alert_header_updata.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "main_apper_alert_header_updata@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "main_apper_alert_header_updata@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
metaCode/Supporting Files/Assets.xcassets/TabBar/main_apper_alert_header_updata.imageset/main_apper_alert_header_updata@2x.png
0 → 100644
89.2 KB
metaCode/Supporting Files/Assets.xcassets/TabBar/main_apper_alert_header_updata.imageset/main_apper_alert_header_updata@3x.png
0 → 100644
235 KB