Forráskód Böngészése

上传图片封装完成

南鑫林 5 éve
szülő
commit
1b02469eee
22 módosított fájl, 711 hozzáadás és 10 törlés
  1. 49 1
      RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj
  2. 249 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunOSSManager/AliyunOSSManager.swift
  3. 0 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodUpToYoPublishModel.swift
  4. 0 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodupToyoPublishManager.swift
  5. 0 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUpToyoPublishManager/PublishUploadProgressView.swift
  6. 0 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUptoyouDBManager/AliyunVodUptoyouDBManager.swift
  7. 0 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUptoyouDBManager/Model/AliyunVodUptoyouEffectsModel.swift
  8. 36 0
      RainbowPlanet/RainbowPlanet/Manager/PathManager/PathManager.swift
  9. 72 0
      RainbowPlanet/RainbowPlanet/Model/ConfigModel/ConfigOSSStsModel.swift
  10. 2 2
      RainbowPlanet/RainbowPlanet/Modules/CircleModule/Circle/View/CircleLeavingMessageView/Cell/CircleLeavingMessageCommentTopStepTableViewCell.swift
  11. 16 1
      RainbowPlanet/RainbowPlanet/Modules/CircleModule/Circle/ViewController/CircleViewController.swift
  12. 72 0
      RainbowPlanet/RainbowPlanet/Modules/CircleModule/CirclePublishMessage/ViewController/CirclePublishMessageViewController.swift
  13. 41 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceCommunity/SwiftMoyaNetWorkServiceCommunity.swift
  14. 20 2
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceCommunity/SwiftMoyaServiceCommunityApi.swift
  15. 13 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceConfig/SwiftMoyaNetWorkServiceConfig.swift
  16. 17 3
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceConfig/SwiftMoyaServiceConfigApi.swift
  17. 1 1
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceManger/SwiftMoyaNetWorkManager/SwiftMoyaNetWorkManager.swift
  18. 22 0
      RainbowPlanet/RainbowPlanet/Supporting Files/CommunityModule.xcassets/question_btn_add.imageset/Contents.json
  19. BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/CommunityModule.xcassets/question_btn_add.imageset/question_btn_add@2x.png
  20. BIN
      RainbowPlanet/RainbowPlanet/Supporting Files/CommunityModule.xcassets/question_btn_add.imageset/question_btn_add@3x.png
  21. 100 0
      RainbowPlanet/RainbowPlanet/Tools/Extension/Extension+Data.swift
  22. 1 0
      RainbowPlanet/RainbowPlanet/Tools/MJRefreshEX/UIScrollView+MJRefreshEX.m

+ 49 - 1
RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj

@@ -162,6 +162,10 @@
 		A7464B7023389688003CE3A0 /* BackyardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7464B6F23389688003CE3A0 /* BackyardViewController.swift */; };
 		A7464B722338AC4E003CE3A0 /* BackyardModuleRouterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7464B712338AC4E003CE3A0 /* BackyardModuleRouterType.swift */; };
 		A7464B752338B2C6003CE3A0 /* CommunityModule.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A7464B742338B2C6003CE3A0 /* CommunityModule.xcassets */; };
+		A747D80623599294007F4E33 /* CirclePublishMessageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A747D80523599294007F4E33 /* CirclePublishMessageViewController.swift */; };
+		A747D8092359B937007F4E33 /* AliyunOSSManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A747D8082359B937007F4E33 /* AliyunOSSManager.swift */; };
+		A747D80C2359C2BE007F4E33 /* ConfigOSSStsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A747D80B2359C2BE007F4E33 /* ConfigOSSStsModel.swift */; };
+		A747D80E235C64AB007F4E33 /* Extension+Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = A747D80D235C64AB007F4E33 /* Extension+Data.swift */; };
 		A74D9D572327B54100F05C14 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74D9D562327B54100F05C14 /* NotificationService.swift */; };
 		A74D9D5B2327B54100F05C14 /* NotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A74D9D542327B54100F05C14 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
 		A74DF74922EAAF17007FB505 /* MJDIYFullScreenHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A74DF74822EAAF17007FB505 /* MJDIYFullScreenHeader.swift */; };
@@ -869,6 +873,10 @@
 		A7464B6F23389688003CE3A0 /* BackyardViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BackyardViewController.swift; path = RainbowPlanet/Modules/BackyardModule/Backyard/ViewController/BackyardViewController.swift; sourceTree = SOURCE_ROOT; };
 		A7464B712338AC4E003CE3A0 /* BackyardModuleRouterType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackyardModuleRouterType.swift; sourceTree = "<group>"; };
 		A7464B742338B2C6003CE3A0 /* CommunityModule.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = CommunityModule.xcassets; sourceTree = "<group>"; };
+		A747D80523599294007F4E33 /* CirclePublishMessageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CirclePublishMessageViewController.swift; sourceTree = "<group>"; };
+		A747D8082359B937007F4E33 /* AliyunOSSManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AliyunOSSManager.swift; sourceTree = "<group>"; };
+		A747D80B2359C2BE007F4E33 /* ConfigOSSStsModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigOSSStsModel.swift; sourceTree = "<group>"; };
+		A747D80D235C64AB007F4E33 /* Extension+Data.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Extension+Data.swift"; sourceTree = "<group>"; };
 		A74D9D542327B54100F05C14 /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; };
 		A74D9D562327B54100F05C14 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
 		A74D9D582327B54100F05C14 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -2045,11 +2053,11 @@
 		A72A725422321B9400B21995 /* Manager */ = {
 			isa = PBXGroup;
 			children = (
+				A747D8072359B8C6007F4E33 /* AliyunManager */,
 				A784F2AC234ED16500E49140 /* DatePickerManager */,
 				A74144AA23306E930062FB6F /* RongCloudIMManager */,
 				A7EE6E0E230547F900628D39 /* ThumbnailsManager */,
 				A7F577D522FED33500E2D757 /* PathManager */,
-				A7F577CB22FECD2B00E2D757 /* AliyunVodManager */,
 				A72E685722F2DAF40063D967 /* RegisterLoginManager */,
 				A72E685222F2D7460063D967 /* ATAuthSDKManager */,
 				A74DF74B22EAEF43007FB505 /* MJRefreshManager */,
@@ -2180,6 +2188,7 @@
 				A72A729E22321DE000B21995 /* Extension+CAGradientLayer.swift */,
 				A7778CA82244904500C7C47A /* Extension+Gifu.GIFImageView.swift */,
 				A72A729822321DE000B21995 /* Extension+RxTimer.swift */,
+				A747D80D235C64AB007F4E33 /* Extension+Data.swift */,
 			);
 			path = Extension;
 			sourceTree = "<group>";
@@ -2435,6 +2444,39 @@
 			path = RedemptionAreaModule;
 			sourceTree = "<group>";
 		};
+		A747D8032359925F007F4E33 /* CirclePublishMessage */ = {
+			isa = PBXGroup;
+			children = (
+				A747D80423599283007F4E33 /* ViewController */,
+			);
+			path = CirclePublishMessage;
+			sourceTree = "<group>";
+		};
+		A747D80423599283007F4E33 /* ViewController */ = {
+			isa = PBXGroup;
+			children = (
+				A747D80523599294007F4E33 /* CirclePublishMessageViewController.swift */,
+			);
+			path = ViewController;
+			sourceTree = "<group>";
+		};
+		A747D8072359B8C6007F4E33 /* AliyunManager */ = {
+			isa = PBXGroup;
+			children = (
+				A7F577CB22FECD2B00E2D757 /* AliyunVodManager */,
+				A747D80A2359B941007F4E33 /* AliyunOSSManager */,
+			);
+			path = AliyunManager;
+			sourceTree = "<group>";
+		};
+		A747D80A2359B941007F4E33 /* AliyunOSSManager */ = {
+			isa = PBXGroup;
+			children = (
+				A747D8082359B937007F4E33 /* AliyunOSSManager.swift */,
+			);
+			path = AliyunOSSManager;
+			sourceTree = "<group>";
+		};
 		A74D9D552327B54100F05C14 /* NotificationService */ = {
 			isa = PBXGroup;
 			children = (
@@ -3430,6 +3472,7 @@
 			isa = PBXGroup;
 			children = (
 				A784F2C323544B1B00E49140 /* Circle */,
+				A747D8032359925F007F4E33 /* CirclePublishMessage */,
 				A77FAEF02358394D002A1D08 /* CircleCommentList */,
 				A77FAEFF2359592B002A1D08 /* CircleCommentReplyList */,
 				A7F688FA2356F069000C313F /* CircleUserList */,
@@ -3501,6 +3544,7 @@
 				A757C92F2274839900226355 /* SelfMentionAddressListModel.swift */,
 				BDD22F0A228FAA5B00D43BFB /* ImageUrlModel.swift */,
 				BDF7CACF22DC920A007CD5F4 /* SwiftLocationPOIModel.swift */,
+				A747D80B2359C2BE007F4E33 /* ConfigOSSStsModel.swift */,
 			);
 			path = ConfigModel;
 			sourceTree = "<group>";
@@ -6021,6 +6065,7 @@
 				A7F304BE2333640F00A4850F /* PushNotificationSettingsViewController.swift in Sources */,
 				BD13B6E222BA03BC008BB323 /* PublishTopicTypeCell.swift in Sources */,
 				A72A726822321DBD00B21995 /* UMManager.swift in Sources */,
+				A747D80C2359C2BE007F4E33 /* ConfigOSSStsModel.swift in Sources */,
 				A78168DC23418C3200033496 /* AliyunVodUptoyouDBManager.swift in Sources */,
 				A70DE55222E7E53F009E06BE /* KeyBoardInputView.swift in Sources */,
 				A78CEE0A22E0864100C512A4 /* BaseLottieAnimateContentView.swift in Sources */,
@@ -6198,11 +6243,13 @@
 				A7778CA92244904500C7C47A /* Extension+Gifu.GIFImageView.swift in Sources */,
 				A71738AB22898660000AEA6A /* ShopModel.swift in Sources */,
 				A7EE6E1523055A8900628D39 /* MemoryManagerCacheCleanerPlugin.swift in Sources */,
+				A747D80E235C64AB007F4E33 /* Extension+Data.swift in Sources */,
 				A75AEE5423404DE00092413C /* PublishNewProgressView.swift in Sources */,
 				A7A98E02227E8900005306E9 /* ProductSearchListModel.swift in Sources */,
 				A763BE6C22F173A0000CE594 /* LoginNowView.swift in Sources */,
 				BDF7C5D922D70B6E007F3B79 /* CommunityVideoMajorCommentCell.swift in Sources */,
 				A7778CB32244D73400C7C47A /* RegisterLoginViewController.swift in Sources */,
+				A747D80623599294007F4E33 /* CirclePublishMessageViewController.swift in Sources */,
 				A7D5F26522C118F100F8E9AF /* CMSMemberListModel.swift in Sources */,
 				BD1FC18622B09F9800D55081 /* CommunitySubCommentController.swift in Sources */,
 				BD6122AD22C3638300D3F513 /* AliyunEffectMusicInfo.m in Sources */,
@@ -6359,6 +6406,7 @@
 				A7AD2795231365470099B3E0 /* QRCode.swift in Sources */,
 				A714348C22DDA3E400132DA9 /* CMSRedemptionAreaModel.swift in Sources */,
 				A738D66F225D9BD900EEE860 /* UMLoginModel.swift in Sources */,
+				A747D8092359B937007F4E33 /* AliyunOSSManager.swift in Sources */,
 				A71738A622897892000AEA6A /* SwiftMoyaServiceShopApi.swift in Sources */,
 				A78168EE2341F62500033496 /* PublishNewEffectFilterCollectionViewCell.swift in Sources */,
 				A72A726722321DBD00B21995 /* LocationModel.swift in Sources */,

+ 249 - 0
RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunOSSManager/AliyunOSSManager.swift

@@ -0,0 +1,249 @@
+//
+//  AliyunOSSManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/10/18.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import AliyunOSSiOS
+
+let kAliyunOSSAccessKeyId: String = "LTAIG2eCY5UdheM1"
+let kAliyunOSSAccessKeySecret: String = "4RJTcJkZsOJIby2oewUFHqUJxUR1vm"
+let kAliyunOSSBucketPublic: String = "uptoyo"
+let kAliyunOSSBucketPrivate: String = "uptoyo"
+let kAliyunOSSEndpoint: String = "http://oss-cn-zhangjiakou.aliyuncs.com"
+let kAliyunOSSSecurityToken: String = "SecurityToken"
+
+typealias AliyunOSSManagerProgressBlock = (Float) -> Void
+typealias AliyunOSSManagerResultBlockUrl = (Bool, String?) -> Void
+typealias AliyunOSSManagerResultBlockUrls = (Bool, Array<String>?) -> Void
+
+class AliyunOSSManager: NSObject {
+
+    deinit {
+        NXLLog("deinit")
+    }
+    
+    static let shared : AliyunOSSManager = AliyunOSSManager()
+    
+    var client : OSSClient?
+    
+    var configOSSStsModel : ConfigOSSStsModel?
+    
+    /// 初始化AliyunOSS
+     func initAliyunOSSManager() {
+        
+        SwiftMoyaNetWorkServiceConfig.shared().configOSSStsApi(completion: {
+            [weak self] (configOSSStsModel) -> (Void) in
+            self?.configOSSStsModel = configOSSStsModel as? ConfigOSSStsModel
+            // 1. credential
+            let credential = OSSStsTokenCredentialProvider(accessKeyId: self?.configOSSStsModel?.accessKeyId ?? kAliyunOSSAccessKeyId, secretKeyId: self?.configOSSStsModel?.accessKeySecret ?? kAliyunOSSAccessKeySecret, securityToken: self?.configOSSStsModel?.stsToken ?? kAliyunOSSSecurityToken)
+            // 2. OSSClient配置参数
+            let configuration = OSSClientConfiguration()
+            configuration.maxRetryCount = 3
+            configuration.timeoutIntervalForRequest = 20
+            configuration.isHttpdnsEnable = false
+            configuration.crc64Verifiable = true
+            // 3. 初始OSS化客户端
+            self?.client = OSSClient(endpoint: self?.configOSSStsModel?.region ?? kAliyunOSSEndpoint, credentialProvider: credential, clientConfiguration: configuration)
+            
+        }) { (loadingStatus) in
+            return
+        }
+        
+    }
+    
+    
+    /// 创建请求
+    ///
+    /// - Parameters:
+    ///   - image: 图片
+    ///   - progressBlock: 进度条
+    /// - Returns: 返回
+    func getPut(image:UIImage,
+                progressBlock:@escaping AliyunOSSManagerProgressBlock)-> OSSPutObjectRequest {
+        
+        // 0.初始化客户端
+        initAliyunOSSManager()
+        
+        // 1.上传请求
+        let put = OSSPutObjectRequest()
+        
+        // 1.1.设置bucketName (文件夹名,与OSS对应)
+        put.bucketName = configOSSStsModel?.bucket ?? ""
+        
+        // 1.2.文件名路径
+        put.objectKey = PathManager.randomString() ?? ""
+        
+        // 1.3.上传对象(图片data)
+        put.uploadingData = Data.imageCompressForSize(sourceImage: image, targetPx: 750.0) ?? image.pngData()!
+        
+        // 1.4.上传进度
+        put.uploadProgress = { (bytesSent , totalByteSent , totalBytesExpectedToSend) in
+            let progress = totalByteSent/totalBytesExpectedToSend
+            progressBlock(Float(progress))
+        }
+        return put
+        
+    }
+    
+    
+    /// 异步上传 单张图片
+    ///
+    /// - Parameters:
+    ///   - image: 图片
+    ///   - progressBlock: 进度
+    ///   - resultBlockUrl: 完成返回的url
+    func uploadPhotoAsync(image:UIImage,
+                          progressBlock:@escaping AliyunOSSManagerProgressBlock,
+                          resultBlockUrl:@escaping AliyunOSSManagerResultBlockUrl) {
+        
+        // 1. 创建请求
+        let put = getPut(image: image, progressBlock: progressBlock)
+        
+        // 2. 上传
+        let putTast = client?.putObject(put)
+        
+        putTast?.continue({ (task) -> Any? in
+            if (task.error != nil) {
+                NXLLog("上传失败:\(String(describing: task.error))")
+                DispatchQueue.main.async {
+                    resultBlockUrl(false,nil)
+                }
+            }else {
+                NXLLog("上传成功")
+                DispatchQueue.main.async {
+                    // 上传成功后的图片UrlStr
+                    let urlSting = ""
+//                    http:\/\/vod.uptoyo.com\/image\/default\/7D840D1A922B4721B57C64868F6A4156-6-2.jpg
+//                    NSString *str=[[ENDPOINTIMAGE componentsSeparatedByString:@"//"] lastObject];
+//                            NSString *urlString=[NSString stringWithFormat:@"https://%@.%@/%@",PUBLIC_BUCKET,str,put.objectKey];
+                    resultBlockUrl(true,urlSting)
+                }
+            }
+            return nil
+        })
+        
+    }
+    
+    /// 同步上传 单张图片
+    ///
+    /// - Parameters:
+    ///   - image: 图片
+    ///   - progressBlock: 进度
+    ///   - resultBlockUrl: 完成返回的url
+    func uploadPhotoSync(image:UIImage,
+                          progressBlock:@escaping AliyunOSSManagerProgressBlock,
+                          resultBlockUrl:@escaping AliyunOSSManagerResultBlockUrl){
+        
+        // 1. 创建请求
+        let put = getPut(image: image, progressBlock: progressBlock)
+        
+        // 2. 上传
+        let putTast = client?.putObject(put)
+        
+        putTast?.continue({ (task) -> Any? in
+            if (task.error != nil) {
+                NXLLog("上传成功")
+                DispatchQueue.main.async {
+                    // 上传成功后的图片UrlStr
+                    let urlSting = ""
+                    //                    http:\/\/vod.uptoyo.com\/image\/default\/7D840D1A922B4721B57C64868F6A4156-6-2.jpg
+                    //                    NSString *str=[[ENDPOINTIMAGE componentsSeparatedByString:@"//"] lastObject];
+                    //                            NSString *urlString=[NSString stringWithFormat:@"https://%@.%@/%@",PUBLIC_BUCKET,str,put.objectKey];
+                    resultBlockUrl(true,urlSting)
+                }
+            }else {
+                NXLLog("上传失败:\(String(describing: task.error))")
+                DispatchQueue.main.async {
+                    resultBlockUrl(false,nil)
+                }
+            }
+            return nil
+        }).waitUntilFinished()
+    }
+    
+    
+    /// 多图上传
+    ///
+    /// - Parameters:
+    ///   - images: 多图
+    ///   - progressBlock: 进度
+    ///   - resultBlockUrl: 返回url
+    ///   - isAsync: 是否异步
+    func uploadPhotos(images:Array<UIImage>,
+                      progressBlock:@escaping AliyunOSSManagerProgressBlock,
+                      resultBlockUrls:@escaping AliyunOSSManagerResultBlockUrls,
+                      isAsync:Bool)  {
+        // 0.初始化客户端
+        initAliyunOSSManager()
+        // 1.线程队列
+        let queue = OperationQueue()
+        // 1.1最大线程数
+        queue.maxConcurrentOperationCount = images.count
+        var imageUrls = Array<String>()
+        
+        for image in images {
+            //创建operation
+            let operation = BlockOperation { [weak self] () -> Void in
+                // 1.上传请求
+                let put = OSSPutObjectRequest()
+                
+                // 1.1.设置bucketName (文件夹名,与OSS对应)
+                put.bucketName = self?.configOSSStsModel?.bucket ?? ""
+                
+                // 1.2.文件名路径
+                put.objectKey = PathManager.randomString() ?? ""
+                
+                // 图片url
+                imageUrls.append("图片url")
+                
+                // 1.3.上传对象(图片data)
+                put.uploadingData = Data.imageCompressForSize(sourceImage: image, targetPx: 750.0) ?? image.pngData()!
+                
+                // 1.4.上传进度
+//                put.uploadProgress = { (bytesSent , totalByteSent , totalBytesExpectedToSend) in
+//                    let progress = totalByteSent/totalBytesExpectedToSend
+//                    progressBlock(Float(progress))
+//                }
+                
+                 // 1.5.上传
+                let putTast = self?.client?.putObject(put)
+                
+                putTast?.continue({ (task) -> Any? in
+                    if (task.error != nil) {
+                        NXLLog("上传失败:\(String(describing: task.error))")
+                    }else {
+                        let result = task.result as? OSSPutObjectResult
+                        NXLLog("上传成功")
+                        NXLLog("Result - requestId: \(result?.requestId ?? ""),headerFields:\(String(describing: result?.httpResponseHeaderFields))")
+                        
+                    }
+                    return nil
+                }) // // 阻塞直到上传完成
+                
+                // 异步
+                if isAsync {
+                    if image == images.last {
+                         NXLLog("上传完成")
+                        resultBlockUrls(true,imageUrls)
+                    }
+                }
+                
+            }
+            if queue.operations.count != 0 {
+                operation.addDependency(queue.operations.last!)
+            }
+            
+            queue.addOperation(operation)
+        }
+        
+        //同步
+        if !isAsync {
+            queue.waitUntilAllOperationsAreFinished()
+            resultBlockUrls(true,imageUrls)
+        }
+    }
+}

RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodUpToYoPublishModel.swift → RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodUpToYoPublishModel.swift


RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodupToyoPublishManager.swift → RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodupToyoPublishManager.swift


RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/PublishUploadProgressView.swift → RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUpToyoPublishManager/PublishUploadProgressView.swift


RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUptoyouDBManager/AliyunVodUptoyouDBManager.swift → RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUptoyouDBManager/AliyunVodUptoyouDBManager.swift


RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUptoyouDBManager/Model/AliyunVodUptoyouEffectsModel.swift → RainbowPlanet/RainbowPlanet/Manager/AliyunManager/AliyunVodManager/AliyunVodUptoyouDBManager/Model/AliyunVodUptoyouEffectsModel.swift


+ 36 - 0
RainbowPlanet/RainbowPlanet/Manager/PathManager/PathManager.swift

@@ -172,6 +172,35 @@ extension PathManager {
         return URL(fileURLWithPath: aliyunVodCreateRecrodPath() ?? "").appendingPathComponent("\(randomString() ?? "")").appendingPathExtension("mp4").absoluteString.substring(fromIndex: 5)
     }
     
+    /// 阿里云短视频资源Video目录
+    ///
+    /// - Returns: 阿里云短视频资源Video目录
+    class func aliyunVodCreateResourceVideoPath() -> String? {
+        return URL(fileURLWithPath: projectDocumentPath() ?? "").appendingPathComponent("Resource").appendingPathComponent("video").absoluteString.substring(fromIndex: 5)
+    }
+    
+    /// 阿里云短视频录制目录输出路径
+    ///
+    /// - Returns:阿里云短视频录制目录输出路径
+    class func aliyunVodCreateResourceOutputVoidePath() -> String? {
+        return URL(fileURLWithPath: aliyunVodCreateResourceVideoPath() ?? "").appendingPathComponent("\(randomString() ?? "")").appendingPathExtension("mp4").absoluteString.substring(fromIndex: 5)
+    }
+    
+    /// 阿里云短视频资源img目录
+    ///
+    /// - Returns:阿里云短视频资源img目录
+    class func aliyunVodCreateResourceImgPath() -> String? {
+        return URL(fileURLWithPath: projectDocumentPath() ?? "").appendingPathComponent("Resource").appendingPathComponent("img").absoluteString.substring(fromIndex: 5)
+
+    }
+    
+    /// 阿里云短视频录制目录输出路径
+    ///
+    /// - Returns:阿里云短视频录制目录输出路径
+    class func aliyunVodCreateRecrodOutputImgPath() -> String? {
+        return URL(fileURLWithPath: aliyunVodCreateResourceVideoPath() ?? "").appendingPathComponent("\(randomString() ?? "")").appendingPathExtension("png").absoluteString.substring(fromIndex: 5)
+    }
+    
     /// 清空阿里云短视频录制目录
     ///
     /// - Returns: 阿里云短视频记录目录
@@ -181,6 +210,13 @@ extension PathManager {
     
 }
 
+// MARK: - 图片名字
+extension PathManager {
+    class func imageName() -> String? {
+        return (randomString() ?? "") + ".png"
+    }
+}
+
 extension PathManager {
     /// 生成随机字符串
     ///

+ 72 - 0
RainbowPlanet/RainbowPlanet/Model/ConfigModel/ConfigOSSStsModel.swift

@@ -0,0 +1,72 @@
+//
+//	ConfigOSSStsModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class ConfigOSSStsModel : NSObject, NSCoding, Mappable{
+
+	var accessKeyId : String?
+	var accessKeySecret : String?
+	var bucket : String?
+	var region : String?
+	var stsToken : String?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return ConfigOSSStsModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		accessKeyId <- map["accessKeyId"]
+		accessKeySecret <- map["accessKeySecret"]
+		bucket <- map["bucket"]
+		region <- map["region"]
+		stsToken <- map["stsToken"]
+		
+	}
+
+    /**
+    * NSCoding required initializer.
+    * Fills the data from the passed decoder
+    */
+    @objc required init(coder aDecoder: NSCoder)
+	{
+         accessKeyId = aDecoder.decodeObject(forKey: "accessKeyId") as? String
+         accessKeySecret = aDecoder.decodeObject(forKey: "accessKeySecret") as? String
+         bucket = aDecoder.decodeObject(forKey: "bucket") as? String
+         region = aDecoder.decodeObject(forKey: "region") as? String
+         stsToken = aDecoder.decodeObject(forKey: "stsToken") as? String
+
+	}
+
+    /**
+    * NSCoding required method.
+    * Encodes mode properties into the decoder
+    */
+    @objc func encode(with aCoder: NSCoder)
+	{
+		if accessKeyId != nil{
+			aCoder.encode(accessKeyId, forKey: "accessKeyId")
+		}
+		if accessKeySecret != nil{
+			aCoder.encode(accessKeySecret, forKey: "accessKeySecret")
+		}
+		if bucket != nil{
+			aCoder.encode(bucket, forKey: "bucket")
+		}
+		if region != nil{
+			aCoder.encode(region, forKey: "region")
+		}
+		if stsToken != nil{
+			aCoder.encode(stsToken, forKey: "stsToken")
+		}
+
+	}
+
+}

+ 2 - 2
RainbowPlanet/RainbowPlanet/Modules/CircleModule/Circle/View/CircleLeavingMessageView/Cell/CircleLeavingMessageCommentTopStepTableViewCell.swift

@@ -52,14 +52,14 @@ class CircleLeavingMessageCommentTopStepTableViewCell: UITableViewCell {
         stepButton.snp.makeConstraints { (make) in
             make.centerY.equalToSuperview()
             make.right.equalTo(-14)
-            make.height.equalTo(20)
+            make.height.equalTo(26)
         }
         stepButton.layoutButton(edgeInsetsStyle: ButtonEdgeInsetsStyle.left, imageTitleSpace: 4)
         
         topButton.snp.makeConstraints { (make) in
             make.centerY.equalToSuperview()
             make.right.equalTo(stepButton.snp.left).offset(-20)
-            make.height.equalTo(20)
+            make.height.equalTo(26)
         }
         topButton.layoutButton(edgeInsetsStyle: ButtonEdgeInsetsStyle.left, imageTitleSpace: 4)
         

+ 16 - 1
RainbowPlanet/RainbowPlanet/Modules/CircleModule/Circle/ViewController/CircleViewController.swift

@@ -29,7 +29,7 @@ class CircleViewController: BaseViewController {
     var JXTableHeaderViewHeight: Int = Int(114 + kNavBarTotalHeight + 104)
     let JXHeightForHeaderInSection: Int = 44
     var communityCircleModel : CommunityCircleModel?
-    var cmsTemplateTitles = ["精选", "留言"]
+    var cmsTemplateTitles = ["精选", "提问"]
     
     override func viewDidLoad() {
         super.viewDidLoad()
@@ -42,6 +42,7 @@ class CircleViewController: BaseViewController {
         view.addSubview(pagingView)
         view.insertSubview(navigationBar, aboveSubview: pagingView)
         setnavigationBar()
+        view.addSubview(plusButton)
     }
     
     override func setupLayouts() {
@@ -57,6 +58,11 @@ class CircleViewController: BaseViewController {
             make.centerY.equalTo(avatarButton)
             make.left.equalTo(avatarButton.snp.right).offset(4)
         }
+        plusButton.snp.makeConstraints { (make) in
+            make.bottom.equalTo(-(kSafeTabBarHeight + 48))
+            make.right.equalTo(-14)
+            make.size.equalTo(46)
+        }
     }
     
     override func setupData() {
@@ -67,6 +73,9 @@ class CircleViewController: BaseViewController {
             vc.circleNameStr = self?.communityCircleModel?.name ?? ""
             self?.navigationController?.pushViewController(vc, animated: true)
         }
+        plusButton.rx.tap.subscribe(onNext: { (_) in
+            
+        }).disposed(by: disposeBag)
         loadCircleData()
     }
     
@@ -148,6 +157,12 @@ class CircleViewController: BaseViewController {
         return navigationBgView
     }()
     
+    lazy var plusButton: UIButton = {
+        let plusButton = UIButton()
+        plusButton.setImage(kImage(name: "question_btn_add"), for: UIControl.State.normal)
+        return plusButton
+    }()
+    
     //1.初始化JXSegmentedView
     lazy var segmentedView: JXSegmentedView = {
         let segmentedView = JXSegmentedView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(JXHeightForHeaderInSection)))

+ 72 - 0
RainbowPlanet/RainbowPlanet/Modules/CircleModule/CirclePublishMessage/ViewController/CirclePublishMessageViewController.swift

@@ -0,0 +1,72 @@
+//
+//  CirclePublishMessageViewController.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/10/18.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import Kingfisher
+
+class CirclePublishMessageViewController: BaseViewController {
+
+    deinit {
+        NXLLog("deinit")
+    }
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+        KingfisherManager.shared.cache.clearDiskCache()
+        KingfisherManager.shared.cache.clearMemoryCache()
+    }
+    
+    var circleId : Int?
+    var content : String?
+    var imgs : String?
+
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        // Do any additional setup after loading the view.
+    }
+    
+    override func setupViews() {
+        navigationBar.title = "留言"
+        navigationBar.addSubview(publishButton)
+    }
+    
+    override func setupLayouts() {
+        publishButton.snp.makeConstraints { (make) in
+            make.bottom.equalTo(-10)
+            make.width.equalTo(64)
+            make.height.equalTo(26)
+            make.right.equalTo(-14)
+        }
+    }
+    
+    override func setupData() {
+        publishButton.rx.tap.subscribe(onNext: {[weak self] (_) in
+            self?.communityCircleMessagePostApi()
+        }).disposed(by: disposeBag)
+    }
+    
+    lazy var publishButton: UIButton = {
+        let publishButton = UIButton()
+        publishButton.setTitle("发布", for: UIControl.State.normal)
+        publishButton.setTitleColor(kffffffColor, for: UIControl.State.normal)
+        publishButton.setBackgroundImage(UIImage.imageWithColor(color: kThemeColor), for: UIControl.State.normal)
+        publishButton.setBackgroundImage(UIImage.imageWithColor(color: kd8d8d8Color), for: UIControl.State.disabled)
+        publishButton.cornerRadius = 13
+        publishButton.masksToBounds = true
+        return publishButton
+    }()
+    
+    
+    /// 发布
+    func communityCircleMessagePostApi() {
+        SwiftMoyaNetWorkServiceCommunity.shared().communityCircleMessagePostApi(circleId: circleId ?? 0, content: content ?? "",imgs:imgs ?? "") { [weak self] _ in
+            self?.navigationController?.popToRootViewController(animated: true)
+        }
+    }
+}

+ 41 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceCommunity/SwiftMoyaNetWorkServiceCommunity.swift

@@ -704,6 +704,47 @@ public class SwiftMoyaNetWorkServiceCommunity: NSObject {
             fail(loadingStatus)
         }
     }
+    
+    // MARK: - 提问-提问列表
+    /// 提问-创建提问
+    ///
+    /// - Parameters:
+    ///   - circleId: 圈子ID
+    ///   - content: 提问内容
+    ///   - imgs: 图集 json
+    ///   - completion: 完成
+    func communityCircleMessagePostApi(circleId:Int,content:String,imgs:String = "",completion: @escaping successCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(circleId, forKey: "circle_id")
+        parameters.updateValue(content, forKey: "content")
+        if imgs != "" {
+            parameters.updateValue(imgs, forKey: "imgs")
+        }
+        
+        SwiftMoyaNetWorkManager.shared.requestAny( target: MultiTarget(SwiftMoyaServiceCommunityApi.communityCircleMessagePost(parameters: parameters)), completion: {  (_) in
+            completion(nil)
+        }) {
+            (loadingStatus) in
+        }
+    }
+    
+    // MARK: - 提问-删除提问
+    /// 提问-删除提问
+    ///
+    /// - Parameters:
+    ///   - id: 提问ID
+    ///   - completion: 完成
+    func communityCircleMessageDeleteApi(id:Int,completion: @escaping successCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(id, forKey: "id")
+        
+        SwiftMoyaNetWorkManager.shared.requestAny(target: MultiTarget(SwiftMoyaServiceCommunityApi.communityCircleMessageDelete(parameters: parameters)), completion: {  (_) in
+            completion(nil)
+        }) {
+            (loadingStatus) in
+        }
+    }
+    
     // MARK: - 提问-顶踩
     /// 提问-顶踩
     ///

+ 20 - 2
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceCommunity/SwiftMoyaServiceCommunityApi.swift

@@ -140,6 +140,10 @@ public let kCommunityCircleArticlesApi = "/community/circle/articles"
 ///  提问-提问列表
 public let kCommunityCircleMessagesApi = "/community/circle/messages"
 
+// MARK: -  提问-创建/删除提问
+///  提问-创建/删除提问
+public let kCommunityCircleMessageApi = "/community/circle/message"
+
 // MARK: -  提问-顶踩
 ///  提问-顶踩
 public let kCommunityCircleMessageActionApi = "/community/circle/message/action"
@@ -236,6 +240,8 @@ public enum SwiftMoyaServiceCommunityApi {
     case communityCircleMembers(parameters:Dictionary<String, Any>)
     case communityCircleArticles(parameters:Dictionary<String, Any>)
     case communityCircleMessagesGet(parameters:Dictionary<String, Any>)
+    case communityCircleMessagePost(parameters:Dictionary<String, Any>)
+    case communityCircleMessageDelete(parameters:Dictionary<String, Any>)
     case communityCircleMessageAction(parameters:Dictionary<String, Any>)
     case communityCircleCommentPost(parameters:Dictionary<String, Any>)
     case communityCircleCommentDelete(parameters:Dictionary<String, Any>)
@@ -283,6 +289,8 @@ extension SwiftMoyaServiceCommunityApi: TargetType {
              .communityCircleMembers,
              .communityCircleArticles,
              .communityCircleMessagesGet,
+             .communityCircleMessagePost,
+             .communityCircleMessageDelete,
              .communityCircleMessageAction,
              .communityCircleCommentPost,
              .communityCircleCommentDelete,
@@ -363,6 +371,10 @@ extension SwiftMoyaServiceCommunityApi: TargetType {
             return kCommunityCircleArticlesApi
         case .communityCircleMessagesGet:
             return kCommunityCircleMessagesApi
+        case .communityCircleMessagePost:
+            return kCommunityCircleMessageApi
+        case .communityCircleMessageDelete:
+            return kCommunityCircleMessageApi
         case .communityCircleMessageAction:
             return kCommunityCircleMessageActionApi
         case .communityCircleCommentPost:
@@ -385,7 +397,8 @@ extension SwiftMoyaServiceCommunityApi: TargetType {
              .communityUploadMusic,
              .communityCircleJoinPost,
              .communityCircleCommentPost,
-             .communityCircleMessageAction
+             .communityCircleMessageAction,
+             .communityCircleMessagePost
             :
             return .post
         case .communityTopicCategory,
@@ -420,7 +433,8 @@ extension SwiftMoyaServiceCommunityApi: TargetType {
              .communityDelete,
              .communityPostDeleteComment,
              .communityCircleJoinDelete,
-             .communityCircleCommentDelete
+             .communityCircleCommentDelete,
+             .communityCircleMessageDelete
             :
             return .delete
 
@@ -464,6 +478,8 @@ extension SwiftMoyaServiceCommunityApi: TargetType {
              .communityCircleMembers(var parameters),
              .communityCircleArticles(var parameters),
              .communityCircleMessagesGet(var parameters),
+             .communityCircleMessagePost(var parameters),
+             .communityCircleMessageDelete(var parameters),
              .communityCircleMessageAction(var parameters),
              .communityCircleCommentPost(var parameters),
              .communityCircleCommentDelete(var parameters),
@@ -525,6 +541,8 @@ extension SwiftMoyaServiceCommunityApi: TargetType {
              .communityCircleMembers,
              .communityCircleArticles,
              .communityCircleMessagesGet,
+             .communityCircleMessagePost,
+             .communityCircleMessageDelete,
              .communityCircleMessageAction,
              .communityCircleCommentPost,
              .communityCircleCommentDelete,

+ 13 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceConfig/SwiftMoyaNetWorkServiceConfig.swift

@@ -200,5 +200,18 @@ class SwiftMoyaNetWorkServiceConfig: NSObject {
             fail(loadingStatus)
         }
     }
+    
+    /// 获取sts上传凭证(前台)
+    ///
+    /// - Parameter completion: 获取sts上传凭证(前台)
+    func configOSSStsApi(completion: @escaping successCallBack,fail:@escaping failCallback) {
+        let parameters = Dictionary<String,Any>()
+        SwiftMoyaNetWorkManager.shared.requestObject(ConfigOSSStsModel.self,target: MultiTarget(SwiftMoyaServiceConfigApi.configOSSSts), completion: { (configOSSStsModel) in
+            completion(configOSSStsModel)
+        }) {
+            (loadingStatus) in
+            fail(loadingStatus)
+        }
+    }
             
 }

+ 17 - 3
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceConfig/SwiftMoyaServiceConfigApi.swift

@@ -41,6 +41,10 @@ public let kConfigUpgradeApi = "/config/upgrade"
 /// 启动页信息
 public let kConfigStartupApi = "/config/v3/startup"
 
+// MARK: - 获取sts上传凭证(前台)
+/// 获取sts上传凭证(前台)
+public let kConfigOSSStsApi = "/config/oss/sts"
+
 
 /// 基础配置
 ///
@@ -51,6 +55,7 @@ public let kConfigStartupApi = "/config/v3/startup"
 /// - configUploadMultiImg: 单图上传
 /// - configPosterInvite: 邀请海报
 /// - configStartup: 启动页信息
+/// - configOSSSts: 获取sts上传凭证(前台)
 public enum SwiftMoyaServiceConfigApi {
     case configConfig(parameters:Dictionary<String,Any>)
     case configPickupNodeIndex(parameters:Dictionary<String, Any>)
@@ -61,6 +66,7 @@ public enum SwiftMoyaServiceConfigApi {
     case configPosterInvite(parameters:Dictionary<String, Any>)
     case configUpgrade(parameters:Dictionary<String, Any>)
     case configStartup(parameters:Dictionary<String, Any>)
+    case configOSSSts
 }
 
 extension SwiftMoyaServiceConfigApi: TargetType {
@@ -75,7 +81,8 @@ extension SwiftMoyaServiceConfigApi: TargetType {
              .configUploadMultiImg,
              .configPosterInvite,
              .configUpgrade,
-             .configStartup
+             .configStartup,
+             .configOSSSts
             :
             return URL(string: kApiDataPrefix())!
         }
@@ -100,6 +107,8 @@ extension SwiftMoyaServiceConfigApi: TargetType {
             return kConfigUpgradeApi
         case .configStartup:
             return kConfigStartupApi
+        case .configOSSSts:
+            return kConfigOSSStsApi
         }
     }
     
@@ -110,7 +119,8 @@ extension SwiftMoyaServiceConfigApi: TargetType {
              .configCityManagementIndex,
              .configPosterInvite,
              .configUpgrade,
-             .configStartup
+             .configStartup,
+             .configOSSSts
             :
             return .get
         case .configUploadSingleImg,
@@ -134,6 +144,9 @@ extension SwiftMoyaServiceConfigApi: TargetType {
             let sign = SwiftSign.shared().sign(signType:.AccessToken, parameters: parameters)
             parameters.updateValue(sign, forKey: "sign")
             return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
+        case .configOSSSts
+            :
+            return .requestPlain
         case .configUploadSingleImg(_,let dataArray),
              .configUploadSingleImgWithoutHud(_,let dataArray),
              .configUploadMultiImg(_,let dataArray)
@@ -160,7 +173,8 @@ extension SwiftMoyaServiceConfigApi: TargetType {
         switch self {
         case .configConfig,
              .configUpgrade,
-             .configStartup
+             .configStartup,
+             .configOSSSts
             :
             return (headerParameters(headerType: .defaultHeader) as! [String : String])
         case .configPickupNodeIndex,

+ 1 - 1
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceManger/SwiftMoyaNetWorkManager/SwiftMoyaNetWorkManager.swift

@@ -27,7 +27,7 @@ enum SwiftMoyaNetWorkManagerLoadingStatus {
 }
 
 /// 数据回调
-typealias successCallBack = (Any) -> (Void)
+typealias successCallBack = (Any?) -> (Void)
 /// 失败回调
 typealias failCallback = (_ loadingStatus:SwiftMoyaNetWorkManagerLoadingStatus) -> Void
 

+ 22 - 0
RainbowPlanet/RainbowPlanet/Supporting Files/CommunityModule.xcassets/question_btn_add.imageset/Contents.json

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

BIN
RainbowPlanet/RainbowPlanet/Supporting Files/CommunityModule.xcassets/question_btn_add.imageset/question_btn_add@2x.png


BIN
RainbowPlanet/RainbowPlanet/Supporting Files/CommunityModule.xcassets/question_btn_add.imageset/question_btn_add@3x.png


+ 100 - 0
RainbowPlanet/RainbowPlanet/Tools/Extension/Extension+Data.swift

@@ -0,0 +1,100 @@
+//
+//  Extension+Data.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/10/20.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+
+
+extension Data {
+    static func imageCompressForSize(sourceImage:UIImage?,targetPx:CGFloat) -> Data? {
+        // 是否需要重绘图片 默认是NO
+        var drawImage : Bool = false
+        // 压缩比例
+        var scaleFactor : CGFloat = 0.0
+        // 压缩后的宽度 默认是参照像素1280px
+        var scaledWidth  = targetPx
+        // 压缩后的高度 默认是参照像素1280px
+        var scaledHeight  = targetPx
+        
+        // 压缩尺寸
+        // 新图片(尺寸压缩后的)
+        var newImage: UIImage? = nil
+        // 原size
+        let imageSize = sourceImage?.size
+        let width : CGFloat = imageSize?.width ?? 0.0
+        let height : CGFloat = imageSize?.height ?? 0.0
+        
+        // 判断尺寸
+        if width < targetPx && height < targetPx {
+            // a.宽高均<=参照像素时:尺寸不变
+            newImage = sourceImage
+        } else if width > targetPx && height > targetPx {
+            // b.宽或高均>1280px时
+            drawImage = true
+            let factor: CGFloat = width / height
+            if factor <= 2 {
+                // b.1图片宽高比≤2,则将图片宽或者高取大的等比压缩至1280px
+                if width > height {
+                    scaleFactor = targetPx / width
+                } else {
+                    scaleFactor = targetPx / height
+                }
+            } else {
+                // b.2图片宽高比>2时,则宽或者高取小的等比压缩至1280px
+                if width > height {
+                    scaleFactor = targetPx / height
+                } else {
+                    scaleFactor = targetPx / width
+                }
+            }
+        } else if width > targetPx && height < targetPx {
+            // c.宽高一个>1280px,另一个<1280px 宽大于1280
+            if width / height > 2 {
+                newImage = sourceImage
+            } else {
+                drawImage = true
+                scaleFactor = targetPx / width
+            }
+        } else if width < targetPx && height > targetPx {
+            // c.宽高一个>1280px,另一个<1280px 高大于1280
+            if height / width > 2 {
+                newImage = sourceImage
+            } else {
+                drawImage = true
+                scaleFactor = targetPx / height
+            }
+        }
+        
+        if drawImage {
+            // 图片需要重绘 按新宽高压缩重绘图片
+            scaledWidth = width * scaleFactor
+            scaledHeight = height * scaleFactor
+            UIGraphicsBeginImageContext(CGSize(width: scaledWidth, height: scaledHeight))
+            sourceImage?.draw(in: CGRect(x: 0, y: 0, width: scaledWidth, height: scaledHeight))
+            newImage = UIGraphicsGetImageFromCurrentImageContext()
+            UIGraphicsEndImageContext()
+        }
+        
+        if newImage == nil {
+            newImage = sourceImage
+        }
+        
+        // 质量压缩(图片>200kb 时)
+        var scaledImageData: Data? = nil
+        if newImage?.jpegData(compressionQuality: 1) == nil {
+            scaledImageData = newImage?.pngData()
+        } else {
+            scaledImageData = newImage?.jpegData(compressionQuality: 1)
+            if (scaledImageData?.count ?? 0) >= 1024 * 200 {
+                scaledImageData = newImage?.jpegData(compressionQuality: 0.5)
+            }
+        }
+        
+        return scaledImageData
+        
+    }
+}

+ 1 - 0
RainbowPlanet/RainbowPlanet/Tools/MJRefreshEX/UIScrollView+MJRefreshEX.m

@@ -94,6 +94,7 @@ typedef void(^LoadMoreBlock)(NSInteger pageIndex);
     footer.triggerAutomaticallyRefreshPercent = 0.1;
     footer.onlyRefreshPerDrag = YES;
     footer.automaticallyChangeAlpha = YES;
+    footer.mj_h = 34;
     
     self.mj_footer = footer;
 }