Pārlūkot izejas kodu

个人中心完成一半

南鑫林 5 gadi atpakaļ
vecāks
revīzija
274ead2888
18 mainītis faili ar 715 papildinājumiem un 69 dzēšanām
  1. 12 4
      RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj
  2. 4 4
      RainbowPlanet/RainbowPlanet/Modules/CommunityModule/Community/ViewController/CommunityEnum.swift
  3. 75 2
      RainbowPlanet/RainbowPlanet/Modules/CommunityModule/CommunityFindFriends/ViewController/CommunityFindFriendsViewController.swift
  4. 8 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/MyFollowAndFan/View/MyFollowAndFanHeaderView.swift
  5. 148 13
      RainbowPlanet/RainbowPlanet/Modules/MineModule/MyFollowAndFan/ViewController/MyFollowAndFanViewController.swift
  6. 6 0
      RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/OtherPersonalCenter/View/OtherPersonalCenterHeaderView/OtherPersonalCenterHeaderView.swift
  7. 27 4
      RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/OtherPersonalCenter/ViewController/OtherPersonalCenterViewController.swift
  8. 12 12
      RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/PersonalCenterView/PersonViewUserAndOtherListView.swift
  9. 6 2
      RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/UserPersonalCenter/ViewController/UserPersonalCenterViewController.swift
  10. 0 13
      RainbowPlanet/RainbowPlanet/Modules/RegisterLoginModule/TopicSelection/ViewController/TopicSelectionModel.swift
  11. 56 3
      RainbowPlanet/RainbowPlanet/Modules/SearchModule/SearchUser/View/SearchUserLitTableViewCell.swift
  12. 53 0
      RainbowPlanet/RainbowPlanet/Service/Model/CMSModel/CMSMemberListModel.swift
  13. 61 0
      RainbowPlanet/RainbowPlanet/Service/Model/UserModel/UserFansModel.swift
  14. 58 0
      RainbowPlanet/RainbowPlanet/Service/Model/UserModel/UserFollowsModel.swift
  15. 20 0
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceCMS/SwiftMoyaNetWorkServiceCMS.swift
  16. 16 4
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceCMS/SwiftMoyaServiceCMSApi.swift
  17. 84 2
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceUser/SwiftMoyaNetWorkServiceUser.swift
  18. 69 6
      RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceUser/SwiftMoyaServiceUserApi.swift

+ 12 - 4
RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj

@@ -236,7 +236,6 @@
 		A7931E0D22AF874600297D0A /* GenderSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7931E0C22AF874600297D0A /* GenderSelectionViewController.swift */; };
 		A7931E1122AF989B00297D0A /* TopicSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7931E1022AF989B00297D0A /* TopicSelectionViewController.swift */; };
 		A7931E1422AF9E4000297D0A /* TopicSelectionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7931E1322AF9E4000297D0A /* TopicSelectionCollectionViewCell.swift */; };
-		A7931E1622AFAEF500297D0A /* TopicSelectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7931E1522AFAEF500297D0A /* TopicSelectionModel.swift */; };
 		A7931E1822AFC1DF00297D0A /* CommunityListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7931E1722AFC1DF00297D0A /* CommunityListViewController.swift */; };
 		A7A17E5F22A0CEF200B7A77E /* SwiftMoyaNetWorkManagerTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A17E5E22A0CEF200B7A77E /* SwiftMoyaNetWorkManagerTools.swift */; };
 		A7A98DFD227E84F4005306E9 /* SwiftMoyaServiceProductApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7A98DFC227E84F4005306E9 /* SwiftMoyaServiceProductApi.swift */; };
@@ -349,6 +348,9 @@
 		A7D5F25A22C05D1400F8E9AF /* SwiftMoyaServiceCommunityApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F25922C05D1400F8E9AF /* SwiftMoyaServiceCommunityApi.swift */; };
 		A7D5F25C22C05E0800F8E9AF /* SwiftMoyaNetWorkServiceCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F25B22C05E0800F8E9AF /* SwiftMoyaNetWorkServiceCommunity.swift */; };
 		A7D5F25F22C0614400F8E9AF /* CommunityTopicCategoryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F25E22C0614400F8E9AF /* CommunityTopicCategoryModel.swift */; };
+		A7D5F26122C0C2F300F8E9AF /* UserFollowsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F26022C0C2F300F8E9AF /* UserFollowsModel.swift */; };
+		A7D5F26322C0CF8600F8E9AF /* UserFansModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F26222C0CF8600F8E9AF /* UserFansModel.swift */; };
+		A7D5F26522C118F100F8E9AF /* CMSMemberListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7D5F26422C118F100F8E9AF /* CMSMemberListModel.swift */; };
 		A7DC467F22783A47001F3EFC /* EditExpressAddressTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DC467E22783A47001F3EFC /* EditExpressAddressTableViewCell.swift */; };
 		A7DF50D622A4E8B400998908 /* OrderDetailProductTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DF50D522A4E8B400998908 /* OrderDetailProductTableViewCell.swift */; };
 		A7DF50D822A4FAFC00998908 /* ProductDetailEvaluationImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7DF50D722A4FAFC00998908 /* ProductDetailEvaluationImageCollectionViewCell.swift */; };
@@ -806,7 +808,6 @@
 		A7931E0C22AF874600297D0A /* GenderSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenderSelectionViewController.swift; sourceTree = "<group>"; };
 		A7931E1022AF989B00297D0A /* TopicSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicSelectionViewController.swift; sourceTree = "<group>"; };
 		A7931E1322AF9E4000297D0A /* TopicSelectionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicSelectionCollectionViewCell.swift; sourceTree = "<group>"; };
-		A7931E1522AFAEF500297D0A /* TopicSelectionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopicSelectionModel.swift; sourceTree = "<group>"; };
 		A7931E1722AFC1DF00297D0A /* CommunityListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityListViewController.swift; sourceTree = "<group>"; };
 		A7A17E5E22A0CEF200B7A77E /* SwiftMoyaNetWorkManagerTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaNetWorkManagerTools.swift; sourceTree = "<group>"; };
 		A7A59A7722363CCB00417FA4 /* RainbowPlanet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RainbowPlanet.entitlements; sourceTree = "<group>"; };
@@ -921,6 +922,9 @@
 		A7D5F25922C05D1400F8E9AF /* SwiftMoyaServiceCommunityApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaServiceCommunityApi.swift; sourceTree = "<group>"; };
 		A7D5F25B22C05E0800F8E9AF /* SwiftMoyaNetWorkServiceCommunity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftMoyaNetWorkServiceCommunity.swift; sourceTree = "<group>"; };
 		A7D5F25E22C0614400F8E9AF /* CommunityTopicCategoryModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommunityTopicCategoryModel.swift; sourceTree = "<group>"; };
+		A7D5F26022C0C2F300F8E9AF /* UserFollowsModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserFollowsModel.swift; sourceTree = "<group>"; };
+		A7D5F26222C0CF8600F8E9AF /* UserFansModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFansModel.swift; sourceTree = "<group>"; };
+		A7D5F26422C118F100F8E9AF /* CMSMemberListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMSMemberListModel.swift; sourceTree = "<group>"; };
 		A7DC467E22783A47001F3EFC /* EditExpressAddressTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditExpressAddressTableViewCell.swift; sourceTree = "<group>"; };
 		A7DF50D522A4E8B400998908 /* OrderDetailProductTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderDetailProductTableViewCell.swift; sourceTree = "<group>"; };
 		A7DF50D722A4FAFC00998908 /* ProductDetailEvaluationImageCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailEvaluationImageCollectionViewCell.swift; sourceTree = "<group>"; };
@@ -1757,6 +1761,8 @@
 			children = (
 				A7284403224DBFBD00F82F30 /* UserModel.swift */,
 				A7D5F25622C05BE900F8E9AF /* UserDetailModel.swift */,
+				A7D5F26022C0C2F300F8E9AF /* UserFollowsModel.swift */,
+				A7D5F26222C0CF8600F8E9AF /* UserFansModel.swift */,
 				A7CC74E52270628B003C4F38 /* DeliveryMethodTypeModel.swift */,
 				A757C92D22744ACE00226355 /* AddressManagerListModel.swift */,
 				A79057012276C9770037F823 /* SetPasswordModel.swift */,
@@ -2813,7 +2819,6 @@
 			isa = PBXGroup;
 			children = (
 				A7931E1022AF989B00297D0A /* TopicSelectionViewController.swift */,
-				A7931E1522AFAEF500297D0A /* TopicSelectionModel.swift */,
 			);
 			path = ViewController;
 			sourceTree = "<group>";
@@ -2978,6 +2983,7 @@
 			children = (
 				A7B4E739228192D10012914A /* CMSTemplateModel.swift */,
 				A7B4E7342281907A0012914A /* CMSModel.swift */,
+				A7D5F26422C118F100F8E9AF /* CMSMemberListModel.swift */,
 			);
 			path = CMSModel;
 			sourceTree = "<group>";
@@ -4753,7 +4759,6 @@
 				BD13B6DB22BA03BC008BB323 /* PublishAddressPOIView.swift in Sources */,
 				A72A72BE22321DE000B21995 /* Extension+RxTimer.swift in Sources */,
 				A7F2D6CB22B0E4270093000B /* CommunityRecommendFollowCollectionViewCell.swift in Sources */,
-				A7931E1622AFAEF500297D0A /* TopicSelectionModel.swift in Sources */,
 				BDF47D7E22827C3F00941AB9 /* ProductSlidingTopBottomCollectionViewCell.swift in Sources */,
 				BD108C9522A60C2100837DAB /* HGImageCollectionViewCell.swift in Sources */,
 				A7FF1589228C854900A85748 /* OrderDetailBottomView.swift in Sources */,
@@ -4966,6 +4971,7 @@
 				A74322A222B8D5A90017C367 /* SearchUserLitTableViewCell.swift in Sources */,
 				A7CC75432271E038003C4F38 /* SelfMentionContactsListViewController.swift in Sources */,
 				BDF47D872282C92200941AB9 /* ShoppingCartListTableViewHeader.swift in Sources */,
+				A7D5F26322C0CF8600F8E9AF /* UserFansModel.swift in Sources */,
 				BD13B6E122BA03BC008BB323 /* PublishSelTopicCollectionCell.swift in Sources */,
 				A70B2C46228840B100B2449F /* ProductDetailHotSellTableViewCell.swift in Sources */,
 				A7D5F25F22C0614400F8E9AF /* CommunityTopicCategoryModel.swift in Sources */,
@@ -5012,6 +5018,7 @@
 				A7A98E17227EED76005306E9 /* SpecialViewController.swift in Sources */,
 				A7778CB32244D73400C7C47A /* RegisterLoginViewController.swift in Sources */,
 				BD7AB8432284390B0030646A /* OrderPaySelfPickInfoCell.swift in Sources */,
+				A7D5F26522C118F100F8E9AF /* CMSMemberListModel.swift in Sources */,
 				BD1FC18622B09F9800D55081 /* CommunitySubCommentController.swift in Sources */,
 				A7C0FE0222B682DB00BC1E86 /* CommunityFeaturedTopicsHeaderView.swift in Sources */,
 				A7274C5F228EE636000E3A07 /* LBXScanWrapper.swift in Sources */,
@@ -5105,6 +5112,7 @@
 				A7FF1572228C7D4600A85748 /* OrderButtonTableViewCell.swift in Sources */,
 				A7B4E72F2281773F0012914A /* ProductFloorCenterTitleView.swift in Sources */,
 				A7284A542252FB5C000BAEC4 /* PaginationModel.swift in Sources */,
+				A7D5F26122C0C2F300F8E9AF /* UserFollowsModel.swift in Sources */,
 				A72A72D022321E2700B21995 /* FontMacro.swift in Sources */,
 				A74322A022B8D1F30017C367 /* MyFollowAndFanViewController.swift in Sources */,
 				BD2FCBE622B2586C0006D974 /* CommunityTagCollectionCell.swift in Sources */,

+ 4 - 4
RainbowPlanet/RainbowPlanet/Modules/CommunityModule/Community/ViewController/CommunityEnum.swift

@@ -13,10 +13,10 @@ import UIKit
 /// - futureFollow: 未关注
 /// - alreadyFollow: 已关注
 /// - mutualFollow: 互相关注
-enum FollowType {
-    case futureFollow
-    case alreadyFollow
-    case mutualFollow
+enum FollowType : Int {
+    case futureFollow = 0
+    case alreadyFollow = 1
+    case mutualFollow = 2
 }
 
 /// 用户状态类型

+ 75 - 2
RainbowPlanet/RainbowPlanet/Modules/CommunityModule/CommunityFindFriends/ViewController/CommunityFindFriendsViewController.swift

@@ -9,6 +9,10 @@
 import UIKit
 
 class CommunityFindFriendsViewController: BaseViewController {
+    
+    /// 关注数组
+    var cmsMemberModels = Array<CMSMemberModel>()
+    
     override func viewDidLoad() {
         super.viewDidLoad()
         setupViews()
@@ -31,6 +35,9 @@ class CommunityFindFriendsViewController: BaseViewController {
     
     override func setupData() {
         tableView.tableHeaderView = communityFindFriendsView
+        tableView.addHeaderWithHeader(withBeginRefresh: true, animation: false) { [weak self] (page) in
+            self?.cmsMemberListApi()
+        }
     }
     
     private lazy var tableView: UITableView = {
@@ -51,19 +58,85 @@ class CommunityFindFriendsViewController: BaseViewController {
     
 }
 
+extension CommunityFindFriendsViewController {
+    /// 获取关注列表
+    func cmsMemberListApi() {
+        SwiftMoyaNetWorkServiceCMS.shared().cmsMemberListApi {
+            [weak self] (cmsMemberListModel) -> (Void) in
+            let cmsMemberListModel = cmsMemberListModel as? CMSMemberListModel
+            self?.cmsMemberModels = (cmsMemberListModel?.list)!
+            self?.tableView.reloadData()
+        }
+    }
+    
+    /// 关注
+    func userFollow(followUid:Int,completion: @escaping (Int) -> Void) {
+        SwiftMoyaNetWorkServiceUser.shared().userFollowApi(followUid: followUid) {[weak self] (data) -> (Void) in
+            self?.userFollowCheckStatus(followUid: followUid, completion: completion)
+        }
+    }
+    
+    /// 取消关注
+    func userCancelFollow(followUid:Int,completion: @escaping (Int) -> Void) {
+        SwiftMoyaNetWorkServiceUser.shared().userCancelFollowApi(followUid: followUid) {
+            [weak self] (data) -> (Void) in
+            self?.userFollowCheckStatus(followUid: followUid, completion: completion)
+        }
+    }
+    
+    /// 检查用户关注状态
+    func userFollowCheckStatus(followUid:Int,completion: @escaping (Int) -> Void) {
+        let userModel = UserModel.shared().getModel()
+
+        SwiftMoyaNetWorkServiceUser.shared().userFollowCheckStatus(followUid: followUid, uid: userModel?.uid ?? 0) {(isFollow) -> (Void) in
+            let isFollow = isFollow as? Int
+            completion(isFollow ?? 0)
+        }
+    }
+}
+
 // MARK: - tableView dataSource && delegate
 extension CommunityFindFriendsViewController: UITableViewDataSource, UITableViewDelegate {
     
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return 10
+        return self.cmsMemberModels.isEmpty ? 0 : self.cmsMemberModels.count
     }
     
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = SearchUserLitTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
-        cell.followType = .alreadyFollow
+        cell.cmsMemberModel = self.cmsMemberModels[indexPath.row]
+        cell.followButtonClosure = {
+            [weak self] in
+            if cell.cmsMemberModel?.followStatus == 0 { //加关注
+                self?.userFollow(followUid: cell.cmsMemberModel?.uid ?? 0, completion: { (isFollow) -> Void in
+                    cell.cmsMemberModel?.followStatus = isFollow
+                    self?.tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
+                })
+            }else { //取消关注
+                self?.userCancelFollow(followUid: cell.cmsMemberModel?.uid ?? 0, completion: { (isFollow) -> Void in
+                    cell.cmsMemberModel?.followStatus = isFollow
+                    self?.tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
+                })
+            }
+        }
         return cell
     }
     
+    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        tableView.deselectRow(at: indexPath, animated: true)
+        let cmsMemberModel = self.cmsMemberModels[indexPath.row]
+        let userModel = UserModel.shared().getModel()
+        if userModel?.uid == cmsMemberModel.uid {
+            let vc = UserPersonalCenterViewController()
+            vc.jumpModeType = .push
+            self.navigationController?.pushViewController(vc, animated: true)
+        }else {
+            let vc = OtherPersonalCenterViewController()
+            vc.uid = cmsMemberModel.uid ?? 0
+            self.navigationController?.pushViewController(vc, animated: true)
+        }
+    }
+    
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
         return 0
     }

+ 8 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/MyFollowAndFan/View/MyFollowAndFanHeaderView.swift

@@ -31,5 +31,13 @@ class MyFollowAndFanHeaderView: BaseView {
         titleLabel.attributedText = str.changeTextColor(rangStr: String("3511"), rangColor: kThemeColor)
         return titleLabel
     }()
+    
+    var userDetailModel : UserDetailModel? {
+        didSet {
+            let str = "已关注\(userDetailModel?.followCount ?? "0")位彩虹居民"
+            titleLabel.attributedText = str.changeTextColor(rangStr: userDetailModel?.followCount ?? "0", rangColor: kThemeColor)
+
+        }
+    }
 
 }

+ 148 - 13
RainbowPlanet/RainbowPlanet/Modules/MineModule/MyFollowAndFan/ViewController/MyFollowAndFanViewController.swift

@@ -15,7 +15,17 @@ enum MyFollowAndFanType {
 
 class MyFollowAndFanViewController: BaseViewController {
 
+    
+    /// 类型
     var myfollowAndFanType : MyFollowAndFanType?
+    /// 关注数组
+    var userFollowModels = Array<UserFollowModel>()
+    /// 粉丝数组
+    var userFanModels = Array<UserFanModel>()
+    /// 用户信息
+    var userDetailModel : UserDetailModel?
+    /// 默认图
+    var emptyView : DIYEmptyView?
     
     override func viewDidLoad() {
         super.viewDidLoad()
@@ -38,31 +48,28 @@ class MyFollowAndFanViewController: BaseViewController {
     
     override func setupData() {
         
-        var emptyView : DIYEmptyView?
-    
         if myfollowAndFanType == .follow {
             tableView.tableHeaderView = followHeaderView
-            emptyView = DIYEmptyView.emptyActionView(withImageStr: "default_page_fans", titleStr: nil, detailStr: "发布动态,让更多人去认识你", btnTitleStr: "发布动态") {
+            emptyView = DIYEmptyView.emptyActionView(withImageStr: "default_page_kept", titleStr: nil, detailStr: "关注其他彩虹居民后\n可以在这里浏览他们的美好瞬间!", btnTitleStr: "找朋友") {
                 [weak self] in
-                self?.tabBarController?.selectedIndex = 2
-                self?.navigationController?.popToRootViewController(animated: false)
+                
+                let vc = CommunityFindFriendsViewController()
+                self?.navigationController?.pushViewController(vc, animated: true)
                 
             }
             emptyView?.actionBtnHorizontalMargin = 58
             emptyView?.contentViewY = kScaleValue(value: 164)
-
+            
         }else if myfollowAndFanType == .fan {
             tableView.tableHeaderView = fanHeaderView
-            emptyView = DIYEmptyView.emptyActionView(withImageStr: "default_page_kept", titleStr: nil, detailStr: "关注其他彩虹居民后\n可以在这里浏览他们的美好瞬间!", btnTitleStr: "找朋友") {
+            emptyView = DIYEmptyView.emptyActionView(withImageStr: "default_page_fans", titleStr: nil, detailStr: "发布动态,让更多人去认识你", btnTitleStr: "发布动态") {
                 [weak self] in
-                
-                let vc = CommunityFindFriendsViewController()
-                self?.navigationController?.pushViewController(vc, animated: true)
+                self?.tabBarController?.selectedIndex = 2
+                self?.navigationController?.popToRootViewController(animated: false)
                 
             }
             emptyView?.actionBtnHorizontalMargin = 66
             emptyView?.contentViewY = kScaleValue(value: 151)
-
         }
         
         emptyView?.subViewMargin = 20
@@ -74,6 +81,17 @@ class MyFollowAndFanViewController: BaseViewController {
         tableView.ly_emptyView = emptyView
         tableView.ly_startLoading()
         
+        /// 上拉刷新
+        tableView.addHeaderWithHeader(withBeginRefresh: true, animation: false) {
+            [weak self]  (page) in
+            self?.userFollowsFans(page:page)
+        }
+        /// 下拉加载
+        tableView.addFooterWithWithHeader(withAutomaticallyRefresh: false) {
+            [weak self] (page) in
+            self?.userFollowsFans(page:page)
+        }
+        
     }
     
     private lazy var tableView: UITableView = {
@@ -89,6 +107,7 @@ class MyFollowAndFanViewController: BaseViewController {
     private lazy var followHeaderView: MyFollowAndFanHeaderView = {
         let followHeaderView = MyFollowAndFanHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 36))
         followHeaderView.titleLabel.isHidden = false
+        followHeaderView.userDetailModel = self.userDetailModel
         return followHeaderView
     }()
     
@@ -99,6 +118,83 @@ class MyFollowAndFanViewController: BaseViewController {
     }()
 }
 
+extension MyFollowAndFanViewController {
+    
+    
+    /// 获取关注列表 / 获取粉丝列表
+    ///
+    /// - Parameter page: 分页
+    func userFollowsFans(page:Int = 1) {
+        if myfollowAndFanType == .follow {
+            userFollows(page: page)
+            
+        }else if myfollowAndFanType == .fan {
+            userFans(page: page)
+        }
+    }
+    
+    /// 获取关注列表
+    func userFollows(page:Int = 1) {
+        SwiftMoyaNetWorkServiceUser.shared().userFollowsApi(uid: self.userDetailModel?.uid ?? 0, page: page) {[weak self] (userFollowsModel) -> (Void) in
+            let userFollowsModel = userFollowsModel as? UserFollowsModel
+            if userFollowsModel?.pagination?.currentPage ?? 1  <= userFollowsModel?.pagination?.totalPages ?? 1 {
+                if userFollowsModel?.pagination?.currentPage == 1{
+                    self?.userFollowModels.removeAll()
+                }
+                self?.userFollowModels = (self?.userFollowModels)! + (userFollowsModel?.data!)!
+                self?.tableView.reloadData()
+                if  self?.userFollowModels.count ?? 0 <= userFollowsModel?.pagination?.perPage ?? 0 {
+                    self?.tableView.isHiddenFooter(true)
+                }
+            }else {
+                self?.tableView.endFooterNoMoreData()
+            }
+        }
+    }
+    
+    /// 获取粉丝列表
+    func userFans(page:Int = 1) {
+        SwiftMoyaNetWorkServiceUser.shared().userFansApi(uid: self.userDetailModel?.uid ?? 0, page: page) {[weak self] (userFansModel) -> (Void) in
+            let userFansModel = userFansModel as? UserFansModel
+            if userFansModel?.pagination?.currentPage ?? 1  <= userFansModel?.pagination?.totalPages ?? 1 {
+                if userFansModel?.pagination?.currentPage == 1{
+                    self?.userFanModels.removeAll()
+                }
+                self?.userFanModels = (self?.userFanModels)! + (userFansModel?.data!)!
+                self?.tableView.reloadData()
+                if  self?.userFanModels.count ?? 0 <= userFansModel?.pagination?.perPage ?? 0 {
+                    self?.tableView.isHiddenFooter(true)
+                }
+            }else {
+                self?.tableView.endFooterNoMoreData()
+            }
+        }
+    }
+    
+    /// 关注
+    func userFollow(followUid:Int,completion: @escaping (Int) -> Void) {
+        SwiftMoyaNetWorkServiceUser.shared().userFollowApi(followUid: followUid) {[weak self] (data) -> (Void) in
+            self?.userFollowCheckStatus(followUid: followUid, uid: self?.userDetailModel?.uid ?? 0, completion: completion)
+        }
+    }
+    
+    /// 取消关注
+    func userCancelFollow(followUid:Int,completion: @escaping (Int) -> Void) {
+        SwiftMoyaNetWorkServiceUser.shared().userCancelFollowApi(followUid: followUid) {
+            [weak self] (data) -> (Void) in
+            self?.userFollowCheckStatus(followUid: followUid, uid: self?.userDetailModel?.uid ?? 0, completion: completion)
+        }
+    }
+    
+    /// 检查用户关注状态
+    func userFollowCheckStatus(followUid:Int,uid:Int,completion: @escaping (Int) -> Void) {
+        SwiftMoyaNetWorkServiceUser.shared().userFollowCheckStatus(followUid: followUid, uid: uid) {(isFollow) -> (Void) in
+            let isFollow = isFollow as? Int
+            completion(isFollow ?? 0)
+        }
+    }
+}
+
 // MARK: - tableView dataSource && delegate
 extension MyFollowAndFanViewController: UITableViewDataSource, UITableViewDelegate {
     
@@ -107,12 +203,51 @@ extension MyFollowAndFanViewController: UITableViewDataSource, UITableViewDelega
     }
     
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return 10
+        if myfollowAndFanType == .follow {
+            return userFollowModels.isEmpty ? 0 : userFollowModels.count
+            
+        }else if myfollowAndFanType == .fan {
+           return userFanModels.isEmpty ? 0 : userFanModels.count
+        }
+        return 0
     }
     
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = SearchUserLitTableViewCell.cellWith(tableView: tableView, indexPath: indexPath)
-        cell.followType = .alreadyFollow
+        if myfollowAndFanType == .follow {
+            cell.userFollowModel = userFollowModels[indexPath.row]
+        }else if myfollowAndFanType == .fan {
+            cell.userFanModel = userFanModels[indexPath.row]
+        }
+        cell.followButtonClosure = {
+            [weak self] in
+            if self?.myfollowAndFanType == .follow {
+                if cell.userFollowModel?.isFollowStatus == 0 { //加关注
+                    self?.userFollow(followUid: cell.userFollowModel?.followUid ?? 0, completion: { (isFollow) -> Void in
+                        cell.userFanModel?.isFollowStatus = isFollow
+                        self?.tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
+                    })
+                }else { //取消关注
+                    self?.userCancelFollow(followUid: cell.userFollowModel?.followUid ?? 0, completion: { (isFollow) -> Void in
+                        cell.userFanModel?.isFollowStatus = isFollow
+                        self?.tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
+                    })
+                }
+
+            }else if self?.myfollowAndFanType == .fan {
+                if cell.userFanModel?.isFollowStatus == 0 {//加关注
+                    self?.userFollow(followUid: cell.userFanModel?.fanUid ?? 0, completion: { (isFollow) -> Void in
+                        cell.userFanModel?.isFollowStatus = isFollow
+                        self?.tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
+                    })
+                }else {//取消关注
+                    self?.userCancelFollow(followUid: cell.userFanModel?.fanUid ?? 0, completion: { (isFollow) -> Void in
+                        cell.userFanModel?.isFollowStatus = isFollow
+                        self?.tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.none)
+                    })
+                }
+            }
+        }
         return cell
     }
     

+ 6 - 0
RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/OtherPersonalCenter/View/OtherPersonalCenterHeaderView/OtherPersonalCenterHeaderView.swift

@@ -29,4 +29,10 @@ class OtherPersonalCenterHeaderView: BaseView {
         return personViewUserAndOtherHeaderView
     }()
     
+    var userDetailModel: UserDetailModel? {
+        didSet {
+            personViewUserAndOtherHeaderView.userDetailModel = userDetailModel
+        }
+    }
+    
 }

+ 27 - 4
RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/OtherPersonalCenter/ViewController/OtherPersonalCenterViewController.swift

@@ -16,6 +16,8 @@ class OtherPersonalCenterViewController: BaseViewController {
     let JXheightForHeaderInSection: Int = 44
     var cmsTemplateTitles = ["发布 0", "收藏 0", "分享 0"]
     var otherPersonalCenterVCType : Int = 0
+    var uid : Int = 0
+    var userDetailModel : UserDetailModel?
     
     override func viewDidLoad() {
         super.viewDidLoad()
@@ -34,16 +36,17 @@ class OtherPersonalCenterViewController: BaseViewController {
     
     /// 设置navigationBar
     func setnavigationBar() {
+        navigationBar.wr_setLeftButton(image: kImage(name: "navbar_back_white")!)
         navigationBar.addSubview(navigationBgView)
         navigationBar.addSubview(avatarButton)
         navigationBar.addSubview(nameButton)
         navigationBar.insertSubview(navigationBgView, aboveSubview: navigationBar.backgroundImageView)
         navigationBar.backgroundImageView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenWidth)
         navigationBar.backgroundImageView.contentMode = .scaleAspectFill
-        navigationBar.clipsToBounds = true
+        navigationBar.layer.masksToBounds = true
         navigationBar.wr_setRightButton(image: kImage(name: "center_share")!)
         // 设置导航栏显示图片
-        navigationBar.barBackgroundImage = UIImage(named: "Rectangle 2")
+        navigationBar.barBackgroundImage = UIImage(named: "pic_preload")
         // 设置初始导航栏透明度
         navigationBar.wr_setBackgroundAlpha(alpha: 0)
         // 设置状态栏style
@@ -55,8 +58,7 @@ class OtherPersonalCenterViewController: BaseViewController {
             make.edges.equalToSuperview()
         }
         avatarButton.snp.makeConstraints { (make) in
-//            make.left.equalTo(navigationBar.snp_right).offset(8)
-            make.left.equalTo(8)
+            make.left.equalTo(navigationBar.leftButton.snp_right)
             make.size.equalTo(20)
             make.centerY.equalTo(navigationBar.rightButton)
         }
@@ -69,6 +71,8 @@ class OtherPersonalCenterViewController: BaseViewController {
     
     override func setupData() {
         reloadData()
+        // 获取用户信息
+        userMemberDetailApi()
     }
     
     
@@ -163,6 +167,22 @@ class OtherPersonalCenterViewController: BaseViewController {
     
 }
 
+extension OtherPersonalCenterViewController {
+    
+    /// 获取用户详情
+    func userMemberDetailApi() {
+        SwiftMoyaNetWorkServiceUser.shared().userMemberDetailApi(uid: uid ) {
+            [weak self] (userDetailModel) -> (Void) in
+            self?.userDetailModel = userDetailModel as? UserDetailModel
+            self?.otherHeaderView.userDetailModel = self?.userDetailModel
+            self?.navigationBar.backgroundImageView.kf.setImage(with: kURLImage(name: self?.userDetailModel?.backgroundImg ?? "pic_preload"), placeholder: kImage(name: "pic_preload"))
+            self?.avatarButton.kf.setImage(with: kURLImage(name: self?.userDetailModel?.avatar ?? ""), for: UIControl.State.normal, placeholder: kImage(name: "defaul_tavatar"))
+            self?.nameButton.setTitle(self?.userDetailModel?.username, for: UIControl.State.normal)
+            
+        }
+    }
+}
+
 extension OtherPersonalCenterViewController : JXSegmentedViewDelegate {
     //点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,而不关心具体是点击还是滚动选中的情况。
     func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
@@ -187,6 +207,7 @@ extension OtherPersonalCenterViewController : JXSegmentedViewDelegate {
     }
 }
 
+
 extension OtherPersonalCenterViewController: JXPagingViewDelegate {
     
     func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int {
@@ -226,12 +247,14 @@ extension OtherPersonalCenterViewController: JXPagingViewDelegate {
             avatarButton.alpha = alpha
             nameButton.alpha = alpha
             navigationBgView.alpha = alpha
+            otherHeaderView.alpha = 1 - alpha
             
         } else {
             navigationBar.wr_setBackgroundAlpha(alpha: 0)
             avatarButton.alpha = 0
             nameButton.alpha = 0
             navigationBgView.alpha = 0
+            otherHeaderView.alpha = 1
         }
     }
 }

+ 12 - 12
RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/PersonalCenterView/PersonViewUserAndOtherListView.swift

@@ -15,23 +15,23 @@ class PersonViewUserAndOtherListView: BaseView {
         listViewDidScrollCallback = nil
     }
     
-    var jumpModeType : JumpModeType? = JumpModeType.none
+    var jumpModeType : JumpModeType? {
+        didSet {
+            collectionView.snp_makeConstraints { (make) in
+                make.top.right.left.equalToSuperview()
+                if jumpModeType == JumpModeType.none {
+                    make.height.equalTo(kScreenHeight-kNavBarTotalHeight-kTabBarTotalHeight-44)
+                }else {
+                    make.height.equalTo(kScreenHeight-kNavBarTotalHeight-kSafeTabBarHeight-44)
+                }
+            }
+        }
+    }
     
     override func setupViews() {
         addSubview(collectionView)
     }
     
-    override func setupLayouts() {
-        collectionView.snp_makeConstraints { (make) in
-            make.top.right.left.equalToSuperview()
-            if jumpModeType == JumpModeType.none {
-                make.bottom.equalTo(-kTabBarTotalHeight)
-            }else {
-                make.bottom.equalToSuperview()
-            }
-        }
-    }
-    
     private lazy var collectionView: UICollectionView = {
         let collectionView = UICollectionView.init(frame: CGRect.zero, collectionViewLayout: collectionViewLayout)
         collectionView.backgroundColor = kf7f8faColor

+ 6 - 2
RainbowPlanet/RainbowPlanet/Modules/MineModule/PersonalCenter/UserPersonalCenter/ViewController/UserPersonalCenterViewController.swift

@@ -51,6 +51,9 @@ class UserPersonalCenterViewController: BaseViewController {
         navigationBar.backgroundImageView.frame = CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenWidth)
         navigationBar.backgroundImageView.contentMode = .scaleAspectFill
         navigationBar.clipsToBounds = true
+        if jumpModeType == JumpModeType.push {
+            navigationBar.wr_setLeftButton(image: kImage(name: "navbar_back_white")!)
+        }
         navigationBar.wr_setRightButton(image: kImage(name: "center_share")!)
         // 设置导航栏显示图片
         navigationBar.barBackgroundImage = UIImage(named: "pic_preload")
@@ -68,7 +71,7 @@ class UserPersonalCenterViewController: BaseViewController {
             if jumpModeType == JumpModeType.none {
                 make.left.equalTo(14)
             }else {
-                make.left.equalTo(navigationBar.snp_right).offset(8)
+                make.left.equalTo(navigationBar.leftButton.snp_right)
             }
             make.size.equalTo(20)
             make.centerY.equalTo(navigationBar.rightButton)
@@ -220,7 +223,8 @@ extension UserPersonalCenterViewController {
     
     /// 获取用户详情
     func userMemberDetailApi() {
-        SwiftMoyaNetWorkServiceUser.shared().userMemberDetailApi {
+        let userModel = UserModel.shared().getModel()
+        SwiftMoyaNetWorkServiceUser.shared().userMemberDetailApi(uid: userModel?.uid ?? 0) {
             [weak self] (userDetailModel) -> (Void) in
             self?.userDetailModel = userDetailModel as? UserDetailModel
             self?.userHeaderView.userDetailModel = self?.userDetailModel

+ 0 - 13
RainbowPlanet/RainbowPlanet/Modules/RegisterLoginModule/TopicSelection/ViewController/TopicSelectionModel.swift

@@ -1,13 +0,0 @@
-//
-//  TopicSelectionModel.swift
-//  RainbowPlanet
-//
-//  Created by 南鑫林 on 2019/6/11.
-//  Copyright © 2019 RainbowPlanet. All rights reserved.
-//
-
-import UIKit
-
-class TopicSelectionModel: NSObject {
-    var isSelected : Bool = false    
-}

+ 56 - 3
RainbowPlanet/RainbowPlanet/Modules/SearchModule/SearchUser/View/SearchUserLitTableViewCell.swift

@@ -38,7 +38,6 @@ class SearchUserLitTableViewCell: UITableViewCell {
     }
     //MRAK: - 设置View
     private func setupViews() {
-        self.selectionStyle = .none
         addSubview(avatarButton)
         addSubview(titleButton)
         addSubview(topicLabel)
@@ -72,7 +71,7 @@ class SearchUserLitTableViewCell: UITableViewCell {
         }
         lineLabel.snp_makeConstraints { (make) in
             make.bottom.equalToSuperview()
-            make.left.equalTo(-14)
+            make.left.equalTo(titleButton)
             make.right.equalToSuperview()
             make.height.equalTo(1)
         }
@@ -82,6 +81,7 @@ class SearchUserLitTableViewCell: UITableViewCell {
         let avatarButton = UIButton(type: UIButton.ButtonType.custom)
         avatarButton.setImage(kImage(name: "defaul_tavatar"), for: UIControl.State.normal)
         avatarButton.imageView?.contentMode = .scaleAspectFit
+        avatarButton.isUserInteractionEnabled = false
         avatarButton.cornerRadius = 22
         avatarButton.masksToBounds = true
         return avatarButton
@@ -93,6 +93,7 @@ class SearchUserLitTableViewCell: UITableViewCell {
         titleButton.setTitleColor(k333333Color, for: UIControl.State.normal)
         titleButton.titleLabel?.font = kBoldFont16
         titleButton.contentHorizontalAlignment = .left
+        titleButton.isUserInteractionEnabled = false
         titleButton.rx.tap.subscribe(onNext: { (data) in
             
         }).disposed(by: disposeBag)
@@ -107,6 +108,8 @@ class SearchUserLitTableViewCell: UITableViewCell {
         return topicLabel
     }()
     
+    typealias FollowButtonClosure = () -> Void
+    var followButtonClosure : FollowButtonClosure?
     private lazy var followButton: UIButton = {
         let followButton = UIButton(type: UIButton.ButtonType.custom)
         followButton.titleLabel?.font = kBoldFont13
@@ -114,7 +117,9 @@ class SearchUserLitTableViewCell: UITableViewCell {
         followButton.layer.masksToBounds = true
         followButton.layer.borderWidth = 1
         followButton.rx.tap.subscribe(onNext: {[weak self] (data) in
-            
+            if let followButtonClosure = self?.followButtonClosure {
+                followButtonClosure()
+            }
         }).disposed(by: disposeBag)
         return followButton
     }()
@@ -125,6 +130,54 @@ class SearchUserLitTableViewCell: UITableViewCell {
         return lineLabel
     }()
     
+    var userFollowModel: UserFollowModel? {
+        didSet {
+            followType = FollowType(rawValue: userFollowModel?.isFollowStatus ?? 0)
+            avatarButton.kf.setImage(with: kURLImage(name: userFollowModel?.followAvatar ?? ""), for: UIControl.State.normal, placeholder: kImage(name: "defaul_tavatar"))
+            titleButton.setTitle(userFollowModel?.followUsername, for: UIControl.State.normal)
+            var followTopic = Array<String>()
+            if !(userFollowModel?.followTopic?.isEmpty ?? true) {
+                for i in 0..<(userFollowModel?.followTopic?.count)! {
+                    followTopic.append("#\(userFollowModel?.followTopic![i] ?? "")")
+                }
+            }
+            let str = followTopic.joined(separator: " ")
+            topicLabel.text = str
+        }
+    }
+    
+    var userFanModel: UserFanModel? {
+        didSet {
+            followType = FollowType(rawValue: userFanModel?.isFollowStatus ?? 0)
+            avatarButton.kf.setImage(with: kURLImage(name: userFanModel?.fanAvatar ?? ""), for: UIControl.State.normal, placeholder: kImage(name: "defaul_tavatar"))
+            titleButton.setTitle(userFanModel?.fanUsername, for: UIControl.State.normal)
+            var followTopic = Array<String>()
+            if !(userFanModel?.fanTopic?.isEmpty ?? true) {
+                for i in 0..<(userFanModel?.fanTopic?.count)! {
+                    followTopic.append("#\(userFanModel?.fanTopic![i] ?? "")")
+                }
+            }
+            let str = followTopic.joined(separator: " ")
+            topicLabel.text = str
+        }
+    }
+    
+    var cmsMemberModel: CMSMemberModel? {
+        didSet {
+            followType = FollowType(rawValue: cmsMemberModel?.followStatus ?? 0)
+            avatarButton.kf.setImage(with: kURLImage(name: cmsMemberModel?.avatar ?? ""), for: UIControl.State.normal, placeholder: kImage(name: "defaul_tavatar"))
+            titleButton.setTitle(cmsMemberModel?.username, for: UIControl.State.normal)
+            var followTopic = Array<String>()
+            if !(cmsMemberModel?.followTopic?.isEmpty ?? true) {
+                for i in 0..<(cmsMemberModel?.followTopic?.count)! {
+                    followTopic.append("#\(cmsMemberModel?.followTopic![i] ?? "")")
+                }
+            }
+            let str = followTopic.joined(separator: " ")
+            topicLabel.text = str
+        }
+    }
+    
     var followType: FollowType! {
         didSet {
             switch followType {

+ 53 - 0
RainbowPlanet/RainbowPlanet/Service/Model/CMSModel/CMSMemberListModel.swift

@@ -0,0 +1,53 @@
+//
+//	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?
+    
+    
+    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"]
+        
+    }
+    
+}
+

+ 61 - 0
RainbowPlanet/RainbowPlanet/Service/Model/UserModel/UserFansModel.swift

@@ -0,0 +1,61 @@
+//
+//  UserFansModel.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/6/24.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+import ObjectMapper
+
+
+class UserFansModel : NSObject, Mappable{
+    
+    var data : [UserFanModel]?
+    var pagination : PaginationModel?
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return UserFansModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        data <- map["data"]
+        pagination <- map["pagination"]
+        
+    }
+    
+}
+
+class UserFanModel : NSObject, Mappable{
+    
+    var fanAvatar : String?
+    var fanTopic : [String]?
+    var fanUid : Int?
+    var fanUsername : String?
+    var id : Int?
+    var isFollowStatus : Int?
+    var uid : Int?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return UserFanModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        fanAvatar <- map["fans_avatar"]
+        fanTopic <- map["fans_topic"]
+        fanUid <- map["fans_uid"]
+        fanUsername <- map["fans_username"]
+        id <- map["id"]
+        isFollowStatus <- map["is_follow_status"]
+        uid <- map["uid"]
+        
+    }
+}

+ 58 - 0
RainbowPlanet/RainbowPlanet/Service/Model/UserModel/UserFollowsModel.swift

@@ -0,0 +1,58 @@
+//
+//	UserFollowsModel.swift
+//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport
+
+import Foundation 
+import ObjectMapper
+
+
+class UserFollowsModel : NSObject, Mappable{
+
+	var data : [UserFollowModel]?
+	var pagination : PaginationModel?
+
+	class func newInstance(map: Map) -> Mappable?{
+		return UserFollowsModel()
+	}
+	required init?(map: Map){}
+	private override init(){}
+
+	func mapping(map: Map)
+	{
+		data <- map["data"]
+		pagination <- map["pagination"]
+		
+	}
+
+}
+
+class UserFollowModel : NSObject, Mappable{
+    
+    var followAvatar : String?
+    var followTopic : [String]?
+    var followUid : Int?
+    var followUsername : String?
+    var id : Int?
+    var isFollowStatus : Int?
+    var uid : Int?
+    
+    
+    class func newInstance(map: Map) -> Mappable?{
+        return UserFollowModel()
+    }
+    required init?(map: Map){}
+    private override init(){}
+    
+    func mapping(map: Map)
+    {
+        followAvatar <- map["follow_avatar"]
+        followTopic <- map["follow_topic"]
+        followUid <- map["follow_uid"]
+        followUsername <- map["follow_username"]
+        id <- map["id"]
+        isFollowStatus <- map["is_follow_status"]
+        uid <- map["uid"]
+        
+    }
+}
+

+ 20 - 0
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceCMS/SwiftMoyaNetWorkServiceCMS.swift

@@ -72,4 +72,24 @@ class SwiftMoyaNetWorkServiceCMS: NSObject {
             completion(productSearchModels)
         }
     }
+    
+    /// 默认推荐用户组
+    ///
+    /// - Parameters:
+    ///   - take_count: take_count
+    ///   - completion: completion description
+    func cmsMemberListApi(takeCount:Int = 0,completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        if takeCount == 0 {
+            parameters.updateValue("", forKey: "take_count")
+        }else {
+            parameters.updateValue(takeCount, forKey: "take_count")
+        }
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared.requestObject(CMSMemberListModel.self,target: MultiTarget(SwiftMoyaServiceCMSApi.cmsMemberList(parameters: parameters))) {
+            (cmsMemberListModel) in
+            SwiftProgressHUD.shared().hide()
+            completion(cmsMemberListModel)
+        }
+    }
 }

+ 16 - 4
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceCMS/SwiftMoyaServiceCMSApi.swift

@@ -22,16 +22,22 @@ public let kCMSTemplateSetPreviewApi = "/cms/templateSet/preview"
 /// 获取商品列表
 public let kCMSTemplateSetProductListApi = "/cms/templateSet/productList"
 
+// MARK: - 默认推荐用户组
+/// 默认推荐用户组
+public let kCMSMemberListApi = "/cms/v2/memberList"
+
 
 /// CMS
 ///
 /// - configTemplateSetTemplateName: 获取模板名称
 /// - configTemplateSetPreview: 获取首页
 /// - configTemplateSetProductList: 获取商品列表
+/// - cmsMemberList: 默认推荐用户组
 public enum SwiftMoyaServiceCMSApi {
     case cmsTemplateSetTemplateName(parameters:Dictionary<String, Any>)
     case cmsTemplateSetPreview(parameters:Dictionary<String, Any>)
     case cmsTemplateSetProductList(parameters:Dictionary<String, Any>)
+    case cmsMemberList(parameters:Dictionary<String, Any>)
 }
 
 extension SwiftMoyaServiceCMSApi: TargetType {
@@ -40,7 +46,8 @@ extension SwiftMoyaServiceCMSApi: TargetType {
         switch self {
         case .cmsTemplateSetTemplateName,
              .cmsTemplateSetPreview,
-             .cmsTemplateSetProductList
+             .cmsTemplateSetProductList,
+             .cmsMemberList
             :
             return URL(string: kApiDataPrefix())!
         }
@@ -54,6 +61,8 @@ extension SwiftMoyaServiceCMSApi: TargetType {
             return kCMSTemplateSetPreviewApi
         case .cmsTemplateSetProductList:
             return kCMSTemplateSetProductListApi
+        case .cmsMemberList:
+            return kCMSMemberListApi
         }
     }
     
@@ -63,7 +72,8 @@ extension SwiftMoyaServiceCMSApi: TargetType {
             :
             return .post
         case .cmsTemplateSetTemplateName,
-             .cmsTemplateSetProductList
+             .cmsTemplateSetProductList,
+             .cmsMemberList
             :
             return .get
         }
@@ -74,7 +84,8 @@ extension SwiftMoyaServiceCMSApi: TargetType {
         switch self {
         case .cmsTemplateSetTemplateName(var parameters),
              .cmsTemplateSetPreview(var parameters),
-             .cmsTemplateSetProductList(var parameters)
+             .cmsTemplateSetProductList(var parameters),
+             .cmsMemberList(var parameters)
             :
             let sign = SwiftSign.shared().sign(signType:.AccessToken, parameters: parameters)
             parameters.updateValue(sign, forKey: "sign")
@@ -99,7 +110,8 @@ extension SwiftMoyaServiceCMSApi: TargetType {
         switch self {
         case .cmsTemplateSetTemplateName,
              .cmsTemplateSetPreview,
-             .cmsTemplateSetProductList
+             .cmsTemplateSetProductList,
+             .cmsMemberList
             :
             return (headerParameters(headerType: .tokenHeader) as! [String : String])
         }

+ 84 - 2
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceUser/SwiftMoyaNetWorkServiceUser.swift

@@ -551,8 +551,9 @@ public class SwiftMoyaNetWorkServiceUser: NSObject {
     /// 用户信息详情
     ///
     /// - Parameter completion: 回调UserDetailModel
-    func userMemberDetailApi(completion: @escaping apiCallBack) {
-        let parameters = Dictionary<String,Any>()
+    func userMemberDetailApi(uid:Int,completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(uid, forKey: "uid")
         SwiftProgressHUD.shared().showWait()
         SwiftMoyaNetWorkManager.shared.requestObject(UserDetailModel.self, target: MultiTarget(SwiftMoyaServiceUserApi.userMemberDetail(parameters: parameters))) { (userDetailModel) in
             SwiftProgressHUD.shared().hide()
@@ -586,5 +587,86 @@ public class SwiftMoyaNetWorkServiceUser: NSObject {
             completion("")
         }
     }
+    
+    // MARK: - 用户关注列表
+    /// 用户关注列表
+    ///
+    /// - Parameter completion: 回调UserDetailModel
+    func userFollowsApi(uid:Int,page:Int = 1,completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(uid, forKey: "uid")
+        parameters.updateValue(page, forKey: "page")
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared.requestObject(UserFollowsModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userFollows(parameters: parameters))) { (userFollowsModel) in
+            SwiftProgressHUD.shared().hide()
+            completion(userFollowsModel)
+        }
+    }
+    
+    // MARK: - 粉丝列表
+    /// 粉丝列表
+    ///
+    /// - Parameter completion: 回调UserDetailModel
+    func userFansApi(uid:Int,page:Int = 1,completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(page, forKey: "page")
+        parameters.updateValue(uid, forKey: "uid")
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared.requestObject(UserFansModel.self,target: MultiTarget(SwiftMoyaServiceUserApi.userFans(parameters: parameters))) { (userFansModel) in
+            SwiftProgressHUD.shared().hide()
+            completion(userFansModel)
+        }
+    }
+    
+    // MARK: - 关注
+    /// 关注
+    ///
+    /// - Parameters:
+    ///   - followUid: 被关注人id
+    ///   - completion: 回调
+    func userFollowApi(followUid:Int,completion: @escaping apiCallBack) {
+    
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(followUid, forKey: "follow_uid")
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared.requestAny(target: MultiTarget(SwiftMoyaServiceUserApi.userFollow(parameters: parameters))) { (data) in
+            SwiftProgressHUD.shared().showText("已关注")
+            completion("")
+        }
+    }
+    
+    // MARK: - 取消关注
+    /// 取消关注
+    ///
+    /// - Parameters:
+    ///   - followUid: 被取消关注人id
+    ///   - completion: 回调
+    func userCancelFollowApi(followUid:Int,completion: @escaping apiCallBack) {
+        
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(followUid, forKey: "follow_uid")
+        SwiftProgressHUD.shared().showWait()
+        SwiftMoyaNetWorkManager.shared.requestAny(target: MultiTarget(SwiftMoyaServiceUserApi.userCancelFollow(parameters: parameters))) { (data) in
+            SwiftProgressHUD.shared().showText("已取消关注")
+            completion("")
+        }
+    }
+    
+    
+    /// 检查用户关注状态
+    ///
+    /// - Parameters:
+    ///   - followUid: 被关注人id
+    ///   - uid: 用户Id
+    ///   - completion: 回调
+    func userFollowCheckStatus(followUid:Int,uid:Int,completion: @escaping apiCallBack) {
+        var parameters = Dictionary<String,Any>()
+        parameters.updateValue(followUid, forKey: "follow_uid")
+        parameters.updateValue(uid, forKey: "uid")
+        SwiftMoyaNetWorkManager.shared.requestAny(target: MultiTarget(SwiftMoyaServiceUserApi.userFollowCheckStatus(parameters: parameters))) { (data) in
+            NXLLog(data)
+            completion(data)
+        }
+    }
 
 }

+ 69 - 6
RainbowPlanet/RainbowPlanet/Service/SwiftMoyaService/SwiftMoyaServiceApi/SwiftMoyaServiceUser/SwiftMoyaServiceUserApi.swift

@@ -109,6 +109,26 @@ public let kUserMemberDetailApi = "/user/v2/member"
 /// 修改用户头像昵称签名
 public let kUserMemberDetailUpDateApi = "/user/v2/member"
 
+// MARK: - 关注列表
+/// 关注列表
+public let kUserFollowsApi = "/user/v2/follow"
+
+// MARK: - 粉丝列表
+/// 粉丝列表
+public let kUserFansApi = "/user/v2/follow/fans"
+
+// MARK: - 关注
+/// 关注
+public let kUserFollowApi = "/user/v2/follow"
+
+// MARK: - 取消关注
+/// 取消关注
+public let kUserCancelFollowApi = "/user/v2/follow/cancelFollow"
+
+// MARK: - 检查用户关注状态
+/// 检查用户关注状态
+public let kUserFollowCheckStatusApi = "/user/v2/follow/checkStatus"
+
 /// 用户
 ///
 /// - userLogout: 登出
@@ -133,6 +153,14 @@ public let kUserMemberDetailUpDateApi = "/user/v2/member"
 /// - userSetExpreesContactsDefault: 自提点收货人信息,设置默认
 /// - userSetExpreesContactsDefault: 新增自提地址
 /// - userSetDeliverType: 设置用户配送方式
+/// - userMemberUpdateGender: 设置用户性别
+/// - userMemberDetail: 用户详情
+/// - userMemberDetailUpDate: 更新用户信息
+/// - userFollow: 关注列表
+/// - userFans: 粉丝列表
+/// - userFollowUpdate: 关注用户
+/// - userCancelFollow: 取消关注
+/// - userFollowCheckStatus: 检查用户关注状态
 public enum SwiftMoyaServiceUserApi {
     case userLogout(parameters:Dictionary<String, Any>)
     case userRefresh(parameters:Dictionary<String, Any>)
@@ -159,6 +187,11 @@ public enum SwiftMoyaServiceUserApi {
     case userMemberUpdateGender(parameters:Dictionary<String, Any>)
     case userMemberDetail(parameters:Dictionary<String, Any>)
     case userMemberDetailUpDate(parameters:Dictionary<String, Any>)
+    case userFollows(parameters:Dictionary<String, Any>)
+    case userFans(parameters:Dictionary<String, Any>)
+    case userFollow(parameters:Dictionary<String, Any>)
+    case userCancelFollow(parameters:Dictionary<String, Any>)
+    case userFollowCheckStatus(parameters:Dictionary<String, Any>)
     
 }
 
@@ -190,7 +223,12 @@ extension SwiftMoyaServiceUserApi: TargetType {
              .userSetDeliverType,
              .userMemberUpdateGender,
              .userMemberDetail,
-             .userMemberDetailUpDate
+             .userMemberDetailUpDate,
+             .userFollows,
+             .userFans,
+             .userFollow,
+             .userCancelFollow,
+             .userFollowCheckStatus
             :
             return URL(string: kApiDataPrefix())!
         }
@@ -248,6 +286,16 @@ extension SwiftMoyaServiceUserApi: TargetType {
             return kUserMemberDetailApi
         case .userMemberDetailUpDate:
             return kUserMemberDetailUpDateApi
+        case .userFollows:
+            return kUserFollowsApi
+        case .userFans:
+            return kUserFansApi
+        case .userFollow:
+            return kUserFollowApi
+        case .userCancelFollow:
+            return kUserCancelFollowApi
+        case .userFollowCheckStatus:
+            return kUserFollowCheckStatusApi
         }
     }
 
@@ -265,21 +313,26 @@ extension SwiftMoyaServiceUserApi: TargetType {
              .userIsBindWeixin,
              .userAddExpressAddress,
              .userSaveExpreesContacts,
-             .userAddSelfAddress
+             .userAddSelfAddress,
+             .userFollow
             :
             return .post
         case .userAddressIsDefault,
              .userSetDeliverType,
              .userSetExpreesContactsDefault,
              .userMemberUpdateGender,
-             .userMemberDetailUpDate
+             .userMemberDetailUpDate,
+             .userCancelFollow
             :
             return .put
         case .userSelfAddressList,
              .userExpreesContactsList,
              .userDefaultExpress,
              .userDefaultContact,
-             .userMemberDetail
+             .userMemberDetail,
+             .userFollows,
+             .userFans,
+             .userFollowCheckStatus
             :
             return .get
         case .userAddressDelete,
@@ -318,7 +371,12 @@ extension SwiftMoyaServiceUserApi: TargetType {
              .userSetDeliverType(var parameters),
              .userMemberUpdateGender(var parameters),
              .userMemberDetail(var parameters),
-             .userMemberDetailUpDate(var parameters)
+             .userMemberDetailUpDate(var parameters),
+             .userFollows(var parameters),
+             .userFans(var parameters),
+             .userFollow(var parameters),
+             .userCancelFollow(var parameters),
+             .userFollowCheckStatus(var parameters)
             :
             let sign = SwiftSign.shared().sign(signType:.AccessToken, parameters: parameters)
             parameters.updateValue(sign, forKey: "sign")
@@ -365,7 +423,12 @@ extension SwiftMoyaServiceUserApi: TargetType {
              .userSetDeliverType,
              .userMemberUpdateGender,
              .userMemberDetail,
-             .userMemberDetailUpDate
+             .userMemberDetailUpDate,
+             .userFollows,
+             .userFans,
+             .userFollow,
+             .userCancelFollow,
+             .userFollowCheckStatus
             :
             return (headerParameters(headerType: .tokenHeader) as! [String : String])
         case .userLogout,