Переглянути джерело

Merge branch 'release/1.0.0'

南鑫林 5 роки тому
батько
коміт
7cb7af7d1b
100 змінених файлів з 8994 додано та 1105 видалено
  1. BIN
      .DS_Store
  2. 1 0
      RainbowPlanet/.gitignore
  3. 44 9
      RainbowPlanet/Podfile
  4. 125 24
      RainbowPlanet/Podfile.lock
  5. 3677 675
      RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj
  6. 7 0
      RainbowPlanet/RainbowPlanet.xcodeproj/xcshareddata/xcschemes/RainbowPlanet.xcscheme
  7. 20 21
      RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+HandleOpen.swift
  8. 87 30
      RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+Window.swift
  9. 8 14
      RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate.swift
  10. 1 0
      RainbowPlanet/RainbowPlanet/Base/BaseNavigationController/BaseNavigationViewController.swift
  11. 72 0
      RainbowPlanet/RainbowPlanet/Base/BaseTabbarViewController/BaseLottieAnimateContentView.swift
  12. 29 0
      RainbowPlanet/RainbowPlanet/Base/BaseTabbarViewController/BaseTabBarItemContentView.swift
  13. 230 25
      RainbowPlanet/RainbowPlanet/Base/BaseTabbarViewController/BaseTabbarViewController.swift
  14. 5 0
      RainbowPlanet/RainbowPlanet/Base/BaseView/BaseView.swift
  15. 16 6
      RainbowPlanet/RainbowPlanet/Base/BaseViewController/BaseViewController.swift
  16. 166 0
      RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseJSWebBaseViewController.swift
  17. 168 0
      RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseJSWebViewController.swift
  18. 9 11
      RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseWebViewController.swift
  19. 81 0
      RainbowPlanet/RainbowPlanet/Base/RootViewController/RootViewController.swift
  20. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_check@2x.png
  21. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_check@3x.png
  22. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_nav_back_gray@2x.png
  23. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_nav_back_gray@3x.png
  24. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_nav_back_light@2x.png
  25. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_nav_back_light@3x.png
  26. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_uncheck@2x.png
  27. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_uncheck@3x.png
  28. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK
  29. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_check@2x.png
  30. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_check@3x.png
  31. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_nav_back_gray@2x.png
  32. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_nav_back_gray@3x.png
  33. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_nav_back_light@2x.png
  34. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_nav_back_light@3x.png
  35. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_uncheck@2x.png
  36. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_uncheck@3x.png
  37. 19 0
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Headers/ATAuthSDK.h
  38. 99 0
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Headers/TXCommonHandler.h
  39. 53 0
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Headers/TXCommonUtils.h
  40. 69 0
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Headers/TXCustomModel.h
  41. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Info.plist
  42. 6 0
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Modules/module.modulemap
  43. 21 0
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/PrivateHeaders/TXSecurityUtils.h
  44. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/checkBox_selected@3x.png
  45. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/checkBox_unSelected@3x.png
  46. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/close@3x.png
  47. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/loginBtn_Dis@3x.png
  48. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/loginBtn_Nor@3x.png
  49. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/logo@3x.png
  50. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/phoneTextfield@3x.png
  51. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/smsCodeBtn_Dis@3x.png
  52. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/smsCodeBtn_Nor@3x.png
  53. BIN
      RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/toast@3x.png
  54. 1 3
      RainbowPlanet/RainbowPlanet/Lib/WeChatSDK/WXApi.h
  55. 53 19
      RainbowPlanet/RainbowPlanet/Macro/ColorMacro.swift
  56. 163 3
      RainbowPlanet/RainbowPlanet/Macro/Common.swift
  57. 226 0
      RainbowPlanet/RainbowPlanet/Macro/EnumMacro.swift
  58. 10 0
      RainbowPlanet/RainbowPlanet/Macro/FontMacro.swift
  59. 0 14
      RainbowPlanet/RainbowPlanet/Macro/HTMLURLMacro.swift
  60. 34 1
      RainbowPlanet/RainbowPlanet/Macro/RainbowPlanet-Bridging-Header.h
  61. 94 0
      RainbowPlanet/RainbowPlanet/Manager/ATAuthSDKManager/ATAuthSDKManager.swift
  62. 60 0
      RainbowPlanet/RainbowPlanet/Manager/ATAuthSDKManager/ATAuthSDKModel.swift
  63. 23 17
      RainbowPlanet/RainbowPlanet/Manager/AlamofireReachabilityManager/AlamofireReachabilityManager.swift
  64. 46 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodUpToYoPublishModel.swift
  65. 340 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodupToyoPublishManager.swift
  66. 188 0
      RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/PublishUploadProgressView.swift
  67. 64 0
      RainbowPlanet/RainbowPlanet/Manager/AppStoreManager/AppStoreManager.swift
  68. 269 0
      RainbowPlanet/RainbowPlanet/Manager/CacheManager/CacheManager.swift
  69. 185 0
      RainbowPlanet/RainbowPlanet/Manager/MJRefreshManager/MJRefreshManager.swift
  70. 19 5
      RainbowPlanet/RainbowPlanet/Manager/MapManager/BaiduMapManager/BaiduMapManager.swift
  71. 37 62
      RainbowPlanet/RainbowPlanet/Manager/MapManager/BaiduMapManager/LocationModel.swift
  72. 24 0
      RainbowPlanet/RainbowPlanet/Manager/MessageModuleManager/MessageModuleManager.swift
  73. 105 0
      RainbowPlanet/RainbowPlanet/Manager/MusicPlayManager/MusicPlayManager.swift
  74. 190 0
      RainbowPlanet/RainbowPlanet/Manager/PathManager/PathManager.swift
  75. 0 3
      RainbowPlanet/RainbowPlanet/Manager/PayManager/PayManagerView/CommonPayView.swift
  76. 0 3
      RainbowPlanet/RainbowPlanet/Manager/PayManager/WeChatpayManager/WeChatpayManager.swift
  77. 24 0
      RainbowPlanet/RainbowPlanet/Manager/RegisterLoginManager/RegisterLoginManager.swift
  78. 107 0
      RainbowPlanet/RainbowPlanet/Manager/ThumbnailsManager/ThumbnailsManager.swift
  79. 206 160
      RainbowPlanet/RainbowPlanet/Manager/UMManager/UMManager.swift
  80. 60 0
      RainbowPlanet/RainbowPlanet/Manager/UpdateVersionManager/Model/UpdateVersionModel.swift
  81. 208 0
      RainbowPlanet/RainbowPlanet/Manager/UpdateVersionManager/View/UpdateVersionView.swift
  82. 108 0
      RainbowPlanet/RainbowPlanet/Manager/UpdateVersionManager/ViewModel/UpdateVersionManager.swift
  83. 151 0
      RainbowPlanet/RainbowPlanet/Manager/WebViewJavascriptBridgeManager/WebViewJavascriptBridgeManager.swift
  84. 55 0
      RainbowPlanet/RainbowPlanet/Model/CMSModel/CMSMemberListModel.swift
  85. 0 0
      RainbowPlanet/RainbowPlanet/Model/CMSModel/CMSModel.swift
  86. 122 0
      RainbowPlanet/RainbowPlanet/Model/CMSModel/CMSRedemptionAreaModel.swift
  87. 0 0
      RainbowPlanet/RainbowPlanet/Model/CMSModel/CMSTemplateModel.swift
  88. 31 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityCustomCommnetModel.swift
  89. 199 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityFollowFeedModel.swift
  90. 40 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityImageAuthModel.swift
  91. 55 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityMemberFollowTopicListModel.swift
  92. 53 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityMusicCategoryListModel.swift
  93. 48 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostCommentIdModel.swift
  94. 99 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostCommentsModel.swift
  95. 99 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostDetailModel.swift
  96. 59 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostMyModel.swift
  97. 28 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostReplysModel.swift
  98. 65 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostsModel.swift
  99. 33 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPublishModel.swift
  100. 0 0
      RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityRecommendFeedModel.swift

+ 1 - 0
RainbowPlanet/.gitignore

@@ -21,4 +21,5 @@ DerivedData
 
 #CocoaPods
 Pods
+Podfile.lock
 !Podfile

+ 44 - 9
RainbowPlanet/Podfile

@@ -1,3 +1,4 @@
+#source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
 # Uncomment the next line to define a global platform for your project
  platform :ios, '9.0'
 
@@ -19,12 +20,14 @@ target 'RainbowPlanet' do
   pod 'FMDB'
   # 图片加载
   pod 'Kingfisher'
-#  pod 'Nuke'
-#  pod 'Nuke-WebP-Plugin'
+  # gif动画
 #  pod 'Gifu'
+  # josn动画
+  pod 'lottie-ios'
   # 自动布局
   pod 'SnapKit'
   # 键盘
+  pod 'InputBarAccessoryView'
   pod 'IQKeyboardManagerSwift'
   # 弹框
   pod 'MBProgressHUD'
@@ -38,20 +41,34 @@ target 'RainbowPlanet' do
   pod 'JXSegmentedView'
   # 轮播
   pod 'FSPagerView'
-  # 二维码
-#  pod 'EFQRCode'
   # 小红点
   pod 'PPBadgeViewSwift'
+  # 动画效果
+#  pod 'pop'
   # pop动画
   pod 'FWPopupView'
   # 存储数据Keychain
   pod 'KeychainAccess'
-  # mvvm
-#  pod 'ReactorKit'
-  # 富文本
-#  pod 'RichEditorView'
+  # js交互
+  pod 'WebViewJavascriptBridge'
+  # 路由
+  pod 'SwiftyMediator/Routable'
+  # 上下滚动的Label
+  pod 'DPScrollNumberLabel'
+  # 左右Label
+  pod 'FlickerNumber'
+  # Label扩展
+  pod 'YYText'
+  # 生成二维码
+  pod 'EFQRCode'
+  
+  pod 'ESTabBarController-swift'
+  # 内存泄露
+  pod 'MLeaksFinder'
+#  pod 'FBMemoryProfiler'
 
-  #======================第三方平台===========
+
+#======================第三方平台===========
   #======================友盟===========
   # UM基础库
   pod 'UMCCommon'
@@ -76,4 +93,22 @@ target 'RainbowPlanet' do
   pod 'BMKLocationKit', '1.5.0'
   # 百度地图SDK
   pod 'BaiduMapKit'
+  
+  #=====================AliyunVideoSDK===========
+  pod 'AliyunVideoSDKPro'
+  pod 'QuCore-ThirdParty'
+  pod 'VODUpload'
+  pod 'AliyunOSSiOS'
+  pod 'AlivcConan'
+#  # 短视频
+#  pod 'AliyunVideoSDKPro'
+#  # 上传
+#  pod 'VODUpload'
+#  # 播放器
+#  pod 'AliPlayerSDK_iOS'
+
+  pod 'AFNetworking', '~> 3.0'
+  pod 'JSONModel','~> 1.7.0'
+  pod 'ZipArchive','1.4.0'
+  
 end

+ 125 - 24
RainbowPlanet/Podfile.lock

@@ -1,81 +1,138 @@
 PODS:
+  - AFNetworking (3.2.1):
+    - AFNetworking/NSURLSession (= 3.2.1)
+    - AFNetworking/Reachability (= 3.2.1)
+    - AFNetworking/Security (= 3.2.1)
+    - AFNetworking/Serialization (= 3.2.1)
+    - AFNetworking/UIKit (= 3.2.1)
+  - AFNetworking/NSURLSession (3.2.1):
+    - AFNetworking/Reachability
+    - AFNetworking/Security
+    - AFNetworking/Serialization
+  - AFNetworking/Reachability (3.2.1)
+  - AFNetworking/Security (3.2.1)
+  - AFNetworking/Serialization (3.2.1)
+  - AFNetworking/UIKit (3.2.1):
+    - AFNetworking/NSURLSession
   - Alamofire (4.8.2)
-  - BaiduMapKit (4.3.2)
+  - AlivcConan (0.9.5):
+    - AlivcConan/AlivcConan (= 0.9.5)
+  - AlivcConan/AlivcConan (0.9.5)
+  - AliyunOSSiOS (2.10.7)
+  - AliyunVideoSDKPro (3.11.0)
+  - BaiduMapKit (4.4.2)
   - BMKLocationKit (1.5.0)
   - Cache (5.2.0)
   - DeviceKit (2.0.0)
+  - DPScrollNumberLabel (0.0.2)
+  - EFQRCode (5.0.0):
+    - swift_qrcodejs (~> 1.1.1)
+  - ESTabBarController-swift (2.7)
+  - FBRetainCycleDetector (0.1.4)
+  - FlickerNumber (1.1)
   - FMDB (2.7.5):
     - FMDB/standard (= 2.7.5)
   - FMDB/standard (2.7.5)
   - FSPagerView (0.8.2)
-  - FWPopupView (4.0.6):
+  - FWPopupView (4.0.7):
     - SnapKit
-  - IQKeyboardManagerSwift (6.3.0)
-  - JXSegmentedView (0.0.13)
+  - InputBarAccessoryView (4.3.1):
+    - InputBarAccessoryView/Core (= 4.3.1)
+  - InputBarAccessoryView/Core (4.3.1)
+  - IQKeyboardManagerSwift (6.4.1)
+  - JSONModel (1.7.0)
+  - JXSegmentedView (0.0.19)
   - KeychainAccess (3.2.0)
   - Kingfisher (4.10.1)
-  - LYEmptyView (1.2.3)
+  - lottie-ios (3.1.2)
+  - LYEmptyView (1.2.5)
   - MBProgressHUD (1.1.0)
   - MJRefresh (3.2.0)
+  - MLeaksFinder (1.0.0):
+    - FBRetainCycleDetector
   - Moya/Core (13.0.1):
     - Alamofire (~> 4.1)
     - Result (~> 4.1)
   - Moya/RxSwift (13.0.1):
     - Moya/Core
     - RxSwift (~> 4.0)
-  - ObjectMapper (3.4.2)
+  - ObjectMapper (3.5.1)
   - PPBadgeViewSwift (3.1.0)
+  - QuCore-ThirdParty (3.10.0)
   - Result (4.1.0)
   - RxCocoa (4.5.0):
     - RxSwift (>= 4.4.2, ~> 4.4)
   - RxSwift (4.5.0)
   - SnapKit (4.2.0)
+  - swift_qrcodejs (1.1.1)
   - SwiftyJSON (5.0.0)
-  - UMCAnalytics (6.0.3):
+  - SwiftyMediator/Core (0.2.0)
+  - SwiftyMediator/Routable (0.2.0):
+    - SwiftyMediator/Core
+  - UMCAnalytics (6.0.5):
     - UMCCommon
-  - UMCCommon (2.0.1)
+  - UMCCommon (2.1.1)
   - UMCCommonLog (1.0.0)
   - UMCPush (3.2.4):
     - UMCCommon
   - UMCSecurityPlugins (1.0.6)
-  - UMCShare/Core (6.9.5):
+  - UMCShare/Core (6.9.6):
     - UMCCommon
-  - UMCShare/Social/ReducedQQ (6.9.5):
+  - UMCShare/Social/ReducedQQ (6.9.6):
     - UMCCommon
     - UMCShare/Core
-  - UMCShare/Social/ReducedSina (6.9.5):
+  - UMCShare/Social/ReducedSina (6.9.6):
     - UMCCommon
     - UMCShare/Core
-  - UMCShare/Social/ReducedWeChat (6.9.5):
+  - UMCShare/Social/ReducedWeChat (6.9.6):
     - UMCCommon
     - UMCShare/Core
-  - UMCShare/UI (6.9.5):
+  - UMCShare/UI (6.9.6):
     - UMCCommon
     - UMCShare/Core
+  - VODUpload (1.5.1):
+    - AliyunOSSiOS
+  - WebViewJavascriptBridge (6.0.3)
+  - YYText (1.0.7)
+  - ZipArchive (1.4.0)
 
 DEPENDENCIES:
+  - AFNetworking (~> 3.0)
   - Alamofire
+  - AlivcConan
+  - AliyunOSSiOS
+  - AliyunVideoSDKPro
   - BaiduMapKit
   - BMKLocationKit (= 1.5.0)
   - Cache
   - DeviceKit
+  - DPScrollNumberLabel
+  - EFQRCode
+  - ESTabBarController-swift
+  - FlickerNumber
   - FMDB
   - FSPagerView
   - FWPopupView
+  - InputBarAccessoryView
   - IQKeyboardManagerSwift
+  - JSONModel (~> 1.7.0)
   - JXSegmentedView
   - KeychainAccess
   - Kingfisher
+  - lottie-ios
   - LYEmptyView
   - MBProgressHUD
   - MJRefresh
+  - MLeaksFinder
   - Moya/RxSwift
   - ObjectMapper
   - PPBadgeViewSwift
+  - QuCore-ThirdParty
   - RxCocoa
   - RxSwift
   - SnapKit
   - SwiftyJSON
+  - SwiftyMediator/Routable
   - UMCAnalytics
   - UMCCommon
   - UMCCommonLog
@@ -85,70 +142,114 @@ DEPENDENCIES:
   - UMCShare/Social/ReducedSina
   - UMCShare/Social/ReducedWeChat
   - UMCShare/UI
+  - VODUpload
+  - WebViewJavascriptBridge
+  - YYText
+  - ZipArchive (= 1.4.0)
 
 SPEC REPOS:
   https://github.com/cocoapods/specs.git:
+    - AFNetworking
     - Alamofire
+    - AlivcConan
+    - AliyunOSSiOS
+    - AliyunVideoSDKPro
     - BaiduMapKit
     - BMKLocationKit
     - Cache
     - DeviceKit
+    - DPScrollNumberLabel
+    - EFQRCode
+    - ESTabBarController-swift
+    - FBRetainCycleDetector
+    - FlickerNumber
     - FMDB
     - FSPagerView
     - FWPopupView
+    - InputBarAccessoryView
     - IQKeyboardManagerSwift
+    - JSONModel
     - JXSegmentedView
     - KeychainAccess
     - Kingfisher
+    - lottie-ios
     - LYEmptyView
     - MBProgressHUD
     - MJRefresh
+    - MLeaksFinder
     - Moya
     - ObjectMapper
     - PPBadgeViewSwift
+    - QuCore-ThirdParty
     - Result
     - RxCocoa
     - RxSwift
     - SnapKit
+    - swift_qrcodejs
     - SwiftyJSON
+    - SwiftyMediator
     - UMCAnalytics
     - UMCCommon
     - UMCCommonLog
     - UMCPush
     - UMCSecurityPlugins
     - UMCShare
+    - VODUpload
+    - WebViewJavascriptBridge
+    - YYText
+    - ZipArchive
 
 SPEC CHECKSUMS:
+  AFNetworking: b6f891fdfaed196b46c7a83cf209e09697b94057
   Alamofire: ae5c501addb7afdbb13687d7f2f722c78734c2d3
-  BaiduMapKit: a5d9580553355d39a91b24c5eb91ebf298c64038
+  AlivcConan: 9dccc32986024768bb5f50e14ad54490123903c7
+  AliyunOSSiOS: 602b6a4e70e62a5f0a6431c20496343141d7e66f
+  AliyunVideoSDKPro: da710c1e7fb93b1e9a741b3619814c6608780b4b
+  BaiduMapKit: 11acde2e7c06e31b7de60b323880a5eb7c4dccb6
   BMKLocationKit: 40d267478acd8704ddebd0e9deaddc727b13df9f
   Cache: 807c5d86d01a177f06ede9865add3aea269bbfd4
   DeviceKit: 72d36709552d4b3582abd76a53949148acad9811
+  DPScrollNumberLabel: 5124eaccf3029bb84116de391e1273cba676f4f5
+  EFQRCode: 07437cfbce3a1e497397a4f3d766c980d8972608
+  ESTabBarController-swift: 4fb52ad03d94d0717ef97bc9eb09a5abfdded0a2
+  FBRetainCycleDetector: 46f8179bbb1c587deee3ea838a1a3ee02acf5015
+  FlickerNumber: bce41da51904d533393d69e9734df6281ab1c646
   FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
   FSPagerView: 816a18842306973cc7cc6df8a5332272f7815c30
-  FWPopupView: 50e0db3245879b9b73552c897b17a215ac0f9199
-  IQKeyboardManagerSwift: a8228c257614af98743b4cd8584637025f36358f
-  JXSegmentedView: adb975e3af18ba9934e9fd3740e536173eb468ab
+  FWPopupView: c1dbb33fbe4d223f619f28a7e5e5a00f08c10342
+  InputBarAccessoryView: 58a348be7ea2736c7eec60e5c315511c2dbb39fd
+  IQKeyboardManagerSwift: d2df660d0b8d64a15cb2537c9ff303213fa515b2
+  JSONModel: 840bc0fcffb24b8454d2c026bf26fea454b8e98d
+  JXSegmentedView: 6e22381bd1e6f0767fc078bef1947b13b2d337a1
   KeychainAccess: 3b1bf8a77eb4c6ea1ce9404c292e48f948954c6b
   Kingfisher: c148cd7b47ebde9989f6bc7c27dcaa79d81279a0
-  LYEmptyView: ea5827f3f81fcbec427f990005501991477bdae8
+  lottie-ios: 49cd85b1f24f61a7708ad7ec76a523ab2d0e3100
+  LYEmptyView: b17adfc2dd9ad2988ecaf7c9606efa916e24c767
   MBProgressHUD: e7baa36a220447d8aeb12769bf0585582f3866d9
   MJRefresh: ed450d6eb9d3346a2cb033ab7eb6de090aeef437
+  MLeaksFinder: 8c435bd2f6d070af18cff082b503b21adc130fc0
   Moya: f4a4b80ff2f8a4ffc208dfb31cd91636622fee6e
-  ObjectMapper: 0d4402610f4e468903ae64629eec4784531e5c51
+  ObjectMapper: 70187b8941977c62ccfb423caf6b50be405cabf0
   PPBadgeViewSwift: 18a219a9897f418342c22dd1a54f7b18ac56546b
+  QuCore-ThirdParty: 60a6f08864631569569fa1e2c6208a7746698923
   Result: bd966fac789cc6c1563440b348ab2598cc24d5c7
   RxCocoa: cbf70265dc65a981d4ac982e513c10cf23df24a0
   RxSwift: f172070dfd1a93d70a9ab97a5a01166206e1c575
   SnapKit: fe8a619752f3f27075cc9a90244d75c6c3f27e2a
+  swift_qrcodejs: 0bacbfe321a99954c7b8e04c75562007ea4e4f7c
   SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7
-  UMCAnalytics: ff58714ada407682c4a07548156f94bcec92f055
-  UMCCommon: 0263a057a2e1ae1da4c8308541e56904a493ce13
+  SwiftyMediator: 73d97b2387f03c4f0320c1fbdf615e5fbb98871d
+  UMCAnalytics: 045be2cd1ec05aa95ad62405a850757f932e2d59
+  UMCCommon: 971f324a5a99c9d662ae040a815e7e3d7ef8b2a8
   UMCCommonLog: 05a2d5de21858e3d870551562cff405c1366d244
   UMCPush: 1edd856027dcf905333effb4040ace5d236a7316
   UMCSecurityPlugins: 0831a08f3988f3cea9f1d3a7626cd9bee4fef150
-  UMCShare: 552b29753f1b4da87b51d96545ed19e6263df397
+  UMCShare: e0cef55c0fd6051254c8cda1d0630eb578b27bad
+  VODUpload: d180069b5fcee002079a892de2f310bacdb8e355
+  WebViewJavascriptBridge: 7f5bc4d3581e672e8f32bd0f812d54bc69bb8e29
+  YYText: 5c461d709e24d55a182d1441c41dc639a18a4849
+  ZipArchive: e25a4373192673e3229ac8d6e9f64a3e5713c966
 
-PODFILE CHECKSUM: 4a01ace7f7c9830f6f0d05d8b32b73e6e6dd61fa
+PODFILE CHECKSUM: 810a7117534d7cc86fe6e12f6388571ac3b400f2
 
-COCOAPODS: 1.7.1
+COCOAPODS: 1.7.4

Різницю між файлами не показано, бо вона завелика
+ 3677 - 675
RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj


+ 7 - 0
RainbowPlanet/RainbowPlanet.xcodeproj/xcshareddata/xcschemes/RainbowPlanet.xcscheme

@@ -82,6 +82,13 @@
             ReferencedContainer = "container:RainbowPlanet.xcodeproj">
          </BuildableReference>
       </BuildableProductRunnable>
+      <EnvironmentVariables>
+         <EnvironmentVariable
+            key = "OS_ACTIVITY_MODE"
+            value = "disable"
+            isEnabled = "YES">
+         </EnvironmentVariable>
+      </EnvironmentVariables>
       <AdditionalOptions>
       </AdditionalOptions>
    </LaunchAction>

+ 20 - 21
RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+HandleOpen.swift

@@ -17,6 +17,11 @@ extension AppDelegate {
         if (!result) {
             // 其他如支付等SDK的回调
             result = PayManager.shared().handleOpen(url: url)
+            if !result {
+                // 自己路由
+                result = RouterManager.shared.handleOpen(url: url)
+                return result
+            }
             return result
         }
         return result;
@@ -27,6 +32,11 @@ extension AppDelegate {
         if (!result) {
             // 其他如支付等SDK的回调
             result = PayManager.shared().handleOpen(url: url)
+            if !result {
+                // 自己路由
+                result = RouterManager.shared.handleOpen(url: url)
+                return result
+            }
             return result
         }
         return result;
@@ -35,34 +45,23 @@ extension AppDelegate {
     //iOS10以下使用这两个方法接收通知,
     func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
         //关闭友盟自带的弹出框
-        UMessage.setAutoAlert(true)
-        if #available(iOS 9.0, *)  {
-            if #available(iOS 10.0, *){
-            }else {
-                UMessage.didReceiveRemoteNotification(userInfo)
-                completionHandler(UIBackgroundFetchResult.newData);
-            }
-        }
+        UMessage.setAutoAlert(false)
+        UMessage.didReceiveRemoteNotification(userInfo)
+        RouterManager.shared.UMPush(pushModel: PushModel(JSONString: userInfo.description) ?? PushModel())
+        completionHandler(UIBackgroundFetchResult.newData);
     }
 
     func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
         //关闭友盟自带的弹出框
-        UMessage.setAutoAlert(true)
-        if #available(iOS 9.0, *)  {
-            if #available(iOS 10.0, *){
-            }else {
-                UMessage.didReceiveRemoteNotification(userInfo)
-            }
-        }
+        UMessage.setAutoAlert(false)
+        RouterManager.shared.UMPush(pushModel: PushModel(JSONString: userInfo.description) ?? PushModel())
+
+        // 接受笑死通知
+        UMessage.didReceiveRemoteNotification(userInfo)
     }
 
     /// 获取设备的 DeviceToken
     func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
-        var tokenString = ""
-        for byte in deviceToken {
-            let hexString = String(format: "%02x", byte)
-            tokenString += hexString
-        }
-        NXLLog(tokenString)
+        UMessage.registerDeviceToken(deviceToken)
     }
 }

+ 87 - 30
RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+Window.swift

@@ -7,56 +7,101 @@
 //
 
 import UIKit
+import SwiftyMediator
+import Kingfisher
+
 
 extension AppDelegate {
 
-    func initWindow() {
-        
+    func initWindow(didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
         window = UIWindow.init(frame: UIScreen.main.bounds)
         window?.backgroundColor = UIColor.white
+        //版本更新
+        _ = UpdateVersionManager.shared
+        let vc = RootViewController()
+        vc.launchOptions = launchOptions
+        window?.rootViewController = vc
         window?.makeKeyAndVisible()
-        setBaiduToCityFactory()
+        //基础配置
         DispatchQueue.global(qos: .default).async {
             [weak self] in
+            
             /// 设置全局的tabbar
             self?.setTabbarAppearence()
             /// 设置全局的navigation
             self?.setNavBarAppearence()
+            /// 设置全局的TableView
+            self?.setTableViewAppearance()
+            /// 城市转换
+            self?.setBaiduToCityFactory()
+            /// 设置默认为快递
+            let deliveryMethodTypeModel = DeliveryMethodTypeModel.shared()
+            deliveryMethodTypeModel.deliveryMethodType = "2"
+            DeliveryMethodTypeModel.shared().setModel(model: deliveryMethodTypeModel)
+            //网络监听
+            //        AlamofireReachabilityManager.shared.reachability()
+            //键盘处理
+            IQKeyboardManagerSwiftManager.shared().initIQKeyboardManagerSwift()
         }
-        if (UserModel.shared().getModel()?.token) != nil && (DeliveryMethodTypeModel.shared().getModel()?.deliveryMethodType) != nil {
-            /// 设置Tabbar
-            /// 刷新token
-            setTabbarController()
-            SwiftMoyaNetWorkServiceUser.shared().userRefreshApi { _ in }
-        } else if (UserModel.shared().getModel()?.token) != nil && (DeliveryMethodTypeModel.shared().getModel()?.deliveryMethodType) == nil {
-            /// 设置Tabbar
-            setLocationViewController()
-            SwiftMoyaNetWorkServiceUser.shared().userRefreshApi { _ in }
-        }else {
-            /// 设置登录
-            setLoginController()
-        }
-
-        /// 引导页
-        setGuidePageView()
     }
     
     /// 设置Tabbar
     func setTabbarController() {
-        self.window?.rootViewController = BaseTabbarViewController.shared().tabBarViewController()
+
+        setTabbarViewBarNil()
+        /// 判断初始化页面
+        if (UserModel.shared().getModel()?.token) != nil { //是否已经登录
+            SwiftMoyaNetWorkServiceUser.shared().userRefreshApi {
+                [weak self] _ in
+
+                if(UserModel.shared().getModel()?.isFollowSuggestTopic == 0 || UserModel.shared().getModel()?.isFollowSuggestTopic == nil ) {//设置性别话题
+                    self?.setLoginOut()
+                }else {
+                    self?.window?.rootViewController = BaseTabbarViewController.shared.tabBarViewController()
+                    //U米
+                    UserMemberTotalBeanViewModel.shared.userMemberGetTotalBeanApiInterval()
+                    //获取消息的小红点
+                    MessageModuleManager.shared.userMemberMessageIndexApi()
+                }
+            }
+        }else {// 进入首页
+            self.window?.rootViewController = BaseTabbarViewController.shared.tabBarViewController()
+            //添加登录view
+            LoginNowView.initLoginNowView()
+        }
+    }
+    
+    func setTabbarViewBarNil() {
+        BaseTabbarViewController.shared.v1 = nil
+        BaseTabbarViewController.shared.v2 = nil
+        BaseTabbarViewController.shared.v3 = nil
+        BaseTabbarViewController.shared.v4 = nil
+        BaseTabbarViewController.shared.v5 = nil
+        BaseTabbarViewController.shared.lottieAnimateContentView1 = nil
+        BaseTabbarViewController.shared.lottieAnimateContentView2 = nil
+        BaseTabbarViewController.shared.lottieAnimateContentView4 = nil
+        BaseTabbarViewController.shared.lottieAnimateContentView5 = nil
+        BaseTabbarViewController.shared.esTabBarController = nil
+        KingfisherManager.shared.cache.clearMemoryCache()
+        KingfisherManager.shared.cache.clearDiskCache()
     }
+    
 
-    /// 设置Login
-    func setLoginController() {
-        UserModel.shared().removeLoginModel()
-        DeliveryMethodTypeModel.shared().removeLoginModel()
-        self.window?.rootViewController = BaseNavigationViewController.init(rootViewController: RegisterLoginViewController())
+    /// 登录
+    func setLogin() {
+        Mediator.present(RegisterLoginRouterModuleType.presentRegisterLogin)
     }
     
-    /// 设置定位页面
-    func setLocationViewController() {
-        
-        self.window?.rootViewController = BaseNavigationViewController.init(rootViewController: LocationViewController())
+    /// 退出登录
+    func setLoginOut() {
+        //移除本地用户信息
+        UserModel.shared().removeLoginModel()
+        //移除快递信息
+        DeliveryMethodTypeModel.shared().removeLoginModel()
+        //置空
+        setTabbarViewBarNil()
+        //进入到首页
+        setTabbarController()
     }
 
      /// 设置全局的navigation
@@ -72,6 +117,18 @@ extension AppDelegate {
         UITabBar.appearance().shadowImage = UIImage(named: "tab_top_line")
     }
     
+    /// UITableView全局
+    func setTableViewAppearance() {
+        UITableView.appearance().estimatedRowHeight = 0
+        UITableView.appearance().estimatedSectionHeaderHeight = 0
+        UITableView.appearance().estimatedSectionFooterHeight = 0
+    }
+    
+    func setKingfisher() {
+       
+    }
+
+    
     ///设置百度city转
     func setBaiduToCityFactory() {
         BaiduToCityFactory.shared.setSaveBaiduToCity()
@@ -79,7 +136,7 @@ extension AppDelegate {
 
     //设置引导页
     func setGuidePageView() {
-        
+        GuidePageView.guidePageView(images: ["guide_1","guide_2","guide_3","guide_4"])
     }
     
 }

+ 8 - 14
RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate.swift

@@ -7,28 +7,22 @@
 //
 
 import UIKit
+import Kingfisher
 
 @UIApplicationMain
 class AppDelegate: UIResponder, UIApplicationDelegate {
 
     var window: UIWindow?
-
+    
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
         //初始化窗口
-        initWindow()
+        initWindow(didFinishLaunchingWithOptions: launchOptions)
         
-        DispatchQueue.global(qos: .default).async {
-            //初始化百度地图
-            BaiduMapManager.shared.initBaiduMap()
-            //初始化键盘
-            DispatchQueue.main.async {
-                //初始化友盟
-                UMManager.shared().initUM(launchOptions: launchOptions)
-                IQKeyboardManagerSwiftManager.shared().initIQKeyboardManagerSwift()
-            }
-        }
-    
         return true
     }
-
+    
+    func applicationDidReceiveMemoryWarning(_ application: UIApplication) {
+        KingfisherManager.shared.cache.clearDiskCache()
+        KingfisherManager.shared.cache.clearMemoryCache()
+    }
 }

+ 1 - 0
RainbowPlanet/RainbowPlanet/Base/BaseNavigationController/BaseNavigationViewController.swift

@@ -12,6 +12,7 @@ class BaseNavigationViewController: UINavigationController {
 
     override func viewDidLoad() {
         super.viewDidLoad()
+        self.navigationBar.isHidden = true
 
         // Do any additional setup after loading the view.
     }

+ 72 - 0
RainbowPlanet/RainbowPlanet/Base/BaseTabbarViewController/BaseLottieAnimateContentView.swift

@@ -0,0 +1,72 @@
+//
+//  BaseLottieAnimateContentView.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/7/18.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import ESTabBarController_swift
+import Lottie
+
+
+class BaseLottieAnimateContentView: ESTabBarItemContentView {
+    
+    let animationView = AnimationView()
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        self.imageView.isHidden = true
+        
+    }
+    
+    init(jsonStr:String) {
+        self.init()
+        
+        textColor = k666666Color
+        iconColor = k333333Color
+        highlightTextColor = k333333Color
+
+        let animation = Animation.named(jsonStr)
+        animationView.animation = animation
+        animationView.contentMode = .scaleAspectFit
+        animationView.loopMode = .playOnce
+        animationView.animationSpeed = 1.5
+        addSubview(animationView)
+
+    }
+    
+    public required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    override func updateLayout() {
+        super.updateLayout()
+        animationView.frame = self.imageView.frame
+        if selected {
+            animationView.isHidden = false
+            self.imageView.isHidden = true
+            animationView.play()
+        }else {
+            animationView.isHidden = true
+            self.imageView.isHidden = false
+            animationView.stop()
+        }
+    }
+    
+    override func selectAnimation(animated: Bool, completion: (() -> ())?) {
+        super.selectAnimation(animated: animated, completion: nil)
+        animationView.isHidden = false
+        self.imageView.isHidden = true
+        animationView.play()
+    }
+    
+    override func deselectAnimation(animated: Bool, completion: (() -> ())?) {
+        super.deselectAnimation(animated: animated, completion: nil)
+        animationView.isHidden = true
+        self.imageView.isHidden = false
+        
+        animationView.stop()
+    }
+    
+
+}

+ 29 - 0
RainbowPlanet/RainbowPlanet/Base/BaseTabbarViewController/BaseTabBarItemContentView.swift

@@ -0,0 +1,29 @@
+//
+//  File.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/7/29.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+
+import UIKit
+import ESTabBarController_swift
+
+
+class BaseTabBarItemContentView: ESTabBarItemContentView {
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        textColor = k666666Color
+        highlightTextColor = k333333Color
+        
+        iconColor = k333333Color
+    }
+    public required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    
+}

+ 230 - 25
RainbowPlanet/RainbowPlanet/Base/BaseTabbarViewController/BaseTabbarViewController.swift

@@ -7,47 +7,252 @@
 //
 
 import UIKit
+import Lottie
+import ESTabBarController_swift
 
-class BaseTabbarViewController: UITabBarController {
-    private static let _sharedInstance = BaseTabbarViewController()
-
-    class func shared() -> BaseTabbarViewController {
-        return _sharedInstance
-    }
+class BaseTabbarViewController: NSObject {
 
+    static let shared : BaseTabbarViewController = BaseTabbarViewController()
+    
+    var esTabBarController : ESTabBarController!
+    
+    /// 社区
+    var v1 : CommunityViewController!
+    /// 商城
+//    var v2 = ShoppingMallViewController!
+    /// 兑换专区
+    var v2 : RedemptionAreaViewController!
+    /// 发布
+    var v3 : BaseViewController!
+    /// 消息
+    var v4 : MessageMainViewController!
+    /// 我的
+    var v5 : UserPersonalCenterViewController!
+    
+    /// 社区
+    var lottieAnimateContentView1 : BaseLottieAnimateContentView!
+    
+    /// 商城
+    var lottieAnimateContentView2 : BaseLottieAnimateContentView!
     
+    /// 消息
+    var lottieAnimateContentView4 : BaseLottieAnimateContentView!
     
-    override func viewDidLoad() {
-        super.viewDidLoad()
+    /// 我的
+    var lottieAnimateContentView5 : BaseLottieAnimateContentView!
+    
+    
+    
+    var lastIndex : Int = 0
 
-        // Do any additional setup after loading the view.
-    }
+    func tabBarViewController() -> ESTabBarController {
+        esTabBarController = ESTabBarController()
+        
+        esTabBarController.tabBar.shadowImage = UIImage(named: "navbar_shadow_pic_down")
+        esTabBarController.shouldHijackHandler = {
+           [weak self] (tabbarController, viewController, index) in
+            AudioServicesPlaySystemSound(1519)
+
+            if UserModel.isTokenNil() {
+                if index == 2 || index == 3 || index == 4 {
+                    return true
+                }else {
+                    self?.reloadTabbar(index:index)
+                    self?.lastIndex = index
+                    return false
+                }
+            }else {
+                if index == 2 {
+                    self?.lastIndex = index
+                    return true
+                }else {
+                    self?.reloadTabbar(index:index)
+                    self?.lastIndex = index
+                    return false
+                }
+            }
+            
+            
+        }
 
-    func tabBarViewController() -> BaseTabbarViewController {
-        let tabBarViewController = BaseTabbarViewController()
+        esTabBarController.didHijackHandler = {
+            [weak self] tabbarController, viewController, index in
+            if UserModel.isTokenNil() {
+                kAppDelegate.setLogin()
+            }else {
+                self?.pushPublishVC()
+            }
+        }
+        
+        /// 社区
+        v1 = CommunityViewController()
+        /// 商城
+        //    var v2 = ShoppingMallViewController!
+        /// 兑换专区
+        v2 = RedemptionAreaViewController()
+        /// 发布
+        v3 = BaseViewController()
+        /// 消息
+        v4 = MessageMainViewController()
+        /// 我的
+        v5 = UserPersonalCenterViewController()
+        
+        /// 社区
+        lottieAnimateContentView1 = BaseLottieAnimateContentView(jsonStr: "communityModuleTabbar")
+        
+        /// 商城
+        lottieAnimateContentView2 = BaseLottieAnimateContentView(jsonStr: "shoppingMallModuleTabbar")
+        
+        /// 消息
+        lottieAnimateContentView4 = BaseLottieAnimateContentView(jsonStr: "messageModuleTabbar")
+        
+        /// 我的
+        lottieAnimateContentView5 = BaseLottieAnimateContentView(jsonStr: "MineModuleTabbar")
+        
+        v1.tabBarItem = ESTabBarItem.init(lottieAnimateContentView1, title: "社区", image: UIImage(named: "tabbar_home")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal), selectedImage: nil)
+        v2.tabBarItem = ESTabBarItem.init(lottieAnimateContentView2, title: "商城", image: UIImage(named: "tabbar_shopping")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal), selectedImage: nil)
+        v3.tabBarItem = UITabBarItem(title: nil, image: UIImage(named: "tabbar_publish")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal), selectedImage: UIImage(named: "tabbar_publish")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal))
+        v3.tabBarItem.imageInsets =  UIEdgeInsets(top: 4, left: 0, bottom: -4, right: 0);
+        
+        if UserModel.isTokenNil() {
 
-        let v1 = ShoppingMallViewController()
-        let v2 = ShoppingCartViewController()
-        let v3 = MineViewController()
+            v4.tabBarItem = ESTabBarItem.init(BaseTabBarItemContentView(), title: "消息", image: UIImage(named: "tabbar_massage")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal), selectedImage: nil)
+            v5.tabBarItem = ESTabBarItem.init(BaseTabBarItemContentView(), title: "我的", image: UIImage(named: "tabbar_my")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal), selectedImage: nil)
+
+        }else {
+            v4.tabBarItem = ESTabBarItem.init(lottieAnimateContentView4, title: "消息", image: UIImage(named: "tabbar_massage")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal), selectedImage: nil)
+            v5.tabBarItem = ESTabBarItem.init(lottieAnimateContentView5, title: "我的", image: UIImage(named: "tabbar_my")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal), selectedImage: nil)
+        }
+        
 
         let n1 = BaseNavigationViewController.init(rootViewController: v1)
         let n2 = BaseNavigationViewController.init(rootViewController: v2)
         let n3 = BaseNavigationViewController.init(rootViewController: v3)
+        let n4 = BaseNavigationViewController.init(rootViewController: v4)
+        let n5 = BaseNavigationViewController.init(rootViewController: v5)
 
-        tabBarItemStyle(navc: n1, normalImg: "tabbar_home", selectorImg: "tabbar_home_pre", title: "首页")
-        tabBarItemStyle(navc: n2, normalImg: "tabbar_shopping", selectorImg: "tabbar_shopping_pre", title: "购物车")
-        tabBarItemStyle(navc: n3, normalImg: "tabbar_my", selectorImg: "tabbar_my_pre", title: "我的彩虹")
+        esTabBarController.viewControllers = [n1, n2, n3, n4, n5]
+        //将要进入前台的时候
+        setBadge()
+        NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: OperationQueue.main, using: {
+            [weak self] (notification) in
+            if !UserModel.isTokenNil() {
+                //获取消息的小红点
+                MessageModuleManager.shared.userMemberMessageIndexApi()
+                self?.setBadge()
+            }
 
-        tabBarViewController.viewControllers = [n1, n2, n3]
-        return tabBarViewController
+        })
+        //监听消息
+        NotificationCenter.default.addObserver(forName: NSNotification.Name("MessageMainViewController"), object: nil, queue: OperationQueue.main) {
+            [weak self] notification in
+            self?.setBadge()
+        }
+        return esTabBarController
     }
+    
+    /// 跳转到VC
+    func pushPublishVC() {
+        if BaseTabbarViewController.shared.v1.navigationBarbgView.isHidden {
+            let pickVc = PublishViewController()
+            let nav = BaseNavigationViewController.init(rootViewController: pickVc)
+            BaseTabbarViewController.shared.esTabBarController.present(nav, animated: true, completion: nil)
+        } else {
+            SwiftProgressHUD.shared().showText("内容上传中,请稍等", textAlignment: .center)
+        }
+    }
+    
+    // 设置Badge
+    func setBadge() {
+        //消息
+        let messageIndexModel = MessageIndexModel.shared.object()
+        if messageIndexModel?.activity?.isYes == 1 || messageIndexModel?.follow?.isYes == 1 || messageIndexModel?.notification?.isYes == 1 || messageIndexModel?.praise?.isYes == 1 || messageIndexModel?.comment?.isYes == 1 {
+            let tabBarItem = v4.tabBarItem as? ESTabBarItem
+            tabBarItem?.contentView?.badgeColor = kFE352BColor
+            tabBarItem?.contentView?.badgeValue = ""
+            tabBarItem?.contentView?.badgeOffset = UIOffset(horizontal: 0, vertical: -22)
+        }else {
+            let tabBarItem = v4.tabBarItem as? ESTabBarItem
+            tabBarItem?.contentView?.badgeValue = nil
+        }
+        
+        //我的
+        if UpdateVersionModel.shared.object()?.upGradeModelType == .update ||  UpdateVersionModel.shared.object()?.upGradeModelType == .strongUpdate {
 
+            let tabBarItem = v5.tabBarItem as? ESTabBarItem
+            tabBarItem?.contentView?.badgeColor = kFE352BColor
+            tabBarItem?.contentView?.badgeValue = ""
+            tabBarItem?.contentView?.badgeOffset = UIOffset(horizontal: 0, vertical: -22)
+        }else {
+            let tabBarItem = v5.tabBarItem as? ESTabBarItem
+            tabBarItem?.contentView?.badgeValue = nil
+        }
+    }
+    
+    func reloadTabbar(index:Int) {
+        
+        if index == 0 && lastIndex == 0  {
+            self.lottieAnimateContentView1.animationView.stop()
+            self.lottieAnimateContentView1.animationView.play()
 
-    private func tabBarItemStyle(navc : UINavigationController, normalImg : String, selectorImg : String, title : String){
-        navc.tabBarItem = UITabBarItem.init(title: title, image: UIImage(named:normalImg), selectedImage: UIImage(named:selectorImg))
-        navc.tabBarItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor:k333333Color], for: UIControl.State.normal)
-        navc.tabBarItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor:k333333Color], for: UIControl.State.selected)
-
+            if communityModuleTopType == .communityModuleFollowTop {
+                NotificationCenter.default.post(name: NSNotification.Name("CommunityModuleFollowTop"), object: nil)
+                
+            }
+            if communityModuleTopType == .communityModuleRecommendTop {
+                NotificationCenter.default.post(name: NSNotification.Name("CommunityModuleRecommendTop"), object: nil)
+                
+            }
+            if communityModuleTopType == .communityModulePlanetTop {
+                NotificationCenter.default.post(name: NSNotification.Name("CommunityModulePlanetTop"), object: nil)
+                
+            }
+            
+        }
+        if index == 1 && lastIndex == 1  {
+            self.lottieAnimateContentView2.animationView.stop()
+            self.lottieAnimateContentView2.animationView.play()
+//            NotificationCenter.default.post(name: NSNotification.Name("ShoppingMallModuleTop"), object: nil)
+            NotificationCenter.default.post(name: NSNotification.Name("RedemptionAreaModuleTop"), object: nil)
+            
+        }
+        if index == 3 && lastIndex == 3  {
+            self.lottieAnimateContentView4.animationView.stop()
+            self.lottieAnimateContentView4.animationView.play()
+            NotificationCenter.default.post(name: NSNotification.Name("MessageModuleTop"), object: nil)
+            
+        }
+        if index == 4 && lastIndex == 4  {
+            self.lottieAnimateContentView5.animationView.stop()
+            self.lottieAnimateContentView5.animationView.play()
+            NotificationCenter.default.post(name: NSNotification.Name("MineModuleTop"), object: nil)
+        }
     }
+    
+}
 
+extension ESTabBar {
+    open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
+        
+        let view  = super.hitTest(point, with: event)
+        if view == nil {
+            if UserModel.isTokenNil() && (getCurrentVC() is CommunityViewController || getCurrentVC() is RedemptionAreaViewController) {
+                for subView in subviews {
+                    if !subView.subviews.isEmpty {
+                        for subView in subView.subviews {
+                            let myPoint = subView.convert(point, from: self)
+                            if subView.bounds.contains(myPoint) {
+                                return subView
+                            }
+                        }
+                    }
+                    let myPoint = subView.convert(point, from: self)
+                    if subView.bounds.contains(myPoint) {
+                        return subView
+                    }
+                }
+            }
+        }
+        return view
+    }
 }

+ 5 - 0
RainbowPlanet/RainbowPlanet/Base/BaseView/BaseView.swift

@@ -17,6 +17,7 @@ class BaseView: UIView {
         super.init(frame: frame)
         self.setupViews()
         self.setupLayouts()
+        self.setupData()
     }
     required init?(coder aDecoder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
@@ -29,5 +30,9 @@ class BaseView: UIView {
     func setupLayouts() {
 
     }
+    
+    func setupData() {
+        
+    }
 
 }

+ 16 - 6
RainbowPlanet/RainbowPlanet/Base/BaseViewController/BaseViewController.swift

@@ -8,23 +8,28 @@
 
 import UIKit
 import RxSwift
+import Kingfisher
 
 class BaseViewController: UIViewController {
 
     let disposeBag = DisposeBag()
 
     lazy var navigationBar = WRCustomNavigationBar.CustomNavigationBar()
+    
+    deinit {
+        KingfisherManager.shared.cache.clearDiskCache()
+        KingfisherManager.shared.cache.clearMemoryCache()
+    }
 
     override func viewDidLoad() {
         super.viewDidLoad()
         navigationController?.navigationBar.isHidden = true
-        automaticallyAdjustsScrollViewInsets = false
         view.backgroundColor = UIColor.white
         if #available(iOS 11.0, *) {
-            UIScrollView.appearance().contentInsetAdjustmentBehavior =  .automatic
+            UIScrollView.appearance().contentInsetAdjustmentBehavior = .never
         } else {
             if self.responds(to: #selector(setter: self.automaticallyAdjustsScrollViewInsets)) {
-                self.automaticallyAdjustsScrollViewInsets = true
+                self.automaticallyAdjustsScrollViewInsets = false
             }
         }
         setupNavigationBar()
@@ -32,7 +37,7 @@ class BaseViewController: UIViewController {
     
     fileprivate func setupNavigationBar()
     {
-        navigationBar.wr_setBottomLineHidden(hidden: true)
+        navigationBar.wr_setBottomLineHidden(hidden: false)
         navigationBar.barBackgroundColor = UIColor.white
         navigationBar.titleLabelColor = k333333Color
         view.addSubview(navigationBar)
@@ -54,8 +59,7 @@ class BaseViewController: UIViewController {
         navigationBar.wr_setLeftButton(image: image)
         navigationBar.onClickLeftButton = {
             [weak self] in
-            guard let strongSelf = self else { return }
-            strongSelf.wr_toLastViewController(animated: true)
+            self?.wr_toLastViewController(animated: true)
         }
     }
 
@@ -64,5 +68,11 @@ class BaseViewController: UIViewController {
     func setupLayouts() {}
     
     func setupData() {}
+    
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+        KingfisherManager.shared.cache.clearDiskCache()
+        KingfisherManager.shared.cache.clearMemoryCache()
+    }
 
 }

+ 166 - 0
RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseJSWebBaseViewController.swift

@@ -0,0 +1,166 @@
+//
+//  BaseJSWebBaseViewController.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/6/20.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import WebKit
+import WebViewJavascriptBridge
+
+class BaseJSWebBaseViewController: BaseViewController {
+
+    deinit {
+        removeWebView()
+    }
+    //加载普通URL
+    var URLString : String?
+    //加载本地URL
+    var HTMLName : String?
+    //保存请求链接
+    var snapShotsArray:Array<Any>?
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        setupViews()
+//        setupData()
+        
+    }
+    
+    override func setupViews() {
+        removeWKWebViewCookies()
+        view.addSubview(wkWebView)
+        view.addSubview(progressView)
+        WebViewJavascriptBridge.enableLogging()
+        view.insertSubview(navigationBar, aboveSubview: wkWebView)
+    }
+    
+    override func setupData() {
+        //// 加载普通URL
+        if (URLString != nil) {
+            NXLLog(URLString!)
+            webloadType(.URLString(url: URLString!))
+        }
+        
+        // 加载本地URL
+        if (HTMLName != nil ) {
+            webloadType(.HTMLName(name: HTMLName!))
+        }
+        
+    }
+    
+    lazy var bridge: WebViewJavascriptBridge = {
+        let bridge = WebViewJavascriptBridge(forWebView: self.wkWebView)
+        bridge?.setWebViewDelegate(self)
+        return bridge!
+    }()
+    
+    lazy var wkWebView: WKWebView = {
+        /// 创建webveiew
+        let wkWebView = WKWebView(frame: CGRect(x: 0, y: kNavBarTotalHeight, width: kScreenWidth, height: kScreenHeight-kNavBarTotalHeight))
+        // 监听支持KVO的属性
+        wkWebView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
+        wkWebView.addObserver(self, forKeyPath: "title", options: .new, context: nil)
+        return wkWebView
+    }()
+    
+    /// 进度条
+    lazy var progressView: UIProgressView = {
+        let progressView =  UIProgressView(progressViewStyle: .default)
+        progressView.frame = CGRect(x: CGFloat(0.0), y:kNavBarTotalHeight, width: CGFloat(wkWebView.width), height: 3)
+        progressView.trackTintColor = UIColor.clear
+        progressView.progressTintColor = kThemeColor
+        return progressView
+    }()
+    
+    /// 加载webView
+    func webloadType(_ loadType:WKWebLoadType) {
+        switch loadType {
+        case .URLString(let urltring):
+            let urlstr = URL(string: urltring)
+            let request = URLRequest(url: urlstr!)
+            wkWebView.load(request)
+        case .HTMLName(let string):
+            loadHost(string: string)
+        default:
+            break
+        }
+    }
+    
+    
+    /// 加载本得html
+    ///
+    /// - Parameter string: <#string description#>
+    func loadHost(string:String) {
+        let path = Bundle.main.path(forResource: string, ofType: "html")
+        // 获得html内容
+        do {
+            let html = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
+            // 加载js
+            wkWebView.loadHTMLString(html, baseURL: Bundle.main.bundleURL)
+        } catch { }
+    }
+    
+    /// 刷新
+    public func reload() {
+        wkWebView.reload()
+    }
+    
+    /// 后退
+    public func goBack() {
+        wkWebView.goBack()
+    }
+    
+    /// 前进
+    public func goForward() {
+        wkWebView.goForward()
+    }
+    
+    /// 遗传webView
+    public func removeWebView(){
+        wkWebView.removeObserver(self, forKeyPath: "estimatedProgress")
+        wkWebView.navigationDelegate = nil
+        wkWebView.uiDelegate = nil
+        self.view.removeFromSuperview()
+    }
+    
+    //请求链接处理
+    func pushCurrentSnapshotView(_ request: NSURLRequest) -> Void {
+        // 连接是否为空
+        guard let urlStr = snapShotsArray?.last else { return }
+        // 转换成URL
+        let url = URL(string: urlStr as! String)
+        // 转换成NSURLRequest
+        let lastRequest = NSURLRequest(url: url!)
+        // 如果url是很奇怪的就不push
+        if request.url?.absoluteString == "about:blank"{ return }
+        // 如果url一样就不进行push
+        if (lastRequest.url?.absoluteString == request.url?.absoluteString) {return}
+        // snapshotView
+        let currentSnapShotView = wkWebView.snapshotView(afterScreenUpdates: true);
+        //向数组添加字典
+        snapShotsArray = [["request":request,"snapShotView":currentSnapShotView]]
+    }
+    
+    open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
+        if keyPath == "estimatedProgress"{
+            // 设置进度条透明度
+            progressView.alpha = CGFloat(1.0 - wkWebView.estimatedProgress)
+            // 给进度条添加进度和动画
+            progressView.setProgress(Float(wkWebView.estimatedProgress), animated: true)
+            // 结束进度
+            if Float(wkWebView.estimatedProgress) >= 1.0{
+                progressView.alpha = 0.0
+                progressView .setProgress(0.0, animated: false)
+            }
+        }else if keyPath == "title" {
+            let vc = wkWebView.findViewController() as? BaseViewController
+            _ = vc?.navigationBar.title = wkWebView.title
+        }else {
+            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+            
+        }
+    }
+}

+ 168 - 0
RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseJSWebViewController.swift

@@ -0,0 +1,168 @@
+//
+//  BaseJSWebViewController.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/6/20.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import WebKit
+import WebViewJavascriptBridge
+
+class BaseJSWebViewController: BaseViewController {
+    
+    override func didReceiveMemoryWarning() {
+        super.didReceiveMemoryWarning()
+    }
+    
+    deinit {
+        removeWebView()
+    }
+    //加载普通URL
+    var URLString : String?
+    //加载本地URL
+    var HTMLName : String?
+    //保存请求链接
+    var snapShotsArray:Array<Any>?
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        setupViews()
+//        setupData()
+    }
+    
+    override func setupViews() {
+        removeWKWebViewCookies()
+        view.addSubview(wkWebView)
+        view.addSubview(progressView)
+        WebViewJavascriptBridge.enableLogging()
+    }
+    
+    override func setupLayouts() {
+        
+    }
+    
+    override func setupData() {
+        //// 加载普通URL
+        if (URLString != nil) {
+            webloadType(.URLString(url: URLString!))
+        }
+        
+        // 加载本地URL
+        if (HTMLName != nil ) {
+            webloadType(.HTMLName(name: HTMLName!))
+        }
+        
+    }
+    
+    lazy var bridge: WebViewJavascriptBridge = {
+        let bridge = WebViewJavascriptBridge(forWebView: self.wkWebView)
+        bridge?.setWebViewDelegate(self)
+        return bridge!
+    }()
+    
+    lazy var wkWebView: WKWebView = {
+        /// 创建webveiew
+        let wkWebView = WKWebView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight-48-kNavBarTotalHeight-kTabBarTotalHeight))
+        // 监听支持KVO的属性
+        wkWebView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
+        return wkWebView
+    }()
+    
+    /// 进度条
+    lazy var progressView: UIProgressView = {
+        let progressView =  UIProgressView(progressViewStyle: .default)
+        progressView.frame = CGRect(x: CGFloat(0.0), y:0, width: CGFloat(wkWebView.width), height: 3)
+        progressView.trackTintColor = UIColor.clear
+        progressView.progressTintColor = kThemeColor
+        return progressView
+    }()
+    
+    /// 加载webView
+    func webloadType(_ loadType:WKWebLoadType) {
+        switch loadType {
+        case .URLString(let urltring):
+            let urlstr = URL(string: urltring)
+            let request = URLRequest(url: urlstr!)
+            wkWebView.load(request)
+        case .HTMLName(let string):
+            loadHost(string: string)
+        default:
+            break
+        }
+    }
+    
+    
+    /// 加载本得html
+    ///
+    /// - Parameter string: <#string description#>
+    func loadHost(string:String) {
+        let path = Bundle.main.path(forResource: string, ofType: "html")
+        // 获得html内容
+        do {
+            let html = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
+            // 加载js
+            wkWebView.loadHTMLString(html, baseURL: Bundle.main.bundleURL)
+        } catch { }
+    }
+    
+    /// 刷新
+    public func reload() {
+        wkWebView.reload()
+    }
+    
+    /// 后退
+    public func goBack() {
+        wkWebView.goBack()
+    }
+    
+    /// 前进
+    public func goForward() {
+        wkWebView.goForward()
+    }
+    
+    /// 遗传webView
+    public func removeWebView(){
+        wkWebView.removeObserver(self, forKeyPath: "estimatedProgress")
+        wkWebView.navigationDelegate = nil
+        wkWebView.uiDelegate = nil
+        self.view.removeFromSuperview()
+    }
+    
+    //请求链接处理
+    func pushCurrentSnapshotView(_ request: NSURLRequest) -> Void {
+        // 连接是否为空
+        guard let urlStr = snapShotsArray?.last else { return }
+        // 转换成URL
+        let url = URL(string: urlStr as! String)
+        // 转换成NSURLRequest
+        let lastRequest = NSURLRequest(url: url!)
+        // 如果url是很奇怪的就不push
+        if request.url?.absoluteString == "about:blank"{ return }
+        // 如果url一样就不进行push
+        if (lastRequest.url?.absoluteString == request.url?.absoluteString) {return}
+        // snapshotView
+        let currentSnapShotView = wkWebView.snapshotView(afterScreenUpdates: true);
+        //向数组添加字典
+        snapShotsArray = [["request":request,"snapShotView":currentSnapShotView]]
+    }
+    
+    open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
+        if keyPath == "estimatedProgress"{
+            // 设置进度条透明度
+            progressView.alpha = CGFloat(1.0 - wkWebView.estimatedProgress)
+            // 给进度条添加进度和动画
+            progressView.setProgress(Float(wkWebView.estimatedProgress), animated: true)
+            // 结束进度
+            if Float(wkWebView.estimatedProgress) >= 1.0{
+                progressView.alpha = 0.0
+                progressView .setProgress(0.0, animated: false)
+            }
+        }else {
+            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+            
+        }
+    }
+
+}

+ 9 - 11
RainbowPlanet/RainbowPlanet/Base/BaseWebViewController/BaseWebViewController.swift

@@ -11,11 +11,11 @@ import WebKit
 
 class BaseWebViewController: BaseViewController {
     
-    
     override func viewDidLoad() {
         super.viewDidLoad()
         setupViews()
         setupLayouts()
+        setupData()
     }
     
     override func didReceiveMemoryWarning() {
@@ -38,19 +38,17 @@ class BaseWebViewController: BaseViewController {
     }
     override func setupLayouts() {
     }
-    
-    //MARK: -  action
-    @objc private func backAction() {
-        
-        self.wkWebView.webView.stopLoading()
-        if self.wkWebView.webView.canGoBack {
-            self.wkWebView.webView.goBack()
-        }else {
-            self.navigationController?.popViewController(animated: true)
+    override func setupData() {
+        navigationBar.onClickLeftButton = {
+            self.wkWebView.webView.stopLoading()
+            if self.wkWebView.webView.canGoBack {
+                self.wkWebView.webView.goBack()
+            }else {
+                self.navigationController?.popViewController(animated: true)
+            }
         }
     }
     
-    
     //MARK: - lazy
     
     lazy var wkWebView: WebView = {

+ 81 - 0
RainbowPlanet/RainbowPlanet/Base/RootViewController/RootViewController.swift

@@ -0,0 +1,81 @@
+//
+//  RootViewController.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/8/21.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import SnapKit
+
+class RootViewController: BaseViewController {
+    
+    var launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        setupViews()
+        setupLayouts()
+        setupData()
+    }
+    
+    override func setupViews() {
+        navigationBar.isHidden = true
+        view.backgroundColor = UIColor.clear
+        view.addSubview(iconImageView)
+        view.addSubview(titleLabel)
+    }
+    
+    override func setupLayouts() {
+        
+        iconImageView.snp.makeConstraints {(make) in
+            make.top.equalTo(244).multipliedBy(16/9)
+            make.width.equalTo(159)
+            make.height.equalTo(83)
+            make.centerX.equalToSuperview()
+        }
+        
+        titleLabel.snp.makeConstraints {(make) in
+            make.bottom.equalTo(-44)
+            make.centerX.left.right.equalToSuperview()
+        }
+    }
+    
+    override func setupData() {
+        SwiftMoyaNetWorkServiceConfig.shared().configApi(completion: {[weak self] (data) -> (Void) in
+            //初始化百度地图
+            BaiduMapManager.shared.initBaiduMap()
+            //百度开始定位
+            BaiduMapManager.shared.startLocation()
+            //初始化友盟
+            UMManager.shared.initUM(launchOptions: self?.launchOptions)
+            //设置Tabbar
+            kAppDelegate.setTabbarController()
+            /// 引导页
+            kAppDelegate.setGuidePageView()
+            self?.view?.ly_hideEmpty()
+        }) { [weak self] loadingStatus in
+            self?.iconImageView.isHidden = true
+            self?.titleLabel.isHidden = true
+            DIYEmptyView.emptyNoDataActionView(view: self?.view,imageStr: .five,detailStr: .five,btnTitleStr: .one, btnClickBlock: { [weak self] in
+                self?.setupData()
+            })
+        }
+    }
+    
+    lazy var iconImageView: UIImageView = {
+        let iconImageView = UIImageView()
+        iconImageView.image = kImage(name: "default_logo")
+        return iconImageView
+    }()
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.text = "Copyright © 由你 版权所有"
+        titleLabel.font = kRegularFont12
+        titleLabel.textColor = k333333Color
+        titleLabel.textAlignment = .center
+        return titleLabel
+    }()
+
+}

BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_check@2x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_check@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_nav_back_gray@2x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_nav_back_gray@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_nav_back_light@2x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_nav_back_light@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_uncheck@2x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.bundle/icon_uncheck@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_check@2x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_check@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_nav_back_gray@2x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_nav_back_gray@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_nav_back_light@2x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_nav_back_light@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_uncheck@2x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/ATAuthSDK.bundle/icon_uncheck@3x.png


+ 19 - 0
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Headers/ATAuthSDK.h

@@ -0,0 +1,19 @@
+//
+//  ATAuthSDK.h
+//  ATAuthSDK
+//
+//  Created by yangli on 14/03/2018.
+
+#import <UIKit/UIKit.h>
+
+//! Project version number for ATAuthSDK.
+FOUNDATION_EXPORT double ATAuthSDKVersionNumber;
+
+//! Project version string for ATAuthSDK.
+FOUNDATION_EXPORT const unsigned char ATAuthSDKVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import <ATAuthSDK/PublicHeader.h>
+
+#import "TXCommonHandler.h"
+#import "TXCommonUtils.h"
+#import "TXCustomModel.h"

+ 99 - 0
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Headers/TXCommonHandler.h

@@ -0,0 +1,99 @@
+//
+//  TXCommonHandler.h
+//  ATAuthSDK
+//
+//  Created by yangli on 15/03/2018.
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+#import "TXCustomModel.h"
+
+@interface TXCommonHandler : NSObject
+
+/*
+ * 函数名:sharedInstance
+ * 参数:无
+ * 返回:单例
+ */
++ (instancetype _Nonnull )sharedInstance;
+
+/*
+ * 函数名:getVersion
+ * 参数:无
+ * 返回:字符串,sdk版本号
+ */
+- (NSString *_Nonnull)getVersion;
+
+/**
+ * @brief   同步验证网关认证所需的蜂窝数据网络是否开启(注意:会阻塞当前线程),同原checkGatewayVerifyEnable
+ * @param   phoneNumber 手机号码,非必传,号码认证且双sim卡时必须传入待验证的手机号码!!,一键登录时设置为nil即可
+ * @return  BOOL值,YES表示网关认证所需的蜂窝数据网络已开启,且SDK初始化完成,NO表示未开启,只有YES才能保障后续服务
+ */
+- (BOOL)checkSyncGatewayVerifyEnable:(NSString *_Nullable)phoneNumber;
+
+/**
+ * @brief  异步验证网关认证所需的蜂窝数据网络是否开启(注意:不会阻塞当前线程,但是结果会异步回调)
+ * @param  phoneNumber   手机号码,非必传,号码认证且双sim卡时必须传入待验证的手机号码!!,一键登录时设置为nil即可
+ * @param  complete 结果回调(注意:回调线程非调用线程)
+ */
+- (void)checkAsyncGatewayVerifyEnable:(NSString *_Nullable)phoneNumber complete:(void(^_Nullable)(BOOL enable))complete;
+
+
+/*
+ * 函数名:getAuthTokenWithComplete,默认超时时间3.0s
+ * 参数:无
+ * 返回:字典形式
+ *      resultCode:6666-成功,5555-超时,4444-失败,3344-参数异常,2222-无网络,1111-无SIM卡
+ *      token:号码认证token
+ *      msg:文案或错误提示
+ */
+
+- (void)getAuthTokenWithComplete:(void (^_Nullable)(NSDictionary * _Nonnull resultDic))complete;
+
+/*
+ * 函数名:getAuthTokenWithTimeout
+ * 参数:timeout:接口超时时间,单位s,默认3.0s,值为0.0时采用默认超时时间
+ * 返回:字典形式
+ *      resultCode:6666-成功,5555-超时,4444-失败,3344-参数异常,2222-无网络,1111-无SIM卡
+ *      token:号码认证token
+ *      msg:文案或错误提示
+ */
+
+- (void)getAuthTokenWithTimeout:(NSTimeInterval )timeout complete:(void (^_Nullable)(NSDictionary * _Nonnull resultDic))complete;
+
+/*
+ * 函数名:getLoginNumberWithTimeout,一键登录预取号
+ * 参数:
+ timeout:接口超时时间,单位s,默认3.0s,值为0.0时采用默认超时时间
+ * 返回:字典形式
+ *      resultCode:6666-成功,5555-超时,4444-失败,3344-参数异常,2222-无网络,1111-无SIM卡
+ *      msg:文案或错误提示
+ */
+
+- (void)getLoginNumberWithTimeout:(NSTimeInterval )timeout complete:(void (^_Nullable)(NSDictionary * _Nonnull resultDic))complete;
+
+/*
+ * 函数名:getLoginTokenWithController,一键登录token
+ * 参数:
+ vc:当前vc容器,用于一键登录授权页面切换
+ model:自定义授权页面选项,可为nil,采用默认的授权页面,具体请参考TXCustomModel.h文件
+ timeout:接口超时时间,单位s,默认3.0s,值为0.0时采用默认超时时间
+ * 返回:字典形式
+ *      resultCode:6666-成功,5555-超时,4444-失败,3344-参数异常,2222-无网络,1111-无SIM卡,6668-登录按钮事件,6669-切换到其他方式按钮事件
+ *      token:一键登录token
+ *      msg:文案或错误提示
+ */
+
+- (void)getLoginTokenWithController:(UIViewController *_Nonnull)vc model:(TXCustomModel *_Nullable)model timeout:(NSTimeInterval )timeout complete:(void (^_Nullable)(NSDictionary * _Nonnull resultDic))complete;
+
+/**
+ 注销授权页,只有在客户自定义的按钮事件中调用!!
+ 
+ @param flag 是否添加动画
+ @param complete 成功返回
+ */
+- (void)cancelLoginVCAnimated:(BOOL)flag complete:(void (^_Nullable)(void))complete;
+
+
+@end

+ 53 - 0
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Headers/TXCommonUtils.h

@@ -0,0 +1,53 @@
+//
+//  TXCommonUtils.h
+//  authsdk
+//
+//  Created by yangli on 12/03/2018.
+
+#import <Foundation/Foundation.h>
+
+#define TX_Auth_Result_Success      @"6666"
+#define TX_Auth_Result_TimeOut      @"5555"
+#define TX_Auth_Result_Fail         @"4444"
+#define TX_Auth_Result_No_SIM_Card  @"1111"
+#define TX_Auth_Result_No_Network   @"2222"
+#define TX_Auth_Result_Other_Err    @"3333"
+#define TX_Auth_Result_Param_Err    @"3344"
+
+#define TX_Login_Return_Action      @"6667" // 点击了返回按钮
+#define TX_Login_SSO_Action         @"6668" // 点击了登录按钮并成功获取了token
+#define TX_Login_Change_Action      @"6669" // 点击了切换按钮
+
+@interface TXCommonUtils : NSObject
+
++ (BOOL)isChinaUnicom;
+
++ (BOOL)isChinaMobile;
+
++ (BOOL)isChinaTelecom;
+
++ (NSString *)getCurrentMobileNetworkName;
+
++ (NSString *)getCurrentCarrierName;
+
++ (NSString *)getNetworktype;
++ (BOOL)simSupportedIsOK;
+
+/**
+ 判断wwan是否开着(通过p0网卡判断,无wifi或有wifi情况下都能检测到)
+ @return 结果
+ */
++ (BOOL)isWWANOpen;
+
+/**
+ 判断wwan是否开着(仅无wifi情况下)
+ @return 结果
+ */
++ (BOOL)reachableViaWWAN;
+
+/**
+ 获取设备当前网络私网IP地址
+ */
++ (NSString *)getMobilePrivateIPAddress:(BOOL)preferIPv4;
+
+@end

+ 69 - 0
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Headers/TXCustomModel.h

@@ -0,0 +1,69 @@
+//
+//  TXCustomModel.h
+//  ATAuthSDK
+//
+//  Created by yangli on 2019/4/4.
+//  Copyright © 2019 alicom. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TXCustomModel : NSObject
+
+/**
+ * 说明,可设置的Y轴距离
+ * 全屏模式:默认是以375x667pt为基准,其他屏幕尺寸可以根据(ratio = 屏幕高度/667)比率来适配,比如 Y*ratio
+ **/
+
+// 导航栏
+@property (nonatomic, strong) UIColor *navColor; // 导航栏主题色
+@property (nonatomic, copy) NSAttributedString *navTitle; // 导航栏标题,内容、字体、大小、颜色
+@property (nonatomic, strong) UIImage *navBackImage; // 导航栏返回图片
+@property (nonatomic, strong) UIBarButtonItem *navMoreControl; // 导航栏右侧自定义控件,UIBarButtonItem
+
+// logo图片
+@property (nonatomic, strong) UIImage *logoImage; // logo图片
+@property (nonatomic, assign) CGFloat logoWidth; // logo宽
+@property (nonatomic, assign) CGFloat logoHeight; // logo高
+@property (nonatomic, assign) BOOL logoIsHidden; // logo是否隐藏
+@property (nonatomic, assign) CGFloat logoTopOffetY; // logo相对导航栏底部的Y轴距离
+
+// slogan
+@property (nonatomic, copy) NSAttributedString *sloganText; // slogan文案,内容、字体、大小、颜色
+@property (nonatomic, assign) BOOL sloganIsHidden; // slogan是否隐藏
+@property (nonatomic, assign) CGFloat sloganTopOffetY; // slogan相对导航栏底部的Y轴距离
+
+// 号码
+@property (nonatomic, strong) UIColor *numberColor;
+@property (nonatomic, assign) CGFloat numberSize;
+@property (nonatomic, assign) CGFloat numberTopOffetY; // number相对导航栏底部的Y轴距离
+
+// 登录
+@property (nonatomic, strong) NSString *loginBtnTitle;  // loginBtn标题
+@property (nonatomic, strong) UIColor *loginBtnTitleColor;  // loginBtn文本颜色
+@property (nonatomic,strong) NSArray *loginBtnBgImgs; //loginBtn背景图片组,高度45.0pt,@[激活状态的图片,失效状态的图片,高亮状态的图片]
+@property (nonatomic, assign) CGFloat loginBtnTopOffetY; // loginBtn相对导航栏底部的Y轴距离
+
+// 协议
+@property (nonatomic, copy) NSArray *checkBoxImages; // checkBox图片组,[uncheckedImg,checkedImg]
+@property (nonatomic, assign) BOOL checkBoxIsChecked; // checkBox是否勾选,默认YES
+@property (nonatomic, copy) NSArray *privacyOne; // 协议1,[协议名称,协议Url]
+@property (nonatomic, copy) NSArray *privacyTwo; // 协议2,[协议名称,协议Url]
+@property (nonatomic, copy) NSArray *privacyColors; // 协议内容颜色,[非点击文案颜色,协议颜色]
+@property (nonatomic, assign) CGFloat privacyBottomOffetY; // 协议相对全屏底部的Y轴距离!!!与其他有区别
+
+
+// 切换到其他方式
+@property (nonatomic, copy) NSAttributedString *changeBtnTitle; // changeBtn标题,内容、字体、大小、颜色
+@property (nonatomic, assign) BOOL changeBtnIsHidden; // changeBtn是否隐藏
+@property (nonatomic, assign) CGFloat changeBtnTopOffetY; // changeBtn相对导航栏底部的Y轴距离
+
+// 其他控件自定义block
+@property (nonatomic,copy) void(^customViewBlock)(UIView *superCustomView);
+
+@end
+
+NS_ASSUME_NONNULL_END

BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Info.plist


+ 6 - 0
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/Modules/module.modulemap

@@ -0,0 +1,6 @@
+framework module ATAuthSDK {
+  umbrella header "ATAuthSDK.h"
+
+  export *
+  module * { export * }
+}

+ 21 - 0
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/PrivateHeaders/TXSecurityUtils.h

@@ -0,0 +1,21 @@
+//
+//  TXSecurityUtils.h
+//  ATAuthSDK
+//
+//  Created by yangli on 2018/12/6.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TXSecurityUtils : NSObject
+
++ (NSString *)encryptAES:(NSString *)content key:(NSString *)key;
++ (NSString *)decryptAES:(NSString *)content key:(NSString *)key;
+
++ (NSString *)encryptMD5:(NSString *)content;
+
+@end
+
+NS_ASSUME_NONNULL_END

BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/checkBox_selected@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/checkBox_unSelected@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/close@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/loginBtn_Dis@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/loginBtn_Nor@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/logo@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/phoneTextfield@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/smsCodeBtn_Dis@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/smsCodeBtn_Nor@3x.png


BIN
RainbowPlanet/RainbowPlanet/Lib/ATAuthSDK/ATAuthSDK.framework/TYRZResource.bundle/toast@3x.png


+ 1 - 3
RainbowPlanet/RainbowPlanet/Lib/WeChatSDK/WXApi.h

@@ -34,7 +34,7 @@ NS_ASSUME_NONNULL_BEGIN
  *
  * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
  * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
- * @param resp具体的回应内容,是自动释放的
+ * @param resp fjsa;
  */
 - (void)onResp:(BaseResp*)resp;
 
@@ -62,7 +62,6 @@ NS_ASSUME_NONNULL_BEGIN
  * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。
  * @attention 请保证在主线程中调用此函数
  * @param appid 微信开发者ID
- * @param typeFlag 应用支持打开的文件类型
  * @return 成功返回YES,失败返回NO。
  */
 + (BOOL)registerApp:(NSString *)appid;
@@ -188,7 +187,6 @@ NS_ASSUME_NONNULL_BEGIN
 + (void)startLogByLevel:(WXLogLevel)level logDelegate:(id<WXApiLogDelegate>)logDelegate;
 
 /*! @brief 停止打印log,会清理block或者delegate为空,释放block
- *  @param 
  */
 + (void)stopLog;
 @end

+ 53 - 19
RainbowPlanet/RainbowPlanet/Macro/ColorMacro.swift

@@ -7,35 +7,45 @@
 //
 
 import UIKit
-//主题色 导航栏颜色 
-let kNavBgColor = UIColor(hexString: "2d96ee")
 
-let kTabbarSelectColor = UIColor(hexString: "2d96ee")
+let kThemeColor = UIColor(hexString: "25E0CD")
 
-let kTabbarNormalColor = UIColor(hexString: "b1d3f1")
+let kTabbarSelectColor = UIColor(hexString: "333333")
 
-let kDisabledButtonColor = UIColor(hexString: "#E6E6E6")
+let kTabbarNormalColor = UIColor(hexString: "666666")
 
-let kDisabledTitleColor = UIColor(hexString: "#666666")
+let kDisabledButtonColor = UIColor(hexString: "E6E6E6")
 
-let kEnabledButtonColor = UIColor(hexString: "#FFA42F")
+let kDisabledTitleColor = UIColor(hexString: "666666")
 
-let kEnabledTitleColor = UIColor(hexString: "#FFFFFF")
+let kEnabledButtonColor = UIColor(hexString: "25E0CD")
+
+let kEnabledTitleColor = UIColor(hexString: "FFFFFF")
 
 let k333333Color = UIColor(hexString: "333333")
 
-let kE6E6E6Color = UIColor(hexString: "E6E6E6")
+let k262626Color = UIColor(hexString: "262626")
 
-let k404040Color = UIColor(hexString: "404040")
-
-let kFE352BColor = UIColor(hexString: "FE352B")
+let k313334Color = UIColor(hexString: "313334")
 
 let k666666Color = UIColor(hexString: "666666")
 
+let kFFF9F0Color = UIColor(hexString: "FFF9F0")
+
+let kFFEDD3Color = UIColor(hexString: "FFEDD3")
+
 let k999999Color = UIColor(hexString: "999999")
 
+let kffffffColor = UIColor(hexString: "ffffff")
+
 let keeeeeeColor = UIColor(hexString: "eeeeee")
 
+let kE6E6E6Color = UIColor(hexString: "E6E6E6")
+
+let k404040Color = UIColor(hexString: "404040")
+
+let kFE352BColor = UIColor(hexString: "FE352B")
+
 let kED3934Color = UIColor(hexString: "ED3934")
 
 let ke6e6e6Color = UIColor(hexString: "e6e6e6")
@@ -48,8 +58,6 @@ let kd8d8d8Color = UIColor(hexString: "d8d8d8")
 
 let kd9d9d9Color = UIColor(hexString: "d9d9d9")
 
-let kffffffColor = UIColor(hexString: "ffffff")
-
 let kff630fColor = UIColor(hexString: "ff630f")
 
 let kff8400Color = UIColor(hexString: "ff8400")
@@ -62,14 +70,16 @@ let kffeae5Color = UIColor(hexString: "ffeae5")
 
 let kf82323Color = UIColor(hexString: "f82323")
 
-let kf1f1f1Color = UIColor(hexString: "f1f1f1")
-
 let kf7f7f9Color = UIColor(hexString: "f7f7f9")
 
 let kf7f7faColor = UIColor(hexString: "f7f7fa")
 
 let kf7f8faColor = UIColor(hexString: "f7f8fa")
 
+let kf0f0f0Color = UIColor(hexString: "f0f0f0")
+
+let kf1f1f1Color = UIColor(hexString: "f1f1f1")
+
 let kf2f2f2Color = UIColor(hexString: "f2f2f2")
 
 let kf3f3f3Color = UIColor(hexString: "f3f3f3")
@@ -78,6 +88,8 @@ let kf5f5f5Color = UIColor(hexString: "f5f5f5")
 
 let kf6f6f6Color = UIColor(hexString: "f6f6f6")
 
+let kF6FCF7Color = UIColor(hexString: "F6FCF7")
+
 let kf9f9f9Color = UIColor(hexString: "f9f9f9")
 
 let k9F9F9FColor = UIColor(hexString: "9F9F9F")
@@ -90,14 +102,16 @@ let kff724fColor = UIColor(hexString: "ff724f")
 
 let kFFA42FColor = UIColor(hexString: "FFA42F")
 
+let kF4F4F4Color = UIColor(hexString: "F4F4F4")
+
 let kbfbfbfColor = UIColor(hexString: "bfbfbf")
 
 let k1C2443Color = UIColor(hexString: "1C2443")
 
-let kfe352bColor = UIColor(hexString: "fe352b")
-
 let kbbbbbbColor = UIColor(hexString: "bbbbbb")
 
+let kB4B4B4Color = UIColor(hexString: "B4B4B4")
+
 let kFFAC33Color = UIColor(hexString: "FFAC33")
 
 let kEDEEF0Color = UIColor(hexString: "EDEEF0")
@@ -112,8 +126,28 @@ let kD2D3D5Color = UIColor(hexString: "D2D3D5")
 
 let kfee5e4Color = UIColor(hexString: "fee5e4")
 
-let kccccccColor = UIColor(hexString: "cccccc")
+let kCCCCCCColor = UIColor(hexString: "CCCCCC")
 
 let kfafafaColor = UIColor(hexString: "fafafa")
 
 let kfff8efColor = UIColor(hexString: "fff8ef")
+
+let kebebebColor = UIColor(hexString: "ebebeb")
+
+let kfff8ecColor = UIColor(hexString: "fff8ec")
+
+let k62CC74Color = UIColor(hexString: "62CC74")
+
+let kFFF8ECColor = UIColor(hexString: "FFF8EC")
+
+let kDDDDDDColor = UIColor(hexString: "DDDDDD")
+
+let kFEFEFEColor = UIColor(hexString: "#FEFEFE")
+
+let k7AD489Color = UIColor(hexString: "7AD489")
+
+let kFF5E5EColor = UIColor(hexString: "FF5E5E")
+
+let kE5E5E5Color = UIColor(hexString: "E5E5E5")
+
+let kA8ACBCColor = UIColor(hexString: "A8ACBC")

+ 163 - 3
RainbowPlanet/RainbowPlanet/Macro/Common.swift

@@ -92,6 +92,7 @@ func kURLImage(name :String) -> URL? {
     return URL(string: name)
 }
 
+
 //MARK: - 返回一个颜色
 /// 返回一个颜色
 ///
@@ -131,11 +132,11 @@ func delay(by delayTime: TimeInterval, qosClass: DispatchQoS.QoSClass? = nil,
     dispatchQueue.asyncAfter(deadline: DispatchTime.now() + delayTime, execute: closure)
 }
 
-func getCurrentVC() -> UIViewController {
+func getCurrentVC() -> UIViewController? {
     let keywindow = (UIApplication.shared.delegate as! AppDelegate).window
     let firstView: UIView = (keywindow?.subviews.first)!
     let secondView: UIView = firstView.subviews.first!
-    var vc = viewForController(view: secondView)!
+    var vc = viewForController(view: secondView)
     vc = ((vc as! UITabBarController).selectedViewController! as! UINavigationController).visibleViewController!
 
     return vc
@@ -154,7 +155,7 @@ private func viewForController(view:UIView)->UIViewController?{
 
 //classType: 当前页面类类型
 func vcResult(classType: UIViewController.Type) -> Bool {
-    return getCurrentVC().isKind(of: classType)
+    return (getCurrentVC()?.isKind(of: classType))!
 }
 
 
@@ -239,3 +240,162 @@ func priceConversionNone(price:Int) -> String {
     let price = Float(price)/100
     return String(format: "¥ %.2f", price)
 }
+
+
+/// 复制
+///
+/// - Parameter string: 复制的内容
+func commonCopy(string:String) {
+    if string == "" {
+        SwiftProgressHUD.shared().showText("复制失败")
+    }else {
+        let pasteboard = UIPasteboard.general
+        pasteboard.string = string
+        SwiftProgressHUD.shared().showText("复制成功")
+    }
+}
+
+
+/// 获取图片
+///
+/// - Returns: 返回Sting
+func getImageWidthheightStr(imgStr:String) -> String {
+    if imgStr.contains("*") {
+        var imgStr1 = imgStr.suffix(from: (imgStr.lastIndex(of: "*"))!)
+//        NXLLog(imgStr1)
+        imgStr1 = (imgStr1.suffix(imgStr1.count - 1))
+//        NXLLog(imgStr1)
+        imgStr1 = imgStr1.prefix(upTo:(imgStr1.firstIndex(of: "."))!)
+//        NXLLog(imgStr1)
+        return String(imgStr1)
+    }else {
+//        let size = UIImage.getImageSize(imgStr)
+//        return "\(size.width)_\(size.height)"
+        if imgStr.contains("?") {
+            var imgStr1 = imgStr.suffix(from: (imgStr.lastIndex(of: "?"))!)
+            imgStr1 = (imgStr1.suffix(imgStr1.count - 1))
+            return String(imgStr1)
+        }else {
+            return "280_280"
+        }
+    }
+    
+}
+
+/// 获取图片的宽
+///
+/// - Parameter imgStr: 图片链接
+/// - Returns: 宽
+func getImageWidth(imgStr:String) -> CGFloat {
+    let imageStr = getImageWidthheightStr(imgStr: imgStr)
+    let widthStr = imageStr.prefix(upTo:(imageStr.firstIndex(of: "_"))!)
+//    NXLLog(widthStr)
+    let width = Double(widthStr)
+    let widthFloat = CGFloat(width ?? 0)
+//    NXLLog(widthFloat)
+    return widthFloat/2
+}
+/// 获取图片的高
+///
+/// - Parameter imgStr: 图片链接
+/// - Returns: gao
+func getImageHeight(imgStr:String) -> CGFloat {
+    let imageStr = getImageWidthheightStr(imgStr: imgStr)
+    let widthStr = imageStr.prefix(upTo:(imageStr.firstIndex(of: "_"))!)
+//    NXLLog(widthStr)
+    let heightStr = imageStr.suffix(imageStr.count - widthStr.count - 1)
+//    NXLLog(heightStr)
+    let height = Double(heightStr)
+    let heightFloat = CGFloat(height ?? 0)
+//    NXLLog(heightFloat)
+    return heightFloat/2
+}
+
+
+/// 获取缩略图
+///
+/// - Parameters:
+///   - imgStr: 图片地址
+///   - width: 宽度
+///   - height: 高度
+/// - Returns: 返回图片地址
+func getImageUrlStr(imgStr:String,width:CGFloat,height:CGFloat) -> String {
+    if imgStr.contains("*") {
+        let imgStr1 = imgStr + "?x-oss-process=image/resize,m_fill,w_\(Int(width*1.5)),h_\(Int(height*1.5))"
+//        NXLLog(imgStr1)
+        return String(imgStr1)
+    }else {
+        if imgStr.contains("?") {
+            var imgStr1 = imgStr.prefix(upTo:(imgStr.lastIndex(of: "?"))!)
+            imgStr1 = imgStr1 + "?x-oss-process=image/resize,m_fill,w_\(Int(width*1.5)),h_\(Int(height*1.5))"
+//            NXLLog(imgStr1)
+
+            return String(imgStr1)
+        }else {
+            let imgStr1 = imgStr + "?x-oss-process=image/resize,m_fill,w_\(Int(280 * 1.5 * kScaleWidth)),h_\(Int(280 * 1.5 * kScaleWidth))"
+//            NXLLog(imgStr1)
+            return String(imgStr1)
+        }
+    }
+}
+
+/// url字符串转字典
+///
+/// - Parameter urlString: urlString字符串
+/// - Returns: [String: Any]
+public func urlStringtoParams(_ urlString:String) -> [String: Any] {
+    // 1 保存参数
+    var url_array = [""]
+    // 2 内容中是否存在?或者//
+    if urlString.contains("?") {
+        url_array = urlString.components(separatedBy:"?")
+    }else{
+        url_array = urlString.components(separatedBy: "//")
+    }
+    // 3 多个参数,分割参数
+    let urlComponents = url_array[1].components(separatedBy: "&")
+    // 4 保存返回值
+    var params = [String: Any]()
+    // 5 遍历参数
+    for keyValuePair in urlComponents {
+        // 5.1 分割参数 生成Key/Value
+        let pairComponents = keyValuePair.components(separatedBy:"=")
+        // 5.2 获取数组首元素作为key
+        let key = pairComponents.first?.removingPercentEncoding
+        // 5.3 获取数组末元素作为value
+        let value = pairComponents.last?.removingPercentEncoding
+        // 5.4 判断参数是否是数组
+        if let key = key, let value = value {
+            // 5.5 已存在的值,生成数组
+            if let existValue = params[key] {
+                // 5.8 如果是已经生成的数组
+                if var existValue = existValue as? [Any] {
+                    // 5.9 把新的值添加到已经生成的数组中去
+                    existValue.append(value)
+                    params[key] = existValue
+                } else {
+                    // 5.7 已存在的值,先将他生成数组
+                    params[key] = [existValue, value]
+                }
+            } else {
+                // 5.6 参数是非数组
+                params[key] = value
+            }
+        }
+    }
+    return params
+}
+
+func gifImages(gifNameInBoundle: String?) -> [UIImage]? {
+    let fileUrl = Bundle.main.url(forResource: gifNameInBoundle, withExtension: "gif")
+    
+    let gifSource = CGImageSourceCreateWithURL(fileUrl! as CFURL, nil)
+    let gifCount = CGImageSourceGetCount(gifSource!)
+    var frames: [AnyHashable] = []
+    for i in 0..<gifCount {
+        let imageRef = CGImageSourceCreateImageAtIndex(gifSource!, i, nil)
+        let image = UIImage(cgImage: imageRef!)
+        frames.append(image)
+    }
+    return frames as? [UIImage]
+}

+ 226 - 0
RainbowPlanet/RainbowPlanet/Macro/EnumMacro.swift

@@ -0,0 +1,226 @@
+//
+//  EnumMacro.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/6/18.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+
+// MARK: - 跳转方式
+/// 跳转方式
+///
+/// - none: 默认
+/// - push: push
+enum JumpModeType {
+    case none
+    case push
+}
+
+// MARK: - 搜索类型
+/// 搜索类型
+///
+/// - content: 内容
+/// - topic: 话题
+/// - user: 用户
+/// - product: 商品
+enum SearchType : Int {
+    case content = 0
+    case topic = 1
+    case user = 2
+    case product = 3
+}
+
+// MARK: - 消息说明 / 消息类型
+/// 消息说明 / 消息类型
+///
+/// - star: 星球活动消息
+/// - system: 系统通知消息
+enum MessageType : Int {
+    case star = 0
+    case system = 1
+}
+
+
+// MARK: - 消息展示类型
+/// 消息展示类型
+///
+/// - onlyShow: 星球活动消息
+/// - user: 系统通知消息
+/// - post: 内容
+/// - activity: 活动
+/// - topic: 话题
+/// - systemAdmin: 后台系统消息
+/// - postComment: 评论
+/// - postReply: 回复
+/// - postReplyMain: 回复@
+/// - postLike: 赞内容
+/// - postCollect: 收藏内容
+/// - postShare: 分享内容
+/// - follow: 关注
+enum MessageShowType : Int {
+    case onlyShow = 0
+    case user = 1
+    case post = 2
+    case activity = 3
+    case topic = 4
+    case systemAdmin = 5
+    case postComment = 6
+    case postReply = 7
+    case postReplyMain = 8
+    case postLike = 9
+    case postCollect = 10
+    case postShare = 11
+    case follow = 12
+}
+
+
+// MARK: - virus类型
+/// virus类型
+///
+/// - comment: 评价
+/// - read: 阅读
+/// - like: 点赞
+/// - unlike: 喜欢
+/// - forward: 转发
+/// - collect: 收藏
+/// - publish: 发布
+/// - register: 注册
+enum BehaviorFlagType : String {
+    case comment = "comment"
+    case read = "read"
+    case like = "like"
+    case unlike = "unlike"
+    case forward = "forward"
+    case collect = "collect"
+    case publish = "publish"
+    case register = "register"
+}
+
+// MARK: - 关注类型
+/// 关注类型
+///
+/// - futureFollow: 未关注
+/// - alreadyFollow: 已关注
+/// - mutualFollow: 互相关注
+enum FollowType : Int {
+    case futureFollow = 0
+    case alreadyFollow = 1
+    case mutualFollow = 2
+}
+
+// MARK: - 个人中心内容
+/// 个人中心内容
+///
+/// - create: 发布
+/// - collect: 收藏
+/// - share: 分享
+enum CommunityPostMyType : String{
+    case create = "create"
+    case collect = "collect"
+    case share = "share"
+}
+
+// MARK: - 推荐feed流
+/// 推荐feed流
+///
+/// - banner: banner
+/// - user: 用户推荐
+/// - video: 视频推荐
+/// - topic: 精选话题
+/// - post: 内容
+enum CommunityPostSuggestType : String {
+    case banner = "banner"
+    case user = "user"
+    case video = "video"
+    case topic = "topic"
+    case post = "post"
+}
+
+
+
+/// 关注feed流
+///
+/// - like: 喜欢
+/// - forward: 转发
+/// - collection: 收藏
+/// - commnet: 评论
+/// - follow: 关注
+/// - pulish: 发布
+enum CommunityFollowType : String {
+    case like = "1"
+    case forward = "2"
+    case collection = "3"
+    case comment = "4"
+    case follow = "5"
+    case post = "6"
+}
+
+/// 贴子类型
+///
+/// - image: 图片
+/// - video: 视频
+/// - html: 富文本
+enum PostType : String{
+    case none = ""
+    case image = "image"
+    case video = "video"
+    case html = "html"
+}
+
+
+/// 社区类型
+///
+/// - follow: 关注
+/// - recommend: 推荐
+/// - planet: 星球
+enum CommunityType {
+    case follow
+    case recommend
+    case planet
+}
+
+
+/// 社区banner类型
+///
+/// - none: 纯展示
+/// - content: 内容
+/// - user: 用户
+/// - activity: 活动
+/// - topic: 话题
+enum CommunityBannerType : Int {
+    case none = 0
+    case content = 1
+    case user = 2
+    case activity = 3
+    case topic = 4
+}
+
+
+/// 兑换商城
+///
+/// - none: 纯展示
+/// - special: 专题
+/// - link: 链接
+/// - activity: 活动
+/// - commodity: 商品
+enum RedemptionAreaBannerType : Int {
+    case none = 0
+    case special = 1
+    case link = 2
+    case activity = 3
+    case commodity = 4
+}
+
+
+/// 登录类型
+///
+/// - mobile: 手机登录
+/// - weixin: 微信登录
+/// - qq: qq登录
+enum LoginType : Int {
+    case mobile = 1
+    case weixin = 2
+    case qq = 3
+}

+ 10 - 0
RainbowPlanet/RainbowPlanet/Macro/FontMacro.swift

@@ -21,6 +21,7 @@ let kBoldFont19 = UIFont.boldSystemFont(ofSize: 19)
 let kBoldFont20 = UIFont.boldSystemFont(ofSize: 20)
 let kBoldFont21 = UIFont.boldSystemFont(ofSize: 21)
 let kBoldFont22 = UIFont.boldSystemFont(ofSize: 22)
+let kBoldFont28 = UIFont.boldSystemFont(ofSize: 28)
 let kBoldFont30 = UIFont.boldSystemFont(ofSize: 30)
 let kBoldFont36 = UIFont.boldSystemFont(ofSize: 36)
 let kBoldFont40 = UIFont.boldSystemFont(ofSize: 40)
@@ -34,13 +35,18 @@ let kMediumFont15 = UIFont(name: "PingFang-SC-Medium", size: 15)
 let kMediumFont16 = UIFont(name: "PingFang-SC-Medium", size: 16)
 let kMediumFont17 = UIFont(name: "PingFang-SC-Medium", size: 17)
 let kMediumFont18 = UIFont(name: "PingFang-SC-Medium", size: 18)
+let kMediumFont20 = UIFont(name: "PingFang-SC-Medium", size: 20)
 let kMediumFont21 = UIFont(name: "PingFang-SC-Medium", size: 21)
+let kMediumFont22 = UIFont(name: "PingFang-SC-Medium", size: 22)
+let kMediumFont23 = UIFont(name: "PingFang-SC-Medium", size: 23)
 let kMediumFont24 = UIFont(name: "PingFang-SC-Medium", size: 24)
 let kMediumFont25 = UIFont(name: "PingFang-SC-Medium", size: 25)
+let kMediumFont26 = UIFont(name: "PingFang-SC-Medium", size: 26)
 let kMediumFont27 = UIFont(name: "PingFang-SC-Medium", size: 27)
 let kMediumFont30 = UIFont(name: "PingFang-SC-Medium", size: 30)
 let kMediumFont35 = UIFont(name: "PingFang-SC-Medium", size: 35)
 
+let kRegularFont9  = UIFont(name: "PingFang-SC-Regular", size: 9)
 let kRegularFont10 = UIFont(name: "PingFang-SC-Regular", size: 10)
 let kRegularFont11 = UIFont(name: "PingFang-SC-Regular", size: 11)
 let kRegularFont12 = UIFont(name: "PingFang-SC-Regular", size: 12)
@@ -50,6 +56,7 @@ let kRegularFont15 = UIFont(name: "PingFang-SC-Regular", size: 15)
 let kRegularFont16 = UIFont(name: "PingFang-SC-Regular", size: 16)
 let kRegularFont17 = UIFont(name: "PingFang-SC-Regular", size: 17)
 let kRegularFont18 = UIFont(name: "PingFang-SC-Regular", size: 18)
+let kRegularFont22 = UIFont(name: "PingFang-SC-Regular", size: 22)
 
 
 let kScaleBoldFont10 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 10))
@@ -65,6 +72,7 @@ let kScaleBoldFont19 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 19))
 let kScaleBoldFont20 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 20))
 let kScaleBoldFont21 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 21))
 let kScaleBoldFont22 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 22))
+let kScaleBoldFont28 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 28))
 let kScaleBoldFont30 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 30))
 let kScaleBoldFont36 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 36))
 let kScaleBoldFont40 = UIFont.boldSystemFont(ofSize: kScaleValue(value: 40))
@@ -79,12 +87,14 @@ let kScaleMediumFont16 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(va
 let kScaleMediumFont17 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 17))
 let kScaleMediumFont18 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 18))
 let kScaleMediumFont20 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 20))
+let kScaleMediumFont22 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 22))
 let kScaleMediumFont24 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 24))
 let kScaleMediumFont25 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 25))
 let kScaleMediumFont27 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 27))
 let kScaleMediumFont30 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 30))
 let kScaleMediumFont35 = UIFont(name: "PingFang-SC-Medium", size: kScaleValue(value: 35))
 
+let kScaleRegularFont9  = UIFont(name: "PingFang-SC-Regular", size: kScaleValue(value: 9))
 let kScaleRegularFont11 = UIFont(name: "PingFang-SC-Regular", size: kScaleValue(value: 11))
 let kScaleRegularFont12 = UIFont(name: "PingFang-SC-Regular", size: kScaleValue(value: 12))
 let kScaleRegularFont13 = UIFont(name: "PingFang-SC-Regular", size: kScaleValue(value: 13))

+ 0 - 14
RainbowPlanet/RainbowPlanet/Macro/HTMLURLMacro.swift

@@ -1,14 +0,0 @@
-//
-//  HTMLURLMacro.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2018/10/17.
-//  Copyright © 2018 南鑫林. All rights reserved.
-//
-
-import Foundation
-
-/// 给我们我们评分
-let kAppStoreReview = "https://itunes.apple.com/cn/app/1455804911?action=write-review"
-
-

+ 34 - 1
RainbowPlanet/RainbowPlanet/Macro/RainbowPlanet-Bridging-Header.h

@@ -16,15 +16,28 @@
 //微信支付
 #import "WXApi.h"
 
+// mj刷新封装
 #import "UIScrollView+MJRefreshEX.h"
 
+#import "TGCaculateNumberTool.h"
+// 限制字符
+#import "TextLimitTool.h"
+//瀑布流
+#import "WaterFallLayout.h"
 //空白页面占位图
 #import <LYEmptyView/LYEmptyViewHeader.h>
-
+//sku
 #import "ORSKUDataFilter.h"
+//靠左
 #import "UICollectionViewLeftAlignedLayout.h"
+#import "FMLinkLabel.h"
+
+#import "YYText.h"
+#import "NSAttributedString+YYText.h"
+#import "YYLabel.h"
 
 #import "FMDB.h"
+//#import "POP.h"
 
 //友盟
 #import <UMCommon/UMCommon.h>
@@ -51,4 +64,24 @@
 #import <BaiduMapAPI_Map/BMKMapView.h>
 
 
+//  KSMediaPicker所依靠的OC文件
+#import "KSMediaPickerCollectionView.h"
+#import "KSVideoPlayerBaseView.h"
+
+#import "AliyunPathManager.h"
+#import "QUProgressView.h"
+#import "AlivcShortVideoUploadManager.h"
+
+#import "AliyunMagicCameraViewController.h"
+#import "AliyunCropViewController.h"
+#import "AliyunCompositionInfo.h"
+#import "AVAsset+VideoInfo.h"
+#import "AliyunPathManager.h"
+
+#import <AliyunVideoSDKPro/AliyunVideoSDKPro.h>
+
+// 阿里云一建登录
+#import "ATAuthSDK/ATAuthSDK.h"
+
+
 #endif /* RainbowPlanet_Bridging_Header_h */

+ 94 - 0
RainbowPlanet/RainbowPlanet/Manager/ATAuthSDKManager/ATAuthSDKManager.swift

@@ -0,0 +1,94 @@
+//
+//  ATAuthSDKManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/8/1.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import SwiftyJSON
+import SwiftyMediator
+
+class ATAuthSDKManager: NSObject {
+
+    /// 手机一键登录
+    class func oneBuiltLogin(vc:UIViewController?) {
+        TXCommonHandler.sharedInstance().checkAsyncGatewayVerifyEnable(nil) {[weak vc] (enable) in
+            DispatchQueue.main.async {
+                [weak vc] in
+                if !enable {//先获取authortoken并认证
+                    Mediator.push(RegisterLoginRouterModuleType.pushmobileLoginView)
+                    SwiftProgressHUD.shared().showText("一键登录失败,请使用验证码登录")
+                    return
+                }
+                let modelNew = TXCustomModel()
+
+                /// navigationbara
+                modelNew.navColor = kffffffColor
+                modelNew.navBackImage = kImage(name: "navbar_back_black")!
+                
+                //Moblie
+                modelNew.numberSize = 36
+                modelNew.numberColor = UIColor.black
+                modelNew.numberTopOffetY = 120 * kScaleWidth
+                
+                // slogan
+                modelNew.sloganIsHidden = false
+                modelNew.sloganText = NSAttributedString(string: "阿里云提供认证服务", attributes: [
+                    NSAttributedString.Key.foregroundColor: k333333Color,
+                    NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14.0)
+                    ])
+                modelNew.sloganTopOffetY = 175 * kScaleWidth
+                
+                //changeBtn
+                modelNew.changeBtnIsHidden = true
+                
+                
+                //协议
+                //                modelNew.checkBoxImages = [UIImage(),UIImage()]
+                modelNew.privacyOne = ["由你用户协议",kH5ContentId6Url];
+                modelNew.privacyTwo = ["隐私条款",kH5ContentId11Url];
+                modelNew.checkBoxIsChecked = true
+                modelNew.privacyBottomOffetY = 46.5 - kSafeTabBarHeight
+                modelNew.privacyColors = [kbbbbbbColor,k333333Color];
+                
+                
+                //loginBtn
+                let normalImage = UIImage.image(with: kThemeColor, size: CGSize(width: 295, height: 48.0), isRoundedCorner: true)
+                
+                let disableImage = UIImage.image(with: kThemeColor, size: CGSize(width: 295, height: 48.0), isRoundedCorner: true)
+                let lightedImage = UIImage.image(with: kThemeColor, size: CGSize(width: 295, height: 48.0), isRoundedCorner: true)
+                modelNew.loginBtnBgImgs = [normalImage as Any,disableImage as Any,lightedImage as Any]
+                modelNew.loginBtnTitle = "一键登录"
+                modelNew.loginBtnTitleColor = UIColor.white
+                modelNew.loginBtnTopOffetY =  245 * kScaleWidth
+                
+                TXCommonHandler.sharedInstance().getLoginToken(with: vc!, model: modelNew, timeout: 10, complete: { [weak vc] (resultDic) in
+                    let resultDic  = resultDic as NSDictionary
+                    let atAuthSDKModel = ATAuthSDKModel(JSON: resultDic as! [String : Any])
+                    
+                    switch atAuthSDKModel?.resultCode {
+                    case TX_Login_SSO_Action:
+                        SwiftMoyaNetWorkServiceUser.shared().userMobileAuthorizationLoginApi(token: atAuthSDKModel?.token ?? "", completion: {
+                            [weak vc] (userModel) -> (Void) in
+                            TXCommonHandler.sharedInstance().cancelLoginVC(animated: true, complete: {
+                                [weak vc] in
+                                RegisterLoginManager.registerLoginSuccessApi(vc: vc)
+                            })
+                        })
+                        break
+                    case TX_Auth_Result_Success,TX_Login_Return_Action,TX_Login_Change_Action:
+                        break
+                    default:
+                        SwiftProgressHUD.shared().showText(atAuthSDKModel?.msg ?? "数据有误")
+                        break
+                    }
+                    
+                })
+                
+            }
+        }
+    }
+    
+}

+ 60 - 0
RainbowPlanet/RainbowPlanet/Manager/ATAuthSDKManager/ATAuthSDKModel.swift

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

+ 23 - 17
RainbowPlanet/RainbowPlanet/Manager/AlamofireReachabilityManager/AlamofireReachabilityManager.swift

@@ -15,8 +15,13 @@ class AlamofireReachabilityManager: NSObject {
     static let shared : AlamofireReachabilityManager = AlamofireReachabilityManager()
     
     /// 初始化对象
-    private var reachabilityManager = NetworkReachabilityManager(host: kApiDataPrefix())!
     private var manager = NetworkReachabilityManager()!
+    
+    /// 初始化对象
+    lazy var reachabilityManager: NetworkReachabilityManager = {
+        let reachabilityManager = NetworkReachabilityManager(host: kApiDataPrefix())!
+        return reachabilityManager
+    }()
 
     
     /// 网络监听
@@ -51,27 +56,28 @@ class AlamofireReachabilityManager: NSObject {
     
     /// 判断是否连接网络
     public func isNetworkConnect() -> Bool {
+        
         if manager.isReachable {
             return true
         }else {
-            AlamofireReachabilityManager.shared.alert()
             return false
         }
-        
     }
     
-    /// 弹框跳转设置页面
-    public func alert(){
-        AlertSheetView.alert(title: "网络连接失败", detailTitle: "检测到网络权限可能未开启\n您可以在\"设置>无线数据>WLAN或WLAN与蜂窝移动网\"开启一下吧", cancelTitle: "取消", sureTitle: "设置", cancelBlock:nil, confirmBlock: { (popupView, index, str) in
-            DispatchQueue.main.async(execute: {() -> Void in
-                let url = URL(string: UIApplication.openSettingsURLString)
-                if let url = url, UIApplication.shared.canOpenURL(url) {            if #available(iOS 10.0, *) {
-                    UIApplication.shared.open(url, options: [:],completionHandler: {(success) in})
-                }else {
-                    UIApplication.shared.openURL(url)
-                    }
-                }
-            })
-        })
-    }
+//    /// 弹框跳转设置页面
+//    public func alert(){
+//        
+//        DispatchQueue.main.async(execute: {() -> Void in
+//            AlertSheetView.alert(title: "网络连接失败", detailTitle: "检测到网络权限可能未开启\n您可以在\"设置>无线数据>WLAN或WLAN与蜂窝移动网\"开启一下吧", cancelTitle: "取消", sureTitle: "设置", cancelBlock:nil, confirmBlock: { (popupView, index, str) in
+//                let url = URL(string: UIApplication.openSettingsURLString)
+//                if let url = url, UIApplication.shared.canOpenURL(url) {
+//                    if #available(iOS 10.0, *) {
+//                        UIApplication.shared.open(url, options: [:],completionHandler: {(success) in})
+//                    }else {
+//                        UIApplication.shared.openURL(url)
+//                    }
+//                }
+//            })
+//        })
+//    }
 }

+ 46 - 0
RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodUpToYoPublishModel.swift

@@ -0,0 +1,46 @@
+//
+//  AliyunVodupToYoPublishModel.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/8/10.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class AliyunVodUpToYoPublishModel: NSObject {
+    
+    /// 发布类型
+    ///
+    /// - image: 图片
+    /// - video: 视频
+    enum PublishType {
+        case image
+        case video
+    }
+    
+    /// 上传到后端
+    var title: String?
+    var content: String?
+    var locationString: String?
+    var topicIds: Array<String>?
+    
+    //图片/视频
+    var publishType : PublishType?
+    
+    //图片
+    var images: Array<UIImage>?
+    var imageUrlPaths:Array<String>?
+    var imageUrls = Array<String>()
+    
+    //视频
+    var videoPath: String?
+    var videoCoverImage: UIImage?
+    var videoCoverImageUrlPath: String?
+    var pushVideoId: String?
+    var pushVideoCoverImageUrl: String?
+    
+    /// 授权凭证
+    var uploadAuth : String?
+    
+}

+ 340 - 0
RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/AliyunVodupToyoPublishManager.swift

@@ -0,0 +1,340 @@
+//
+//  AliyunVodupToyoPublishManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/8/10.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import SwiftyJSON
+
+class AliyunVodUpToyoPublishManager: NSObject {
+    
+    deinit {
+        NXLLog("deinit")
+    }
+    
+    static let shared : AliyunVodUpToyoPublishManager = AliyunVodUpToyoPublishManager()
+    
+    /// 参数模型
+    var aliyunVodUpToYoPublishModel : AliyunVodUpToYoPublishModel?
+    
+    /// 进度条View
+    var progressView :PublishUploadProgressView?
+    
+    /// 是否上传视频
+    var isUploadingVideo: Bool = true
+    
+    /// 多图上传次数
+    var curTimes : Int = 0
+    
+    /// 多图上传的进度值
+    var imagesProgressValue : CGFloat = 0.0
+   
+    /// 阿里云上传发布管理
+    var aliyunVodPublishManager: AliyunVodPublishManager?
+    
+    /// 发布
+    ///
+    /// - Parameters:
+    ///   - aliyunVodUpToYoPublishModel: 发布参数
+    ///   - view: 发布View
+    func publish(aliyunVodUpToYoPublishModel:AliyunVodUpToYoPublishModel?,view:UIView?) {
+       
+        let aliyunVodPublishManager = AliyunVodPublishManager()
+        aliyunVodPublishManager.uploadCallback = self
+        self.aliyunVodPublishManager = aliyunVodPublishManager
+        self.aliyunVodUpToYoPublishModel = aliyunVodUpToYoPublishModel
+        progressView = PublishUploadProgressView.publishUploadProgressView(attachedView: view)
+        progressView?.attachedView?.isHidden = false
+        self.progressView?.curUploadStatus = nil
+        
+        if self.aliyunVodUpToYoPublishModel?.publishType == .video { //视频
+            progressView?.imageView.image = aliyunVodUpToYoPublishModel?.videoCoverImage
+            videoUploadAuth()
+        }else if self.aliyunVodUpToYoPublishModel?.publishType == .image  { //图片
+            writePhotosToFileAndSetPath()
+        }
+    }
+    
+    func destroy() {
+        self.aliyunVodUpToYoPublishModel = nil
+        self.isUploadingVideo = true
+        self.curTimes = 0
+        self.imagesProgressValue = 0.0
+        self.aliyunVodPublishManager = nil
+    }
+
+}
+// MARK: - video
+extension AliyunVodUpToyoPublishManager {
+    // 获取视频上传地址和凭证(视频)
+    func videoUploadAuth() {
+        
+        var title = ""
+        if self.aliyunVodUpToYoPublishModel?.title == nil || self.aliyunVodUpToYoPublishModel?.title == "" {
+            title = self.aliyunVodUpToYoPublishModel?.content ?? ""
+        }else {
+            title = self.aliyunVodUpToYoPublishModel?.title ?? ""
+        }
+
+        SwiftMoyaNetWorkServiceCommunity.shared().communityVideoUploadAuthApi(title:title, filename: "\(self.aliyunVodUpToYoPublishModel?.videoPath?.suffix(20) ?? "")", cover_url: self.aliyunVodUpToYoPublishModel?.videoCoverImageUrlPath ?? "", completion: {
+            [weak self] (communityVideoAuthModel) -> (Void) in
+            let communityVideoAuthModel = communityVideoAuthModel as? CommunityVideoAuthModel
+            self?.aliyunVodUpToYoPublishModel?.pushVideoId = communityVideoAuthModel?.videoId
+            self?.aliyunVodUpToYoPublishModel?.uploadAuth = communityVideoAuthModel?.uploadAuth
+            self?.uploadVideo(communityVideoAuthModel: communityVideoAuthModel)
+        }) { [weak self] _ in
+            self?.progressView?.attachedView?.isHidden = true
+            self?.destroy()
+        }
+    }
+    
+    /// 上传视频
+    ///
+    /// - Parameter communityVideoAuthModel: 上传地址和凭证(图片)
+    func uploadVideo(communityVideoAuthModel:CommunityVideoAuthModel?) {
+        //上传视频
+        aliyunVodPublishManager?.uploadVideo(withPath: self.aliyunVodUpToYoPublishModel?.videoPath ?? "", uploadAddress: communityVideoAuthModel?.uploadAddress ?? "", uploadAuth: communityVideoAuthModel?.uploadAuth ?? "")
+    }
+    // 获取视频上传地址和凭证(视频封面图片)
+    func videoCoverImageUploadAuth(){
+        SwiftMoyaNetWorkServiceCommunity.shared().communityImageUploadAuth(completion: {
+            [weak self] (communityImageAuthModel) -> (Void) in
+            let communityImageAuthModel = communityImageAuthModel as? CommunityImageAuthModel
+            
+            let imgWidth  = Int(self?.aliyunVodUpToYoPublishModel?.videoCoverImage?.size.width ?? 0)
+            let imgHeight = Int(self?.aliyunVodUpToYoPublishModel?.videoCoverImage?.size.height ?? 0)
+            let urlStr = String(format: "%@?%ld_%ld", communityImageAuthModel?.imageURL ?? "", imgWidth, imgHeight)
+            // 设置主图
+            self?.aliyunVodUpToYoPublishModel?.pushVideoCoverImageUrl = urlStr
+            self?.aliyunVodUpToYoPublishModel?.uploadAuth = communityImageAuthModel?.uploadAuth
+            self?.uploadVideoCoverImage(communityImageAuthModel: communityImageAuthModel)
+        }) {[weak self] _ in
+            self?.destroy()
+        }
+    }
+    
+    /// 上传视频封面图
+    ///
+    /// - Parameter communityVideoAuthModel: 上传地址和凭证(图片)
+    func uploadVideoCoverImage(communityImageAuthModel:CommunityImageAuthModel?) {
+        aliyunVodPublishManager?.uploadImage(withPath: self.aliyunVodUpToYoPublishModel?.videoCoverImageUrlPath ?? "", uploadAddress: communityImageAuthModel?.uploadAddress ?? "", uploadAuth: communityImageAuthModel?.uploadAuth ?? "")
+    }
+    
+    
+    // 发布视频
+    func publishVideo() {
+        
+        let topicJsonStr = JSON(self.aliyunVodUpToYoPublishModel?.topicIds as Any).description
+        let imgs = [self.aliyunVodUpToYoPublishModel?.pushVideoCoverImageUrl]
+        let imgsJsonStr = JSON(imgs as Any).description
+        
+        SwiftMoyaNetWorkServiceCommunity.shared().communityPublishApi(type: "video", img: self.aliyunVodUpToYoPublishModel?.pushVideoCoverImageUrl ?? "", topic_ids: topicJsonStr, video: self.aliyunVodUpToYoPublishModel?.pushVideoId ?? "", title: self.aliyunVodUpToYoPublishModel?.title ?? "", content: self.aliyunVodUpToYoPublishModel?.content ?? "", location: self.aliyunVodUpToYoPublishModel?.locationString ?? "", imgs: imgsJsonStr, completion: {
+            [weak self] (communityPublishModel) -> (Void) in
+            let communityPublishModel = communityPublishModel as? CommunityPublishModel
+            VirusViewModel.shared.publishVirueRecordAddApi(postId: communityPublishModel?.postId, postType: "video", title: self?.aliyunVodUpToYoPublishModel?.title, content: self?.aliyunVodUpToYoPublishModel?.content, postCover: self?.aliyunVodUpToYoPublishModel?.videoCoverImageUrlPath,completion:{
+                [weak self] in
+                self?.progressView?.curUploadStatus = .success
+                self?.progressView?.attachedView?.isHidden = true
+                self?.destroy()
+                NotificationCenter.default.post(name: NSNotification.Name("PublishPostSuccess"), object: nil)
+            })
+
+        }) { [weak self] _ in
+            self?.progressView?.attachedView?.isHidden = true
+            self?.destroy()
+        }
+    }
+}
+
+// MARK: - image
+extension AliyunVodUpToyoPublishManager {
+    // 存储图片路径
+    func writePhotosToFileAndSetPath() {
+        if !(aliyunVodUpToYoPublishModel?.images?.isEmpty ?? true) {
+            var imageUrlPaths = Array<String>()
+            for image in (aliyunVodUpToYoPublishModel?.images)! {
+                //旋转修正
+                let image = image.rotate(aImage: image)
+                let imagePath: String = (PathManager.tmpPath() ?? "") + (PathManager.randomString() ?? "")
+                let imgData: Data? = UIImage.pngData(image)()
+                do {
+                    try imgData?.write(to: URL(fileURLWithPath: imagePath))
+                    imageUrlPaths.append(imagePath)
+                }
+                catch {
+                    NXLLog("存入失败")
+                }
+            }
+            
+            aliyunVodUpToYoPublishModel?.imageUrlPaths = imageUrlPaths
+            imageUploadAuth()
+        }
+    }
+    
+    // 获取上传地址和凭证(图片)
+    func imageUploadAuth(){
+        SwiftMoyaNetWorkServiceCommunity.shared().communityImageUploadAuth(completion: {
+            [weak self] (communityImageAuthModel) -> (Void) in
+            let communityImageAuthModel = communityImageAuthModel as? CommunityImageAuthModel
+            self?.progressView?.imageView.image = self?.aliyunVodUpToYoPublishModel?.images?[(self?.curTimes)!]
+            
+            let imgWidth  = Int(self?.aliyunVodUpToYoPublishModel?.images?[(self?.curTimes)!].size.width ?? 0)
+            let imgHeight = Int(self?.aliyunVodUpToYoPublishModel?.images?[(self?.curTimes)!].size.height ?? 0)
+            let urlStr = String(format: "%@?%ld_%ld", communityImageAuthModel?.imageURL ?? "", imgWidth, imgHeight)
+            self?.aliyunVodUpToYoPublishModel?.imageUrls.append(urlStr)
+            self?.aliyunVodUpToYoPublishModel?.uploadAuth = communityImageAuthModel?.uploadAuth
+            self?.uploadImage(communityImageAuthModel: communityImageAuthModel)
+        }) {[weak self] _ in
+            self?.progressView?.attachedView?.isHidden = true
+            self?.destroy()
+        }
+    }
+    
+    /// 上传图片
+    ///
+    /// - Parameter communityVideoAuthModel: 上传地址和凭证(图片)
+    func uploadImage(communityImageAuthModel:CommunityImageAuthModel?) {
+        if !(self.aliyunVodUpToYoPublishModel?.imageUrlPaths?.isEmpty ?? true) {
+             aliyunVodPublishManager?.uploadImage(withPath: self.aliyunVodUpToYoPublishModel?.imageUrlPaths?[(self.curTimes)] ?? "", uploadAddress: communityImageAuthModel?.uploadAddress ?? "", uploadAuth: communityImageAuthModel?.uploadAuth ?? "")
+        }else {
+            self.progressView?.attachedView?.isHidden = true
+            self.destroy()
+            SwiftProgressHUD.shared().showText("图片路径存储错误,请重新上传")
+        }
+    }
+    
+    
+    // 发布图片
+    func publishImage() {
+        
+        let topicJsonStr = JSON(self.aliyunVodUpToYoPublishModel?.topicIds as Any).description
+        let imgsJsonStr = JSON(self.aliyunVodUpToYoPublishModel?.imageUrls as Any).description
+        
+        SwiftMoyaNetWorkServiceCommunity.shared().communityPublishApi(type: "image", img: self.aliyunVodUpToYoPublishModel?.imageUrls.first ?? "", topic_ids: topicJsonStr, title: self.aliyunVodUpToYoPublishModel?.title ?? "", content: self.aliyunVodUpToYoPublishModel?.content ?? "", location: self.aliyunVodUpToYoPublishModel?.locationString ?? "", imgs: imgsJsonStr, completion: {
+            [weak self] (communityPublishModel) -> (Void) in
+            let communityPublishModel = communityPublishModel as? CommunityPublishModel
+            VirusViewModel.shared.publishVirueRecordAddApi(postId: communityPublishModel?.postId, postType: "image", title: self?.aliyunVodUpToYoPublishModel?.title, content: self?.aliyunVodUpToYoPublishModel?.content, postCover: self?.aliyunVodUpToYoPublishModel?.imageUrls.first,completion:{
+                [weak self] in
+                self?.progressView?.curUploadStatus = .success
+                self?.progressView?.attachedView?.isHidden = true
+                self?.destroy()
+                NotificationCenter.default.post(name: NSNotification.Name("PublishPostSuccess"), object: nil)
+            })
+
+        }) { [weak self] _ in
+            self?.progressView?.attachedView?.isHidden = true
+            self?.destroy()
+        }
+    }
+    
+}
+
+extension AliyunVodUpToyoPublishManager: AliyunIVodUploadCallback {
+    
+    /// 上传成功
+    ///
+    /// - Parameter manager: AliyunVodPublishManager
+    func publishManagerUploadSuccess(_ manager: AliyunVodPublishManager) {
+        if self.aliyunVodUpToYoPublishModel?.publishType == .video { //发布视频
+            if isUploadingVideo {
+                isUploadingVideo = false
+                videoCoverImageUploadAuth()
+            }else {
+                publishVideo()
+            }
+        }else if self.aliyunVodUpToYoPublishModel?.publishType == .image { //图片
+            // 图片上传流程
+            self.curTimes += 1
+            if self.curTimes < self.aliyunVodUpToYoPublishModel?.images?.count ?? 1 {
+                self.imagesProgressValue = CGFloat(CGFloat(self.curTimes)/CGFloat((self.aliyunVodUpToYoPublishModel?.images?.count ?? 1)))
+                // 继续上传
+                self.imageUploadAuth()
+            }else {
+                // 图片上传成功,去发布
+                self.publishImage()
+            }
+
+        }
+    }
+
+    /// 上传失败
+    ///
+    /// - Parameters:
+    ///   - manager: AliyunVodPublishManager
+    ///   - code: 错误码
+    ///   - message: 错误描述
+    func publishManager(_ manager: AliyunVodPublishManager, uploadFailedWithCode code: String, message: String) {
+        self.progressView?.curUploadStatus = .failure
+        self.destroy()
+        manager.cancelUpload()
+    }
+    
+    /// 上传进度
+    ///
+    /// - Parameters:
+    ///   - manager: AliyunVodPublishManager
+    ///   - uploadedSize: 已上传数据大小
+    ///   - totalSize: 所有数据大小
+    func publishManager(_ manager: AliyunVodPublishManager, uploadProgressWithUploadedSize uploadedSize: Int64, totalSize: Int64) {
+        let uploadedSizeStr = "\(uploadedSize)" as NSString
+        let totalSizeStr = "\(totalSize)" as NSString
+        self.progressView?.curUploadStatus = .uploading
+        if (manager.uploadState == .video) { //上传视频
+            if isUploadingVideo {
+                let progressValue : CGFloat = CGFloat(uploadedSizeStr.doubleValue / totalSizeStr.doubleValue / 2.0)
+                DispatchQueue.main.async(execute: {
+                    [weak self] in
+                    self?.progressView?.uploadProgress = progressValue
+                })
+
+            }else {
+                let progressValue : CGFloat = CGFloat(uploadedSizeStr.doubleValue / totalSizeStr.doubleValue / 2.0) + 0.5
+                DispatchQueue.main.async(execute: {
+                    [weak self] in
+                    self?.progressView?.uploadProgress = progressValue
+                })
+            }
+        }else {
+            if self.aliyunVodUpToYoPublishModel?.publishType == .video { //上传视频封面图
+                let progressValue : CGFloat = CGFloat(uploadedSizeStr.doubleValue / totalSizeStr.doubleValue / 2.0) + 0.5
+                DispatchQueue.main.async(execute: {
+                    [weak self] in
+                    self?.progressView?.uploadProgress = progressValue
+                })
+            }else if self.aliyunVodUpToYoPublishModel?.publishType == .image {
+                DispatchQueue.main.async(execute: {
+                    [weak self] in
+                    let imagesStr = "\(self?.aliyunVodUpToYoPublishModel?.images?.count ?? 1)" as NSString
+                    let progressValue : CGFloat = CGFloat(uploadedSizeStr.doubleValue / totalSizeStr.doubleValue / imagesStr.doubleValue) + (self?.imagesProgressValue ?? 0.0)
+                    // 更新进度
+                    self?.progressView?.uploadProgress = progressValue
+                })
+            }
+        }
+    }
+    
+    /// 上传token过期
+    ///
+    /// - Parameter manager: AliyunVodPublishManager
+    func publishManagerUploadTokenExpired(_ manager: AliyunVodPublishManager) {
+        manager.refresh(withUploadAuth: self.aliyunVodUpToYoPublishModel?.uploadAuth ?? "")
+    }
+    
+    /// 上传超时,开始尝试重试
+    ///
+    /// - Parameter manager: AliyunVodPublishManager
+    func publishManagerUploadRetry(_ manager: AliyunVodPublishManager) {
+        NXLLog("继续上传")
+    }
+
+    /// 重试成功,开始继续上传
+    ///
+    /// - Parameter manager: AliyunVodPublishManager
+    func publishManagerUploadRetryResume(_ manager: AliyunVodPublishManager) {
+        NXLLog("重试成功")
+    }
+    
+}

+ 188 - 0
RainbowPlanet/RainbowPlanet/Manager/AliyunVodManager/AliyunVodUpToyoPublishManager/PublishUploadProgressView.swift

@@ -0,0 +1,188 @@
+//
+//  PublishUploadProgressView.swift
+//  RainbowPlanet
+//
+//  Created by Christopher on 2019/7/21.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//  发布进度のView
+
+import UIKit
+import FWPopupView
+import RxSwift
+import RxCocoa
+
+/// 跳转方式
+///
+/// - none: 默认
+/// - push: push
+enum UploadStatus{
+    case uploading
+    case success
+    case failure
+}
+
+class PublishUploadProgressView: FWPopupView {
+    
+    
+    
+    let disposeBag = DisposeBag()
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    
+    func setupViews() {
+        self.backgroundColor = kffffffColor
+        addSubview(imageView)
+        addSubview(progressLabel)
+        addSubview(progressView)
+        addSubview(failedLabel)
+        addSubview(failedCloseButton)
+    }
+    
+    func setupLayouts() {
+        imageView.snp.makeConstraints { (make) in
+            make.left.equalTo(14)
+            make.centerY.equalToSuperview()
+            make.size.equalTo(44)
+        }
+        progressLabel.snp.makeConstraints { (make) in
+            make.left.equalTo(imageView.snp_right).offset(10)
+            make.top.equalTo(14)
+            make.height.equalTo(20)
+        }
+        progressView.snp.makeConstraints { (make) in
+            make.top.equalTo(progressLabel.snp_bottom).offset(10)
+            make.left.equalTo(imageView.snp_right).offset(10)
+            make.right.equalTo(-15)
+            make.height.equalTo(4)
+        }
+        failedLabel.snp.makeConstraints { (make) in
+            make.left.equalTo(imageView.snp_right).offset(10)
+            make.centerY.equalToSuperview()
+            make.height.equalTo(20)
+        }
+        failedCloseButton.snp.makeConstraints { (make) in
+            make.right.equalTo(-3)
+            make.centerY.equalToSuperview()
+            make.size.equalTo(44)
+        }
+    }
+    
+    lazy var imageView: UIImageView = {
+        let imageView = UIImageView()
+        imageView.image = kImage(name: "default_pic")
+        imageView.contentMode =  .scaleAspectFill
+        imageView.clipsToBounds = true
+        return imageView
+    }()
+    
+    private lazy var progressLabel: UILabel = {
+        let progressLabel = UILabel()
+        progressLabel.textColor = k333333Color
+        progressLabel.font = kRegularFont14
+        progressLabel.textAlignment = .left
+        return progressLabel
+    }()
+    
+    private lazy var progressView: UIProgressView = {
+        let progressView = UIProgressView(progressViewStyle: .default)
+        progressView.setProgress(0, animated: false)
+        progressView.progressTintColor = kThemeColor //进度颜色
+        progressView.trackTintColor = kd8d8d8Color //剩余进度颜色
+        progressView.cornerRadius = 2
+        progressView.masksToBounds = true
+        return progressView
+    }()
+    
+    private lazy var failedLabel: UILabel = {
+        let failedLabel = UILabel()
+        failedLabel.text = "发布失败..."
+        failedLabel.textColor = k333333Color
+        failedLabel.font = kRegularFont14
+        failedLabel.textAlignment = .left
+        return failedLabel
+    }()
+    
+    private lazy var failedCloseButton: UIButton = {
+        let failedCloseButton = UIButton(type: UIButton.ButtonType.custom)
+        failedCloseButton.setImage(kImage(name: "popup_btn_close_black"), for: .normal)
+        failedCloseButton.rx.tap.subscribe(onNext: { [weak self] (data) in
+            self?.hide()
+            self?.attachedView?.isHidden = true
+            
+        }).disposed(by: disposeBag)
+        return failedCloseButton
+    }()
+    
+    var curUploadStatus : UploadStatus? {
+        didSet {
+            if curUploadStatus != nil {
+                judgeShowStatus()
+            }
+        }
+    }
+    
+    var uploadProgress: CGFloat? {
+        didSet {
+            progressView.setProgress(Float(self.uploadProgress ?? 0), animated: true)
+            
+            var progressValue: Float = Float(self.uploadProgress ?? 0)
+            progressValue = progressValue * 100
+            let proValueStr: String = String(format: "正在上传中%.0f%%", progressValue)
+            progressLabel.text = proValueStr
+        }
+    }
+    
+    class func publishUploadProgressView(attachedView:UIView?) -> PublishUploadProgressView {
+        let view = PublishUploadProgressView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 62))
+        view.curUploadStatus = .uploading
+        let vProperty = FWPopupViewProperty()
+        vProperty.popupCustomAlignment = .topCenter
+        vProperty.popupViewEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )
+        vProperty.popupAnimationType = .frame
+        vProperty.maskViewColor = UIColor(white: 0, alpha: 0.5)
+        vProperty.touchWildToHide = "0"
+        vProperty.maskViewColor = UIColor.clear
+        view.vProperty = vProperty
+        view.attachedView = attachedView
+        view.show()
+        return view
+    }
+    
+}
+
+extension PublishUploadProgressView {
+    
+    
+    func judgeShowStatus() -> Void {
+        switch curUploadStatus {
+        case .uploading?:
+            progressLabel.isHidden = false
+            progressView.isHidden = false
+            failedLabel.isHidden = true
+            failedCloseButton.isHidden = true
+            progressLabel.text = "正在上传中..."
+        case .success?:
+            progressLabel.isHidden = false
+            progressView.isHidden = false
+            failedLabel.isHidden = true
+            failedCloseButton.isHidden = true
+            progressLabel.text = "上传成功!发布中..."
+        case .failure?:
+            progressLabel.isHidden = true
+            progressView.isHidden = true
+            failedLabel.isHidden = false
+            failedCloseButton.isHidden = false
+        case .none:
+            break
+        }
+    }
+}

+ 64 - 0
RainbowPlanet/RainbowPlanet/Manager/AppStoreManager/AppStoreManager.swift

@@ -0,0 +1,64 @@
+//
+//  AppStoreReview.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/6/18.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import StoreKit
+
+let kAppStoreAppId = "1476038871"
+
+class AppStoreManager: NSObject {
+    static let shared : AppStoreManager = AppStoreManager()
+    /// 跳转到appStoreUrl
+    let kAppStore = String(describing: "https://itunes.apple.com/cn/app/\(kAppStoreAppId)")
+    ///跳转到appStore评论
+    let kAppStoreReview = String(describing: "https://itunes.apple.com/cn/app/\(kAppStoreAppId)?action=write-review")
+    var viewController:UIViewController?
+    
+    /// 跳转到AppStore
+    func appStore() {
+        UIApplication.shared.openURL(URL(string: kAppStore)!)
+    }
+    
+    /// 跳转到AppStore评论
+    func appStoreReview() {
+        UIApplication.shared.openURL(URL(string: kAppStoreReview)!)
+    }
+    
+    ///只能评分,且一年只能使用三次弹框。
+    func storeReviewController() {
+        if #available(iOS 10.3, *) {
+            SKStoreReviewController.requestReview()
+        } else {
+            appStoreReview()
+        }
+    }
+    
+    ///内部加载AppStore
+    func webAppStore(viewController:UIViewController) {
+        self.viewController = viewController
+        let storeProductViewContorller = SKStoreProductViewController()
+        storeProductViewContorller.delegate = self
+        storeProductViewContorller.loadProduct(withParameters: [SKStoreProductParameterITunesItemIdentifier:kAppStoreAppId]) { (result, error) in
+            if result {
+                viewController.present(storeProductViewContorller, animated: true, completion: {
+                    
+                })
+            }else {
+                SwiftProgressHUD.shared().showText("加载AppStore失败")
+            }
+        }
+    }
+}
+
+extension AppStoreManager: SKStoreProductViewControllerDelegate {
+    func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
+        self.viewController?.dismiss(animated: true) {
+            
+        }
+    }
+}

+ 269 - 0
RainbowPlanet/RainbowPlanet/Manager/CacheManager/CacheManager.swift

@@ -0,0 +1,269 @@
+//
+//  CacheManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/6/28.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import Cache
+
+class CacheManager: NSObject {
+    static let `default` = CacheManager()
+    /// Manage storage
+    private var storage: Storage<CacheModel>?
+    /// init
+    override init() {
+        super.init()
+        expiryConfiguration()
+    }
+    var expiry: DaisyExpiry = .never
+    
+    
+    /// 存储配置
+    ///
+    /// - Parameter expiry: <#expiry description#>
+    func expiryConfiguration(expiry: DaisyExpiry = .never) {
+        self.expiry = expiry
+        let diskConfig = DiskConfig(
+            name: "DaisyCache",
+            expiry: expiry.expiry
+        )
+        let memoryConfig = MemoryConfig(expiry: expiry.expiry)
+        do {
+            storage = try Storage(diskConfig: diskConfig, memoryConfig: memoryConfig, transformer: TransformerFactory.forCodable(ofType: CacheModel.self))
+        } catch {
+            NXLLog(error)
+        }
+    }
+    
+    /// 同步缓存
+    ///
+    /// - Parameters:
+    ///   - object: model
+    ///   - key: key
+    func setObjectSync(_ object: CacheModel, forKey key: String) {
+        try? storage!.setObject(object, forKey: key)
+    }
+    
+    /// 同步读取缓存
+    ///
+    /// - Parameter key: key
+    /// - Returns: model
+    func objectSync(forKey key: String) -> CacheModel? {
+        do {
+            ///过期清除缓存
+            if let isExpire = try storage?.isExpiredObject(forKey: key), isExpire {
+                removeObjectCacheAsync(key) { (_) in }
+                return nil
+            } else {
+                return (try storage?.object(forKey: key)) ?? nil
+            }
+        } catch {
+            return nil
+        }
+    }
+    
+    /// 同步是否存在对象
+    ///
+    /// - Parameters:
+    ///   - key: key
+    ///   - completion: completion
+    func existsObjectAync(forKey key: String,completion: @escaping (_ isSuccess: Bool)->()) {
+        // Check if an object exists
+        let isExists = (try? storage?.existsObject(forKey: key))!
+        completion(isExists)
+    }
+    
+    /// 同步根据key值清除缓存
+    ///
+    /// - Parameters:
+    ///   - cacheKey: cacheKey
+    func removeObjectCacheSync(_ cacheKey: String) {
+        try? storage?.removeObject(forKey: cacheKey)
+    }
+    
+    
+    /// 同步清除存储的对象
+    func removeExpiredObjectsSync() {
+        try? storage?.removeExpiredObjects()
+    }
+    
+    /// 同步清除所有缓存
+    func removeAllCacheSync() {
+        try? storage?.removeAll()
+    }
+    
+    /// 异步缓存
+    ///
+    /// - Parameters:
+    ///   - object: model
+    ///   - key: key
+    func setObjectAsyncA(_ object: CacheModel, forKey key: String) {
+        
+        storage?.async.setObject(object, forKey: key, expiry: nil, completion: { (result) in
+            switch result {
+            case .value(_):
+                NXLLog("缓存成功")
+            case .error(let error):
+                NXLLog("缓存失败: \(error)")
+            }
+        })
+    }
+    
+    /// 异步读取缓存
+    ///
+    /// - Parameter key: key
+    /// - Returns: model
+    func objectAsync(forKey key: String,completion: @escaping (_ object: CacheModel)->()){
+        ///过期清除缓存
+        if let isExpire = try? storage?.isExpiredObject(forKey: key), isExpire {
+            removeObjectCacheAsync(key) { (_) in }
+        } else {
+            storage?.async.object(forKey: key) { result in
+                DispatchQueue.main.async {
+                    switch result {
+                    case .value(let object):
+                        completion(object)
+                        NXLLog("读取成功")
+                    case .error(let error):
+                        NXLLog("读取失败: \(error)")
+                    }
+                }
+            }
+        }
+        
+    }
+    
+    /// 异步是否存在对象
+    ///
+    /// - Parameters:
+    ///   - key: key
+    ///   - completion: completion
+    func existsObjectAsync(forKey key: String,completion: @escaping (_ isSuccess: Bool)->()) {
+        storage?.async.existsObject(forKey: key) { result in
+            if case .value(let exists) = result, exists {
+                completion(true)
+                NXLLog("存在对象")
+            }else {
+                completion(false)
+                 NXLLog("不存在对象")
+            }
+        }
+    }
+    
+    /// 异步根据key值清除缓存
+    ///
+    /// - Parameters:
+    ///   - cacheKey: cacheKey
+    ///   - completion: completion
+    func removeObjectCacheAsync(_ cacheKey: String, completion: @escaping (_ isSuccess: Bool)->()) {
+        storage?.async.removeObject(forKey: cacheKey, completion: { result in
+            DispatchQueue.main.async {
+                switch result {
+                case .value:
+                    completion(true)
+                    NXLLog("根据key值清除缓存成功")
+                case .error(let error):
+                    completion(false)
+                    NXLLog("根据key值清除缓存失败:\(error)")
+                }
+            }
+        })
+    }
+    
+    
+    /// 清除存储的对象
+    ///
+    /// - Parameter completion: completion
+    func removeExpiredObjectsAsync(completion: @escaping (_ isSuccess: Bool)->()) {
+        storage?.async.removeExpiredObjects() { result in
+            DispatchQueue.main.async {
+                switch result {
+                case .value:
+                    completion(true)
+                    NXLLog("清除存储的对象成功")
+                case .error(let error):
+                    completion(false)
+                    NXLLog("清除存储的对象缓存失败:\(error)")
+                }
+            }
+        }
+    }
+    
+    /// 清除所有缓存
+    ///
+    /// - Parameter completion: completion
+    func removeAllCacheAsync(completion: @escaping (_ isSuccess: Bool)->()) {
+        storage?.async.removeAll(completion: { result in
+            DispatchQueue.main.async {
+                switch result {
+                case .value:
+                    completion(true)
+                    NXLLog("清除所有缓存成功")
+                case .error(let error):
+                    completion(false)
+                    NXLLog("清除所有缓存失败:\(error)")
+                }
+            }
+        })
+    }
+
+}
+
+/// 缓存过期时间
+///
+/// - Parameter expiry: 参考 DaisyExpiry
+public func cacheExpiryConfig(expiry: DaisyExpiry) {
+    CacheManager.default.expiryConfiguration(expiry: expiry)
+}
+
+public enum DaisyExpiry {
+    /// Object will be expired in the nearest future
+    case never
+    /// Object will be expired in the specified amount of seconds
+    case seconds(TimeInterval)
+    /// Object will be expired on the specified date
+    case date(Date)
+    
+    /// Returns the appropriate date object
+    public var expiry: Expiry {
+        switch self {
+        case .never:
+            return Expiry.never
+        case .seconds(let seconds):
+            return Expiry.seconds(seconds)
+        case .date(let date):
+            return Expiry.date(date)
+        }
+    }
+    public var isExpired: Bool {
+        return expiry.isExpired
+    }
+}
+
+struct CacheModel: Codable {
+    var data: Data?
+    var dataDict: Dictionary<String, Data>?
+    init() {}
+}
+
+func jsonToData(jsonDic:Dictionary<String, Any>) -> Data? {
+    if (!JSONSerialization.isValidJSONObject(jsonDic)) {
+        NXLLog("is not a valid json object")
+        return nil
+    }
+    //利用自带的json库转换成Data
+    //如果设置options为JSONSerialization.WritingOptions.prettyPrinted,则打印格式更好阅读
+    let data = try? JSONSerialization.data(withJSONObject: jsonDic, options: [])
+    //Data转换成String打印输出
+    let str = String(data:data!, encoding: String.Encoding.utf8)
+    //输出json字符串
+    NXLLog("Json Str:\(str!)")
+    return data
+}
+
+
+
+

+ 185 - 0
RainbowPlanet/RainbowPlanet/Manager/MJRefreshManager/MJRefreshManager.swift

@@ -0,0 +1,185 @@
+//
+//  File.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/7/26.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+
+class MJRefreshManager: NSObject {
+
+    //MARK: - tableView
+    class func mjRefreshManager(tableView : UITableView?) {
+        if tableView?.mj_footer != nil {
+            tableView?.endFooterRefresh()
+        }
+        if tableView?.mj_header != nil {
+            tableView?.endHeaderRefresh()
+        }
+        tableView?.ly_endLoading()
+    }
+    
+    class func mjRefreshManagerNONetWork(tableView : UITableView?) {
+        DIYEmptyView.emptyNoDataActionTableView(tableView: tableView, btnClickBlock: {
+            [weak tableView] in
+            tableView?.mj_header.beginRefreshing()
+        })
+
+        if tableView?.mj_footer != nil {
+            tableView?.endFooterRefresh()
+        }
+        if tableView?.mj_header != nil {
+            tableView?.endHeaderRefresh()
+        }
+        tableView?.ly_endLoading()
+    }
+    
+    class func mjRefreshManagerNOData(tableView : UITableView?) {
+        DIYEmptyView.emptyNoDataTableView(tableView: tableView,imageStr: .one,detailStr: .one)
+        if tableView?.mj_footer != nil {
+            tableView?.endFooterRefresh()
+        }
+        if tableView?.mj_header != nil {
+            tableView?.endHeaderRefresh()
+        }
+        tableView?.ly_endLoading()
+    }
+    
+    class func mjRefreshManagerLoadingStatus(tableView:UITableView?,loadingStatus:SwiftMoyaNetWorkManagerLoadingStatus) {
+        if tableView?.mj_footer != nil {
+            tableView?.isHiddenFooter(true)
+        }
+        if loadingStatus == .noData {
+            mjRefreshManagerNOData(tableView: tableView)
+        }else if loadingStatus == .noNetwork {
+            mjRefreshManagerNONetWork(tableView: tableView)
+        }
+    }
+    
+    class func mjRefreshManagerPaginationNoHiddenFooter(tableView : UITableView?,pagination : PaginationModel?) {
+        mjRefreshManagerIsHiddenFooter(isHidden: false, tableView: tableView, pagination: pagination)
+
+    }
+    
+    class func mjRefreshManagerPaginationHiddenFooter(tableView : UITableView?,pagination : PaginationModel?) {
+        mjRefreshManagerIsHiddenFooter(isHidden: true, tableView: tableView, pagination: pagination)
+    }
+    
+    private class func mjRefreshManagerIsHiddenFooter(isHidden:Bool,tableView : UITableView?,pagination : PaginationModel?) {
+        if tableView?.mj_header != nil {
+            tableView?.endHeaderRefresh()
+        }
+        if tableView?.mj_footer != nil {
+            tableView?.endFooterRefresh()
+        }
+        
+        if pagination?.total == 0 {
+            if tableView?.mj_footer != nil {
+                tableView?.isHiddenFooter(true)
+            }
+        }else {
+            if  pagination?.currentPage ?? 1  >= pagination?.totalPages ?? 1  {
+                tableView?.mj_footer.isHidden = false
+                if tableView?.mj_footer != nil {
+                    tableView?.endFooterNoMoreData()
+                    if isHidden {
+                        tableView?.isHiddenFooter(true)
+                    }else {
+                        tableView?.mj_footer.pullingPercent = 1
+                    }
+                }
+            }
+        }
+        
+        tableView?.ly_endLoading()
+        
+    }
+    
+    
+    //MARK: - collectionView
+    class func mjRefreshManager(collectionView : UICollectionView?) {
+
+        if collectionView?.mj_header != nil {
+            collectionView?.endHeaderRefresh()
+        }
+        if collectionView?.mj_footer != nil {
+            collectionView?.endFooterRefresh()
+        }
+        collectionView?.ly_endLoading()
+    }
+    
+    class func mjRefreshManagerNONetWork(collectionView : UICollectionView?) {
+        DIYEmptyView.emptyNoDataActionCollectionView(collectionView: collectionView, btnClickBlock: {
+            [weak collectionView] in
+            collectionView?.mj_header.beginRefreshing()
+        })
+        if collectionView?.mj_header != nil {
+            collectionView?.endHeaderRefresh()
+        }
+        if collectionView?.mj_footer != nil {
+            collectionView?.endFooterRefresh()
+        }
+        collectionView?.ly_endLoading()
+    }
+    
+    class func mjRefreshManagerNOData(collectionView : UICollectionView?) {
+        DIYEmptyView.emptyNoDataCollectionView(collectionView: collectionView)
+        if collectionView?.mj_header != nil {
+            collectionView?.endHeaderRefresh()
+        }
+        if collectionView?.mj_footer != nil {
+            collectionView?.endFooterRefresh()
+        }
+        collectionView?.ly_endLoading()
+    }
+    
+    class func mjRefreshManagerLoadingStatus(collectionView:UICollectionView?,loadingStatus:SwiftMoyaNetWorkManagerLoadingStatus) {
+        if collectionView?.mj_footer != nil {
+            collectionView?.isHiddenFooter(true)
+        }
+        if loadingStatus == .noData {
+            MJRefreshManager.mjRefreshManagerNOData(collectionView: collectionView)
+        }else if loadingStatus == .noNetwork {
+            MJRefreshManager.mjRefreshManagerNONetWork(collectionView: collectionView)
+        }
+    }
+    
+    class func mjRefreshManagerNoHiddenFooter(collectionView : UICollectionView?,pagination : PaginationModel?) {
+        mjRefreshManagerIsHiddenFooter(isHidden: false, collectionView: collectionView, pagination: pagination)
+    }
+    
+    class func mjRefreshManagerHiddenFooter(collectionView : UICollectionView?,pagination : PaginationModel?) {
+        mjRefreshManagerIsHiddenFooter(isHidden: true, collectionView: collectionView, pagination: pagination)
+    }
+    
+    private class func mjRefreshManagerIsHiddenFooter(isHidden:Bool,collectionView : UICollectionView?,pagination : PaginationModel?) {
+        if collectionView?.mj_header != nil {
+            collectionView?.endHeaderRefresh()
+        }
+        if collectionView?.mj_footer != nil {
+            collectionView?.endFooterRefresh()
+        }
+        
+        if pagination?.total == 0 {
+            if collectionView?.mj_footer != nil {
+                collectionView?.isHiddenFooter(true)
+            }
+        }else {
+            if  pagination?.currentPage ?? 1  >= pagination?.totalPages ?? 1  {
+                collectionView?.mj_footer.isHidden = false
+                if collectionView?.mj_footer != nil {
+                    collectionView?.endFooterNoMoreData()
+                    if isHidden {
+                        collectionView?.isHiddenFooter(true)
+                    }else {
+                        collectionView?.mj_footer.pullingPercent = 1
+                    }
+                }
+            }
+        }
+        
+        collectionView?.ly_endLoading()
+    }
+}

+ 19 - 5
RainbowPlanet/RainbowPlanet/Manager/MapManager/BaiduMapManager/BaiduMapManager.swift

@@ -10,7 +10,10 @@ import UIKit
 import SwiftyJSON
 
 //MARK: - 百度地图
-let kBaiduMapAppKey  = "v7wFjrAQdlaBVC50CjwuRESC3Lu0xkhj"
+
+let kBaiduMapAppKey  = "0FUPvEYPoRij3zm0tY5yLcyPKrrWspLY"
+//彩虹星球
+//let kBaiduMapAppKey  = "v7wFjrAQdlaBVC50CjwuRESC3Lu0xkhj"
 
 public class BaiduMapManager: NSObject {
     
@@ -52,7 +55,7 @@ public class BaiduMapManager: NSObject {
         //设置是否自动停止位置更新
         locationManager.pausesLocationUpdatesAutomatically = false
         //设置是否允许后台定位
-        locationManager.allowsBackgroundLocationUpdates = true
+        locationManager.allowsBackgroundLocationUpdates = false
         //设置位置获取超时时间
         locationManager.locationTimeout = 10
         //设置获取地址信息超时时间
@@ -93,9 +96,21 @@ public class BaiduMapManager: NSObject {
                         self?.locationModel.district = rgcData.district ?? ""
                         self?.locationModel.street = rgcData.street ?? ""
                         self?.locationModel.locationdescribe = rgcData.locationDescribe ?? ""
+                        
+                        // 存放BMKLocationPoi的Array不可直接转换为Json(暂不知具体原因),建立一个Swift对应的Model
+                        var poiList: Array<SwiftLocationPOIModel> = []
+                        let oriPoiList = rgcData.poiList ?? []
+                        for (_, locationPoi) in oriPoiList.enumerated()  {
+                            let poiMdl: SwiftLocationPOIModel = SwiftLocationPOIModel()
+                            poiMdl.name = locationPoi.name
+                            poiMdl.uid  = locationPoi.uid
+                            poiList.append(poiMdl)
+                        }
+                        self?.locationModel.poiList = poiList
                     }
-                    LocationModel.shared().setLocationModel(locationModel:  (self?.locationModel)!)
-                    NXLLog(LocationModel.shared().getLocationModel())
+                    
+                    LocationModel.shared().saveObject(locationModel: self?.locationModel ?? LocationModel())
+                    NXLLog(LocationModel.shared().object())
                     locationSuccessBlock()
                 }
             }
@@ -205,7 +220,6 @@ extension BaiduMapManager:BMKLocationManagerDelegate {
     ///  当定位发生错误时,会调用代理的此方法。
     public func bmkLocationManager(_ manager: BMKLocationManager, didFailWithError error: Error?) {
         NXLLog("定位错误");
-        
     }
     
     /// 定位权限状态改变时回调函数

+ 37 - 62
RainbowPlanet/RainbowPlanet/Manager/MapManager/BaiduMapManager/LocationModel.swift

@@ -7,15 +7,15 @@
 //
 
 import UIKit
+import ObjectMapper
+import SwiftyJSON
 
 /// 百度定位
 let kLocationModelCache = "LocationModel"
 
-class LocationModel: NSObject,NSCoding {
+class LocationModel: NSObject,Mappable {
 
-    private static let _sharedInstance = LocationModel()
-
-    override init() {} // 私有化init方法
+    static let _sharedInstance = LocationModel()
 
     class func shared() -> LocationModel {
         return _sharedInstance
@@ -45,71 +45,46 @@ class LocationModel: NSObject,NSCoding {
     var adCode = "610113"
     ///位置语义化结果的定位点在什么地方周围的描述信息
     var locationdescribe = "在西安北大科技园曲江创客大街园区附近"
+    ///位置语义化结果的属性,该定位点周围的poi列表信息
+    var poiList: Array<SwiftLocationPOIModel> = []
     
-    /// 反归档
-    ///
-    /// - Parameter decoder: 反编码值
-    required init?(coder aDecoder: NSCoder) {
-        self.latitude = aDecoder.decodeObject(forKey: "latitude") as? String ?? ""
-        self.longitude = aDecoder.decodeObject(forKey: "longitude") as? String ?? ""
-        self.country = aDecoder.decodeObject(forKey: "country") as? String ?? ""
-        self.countryCode = aDecoder.decodeObject(forKey: "countryCode") as? String ?? ""
-        self.province = aDecoder.decodeObject(forKey: "province") as? String ?? ""
-        self.city = aDecoder.decodeObject(forKey: "city") as? String ?? ""
-        self.district = aDecoder.decodeObject(forKey: "district") as? String ?? ""
-        self.street = aDecoder.decodeObject(forKey: "street") as? String ?? ""
-        self.streetNumber = aDecoder.decodeObject(forKey: "streetNumber") as? String ?? ""
-        self.cityCode = aDecoder.decodeObject(forKey: "cityCode") as? String ?? ""
-        self.adCode = aDecoder.decodeObject(forKey: "adCode") as? String ?? ""
-        self.locationdescribe = aDecoder.decodeObject(forKey: "locationdescribe") as? String ?? ""
-
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return LocationModel()
     }
-
-    /// 归档
-    ///
-    /// - Parameter aCoder: 归档值
-    func encode(with aCoder: NSCoder) {
-        aCoder.encode(self.latitude, forKey:"latitude")
-        aCoder.encode(self.longitude, forKey:"longitude")
-        aCoder.encode(self.country, forKey:"country")
-        aCoder.encode(self.countryCode, forKey:"countryCode")
-        aCoder.encode(self.province, forKey:"province")
-        aCoder.encode(self.city, forKey:"city")
-        aCoder.encode(self.district, forKey:"district")
-        aCoder.encode(self.street, forKey:"locationDescribe")
-        aCoder.encode(self.streetNumber, forKey:"streetNumber")
-        aCoder.encode(self.cityCode, forKey:"cityCode")
-        aCoder.encode(self.adCode, forKey:"adCode")
-        aCoder.encode(self.locationdescribe, forKey:"locationdescribe")
-
+    required init?(map: Map){}
+    override init(){}
+    
+    func mapping(map: Map)
+    {
+        latitude <- map["latitude"]
+        longitude <- map["longitude"]
+        country <- map["country"]
+        countryCode <- map["countryCode"]
+        province <- map["province"]
+        city <- map["city"]
+        district <- map["district"]
+        street <- map["street"]
+        streetNumber <- map["streetNumber"]
+        cityCode <- map["cityCode"]
+        adCode <- map["adCode"]
+        locationdescribe <- map["locationdescribe"]
+        poiList <- map["poiList"]
     }
+    
 
     /// 存储定位信息
-    ///
-    /// - Parameter locationModel: 定位模型
-    func setLocationModel(locationModel:LocationModel) -> Void {
-        //实例对象转换成Data
-        let modelData = NSKeyedArchiver.archivedData(withRootObject: locationModel)
-        //存储Data对象
-        UserDefaults.standard.set(modelData, forKey: kLocationModelCache)
-    }
-
-
-    /// 获取定位信息
-    ///
-    /// - Returns: 定位模型
-    func getLocationModel() -> LocationModel? {
-        //自定义对象读取
-        let modelData = UserDefaults.standard.data(forKey: kLocationModelCache)
-        var locationModel = LocationModel()
-        if modelData != nil {
-            locationModel = NSKeyedUnarchiver.unarchiveObject(with: modelData!) as! LocationModel
-        }
-        _ = toString()
-        return locationModel
+    func saveObject(locationModel: LocationModel) {
+        var model = CacheModel()
+        model.data = jsonToData(jsonDic: locationModel.toJSON())
+        CacheManager.default.setObjectSync(model, forKey: "LocationModel")
     }
     
-    
+    func object() -> LocationModel? {
+        let model = CacheManager.default.objectSync(forKey: "LocationModel")
+        let json = try? JSON(data: model?.data ?? Data())
+        return LocationModel(JSONString: json?.description ?? "")
+    }
 
     func toString() -> String {
         let str = self.country +

+ 24 - 0
RainbowPlanet/RainbowPlanet/Manager/MessageModuleManager/MessageModuleManager.swift

@@ -0,0 +1,24 @@
+//
+//  MessageModuleManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/7/19.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class MessageModuleManager: NSObject {
+    static let shared : MessageModuleManager = MessageModuleManager()
+    
+    /// 获取message信息
+    func userMemberMessageIndexApi() {
+        SwiftMoyaNetWorkServiceUser.shared().userMemberMessageIndexApi(completion: {
+            (messageIndexModel) -> (Void) in
+            let messageIndexModel = messageIndexModel as? MessageIndexModel
+            if messageIndexModel?.activity?.isYes == 1 || messageIndexModel?.follow?.isYes == 1 || messageIndexModel?.notification?.isYes == 1 || messageIndexModel?.praise?.isYes == 1 || messageIndexModel?.comment?.isYes == 1 {
+                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "MessageMainViewController"), object: messageIndexModel)
+            }
+        }) { _ in}
+    }
+}

+ 105 - 0
RainbowPlanet/RainbowPlanet/Manager/MusicPlayManager/MusicPlayManager.swift

@@ -0,0 +1,105 @@
+//
+//  MusicPlayManager.swift
+//  RainbowPlanet
+//
+//  Created by Christopher on 2019/7/18.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class MusicPlayManager: NSObject {
+    
+    private static let _sharedInstance = MusicPlayManager()
+    
+    private override init() {} // 私有化init方法
+    
+    class func shared() -> MusicPlayManager {
+        return _sharedInstance
+    }
+    
+    // 记录当前正在播放的音乐Id
+    var curPlayingId: Int = -1
+    
+    //播放器相关
+    var playerItem: AVPlayerItem!
+    var musicPlayer: AVPlayer!
+    
+    // 音频url
+    var audioUrl: String = "" {
+        didSet{
+            self.setupPlayerItem()
+        }
+    }
+    
+    func initPlay() {
+        //初始化播放器
+        musicPlayer = AVPlayer()
+        //监听音频播放结束
+        NotificationCenter.default.addObserver(self, selector: #selector(playItemDidReachEnd), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: MusicPlayManager.shared().playerItem)
+    }
+    
+    //设置资源
+    private func setupPlayerItem() {
+        guard let url = URL(string: audioUrl) else {
+            return
+        }
+        self.playerItem = AVPlayerItem(url: url)
+        self.musicPlayer.replaceCurrentItem(with: playerItem)
+    }
+    
+    //获取音频时长
+    func getDuration() -> Float64 {
+        if MusicPlayManager.shared().playerItem == nil {
+            return 0.0
+        }
+        let duration : CMTime = playerItem!.asset.duration
+        let seconds : Float64 = CMTimeGetSeconds(duration)
+        return seconds
+    }
+    func getCurrentTime() -> Float64 {
+        if MusicPlayManager.shared().playerItem == nil {
+            return 0.0
+        }
+        let duration : CMTime = playerItem!.currentTime()
+        let seconds : Float64 = CMTimeGetSeconds(duration)
+        return seconds
+    }
+    
+    //播放结束
+    var audioPlayEndBlock:(()->())?
+    @objc func playItemDidReachEnd(notifacation:NSNotification) {
+        musicPlayer?.seek(to: CMTime.zero)
+        if let block = audioPlayEndBlock {
+            block()
+        }
+    }
+    
+    //播放
+    func playAudio() {
+        if musicPlayer != nil {
+            musicPlayer?.play()
+        }
+    }
+    
+    //暂停
+    var audioStopBlock:(()->())?
+    func stopAudio() {
+        if musicPlayer != nil {
+            musicPlayer?.pause()
+            if let block = audioStopBlock {
+                block()
+            }
+        }
+    }
+    
+    //销毁
+    func destroyPlayer() {
+        if MusicPlayManager.shared().playerItem != nil {
+            MusicPlayManager.shared().musicPlayer?.pause()
+            MusicPlayManager.shared().playerItem?.cancelPendingSeeks()
+            MusicPlayManager.shared().playerItem?.asset.cancelLoading()
+        }
+    }
+    
+}

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

@@ -0,0 +1,190 @@
+//
+//  PathManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/8/10.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class PathManager: NSObject {
+    
+    /// 获取程序的Home目录 ./
+    ///
+    /// - Returns: 获取程序的Home目录
+    private class func homePath() -> String? {
+        return NSHomeDirectory()
+    }
+    
+    /// 获取Documnets目录  ./Documents
+    ///
+    /// - Returns: 获取Documnets目录
+    private class func documentPath() -> String? {
+        return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
+    }
+    
+    /// 获取Library目录 ./Library
+    ///
+    /// - Returns: 获取Library目录
+    private class func libraryPath() -> String? {
+        return NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first
+    }
+    
+    /// 获取Caches目录  ./Library/Caches
+    ///
+    /// - Returns: 获取Caches目录
+    private class func cachesPath() -> String? {
+        return NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first
+    }
+    
+    /// 获取tmp目录  ./tmp
+    ///
+    /// - Returns: 获取tmp目录
+    class func tmpPath() -> String? {
+        return NSTemporaryDirectory()
+    }
+}
+
+extension PathManager {
+    
+    /// 获取caches文件夹大小
+    ///
+    /// - Returns: 获取cache文件夹大小
+    class func cachesPathSize() -> Double {
+        // 取出cache文件夹目录
+        let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first
+        
+        // 取出文件夹下所有文件数组
+        let fileArr = FileManager.default.subpaths(atPath: cachePath!)
+        
+        //快速枚举出所有文件名 计算文件大小
+        var size = 0
+        for file in fileArr! {
+            
+            // 把文件名拼接到路径中
+            let path = cachePath! + ("/\(file)")
+            // 取出文件属性
+            let floder = try! FileManager.default.attributesOfItem(atPath: path)
+            // 用元组取出文件大小属性
+            for (key, fileSize) in floder {
+                // 累加文件大小
+                if key == FileAttributeKey.size {
+                    size += (fileSize as AnyObject).integerValue
+                }
+            }
+        }
+        
+        let totalCache = Double(size) / 1024.00 / 1024.00
+        return totalCache
+    }
+    
+    /// 获取caches文件夹大小Str
+    ///
+    /// - Returns: 获取cache文件夹大小Str
+    class func cachesPathSizeString() -> String {
+        return String(format: "%.2f", cachesPathSize())
+    }
+    
+    
+}
+
+extension PathManager {
+    
+    /// 清除指定路径的文件
+    ///
+    /// - Parameter pathString: 清除指定路径的文件
+    class func clearPath(pathString:String) {
+        do {
+            try FileManager.default.removeItem(atPath: pathString)
+            try FileManager.default.createDirectory(atPath: pathString, withIntermediateDirectories: true, attributes: nil)
+        } catch {
+            NXLLog("清理\(pathString)失败")
+        }
+        
+    }
+    
+    /// 清理Caches目录
+    class func clearCachesPath() {
+        //取出cache文件夹目录
+        let fileArr = FileManager.default.subpaths(atPath: cachesPath()!)
+        // 遍历删除
+        for file in fileArr! {
+            let path = cachesPath()! + "/\(file)"
+            if FileManager.default.fileExists(atPath: path) {
+                do {
+                    try FileManager.default.removeItem(atPath: path)
+                } catch {
+                    NXLLog("清理\(file)失败")
+                }
+            }
+        }
+    }
+    
+}
+
+extension PathManager {
+    
+    /// 获取Documnets目录
+    ///
+    /// - Returns: 获取Documnets目录
+    class func projectDocumentPath() -> String? {
+        return "/" + (documentPath() ?? "") + Bundle.main.bundleIdentifier! + ".project"
+    }
+    
+    /// 获取Caches目录
+    ///
+    /// - Returns: 获取Caches目录
+    class func projectCachesPath() -> String? {
+        return "/" + (cachesPath() ?? "") + Bundle.main.bundleIdentifier! + ".project"
+    }
+    
+    /// 获取相对Documnets目录
+    ///
+    /// - Returns: 获取相对Documnets目录
+    class func projectRelativeDocumentPath() -> String? {
+        return "Documents/" + Bundle.main.bundleIdentifier! + "/.project"
+    }
+}
+
+extension PathManager {
+    /// 阿里云短视频合成文件目录
+    ///
+    /// - Returns: 阿里云短视频合成文件目录
+    class func aliyunVodCompositionPath() -> String? {
+        return (projectDocumentPath() ?? "") + "/composition/"
+    }
+    
+    /// 阿里云短视频记录目录
+    ///
+    /// - Returns: 阿里云短视频记录目录
+    class func aliyunVodCreateRecrodPath() -> String? {
+        return (projectDocumentPath() ?? "") + "/record/"
+    }
+    
+    /// 阿里云短视频资源目录
+    ///
+    /// - Returns: 阿里云短视频资源目录
+    class func aliyunVodCreateResourcePath() -> String? {
+        return (projectDocumentPath() ?? "") + "/resource/"
+    }
+    
+    /// 阿里云短视频资源目录
+    ///
+    /// - Returns: 阿里云短视频资源目录
+    class func aliyunVodRelativeResourcePath() -> String? {
+        return (projectRelativeDocumentPath() ?? "") + "/resource/"
+    }
+}
+
+extension PathManager {
+    /// 生成随机字符串
+    ///
+    /// - Returns: 随机字符串
+    class func randomString() -> String? {
+        let puuid = CFUUIDCreate(nil)
+        let uuidString = CFUUIDCreateString(nil, puuid)
+        let result = CFStringCreateCopy(nil, uuidString)
+        return result as String?
+    }
+}

+ 0 - 3
RainbowPlanet/RainbowPlanet/Manager/PayManager/PayManagerView/CommonPayView.swift

@@ -60,9 +60,6 @@ class CommonPayView: FWPopupView {
         tableView.backgroundColor = kf7f8faColor
         tableView.dataSource = self
         tableView.delegate = self
-        tableView.estimatedRowHeight = 0.000001
-        tableView.estimatedSectionFooterHeight = 0.000001
-        tableView.estimatedSectionHeaderHeight = 0.000001
         tableView.isScrollEnabled = false
         return tableView
     }()

+ 0 - 3
RainbowPlanet/RainbowPlanet/Manager/PayManager/WeChatpayManager/WeChatpayManager.swift

@@ -8,9 +8,6 @@
 
 import UIKit
 
-//MARK: - 微博
-let kWeiboAppKey  = "4123861024"
-let kWeiboAppSecret  = "79d36bfe6b75638ece14d5d852e785c4"
 
 class WeChatpayManager: NSObject {
     private static let _sharedInstance = WeChatpayManager()

+ 24 - 0
RainbowPlanet/RainbowPlanet/Manager/RegisterLoginManager/RegisterLoginManager.swift

@@ -0,0 +1,24 @@
+//
+//  RegisterLoginManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/8/1.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+class RegisterLoginManager: NSObject {
+
+    class func registerLoginSuccessApi(vc:UIViewController?) {
+        // 设置友盟别名
+        UMManager.shared.addAlias()
+        weak var vc = vc
+        if UserModel.shared().getModel()?.isFollowSuggestTopic == 0 || UserModel.shared().getModel()?.isFollowSuggestTopic == nil  { //设置性别
+            vc?.navigationController?.pushViewController(GenderSelectionViewController(), animated: true)
+        }else {// 设置首页
+            vc?.navigationController?.dismiss(animated: false, completion: {})
+            kAppDelegate.setTabbarController()
+        }
+    }
+}

+ 107 - 0
RainbowPlanet/RainbowPlanet/Manager/ThumbnailsManager/ThumbnailsManager.swift

@@ -0,0 +1,107 @@
+//
+//  File.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/8/15.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+let kSize18x18Image = CGSize(width: 18, height: 18)
+
+let kSize20x20Image = CGSize(width: 20, height: 20)
+
+let kSize24x24Image = CGSize(width: 24, height: 24)
+
+let kSize28x28Image = CGSize(width: 28, height: 28)
+
+let kSize30x30Image = CGSize(width: 30, height: 30)
+
+let kSize40x40Image = CGSize(width: 40, height: 40)
+
+let kSize44x44Image = CGSize(width: 44, height: 44)
+
+let kSize54x54Image = CGSize(width: 54, height: 54)
+
+let kSize60x60Image = CGSize(width: 60, height: 60)
+
+let kSize70x70Image = CGSize(width: 70, height: 70)
+
+let kSize80x80Image = CGSize(width: 80, height: 80)
+
+let kSize92x92Image = CGSize(width: 92, height: 92)
+
+let kSize120x120Image = CGSize(width: 120, height: 120)
+
+/// 返回缩略图url图片
+///
+/// - Parameters:
+///   - name: 图片Str
+///   - size: 图片尺寸
+/// - Returns: 图片url
+func kURLThumbnailsImage(name:String,size: CGSize) -> URL? {
+    return URL(string: ThumbnailsManager.thumbnailsFill(imgStr: name, size: size))
+}
+
+/// 返回缩略图url图片
+///
+/// - Parameters:
+///   - name: 图片Str
+///   - size: 图片尺寸
+/// - Returns: 图片url
+func kURLThumbnailsPadImage(name:String,size: CGSize) -> URL? {
+    return URL(string: ThumbnailsManager.thumbnailsPad(imgStr: name, size: size))
+}
+
+
+class ThumbnailsManager: NSObject {
+    
+    /// 获取缩略图
+    ///
+    /// - Parameters:
+    ///   - imgStr: 图片地址
+    ///   - size: 图片大小
+    /// - Returns: 返回图片地址
+    class func thumbnailsFill(imgStr:String,size:CGSize) -> String {
+        if imgStr.contains("*") {
+            let imgStr1 = imgStr + "?x-oss-process=image/resize,m_fill,w_\(Int(size.width*1.5)),h_\(Int(size.height*1.5))"
+            return String(imgStr1)
+        }else {
+            if imgStr.contains("?") {
+                var imgStr1 = imgStr.prefix(upTo:(imgStr.lastIndex(of: "?"))!)
+                imgStr1 = imgStr1 + "?x-oss-process=image/resize,m_fill,w_\(Int(size.width*1.5)),h_\(Int(size.height*1.5))"
+                return String(imgStr1)
+            }else {
+                let imgStr1 = imgStr + "?x-oss-process=image/resize,m_fill,w_\(Int(280 * 1.5 * kScaleWidth)),h_\(Int(280 * 1.5 * kScaleWidth))"
+                return String(imgStr1)
+            }
+        }
+    }
+    
+    /// 获取缩略图
+    ///
+    /// - Parameters:
+    ///   - imgStr: 图片地址
+    ///   - size: 图片大小
+    /// - Returns: 返回图片地址
+    class func thumbnailsPad(imgStr:String,size:CGSize) -> String {
+        if imgStr.contains("*") {
+            let imgStr1 = imgStr + "?x-oss-process=image/resize,m_pad,w_\(Int(size.width*1.5)),h_\(Int(size.height*1.5)),color_000000"
+            return String(imgStr1)
+        }else {
+            if imgStr.contains("?") {
+                var imgStr1 = imgStr.prefix(upTo:(imgStr.lastIndex(of: "?"))!)
+                imgStr1 = imgStr1 + "?x-oss-process=image/resize,m_pad,w_\(Int(size.width*1.5)),h_\(Int(size.height*1.5)),color_000000"
+                return String(imgStr1)
+            }else {
+                let imgStr1 = imgStr + "?x-oss-process=image/resize,m_pad,w_\(Int(280 * 1.5 * kScaleWidth)),h_\(Int(280 * 1.5 * kScaleWidth)),color_000000"
+                return String(imgStr1)
+            }
+        }
+    }
+    
+    
+    
+}
+

+ 206 - 160
RainbowPlanet/RainbowPlanet/Manager/UMManager/UMManager.swift

@@ -7,18 +7,37 @@
 //
 
 import UIKit
+import SwiftyJSON
 
 //MARK: - UMeng
-let kUMengAppKey  = "5c984a7f0cafb2332300000f"
-let kUMengAppSecret  = "lpx7kstlnlrxmimo5gfyzvtscrtguhw8"
+
+let kUMengAppKey  = "5d4d38ce0cafb2131c00041c"
+let kUMengAppSecret  = "mllaspth0pdgnhdm02uvkppby3isxxex"
+//彩虹星球
+//let kUMengAppKey  = "5c984a7f0cafb2332300000f"
+//let kUMengAppSecret  = "lpx7kstlnlrxmimo5gfyzvtscrtguhw8"
 
 //MARK: - QQ跟安卓用同一个
-let kQQAppKey =  "101565722"
-let kQQAppSecret = "dfe6f96762ed0dbc3ad52dc06d0eda9b"
+
+let kQQAppKey =  "101742987"
+let kQQAppSecret = "664edcf45543f1958b46f914c03b3ed0"
+//彩虹星球
+//let kQQAppKey =  "101565722"
+//let kQQAppSecret = "dfe6f96762ed0dbc3ad52dc06d0eda9b"
 
 //MARK: - 微信
-let kWeiXinAppKey  = "wx163e76382d53654b"
-let kWeiXinAppSecret = "1a915228304ea2e45eda9d2af5a64b84"
+let kWeiXinAppKey  = "wx0aed0c936870ad29"
+let kWeiXinAppSecret = "6be875a7f04d19bdaeec4c0858886ac6"
+//彩虹星球
+//let kWeiXinAppKey  = "wx163e76382d53654b"
+//let kWeiXinAppSecret = "1a915228304ea2e45eda9d2af5a64b84"
+
+//MARK: - 微博
+let kWeiboAppKey  = "1960193914"
+let kWeiboAppSecret  = "ad525c2e9eb07bb0bc43f998295cfe51"
+//彩虹星球
+//let kWeiboAppKey  = "4123861024"
+//let kWeiboAppSecret  = "79d36bfe6b75638ece14d5d852e785c4"
 
 
 public enum ShareType {
@@ -30,15 +49,8 @@ public enum ShareType {
 public var _entity : UMessageRegisterEntity?
 
 public class UMManager: NSObject {
-    private static let sharedInstance = UMManager()
-    private override init() {} // 私有化init方法
-
-    /// 单例
-    ///
-    /// - Returns: UMShareManager对象
-    public class func shared() -> UMManager {
-        return sharedInstance
-    }
+    
+    static let shared : UMManager = UMManager()
 
     /// 友盟初始化
     public func initUM(launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Void {
@@ -57,16 +69,16 @@ public extension UMManager {
     func common() -> Void {
 
         //将自动采集页面信息
-        //        MobClick.setAutoPageEnabled(true)
+        MobClick.setAutoPageEnabled(true)
         //开发者需要显式的调用此函数,日志系统才能工作
         UMCommonLogManager.setUp()
         //打开加密传输
         UMConfigure.setEncryptEnabled(true)
         //设置打开日志
-        UMConfigure.setLogEnabled(false)
+        UMConfigure.setLogEnabled(true)
         //设置Key
         UMConfigure.initWithAppkey(kUMengAppKey, channel: "App Store")
-
+        
         //开启Crash收集
         MobClick.setCrashReportEnabled(true)
         //默认为普通应用场景,目前还支持游戏统计场景
@@ -87,46 +99,49 @@ public extension UMManager {
     ///推送
     func push(launchOptions:[UIApplication.LaunchOptionsKey: Any]?) -> Void {
 
+        UMessage.openDebugMode(true)
+        UMessage.setBadgeClear(true)//设置是否允许SDK自动清空角标
+        UMessage.setWebViewClassString("UMWebViewController")
+//        UMessage.addLaunch() //开屏图
         _entity = UMessageRegisterEntity.init()
         //type是对推送的几个参数的选择,可以选择一个或者多个。默认是三个全部打开,即:声音,弹窗,角标
         _entity?.types = Int(UInt8(UMessageAuthorizationOptions.badge.rawValue)|UInt8(UMessageAuthorizationOptions.alert.rawValue)|UInt8(UMessageAuthorizationOptions.sound.rawValue))
 
-        if #available(iOS 8.0, *) {
-            if #available(iOS 10.0, *) {
-
-                let action1_ios10 = UNNotificationAction(identifier: "action1_identifier", title: "打开应用", options: UNNotificationActionOptions.foreground)
-                let action2_ios10 = UNNotificationAction(identifier: "action2_identifier", title: "忽略", options: UNNotificationActionOptions.foreground)
-
-                let category1_ios10 = UNNotificationCategory(identifier: "category1", actions: [action1_ios10,action2_ios10], intentIdentifiers: [], options: UNNotificationCategoryOptions.customDismissAction)
-                //UNNotificationCategoryOptionNone
-                //UNNotificationCategoryOptionCustomDismissAction  清除通知被触发会走通知的代理方法
-                //UNNotificationCategoryOptionAllowInCarPlay       适用于行车模式
-                let categories = NSSet(objects: category1_ios10)
-                _entity?.categories = (categories as! Set<AnyHashable>)
-                UNUserNotificationCenter.current().delegate = self
-
-            } else {
-                let action1 = UIMutableUserNotificationAction.init()
-                action1.identifier = "action1_identifier"
-                action1.title = "打开应用"
-                action1.activationMode = UIUserNotificationActivationMode.foreground;//当点击的时候启动程序
-
-                let action2 = UIMutableUserNotificationAction.init()
-                action2.identifier = "action2_identifier"
-                action2.title = "忽略"
-                action2.activationMode = UIUserNotificationActivationMode.background;//当点击的时候不启动程序,在后台处理
-                action2.isAuthenticationRequired = true;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
-                action2.isDestructive = true;
-
-                let actionCategory1 = UIMutableUserNotificationCategory.init()
-                actionCategory1.identifier = "category1"//这组动作的唯一标示
-                actionCategory1.setActions([action1,action2], for: UIUserNotificationActionContext.default)
-                let categories = NSSet(objects: actionCategory1)
-                _entity?.categories = (categories as! Set<AnyHashable>)
+        if #available(iOS 10.0, *) {
+
+            let action1_ios10 = UNNotificationAction(identifier: "action1_identifier", title: "打开应用", options: UNNotificationActionOptions.foreground)
+            let action2_ios10 = UNNotificationAction(identifier: "action2_identifier", title: "忽略", options: UNNotificationActionOptions.foreground)
+
+            let category1_ios10 = UNNotificationCategory(identifier: "category1", actions: [action1_ios10,action2_ios10], intentIdentifiers: [], options: UNNotificationCategoryOptions.customDismissAction)
+            //UNNotificationCategoryOptionNone
+            //UNNotificationCategoryOptionCustomDismissAction  清除通知被触发会走通知的代理方法
+            //UNNotificationCategoryOptionAllowInCarPlay       适用于行车模式
+            let categories = NSSet(objects: category1_ios10)
+            _entity?.categories = (categories as! Set<AnyHashable>)
+            UNUserNotificationCenter.current().delegate = self
+
+        } else {
+            let action1 = UIMutableUserNotificationAction.init()
+            action1.identifier = "action1_identifier"
+            action1.title = "打开应用"
+            action1.activationMode = UIUserNotificationActivationMode.foreground;//当点击的时候启动程序
+
+            let action2 = UIMutableUserNotificationAction.init()
+            action2.identifier = "action2_identifier"
+            action2.title = "忽略"
+            action2.activationMode = UIUserNotificationActivationMode.background;//当点击的时候不启动程序,在后台处理
+            action2.isAuthenticationRequired = true;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
+            action2.isDestructive = true;
+
+            let actionCategory1 = UIMutableUserNotificationCategory.init()
+            actionCategory1.identifier = "category1"//这组动作的唯一标示
+            actionCategory1.setActions([action1,action2], for: UIUserNotificationActionContext.default)
+            let categories = NSSet(objects: actionCategory1)
+            _entity?.categories = (categories as! Set<AnyHashable>)
 
-            }
         }
 
+        //注册通知
         UMessage.registerForRemoteNotifications(launchOptions: launchOptions, entity: _entity) { (granted, error) in
 
             if granted {
@@ -135,13 +150,63 @@ public extension UMManager {
 
             }
         }
-        UMessage.setBadgeClear(true)//设置是否允许SDK自动清空角标
-        UMessage.openDebugMode(true)
-        UMessage.setWebViewClassString("UMWebViewController")
-        UMessage.addLaunch()
+    }
+    
+    /// 添加别名
+    func addAlias() {
+        UMessage.addAlias(UserModel.shared().getModel()?.mobile ?? "", type: "CHXQ_MOBILE", response: { (data, error) in })
+    }
+    
+    /// 重置别名
+    func setAlias() {
+        UMessage.setAlias(UserModel.shared().getModel()?.mobile ?? "", type: "CHXQ_MOBILE", response: { (data, error) in })
+    }
+    
+    /// 移除别名
+    func removeAlias() {
+        UMessage.removeAlias(UserModel.shared().getModel()?.mobile ?? "", type: "CHXQ_MOBILE", response: { (data, error) in })
+    }
+    
+}
+
+@available(iOS 10.0, *)
+// MARK: - UNUserNotificationCenterDelegate
+extension UMManager:UNUserNotificationCenterDelegate {
+    public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
+        let userInfo = notification.request.content.userInfo
+        
+        if (notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self))! {
+            UMessage.setAutoAlert(false)
+            //应用处于前台时的远程推送接受
+//            let json = JSON(userInfo)
+//            RouterManager.shared.UMPush(pushModel: PushModel(JSONString: json.description) ?? PushModel())
+            //必须加这句代码
+            UMessage.didReceiveRemoteNotification(userInfo)
+            
+        }else {
+            //应用处于前台时的本地推送接受
+        }
+        completionHandler(UNNotificationPresentationOptions(rawValue: UNNotificationPresentationOptions.sound.rawValue|UNNotificationPresentationOptions.alert.rawValue|UNNotificationPresentationOptions.badge.rawValue))
+    }
+    
+    public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
+        let userInfo = response.notification.request.content.userInfo
+        if (response.notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self))! {
+            UMessage.setAutoAlert(false)
+            //应用处于后台时的远程推送接受
+            let json = JSON(userInfo)
+            RouterManager.shared.UMPush(pushModel: PushModel(JSONString: json.description) ?? PushModel())
+
+            //必须加这句代码
+            UMessage.didReceiveRemoteNotification(userInfo)
+            
+        }else {
+            //应用处于前台时的本地推送接受
+        }
     }
 }
 
+
 // MARK: 分享
 public extension UMManager {
     /// 分享设置
@@ -212,13 +277,13 @@ public extension UMManager {
         UMSocialUIManager.showShareMenuViewInWindow(platformSelectionBlock: {[weak self] platformType, userInfo in
             switch shareType {
             case .text:
-                self?.shareText(to: platformType, viewController: viewController,text: text)
+                self?.shareText(to: platformType, viewController: viewController,text: text,completion: nil)
                 break
             case .image:
-                self?.shareImage(to: platformType, viewController: viewController,thumbImage: thumbImage,shareImage: shareImage)
+                self?.shareImage(to: platformType, viewController: viewController,thumbImage: thumbImage,shareImage: shareImage,completion: nil)
                 break
             case .webPage:
-                self?.shareWebPage(to: platformType, viewController: viewController,title: title,descr: descr, thumbImage: thumbImage,webpageUrl: webpageUrl)
+                self?.shareWebPage(to: platformType, viewController: viewController,title: title,descr: descr, thumbImage: thumbImage,webpageUrl: webpageUrl, completion: nil)
                 break
             }
         })
@@ -230,24 +295,15 @@ public extension UMManager {
     ///   - platformType: 平台
     ///   - viewController: 控制器
     ///   - text: 分享文本
-    func shareText(to platformType: UMSocialPlatformType,viewController:UIViewController,text:String) {
+    func shareText(to platformType: UMSocialPlatformType,viewController:UIViewController,text:String,completion: (() -> Void)?) {
         //创建分享消息对象
         let messageObject = UMSocialMessageObject()
         //设置文本
         messageObject.text = text
 
         //调用分享接口
-        UMSocialManager.default().share(to: platformType, messageObject: messageObject, currentViewController: viewController) { data, error in
-            if error != nil {
-                if let anError = error {
-                    NXLLog("************Share fail with error \(anError)*********")
-                }
-            } else {
-                if let aData = data {
-                    NXLLog("response data is \(aData)")
-                }
-            }
-        }
+        isPlatformInstall(platformType: platformType, messageObject: messageObject, viewController: viewController, completion: completion)
+
     }
 
     /// 分享图片
@@ -257,7 +313,7 @@ public extension UMManager {
     ///   - viewController: 控制器
     ///   - thumbImage: 缩略图
     ///   - shareImage: 分享图
-    func shareImage(to platformType: UMSocialPlatformType,viewController:UIViewController,thumbImage:Any,shareImage:Any) {
+    func shareImage(to platformType: UMSocialPlatformType,viewController:UIViewController,thumbImage:Any,shareImage:Any,completion: (() -> Void)?) {
         //创建分享消息对象
         let messageObject = UMSocialMessageObject()
 
@@ -271,17 +327,9 @@ public extension UMManager {
         messageObject.shareObject = shareObject
 
         //调用分享接口
-        UMSocialManager.default().share(to: platformType, messageObject: messageObject, currentViewController: viewController) { data, error in
-            if error != nil {
-                if let anError = error {
-                    NXLLog("************Share fail with error \(anError)*********")
-                }
-            } else {
-                if let aData = data {
-                    NXLLog("response data is \(aData)")
-                }
-            }
-        }
+        
+        isPlatformInstall(platformType: platformType, messageObject: messageObject, viewController: viewController, completion: completion)
+
     }
 
     /// 分享网页
@@ -293,7 +341,7 @@ public extension UMManager {
     ///   - descr: 内容描述
     ///   - thumbImage: 缩略图
     ///   - webpageUrl: 链接地址
-    func shareWebPage(to platformType: UMSocialPlatformType,viewController:UIViewController,title:String,descr:String,thumbImage:Any,webpageUrl:String) {
+    func shareWebPage(to platformType: UMSocialPlatformType,viewController:UIViewController,title:String,descr:String,thumbImage:Any,webpageUrl:String,completion: (() -> Void)?) {
         //创建分享消息对象
         let messageObject = UMSocialMessageObject()
 
@@ -304,17 +352,40 @@ public extension UMManager {
 
         //分享消息对象设置分享内容对象
         messageObject.shareObject = shareObject
-
+        
+        isPlatformInstall(platformType: platformType, messageObject: messageObject, viewController: viewController, completion: completion)
+    }
+    
+   private func isPlatformInstall(platformType:UMSocialPlatformType,messageObject:UMSocialMessageObject,viewController:Any,completion: (() -> Void)?) {
+        
+        if platformType == .sina {
+            //调用分享接口
+            share(platformType: platformType, messageObject: messageObject, viewController: viewController, completion: completion)
+        } else if platformType == .wechatSession || platformType == .wechatTimeLine {
+            if (UMSocialManager.default()?.isInstall(platformType))! {
+                //调用分享接口
+                share(platformType: platformType, messageObject: messageObject, viewController: viewController, completion: completion)
+            }else {
+                SwiftProgressHUD.shared().showText("微信未安装,请您先安装")
+            }
+        } else if platformType == .QQ  {
+            if (UMSocialManager.default()?.isInstall(platformType))! {
+                share(platformType: platformType, messageObject: messageObject, viewController: viewController, completion: completion)
+            }else {
+                SwiftProgressHUD.shared().showText("QQ未安装,请您先安装")
+            }
+        }
+        
+    }
+    
+    private func share(platformType:UMSocialPlatformType,messageObject:UMSocialMessageObject,viewController:Any,completion: (() -> Void)?) {
         //调用分享接口
         UMSocialManager.default().share(to: platformType, messageObject: messageObject, currentViewController: viewController) { data, error in
             if error != nil {
-                if let anError = error {
-                    NXLLog("************Share fail with error \(anError)*********")
-                }
+                SwiftProgressHUD.shared().showText("分享失败")
             } else {
-                if let aData = data {
-                    NXLLog("response data is \(aData)")
-                }
+                SwiftProgressHUD.shared().showText("分享成功")
+                completion?()
             }
         }
     }
@@ -332,83 +403,58 @@ extension UMManager {
         }
         let isInstall = UMSocialManager.default()?.isInstall(platformType)
         if isInstall!  { //验证
-            UMSocialManager.default().getUserInfo(with: platformType, currentViewController: nil) { result, error in
-
-                if error != nil {
-                    SwiftProgressHUD.shared().showText("授权失败,请重新登录")
-                } else {
-
-                    let resp = result as? UMSocialUserInfoResponse
-
-                    let UserModel = UMLoginModel()
-                    // 第三方登录数据(为空表示平台未提供)
-                    // 授权数据
-                    if let anUid = resp?.uid {
-                        NXLLog(" uid: \(anUid)")
-                        UserModel.union_id = anUid
-                    }
-                    if let anOpenid = resp?.openid {
-                        NXLLog(" openid: \(anOpenid)")
-                        UserModel.open_id = anOpenid
-                    }
-
-                    // 用户数据
-                    if let aName = resp?.name {
-                        NXLLog(" name: \(aName)")
-                        UserModel.username = aName
-                    }
-                    if let anIconurl = resp?.iconurl {
-                        NXLLog(" iconurl: \(anIconurl)")
-                        UserModel.avatar = anIconurl
-                    }
-                    if let aGender = resp?.unionGender {
-                        NXLLog(" gender: \(aGender)")
-                        if aGender == "男" {
-                            UserModel.gender = 1
-                        }else if aGender == "女" {
-                            UserModel.gender = 2
-                        }
-                    }
-                    callBack(UserModel)
-                }
-            }
-        }
-    else {
+            getUserInfo(platformType: platformType, callBack: callBack)
+        }else {
             if platformType == .wechatSession {
                 SwiftProgressHUD.shared().showText("微信未安装\n请您安装微信程序")
+            }else{
+                getUserInfo(platformType: platformType, callBack: callBack)
             }
         }
     }
 }
 
-
-@available(iOS 10.0, *)
-// MARK: - UNUserNotificationCenterDelegate
-extension UMManager:UNUserNotificationCenterDelegate {
-    public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
-        let userInfo = notification.request.content.userInfo
-
-        if (notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self))! {
-            UMessage.setAutoAlert(true)
-            //应用处于前台时的远程推送接受
-            //必须加这句代码
-            UMessage.didReceiveRemoteNotification(userInfo)
-
-        }else {
-            //应用处于前台时的本地推送接受
-        }
-        completionHandler(UNNotificationPresentationOptions(rawValue: UNNotificationPresentationOptions.sound.rawValue|UNNotificationPresentationOptions.alert.rawValue|UNNotificationPresentationOptions.badge.rawValue))
-    }
-
-    public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
-        let userInfo = response.notification.request.content.userInfo
-        if (response.notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self))! {
-            UMessage.setAutoAlert(true)
-            //应用处于前台时的远程推送接受
-            //必须加这句代码
-            UMessage.didReceiveRemoteNotification(userInfo)
-        }else {
-            //应用处于前台时的本地推送接受
+func getUserInfo(platformType: UMSocialPlatformType,callBack: @escaping (UMLoginModel) -> (Void)) {
+    UMSocialManager.default().getUserInfo(with: platformType, currentViewController: nil) { result, error in
+        
+        if error != nil {
+            SwiftProgressHUD.shared().showText("授权失败,请重新登录")
+        } else {
+            
+            let resp = result as? UMSocialUserInfoResponse
+            
+            let UserModel = UMLoginModel()
+            // 第三方登录数据(为空表示平台未提供)
+            // 授权数据
+            if let anUid = resp?.uid {
+                NXLLog(" uid: \(anUid)")
+                UserModel.union_id = anUid
+            }
+            if let anOpenid = resp?.openid {
+                NXLLog(" openid: \(anOpenid)")
+                UserModel.open_id = anOpenid
+            }
+            
+            // 用户数据
+            if let aName = resp?.name {
+                NXLLog(" name: \(aName)")
+                UserModel.username = aName
+            }
+            if let anIconurl = resp?.iconurl {
+                NXLLog(" iconurl: \(anIconurl)")
+                UserModel.avatar = anIconurl
+            }
+            if let aGender = resp?.unionGender {
+                NXLLog(" gender: \(aGender)")
+                if aGender == "男" {
+                    UserModel.gender = 1
+                }else if aGender == "女" {
+                    UserModel.gender = 2
+                }
+            }
+            callBack(UserModel)
         }
     }
 }
+
+

+ 60 - 0
RainbowPlanet/RainbowPlanet/Manager/UpdateVersionManager/Model/UpdateVersionModel.swift

@@ -0,0 +1,60 @@
+//
+//	UpGradeModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+import SwiftyJSON
+
+
+enum UpGradeModelType : Int {
+    case ignore = 0
+    case update = 1
+    case strongUpdate = 2
+}
+
+class UpdateVersionModel : NSObject, Mappable{
+    
+    static let shared : UpdateVersionModel = UpdateVersionModel()
+
+	var content : String = ""
+	var title : String = ""
+    var upgrade : Int = 0 {
+        didSet {
+            upGradeModelType = UpGradeModelType(rawValue: upgrade) ?? .ignore
+        }
+    }
+    var upGradeModelType : UpGradeModelType = .ignore
+	var url : String = ""
+    var version : String = AppInfo.clientVersion
+
+	class func newInstance(map: Map) -> Mappable?{
+		return UpdateVersionModel()
+	}
+	required init?(map: Map){}
+    override init(){}
+
+	func mapping(map: Map)
+	{
+		content <- map["content"]
+		title <- map["title"]
+		upgrade <- map["upgrade"]
+		url <- map["url"]
+		version <- map["version"]
+        upGradeModelType <- map["upGradeModelType"]
+		
+	}
+    
+    func saveObject(model: UpdateVersionModel) {
+        var cacheModel = CacheModel()
+        cacheModel.data = jsonToData(jsonDic: model.toJSON())
+        CacheManager.default.setObjectSync(cacheModel, forKey: "UpGradeModel")
+    }
+    
+    func object() -> UpdateVersionModel? {
+        let  cacheModel = CacheManager.default.objectSync(forKey: "UpGradeModel")
+        let json = try? JSON(data: cacheModel?.data ?? Data())
+        return UpdateVersionModel(JSONString: json?.description ?? "")
+    }
+
+}

+ 208 - 0
RainbowPlanet/RainbowPlanet/Manager/UpdateVersionManager/View/UpdateVersionView.swift

@@ -0,0 +1,208 @@
+//
+//  UpdatedVersionView.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/7/15.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import FWPopupView
+import RxSwift
+
+class UpdateVersionView: FWPopupView {
+    
+    let disposeBag = DisposeBag()
+    let titleStr = UpdateVersionModel.shared.object()?.title
+    let contentStr = UpdateVersionModel.shared.object()?.content
+
+    
+    override init(frame: CGRect) {
+        super.init(frame: frame)
+        setupViews()
+        setupLayouts()
+    }
+    
+    required init?(coder aDecoder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    func setupViews() {
+        frame = CGRect(x: 0, y: 0, width: 302, height: 405)
+        cornerRadius = 8
+        backgroundColor = UIColor.white
+        addSubview(topImageView)
+        addSubview(titleLabel)
+        addSubview(detailTitleLabel)
+        addSubview(scrollView)
+        scrollView.addSubview(titleContentLabel)
+        scrollView.addSubview(contentLabel)
+        addSubview(lineLabel)
+        addSubview(v_lineLabel)
+        addSubview(leftButton)
+        addSubview(rightButton)
+    }
+    
+    func setupLayouts() {
+        titleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(topImageView.snp.bottom).offset(5)
+            make.centerX.equalToSuperview()
+            make.height.equalTo(25)
+        }
+        detailTitleLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(titleLabel.snp.bottom)
+            make.centerX.equalToSuperview()
+            make.height.equalTo(25)
+        }
+        scrollView.snp.makeConstraints { (make) in
+            make.top.equalTo(detailTitleLabel.snp.bottom).offset(10)
+            make.right.equalTo(-20)
+            make.left.equalTo(20)
+            make.height.equalTo(132)
+        }
+        titleContentLabel.snp.makeConstraints { (make) in
+            make.top.left.width.equalToSuperview()
+            make.height.equalTo((titleStr?.heightForComment(font: kRegularFont14!, width: 302 - 40) ?? 0))
+        }
+        contentLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(titleContentLabel.snp.bottom)
+            make.left.width.equalToSuperview()
+            make.height.equalTo(contentStr?.heightForComment(font: kRegularFont14!, width: 302 - 40) ?? 0)
+        }
+        
+        lineLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(scrollView.snp.bottom).offset(10)
+            make.left.right.equalToSuperview()
+            make.height.equalTo(0.5)
+        }
+        v_lineLabel.snp.makeConstraints { (make) in
+            make.top.equalTo(lineLabel.snp.bottom).offset(20)
+            make.bottom.equalTo(-20)
+            make.width.equalTo(0.5)
+            make.centerX.equalToSuperview()
+        }
+        leftButton.snp.makeConstraints { (make) in
+            make.top.equalTo(lineLabel.snp.bottom)
+            make.left.bottom.equalToSuperview()
+            make.right.equalTo(v_lineLabel.snp.left)
+        }
+        rightButton.snp.makeConstraints { (make) in
+            make.top.equalTo(lineLabel.snp.bottom)
+            make.right.bottom.equalToSuperview()
+            make.left.equalTo(v_lineLabel.snp.right)
+        }
+    }
+    
+    lazy var topImageView: UIImageView = {
+        let topImageView = UIImageView()
+        topImageView.frame = CGRect(x: 0, y: -20, width: self.width, height: 157)
+        topImageView.image = kImage(name: "my_set_pic_upgrade_popup")
+        return topImageView
+    }()
+    
+    lazy var titleLabel: UILabel = {
+        let titleLabel = UILabel()
+        titleLabel.text = "新版本上线"
+        titleLabel.textColor = k333333Color
+        titleLabel.font = kMediumFont18
+        return titleLabel
+    }()
+    
+    lazy var detailTitleLabel: UILabel = {
+        let detailTitleLabel = UILabel()
+        detailTitleLabel.text = "更多功能,更多乐趣"
+        detailTitleLabel.textColor = k333333Color
+        detailTitleLabel.font = kMediumFont18
+        return detailTitleLabel
+    }()
+    
+    lazy var scrollView: UIScrollView = {
+        let scrollView = UIScrollView()
+        scrollView.contentSize = CGSize(width: 302-40, height: (contentStr?.heightForComment(font: kRegularFont14!, width: 302 - 40) ?? 0) + (titleStr?.heightForComment(font: kRegularFont14!, width: 302 - 40) ?? 0))
+        return scrollView
+    }()
+    
+    
+    
+    lazy var titleContentLabel: UILabel = {
+        let titleContentLabel = UILabel()
+        titleContentLabel.text = titleStr
+        titleContentLabel.textColor = k666666Color
+        titleContentLabel.font = kRegularFont14
+        titleContentLabel.numberOfLines = 0
+        return titleContentLabel
+    }()
+    
+    
+    lazy var contentLabel: UILabel = {
+        let contentLabel = UILabel()
+        contentLabel.text = contentStr
+        contentLabel.textColor = k666666Color
+        contentLabel.font = kRegularFont14
+        contentLabel.numberOfLines = 0
+        return contentLabel
+    }()
+    
+    lazy var lineLabel: UILabel = {
+        let lineLabel = UILabel()
+        lineLabel.backgroundColor = kE5E5E5Color
+        return lineLabel
+    }()
+    
+    lazy var leftButton: UIButton = {
+        let leftButton = UIButton(type: UIButton.ButtonType.custom)
+        leftButton.setTitle("稍后再说", for: UIControl.State.normal)
+        leftButton.setTitleColor(k999999Color, for: UIControl.State.normal)
+        leftButton.titleLabel?.font = kRegularFont17
+        return leftButton
+    }()
+    
+    lazy var rightButton: UIButton = {
+        let rightButton = UIButton(type: UIButton.ButtonType.custom)
+        rightButton.setTitle("立即更新", for: UIControl.State.normal)
+        rightButton.setTitleColor(kThemeColor, for: UIControl.State.normal)
+        rightButton.titleLabel?.font = kBoldFont17
+        return rightButton
+    }()
+    
+    lazy var v_lineLabel: UILabel = {
+        let v_lineLabel = UILabel()
+        v_lineLabel.backgroundColor = kE5E5E5Color
+        return v_lineLabel
+    }()
+    
+    /// 初始化View
+    class func updateVersionView() -> UpdateVersionView {
+        let view = UpdateVersionView()
+        let vProperty = FWPopupViewProperty()
+        vProperty.popupCustomAlignment = .center
+        vProperty.popupViewEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
+        vProperty.popupAnimationType = .scale
+        vProperty.maskViewColor = UIColor(white: 0, alpha: 0.5)
+        vProperty.touchWildToHide = "0"
+        view.vProperty = vProperty
+        view.show()
+        view.leftButton.rx.tap.subscribe(onNext: { [weak view](data) in
+            let upGradeModel = UpdateVersionModel.shared.object()
+            switch upGradeModel?.upGradeModelType {
+            case .ignore?:
+                break
+            case .update?:
+                view?.hide()
+                break
+            case .strongUpdate?:
+                exit(0)
+                break
+            case .none:
+                break
+            }
+        }).disposed(by: view.disposeBag)
+        
+        view.rightButton.rx.tap.subscribe(onNext: {[weak view](data) in
+            AppStoreManager.shared.appStore()
+            view?.hide()
+        }).disposed(by: view.disposeBag)
+        return view
+    }
+
+}

+ 108 - 0
RainbowPlanet/RainbowPlanet/Manager/UpdateVersionManager/ViewModel/UpdateVersionManager.swift

@@ -0,0 +1,108 @@
+//
+//  VersionManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/7/15.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+
+class UpdateVersionManager: NSObject {
+    
+    var updateVersionView : UpdateVersionView?
+    
+    deinit {
+        if observe != nil {
+            NotificationCenter.default.removeObserver(observe!)
+        }
+    }
+    weak var observe : NSObjectProtocol?
+    
+    static let shared : UpdateVersionManager = UpdateVersionManager()
+
+    override init() {
+        super.init()
+        //启动程序
+        observe = NotificationCenter.default.addObserver(forName: UIApplication.didFinishLaunchingNotification, object: nil, queue: OperationQueue.main, using: {
+            [weak self] (notification) in
+            self?.configUpGrade()
+            
+        })
+        //程序进入后台
+        observe = NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: OperationQueue.main, using: {
+            [weak self] (notification) in
+            if self?.updateVersionView != nil {
+                self?.updateVersionView?.hide()
+            }
+        })
+        //将要进入前台的时候
+        observe = NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: OperationQueue.main, using: {
+            [weak self] (notification) in
+            self?.configUpGrade()
+            //基础配置
+            SwiftMoyaNetWorkServiceConfig.shared().configApi(completion: {(data) -> (Void) in}){_ in}
+        })
+        //程序即将退出
+        observe = NotificationCenter.default.addObserver(forName: UIApplication.willTerminateNotification, object: nil, queue: OperationQueue.main, using: {
+            [weak self] (notification) in
+            if self?.updateVersionView != nil {
+                self?.updateVersionView?.hide()
+            }
+        })
+
+    }
+    // 用于判断当前系统版本是否低于指定版本
+    func systemVersion(below aVersionString: String) -> Bool
+    {
+        return UIDevice.current.systemVersion.isOlder(than: aVersionString)
+    }
+    
+    /// 用于判断当前系统版本是否高于指定版本
+    func systemVersion(over aVersionString: String) -> Bool
+    {
+        return UIDevice.current.systemVersion.isNewer(than: aVersionString)
+    }
+    
+    /// 用于判断当前系统版本是否等于指定版本
+    func systemVersion(sameAs aVersionString: String) -> Bool
+    {
+        return UIDevice.current.systemVersion.isSame(to: aVersionString)
+    }
+    
+    /// 版本更新
+    func configUpGrade() {
+        SwiftMoyaNetWorkServiceConfig.shared().configUpGradeApi {
+            [weak self] (data) -> (Void) in
+            if UpdateVersionModel.shared.object()?.upGradeModelType == .update || UpdateVersionModel.shared.object()?.upGradeModelType == .strongUpdate {
+                if self?.updateVersionView != nil {
+                    self?.updateVersionView?.hide()
+                }
+                self?.updateVersionView = UpdateVersionView.updateVersionView()
+            }
+        }
+    }
+    
+    func appStoreVersion() {
+        
+    }
+    
+}
+
+extension String {
+    func ck_compare(with version: String) -> ComparisonResult {
+        return compare(version, options: .numeric, range: nil, locale: nil)
+    }
+    
+    func isNewer(than aVersionString: String) -> Bool {
+        return ck_compare(with: aVersionString) == .orderedDescending
+    }
+    
+    func isOlder(than aVersionString: String) -> Bool {
+        return ck_compare(with: aVersionString) == .orderedAscending
+    }
+    
+    func isSame(to aVersionString: String) -> Bool {
+        return ck_compare(with: aVersionString) == .orderedSame
+    }
+}

+ 151 - 0
RainbowPlanet/RainbowPlanet/Manager/WebViewJavascriptBridgeManager/WebViewJavascriptBridgeManager.swift

@@ -0,0 +1,151 @@
+//
+//  WebViewJavascriptBridgeManager.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/6/21.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import WebViewJavascriptBridge
+import SwiftyJSON
+import SwiftyMediator
+
+class WebViewJavascriptBridgeManager: NSObject {
+    
+    typealias CallDataClosure = (_ wbjbModel: WVJBModel) -> Void
+    
+    static let shared : WebViewJavascriptBridgeManager = WebViewJavascriptBridgeManager()
+    
+    /// 返回用户信息
+    ///
+    /// - Parameter bridge: 交互对象
+    func callHandlerH5(bridge: WebViewJavascriptBridge?) {
+        bridge?.callHandler("h5", data: UserModel.shared().getH5UserInfo())
+    }
+    
+    /// 刷新
+    ///
+    /// - Parameters:
+    ///   - bridge: 交互对象
+    ///   - force: 是否强制
+    func callHandlerH5Refresh(bridge: WebViewJavascriptBridge?,refreshModelType:WVJBRefreshModelType?,silent:Int? = 0) {
+        //获取当前时间
+        let refreshModel = WVJBRefreshModel()
+        refreshModel.type = refreshModelType?.rawValue
+        refreshModel.silent = silent
+        var refreshDic = Dictionary<String,Any>()
+        refreshDic.updateValue("refresh", forKey: "type")
+        refreshDic.updateValue(refreshModel.toJSON() as Any, forKey: "params")
+        bridge?.callHandler("h5", data: refreshDic)
+    }
+    
+    
+    /// 注册回调
+    ///
+    /// - Parameters:
+    ///   - bridge: 交互对象
+    ///   - callDataClosure: 回调
+    func registerHandlerApp(bridge: WebViewJavascriptBridge?,callDataClosure:@escaping CallDataClosure) {
+        bridge?.registerHandler("app", handler: { data, responseCallback in
+            if let data = data {
+                let jsonData = JSON(data)
+                let wbjbModel = WVJBModel(JSONString: jsonData.description)
+                callDataClosure(wbjbModel ?? WVJBModel())
+            }
+            responseCallback!(nil)
+        })
+    }
+    
+    func jump(wvjbModel:WVJBModel?,viewController:BaseJSWebBaseViewController? = nil) {
+        // 链接
+        if wvjbModel?.modelType == .link {
+            Mediator.push(H5RouterModuleType.pushWeb(URLString: wvjbModel!.params!.url!))
+        }
+        // 邀请
+        if wvjbModel?.modelType  == .share {
+            if wvjbModel?.params?.paramsModelType == .invite {
+                ShareCommunityView.inviteGoodFriends()
+            }
+        }
+        // 复制邀请码
+        if wvjbModel?.modelType  == .copy {
+            commonCopy(string: wvjbModel!.params!.content!)
+        }
+        
+        // 跳转原生
+        if wvjbModel?.modelType  == .follow {
+            let followStatusModel = FollowStatusModel()
+            followStatusModel.uid = wvjbModel!.params?.uid ?? 0
+            followStatusModel.isFollowStatus = wvjbModel!.params?.status ?? 0
+            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "followApi"), object: followStatusModel, userInfo: ["isPlanet":true])
+        }
+        
+        // 跳转预览图
+        if wvjbModel?.modelType  == .preview {
+            if !(wvjbModel!.params?.list?.isEmpty ?? true) {
+                Mediator.push(BrowsePictureRouterModuleType.pushBrowsePictureImageStrs(imageStrs: (wvjbModel!.params?.list)!, index: wvjbModel!.params?.current ?? 0))
+            }
+        }
+        
+        // 返回
+        if wvjbModel?.modelType  == .back {
+            viewController?.navigationController?.popViewController(animated: true)
+        }
+        
+        // 刷新U米
+        if wvjbModel?.modelType  == .bean {
+            UserMemberTotalBeanViewModel.shared.userMemberGetTotalBeanApi()
+        }
+        
+        // 跳转原生
+        if wvjbModel?.modelType  == .view {
+            // 发布
+            if wvjbModel?.params?.paramsModelPage == .publist {
+                BaseTabbarViewController.shared.pushPublishVC()
+            }
+            // 推荐
+            if wvjbModel?.params?.paramsModelPage == .join {
+                BaseTabbarViewController.shared.esTabBarController.selectedIndex = 0
+                BaseTabbarViewController.shared.v1.reloadSegmentedView()
+                if viewController != nil {
+                    viewController?.navigationController?.popToRootViewController(animated: true)
+                }
+            }
+            // 兑换商城
+            if wvjbModel?.params?.paramsModelPage == .exchange {
+                BaseTabbarViewController.shared.esTabBarController.selectedIndex = 1
+                if viewController != nil {
+                    viewController?.navigationController?.popToRootViewController(animated: true)
+                }
+            }
+            // 去星球
+            if wvjbModel?.params?.paramsModelPage == .planet {
+                BaseTabbarViewController.shared.esTabBarController.selectedIndex = 0
+                BaseTabbarViewController.shared.v1.reloadSegmentedStarView()
+                if viewController != nil {
+                    viewController?.navigationController?.popToRootViewController(animated: true)
+                }
+            }
+            
+            // 去登陆
+            if wvjbModel?.params?.paramsModelPage == .signin {
+                Mediator.present(RegisterLoginRouterModuleType.presentRegisterLogin)
+            }
+            
+            // 去个人中心
+            if wvjbModel?.params?.paramsModelPage == .user {
+                if wvjbModel?.params?.payload?.uid != nil && wvjbModel?.params?.payload?.uid != UserModel.shared().getModel()?.uid {
+                    Mediator.present(MineRouterModuleType.pushOtherPersonalCenter(uid: wvjbModel?.params?.payload?.uid ?? 0))
+                }
+            }
+            
+            // 账户(绑定微信/绑定QQ)
+            if wvjbModel?.params?.paramsModelPage == .account {
+                Mediator.present(MineRouterModuleType.pushAccountSecurity)
+            }
+            
+        }
+        
+    }
+}

+ 55 - 0
RainbowPlanet/RainbowPlanet/Model/CMSModel/CMSMemberListModel.swift

@@ -0,0 +1,55 @@
+//
+//	CMSMemberListModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class CMSMemberListModel : NSObject, Mappable{
+
+	var list : [CMSMemberModel]?
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CMSMemberListModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		list <- map["list"]
+		
+	}
+
+}
+
+class CMSMemberModel : NSObject, Mappable{
+    
+    var avatar : String?
+    var followStatus : Int?
+    var followTopic : [String]?
+    var uid : Int?
+    var username : String?
+    var topicName : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CMSMemberModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        avatar <- map["avatar"]
+        followStatus <- map["follow_status"]
+        followTopic <- map["follow_topic"]
+        uid <- map["uid"]
+        username <- map["username"]
+        topicName <- map["topic_name"]
+        
+    }
+    
+}
+

RainbowPlanet/RainbowPlanet/Service/Model/CMSModel/CMSModel.swift → RainbowPlanet/RainbowPlanet/Model/CMSModel/CMSModel.swift


+ 122 - 0
RainbowPlanet/RainbowPlanet/Model/CMSModel/CMSRedemptionAreaModel.swift

@@ -0,0 +1,122 @@
+//
+//	RedemptionAreaModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class CMSRedemptionAreaModel : NSObject, Mappable{
+
+	var applyType : String?
+	var content : [CMSRedemptionAreaContent]?
+	var title : String?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CMSRedemptionAreaModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		applyType <- map["apply_type"]
+		content <- map["content"]
+		title <- map["title"]
+		
+	}
+
+}
+
+enum CMSRedemptionAreaContentType : String {
+    case none = ""
+    case banner = "banner"
+    case specialOne = "subject_one"
+    case specialTwo = "subject_two"
+    case floor = "floor"
+}
+
+class CMSRedemptionAreaContent : NSObject, Mappable{
+    
+    var cmsRedemptionAreaContentType : CMSRedemptionAreaContentType?
+    var areaType : String? {
+        didSet{
+            cmsRedemptionAreaContentType = CMSRedemptionAreaContentType(rawValue: areaType ?? "")
+        }
+    }
+    var floorImg : String?
+    var id : Int?
+    var linkType : Int?
+    var linkUrl : Int?
+    var rule : [CMSRedemptionAreaRule]?
+    var showType : Int?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CMSRedemptionAreaContent()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        areaType <- map["area_type"]
+        floorImg <- map["floor_img"]
+        id <- map["id"]
+        linkType <- map["link_type"]
+        linkUrl <- map["link_url"]
+        rule <- map["rule"]
+        showType <- map["show_type"]
+        
+    }
+    
+}
+
+class CMSRedemptionAreaRule : NSObject, Mappable{
+    
+    // banner
+    var url : String?
+    var linkUrl : String?
+    var redemptionAreaBannerType : RedemptionAreaBannerType?
+    var linkType : Int? {
+        didSet {
+            redemptionAreaBannerType = RedemptionAreaBannerType(rawValue: linkType ?? 0)
+        }
+    }
+
+    // floor
+    var id : Int?
+    var img : String?
+    var price : Int?
+    var saleName : String?
+    var stock : Int?
+    var subtitle : String?
+    var totalCount : Int?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CMSRedemptionAreaRule()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        // banner
+        url <- map["url"]
+        linkUrl <- map["link_url"]
+        linkType <- map["link_type"]
+        
+        // floor
+        id <- map["id"]
+        img <- map["img"]
+        price <- map["price"]
+        saleName <- map["sale_name"]
+        stock <- map["stock"]
+        subtitle <- map["subtitle"]
+        totalCount <- map["total_count"]
+        
+    }
+    
+}

RainbowPlanet/RainbowPlanet/Service/Model/CMSModel/CMSTemplateModel.swift → RainbowPlanet/RainbowPlanet/Model/CMSModel/CMSTemplateModel.swift


+ 31 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityCustomCommnetModel.swift

@@ -0,0 +1,31 @@
+//
+//  CommunityCustomCommnetModel.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/7/8.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import ObjectMapper
+
+class CommunityCustomCommnetModel: NSObject,Mappable {
+    
+    var postId : Int?
+    var content : String?
+    var parentId : Int?
+    var replyUid : Int?
+    var replyUsername : String?
+    
+    required init?(map: Map){}
+    override init(){}
+    
+    func mapping(map: Map)
+    {
+        postId <- map["post_id"]
+        content <- map["content"]
+        parentId <- map["parent_id"]
+        replyUid <- map["reply_uid"]
+        replyUsername <- map["reply_username"]
+    }
+}

+ 199 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityFollowFeedModel.swift

@@ -0,0 +1,199 @@
+//
+//	CommunityFollowFeedModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class CommunityFollowFeedModel : NSObject, Mappable{
+
+	var data : [CommunityFollowDataModel]?
+	var pagination : PaginationModel?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CommunityFollowFeedModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		data <- map["data"]
+		pagination <- map["pagination"]
+		
+	}
+
+}
+
+class CommunityFollowDataModel : NSObject, Mappable{
+    
+    var content : CommunityFollowContentModel?
+    var createdAt : String?
+    var followAvatar : String?
+    var followUid : Int?
+    var followUsername : String?
+    var id : Int?
+    var relateData : CommunityFollowRelateDataModel?
+    var relateId : Int?
+    var type : String?
+    var uid : Int?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityFollowDataModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        content <- map["content"]
+        createdAt <- map["created_at"]
+        followAvatar <- map["follow_avatar"]
+        followUid <- map["follow_uid"]
+        followUsername <- map["follow_username"]
+        id <- map["id"]
+        relateData <- map["relate_data"]
+        relateId <- map["relate_id"]
+        type <- map["type"]
+        uid <- map["uid"]
+        
+    }
+    
+}
+
+class CommunityFollowContentModel : NSObject, Mappable{
+    
+    var beans : Int?
+    var postDesc : String?
+    var commentDesc:String?
+    var postType:String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityFollowContentModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        beans <- map["beans"]
+        postDesc <- map["post_desc"]
+        commentDesc <- map["comment_desc"]
+        postType <- map["post_type"]
+        
+    }
+    
+}
+
+class CommunityFollowRelateDataModel : NSObject, Mappable{
+    
+    var availableBean : Int?
+    var avatar : String?
+    var commentCount : Int?
+    var content : String?
+    var createdAt : String?
+    var id : Int?
+    var img : String?
+    var imgs : [String]?
+    var isCollect : Int?
+    var isDislike : Int?
+    var isFollow : Int?
+    var isLike : Int?
+    var location : String?
+    var postComment : [CommunityFollowPostCommentModel]?
+    var praiseCount : Int?
+    var pv : Int?
+    var title : String?
+    var topic : [CommunityFollowTopicModel]?
+    var type : String?
+    var uid : Int?
+    var username : String?
+    var video : String?
+    var willCollectBean : Int?
+    var h5url : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityFollowRelateDataModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        availableBean <- map["available_bean"]
+        avatar <- map["avatar"]
+        commentCount <- map["comment_count"]
+        content <- map["content"]
+        createdAt <- map["created_at"]
+        id <- map["id"]
+        img <- map["img"]
+        imgs <- map["imgs"]
+        isCollect <- map["is_collect"]
+        isDislike <- map["is_dislike"]
+        isFollow <- map["follow_status"]
+        isLike <- map["is_like"]
+        location <- map["location"]
+        postComment <- map["post_comment"]
+        praiseCount <- map["praise_count"]
+        pv <- map["pv"]
+        title <- map["title"]
+        topic <- map["topic"]
+        type <- map["type"]
+        uid <- map["uid"]
+        username <- map["username"]
+        video <- map["video"]
+        willCollectBean <- map["will_collect_bean"]
+        h5url <- map["h5url"]
+        
+    }
+}
+
+class CommunityFollowTopicModel: NSObject, Mappable{
+    
+    var id : Int?
+    var name : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityFollowTopicModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        id <- map["id"]
+        name <- map["name"]
+        
+    }
+    
+}
+
+class CommunityFollowPostCommentModel : NSObject, Mappable{
+    
+    var content : String?
+    var id : Int?
+    var uid : Int?
+    var username : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityFollowPostCommentModel()
+    }
+    required init?(map: Map){}
+    override init(){}
+    
+    func mapping(map: Map)
+    {
+        content <- map["content"]
+        id <- map["id"]
+        uid <- map["uid"]
+        username <- map["username"]
+        
+    }
+}

+ 40 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityImageAuthModel.swift

@@ -0,0 +1,40 @@
+//
+//  CommunityImageAuthModel.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/8/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import ObjectMapper
+
+// MARK: - 图片
+class CommunityImageAuthModel : NSObject, Mappable{
+    
+    var fileURL : String?
+    var imageId : String?
+    var imageURL : String?
+    var requestId : String?
+    var uploadAddress : String?
+    var uploadAuth : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityImageAuthModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        fileURL <- map["FileURL"]
+        imageId <- map["ImageId"]
+        imageURL <- map["ImageURL"]
+        requestId <- map["RequestId"]
+        uploadAddress <- map["UploadAddress"]
+        uploadAuth <- map["UploadAuth"]
+    }
+    
+}
+

+ 55 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityMemberFollowTopicListModel.swift

@@ -0,0 +1,55 @@
+//
+//	CommunityMemberFollowTopicListModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class CommunityMemberFollowTopicListModel : NSObject, Mappable{
+
+	var data : [CommunityMemberFollowTopicListDataModel]?
+	var pagination : PaginationModel?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CommunityMemberFollowTopicListModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		data <- map["data"]
+		pagination <- map["pagination"]
+		
+	}
+}
+
+class CommunityMemberFollowTopicListDataModel : NSObject, Mappable{
+    
+    var id : Int?
+    var isSuggest : Int?
+    var topicId : Int?
+    var topicName : String?
+    var uid : Int?
+    var isFollow : Int = 1
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityMemberFollowTopicListDataModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        id <- map["id"]
+        isSuggest <- map["is_suggest"]
+        topicId <- map["topic_id"]
+        topicName <- map["topic_name"]
+        uid <- map["uid"]
+        
+    }
+}
+

+ 53 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityMusicCategoryListModel.swift

@@ -0,0 +1,53 @@
+//
+//  CommunityMusicCategoryListModel.swift
+//  RainbowPlanet
+//
+//  Created by Christopher on 2019/7/17.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//  音乐分类のModel
+
+import Foundation
+import ObjectMapper
+
+class CommunityMusicCategoryListModel : NSObject, Mappable{
+    
+    var data : [MusicCategoryItemModel]?
+    var pagination : PaginationModel?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityMusicCategoryListModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        data <- map["data"]
+        pagination <- map["pagination"]
+        
+    }
+    
+}
+
+
+class MusicCategoryItemModel : NSObject, Mappable{
+    
+    var id : Int?
+    var name : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return MusicCategoryItemModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        id <- map["id"]
+        name <- map["name"]
+        
+    }
+    
+}

+ 48 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostCommentIdModel.swift

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

+ 99 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostCommentsModel.swift

@@ -0,0 +1,99 @@
+//
+//	CommunityPostCommentsModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class CommunityPostCommentsModel : NSObject, Mappable{
+
+	var data : [CommunityPostCommentModel]?
+	var pagination : PaginationModel?
+    var commentCount : Int?
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CommunityPostCommentsModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		data <- map["data"]
+		pagination <- map["pagination"]
+		commentCount <- map["comment_count"]
+	}
+
+}
+
+class CommunityPostCommentModel : NSObject, Mappable{
+    
+    var avatar : String?
+    var content : String?
+    var createdAt : String?
+    var id : Int?
+    var reply : [CommunityPostReplyModel]?
+    var replyCount : Int?
+    var uid : Int?
+    var username : String?
+    var height : CGFloat?
+    var isDelete : Int?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityPostCommentModel()
+    }
+    required init?(map: Map){}
+    override init(){}
+    
+    func mapping(map: Map)
+    {
+        avatar <- map["avatar"]
+        content <- map["content"]
+        createdAt <- map["created_at"]
+        id <- map["id"]
+        reply <- map["reply"]
+        replyCount <- map["reply_count"]
+        uid <- map["uid"]
+        username <- map["username"]
+        isDelete <- map["is_delete"]
+        
+    }
+}
+
+class CommunityPostReplyModel : NSObject, Mappable{
+    
+    var avatar : String?
+    var content : String?
+    var createdAt : String?
+    var replyUsername : String?
+    var uid : Int?
+    var username : String?
+    var id : Int?
+    var height : CGFloat?
+    var isDelete : Int?
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityPostReplyModel()
+    }
+    required init?(map: Map){}
+    override init(){}
+    
+    func mapping(map: Map)
+    {
+        id <- map["id"]
+        avatar <- map["avatar"]
+        content <- map["content"]
+        createdAt <- map["created_at"]
+        replyUsername <- map["reply_username"]
+        uid <- map["uid"]
+        username <- map["username"]
+        isDelete <- map["is_delete"]
+
+        
+    }
+    
+}
+
+

+ 99 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostDetailModel.swift

@@ -0,0 +1,99 @@
+//
+//	CommunityPostDetailModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class CommunityPostDetailModel : NSObject, Mappable{
+
+	var availableBean : Int?
+	var avatar : String?
+	var commentCount : Int?
+	var content : String?
+	var createdAt : String?
+	var descUrl : String?
+	var h5url : String?
+	var id : Int?
+	var img : String?
+	var imgs : [String]?
+	var isCollect : Int?
+	var isDislike : Int?
+	var isFollow : Int?
+	var isLike : Int?
+	var location : String?
+	var praiseCount : Int?
+	var pv : String?
+	var title : String?
+	var topic : [CommunityPostDetailTopicModel]?
+    var topicIds : String?
+	var type : String?
+	var uid : Int?
+	var username : String?
+	var video : String?
+	var willCollectBean : Int?
+    var customHeight : CGFloat?
+    var collectCount : Int?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CommunityPostDetailModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		availableBean <- map["available_bean"]
+		avatar <- map["avatar"]
+		commentCount <- map["comment_count"]
+		content <- map["content"]
+		createdAt <- map["created_at"]
+		descUrl <- map["desc_url"]
+		h5url <- map["h5url"]
+		id <- map["id"]
+		img <- map["img"]
+		imgs <- map["imgs"]
+		isCollect <- map["is_collect"]
+		isDislike <- map["is_dislike"]
+		isFollow <- map["is_follow"]
+		isLike <- map["is_like"]
+		location <- map["location"]
+		praiseCount <- map["praise_count"]
+		pv <- map["pv"]
+		title <- map["title"]
+		topic <- map["topic"]
+		type <- map["type"]
+		uid <- map["uid"]
+		username <- map["username"]
+		video <- map["video"]
+		willCollectBean <- map["will_collect_bean"]
+        collectCount <- map["collect_count"]
+        topicIds <- map["topic_ids"]
+		
+	}
+
+}
+
+class CommunityPostDetailTopicModel : NSObject, Mappable{
+    
+    var id : Int?
+    var name : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityPostDetailTopicModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        id <- map["id"]
+        name <- map["name"]
+        
+    }
+    
+}
+

+ 59 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostMyModel.swift

@@ -0,0 +1,59 @@
+//
+//	CommunityPostMyModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+enum PostMyModelType : String {
+    case image = "image"
+    case video = "video"
+    case html = "html"
+}
+
+class CommunityPostMyModel : NSObject, Mappable{
+
+	var data : [PostMyModel]?
+	var pagination : PaginationModel?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CommunityPostMyModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		data <- map["data"]
+		pagination <- map["pagination"]
+		
+	}
+
+}
+
+class PostMyModel : NSObject, Mappable{
+    
+    var collectBean : Int?
+    var id : Int?
+    var img : String?
+    var type : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return PostMyModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        collectBean <- map["collect_bean"]
+        id <- map["id"]
+        img <- map["img"]
+        type <- map["type"]
+        
+    }
+    
+}
+

+ 28 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostReplysModel.swift

@@ -0,0 +1,28 @@
+//
+//	CommunityPostCommentsModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class CommunityPostReplysModel : NSObject, Mappable{
+
+	var data : [CommunityPostReplyModel]?
+	var pagination : PaginationModel?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CommunityPostReplysModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		data <- map["data"]
+		pagination <- map["pagination"]
+		
+	}
+
+}

+ 65 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPostsModel.swift

@@ -0,0 +1,65 @@
+//
+//	CommunityPostsModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class CommunityPostsModel : NSObject, Mappable{
+
+	var data : [CommunityPostDataModel]?
+	var pagination : PaginationModel?
+
+
+	class func newInstance(map: Map) -> Mappable?{
+		return CommunityPostsModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		data <- map["data"]
+		pagination <- map["pagination"]
+		
+	}
+
+}
+
+class CommunityPostDataModel : NSObject, Mappable{
+    
+    var avatar : String?
+    var id : Int?
+    var img : String?
+    var isLike : Int?
+    var praiseCount : Int?
+    var title : String?
+    var content : String?
+    var type : String?
+    var uid : Int?
+    var username : String?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityPostDataModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        avatar <- map["avatar"]
+        id <- map["id"]
+        img <- map["img"]
+        isLike <- map["is_like"]
+        praiseCount <- map["praise_count"]
+        title <- map["title"]
+        type <- map["type"]
+        uid <- map["uid"]
+        username <- map["username"]
+        content <- map["content"]
+        
+    }
+    
+}

+ 33 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityPublishModel.swift

@@ -0,0 +1,33 @@
+//
+//  CommunityPublishModel.swift
+//  RainbowPlanet
+//
+//  Created by Christopher on 2019/7/1.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//  发布动态のModel
+
+import Foundation
+import ObjectMapper
+
+
+class CommunityPublishModel : NSObject, Mappable{
+    
+    var bean : Int?
+    var h5url : String?
+    var postId : Int?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return CommunityPublishModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        bean <- map["bean"]
+        h5url <- map["h5url"]
+        postId <- map["post_id"]
+        
+    }
+}

+ 0 - 0
RainbowPlanet/RainbowPlanet/Model/CommunityModel/CommunityRecommendFeedModel.swift


Деякі файли не було показано, через те що забагато файлів було змінено