class="del" data-line="2">2   PaiAi/Paiai_iOS/App/LoginViewController.swift
  • 2 2
      PaiAi/Paiai_iOS/App/Message/MessageCommentAndThumbupCell.swift
  • 22 15
      PaiAi/Paiai_iOS/App/Message/MessageCoordinator.swift
  • 8 2
      PaiAi/Paiai_iOS/App/Message/MessageListViewController.swift
  • 2 2
      PaiAi/Paiai_iOS/App/Message/MessageSystemCell.swift
  • 10 3
      PaiAi/Paiai_iOS/App/Message/MessageViewController.swift
  • 2 2
      PaiAi/Paiai_iOS/App/Mine/GroupCell.swift
  • 15 2
      PaiAi/Paiai_iOS/App/Mine/MineAboutViewController.swift
  • 36 23
      PaiAi/Paiai_iOS/App/Mine/MineCoordinator.swift
  • 14 2
      PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift
  • 8 2
      PaiAi/Paiai_iOS/App/Mine/MineGroupViewController.swift
  • 8 2
      PaiAi/Paiai_iOS/App/Mine/MineOrderViewController.swift
  • 12 6
      PaiAi/Paiai_iOS/App/Mine/MineViewController.swift
  • 2 2
      PaiAi/Paiai_iOS/App/Mine/OrderCell.swift
  • 2 3
      PaiAi/Paiai_iOS/App/PhotoCell.swift
  • 2 2
      PaiAi/Paiai_iOS/App/PhotoDetail/ImageCell.swift
  • 2 2
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCommentCell.swift
  • 13 14
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCoordinator.swift
  • 2 2
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailImageCell.swift
  • 13 7
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailViewController.swift
  • 8 2
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoPreviewViewController.swift
  • 2 2
      PaiAi/Paiai_iOS/App/PhotoDetail/ShareController.swift
  • 2 2
      PaiAi/Paiai_iOS/Paiai_iOS.h
  • 41 0
      PaiAi/Paiai_iOS/Reusable/BaseCoordinator.swift
  • 2 2
      PaiAi/Paiai_iOS/Reusable/Extension/UIImageView+Kingfisher.swift
  • 11 0
      PaiAi/Paiai_iOS/Reusable/NavigationSource.swift
  • BIN
    .DS_Store


    BIN
    PaiAi/.DS_Store


    + 63 - 11
    PaiAi/Paiai.xcodeproj/project.pbxproj

    @@ -8,7 +8,7 @@
    8 8
     
    9 9
     /* Begin PBXBuildFile section */
    10 10
     		0500C25E21E72E45009A7013 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 05E80E2F21DF65D4006368C4 /* Assets.xcassets */; };
    11
    -		0500C26521E8644E009A7013 /* NavigationBackItemDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0500C26421E8644E009A7013 /* NavigationBackItemDelegate.swift */; };
    11
    +		0500C26521E8644E009A7013 /* NavigationBackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0500C26421E8644E009A7013 /* NavigationBackViewController.swift */; };
    12 12
     		0505ACF921DF104500404071 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0505ACF821DF104500404071 /* SystemConfiguration.framework */; };
    13 13
     		0505ACFB21DF106000404071 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0505ACFA21DF106000404071 /* libsqlite3.0.tbd */; };
    14 14
     		0505ACFD21DF106F00404071 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0505ACFC21DF106E00404071 /* libc++.tbd */; };
    @@ -166,6 +166,8 @@
    166 166
     		051310B621CB675A004EF1BE /* UIImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543276621C68C3300C6388D /* UIImageView+Kingfisher.swift */; };
    167 167
     		051310B821CB6958004EF1BE /* UserInfoStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051310B721CB6958004EF1BE /* UserInfoStore.swift */; };
    168 168
     		051310C021CB6EF4004EF1BE /* UserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051310BF21CB6EF4004EF1BE /* UserInfo.swift */; };
    169
    +		051FA6692276FA4300A5ECC2 /* BaseCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051FA6682276FA4300A5ECC2 /* BaseCoordinator.swift */; };
    170
    +		051FA66C2277F03700A5ECC2 /* LoginCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051FA66B2277F03700A5ECC2 /* LoginCoordinator.swift */; };
    169 171
     		052BF1C821E344020010D270 /* PullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052BF1C721E344020010D270 /* PullToRefresh.framework */; };
    170 172
     		052BF1C921E344280010D270 /* PullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052BF1C721E344020010D270 /* PullToRefresh.framework */; };
    171 173
     		0530951B221AB3EC00408D34 /* GroupDetailMemeberView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0530951A221AB3EC00408D34 /* GroupDetailMemeberView.swift */; };
    @@ -209,7 +211,6 @@
    209 211
     		0584FD7C21FABC1400FA1E3E /* PresentExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */; };
    210 212
     		0584FD7E21FABD9D00FA1E3E /* PresentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */; };
    211 213
     		058C33EE2272F7BE00A435E9 /* UINavigationController+NavigationBack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058C33ED2272F7BE00A435E9 /* UINavigationController+NavigationBack.swift */; };
    212
    -		058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */; };
    213 214
     		058D0CA02249FCF6006CA488 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126A21F5696E00A64893 /* Toast.swift */; };
    214 215
     		058D0CA12249FCF6006CA488 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0521145321F083F20047C55A /* ToastView.swift */; };
    215 216
     		058D0CA22249FCF6006CA488 /* ToastOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126821F171C500A64893 /* ToastOption.swift */; };
    @@ -245,6 +246,12 @@
    245 246
     		05C8D21B21ED9A020001E847 /* UIViewController+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D21A21ED9A020001E847 /* UIViewController+Navigation.swift */; };
    246 247
     		05C8D22921EF0A9F0001E847 /* NavigationControllerProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22821EF0A9F0001E847 /* NavigationControllerProxy.swift */; };
    247 248
     		05C8D22B21EF0EDC0001E847 /* NavigationControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C8D22A21EF0EDC0001E847 /* NavigationControllerDelegate.swift */; };
    249
    +		05D269E6227ED9980030062C /* NavigationSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D269E5227ED9970030062C /* NavigationSource.swift */; };
    250
    +		05D269E9227EDFA10030062C /* Array+GroupItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D269E8227EDFA10030062C /* Array+GroupItem.swift */; };
    251
    +		05D269EB227EDFB00030062C /* Array+PhotoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D269EA227EDFB00030062C /* Array+PhotoItem.swift */; };
    252
    +		05D269EE227EE0EB0030062C /* GroupItemsOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D269ED227EE0EB0030062C /* GroupItemsOperator.swift */; };
    253
    +		05D269F0227EE0FC0030062C /* PhotoItemsOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D269EF227EE0FC0030062C /* PhotoItemsOperator.swift */; };
    254
    +		05D269F6227EE7F40030062C /* ItemOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D269F5227EE7F40030062C /* ItemOperator.swift */; };
    248 255
     		05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3C521FF010900A29A20 /* WebViewController.swift */; };
    249 256
     		05D3A3CD22000C3A00A29A20 /* GroupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3CC22000C3900A29A20 /* GroupCoordinator.swift */; };
    250 257
     		05D3A3D02200288400A29A20 /* Storyboarded.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D3A3CF2200288400A29A20 /* Storyboarded.swift */; };
    @@ -319,7 +326,7 @@
    319 326
     
    320 327
     /* Begin PBXFileReference section */
    321 328
     		045F01541DED33DC00B80C87 /* Paiai.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Paiai.entitlements; sourceTree = "<group>"; };
    322
    -		0500C26421E8644E009A7013 /* NavigationBackItemDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBackItemDelegate.swift; sourceTree = "<group>"; };
    329
    +		0500C26421E8644E009A7013 /* NavigationBackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBackViewController.swift; sourceTree = "<group>"; };
    323 330
     		0505ACF821DF104500404071 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
    324 331
     		0505ACFA21DF106000404071 /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; };
    325 332
     		0505ACFC21DF106E00404071 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
    @@ -395,6 +402,8 @@
    395 402
     		051310B321CB5EC3004EF1BE /* Kingfisher.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kingfisher.framework; path = Carthage/Build/iOS/Kingfisher.framework; sourceTree = "<group>"; };
    396 403
     		051310B721CB6958004EF1BE /* UserInfoStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoStore.swift; sourceTree = "<group>"; };
    397 404
     		051310BF21CB6EF4004EF1BE /* UserInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfo.swift; sourceTree = "<group>"; };
    405
    +		051FA6682276FA4300A5ECC2 /* BaseCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseCoordinator.swift; sourceTree = "<group>"; };
    406
    +		051FA66B2277F03700A5ECC2 /* LoginCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginCoordinator.swift; sourceTree = "<group>"; };
    398 407
     		0521144521EF38B60047C55A /* PaiaiDataKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaiaiDataKitTests.swift; sourceTree = "<group>"; };
    399 408
     		0521144721EF38B60047C55A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
    400 409
     		0521145321F083F20047C55A /* ToastView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToastView.swift; sourceTree = "<group>"; };
    @@ -464,7 +473,6 @@
    464 473
     		0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentExtension.swift; sourceTree = "<group>"; };
    465 474
     		0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentViewController.swift; sourceTree = "<group>"; };
    466 475
     		058C33ED2272F7BE00A435E9 /* UINavigationController+NavigationBack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController+NavigationBack.swift"; sourceTree = "<group>"; };
    467
    -		058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatorKey.swift; sourceTree = "<group>"; };
    468 476
     		0594845721B528FE00074EFC /* Interfaces.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interfaces.swift; sourceTree = "<group>"; };
    469 477
     		059AA5D921BA1A2000485188 /* MessageCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageCoordinator.swift; sourceTree = "<group>"; };
    470 478
     		059AA62821BA855000485188 /* MessageRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageRepository.swift; sourceTree = "<group>"; };
    @@ -500,6 +508,12 @@
    500 508
     		05C8D21A21ED9A020001E847 /* UIViewController+Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Navigation.swift"; sourceTree = "<group>"; };
    501 509
     		05C8D22821EF0A9F0001E847 /* NavigationControllerProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerProxy.swift; sourceTree = "<group>"; };
    502 510
     		05C8D22A21EF0EDC0001E847 /* NavigationControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationControllerDelegate.swift; sourceTree = "<group>"; };
    511
    +		05D269E5227ED9970030062C /* NavigationSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationSource.swift; sourceTree = "<group>"; };
    512
    +		05D269E8227EDFA10030062C /* Array+GroupItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+GroupItem.swift"; sourceTree = "<group>"; };
    513
    +		05D269EA227EDFB00030062C /* Array+PhotoItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+PhotoItem.swift"; sourceTree = "<group>"; };
    514
    +		05D269ED227EE0EB0030062C /* GroupItemsOperator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupItemsOperator.swift; sourceTree = "<group>"; };
    515
    +		05D269EF227EE0FC0030062C /* PhotoItemsOperator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoItemsOperator.swift; sourceTree = "<group>"; };
    516
    +		05D269F5227EE7F40030062C /* ItemOperator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemOperator.swift; sourceTree = "<group>"; };
    503 517
     		05D3A3C521FF010900A29A20 /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = "<group>"; };
    504 518
     		05D3A3CC22000C3900A29A20 /* GroupCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupCoordinator.swift; sourceTree = "<group>"; };
    505 519
     		05D3A3CF2200288400A29A20 /* Storyboarded.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Storyboarded.swift; sourceTree = "<group>"; };
    @@ -738,9 +752,10 @@
    738 752
     		05130F8821C9E11F004EF1BE /* PresentLayer */ = {
    739 753
     			isa = PBXGroup;
    740 754
     			children = (
    755
    +				05D269EC227EE0D60030062C /* Reusable */,
    741 756
     				0543E7F321CB911200A42807 /* UserInfoViewModel.swift */,
    742
    -				05D3A3CB21FFFA3500A29A20 /* Group */,
    743 757
     				0543E80121D0CD9900A42807 /* Home */,
    758
    +				05D3A3CB21FFFA3500A29A20 /* Group */,
    744 759
     				0543E80321D0CD9E00A42807 /* Message */,
    745 760
     				0543E80221D0CD9C00A42807 /* Mine */,
    746 761
     				0543E80521D0CDDA00A42807 /* PhotoDetail */,
    @@ -762,7 +777,6 @@
    762 777
     		05130FAD21C9E68A004EF1BE /* Model */ = {
    763 778
     			isa = PBXGroup;
    764 779
     			children = (
    765
    -				05C71C0721DDBD55003E7CEE /* JSONCode.swift */,
    766 780
     				051310BF21CB6EF4004EF1BE /* UserInfo.swift */,
    767 781
     				05468AF11F8B73A000B8F469 /* PhotoItem.swift */,
    768 782
     				05130FAF21C9E6CD004EF1BE /* OrderItem.swift */,
    @@ -794,6 +808,8 @@
    794 808
     		05130FB121C9E703004EF1BE /* Reusable */ = {
    795 809
     			isa = PBXGroup;
    796 810
     			children = (
    811
    +				05D269E7227EDF490030062C /* ModelExtension */,
    812
    +				05C71C0721DDBD55003E7CEE /* JSONCode.swift */,
    797 813
     				057CA9CF21DDB7DD00FB7D03 /* NetworkArrayData.swift */,
    798 814
     				0506441E1F8D09C00035857E /* StatusModel.swift */,
    799 815
     				0540C8B21F8CA07E0044FCC5 /* FileModel.swift */,
    @@ -814,12 +830,11 @@
    814 830
     		05130FBA21C9EE82004EF1BE /* App */ = {
    815 831
     			isa = PBXGroup;
    816 832
     			children = (
    817
    -				058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */,
    818 833
     				050E210F21B8CE8A008E1352 /* AppCoordinator.swift */,
    819 834
     				05087F6721B8F9530024A117 /* ContainerViewController.swift */,
    820
    -				A69FFA791E7002970006FEE0 /* LoginViewController.swift */,
    821 835
     				054863661FA326CB00A39DA0 /* PhotoCell.swift */,
    822 836
     				054863671FA326CB00A39DA0 /* PhotoCell.xib */,
    837
    +				051FA66A2277F02100A5ECC2 /* Login */,
    823 838
     				05D790AD1FC50E7C00469AD1 /* Home */,
    824 839
     				05D790AF1FC50E7C00469AD1 /* Group */,
    825 840
     				05D790AA1FC50E7C00469AD1 /* Message */,
    @@ -848,6 +863,8 @@
    848 863
     		051310B121CB3FCF004EF1BE /* Reusable */ = {
    849 864
     			isa = PBXGroup;
    850 865
     			children = (
    866
    +				051FA6682276FA4300A5ECC2 /* BaseCoordinator.swift */,
    867
    +				05D269E5227ED9970030062C /* NavigationSource.swift */,
    851 868
     				051310B221CB3FEC004EF1BE /* Extension */,
    852 869
     			);
    853 870
     			path = Reusable;
    @@ -861,6 +878,15 @@
    861 878
     			path = Extension;
    862 879
     			sourceTree = "<group>";
    863 880
     		};
    881
    +		051FA66A2277F02100A5ECC2 /* Login */ = {
    882
    +			isa = PBXGroup;
    883
    +			children = (
    884
    +				051FA66B2277F03700A5ECC2 /* LoginCoordinator.swift */,
    885
    +				A69FFA791E7002970006FEE0 /* LoginViewController.swift */,
    886
    +			);
    887
    +			path = Login;
    888
    +			sourceTree = "<group>";
    889
    +		};
    864 890
     		0521144421EF38B60047C55A /* PaiaiDataKitTests */ = {
    865 891
     			isa = PBXGroup;
    866 892
     			children = (
    @@ -1047,7 +1073,7 @@
    1047 1073
     		058C33EC2272F79800A435E9 /* NavigationBack */ = {
    1048 1074
     			isa = PBXGroup;
    1049 1075
     			children = (
    1050
    -				0500C26421E8644E009A7013 /* NavigationBackItemDelegate.swift */,
    1076
    +				0500C26421E8644E009A7013 /* NavigationBackViewController.swift */,
    1051 1077
     				058C33ED2272F7BE00A435E9 /* UINavigationController+NavigationBack.swift */,
    1052 1078
     			);
    1053 1079
     			path = NavigationBack;
    @@ -1150,6 +1176,25 @@
    1150 1176
     			path = NavigationControllerDelegate;
    1151 1177
     			sourceTree = "<group>";
    1152 1178
     		};
    1179
    +		05D269E7227EDF490030062C /* ModelExtension */ = {
    1180
    +			isa = PBXGroup;
    1181
    +			children = (
    1182
    +				05D269E8227EDFA10030062C /* Array+GroupItem.swift */,
    1183
    +				05D269EA227EDFB00030062C /* Array+PhotoItem.swift */,
    1184
    +			);
    1185
    +			path = ModelExtension;
    1186
    +			sourceTree = "<group>";
    1187
    +		};
    1188
    +		05D269EC227EE0D60030062C /* Reusable */ = {
    1189
    +			isa = PBXGroup;
    1190
    +			children = (
    1191
    +				05D269ED227EE0EB0030062C /* GroupItemsOperator.swift */,
    1192
    +				05D269EF227EE0FC0030062C /* PhotoItemsOperator.swift */,
    1193
    +				05D269F5227EE7F40030062C /* ItemOperator.swift */,
    1194
    +			);
    1195
    +			path = Reusable;
    1196
    +			sourceTree = "<group>";
    1197
    +		};
    1153 1198
     		05D3A3CB21FFFA3500A29A20 /* Group */ = {
    1154 1199
     			isa = PBXGroup;
    1155 1200
     			children = (
    @@ -1620,7 +1665,7 @@
    1620 1665
     				0513100221CA1B39004EF1BE /* CGSizeExt.swift in Sources */,
    1621 1666
     				0513109A21CA3915004EF1BE /* QRCodeScanView.swift in Sources */,
    1622 1667
     				05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */,
    1623
    -				0500C26521E8644E009A7013 /* NavigationBackItemDelegate.swift in Sources */,
    1668
    +				0500C26521E8644E009A7013 /* NavigationBackViewController.swift in Sources */,
    1624 1669
     				057317A221F5C6A0009B2FCE /* BottomDefaultItem.swift in Sources */,
    1625 1670
     				0513106021CA1E53004EF1BE /* UIStoryboardExt.swift in Sources */,
    1626 1671
     				059B58A821F83B1600FA64C2 /* CenterCancelItem.swift in Sources */,
    @@ -1702,9 +1747,11 @@
    1702 1747
     				05C0D9A421D28591000B7B2A /* UserInfoRemoteAPI.swift in Sources */,
    1703 1748
     				0513102B21CA1B67004EF1BE /* HomeRepository.swift in Sources */,
    1704 1749
     				0535D6D921D32A89008D9403 /* WXUserInfoRemoteAPI.swift in Sources */,
    1750
    +				05D269F0227EE0FC0030062C /* PhotoItemsOperator.swift in Sources */,
    1705 1751
     				0513102C21CA1B67004EF1BE /* OrderRepository.swift in Sources */,
    1706 1752
     				057CA9BA21DC836B00FB7D03 /* GroupPhotoRemoteAPI.swift in Sources */,
    1707 1753
     				0513102D21CA1B67004EF1BE /* GroupPhotoRepository.swift in Sources */,
    1754
    +				05D269E9227EDFA10030062C /* Array+GroupItem.swift in Sources */,
    1708 1755
     				05C0D98E21D22119000B7B2A /* PhotoThumbupUserItem.swift in Sources */,
    1709 1756
     				05C71C0821DDBD55003E7CEE /* JSONCode.swift in Sources */,
    1710 1757
     				0513102E21CA1B67004EF1BE /* PhotoGroupRepository.swift in Sources */,
    @@ -1716,6 +1763,8 @@
    1716 1763
     				0513103121CA1B67004EF1BE /* MessageRepository.swift in Sources */,
    1717 1764
     				0513103321CA1B67004EF1BE /* UserInfoRepository.swift in Sources */,
    1718 1765
     				0513103521CA1B67004EF1BE /* RecentGroupInfo.swift in Sources */,
    1766
    +				05D269F6227EE7F40030062C /* ItemOperator.swift in Sources */,
    1767
    +				05D269EE227EE0EB0030062C /* GroupItemsOperator.swift in Sources */,
    1719 1768
     				0513103921CA1B67004EF1BE /* HomeViewModel.swift in Sources */,
    1720 1769
     				0543E80F21D1FD1100A42807 /* GroupDetailItem.swift in Sources */,
    1721 1770
     				0513103A21CA1B67004EF1BE /* GroupViewModel.swift in Sources */,
    @@ -1737,6 +1786,7 @@
    1737 1786
     				0513104221CA1B67004EF1BE /* CreateGroupViewModel.swift in Sources */,
    1738 1787
     				0513104321CA1B67004EF1BE /* ScanQRViewModel.swift in Sources */,
    1739 1788
     				05130FB721C9E80F004EF1BE /* MessageListItem.swift in Sources */,
    1789
    +				05D269EB227EDFB00030062C /* Array+PhotoItem.swift in Sources */,
    1740 1790
     				05B2C62121D727AA008063B3 /* StatusResource.swift in Sources */,
    1741 1791
     				051310C021CB6EF4004EF1BE /* UserInfo.swift in Sources */,
    1742 1792
     				05594BFF2240BEDE002D4910 /* PhotoDetailViewModel.swift in Sources */,
    @@ -1774,15 +1824,17 @@
    1774 1824
     				05130FEC21CA1B04004EF1BE /* MineCoordinator.swift in Sources */,
    1775 1825
     				05130FED21CA1B04004EF1BE /* MineViewController.swift in Sources */,
    1776 1826
     				05130FEE21CA1B04004EF1BE /* MineGroupViewController.swift in Sources */,
    1827
    +				05D269E6227ED9980030062C /* NavigationSource.swift in Sources */,
    1777 1828
     				05130FEF21CA1B04004EF1BE /* MineFeedbackViewController.swift in Sources */,
    1778 1829
     				05594C032240E94E002D4910 /* PhotoDetailImageCell.swift in Sources */,
    1830
    +				051FA6692276FA4300A5ECC2 /* BaseCoordinator.swift in Sources */,
    1779 1831
     				05130FF021CA1B04004EF1BE /* MineOrderViewController.swift in Sources */,
    1780 1832
     				05130FF121CA1B04004EF1BE /* MineAboutViewController.swift in Sources */,
    1781 1833
     				05130FF721CA1B04004EF1BE /* PhotoDetailCommentCell.swift in Sources */,
    1782
    -				058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */,
    1783 1834
     				0513106B21CA3545004EF1BE /* PhotoDetailCoordinator.swift in Sources */,
    1784 1835
     				05130FF821CA1B04004EF1BE /* ImageCell.swift in Sources */,
    1785 1836
     				05130FF921CA1B04004EF1BE /* PhotoDetailViewController.swift in Sources */,
    1837
    +				051FA66C2277F03700A5ECC2 /* LoginCoordinator.swift in Sources */,
    1786 1838
     				05130FFB21CA1B04004EF1BE /* ShareController.swift in Sources */,
    1787 1839
     				05130FFC21CA1B04004EF1BE /* PhotoPreviewViewController.swift in Sources */,
    1788 1840
     				05130FD721CA1ADF004EF1BE /* HomeCoordinator.swift in Sources */,

    BIN
    PaiAi/Paiai.xcodeproj/project.xcworkspace/xcuserdata/FFIB.xcuserdatad/UserInterfaceState.xcuserstate


    + 12 - 0
    PaiAi/Paiai.xcodeproj/xcuserdata/FFIB.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

    @@ -2,4 +2,16 @@
    2 2
     <Bucket
    3 3
        type = "1"
    4 4
        version = "2.0">
    5
    +   <Breakpoints>
    6
    +      <BreakpointProxy
    7
    +         BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">
    8
    +         <BreakpointContent
    9
    +            shouldBeEnabled = "Yes"
    10
    +            ignoreCount = "0"
    11
    +            continueAfterRunningActions = "No"
    12
    +            scope = "0"
    13
    +            stopOnStyle = "0">
    14
    +         </BreakpointContent>
    15
    +      </BreakpointProxy>
    16
    +   </Breakpoints>
    5 17
     </Bucket>

    + 7 - 11
    PaiAi/Paiai/AppDelegate.swift

    @@ -1,16 +1,15 @@
    1 1
     //
    2 2
     //  AppDelegate.swift
    3
    -//  PaiAi
    3
    +//  Paiai
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/3/28.
    5
    +//  Created by FFIB on 16/3/28.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    10
    -import PaiaiUIKit
    11
    -import PaiaiDataKit
    10
    +import RxSwift
    12 11
     import Paiai_iOS
    13
    -
    12
    +import PaiaiDataKit
    14 13
     
    15 14
     let WXAppid = "wx4e22a0c8ae6d766d"
    16 15
     let WXSecret = "636ac848016c593575d11143c55c8333"
    @@ -27,20 +26,17 @@ class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {
    27 26
     
    28 27
         var window: UIWindow?
    29 28
         var coordinator: AppCoordinator?
    29
    +    let disposeBag = DisposeBag()
    30 30
         
    31 31
         func application(_ application: UIApplication,
    32 32
                          didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?)
    33 33
             -> Bool {
    34 34
                 registerAppConfiguration()
    35
    -            let rootViewController = ContainerViewController()
    36
    -            let nav = NavigationController(rootViewController: rootViewController)
    37 35
                 
    38 36
                 window = UIWindow(frame: UIScreen.main.bounds)
    39
    -            window?.rootViewController = nav
    40
    -            window?.makeKeyAndVisible()
    41
    -            
    42
    -            coordinator = AppCoordinator(rootViewController, navigationController: nav)
    37
    +            coordinator = AppCoordinator(window: window!)
    43 38
                 
    39
    +            coordinator?.start().subscribe().disposed(by: disposeBag)
    44 40
                 
    45 41
                 return true
    46 42
         }

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/GroupDetailItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupDetail.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/25.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/25.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/GroupItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupItem.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/19.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/19.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/GroupMemberItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupMemberItem.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/25.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/25.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/MessageItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  MessageItem.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/19.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/19.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/MessageListItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  MessageListItem.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/19.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/19.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/OrderItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  OrderItem.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/19.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/19.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/PhotoCommentItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoCommentItem.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/25.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/25.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 3
    PaiAi/PaiaiDataKit/DataLayer/Model/PhotoItem.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  PhotoItem.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/10/9.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation
    @@ -35,7 +35,6 @@ public struct PhotoItem: JSONCode {
    35 35
         public var group_default_avatar = 0
    36 36
         public var group_name = ""
    37 37
         
    38
    -    
    39 38
         public var photo_thumbnail_url = ""
    40 39
         public var photo_thumbnail2_url = ""
    41 40
         public var photo_url = ""

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/PhotoThumbupUserItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoThumbupUserItem.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/25.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/25.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/Reusable/FileModel.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  FileModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/10/10.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/JSONCode.swift

    @@ -2,8 +2,8 @@
    2 2
     //  JSONCode.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/3.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/3.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 14 - 0
    PaiAi/PaiaiDataKit/DataLayer/Model/Reusable/ModelExtension/Array+GroupItem.swift

    @@ -0,0 +1,14 @@
    1
    +//
    2
    +//  Array+GroupItem.swift
    3
    +//  PaiaiDataKit
    4
    +//
    5
    +//  Created by ffib on 2019/5/5.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7
    +//
    8
    +
    9
    +import Foundation
    10
    +extension Array where Element == GroupItem {
    11
    +    mutating func command() {
    12
    +        
    13
    +    }
    14
    +}

    + 15 - 0
    PaiAi/PaiaiDataKit/DataLayer/Model/Reusable/ModelExtension/Array+PhotoItem.swift

    @@ -0,0 +1,15 @@
    1
    +//
    2
    +//  Array+PhotoItem.swift
    3
    +//  PaiaiDataKit
    4
    +//
    5
    +//  Created by ffib on 2019/5/5.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7
    +//
    8
    +
    9
    +import Foundation
    10
    +
    11
    +extension Array where Element == PhotoItem {
    12
    +    mutating func command() {
    13
    +        
    14
    +    }
    15
    +}

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/Reusable/NetworkArrayData.swift

    @@ -2,8 +2,8 @@
    2 2
     //  NetworkArrayData.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/3.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/3.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/Reusable/OriginData.swift

    @@ -2,8 +2,8 @@
    2 2
     //  OriginData.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/3/20.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/3/20.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/Reusable/StatusModel.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  StatusModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/10/10.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Model/UserInfo.swift

    @@ -2,8 +2,8 @@
    2 2
     //  UserInfo.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/20.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/20.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/GroupDetailRepository.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupDetailRepository.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/3.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/3.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/GroupRepository.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupRepository.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/2.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/2.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Implementation/GroupPhotoRepository.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  GroupPhotoRepository.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/10/10.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 1 - 1
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Implementation/HomeRepository.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  HomeRepository.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 16/3/31.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.

    + 3 - 3
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Implementation/MessageRepository.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  MessageRepository.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/7.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/7.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Implementation/OrderRepository.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  OrderRepository.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/7.
    5
    +//  Created by FFIB on 16/4/7.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Implementation/PhotoDetailRepository.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoDetailRepository.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/25.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/25.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Implementation/PhotoGroupDetailRepository.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoGroupDetailRepository.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/25.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/25.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 1 - 1
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Implementation/PhotoGroupRepository.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  GroupRepository.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 16/4/1.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.

    + 1 - 1
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Implementation/UserInfoRepository.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UserInfoRepository.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 16/4/1.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.

    + 3 - 3
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Persistence/RecentGroupInfo.swift

    @@ -1,12 +1,12 @@
    1 1
     //
    2 2
     //  LocalStorage.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by mac on 2016/10/28.
    5
    +//  Created by FFIB on 2016/10/28.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import UIKit
    9
    +import Foundation
    10 10
     
    11 11
     extension GroupItem: ArrayUserDefaultCodable {
    12 12
         public init(value: [String: AnyObject]) {

    + 2 - 3
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Persistence/UserInfoStore.swift

    @@ -2,8 +2,8 @@
    2 2
     //  UserSessionStore.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/20.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/20.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation
    @@ -22,7 +22,6 @@ fileprivate extension UserDefaults {
    22 22
     }
    23 23
     
    24 24
     final class UserInfoStore {
    25
    -    #warning("是否加密存储userId")
    26 25
         func save(_ userInfo: UserInfo) {
    27 26
             UserDefaults.Account.set(true, forKey: .isLogin)
    28 27
             UserDefaults.Account.set(userInfo.toJSON(), forKey: .userInfo)

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/PhotoRepository.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoRepository.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/2.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/2.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/FeedbackRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  FeedbackRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/29.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/29.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/GroupDetailRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupDetailRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/29.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/29.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/GroupPhotoRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupPhotoRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/2.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/2.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/GroupRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/29.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/29.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/GuestUserInfoRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GuestUserInfoRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/26.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/26.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/HomeRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  HomeRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/27.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/27.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/MessageRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  MessageRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/29.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/29.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/OrderRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  OrderRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/29.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/29.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 3 - 3
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/PhotoDetailRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoDetailRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/3/18.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/3/18.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation
    @@ -75,6 +75,6 @@ struct PhotoDetailRemoteAPI {
    75 75
                                                                            "photo_id": photoId,
    76 76
                                                                            "user_id": ShareUserId],
    77 77
                                                                parseJSON: parseCommtents)
    78
    -        resource.loadContent()
    78
    +        let _ = resource.loadContent()
    79 79
         }
    80 80
     }

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/PhotoPurchaseRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoPurchaseRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/4/1.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/4/1.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/ContentResource.swift

    @@ -2,8 +2,8 @@
    2 2
     //  ContentResource.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/29.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/29.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 3 - 3
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/Interfaces.swift

    @@ -1,12 +1,12 @@
    1 1
     //
    2 2
     //  Interfaces.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/8/30.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import UIKit
    9
    +import Foundation
    10 10
     
    11 11
     public enum Interfaces: String {
    12 12
         case baseUrl = "https://api.xfoto.com.cn"

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/NetWorkCache.swift

    @@ -1,12 +1,12 @@
    1 1
     //
    2 2
     //  NetWorkCache.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by yangbin on 4/20/16.
    6 6
     //  Copyright © 2016 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import UIKit
    9
    +import Foundation
    10 10
     import Alamofire
    11 11
     
    12 12
     let DefaultNetWorkCache = NetWorkCache()

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/NetworkApi.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  NetworkApi.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/29.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/Resource.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  Resource.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/29.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/StatusResource.swift

    @@ -2,8 +2,8 @@
    2 2
     //  StatusResource.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/29.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/29.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/UploadResource.swift

    @@ -2,8 +2,8 @@
    2 2
     //  UploadResource.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/2.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/2.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/UserInfoRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  UserInfoRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/25.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/25.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/WXUserInfoRemoteAPI.swift

    @@ -2,8 +2,8 @@
    2 2
     //  WXUserInfoRemoteAPI.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/26.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/26.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/PaiaiDataKit.h

    @@ -2,8 +2,8 @@
    2 2
     //  PaiaiDataKit.h
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/19.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/19.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     #import <UIKit/UIKit.h>

    + 24 - 2
    PaiAi/PaiaiDataKit/PresentLayer/Group/GroupDetail/GroupDetailViewModel.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  GroupDetailViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by zhengjianfei on 2017/1/3.
    5
    +//  Created by FFIB on 2017/1/3.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -14,6 +14,7 @@ public protocol GroupDetailViewModelDelegate: class {
    14 14
         func navigateToGroupMember(_ item: GroupDetailItem)
    15 15
         func navigateToGroupNameModification(_ item: GroupDetailItem)
    16 16
         func navigateToRootViewController()
    17
    +    func navigationBackToGroupDetail()
    17 18
     }
    18 19
     
    19 20
     public class GroupDetailViewModel {
    @@ -23,7 +24,10 @@ public class GroupDetailViewModel {
    23 24
         
    24 25
         public weak var delegate: GroupDetailViewModelDelegate?
    25 26
         
    27
    +    public let didCancel = PublishSubject<Void>()
    28
    +    public let didQuit = PublishSubject<Void>()
    26 29
         public let item: BehaviorRelay<GroupDetailItem>
    30
    +    
    27 31
         public var groupName: Observable<String> {
    28 32
             return item.asObservable().flatMapLatest({ (item) -> Observable<String> in
    29 33
                 return Observable.just(item.group.group_name)
    @@ -94,9 +98,27 @@ public class GroupDetailViewModel {
    94 98
             repository.quit()
    95 99
                 .subscribe(onCompleted: {[unowned self] in
    96 100
                     Toast.show(message: "退出群成功")
    101
    +                self.didQuit.onNext(())
    102
    +                NotificationCenter.default.post(name: .GroupItemsChanged, object: nil, userInfo: [GroupItemsOperator.key: GroupItemsOperator.remove(self.item.value.group_id)])
    97 103
                     self.delegate?.navigateToRootViewController()
    98 104
                 }).disposed(by: disposeBag)
    99 105
         }
    106
    +    
    107
    +    public func changeName(name: String) {
    108
    +        repository.update(name: name)
    109
    +            .subscribe(onCompleted: {[unowned self] in
    110
    +                Toast.show(message: "群名称已修改")
    111
    +                var v = self.item.value
    112
    +                v.group.group_name = name
    113
    +                self.item.accept(v)
    114
    +                NotificationCenter.default.post(name: .GroupItemsChanged, object: nil, userInfo: [GroupItemsOperator.key: GroupItemsOperator.update(v.group_id, v.group)])
    115
    +                self.delegate?.navigationBackToGroupDetail()
    116
    +        }).disposed(by: disposeBag)
    117
    +    }
    118
    +    
    119
    +    deinit {
    120
    +        didCancel.onNext(())
    121
    +    }
    100 122
     }
    101 123
     
    102 124
     public extension GroupDetailViewModel {

    + 4 - 4
    PaiAi/PaiaiDataKit/PresentLayer/Group/GroupDetail/GroupMemberViewModel.swift

    @@ -1,12 +1,12 @@
    1 1
     //
    2 2
     //  GroupMemberViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by LISA on 2017/5/8.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    5
    +//  Created by FFIB on 2017/5/8.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import UIKit
    9
    +import Foundation
    10 10
     import RxSwift
    11 11
     import RxCocoa
    12 12
     import RxDataSources

    + 41 - 10
    PaiAi/PaiaiDataKit/PresentLayer/Group/GroupViewModel.swift

    @@ -1,18 +1,18 @@
    1 1
     //
    2 2
     //  GroupViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by zhengjianfei on 2017/1/4.
    5
    +//  Created by FFIB on 2017/1/4.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import UIKit
    9
    +import Foundation
    10 10
     import RxSwift
    11 11
     import RxCocoa
    12 12
     import RxDataSources
    13 13
     
    14 14
     public protocol GroupViewModelDelegate: class {
    15
    -    func didSelect(_ items: [PhotoItem], currIndex: Int)
    15
    +    func didSelect(_ _items: [PhotoItem], currIndex: Int)
    16 16
         func navigateToGroupDetail(_ item: GroupItem)
    17 17
     }
    18 18
     
    @@ -24,7 +24,7 @@ public class GroupViewModel {
    24 24
         
    25 25
         
    26 26
         private var _isLoading = PublishSubject<Void>()
    27
    -    private let items = BehaviorRelay<[PhotoItem]>(value: [])
    27
    +    private let _items = BehaviorRelay<[PhotoItem]>(value: [])
    28 28
         private let _hasData = BehaviorRelay<Bool>(value: false)
    29 29
         
    30 30
         public var groupItem: BehaviorRelay<GroupItem>
    @@ -50,7 +50,7 @@ public class GroupViewModel {
    50 50
         }
    51 51
     
    52 52
         public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
    53
    -        return items.map({ model in
    53
    +        return _items.map({ model in
    54 54
                 return [AnimatableSectionModel(model: 0, items: model)]
    55 55
             })
    56 56
         }
    @@ -61,6 +61,7 @@ public class GroupViewModel {
    61 61
             self.repository = GroupPhotoRepository(groupId: groupItem.group_id)
    62 62
             self.groupItem = BehaviorRelay<GroupItem>(value: groupItem)
    63 63
             ShareRecentGroupInfo.add(groupItem)
    64
    +        setNotification()
    64 65
         }
    65 66
         
    66 67
         public func reload() {
    @@ -68,7 +69,7 @@ public class GroupViewModel {
    68 69
                 .subscribe(onSuccess: {[weak self] (result) in
    69 70
                     guard let `self` = self else { return }
    70 71
                     self._isLoading.onNext(())
    71
    -                self.items.accept(result)
    72
    +                self._items.accept(result)
    72 73
                     self._hasData.accept(result.count > 0)
    73 74
                     }, onError: {[weak self] (error) in
    74 75
                         guard let `self` = self else { return }
    @@ -79,7 +80,10 @@ public class GroupViewModel {
    79 80
         public func submit(data: Data) {
    80 81
             repository.upload(data: data).subscribe(onSuccess: { [weak self] result in
    81 82
                 guard let `self` = self else { return }
    82
    -            self.items.accept(result)
    83
    +            self._items.accept(result)
    84
    +            var item = self.groupItem.value
    85
    +            item.group_photo_num = result.count
    86
    +            NotificationCenter.default.post(name: .GroupItemsChanged, object: nil, userInfo: [GroupItemsOperator.key: GroupItemsOperator.update(self.groupItem.value.group_id, item)])
    83 87
                 Toast.show(message: "照片已上传")
    84 88
                 self._isLoading.onNext(())
    85 89
             }) {[weak self] (error) in
    @@ -90,19 +94,46 @@ public class GroupViewModel {
    90 94
         }
    91 95
         
    92 96
         public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize {
    93
    -        let item = items.value[indexPath.row]
    97
    +        let item = _items.value[indexPath.row]
    94 98
             let w = item.photo_thumbnail_w
    95 99
             let h = item.photo_thumbnail_h
    96 100
     
    97 101
             //        header 42, footer: 32
    98 102
             return CGSize(width: w, height: h + 74)
    99 103
         }
    104
    +    
    105
    +    private func setNotification() {
    106
    +        NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: { (notification) in
    107
    +            guard let itemOperator = notification.userInfo?[GroupItemsOperator.key] as? GroupItemsOperator,
    108
    +                case let .update(_, v) = itemOperator else { return }
    109
    +            self.groupItem.accept(v)
    110
    +            ShareRecentGroupInfo.add(v)
    111
    +            
    112
    +            var items = self._items.value
    113
    +            items = items.map({ item in
    114
    +                var tmp = item
    115
    +                tmp.group_name = v.group_name
    116
    +                return tmp
    117
    +            })
    118
    +            self._items.accept(items)
    119
    +            
    120
    +        }).disposed(by: disposeBag)
    121
    +        
    122
    +        NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: { (notification) in
    123
    +            guard let itemOperator = notification.userInfo?[PhotoItemsOperator.key] as? PhotoItemsOperator,
    124
    +                case let .update(id, v) = itemOperator,
    125
    +                let index = self._items.value.firstIndex(where: { $0.photo_id == id }) else { return }
    126
    +            var items = self._items.value
    127
    +            items[index] = v
    128
    +            self._items.accept(items)
    129
    +        }).disposed(by: disposeBag)
    130
    +    }
    100 131
     }
    101 132
     
    102 133
     /// GroupViewModelDelegate
    103 134
     public extension GroupViewModel {
    104 135
         func didSelect(_ index: Int) {
    105
    -        delegate?.didSelect(items.value, currIndex: index)
    136
    +        delegate?.didSelect(_items.value, currIndex: index)
    106 137
         }
    107 138
         
    108 139
         @objc func navigateToGroupDetail() {

    + 3 - 3
    PaiAi/PaiaiDataKit/PresentLayer/Home/CreateGroupViewModel.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  CreateGroupViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/17.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/17.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 45 - 10
    PaiAi/PaiaiDataKit/PresentLayer/Home/HomeViewModel.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  HomeViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by zhengjianfei on 2016/12/29.
    5
    +//  Created by FFIB on 2016/12/29.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -14,7 +14,7 @@ import RxDataSources
    14 14
     public protocol HomeViewModelDelegate: class {
    15 15
         func scanQR()
    16 16
         func createGroup()
    17
    -    func didSelect(_ items: [PhotoItem], currIndex: Int)
    17
    +    func didSelect(_ _items: [PhotoItem], currIndex: Int)
    18 18
     }
    19 19
     
    20 20
     public class HomeViewModel {
    @@ -26,7 +26,7 @@ public class HomeViewModel {
    26 26
         
    27 27
         private var _isLoading = PublishSubject<Bool>()
    28 28
         private var _hasMoreData = BehaviorRelay<Bool>(value: true)
    29
    -    private let items = BehaviorRelay<[PhotoItem]>(value: [])
    29
    +    private let _items = BehaviorRelay<[PhotoItem]>(value: [])
    30 30
         
    31 31
         public var scanBtnTapped = PublishSubject<Void>()
    32 32
         public var createBtnTapped = PublishSubject<Void>()
    @@ -41,7 +41,7 @@ public class HomeViewModel {
    41 41
         }
    42 42
         
    43 43
         public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
    44
    -        return items.map({ model in
    44
    +        return _items.map({ model in
    45 45
                 return [AnimatableSectionModel(model: 0, items: model)]
    46 46
             })
    47 47
         }
    @@ -62,6 +62,8 @@ public class HomeViewModel {
    62 62
                 guard let `self` = self else { return }
    63 63
                 self.delegate?.createGroup()
    64 64
             }).disposed(by: disposeBag)
    65
    +        
    66
    +        setNotification()
    65 67
         }
    66 68
     
    67 69
         public func reload() {
    @@ -70,7 +72,7 @@ public class HomeViewModel {
    70 72
                 .subscribe(onSuccess: {[weak self] (result) in
    71 73
                     guard let `self` = self else { return }
    72 74
                     self._isLoading.onNext(true)
    73
    -                self.items.accept(result.data)
    75
    +                self._items.accept(result.data)
    74 76
                     self._hasMoreData.accept(result.hasMore)
    75 77
                 }, onError: {[weak self] (_) in
    76 78
                     guard let `self` = self else { return }
    @@ -86,7 +88,7 @@ public class HomeViewModel {
    86 88
                     guard let `self` = self else { return }
    87 89
                     self._isLoading.onNext(false)
    88 90
                     self._hasMoreData.accept(result.hasMore)
    89
    -                self.items.accept(self.items.value + result.data)
    91
    +                self._items.accept(self._items.value + result.data)
    90 92
                     }, onError: {[weak self] (_) in
    91 93
                         guard let `self` = self else { return }
    92 94
                         self._isLoading.onNext(false)
    @@ -94,18 +96,51 @@ public class HomeViewModel {
    94 96
         }
    95 97
         
    96 98
         public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize {
    97
    -        let item = items.value[indexPath.row]
    99
    +        let item = _items.value[indexPath.row]
    98 100
             let w = item.photo_thumbnail_w
    99 101
             let h = item.photo_thumbnail_h
    100 102
             
    101 103
     //        header 42, footer: 32
    102 104
             return CGSize(width: w, height: h + 74)
    103 105
         }
    106
    +    
    107
    +    private func setNotification() {
    108
    +        NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: { (notification) in
    109
    +            guard let itemOperator = notification.userInfo?[GroupItemsOperator.key] as? GroupItemsOperator else { return }
    110
    +            var items = self._items.value
    111
    +            switch itemOperator {
    112
    +            case let .update(id, v):
    113
    +                items = items.map({ (item) -> PhotoItem in
    114
    +                    
    115
    +                    if item.group_id == id {
    116
    +                        var tmp = item
    117
    +                        tmp.group_name = v.group_name
    118
    +                        
    119
    +                        return tmp
    120
    +                    }
    121
    +                    return item
    122
    +                })
    123
    +                self._items.accept(items)
    124
    +                break
    125
    +            case let .remove(id):
    126
    +                items.removeAll(where: { $0.group_id == id })
    127
    +                self._items.accept(items)
    128
    +            }
    129
    +        }).disposed(by: disposeBag)
    130
    +        
    131
    +        NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: { (notification) in
    132
    +            guard let itemOperator = notification.userInfo?[PhotoItemsOperator.key] as? PhotoItemsOperator,
    133
    +                case let .update(id, v) = itemOperator,
    134
    +                let index = self._items.value.firstIndex(where: { $0.photo_id == id }) else { return }
    135
    +            var items = self._items.value
    136
    +            items[index] = v
    137
    +            self._items.accept(items)
    138
    +        }).disposed(by: disposeBag)
    139
    +    }
    104 140
     }
    105 141
     
    106 142
     //coordinator delegate
    107 143
     extension HomeViewModel {
    108
    -    
    109 144
         public func scanQR() {
    110 145
             delegate?.scanQR()
    111 146
         }
    @@ -115,6 +150,6 @@ extension HomeViewModel {
    115 150
         }
    116 151
         
    117 152
         public func didSelect(_ currIndex: Int) {
    118
    -        delegate?.didSelect(items.value, currIndex: currIndex)
    153
    +        delegate?.didSelect(_items.value, currIndex: currIndex)
    119 154
         }
    120 155
     }

    + 3 - 3
    PaiAi/PaiaiDataKit/PresentLayer/Home/ScanQRViewModel.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  ScanQRViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/18.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/18.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/PresentLayer/Message/MessageListViewModel.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  MessageListViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by mac on 2016/10/19.
    5
    +//  Created by FFIB on 2016/10/19.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 8 - 3
    PaiAi/PaiaiDataKit/PresentLayer/Message/MessageViewModel.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  MessageViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/7.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/7.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation
    @@ -25,6 +25,8 @@ public class MessageViewModel {
    25 25
         public var commentReadedTip = BehaviorRelay<Bool>(value: true)
    26 26
         public var thumbupReadedTip = BehaviorRelay<Bool>(value: true)
    27 27
         
    28
    +    public var readedTip = BehaviorRelay<Bool>(value: true)
    29
    +    
    28 30
         public var sysBtnTapped = PublishSubject<Void>()
    29 31
         public var commentBtnTapped = PublishSubject<Void>()
    30 32
         public var thumbupBtnTapped = PublishSubject<Void>()
    @@ -34,16 +36,19 @@ public class MessageViewModel {
    34 36
             
    35 37
             sysBtnTapped.asObservable().subscribe {[weak self] (_) in
    36 38
                 guard let `self` = self else { return }
    39
    +            self.readedTip = self.sysReadedTip
    37 40
                 self.delegate?.didSelect(type: .system)
    38 41
             }.disposed(by: disposeBag)
    39 42
             
    40 43
             commentBtnTapped.asObservable().subscribe {[weak self] (_) in
    41 44
                 guard let `self` = self else { return }
    45
    +            self.readedTip = self.commentReadedTip
    42 46
                 self.delegate?.didSelect(type: .comment)
    43 47
             }.disposed(by: disposeBag)
    44 48
             
    45 49
             thumbupBtnTapped.asObservable().subscribe {[weak self] (_) in
    46 50
                 guard let `self` = self else { return }
    51
    +            self.readedTip = self.thumbupReadedTip
    47 52
                 self.delegate?.didSelect(type: .thumbup)
    48 53
             }.disposed(by: disposeBag)
    49 54
         }

    + 35 - 13
    PaiAi/PaiaiDataKit/PresentLayer/Mine/MineGroupViewModel.swift

    @@ -1,12 +1,12 @@
    1 1
     //
    2 2
     //  MineGroupViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by LISA on 2017/5/8.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    5
    +//  Created by FFIB on 2017/5/8.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import UIKit
    9
    +import Foundation
    10 10
     import RxSwift
    11 11
     import RxCocoa
    12 12
     import RxDataSources
    @@ -25,7 +25,7 @@ public class MineGroupViewModel {
    25 25
         private var _isEmpty = BehaviorRelay<Bool>(value: false)
    26 26
         private var _hasMoreData = PublishSubject<Bool>()
    27 27
         private var _showMessage = PublishSubject<String>()
    28
    -    private let items = BehaviorRelay<[GroupItem]>(value: [])
    28
    +    private let _items = BehaviorRelay<[GroupItem]>(value: [])
    29 29
         
    30 30
         public weak var delegate: MineGroupViewModelDelegate?
    31 31
         
    @@ -46,13 +46,14 @@ public class MineGroupViewModel {
    46 46
         }
    47 47
         
    48 48
         public var contents: Observable<[AnimatableSectionModel<Int, GroupItem>]> {
    49
    -        return items.map({ model in
    49
    +        return _items.map({ model in
    50 50
                 return [AnimatableSectionModel(model: 0, items: model)]
    51 51
             })
    52 52
         }
    53 53
         
    54 54
         public init() {
    55 55
             self.repository = PhotoGroupRepository()
    56
    +        setNotification()
    56 57
         }
    57 58
         
    58 59
         public func reload() {
    @@ -64,7 +65,7 @@ public class MineGroupViewModel {
    64 65
                     self._hasMoreData.onNext(model.hasMore)
    65 66
                     self._isEmpty.accept(!model.data.isEmpty)
    66 67
                     
    67
    -                self.items.accept(model.data)
    68
    +                self._items.accept(model.data)
    68 69
                     }, onDisposed: {[weak self] in
    69 70
                         guard let `self` = self else { return }
    70 71
                         self._isLoading.onNext(true)
    @@ -79,7 +80,7 @@ public class MineGroupViewModel {
    79 80
                 .drive(onNext: {[weak self] (model) in
    80 81
                     guard let `self` = self else { return }
    81 82
                     self._hasMoreData.onNext(model.hasMore)
    82
    -                self.items.accept(self.items.value + model.data)
    83
    +                self._items.accept(self._items.value + model.data)
    83 84
                     }, onDisposed: {[weak self] in
    84 85
                         guard let `self` = self else { return }
    85 86
                         self._isLoading.onNext(false)
    @@ -88,17 +89,38 @@ public class MineGroupViewModel {
    88 89
         
    89 90
         public func remove(of index: Int) {
    90 91
             Toast.showActivity(message: "正在删除此群")
    91
    -        repository.remove(groupId: items.value[index].group_id)
    92
    +        repository.remove(groupId: _items.value[index].group_id)
    92 93
                 .subscribe(onCompleted: {[weak self] in
    93 94
                     guard let `self` = self else { return }
    94
    -                var _items = self.items.value
    95
    -                _items.remove(at: index)
    96
    -                self.items.accept(_items)
    95
    +                var __items = self._items.value
    96
    +                __items.remove(at: index)
    97
    +                self._items.accept(__items)
    97 98
                     self._showMessage.onNext("群已删除")
    98 99
                 }).disposed(by: disposeBag)
    99 100
         }
    100 101
         
    101
    -    public func didSelect(_ item: GroupItem) {
    102
    +    private func setNotification() {
    103
    +        NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: { (notification) in
    104
    +            guard let itemOperator = notification.userInfo?[GroupItemsOperator.key] as? GroupItemsOperator else { return }
    105
    +            switch itemOperator {
    106
    +            case let .update(id, v):
    107
    +                guard let index = self._items.value.firstIndex(where: { $0.group_id == id }) else { return }
    108
    +                var items = self._items.value
    109
    +                items[index] = v
    110
    +                self._items.accept(items)
    111
    +                break
    112
    +            case let .remove(id):
    113
    +                var items = self._items.value
    114
    +                items.removeAll(where: { $0.group_id == id })
    115
    +                self._items.accept(items)
    116
    +            }
    117
    +        }).disposed(by: disposeBag)
    118
    +    }
    119
    +}
    120
    +
    121
    +/// ViewModel delegate
    122
    +public extension MineGroupViewModel {
    123
    +    func didSelect(_ item: GroupItem) {
    102 124
             delegate?.didSelect(item)
    103 125
         }
    104 126
     }

    + 10 - 4
    PaiAi/PaiaiDataKit/PresentLayer/Mine/MineOrderViewModel.swift

    @@ -1,12 +1,12 @@
    1 1
     //
    2 2
     //  MineOrderViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by LISA on 2017/5/8.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    5
    +//  Created by FFIB on 2017/5/8.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import UIKit
    9
    +import Foundation
    10 10
     import RxSwift
    11 11
     import RxCocoa
    12 12
     import RxDataSources
    @@ -41,6 +41,8 @@ public class MineOrderViewModel {
    41 41
             return _isLoading.asObserver()
    42 42
         }
    43 43
         
    44
    +    public var didCancel = PublishSubject<Void>()
    45
    +    
    44 46
         public init() {
    45 47
             self.repository = OrderRepository()
    46 48
         }
    @@ -85,4 +87,8 @@ public class MineOrderViewModel {
    85 87
         public func didSelect(_ item: OrderItem) {
    86 88
             delegate?.didSelect(item)
    87 89
         }
    90
    +    
    91
    +    deinit {
    92
    +        didCancel.onNext(())
    93
    +    }
    88 94
     }

    + 16 - 10
    PaiAi/PaiaiDataKit/PresentLayer/PhotoDetail/PhotoDetailItemViewModel.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  PhotoDetailViewModel.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by zhengjianfei on 2017/1/4.
    5
    +//  Created by FFIB on 2017/1/4.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -27,21 +27,27 @@ public final class PhotoDetailItemViewModel {
    27 27
             
    28 28
             self.item.subscribe(onNext: {[unowned self] (photoItem) in
    29 29
                 self.repository = PhotoDetailRepository(photoId: photoItem.photo_id, groupId: photoItem.group_id)
    30
    -            self.loadCommentItems()
    31
    -            self.loadThumbupUserItems()
    30
    +            self.loadCommentItems().concat(self.loadThumbupUserItems()).subscribe(onCompleted: {
    31
    +                var v = self.item.value
    32
    +                v.comment_num = self.commentItems.value.count
    33
    +                v.thumbup_num = self.thumbupItems.value.count
    34
    +                self.item.accept(v)
    35
    +                
    36
    +                NotificationCenter.default.post(name: .PhotoItemsChanged, object: nil, userInfo: [PhotoItemsOperator.key: PhotoItemsOperator.update(v.photo_id, v)])
    37
    +            }).disposed(by: self.disposeBag)
    32 38
             }).disposed(by: disposeBag)
    33 39
         }
    34 40
         
    35
    -    private func loadThumbupUserItems() {
    36
    -        repository.loadThumbups().subscribe(onSuccess: { (items) in
    41
    +    private func loadThumbupUserItems() -> Completable {
    42
    +        return repository.loadThumbups().do(onSuccess: { (items) in
    37 43
                 self.thumbupItems.accept(items)
    38
    -        }).disposed(by: disposeBag)
    44
    +        }).asCompletable()
    39 45
         }
    40 46
         
    41
    -    private func loadCommentItems() {
    42
    -        repository.loadComments().subscribe(onSuccess: { (items) in
    47
    +    private func loadCommentItems() -> Completable {
    48
    +        return repository.loadComments().do(onSuccess: { (items) in
    43 49
                 self.commentItems.accept(items)
    44
    -        }).disposed(by: disposeBag)
    50
    +        }).asCompletable()
    45 51
         }
    46 52
     
    47 53
         public func submitThumbup() {

    + 27 - 10
    PaiAi/PaiaiDataKit/PresentLayer/PhotoDetail/PhotoDetailViewModel.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoDetailListViewModel.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/3/19.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/3/19.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation
    @@ -18,7 +18,7 @@ public protocol PhotoDetailViewModelDelegate: class {
    18 18
     
    19 19
     
    20 20
     public final class PhotoDetailViewModel {
    21
    -    private var items: BehaviorRelay<[PhotoItem]>
    21
    +    private var _items: BehaviorRelay<[PhotoItem]>
    22 22
         private var itemViewModel: PhotoDetailItemViewModel
    23 23
         private var purchaseViewModel: PhotoPurchaseViewModel
    24 24
         private var _hasGetPrice = BehaviorRelay<Bool>(value: false)
    @@ -113,23 +113,25 @@ public final class PhotoDetailViewModel {
    113 113
         public weak var delegate: PhotoDetailViewModelDelegate?
    114 114
         
    115 115
         public var content: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
    116
    -        return items.map({ model in
    116
    +        return _items.map({ model in
    117 117
                 return [AnimatableSectionModel(model: 0, items: model)]
    118 118
             })
    119 119
         }
    120 120
      
    121 121
         public init(items: [PhotoItem], currIndex: Int) {
    122
    -        self.items = BehaviorRelay<[PhotoItem]>(value: items)
    122
    +        self._items = BehaviorRelay<[PhotoItem]>(value: items)
    123 123
             self.currIndex = currIndex
    124 124
             self.itemViewModel = PhotoDetailItemViewModel(item: items[currIndex])
    125 125
             self.purchaseViewModel = PhotoPurchaseViewModel(item: items[currIndex])
    126
    +        
    127
    +        setNotification()
    126 128
         }
    127 129
         
    128 130
         public func willShow(index: Int) {
    129 131
             currIndex = index
    130 132
             _hasGetPrice.accept(false)
    131
    -        itemViewModel.item.accept(items.value[index])
    132
    -        purchaseViewModel.switchItem(item: items.value[index])
    133
    +        itemViewModel.item.accept(_items.value[index])
    134
    +        purchaseViewModel.switchItem(item: _items.value[index])
    133 135
             
    134 136
             purchaseViewModel.notifyPhotoChanged.subscribe(onNext: payDidFinish(item:)).disposed(by: disposeBag)
    135 137
         }
    @@ -156,14 +158,29 @@ public final class PhotoDetailViewModel {
    156 158
         }
    157 159
         
    158 160
         public func payDidFinish(item: PhotoItem) {
    159
    -        var originItems = items.value
    161
    +        var originItems = _items.value
    160 162
             originItems[currIndex] = item
    161
    -        items.accept(originItems)
    163
    +        _items.accept(originItems)
    162 164
             itemViewModel.item.accept(item)
    163 165
         }
    164 166
         
    167
    +    private func setNotification() {
    168
    +        NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: { (notification) in
    169
    +            guard let itemOperator = notification.userInfo?[PhotoItemsOperator.key] as? PhotoItemsOperator,
    170
    +                case let .update(id, v) = itemOperator,
    171
    +                let index = self._items.value.firstIndex(where: { $0.photo_id == id }) else { return }
    172
    +            var items = self._items.value
    173
    +            items[index] = v
    174
    +            self._items.accept(items)
    175
    +        }).disposed(by: disposeBag)
    176
    +    }
    177
    +    
    178
    +    
    179
    +}
    180
    +
    181
    +extension PhotoDetailViewModel {
    165 182
         public func navigateToGroup() {
    166
    -        delegate?.navigateToGroup(GroupItem(json: items.value[currIndex].toJSON() as [String : AnyObject]))
    183
    +        delegate?.navigateToGroup(GroupItem(json: _items.value[currIndex].toJSON() as [String : AnyObject]))
    167 184
         }
    168 185
         
    169 186
         public func didSelected() {

    + 20 - 19
    PaiAi/PaiaiDataKit/PresentLayer/PhotoDetail/PhotoPurchaseViewModel.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoPurchaseViewModel.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/3/19.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/3/19.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation
    @@ -36,23 +36,24 @@ public class PhotoPurchaseViewModel {
    36 36
         }
    37 37
         
    38 38
         private func payDidFinish() {
    39
    -        NotificationCenter.default.rx.notification(Notification.wxNotification.payDidFinish).subscribe(onNext: { (notification) in
    40
    -            guard let userInfo = notification.userInfo as? [String: Int],
    41
    -                let code = userInfo["code"] else {
    42
    -                Toast.show(message: "支付失败")
    43
    -                return
    44
    -            }
    45
    -            
    46
    -            switch code {
    47
    -            case 0:
    48
    -                self.getOrderDetail()
    49
    -                break
    50
    -            case -2:
    51
    -                Toast.show(message: "取消支付")
    52
    -                break
    53
    -            default:
    54
    -                Toast.show(message: "发生未知错误")
    55
    -            }
    39
    +        NotificationCenter.default.rx.notification(Notification.wxNotification.payDidFinish)
    40
    +            .subscribe(onNext: { (notification) in
    41
    +                guard let userInfo = notification.userInfo as? [String: Int],
    42
    +                    let code = userInfo["code"] else {
    43
    +                    Toast.show(message: "支付失败")
    44
    +                    return
    45
    +                }
    46
    +                
    47
    +                switch code {
    48
    +                case 0:
    49
    +                    self.getOrderDetail()
    50
    +                    break
    51
    +                case -2:
    52
    +                    Toast.show(message: "取消支付")
    53
    +                    break
    54
    +                default:
    55
    +                    Toast.show(message: "发生未知错误")
    56
    +                }
    56 57
             }).disposed(by: disposeBag)
    57 58
         }
    58 59
         

    + 21 - 0
    PaiAi/PaiaiDataKit/PresentLayer/Reusable/GroupItemsOperator.swift

    @@ -0,0 +1,21 @@
    1
    +//
    2
    +//  GroupItemsOperator.swift
    3
    +//  PaiaiDataKit
    4
    +//
    5
    +//  Created by ffib on 2019/5/5.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7
    +//
    8
    +
    9
    +import Foundation
    10
    +
    11
    +
    12
    +public extension Notification.Name {
    13
    +    static let GroupItemsChanged = Notification.Name("GroupItemsChanged")
    14
    +}
    15
    +
    16
    +enum GroupItemsOperator {
    17
    +    case remove(String)
    18
    +    case update(String, GroupItem)
    19
    +    
    20
    +    static var key = "operator"
    21
    +}

    + 9 - 0
    PaiAi/PaiaiDataKit/PresentLayer/Reusable/ItemOperator.swift

    @@ -0,0 +1,9 @@
    1
    +//
    2
    +//  ItemOperator.swift
    3
    +//  PaiaiDataKit
    4
    +//
    5
    +//  Created by ffib on 2019/5/5.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7
    +//
    8
    +
    9
    +import Foundation

    + 19 - 0
    PaiAi/PaiaiDataKit/PresentLayer/Reusable/PhotoItemsOperator.swift

    @@ -0,0 +1,19 @@
    1
    +//
    2
    +//  PhotoItemsOperator.swift
    3
    +//  PaiaiDataKit
    4
    +//
    5
    +//  Created by ffib on 2019/5/5.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7
    +//
    8
    +
    9
    +import Foundation
    10
    +
    11
    +public extension Notification.Name {
    12
    +    static let PhotoItemsChanged = Notification.Name("PhotoItemsChanged")
    13
    +}
    14
    +
    15
    +enum PhotoItemsOperator {
    16
    +    case update(String, PhotoItem)
    17
    +    
    18
    +    static var key = "operator"
    19
    +}

    + 3 - 7
    PaiAi/PaiaiDataKit/PresentLayer/UserInfoViewModel.swift

    @@ -2,8 +2,8 @@
    2 2
     //  UserInfoViewModel.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/20.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/20.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation
    @@ -18,7 +18,7 @@ public class UserInfoViewModel {
    18 18
         
    19 19
         public var isLoggedIn: Observable<Void> {
    20 20
             return shareUserInfo.asObservable()
    21
    -            .filter{ $0.userId != "" }
    21
    +            .filter { $0.userId != "" }
    22 22
                 .flatMapLatest { _ in
    23 23
                     return Observable.just(())
    24 24
                 }
    @@ -82,8 +82,4 @@ public class UserInfoViewModel {
    82 82
                 Toast.hide()
    83 83
             }).disposed(by: disposeBag)
    84 84
         }
    85
    -    
    86
    -    deinit {
    87
    -        print("销毁")
    88
    -    }
    89 85
     }

    + 2 - 2
    PaiAi/PaiaiDataKit/Resuable/Error.swift

    @@ -2,8 +2,8 @@
    2 2
     //  Error.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/21.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/21.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/Resuable/Extension/DateExt.swift

    @@ -1,12 +1,12 @@
    1 1
     //
    2 2
     //  DateExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/24.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import UIKit
    9
    +import Foundation
    10 10
     
    11 11
     extension String {
    12 12
         public func convertTimeStringToDate(format: String) -> Date? {

    + 2 - 2
    PaiAi/PaiaiDataKit/Resuable/Extension/DictionaryExt.swift

    @@ -2,8 +2,8 @@
    2 2
     //  DictionaryExt.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/28.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/28.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 2 - 2
    PaiAi/PaiaiDataKit/Resuable/Extension/Notification+wxPay.swift

    @@ -2,8 +2,8 @@
    2 2
     //  Notification+wxPay.swift
    3 3
     //  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/4/1.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/4/1.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import Foundation

    + 1 - 1
    PaiAi/PaiaiDataKit/Resuable/Extension/StringExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  StringExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/20.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 1 - 1
    PaiAi/PaiaiDataKit/Resuable/Extension/UserDefaultsExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UserDefaultsExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiDataKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/22.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 3 - 3
    PaiAi/PaiaiDataKit/Resuable/Toast/FadeToastAnimator.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  FadeToastAnimator.swift
    3
    -//  PaiaiUIKit
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/21.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/21.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiDataKit/Resuable/Toast/Toast.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  Toast.swift
    3
    -//  PaiaiUIKit
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/21.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/21.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiDataKit/Resuable/Toast/ToastAnimator.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  ToastAnimator.swift
    3
    -//  PaiaiUIKit
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/21.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/21.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiDataKit/Resuable/Toast/ToastOption.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  ToastOption.swift
    3
    -//  PaiaiUIKit
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/18.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/18.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiDataKit/Resuable/Toast/ToastView.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  ToastView.swift
    3
    -//  PaiAi
    3
    +//  PaiaiDataKit
    4 4
     //
    5
    -//  Created by mac on 16/7/21.
    5
    +//  Created by FFIB on 16/7/21.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 2 - 2
    PaiAi/PaiaiDataKitTests/PaiaiDataKitTests.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PaiaiDataKitTests.swift
    3 3
     //  PaiaiDataKitTests
    4 4
     //
    5
    -//  Created by ffib on 2019/1/16.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/16.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import XCTest

    + 2 - 2
    PaiAi/PaiaiUIKit/PaiaiUIKit.h

    @@ -2,8 +2,8 @@
    2 2
     //  PaiaiUIKit.h
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2018/12/18.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/18.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     #import <UIKit/UIKit.h>

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/CoreGraphics/CGPointExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  CGPointExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/13.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/CoreGraphics/CGSizeExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  CGSizeExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/14.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/CoreGraphics/CLLocationExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  CLLocationExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/24.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIApplication+Swizzle.swift

    @@ -2,8 +2,8 @@
    2 2
     //  UIApplication+Swizzle.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/15.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/15.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIBarButtonItemExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UIBarButtonItemExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/14.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIColorExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UIColorExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/14.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIImageExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UIImageExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/14.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UINavigationBar+FixSpace.swift

    @@ -2,8 +2,8 @@
    2 2
     //  UINavigationBar+FixSpace.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/15.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/15.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UINavigationItem+UIBarButttonItem.swift

    @@ -2,7 +2,7 @@
    2 2
     //  UINavigationItem+UIBarButttonItem.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/4/28.
    5
    +//  Created by FFIB on 2019/4/28.
    6 6
     //  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIStoryboardExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UIStoryboardExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/14.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    @@ -9,7 +9,7 @@
    9 9
     import UIKit
    10 10
     
    11 11
     extension UIStoryboard {
    12
    -    public func instantiateController<T: UIViewController> (_ type: T.Type) -> T {
    12
    +    public func instantiateViewController<T: UIViewController> (type: T.Type) -> T {
    13 13
             return instantiateViewController(withIdentifier: String(describing: type)) as? T ?? T()
    14 14
         }
    15 15
     }

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UITextFieldExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UITextFieldExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/14.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UITextViewExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UITextViewExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/13.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIViewController+Navigation.swift

    @@ -2,11 +2,11 @@
    2 2
     //  UIViewController+Navigation.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/15.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/15.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     /// MARK:  extension
    12 12
     public extension UIViewController {

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIViewControllerExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UIViewControllerExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/13.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIViewExt.swift

    @@ -1,6 +1,6 @@
    1 1
     //
    2 2
     //  UIViewExt.swift
    3
    -//  ExtensionKit
    3
    +//  PaiaiUIKit
    4 4
     //
    5 5
     //  Created by FFIB on 2017/9/13.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/HardwareAuthorization.swift

    @@ -2,8 +2,8 @@
    2 2
     //  HardwareAuthorization.swift
    3 3
     //  Function
    4 4
     //
    5
    -//  Created by mac on 2016/11/21.
    6
    -//  Copyright © 2016年 mac. All rights reserved.
    5
    +//  Created by FFIB on 2016/11/21.
    6
    +//  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/Protocol/Storyboarded.swift

    @@ -2,8 +2,8 @@
    2 2
     //  Storyboarded.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/29.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/29.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/ActionSheetAnimator.swift

    @@ -2,8 +2,8 @@
    2 2
     //  ActionSheetAnimator.swift
    3 3
     //  PaiAi
    4 4
     //
    5
    -//  Created by ffib on 2018/12/17.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/17.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/AlertAnimator.swift

    @@ -2,8 +2,8 @@
    2 2
     //  AlertAnimator.swift
    3 3
     //  PaiAi
    4 4
     //
    5
    -//  Created by ffib on 2018/12/17.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/17.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/AlertViewController.swift

    @@ -3,7 +3,7 @@
    3 3
     //  PaiAi
    4 4
     //
    5 5
     //  Created by FFIB on 2017/11/21.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/ActionSheetController.swift

    @@ -2,8 +2,8 @@
    2 2
     //  ActionSheetController.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/23.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/23.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/AlertAction.swift

    @@ -2,11 +2,11 @@
    2 2
     //  AlertAction.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/22.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/22.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public struct AlertAction {
    12 12
         public enum Style {

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/AlertItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  AlertItem.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/22.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/22.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/BottomCancelItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  BottomCancelItem.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/21.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/21.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/BottomDefaultItem.swift

    @@ -2,8 +2,8 @@
    2 2
     //  BottomDefaultItem.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/21.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/21.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/CenterCancelItem.swift

    @@ -2,11 +2,11 @@
    2 2
     //  CenterCancelItem.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/23.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/23.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     final class CenterCancelItem: AlertItem {
    12 12
         

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/CenterConfirmItem.swift

    @@ -2,11 +2,11 @@
    2 2
     //  CenterConfirmItem.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/23.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/23.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     final class CenterConfirmItem: AlertItem {
    12 12
         

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertController.swift

    @@ -2,11 +2,11 @@
    2 2
     //  AlertController.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/21.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/21.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public class AlertController: AlertViewController {
    12 12
         

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/NavigationBackItemDelegate.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2
    -//  NavigationBackItemDelegate.swift
    2
    +//  NavigationBackViewController.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/11.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/11.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/UINavigationController+NavigationBack.swift

    @@ -2,7 +2,7 @@
    2 2
     //  UINavigationController+NavigationBack.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/4/26.
    5
    +//  Created by FFIB on 2019/4/26.
    6 6
     //  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationController/NavigationBar.swift

    @@ -2,7 +2,7 @@
    2 2
     //  NavigationBar.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/4/23.
    5
    +//  Created by FFIB on 2019/4/23.
    6 6
     //  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationController/NavigationController.swift

    @@ -2,7 +2,7 @@
    2 2
     //  NavigationController.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/4/23.
    5
    +//  Created by FFIB on 2019/4/23.
    6 6
     //  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/Nibless/NiblessView.swift

    @@ -2,8 +2,8 @@
    2 2
     //  NiblessView.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/2/6.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/2/6.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/Nibless/NiblessViewController.swift

    @@ -2,8 +2,8 @@
    2 2
     //  NiblessViewController.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/2/6.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/2/6.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/PageViewController/PageItem.swift

    @@ -2,11 +2,11 @@
    2 2
     //  PageItem.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/18.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/18.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public struct PageItem {
    12 12
         public var title: String

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/PageViewController/PageOption.swift

    @@ -2,11 +2,11 @@
    2 2
     //  PageOption.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/18.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/18.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public struct PageOption {
    12 12
         var font: UIFont

    + 7 - 4
    PaiAi/PaiaiUIKit/Reusable/UIKit/PageViewController/PageViewController.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PageViewController.swift
    3 3
     //  PaiAi
    4 4
     //
    5
    -//  Created by ffib on 2018/12/6.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/6.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    @@ -57,10 +57,13 @@ open class PageViewController: UIViewController {
    57 57
         public var option = PageOption()
    58 58
         public var pageItems = [PageItem]() {
    59 59
             didSet {
    60
    -            setPageItems()
    61
    -            setMenuItems()
    60
    +            DispatchQueue.main.async {
    61
    +                self.setPageItems()
    62
    +                self.setMenuItems()
    63
    +            }
    62 64
             }
    63 65
         }
    66
    +    
    64 67
         override open func viewDidLoad() {
    65 68
             super.viewDidLoad()
    66 69
             contentRect = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/Present/PresentAnimatable.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PresentAnimatable.swift
    3 3
     //  PaiAi
    4 4
     //
    5
    -//  Created by ffib on 2018/12/17.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/17.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/Present/PresentAnimatorDelegate.swift

    @@ -2,11 +2,11 @@
    2 2
     //  PresentAnimatorDelegate.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/24.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/24.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public protocol PresentAnimatorDelegate: class {
    12 12
         var animationView: UIView? { get }

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/Present/PresentAppearAnimatedTransitioning.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PresentAppearAnimatedTransitioning.swift
    3 3
     //  PaiAi
    4 4
     //
    5
    -//  Created by ffib on 2018/12/16.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/16.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/Present/PresentDisappearAnimatedTransitioning.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PresentDisappearAnimatedTransitioning.swift
    3 3
     //  PaiAi
    4 4
     //
    5
    -//  Created by ffib on 2018/12/17.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/17.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/Present/PresentExtension.swift

    @@ -2,11 +2,11 @@
    2 2
     //  PresentExtension.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/25.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/25.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public extension GestureRecognizerDelegate where Self: UIViewController & PresentAnimatorDelegate {
    12 12
         func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/Present/PresentViewController.swift

    @@ -2,10 +2,10 @@
    2 2
     //  PresentViewController.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/25.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/25.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     typealias PresentViewController = PresentAnimatorDelegate & GestureRecognizerDelegate & ViewControllerTransitioningDelegate

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/QR/ColorQR.swift

    @@ -2,8 +2,8 @@
    2 2
     //  ColorQR.swift
    3 3
     //  Function
    4 4
     //
    5
    -//  Created by mac on 2016/11/24.
    6
    -//  Copyright © 2016年 mac. All rights reserved.
    5
    +//  Created by FFIB on 2016/11/24.
    6
    +//  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/QR/NotificationExt.swift

    @@ -2,11 +2,11 @@
    2 2
     //  NotificationExt.swift
    3 3
     //  QRView
    4 4
     //
    5
    -//  Created by LISA on 2017/7/17.
    5
    +//  Created by FFIB on 2017/7/17.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     extension Notification {
    12 12
         struct QRNotification {

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/UIKit/QR/QRCodeConfiguration.swift

    @@ -2,7 +2,7 @@
    2 2
     //  QRCodeConfiguration.swift
    3 3
     //  QRView
    4 4
     //
    5
    -//  Created by LISA on 2017/7/19.
    5
    +//  Created by FFIB on 2017/7/19.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/QR/QRCodeMaskView.swift

    @@ -2,8 +2,8 @@
    2 2
     //  QRCodeMaskView.swift
    3 3
     //  PaiAi-Guide
    4 4
     //
    5
    -//  Created by zhengjianfei on 2017/1/20.
    6
    -//  Copyright © 2017年 mac. All rights reserved.
    5
    +//  Created by FFIB on 2017/1/20.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/QR/QRCodeScanDelegate.swift

    @@ -2,11 +2,11 @@
    2 2
     //  QRCodeScanDelegate.swift
    3 3
     //  QRView
    4 4
     //
    5
    -//  Created by LISA on 2017/7/19.
    5
    +//  Created by FFIB on 2017/7/19.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public protocol QRCodeScanViewDelegate: class {
    12 12
         func scanView(_ scanner: QRCodeScanView, receivedScanResult: QRCodeScanResult)

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/QR/QRCodeScanResult.swift

    @@ -2,11 +2,11 @@
    2 2
     //  QRCodeScanResult.swift
    3 3
     //  QRCodeScanner
    4 4
     //
    5
    -//  Created by LISA on 2017/7/24.
    5
    +//  Created by FFIB on 2017/7/24.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public struct QRCodeScanResult {
    12 12
         public let metadataType: String

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/QR/QRCodeScanView.swift

    @@ -2,7 +2,7 @@
    2 2
     //  QRCodeScanView.swift
    3 3
     //  PaiAi
    4 4
     //
    5
    -//  Created by mac on 16/7/21.
    5
    +//  Created by FFIB on 16/7/21.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -82,7 +82,7 @@ import CoreImage
    82 82
         }
    83 83
     
    84 84
         @objc func start() {
    85
    -        let queue = DispatchQueue(label: "ffib.startScan.com")
    85
    +        let queue = DispatchQueue(label: "FFIB.startScan.com")
    86 86
             queue.async {
    87 87
                 self.qrscanner?.startScan()
    88 88
                 DispatchQueue.main.async {

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/UIKit/QR/QRCodeScanner.swift

    @@ -2,7 +2,7 @@
    2 2
     //  QRCodeScanner.swift
    3 3
     //  QRView
    4 4
     //
    5
    -//  Created by LISA on 2017/7/19.
    5
    +//  Created by FFIB on 2017/7/19.
    6 6
     //  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKit/SideViewController/SideAnimator.swift

    @@ -2,11 +2,11 @@
    2 2
     //  SideAnimator.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/24.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/24.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     struct SideAnimator: PresentAnimatable {
    12 12
         func contentViewAppearAnimation(duration: TimeInterval, in view: UIView) {

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/SideViewController/SideViewController.swift

    @@ -2,8 +2,8 @@
    2 2
     //  SideViewController.swift
    3 3
     //  PaiAi
    4 4
     //
    5
    -//  Created by ffib on 2018/12/12.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/12.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/UIKit/WaterfallFlowLayout/WaterfallFlowConfiguration.swift

    @@ -3,7 +3,7 @@
    3 3
     //  PaiAi
    4 4
     //
    5 5
     //  Created by FFIB on 2017/11/13.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 1 - 1
    PaiAi/PaiaiUIKit/Reusable/UIKit/WaterfallFlowLayout/WaterfallFlowLayout.swift

    @@ -3,7 +3,7 @@
    3 3
     //  PaiAi
    4 4
     //
    5 5
     //  Created by FFIB on 2017/11/13.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKit/WebViewController.swift

    @@ -2,8 +2,8 @@
    2 2
     //  WebViewController.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/28.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/28.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerDelegate.swift

    @@ -2,11 +2,11 @@
    2 2
     //  GestureRecognizerDelegate.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/28.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/28.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public protocol GestureRecognizerDelegate: class {
    12 12
         func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerProxy.swift

    @@ -2,11 +2,11 @@
    2 2
     //  GestureRecognizerProxy.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/28.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/28.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     class GestureRecognizerProxy: NSObject, UIGestureRecognizerDelegate {
    12 12
         weak var delegate: GestureRecognizerDelegate?

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/NavigationBarDelegate/NavigationBarDelegate.swift

    @@ -2,11 +2,11 @@
    2 2
     //  NavigationBarDelegate.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/30.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/30.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public protocol NavigationBarDelegate: class {
    12 12
         func navigationBar(_ navigationBar: UINavigationBar, shouldPush item: UINavigationItem) -> Bool

    + 2 - 2
    PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/NavigationBarDelegate/NavigationBarProxy.swift

    @@ -2,8 +2,8 @@
    2 2
     //  NavigationBarProxy.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/30.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/30.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/NavigationControllerDelegate/NavigationControllerDelegate.swift

    @@ -2,11 +2,11 @@
    2 2
     //  NavigationControllerDelegate.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/16.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/16.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public protocol NavigationControllerDelegate: class {
    12 12
         func navigationController(_ navigationController: UINavigationController,

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/NavigationControllerDelegate/NavigationControllerProxy.swift

    @@ -2,11 +2,11 @@
    2 2
     //  NavigationControllerProxy.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/16.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/16.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     class NavigationControllerProxy: NSObject, UINavigationControllerDelegate {
    12 12
         weak var delegate: NavigationControllerDelegate?

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/ViewControllerTransitioningDelegate/ViewControllerTransitioningDelegate.swift

    @@ -2,11 +2,11 @@
    2 2
     //  ViewControllerTransitioningDelegate.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/28.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/28.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     public protocol ViewControllerTransitioningDelegate: class {
    12 12
         func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?

    + 3 - 3
    PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/ViewControllerTransitioningDelegate/ViewControllerTransitioningProxy.swift

    @@ -2,11 +2,11 @@
    2 2
     //  ViewControllerTransitioningProxy.swift
    3 3
     //  PaiaiUIKit
    4 4
     //
    5
    -//  Created by ffib on 2019/1/28.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/28.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10 10
     
    11 11
     class ViewControllerTransitioningProxy: NSObject, UIViewControllerTransitioningDelegate {
    12 12
         weak var delegate: ViewControllerTransitioningDelegate?

    + 59 - 53
    PaiAi/Paiai_iOS/App/AppCoordinator.swift

    @@ -1,105 +1,111 @@
    1 1
     //
    2 2
     //  Coordinator.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/6.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/6.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    10
    -import PaiaiDataKit
    10
    +import RxSwift
    11 11
     import PaiaiUIKit
    12
    +import PaiaiDataKit
    12 13
     
    13 14
     let kScreenWidth = UIScreen.main.bounds.size.width
    14 15
     let kScreenHeight = UIScreen.main.bounds.size.height
    15 16
     
    16
    -protocol Coordinator {}
    17
    -
    18
    -public final class AppCoordinator {
    17
    +public final class AppCoordinator: BaseCoordinator<Void> {
    19 18
         
    19
    +    private let window: UIWindow
    20 20
         var shareUserInfoViewModel = UserInfoViewModel()
    21
    -    var containerViewController: ContainerViewController
    22 21
         var navigationController: UINavigationController
    22
    +    var containerViewController: ContainerViewController
    23 23
         
    24
    -    fileprivate var coordinators = [CoordinatorKey: Coordinator]()
    24
    +    public init(window: UIWindow) {
    25
    +        self.window = window
    26
    +        self.containerViewController = ContainerViewController()
    27
    +        self.navigationController = NavigationController(rootViewController: containerViewController)
    28
    +    }
    25 29
         
    26
    -    public init(_ containerVC: ContainerViewController, navigationController: UINavigationController) {
    27
    -        self.containerViewController = containerVC
    28
    -        self.navigationController = navigationController
    29
    -        containerViewController.delegate = self
    30
    -        containerViewController.userInfo = shareUserInfoViewModel
    31
    -        
    32
    -        containerViewController.loadViewIfNeeded()
    33
    -        
    34
    -        
    35
    -        let homeVC = makeHomeViewController()
    36
    -        let messageVC = makeMessageViewController()
    37
    -        containerViewController.pageItems = [PageItem(title: "首页",
    38
    -                                                      viewController: homeVC),
    39
    -                                             PageItem(title: "消息",
    40
    -                                                      viewController: messageVC)]
    30
    +    override public func start() -> Observable<Void> {
    31
    +        makeContainerViewController()
    41 32
             
    42
    -        let homeCoordinator = HomeCoordinator(homeVC,
    43
    -                                              navigationController: navigationController,
    44
    -                                              userInfoViewModel: shareUserInfoViewModel)
    45
    -        let messageCoordinator = MessageCoordinator(messageVC,
    46
    -                                                    navigationController: navigationController,
    47
    -                                                    userInfoViewModel: shareUserInfoViewModel)
    48
    -        
    49
    -        coordinators[.home] = homeCoordinator
    50
    -        coordinators[.message] = messageCoordinator
    51
    -    }
    52
    -    func start() {
    33
    +        window.rootViewController = navigationController
    34
    +        window.makeKeyAndVisible()
    53 35
             
    36
    +        return .never()
    54 37
         }
    55 38
     }
    56 39
     
    57 40
     extension AppCoordinator: ContainerViewControllerDelegate {
    58 41
         func presentLogin() {
    59
    -        let loginVC = makeLoginViewController()
    60
    -        navigationController.addFullScreen(childViewController: loginVC)
    42
    +        let vc = makeLoginViewController()
    43
    +        coordinate(to: LoginCoordinator(vc,
    44
    +                                        rootViewController: containerViewController))
    45
    +            .subscribe(onNext: { (userInfo) in
    46
    +                vc.removeFromParentAndView()
    47
    +            }).disposed(by: disposeBag)
    48
    +        navigationController.addFullScreen(childViewController: vc)
    61 49
         }
    62 50
         
    63 51
         func presentMine() {
    64
    -        let mineCoordinator = makeMineCoordinator()
    65
    -        coordinators[.mine] = mineCoordinator
    66
    -        
    52
    +        let vc = makeMineViewController()
    53
    +        let mineCoordinator = MineCoordinator(vc,
    54
    +                                              navigationController: navigationController)
    55
    +        coordinate(to: mineCoordinator).subscribe().disposed(by: disposeBag)
    67 56
             containerViewController.presentController(mineCoordinator.mineViewController)
    68 57
         }
    69 58
     }
    70 59
     
    71 60
     fileprivate extension AppCoordinator {
    72
    -    func makeMineCoordinator() -> MineCoordinator {
    73
    -        let mineVC = makeMineViewController()
    74
    -        mineVC.userInfoViewModel = shareUserInfoViewModel
    75
    -        let mineCoordinator = MineCoordinator(mineVC, navigationController: navigationController, mainViewController: containerViewController)
    61
    +    func makeContainerViewController() {
    62
    +        containerViewController.userInfo = shareUserInfoViewModel
    63
    +        containerViewController.delegate = self
    64
    +        
    65
    +        containerViewController.loadViewIfNeeded()
    76 66
             
    77
    -        return mineCoordinator
    67
    +        let homeVC = makeHomeViewController()
    68
    +        let messageVC = makeMessageViewController()
    69
    +        
    70
    +        let homeCoordinator = HomeCoordinator(homeVC,
    71
    +                                              navigationController: navigationController,
    72
    +                                              userInfoViewModel: shareUserInfoViewModel)
    73
    +        coordinate(to: homeCoordinator).subscribe().disposed(by: disposeBag)
    74
    +        
    75
    +        let messageCoordinator = MessageCoordinator(messageVC,
    76
    +                                                    navigationController: navigationController)
    77
    +        coordinate(to: messageCoordinator).subscribe().disposed(by: disposeBag)
    78
    +        
    79
    +        containerViewController.pageItems = [PageItem(title: "首页",
    80
    +                                                      viewController: homeVC),
    81
    +                                             PageItem(title: "消息",
    82
    +                                                      viewController: messageVC)]
    78 83
         }
    79
    -}
    80
    -
    81
    -fileprivate extension AppCoordinator {
    84
    +    
    82 85
         func makeHomeViewController() -> HomeViewController {
    83
    -        let vc = UIStoryboard.main.instantiateController(HomeViewController.self)
    86
    +        let vc = HomeViewController.instantiate()
    84 87
             vc.viewModel = HomeViewModel()
    85 88
             vc.userInfoViewModel = shareUserInfoViewModel
    86 89
             return vc
    87 90
         }
    88 91
         
    89 92
         func makeMessageViewController() -> MessageViewController {
    90
    -        let vc = UIStoryboard.message.instantiateController(MessageViewController.self)
    93
    +        let vc = MessageViewController.instantiate()
    91 94
             vc.viewModel = MessageViewModel()
    92 95
             vc.userInfoViewModel = shareUserInfoViewModel
    93 96
             return vc
    94 97
         }
    95
    -    
    98
    +}
    99
    +
    100
    +fileprivate extension AppCoordinator {
    96 101
         func makeMineViewController() -> MineViewController {
    97
    -        let vc = UIStoryboard.mine.instantiateController(MineViewController.self)
    102
    +        let vc = MineViewController.instantiate()
    103
    +        vc.userInfoViewModel = shareUserInfoViewModel
    98 104
             return vc
    99 105
         }
    100 106
         
    101 107
         func makeLoginViewController() -> LoginViewController {
    102
    -        let vc = UIStoryboard.main.instantiateController(LoginViewController.self)
    108
    +        let vc = LoginViewController.instantiate()
    103 109
             vc.userInfoViewModel = shareUserInfoViewModel
    104 110
             return vc
    105 111
         }

    + 4 - 3
    PaiAi/Paiai_iOS/App/ContainerViewController.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  ContainerViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/6.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/6.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    @@ -57,6 +57,7 @@ public final class ContainerViewController: PageViewController {
    57 57
         public override func viewDidAppear(_ animated: Bool) {
    58 58
             super.viewDidAppear(animated)
    59 59
             bindLoggedInInteraction()
    60
    +        bindUserInfoToHeaderView()
    60 61
         }
    61 62
         
    62 63
         func setupNavigationBar() {

    + 0 - 18
    PaiAi/Paiai_iOS/App/CoordinatorKey.swift

    @@ -1,18 +0,0 @@
    1
    -//
    2
    -//  CoordinatorKey.swift
    3
    -//  Paiai_iOS
    4
    -//
    5
    -//  Created by ffib on 2019/3/26.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    7
    -//
    8
    -
    9
    -import Foundation
    10
    -
    11
    -enum CoordinatorKey: String {
    12
    -    case home = "home"
    13
    -    case message = "message"
    14
    -    case mine = "mine"
    15
    -    case group = "group"
    16
    -    case groupDetail = "groupDetail"
    17
    -    case photoDetail = "photoDetail"
    18
    -}

    + 49 - 19
    PaiAi/Paiai_iOS/App/Group/GroupCoordinator.swift

    @@ -2,53 +2,83 @@
    2 2
     //  GroupCoordinator.swift
    3 3
     //  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2019/1/29.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/1/29.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    10
    +import RxSwift
    11
    +import RxCocoa
    10 12
     import PaiaiDataKit
    11 13
     
    12
    -class GroupCoordinator: Coordinator {
    14
    +enum GroupCoordinatorResult {
    15
    +    
    16
    +}
    17
    +
    18
    +extension NavigationSource {
    19
    +    enum Group {
    20
    +        case scan       /// 扫码
    21
    +        case mineGroup  /// 侧边栏 照片群
    22
    +        case createGroup  /// 创建群
    23
    +        case photoDetail /// 照片详情页
    24
    +        case recentGroup /// 最近访问的照片群
    25
    +    }
    26
    +}
    27
    +
    28
    +class GroupCoordinator: BaseCoordinator<Void> {
    29
    +    
    30
    +    fileprivate let navigationController: UINavigationController
    13 31
         
    14
    -    let navigationController: UINavigationController
    15 32
         let groupViewController: GroupViewController
    33
    +    let source: NavigationSource.Group
    16 34
         
    17
    -    var coordinators: [CoordinatorKey: Coordinator] = [:]
    18 35
         
    19
    -    init(_ groupVC: GroupViewController, navigationController: UINavigationController) {
    20
    -        self.groupViewController = groupVC
    36
    +    init(_ viewController: GroupViewController,
    37
    +         navigationController: UINavigationController,
    38
    +         navigationSource: NavigationSource.Group) {
    39
    +        self.groupViewController = viewController
    21 40
             self.navigationController = navigationController
    22
    -        
    41
    +        self.source = navigationSource
    42
    +    }
    43
    +    
    44
    +    override func start() -> Observable<Void> {
    23 45
             groupViewController.viewModel.delegate = self
    24
    -        
    46
    +        return didCancel.asObservable()
    25 47
         }
    26 48
     }
    27 49
     
    28 50
     extension GroupCoordinator: GroupViewModelDelegate {
    29 51
         func navigateToGroupDetail(_ item: GroupItem) {
    30
    -        let coordinator = GroupDetailCoordinator(makeGroupDetailViewController(item), navigationController: navigationController)
    31
    -        coordinators[.groupDetail] = coordinator
    52
    +        let coordinator = GroupDetailCoordinator(makeGroupDetailViewController(item),
    53
    +                                                 navigationController: navigationController,
    54
    +                                                 navigationSource: source)
    32 55
             
    56
    +        coordinate(to: coordinator).subscribe(onNext: {[weak self] res in
    57
    +            switch res {
    58
    +            case .quit:
    59
    +                self?.didCancel.onNext(())
    60
    +                break
    61
    +            case .cancel:
    62
    +                break
    63
    +            }
    64
    +        }).disposed(by: disposeBag)
    33 65
             navigationController.pushViewController(coordinator.groupDetailViewController)
    34 66
         }
    35 67
         
    36 68
         func didSelect(_ items: [PhotoItem], currIndex: Int) {
    37
    -        let ctl = UIStoryboard.photoDetail.instantiateController(PhotoDetailViewController.self)
    69
    +        let vc = PhotoDetailViewController.instantiate()
    38 70
             let viewModel = PhotoDetailViewModel(items: items, currIndex: currIndex)
    39 71
             viewModel.isHiddenEnterGroupBtn.accept(true)
    40
    -        let coordinator = PhotoDetailCoordinator(ctl, nav: navigationController,
    72
    +        let coordinator = PhotoDetailCoordinator(vc, nav: navigationController,
    41 73
                                                      viewModel: viewModel)
    42
    -        coordinators[.photoDetail] = coordinator
    43
    -        coordinator.start()
    44
    -        navigationController.pushViewController(coordinator.photoDetailViewController)
    74
    +        coordinate(to: coordinator).subscribe().disposed(by: disposeBag)
    75
    +        navigationController.pushViewController(vc)
    45 76
         }
    46 77
     }
    47 78
     
    48 79
     fileprivate extension GroupCoordinator {
    49
    -    func makeGroupDetailViewController(_ item: GroupItem) -> GroupDetailViewController
    50
    -    {
    51
    -        let vc = UIStoryboard.groupDetail.instantiateController(GroupDetailViewController.self)
    80
    +    func makeGroupDetailViewController(_ item: GroupItem) -> GroupDetailViewController {
    81
    +        let vc = GroupDetailViewController.instantiate()
    52 82
             vc.viewModel = GroupDetailViewModel(item: item)
    53 83
             
    54 84
             return vc

    + 39 - 10
    PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupDetailCoordinator.swift

    @@ -2,28 +2,57 @@
    2 2
     //  GroupDetailCoordinator.swift
    3 3
     //  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/19.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/19.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    10
    +import RxSwift
    10 11
     import PaiaiDataKit
    11 12
     
    12
    -class GroupDetailCoordinator: Coordinator {
    13
    +enum GroupDetailCoordinatorResult {
    14
    +    case quit
    15
    +    case cancel
    16
    +}
    17
    +
    18
    +class GroupDetailCoordinator: BaseCoordinator<GroupDetailCoordinatorResult> {
    13 19
         let navigationController: UINavigationController
    14 20
         let groupDetailViewController: GroupDetailViewController
    21
    +    let source: NavigationSource.Group
    22
    +    var coordinatorResult = PublishSubject<GroupDetailCoordinatorResult>()
    15 23
         
    16
    -    init(_ groupDetailVC: GroupDetailViewController, navigationController: UINavigationController) {
    17
    -        self.groupDetailViewController = groupDetailVC
    24
    +    init(_ viewController: GroupDetailViewController,
    25
    +         navigationController: UINavigationController,
    26
    +         navigationSource: NavigationSource.Group) {
    27
    +        self.source = navigationSource
    28
    +        self.groupDetailViewController = viewController
    18 29
             self.navigationController = navigationController
    19
    -        
    30
    +    }
    31
    +    
    32
    +    override func start() -> Observable<GroupDetailCoordinatorResult> {
    20 33
             groupDetailViewController.viewModel.delegate = self
    34
    +        
    35
    +        let cancel = groupDetailViewController.viewModel.didQuit.map { _ in GroupDetailCoordinatorResult.quit }
    36
    +        let quit = groupDetailViewController.viewModel.didCancel.map { _ in GroupDetailCoordinatorResult.cancel }
    37
    +        return Observable.amb([cancel, quit])
    21 38
         }
    22 39
     }
    23 40
     
    24 41
     extension GroupDetailCoordinator: GroupDetailViewModelDelegate {
    42
    +    func navigationBackToGroupDetail() {
    43
    +        navigationController.popViewController(animated: true)
    44
    +    }
    45
    +    
    25 46
         func navigateToRootViewController() {
    26
    -        navigationController.popToRootViewController(animated: true)
    47
    +        coordinatorResult.onNext(.quit)
    48
    +        switch source {
    49
    +        case .createGroup, .scan, .photoDetail, .recentGroup:
    50
    +            navigationController.popToRootViewController(animated: true)
    51
    +            break
    52
    +        case .mineGroup:
    53
    +            let targetVC = navigationController.viewControllers[navigationController.viewControllers.count - 3]
    54
    +            navigationController.popToViewController(targetVC, animated: true)
    55
    +        }
    27 56
         }
    28 57
         
    29 58
         func navigateToGroupMember(_ item: GroupDetailItem) {
    @@ -37,14 +66,14 @@ extension GroupDetailCoordinator: GroupDetailViewModelDelegate {
    37 66
     
    38 67
     extension GroupDetailCoordinator {
    39 68
         func makeGroupMemberViewController(_ item: GroupDetailItem) -> GroupMemberViewController {
    40
    -        let vc = UIStoryboard.groupDetail.instantiateController(GroupMemberViewController.self)
    69
    +        let vc = GroupMemberViewController.instantiate()
    41 70
             vc.viewModel = GroupMemberViewModel(item: item)
    42 71
             return vc
    43 72
         }
    44 73
         
    45 74
         func makeGroupNameModificationViewController(_ item: GroupDetailItem) -> GroupNameModificationViewController {
    46
    -        let vc = UIStoryboard.groupDetail.instantiateController(GroupNameModificationViewController.self)
    47
    -        vc.item = item
    75
    +        let vc = GroupNameModificationViewController.instantiate()
    76
    +        vc.viewModel = groupDetailViewController.viewModel
    48 77
             return vc
    49 78
         }
    50 79
     }

    + 2 - 3
    PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupDetailMemeberView.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupDetailMemeberView.swift
    3 3
     //  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2019/2/18.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/2/18.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    @@ -57,4 +57,3 @@ class GroupDetailMemeberView: UIView {
    57 57
             }
    58 58
         }
    59 59
     }
    60
    -

    + 8 - 2
    PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupDetailViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  GroupDetailViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/5.
    5
    +//  Created by FFIB on 16/4/5.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -115,3 +115,9 @@ extension GroupDetailViewController {
    115 115
     }
    116 116
     
    117 117
     extension GroupDetailViewController: NavigationBackViewController {}
    118
    +
    119
    +extension GroupDetailViewController: Storyboarded {
    120
    +    static func instantiate() -> GroupDetailViewController {
    121
    +        return UIStoryboard.groupDetail.instantiateViewController(type: GroupDetailViewController.self)
    122
    +    }
    123
    +}

    + 2 - 2
    PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupMemberCell.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  GroupMemberCell.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by mac on 16/5/20.
    5
    +//  Created by FFIB on 16/5/20.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 8 - 2
    PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupMemberViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  GroupMemberViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/6.
    5
    +//  Created by FFIB on 16/4/6.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -64,3 +64,9 @@ extension GroupMemberViewController: GroupMemberCellDelegate {
    64 64
     }
    65 65
     
    66 66
     extension GroupMemberViewController: NavigationBackViewController {}
    67
    +
    68
    +extension GroupMemberViewController: Storyboarded {
    69
    +    static func instantiate() -> GroupMemberViewController {
    70
    +        return UIStoryboard.groupDetail.instantiateViewController(type: GroupMemberViewController.self)
    71
    +    }
    72
    +}

    + 12 - 25
    PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupNameModificationViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  GroupNameModificationViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/6.
    5
    +//  Created by FFIB on 16/4/6.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -18,7 +18,7 @@ final class GroupNameModificationViewController: UIViewController {
    18 18
         @IBOutlet weak var textField: UITextField!
    19 19
         @IBOutlet weak var saveButton: UIButton!
    20 20
         
    21
    -    var item = GroupDetailItem(json: [:])
    21
    +    var viewModel: GroupDetailViewModel!
    22 22
         
    23 23
         let disposeBag = DisposeBag()
    24 24
         // MARK: view function
    @@ -33,7 +33,7 @@ final class GroupNameModificationViewController: UIViewController {
    33 33
             let leftView = UIView(frame: CGRect(x: 0, y: 0, width: 12, height: textField.width))
    34 34
             textField.leftView = leftView
    35 35
             textField.leftViewMode = .always
    36
    -        textField.placeholder = item.group.group_name
    36
    +        textField.placeholder = viewModel.item.value.group.group_name
    37 37
         }
    38 38
     
    39 39
         func bindTextFieldToSaveButton() {
    @@ -47,30 +47,12 @@ final class GroupNameModificationViewController: UIViewController {
    47 47
     extension GroupNameModificationViewController {
    48 48
         
    49 49
         @IBAction func saveName() {
    50
    -        if (textField.text ?? "").count > 20 {
    50
    +        guard let text = textField.text, text.count <= 20 else {
    51 51
                 saveFailed()
    52 52
                 return
    53 53
             }
    54 54
             
    55
    -        
    56
    -        
    57
    -        //        guard let info = detailData else {
    58
    -        //            return
    59
    -        //        }
    60
    -        //        guard let group = detailData?.group else {
    61
    -        //            return
    62
    -        //        }
    63
    -        //        let params = ["group_id": info.group_id,
    64
    -        //        "admin_id": group.admin_id, "group_name": textField.text ?? ""] as [String: AnyObject]
    65
    -        //        let request = StatusNetworkRequest(param: params, path: .groupUpdate)
    66
    -        //        NetworkApi.share.post(request: request) { (res) in
    67
    -        //            guard res.status == 200 else {
    68
    -        //                return
    69
    -        //            }
    70
    -        //            addGroupInfoToRecent(group)
    71
    -        //            FFToastView.showToast(inView: self.view, withText: "保存成功")
    72
    -        //            self.textField.resignFirstResponder()
    73
    -        //        }
    55
    +        viewModel.changeName(name: text)
    74 56
         }
    75 57
         
    76 58
         func saveFailed() {
    @@ -80,10 +62,15 @@ extension GroupNameModificationViewController {
    80 62
             presentController(alert)
    81 63
         }
    82 64
     
    83
    -    
    84 65
         @IBAction func tapView() {
    85 66
             textField.resignFirstResponder()
    86 67
         }
    87 68
     }
    88 69
     
    89 70
     extension GroupNameModificationViewController: NavigationBackViewController {}
    71
    +
    72
    +extension GroupNameModificationViewController: Storyboarded {
    73
    +    static func instantiate() -> GroupNameModificationViewController {
    74
    +        return UIStoryboard.groupDetail.instantiateViewController(type: GroupNameModificationViewController.self)
    75
    +    }
    76
    +}

    + 2 - 2
    PaiAi/Paiai_iOS/App/Group/GroupQRView.swift

    @@ -2,8 +2,8 @@
    2 2
     //  GroupQRView.swift
    3 3
     //  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2019/2/18.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/2/18.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 3 - 4
    PaiAi/Paiai_iOS/App/Group/GroupViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  GroupViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/3/28.
    5
    +//  Created by FFIB on 16/3/28.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -259,7 +259,6 @@ extension GroupViewController: NavigationBackViewController {}
    259 259
     
    260 260
     extension GroupViewController: Storyboarded {
    261 261
         static func instantiate() -> GroupViewController {
    262
    -        let vc = UIStoryboard.group.instantiateController(GroupViewController.self)
    263
    -        return vc
    262
    +        return UIStoryboard.group.instantiateViewController(type: GroupViewController.self)
    264 263
         }
    265 264
     }

    + 8 - 2
    PaiAi/Paiai_iOS/App/Home/CreateGroupConfirmViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  CreateGroupConfirmViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/2.
    5
    +//  Created by FFIB on 16/4/2.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -56,3 +56,9 @@ extension CreateGroupConfirmViewController {
    56 56
             imageView.image = UIImage(named: viewModel.avatar)
    57 57
         }
    58 58
     }
    59
    +
    60
    +extension CreateGroupConfirmViewController: Storyboarded {
    61
    +    static func instantiate() -> CreateGroupConfirmViewController {
    62
    +        return UIStoryboard.main.instantiateViewController(type: CreateGroupConfirmViewController.self)
    63
    +    }
    64
    +}

    + 9 - 4
    PaiAi/Paiai_iOS/App/Home/CreateGroupViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  CreateGroupViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/2.
    5
    +//  Created by FFIB on 16/4/2.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -11,7 +11,7 @@ import PaiaiDataKit
    11 11
     import PaiaiUIKit
    12 12
     
    13 13
     protocol CreateGroupViewControllerDelegate: class {
    14
    -    func didSelect(_ item: GroupItem)
    14
    +    func createGroupViewControllerDidSelect(_ item: GroupItem)
    15 15
         func navigateToCreateGroupConfirm()
    16 16
     }
    17 17
     
    @@ -59,7 +59,7 @@ extension CreateGroupViewController: UITableViewDataSource, UITableViewDelegate
    59 59
             case 0:
    60 60
                 self.delegate?.navigateToCreateGroupConfirm()
    61 61
             default:
    62
    -            self.delegate?.didSelect(ShareRecentGroupInfo[indexPath.row - 1])
    62
    +            self.delegate?.createGroupViewControllerDidSelect(ShareRecentGroupInfo[indexPath.row - 1])
    63 63
             }
    64 64
         }
    65 65
     
    @@ -79,3 +79,8 @@ extension CreateGroupViewController: UITableViewDataSource, UITableViewDelegate
    79 79
         }
    80 80
     }
    81 81
     
    82
    +extension CreateGroupViewController: Storyboarded {
    83
    +    static func instantiate() -> CreateGroupViewController {
    84
    +        return UIStoryboard.main.instantiateViewController(type: CreateGroupViewController.self)
    85
    +    }
    86
    +}

    + 38 - 54
    PaiAi/Paiai_iOS/App/Home/HomeCoordinator.swift

    @@ -1,71 +1,67 @@
    1 1
     //
    2 2
     //  HomeCoordinator.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/6.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/6.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10
    +import RxSwift
    10 11
     import PaiaiDataKit
    11
    -import PaiaiUIKit
    12 12
     
    13
    -class HomeCoordinator: Coordinator {
    14
    -    fileprivate var coordinators = [CoordinatorKey: Coordinator]()
    13
    +class HomeCoordinator: BaseCoordinator<Void> {
    15 14
         
    16 15
         var homeViewController: HomeViewController
    17 16
         var navigationController: UINavigationController
    18 17
         var shareUserInfoViewModel: UserInfoViewModel
    19 18
         
    20
    -    init(_ homeVC: HomeViewController,
    19
    +    init(_ viewController: HomeViewController,
    21 20
              navigationController: UINavigationController,
    22 21
              userInfoViewModel: UserInfoViewModel) {
    23
    -        homeViewController = homeVC
    22
    +        self.homeViewController = viewController
    24 23
             self.navigationController = navigationController
    25
    -        shareUserInfoViewModel = userInfoViewModel
    26
    -        homeViewController.viewModel.delegate = self
    24
    +        self.shareUserInfoViewModel = userInfoViewModel
    27 25
         }
    28 26
         
    29
    -    func start() {
    27
    +    @discardableResult
    28
    +    override func start() -> Observable<Void> {
    29
    +        homeViewController.viewModel.delegate = self
    30 30
             
    31
    +        return Observable.never()
    31 32
         }
    32 33
     }
    33 34
     
    34 35
     extension HomeCoordinator: HomeViewModelDelegate {
    35 36
         func didSelect(_ items: [PhotoItem], currIndex: Int) {
    36
    -        let ctl = UIStoryboard.photoDetail.instantiateController(PhotoDetailViewController.self)
    37
    -        let coordinator = PhotoDetailCoordinator(ctl, nav: navigationController,
    37
    +        let vc = PhotoDetailViewController.instantiate()
    38
    +        let coordinator = PhotoDetailCoordinator(vc,
    39
    +                                                 nav: navigationController,
    38 40
                                                      viewModel: PhotoDetailViewModel(items: items, currIndex: currIndex))
    39
    -        coordinators[.photoDetail] = coordinator
    40
    -        coordinator.start()
    41
    +        coordinator.start().subscribe().disposed(by: disposeBag)
    41 42
             navigationController.pushViewController(coordinator.photoDetailViewController)
    42 43
         }
    43 44
         
    44 45
         func createGroup() {
    45
    -        let ctl = UIStoryboard.main.instantiateCreateGroupViewController()
    46
    +        let ctl = CreateGroupViewController.instantiate()
    46 47
             ctl.delegate = self
    47 48
             homeViewController.presentController(ctl)
    48 49
         }
    49 50
         
    50 51
         func scanQR() {
    51
    -        let ctl = UIStoryboard.main.instantiateScanQRViewController()
    52
    +        let ctl = ScanQRViewController.instantiate()
    52 53
             ctl.viewModel.delegate = self
    53 54
             navigationController.pushViewController(ctl)
    54 55
         }
    55 56
     }
    56 57
     
    57 58
     extension HomeCoordinator: CreateGroupViewControllerDelegate {
    58
    -    func didSelect(_ item: GroupItem) {
    59
    -        let ctl = UIStoryboard.group.instantiateController(GroupViewController.self)
    60
    -        ctl.viewModel = GroupViewModel(groupItem: item)
    61
    -        let coordinator = GroupCoordinator(ctl,
    62
    -                                           navigationController: navigationController)
    63
    -        coordinators[.group] = coordinator
    64
    -        navigationController.pushViewController(ctl)
    59
    +    func createGroupViewControllerDidSelect(_ item: GroupItem) {
    60
    +        coordinateToGroupCoordinator(item: item, navigationSource: .recentGroup)
    65 61
         }
    66 62
     
    67 63
         func navigateToCreateGroupConfirm() {
    68
    -        let ctl = UIStoryboard.main.instantiateCreateGroupConfirmViewController()
    64
    +        let ctl = CreateGroupConfirmViewController.instantiate()
    69 65
             ctl.viewModel = CreateGroupViewModel(userInfoViewModel: shareUserInfoViewModel)
    70 66
             ctl.viewModel.delegate = self
    71 67
             homeViewController.presentController(ctl)
    @@ -74,43 +70,31 @@ extension HomeCoordinator: CreateGroupViewControllerDelegate {
    74 70
     
    75 71
     extension HomeCoordinator: CreateGroupViewModelDelegate {
    76 72
         func navigateToGroup(_ item: GroupItem) {
    77
    -        guard let vc = homeViewController.presentedViewController, vc.isMember(of: CreateGroupConfirmViewController.self) else { return }
    73
    +        guard let vc = homeViewController.presentedViewController,
    74
    +            vc.isMember(of: CreateGroupConfirmViewController.self) else { return }
    78 75
             vc.dismissController()
    79
    -        
    80
    -        let ctl = UIStoryboard.group.instantiateController(GroupViewController.self)
    81
    -        ctl.viewModel = GroupViewModel(groupItem: item)
    82
    -        let coordinator = GroupCoordinator(ctl,
    83
    -                                           navigationController: navigationController)
    84
    -        coordinators[.group] = coordinator
    85
    -        navigationController.pushViewController(ctl)
    76
    +        coordinateToGroupCoordinator(item: item, navigationSource: .createGroup)
    86 77
         }
    87 78
     }
    88 79
     
    89 80
     extension HomeCoordinator: ScanQRViewModelDelegate {
    90 81
         func navigateToGroupFromScanQR(_ item: GroupItem) {
    91
    -        let ctl = UIStoryboard.group.instantiateController(GroupViewController.self)
    92
    -        ctl.viewModel = GroupViewModel(groupItem: item)
    93
    -        let coordinator = GroupCoordinator(ctl,
    94
    -                                           navigationController: navigationController)
    95
    -        coordinators[.group] = coordinator
    96
    -        navigationController.pushViewController(ctl)
    82
    +        coordinateToGroupCoordinator(item: item, navigationSource: .scan)
    97 83
         }
    98 84
     }
    99 85
     
    100
    -extension UIStoryboard {
    101
    -    fileprivate func instantiateCreateGroupViewController() -> CreateGroupViewController {
    102
    -        let createGroupVC = instantiateController(CreateGroupViewController.self)
    103
    -        return createGroupVC
    104
    -    }
    105
    -    
    106
    -    fileprivate func instantiateCreateGroupConfirmViewController() -> CreateGroupConfirmViewController {
    107
    -        let createGroupConfirmVC = instantiateController(CreateGroupConfirmViewController.self)
    108
    -        return createGroupConfirmVC
    109
    -    }
    110
    -    
    111
    -    fileprivate func instantiateScanQRViewController() -> ScanQRViewController {
    112
    -        let scanQRVC = instantiateController(ScanQRViewController.self)
    113
    -        return scanQRVC
    86
    +fileprivate extension HomeCoordinator {
    87
    +    func coordinateToGroupCoordinator(item: GroupItem, navigationSource: NavigationSource.Group) {
    88
    +        let vc = GroupViewController.instantiate()
    89
    +        vc.viewModel = GroupViewModel(groupItem: item)
    90
    +        
    91
    +        let coordinator = GroupCoordinator(vc,
    92
    +                                           navigationController: navigationController,
    93
    +                                           navigationSource: navigationSource)
    94
    +        coordinate(to: coordinator).subscribe().disposed(by: disposeBag)
    95
    +        
    96
    +        navigationController.pushViewController(vc)
    97
    +        
    114 98
         }
    115 99
     }
    116 100
     

    + 8 - 2
    PaiAi/Paiai_iOS/App/Home/HomeViewController.swift

    @@ -1,6 +1,6 @@
    1 1
     //   HomeViewController.swift
    2
    -//  PaiAi//
    3
    -//  Created by zhengjianfei on 16/3/28.
    2
    +//  Paiai_iOS
    3
    +//  Created by FFIB on 16/3/28.
    4 4
     //  Copyright © 2016年 FFIB. All rights reserved.
    5 5
     //
    6 6
     
    @@ -146,3 +146,9 @@ extension HomeViewController: UICollectionViewDelegateFlowLayout {
    146 146
             return viewModel.layoutSizeForIndexPath(indexPath)
    147 147
         }
    148 148
     }
    149
    +
    150
    +extension HomeViewController: Storyboarded {
    151
    +    static func instantiate() -> HomeViewController {
    152
    +        return UIStoryboard.main.instantiateViewController(type: HomeViewController.self)
    153
    +    }
    154
    +}

    + 10 - 5
    PaiAi/Paiai_iOS/App/Home/ScanQRViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  ScanQRViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/8.
    5
    +//  Created by FFIB on 16/4/8.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -24,8 +24,7 @@ final class ScanQRViewController: UIViewController {
    24 24
         override func viewDidLoad() {
    25 25
             super.viewDidLoad()
    26 26
             scanView.delegate = self
    27
    -//        viewModel.join(code: "http://pai.ai/g/SpA5be3")
    28
    -        setNavigationBar()
    27
    +        viewModel.join(code: "http://pai.ai/g/SpA5be3")
    29 28
         }
    30 29
         
    31 30
         func setNavigationBar() {
    @@ -35,7 +34,7 @@ final class ScanQRViewController: UIViewController {
    35 34
         
    36 35
         override func viewWillAppear(_ animated: Bool) {
    37 36
             super.viewWillAppear(animated)
    38
    -        
    37
    +        setNavigationBar()
    39 38
         }
    40 39
     
    41 40
         override func viewWillDisappear(_ animated: Bool) {
    @@ -67,3 +66,9 @@ extension ScanQRViewController: QRCodeScanViewDelegate {
    67 66
     }
    68 67
     
    69 68
     extension ScanQRViewController: NavigationBackViewController {}
    69
    +
    70
    +extension ScanQRViewController: Storyboarded {
    71
    +    static func instantiate() -> ScanQRViewController {
    72
    +        return UIStoryboard.main.instantiateViewController(type: ScanQRViewController.self)
    73
    +    }
    74
    +}

    + 28 - 0
    PaiAi/Paiai_iOS/App/Login/LoginCoordinator.swift

    @@ -0,0 +1,28 @@
    1
    +//
    2
    +//  LoginCoordinator.swift
    3
    +//  Paiai_iOS
    4
    +//
    5
    +//  Created by ffib on 2019/4/30.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7
    +//
    8
    +
    9
    +import UIKit
    10
    +import RxSwift
    11
    +import PaiaiDataKit
    12
    +
    13
    +class LoginCoordinator: BaseCoordinator<UserInfo> {
    14
    +    private let rootViewController: UIViewController
    15
    +    private let loginViewController: LoginViewController
    16
    +    
    17
    +    init(_ loginViewController: LoginViewController,
    18
    +         rootViewController: UIViewController) {
    19
    +        self.rootViewController = rootViewController
    20
    +        self.loginViewController = loginViewController
    21
    +    }
    22
    +    
    23
    +    override func start() -> Observable<UserInfo> {
    24
    +        let viewModel = UserInfoViewModel()
    25
    +        loginViewController.userInfoViewModel = viewModel
    26
    +        return viewModel.shareUserInfo.asObservable()
    27
    +    }
    28
    +}

    + 8 - 2
    PaiAi/Paiai_iOS/App/LoginViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  LoginViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/17.
    5
    +//  Created by FFIB on 16/4/17.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -85,3 +85,9 @@ extension LoginViewController {
    85 85
                 }).disposed(by: disposeBag)
    86 86
         }
    87 87
     }
    88
    +
    89
    +extension LoginViewController: Storyboarded {
    90
    +    static func instantiate() -> LoginViewController {
    91
    +        return UIStoryboard.main.instantiateViewController(type: LoginViewController.self)
    92
    +    }
    93
    +}

    + 2 - 2
    PaiAi/Paiai_iOS/App/Message/MessageCommentAndThumbupCell.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  MessageCommentAndThumbupCell.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/8.
    5
    +//  Created by FFIB on 16/4/8.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 22 - 15
    PaiAi/Paiai_iOS/App/Message/MessageCoordinator.swift

    @@ -1,35 +1,43 @@
    1 1
     //
    2 2
     //  MessageCoordinator.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/7.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/7.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10
    +import RxSwift
    10 11
     import PaiaiDataKit
    11 12
     
    12
    -class MessageCoordinator: Coordinator {
    13
    -    let messageViewController: MessageViewController
    14
    -    let navigationController: UINavigationController
    15
    -    var shareUserInfoViewModel: UserInfoViewModel
    13
    +class MessageCoordinator: BaseCoordinator<Void> {
    14
    +    fileprivate let messageViewController: MessageViewController
    15
    +    fileprivate let navigationController: UINavigationController
    16 16
         
    17
    -    init(_ messageVC: MessageViewController,
    18
    -         navigationController: UINavigationController,
    19
    -         userInfoViewModel: UserInfoViewModel) {
    20
    -        messageViewController = messageVC
    17
    +    init(_ viewController: MessageViewController,
    18
    +         navigationController: UINavigationController) {
    19
    +        messageViewController = viewController
    21 20
             self.navigationController = navigationController
    22
    -        shareUserInfoViewModel = userInfoViewModel
    21
    +    }
    22
    +    
    23
    +    override func start() -> Observable<Void> {
    23 24
             messageViewController.viewModel.delegate = self
    25
    +        
    26
    +        return Observable.never()
    24 27
         }
    25 28
     }
    26 29
     
    27 30
     extension MessageCoordinator {
    28 31
         fileprivate func makeMessageListViewContorller(type: MessageType) -> MessageListViewController {
    29
    -        let vc = UIStoryboard.message.instantiateController(MessageListViewController.self)
    32
    +        let vc = MessageListViewController.instantiate()
    30 33
             vc.type = type
    31 34
             vc.viewModel = MessageListViewModel(type: type)
    32 35
             vc.viewModel.delegate = self
    36
    +        
    37
    +        /// 已读消息,红点提示显示与否
    38
    +        vc.viewModel.messageReaded.subscribe(onNext: { isReaded in
    39
    +            self.messageViewController.viewModel.readedTip.accept(!isReaded)
    40
    +        }).disposed(by: disposeBag)
    33 41
             return vc
    34 42
         }
    35 43
     }
    @@ -52,4 +60,3 @@ extension UIStoryboard {
    52 60
             return UIStoryboard(name: "Message", bundle: Bundle(identifier: "com.Paiai-iOS"))
    53 61
         }
    54 62
     }
    55
    -

    + 8 - 2
    PaiAi/Paiai_iOS/App/Message/MessageListViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  MessageListViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by mac on 16/5/13.
    5
    +//  Created by FFIB on 16/5/13.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -179,3 +179,9 @@ fileprivate extension MessageListViewController {
    179 179
     }
    180 180
     
    181 181
     extension MessageListViewController: NavigationBackViewController {}
    182
    +
    183
    +extension MessageListViewController: Storyboarded {
    184
    +    static func instantiate() -> MessageListViewController {
    185
    +        return UIStoryboard.message.instantiateViewController(type: MessageListViewController.self)
    186
    +    }
    187
    +}

    + 2 - 2
    PaiAi/Paiai_iOS/App/Message/MessageSystemCell.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  MessageSystemCell.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by mac on 16/5/13.
    5
    +//  Created by FFIB on 16/5/13.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 10 - 3
    PaiAi/Paiai_iOS/App/Message/MessageViewController.swift

    @@ -1,16 +1,17 @@
    1 1
     //
    2 2
     //  MessageViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5 5
     //  Created by FFIB on 2018/6/14.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    10 10
     import RxSwift
    11
    +import PaiaiUIKit
    11 12
     import PaiaiDataKit
    12 13
     
    13
    -class MessageViewController: UIViewController {
    14
    +final class MessageViewController: UIViewController {
    14 15
     
    15 16
         @IBOutlet weak var sysUnreadTip: UIView!
    16 17
         @IBOutlet weak var thumbupUnreadTip: UIView!
    @@ -62,3 +63,9 @@ extension MessageViewController {
    62 63
                 }).disposed(by: disposeBag)
    63 64
         }
    64 65
     }
    66
    +
    67
    +extension MessageViewController: Storyboarded {
    68
    +    static func instantiate() -> MessageViewController {
    69
    +        return UIStoryboard.message.instantiateViewController(type: MessageViewController.self)
    70
    +    }
    71
    +}

    + 2 - 2
    PaiAi/Paiai_iOS/App/Mine/GroupCell.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  GroupCell.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/4.
    5
    +//  Created by FFIB on 16/4/4.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 15 - 2
    PaiAi/Paiai_iOS/App/Mine/MineAboutViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  MineAboutViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/7.
    5
    +//  Created by FFIB on 16/4/7.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -21,6 +21,8 @@ final class MineAboutViewController: UIViewController {
    21 21
         
    22 22
         private var disposeBag = DisposeBag()
    23 23
         
    24
    +    var didCancel = PublishSubject<Void>()
    25
    +    
    24 26
         // MARK: view function
    25 27
         override func viewDidLoad() {
    26 28
             super.viewDidLoad()
    @@ -31,6 +33,11 @@ final class MineAboutViewController: UIViewController {
    31 33
             versionLabel.text = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
    32 34
             bindGestures()
    33 35
         }
    36
    +    
    37
    +    override func viewWillDisappear(_ animated: Bool) {
    38
    +        super.viewWillDisappear(animated)
    39
    +        didCancel.onNext(())
    40
    +    }
    34 41
     }
    35 42
     
    36 43
     fileprivate extension MineAboutViewController {
    @@ -73,3 +80,9 @@ fileprivate extension MineAboutViewController {
    73 80
     }
    74 81
     
    75 82
     extension MineAboutViewController: NavigationBackViewController {}
    83
    +
    84
    +extension MineAboutViewController: Storyboarded {
    85
    +    static func instantiate() -> MineAboutViewController {
    86
    +        return UIStoryboard.mine.instantiateViewController(type: MineAboutViewController.self)
    87
    +    }
    88
    +}

    + 36 - 23
    PaiAi/Paiai_iOS/App/Mine/MineCoordinator.swift

    @@ -1,38 +1,36 @@
    1 1
     //
    2 2
     //  MineCoordinator.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/6.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/6.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10
    +import RxSwift
    10 11
     import PaiaiDataKit
    11
    -import PaiaiUIKit
    12 12
     
    13
    -class MineCoordinator: Coordinator {
    13
    +class MineCoordinator: BaseCoordinator<Void> {
    14 14
         
    15 15
         let mineViewController: MineViewController
    16
    -    let navigationController: UINavigationController
    17
    -    var childCoordinator = [CoordinatorKey: Coordinator]()
    18
    -    let mainViewController: ContainerViewController
    19
    -//    let shareUserInfoViewModel
    16
    +    fileprivate let navigationController: UINavigationController
    20 17
         
    21
    -    init(_ mineViewController: MineViewController, navigationController: UINavigationController, mainViewController: ContainerViewController) {
    22
    -        self.mineViewController = mineViewController
    18
    +    init(_ viewController: MineViewController,
    19
    +         navigationController: UINavigationController) {
    20
    +        self.mineViewController = viewController
    23 21
             self.navigationController = navigationController
    24
    -        self.mainViewController = mainViewController
    25
    -        self.mineViewController.delegate = self
    26 22
         }
    27 23
         
    28
    -    func start() {
    29
    -        
    24
    +    override func start() -> Observable<Void> {
    25
    +        mineViewController.delegate = self
    26
    +        return didCancel
    30 27
         }
    31 28
     }
    32 29
     
    33 30
     extension MineCoordinator: MineViewControllerDelegate {
    34 31
         func logout() {
    35 32
             mineViewController.dismissController()
    33
    +        didCancel.onNext(())
    36 34
             
    37 35
             let vc = makeLoginViewController()
    38 36
             vc.userInfoViewModel = mineViewController.userInfoViewModel
    @@ -49,12 +47,24 @@ extension MineCoordinator: MineViewControllerDelegate {
    49 47
                 navigationController.pushViewController(vc)
    50 48
             case .order:
    51 49
                 let vc = makeMineOrderViewController()
    50
    +            
    51
    +            vc.viewModel.didCancel.subscribe { _ in
    52
    +                self.didCancel.onNext(())
    53
    +                }.disposed(by: disposeBag)
    52 54
                 navigationController.pushViewController(vc)
    53 55
             case .feedback:
    54 56
                 let vc = makeMineFeedbackViewController()
    57
    +            
    58
    +            vc.didCancel.subscribe { _ in
    59
    +                self.didCancel.onNext(())
    60
    +                }.disposed(by: disposeBag)
    55 61
                 navigationController.pushViewController(vc)
    56 62
             case .about:
    57 63
                 let vc = makeMineAboutViewController()
    64
    +            
    65
    +            vc.didCancel.subscribe { _ in
    66
    +                self.didCancel.onNext(())
    67
    +                }.disposed(by: disposeBag)
    58 68
                 navigationController.pushViewController(vc)
    59 69
             }
    60 70
         }
    @@ -66,39 +76,42 @@ extension MineCoordinator: MineViewControllerDelegate {
    66 76
     extension MineCoordinator: MineGroupViewModelDelegate {
    67 77
         func didSelect(_ item: GroupItem) {
    68 78
             let coordinator = GroupCoordinator(makeGroupViewController(item: item),
    69
    -                                           navigationController: navigationController)
    70
    -        childCoordinator[.group] = coordinator
    79
    +                                           navigationController: navigationController,
    80
    +                                           navigationSource: .mineGroup)
    81
    +        coordinate(to: coordinator).subscribe({[weak self] _ in
    82
    +            self?.didCancel.onNext(())
    83
    +        }).disposed(by: disposeBag)
    71 84
             navigationController.pushViewController(coordinator.groupViewController)
    72 85
         }
    73 86
     }
    74 87
     
    75 88
     fileprivate extension MineCoordinator {
    76 89
         func makeLoginViewController() -> LoginViewController {
    77
    -        let vc = UIStoryboard.main.instantiateController(LoginViewController.self)
    90
    +        let vc = LoginViewController.instantiate()
    78 91
     //        vc.userInfoViewModel = shareUserInfoViewModel
    79 92
             return vc
    80 93
         }
    81 94
         
    82 95
         func makeMineGroupViewController() -> MineGroupViewController {
    83
    -        let vc = UIStoryboard.mine.instantiateController(MineGroupViewController.self)
    96
    +        let vc = MineGroupViewController.instantiate()
    84 97
             vc.viewModel = MineGroupViewModel()
    85 98
             return vc
    86 99
         }
    87 100
         
    88 101
         func makeMineOrderViewController() -> MineOrderViewController {
    89
    -        let vc = UIStoryboard.mine.instantiateController(MineOrderViewController.self)
    102
    +        let vc = MineOrderViewController.instantiate()
    90 103
             vc.viewModel = MineOrderViewModel()
    91 104
             return vc
    92 105
         }
    93 106
         
    94 107
         func makeMineFeedbackViewController() -> MineFeedbackViewController {
    95
    -        let vc = UIStoryboard.mine.instantiateController(MineFeedbackViewController.self)
    108
    +        let vc = MineFeedbackViewController.instantiate()
    96 109
             vc.feedbackAPI = FeedbackRemoteAPI()
    97 110
             return vc
    98 111
         }
    99 112
         
    100 113
         func makeMineAboutViewController() -> MineAboutViewController {
    101
    -        let vc = UIStoryboard.mine.instantiateController(MineAboutViewController.self)
    114
    +        let vc = MineAboutViewController.instantiate()
    102 115
             return vc
    103 116
         }
    104 117
         

    + 14 - 2
    PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  MineFeedbackViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/7.
    5
    +//  Created by FFIB on 16/4/7.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -19,6 +19,7 @@ final class MineFeedbackViewController: UIViewController {
    19 19
         
    20 20
         fileprivate let disposeBag = DisposeBag()
    21 21
         var feedbackAPI: FeedbackRemoteAPI!
    22
    +    var didCancel = PublishSubject<Void>()
    22 23
         
    23 24
         override func viewDidLoad() {
    24 25
             super.viewDidLoad()
    @@ -27,6 +28,11 @@ final class MineFeedbackViewController: UIViewController {
    27 28
             textView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    28 29
             bindTextViewToSendBtn()
    29 30
         }
    31
    +    
    32
    +    override func viewWillDisappear(_ animated: Bool) {
    33
    +        super.viewWillDisappear(animated)
    34
    +        didCancel.onNext(())
    35
    +    }
    30 36
     }
    31 37
     
    32 38
     /// storyboard button action
    @@ -60,3 +66,9 @@ extension MineFeedbackViewController {
    60 66
     }
    61 67
     
    62 68
     extension MineFeedbackViewController: NavigationBackViewController {}
    69
    +
    70
    +extension MineFeedbackViewController: Storyboarded {
    71
    +    static func instantiate() -> MineFeedbackViewController {
    72
    +        return UIStoryboard.mine.instantiateViewController(type: MineFeedbackViewController.self)
    73
    +    }
    74
    +}

    + 8 - 2
    PaiAi/Paiai_iOS/App/Mine/MineGroupViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  MineGroupViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/4.
    5
    +//  Created by FFIB on 16/4/4.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -132,3 +132,9 @@ fileprivate extension MineGroupViewController {
    132 132
     }
    133 133
     
    134 134
     extension MineGroupViewController: NavigationBackViewController {}
    135
    +
    136
    +extension MineGroupViewController: Storyboarded {
    137
    +    static func instantiate() -> MineGroupViewController {
    138
    +        return UIStoryboard.mine.instantiateViewController(type: MineGroupViewController.self)
    139
    +    }
    140
    +}

    + 8 - 2
    PaiAi/Paiai_iOS/App/Mine/MineOrderViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  MineOrderViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/7.
    5
    +//  Created by FFIB on 16/4/7.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -115,3 +115,9 @@ fileprivate extension MineOrderViewController {
    115 115
     }
    116 116
     
    117 117
     extension MineOrderViewController: NavigationBackViewController {}
    118
    +
    119
    +extension MineOrderViewController: Storyboarded {
    120
    +    static func instantiate() -> MineOrderViewController {
    121
    +        return UIStoryboard.mine.instantiateViewController(type: MineOrderViewController.self)
    122
    +    }
    123
    +}

    + 12 - 6
    PaiAi/Paiai_iOS/App/Mine/MineViewController.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  MineViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/6.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/6.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    @@ -29,7 +29,7 @@ extension MineItem: CaseIterable {
    29 29
         }
    30 30
     }
    31 31
     
    32
    -class MineViewController: SideViewController {
    32
    +final class MineViewController: SideViewController {
    33 33
     
    34 34
         @IBOutlet weak var headerImageView: UIImageView!
    35 35
         @IBOutlet weak var nickNameLabel: UILabel!
    @@ -40,10 +40,10 @@ class MineViewController: SideViewController {
    40 40
             return mineView
    41 41
         }
    42 42
         
    43
    -    lazy var menuImage: [String] = {
    43
    +    fileprivate lazy var menuImage: [String] = {
    44 44
             return ["mine-group", "mine-order", "mine-feedback", "mine-about"]
    45 45
         }()
    46
    -    lazy var menuTitle: [String] = {
    46
    +    fileprivate lazy var menuTitle: [String] = {
    47 47
             return ["我的照片群", "订单记录", "意见反馈", "关于"]
    48 48
         }()
    49 49
         
    @@ -93,3 +93,9 @@ extension MineViewController: UITableViewDelegate {
    93 93
             delegate?.didSelect(MineItem.allCases[indexPath.row])
    94 94
         }
    95 95
     }
    96
    +
    97
    +extension MineViewController: Storyboarded {
    98
    +    static func instantiate() -> MineViewController {
    99
    +        return UIStoryboard.mine.instantiateViewController(type: MineViewController.self)
    100
    +    }
    101
    +}

    + 2 - 2
    PaiAi/Paiai_iOS/App/Mine/OrderCell.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  OrderCell.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/21.
    5
    +//  Created by FFIB on 16/4/21.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 2 - 3
    PaiAi/Paiai_iOS/App/PhotoCell.swift

    @@ -1,9 +1,9 @@
    1 1
     //
    2 2
     //  PhotoCell.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5 5
     //  Created by FFIB on 2017/10/27.
    6
    -//  Copyright © 2017年 yb. All rights reserved.
    6
    +//  Copyright © 2017年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit
    @@ -27,7 +27,6 @@ class PhotoCell: UICollectionViewCell {
    27 27
         func setInfo(_ info: PhotoItem, source: PhotoCellSource) {
    28 28
             headImageView.cornerRadius = 15
    29 29
             headImageView.borderWidth = 0.5
    30
    -        headLabel.text = info.group_name
    31 30
             
    32 31
             switch source {
    33 32
             case .home:

    + 2 - 2
    PaiAi/Paiai_iOS/App/PhotoDetail/ImageCell.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  ImageCell.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/9.
    5
    +//  Created by FFIB on 16/4/9.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 2 - 2
    PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCommentCell.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  PhotoDetailCommentCell.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/8.
    5
    +//  Created by FFIB on 16/4/8.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 13 - 14
    PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCoordinator.swift

    @@ -2,33 +2,31 @@
    2 2
     //  PhotoDetailCoordinator.swift
    3 3
     //  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/19.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/19.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9
    -import Foundation
    9
    +import UIKit
    10
    +import RxSwift
    10 11
     import PaiaiDataKit
    11 12
     
    12
    -final class PhotoDetailCoordinator: Coordinator {
    13
    +final class PhotoDetailCoordinator: BaseCoordinator<Void> {
    13 14
         let navigationController: UINavigationController
    14 15
         let photoDetailViewController: PhotoDetailViewController
    15 16
         let shareViewModel: PhotoDetailViewModel
    16 17
         
    17
    -    fileprivate var coordinators = [CoordinatorKey: Coordinator]()
    18
    -    
    19 18
         init(_ photoDetailVC: PhotoDetailViewController,
    20 19
              nav: UINavigationController,
    21 20
              viewModel: PhotoDetailViewModel) {
    22 21
             photoDetailViewController = photoDetailVC
    23 22
             shareViewModel = viewModel
    24 23
             navigationController = nav
    25
    -        photoDetailViewController.viewModel = viewModel
    26
    -        
    27
    -        viewModel.delegate = self
    24
    +        photoDetailViewController.viewModel = viewModel        
    28 25
         }
    29 26
         
    30
    -    func start() {
    31
    -        
    27
    +    override func start() -> Observable<Void> {
    28
    +        photoDetailViewController.viewModel.delegate = self
    29
    +        return .never()
    32 30
         }
    33 31
     }
    34 32
     
    @@ -37,14 +35,15 @@ extension PhotoDetailCoordinator: PhotoDetailViewModelDelegate {
    37 35
             let vc = GroupViewController.instantiate()
    38 36
             vc.viewModel = GroupViewModel(groupItem: item)
    39 37
             let coordinator = GroupCoordinator(vc,
    40
    -                                           navigationController: navigationController)
    41
    -        coordinators[.group] = coordinator
    38
    +                                           navigationController: navigationController,
    39
    +                                           navigationSource: .photoDetail)
    42 40
             
    41
    +        coordinate(to: coordinator).subscribe().disposed(by: disposeBag)
    43 42
             navigationController.pushViewController(vc)
    44 43
         }
    45 44
         
    46 45
         func didSelected() {
    47
    -        let vc = UIStoryboard.photoDetail.instantiateController(PhotoPreviewViewController.self)
    46
    +        let vc = PhotoPreviewViewController.instantiate()
    48 47
             vc.viewModel = shareViewModel
    49 48
             photoDetailViewController.presentController(vc)
    50 49
         }

    + 2 - 2
    PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailImageCell.swift

    @@ -2,8 +2,8 @@
    2 2
     //  PhotoDetailImageCell.swift
    3 3
     //  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2019/3/19.
    6
    -//  Copyright © 2019 yb. All rights reserved.
    5
    +//  Created by FFIB on 2019/3/19.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     import UIKit

    + 13 - 7
    PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  PhotoDetailViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/6.
    5
    +//  Created by FFIB on 16/4/6.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -97,11 +97,11 @@ extension PhotoDetailViewController {
    97 97
     /// bind storyboard button action
    98 98
     extension PhotoDetailViewController {
    99 99
         @IBAction func share() {
    100
    -        let ctl = UIStoryboard.photoDetail.instantiateController(ShareViewController.self)
    101
    -        ctl.shareContent = "我使用拍爱分享了一张美图,你也快来试试吧"
    102
    -        //        ctl.shareImgUrlThumb = datas[currentPhotoIndex].photo_thumbnail_url
    103
    -        //        ctl.shareUrl = datas[currentPhotoIndex].photo_share_url
    104
    -        presentController(ctl)
    100
    +//        let ctl = ShareViewController UIStoryboard.photoDetail.instantiateController(ShareViewController.self)
    101
    +//        ctl.shareContent = "我使用拍爱分享了一张美图,你也快来试试吧"
    102
    +//        //        ctl.shareImgUrlThumb = datas[currentPhotoIndex].photo_thumbnail_url
    103
    +//        //        ctl.shareUrl = datas[currentPhotoIndex].photo_share_url
    104
    +//        presentController(ctl)
    105 105
         }
    106 106
         
    107 107
         @IBAction func comment() {
    @@ -380,3 +380,9 @@ extension PhotoDetailViewController: UICollectionViewDelegateFlowLayout {
    380 380
     }
    381 381
     
    382 382
     extension PhotoDetailViewController: NavigationBackViewController {}
    383
    +
    384
    +extension PhotoDetailViewController: Storyboarded {
    385
    +    static func instantiate() -> PhotoDetailViewController {
    386
    +        return UIStoryboard.photoDetail.instantiateViewController(type: PhotoDetailViewController.self)
    387
    +    }
    388
    +}

    + 8 - 2
    PaiAi/Paiai_iOS/App/PhotoDetail/PhotoPreviewViewController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  PhotoPreviewViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/9.
    5
    +//  Created by FFIB on 16/4/9.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    @@ -122,3 +122,9 @@ extension PhotoPreviewViewController: UICollectionViewDelegateFlowLayout {
    122 122
             return CGSize(width: collectionView.width, height: collectionView.height - 20)
    123 123
         }
    124 124
     }
    125
    +
    126
    +extension PhotoPreviewViewController: Storyboarded {
    127
    +    static func instantiate() -> PhotoPreviewViewController {
    128
    +        return UIStoryboard.photoDetail.instantiateViewController(type: PhotoPreviewViewController.self)
    129
    +    }
    130
    +}

    + 2 - 2
    PaiAi/Paiai_iOS/App/PhotoDetail/ShareController.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  ShareViewController.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by zhengjianfei on 16/4/7.
    5
    +//  Created by FFIB on 16/4/7.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 2 - 2
    PaiAi/Paiai_iOS/Paiai_iOS.h

    @@ -2,8 +2,8 @@
    2 2
     //  Paiai_iOS.h
    3 3
     //  Paiai_iOS
    4 4
     //
    5
    -//  Created by ffib on 2018/12/19.
    6
    -//  Copyright © 2018 yb. All rights reserved.
    5
    +//  Created by FFIB on 2018/12/19.
    6
    +//  Copyright © 2018 FFIB. All rights reserved.
    7 7
     //
    8 8
     
    9 9
     #import <UIKit/UIKit.h>

    + 41 - 0
    PaiAi/Paiai_iOS/Reusable/BaseCoordinator.swift

    @@ -0,0 +1,41 @@
    1
    +//
    2
    +//  BaseCoordinator.swift
    3
    +//  Paiai_iOS
    4
    +//
    5
    +//  Created by FFIB on 2019/4/29.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7
    +//
    8
    +
    9
    +import RxSwift
    10
    +import Foundation
    11
    +
    12
    +public class BaseCoordinator<ResultType> {
    13
    +    
    14
    +    typealias CoordinationResult = ResultType
    15
    +    
    16
    +    let disposeBag = DisposeBag()
    17
    +    let didCancel = PublishSubject<Void>()
    18
    +    
    19
    +    private let identifier = UUID()
    20
    +    private var childCoordinators = [UUID: Any]()
    21
    +    
    22
    +    private func store<T>(coordinator: BaseCoordinator<T>) {
    23
    +        childCoordinators[coordinator.identifier] = coordinator
    24
    +    }
    25
    +    
    26
    +    private func free<T>(coordinator: BaseCoordinator<T>) {
    27
    +        childCoordinators[coordinator.identifier] = nil
    28
    +    }
    29
    +    
    30
    +    func coordinate<T>(to coordinator: BaseCoordinator<T>) -> Observable<T> {
    31
    +        store(coordinator: coordinator)
    32
    +        return coordinator.start()
    33
    +            .do(onNext: { [weak self] _ in
    34
    +                self?.free(coordinator: coordinator)
    35
    +            })
    36
    +    }
    37
    +
    38
    +    func start() -> Observable<ResultType> {
    39
    +        fatalError("Start method should be implemented.")
    40
    +    }
    41
    +}

    + 2 - 2
    PaiAi/Paiai_iOS/Reusable/Extension/UIImageView+Kingfisher.swift

    @@ -1,8 +1,8 @@
    1 1
     //
    2 2
     //  UIImageView+Kingfisher.swift
    3
    -//  PaiAi
    3
    +//  Paiai_iOS
    4 4
     //
    5
    -//  Created by mac on 16/7/21.
    5
    +//  Created by FFIB on 16/7/21.
    6 6
     //  Copyright © 2016年 FFIB. All rights reserved.
    7 7
     //
    8 8
     

    + 11 - 0
    PaiAi/Paiai_iOS/Reusable/NavigationSource.swift

    @@ -0,0 +1,11 @@
    1
    +//
    2
    +//  NavigationSource.swift
    3
    +//  Paiai_iOS
    4
    +//
    5
    +//  Created by ffib on 2019/5/5.
    6
    +//  Copyright © 2019 FFIB. All rights reserved.
    7
    +//
    8
    +
    9
    +import Foundation
    10
    +
    11
    +enum NavigationSource {}

    上传会员章程图片 · 3155bfee07 - Gogs: Go Git Service

    上传会员章程图片

    FFIB 6 years ago
    parent
    commit
    3155bfee07

    + 119 - 0
    page/templates/page/img/bottom_logo.svg

    @@ -0,0 +1,119 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 180 50" style="enable-background:new 0 0 180 50;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#666766;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<path class="st0" d="M45.9,29.8C43.7,39.3,35.2,46.5,25,46.5C13.2,46.5,3.5,36.8,3.5,25S13.2,3.5,25,3.5c10.3,0,18.9,7.3,21,16.9
    11
    +			h3.6C47.4,8.8,37.2,0,25,0C11.2,0,0,11.2,0,25s11.2,25,25,25c12.1,0,22.3-8.7,24.5-20.2H45.9z"/>
    12
    +		<path class="st0" d="M16.4,13.3h14.4c0.8,0.2,4.3,1.3,4.3,5.1c0,3.8-3.9,4.4-4.6,4.5h-8.6v3.2l14.1,12.9h4.9l-14-12.8h3.7l0.1,0
    13
    +			c2.7-0.2,7.7-2.1,7.7-7.8c0-5.6-4.7-7.9-7.1-8.4l-18.2,0v29.1h15.5v-3.3H16.4V13.3z"/>
    14
    +	</g>
    15
    +	<g>
    16
    +		<g>
    17
    +			<polygon class="st0" points="55.7,12 55.7,6.6 53.1,6.6 53.1,5.1 59.7,5.1 59.7,6.6 57.1,6.6 57.1,12 			"/>
    18
    +			<g>
    19
    +				<path class="st0" d="M65.3,12l-0.4-1.5h-2.9L61.5,12h-1.5l2-6.9h2.9l2,6.9H65.3z M62.3,9.2h2.1l-0.8-2.6h-0.6L62.3,9.2z"/>
    20
    +			</g>
    21
    +			<g>
    22
    +				<path class="st0" d="M89.1,12.2c-1.3,0-2.5-0.1-3-1.4c-0.2-0.4-0.2-0.9-0.2-2.2s0-1.8,0.2-2.2c0.5-1.3,1.7-1.4,3-1.4
    23
    +					c1.3,0,2.5,0.1,3,1.4c0.2,0.4,0.2,0.9,0.2,2.2s0,1.8-0.2,2.2C91.6,12.1,90.4,12.2,89.1,12.2z M89.1,6.4c-0.7,0-1.4,0.1-1.6,0.7
    24
    +					c-0.1,0.2-0.1,0.7-0.1,1.4s0,1.2,0.1,1.4c0.2,0.7,0.9,0.7,1.6,0.7c0.7,0,1.4-0.1,1.6-0.7c0.1-0.2,0.1-0.7,0.1-1.4s0-1.2-0.1-1.4
    25
    +					C90.5,6.5,89.7,6.4,89.1,6.4z"/>
    26
    +			</g>
    27
    +			<path class="st0" d="M82.7,12L81.6,10h-2.1V12H78V5.1h3.7c1.2,0,1.9,0.4,2.1,1.1C83.9,6.5,84,6.8,84,7.5s0,1.1-0.1,1.3
    28
    +				c-0.1,0.3-0.3,0.6-0.6,0.8l-0.1,0l1.2,2.4L82.7,12z M79.5,8.5h2c0.4,0,0.7,0,0.9-0.3c0.1-0.1,0.1-0.3,0.1-0.7
    29
    +				c0-0.4,0-0.5-0.1-0.7c-0.2-0.3-0.5-0.3-0.9-0.3h-2V8.5z"/>
    30
    +		</g>
    31
    +		<polygon class="st0" points="73.4,5.1 72.1,9.1 70.7,5.1 68.4,5.1 68.4,12 69.9,12 69.9,6.7 71.3,10.8 72.8,10.8 74.3,6.7 
    32
    +			74.3,12 75.8,12 75.8,5.1 		"/>
    33
    +		<polygon class="st0" points="98.8,5.1 98.8,9.8 96.2,5.1 96.2,5.1 94.3,5.1 94.3,5.1 94.3,12 94.3,12 95.8,12 95.8,12 95.8,7.3 
    34
    +			98.4,12 100.3,12 100.3,5.1 		"/>
    35
    +	</g>
    36
    +	<polygon class="st0" points="112.3,15.8 112.3,36 115.1,36 115.1,18.1 124.7,18.1 124.7,36 127.5,36 127.5,15.8 	"/>
    37
    +	
    38
    +		<rect x="118.4" y="16" transform="matrix(0.7071 0.7071 -0.7071 0.7071 52.1315 -77.7342)" class="st0" width="2.9" height="16.2"/>
    39
    +	
    40
    +		<rect x="106.2" y="14.5" transform="matrix(0.7071 0.7071 -0.7071 0.7071 44.6508 -70.6954)" class="st0" width="2.9" height="8.1"/>
    41
    +	<rect x="106.8" y="21.3" class="st0" width="2.9" height="14.7"/>
    42
    +	<rect x="131" y="29.8" class="st0" width="2.9" height="6.2"/>
    43
    +	<rect x="149.2" y="29.8" class="st0" width="2.9" height="6.2"/>
    44
    +	<rect x="154.7" y="28.6" class="st0" width="2.9" height="7.3"/>
    45
    +	<rect x="165.6" y="28.3" class="st0" width="2.9" height="7.3"/>
    46
    +	<rect x="140.1" y="19.7" class="st0" width="2.9" height="16.3"/>
    47
    +	<rect x="170.2" y="15.8" class="st0" width="2.9" height="20.2"/>
    48
    +	<rect x="175.1" y="15.9" class="st0" width="2.9" height="15"/>
    49
    +	<rect x="131" y="17.7" class="st0" width="2.9" height="8"/>
    50
    +	
    51
    +		<rect x="140.1" y="14.4" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 166.5932 -116.5496)" class="st0" width="2.9" height="21.2"/>
    52
    +	
    53
    +		<rect x="140.1" y="6.7" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 158.8005 -124.3423)" class="st0" width="2.9" height="21.2"/>
    54
    +	<g>
    55
    +		<path class="st0" d="M55.5,36h2.9v-4.8h2.3l0,4.8h2.8V15.7h-8L55.5,36z M58.4,18.1h2.3V22h-2.3V18.1z M58.4,24.4h2.3v4.5h-2.3
    56
    +			V24.4z"/>
    57
    +		<polygon class="st0" points="64.6,34.8 73.5,34.8 73.5,32.7 64.6,32.7 		"/>
    58
    +		<polygon class="st0" points="68.5,28 65.2,28 64.2,31.4 74.9,31.4 74.9,36 78,36 78,29.5 68,29.5 		"/>
    59
    +		<path class="st0" d="M78.2,20v-2h-1.4l0.7-2h-3.4l-0.7,2h-0.5v-2.3h-3.1V18H69l-0.9-2H65l0.8,2h-1.6v2h5l-0.8,1.2h-4.1v2h2.7
    60
    +			l-1.4,2h-1.4v2.1h3.3l0.3-0.4h4.9l0,2h3.1l0-1.2h2.3v-2.4h-1.9l-1.6-2h3.5v-2h-6.4l0.9-1.2H78.2z M72.6,24.9h-3.5l1.2-1.7h1
    61
    +			L72.6,24.9z"/>
    62
    +	</g>
    63
    +	<rect x="154.7" y="19.7" class="st0" width="4.7" height="2.9"/>
    64
    +	<rect x="163.8" y="19.7" class="st0" width="4.7" height="2.9"/>
    65
    +	<rect x="159.6" y="15.1" class="st0" width="4.1" height="2.5"/>
    66
    +	
    67
    +		<rect x="160.1" y="18.1" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 186.6234 -136.5797)" class="st0" width="2.9" height="13.8"/>
    68
    +	
    69
    +		<rect x="162.8" y="30.3" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 198.8153 -129.8212)" class="st0" width="2.9" height="8.4"/>
    70
    +	
    71
    +		<rect x="160.1" y="22.5" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 191.0462 -132.157)" class="st0" width="2.9" height="13.8"/>
    72
    +	
    73
    +		<rect x="173.8" y="26.6" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 204.7047 -145.8155)" class="st0" width="2.9" height="5.7"/>
    74
    +	
    75
    +		<rect x="160.1" y="10.3" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 178.8306 -144.3725)" class="st0" width="2.9" height="13.8"/>
    76
    +	
    77
    +		<rect x="173.7" y="14.4" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 192.4512 -157.9931)" class="st0" width="2.9" height="5.7"/>
    78
    +	
    79
    +		<rect x="118.4" y="22.6" transform="matrix(-1.836970e-16 1 -1 -1.836970e-16 151.1872 -88.6112)" class="st0" width="2.9" height="17.3"/>
    80
    +	<polygon class="st0" points="102.6,21.6 102.6,21 102.6,21 102.6,18.6 99.4,18.6 99.4,15.8 96.2,15.8 96.2,18.6 88.6,18.6 
    81
    +		89.4,14.8 86,14.8 85.2,18.6 80.2,18.6 80.2,21 80.2,21 80.2,21.6 84.6,21.6 82.3,33 80,33 80,36 82.5,36 85.2,36 88,21.6 
    82
    +		91.1,21.6 91.1,27.1 88.3,27.7 88.3,30.9 91.1,30.2 91.1,36 93.9,36 102.3,36 102.6,36 102.6,33 94.2,33 94.2,29.4 101.1,27.8 
    83
    +		102,27.5 102,24.4 94.2,26.3 94.2,21.6 	"/>
    84
    +	<g>
    85
    +		<path class="st0" d="M55.6,41.1h1.2v4.1h2v1h-3.2V41.1z"/>
    86
    +		<path class="st0" d="M62.1,43.8v-2.7h1.2V44c0,1,0.3,1.3,0.8,1.3c0.6,0,0.9-0.3,0.9-1.3v-2.8h1.2v2.7c0,1.7-0.7,2.5-2,2.5
    87
    +			C62.8,46.3,62.1,45.6,62.1,43.8z"/>
    88
    +		<path class="st0" d="M70,41.1h1.3l0.8,2.2c0.1,0.3,0.2,0.6,0.3,0.9h0c0.1-0.3,0.2-0.6,0.3-0.9l0.8-2.2h1.3v5.1h-1.1v-1.7
    89
    +			c0-0.5,0.1-1.3,0.2-1.8h0l-0.4,1.2l-0.7,1.9h-0.7l-0.7-1.9L71,42.7h0c0.1,0.5,0.2,1.3,0.2,1.8v1.7H70V41.1z"/>
    90
    +		<path class="st0" d="M78.8,41.1H80v5.1h-1.2V41.1z"/>
    91
    +		<path class="st0" d="M83.9,41.1h1.2l1.3,2.4l0.5,1.1h0c-0.1-0.5-0.2-1.3-0.2-1.9v-1.7h1.2v5.1h-1.2l-1.3-2.5l-0.5-1.1h0
    92
    +			c0.1,0.6,0.2,1.3,0.2,1.9v1.7h-1.2V41.1z"/>
    93
    +		<path class="st0" d="M94.3,45.1h-1.5l-0.3,1.2h-1.2l1.6-5.1h1.5l1.6,5.1h-1.3L94.3,45.1z M94,44.1l-0.1-0.4
    94
    +			c-0.1-0.5-0.3-1.1-0.4-1.6h0c-0.1,0.5-0.3,1.1-0.4,1.6L93,44.1H94z"/>
    95
    +		<path class="st0" d="M99,43.8v-2.7h1.2V44c0,1,0.3,1.3,0.8,1.3c0.6,0,0.9-0.3,0.9-1.3v-2.8h1.2v2.7c0,1.7-0.7,2.5-2,2.5
    96
    +			C99.7,46.3,99,45.6,99,43.8z"/>
    97
    +		<path class="st0" d="M106.6,45.6l0.7-0.8c0.4,0.3,0.8,0.5,1.2,0.5c0.5,0,0.7-0.2,0.7-0.4c0-0.3-0.3-0.4-0.7-0.6l-0.6-0.3
    98
    +			c-0.5-0.2-1-0.7-1-1.4c0-0.9,0.8-1.5,1.8-1.5c0.6,0,1.2,0.2,1.7,0.7l-0.6,0.8c-0.3-0.3-0.6-0.4-1-0.4c-0.4,0-0.6,0.2-0.6,0.4
    99
    +			c0,0.3,0.3,0.4,0.8,0.6l0.6,0.3c0.6,0.3,1,0.7,1,1.4c0,0.8-0.7,1.6-1.9,1.6C107.8,46.3,107.1,46.1,106.6,45.6z"/>
    100
    +		<path class="st0" d="M121.1,46.2l-0.9-1.8h-0.6v1.8h-1.2v-5.1h1.9c1.1,0,2,0.4,2,1.6c0,0.7-0.3,1.2-0.9,1.5l1.1,2H121.1z
    101
    +			 M119.5,43.5h0.5c0.6,0,0.9-0.3,0.9-0.7c0-0.5-0.3-0.6-0.9-0.6h-0.5V43.5z"/>
    102
    +		<path class="st0" d="M125.9,41.1h1.2v5.1h-1.2V41.1z"/>
    103
    +		<path class="st0" d="M131,41.1h1.2l1.3,2.4l0.5,1.1h0c-0.1-0.5-0.2-1.3-0.2-1.9v-1.7h1.2v5.1h-1.2l-1.3-2.5l-0.5-1.1h0
    104
    +			c0.1,0.6,0.2,1.3,0.2,1.9v1.7H131V41.1z"/>
    105
    +		<path class="st0" d="M138.8,43.7c0-1.7,1.1-2.7,2.5-2.7c0.7,0,1.3,0.3,1.6,0.7l-0.7,0.8c-0.2-0.2-0.5-0.4-0.9-0.4
    106
    +			c-0.8,0-1.3,0.6-1.3,1.6c0,1,0.5,1.6,1.4,1.6c0.2,0,0.4,0,0.5-0.1v-0.8h-0.8v-1h1.9v2.4c-0.4,0.3-1,0.6-1.7,0.6
    107
    +			C139.9,46.3,138.8,45.4,138.8,43.7z"/>
    108
    +		<path class="st0" d="M150.8,43.7c0-1.7,1.1-2.7,2.4-2.7c0.7,0,1.2,0.3,1.5,0.7l-0.6,0.8c-0.3-0.2-0.5-0.4-0.9-0.4
    109
    +			c-0.7,0-1.2,0.6-1.2,1.6c0,1,0.5,1.6,1.2,1.6c0.4,0,0.7-0.2,1-0.5l0.6,0.8c-0.4,0.5-1,0.8-1.7,0.8
    110
    +			C151.9,46.3,150.8,45.4,150.8,43.7z"/>
    111
    +		<path class="st0" d="M158.3,41.1h1.2v4.1h2v1h-3.2V41.1z"/>
    112
    +		<path class="st0" d="M164.8,43.8v-2.7h1.2V44c0,1,0.3,1.3,0.8,1.3c0.6,0,0.9-0.3,0.9-1.3v-2.8h1.2v2.7c0,1.7-0.7,2.5-2,2.5
    113
    +			C165.6,46.3,164.8,45.6,164.8,43.8z"/>
    114
    +		<path class="st0" d="M172.8,41.1h1.8c1.1,0,1.9,0.3,1.9,1.3c0,0.5-0.3,0.9-0.7,1.1v0c0.5,0.1,0.9,0.5,0.9,1.2c0,1-0.9,1.5-2,1.5
    115
    +			h-1.9V41.1z M174.6,43.2c0.5,0,0.8-0.2,0.8-0.6c0-0.4-0.2-0.5-0.8-0.5h-0.5v1.1H174.6z M174.7,45.3c0.6,0,0.9-0.2,0.9-0.6
    116
    +			c0-0.4-0.3-0.6-0.9-0.6h-0.6v1.2H174.7z"/>
    117
    +	</g>
    118
    +</g>
    119
    +</svg>

    + 35 - 0
    page/templates/page/img/gujianshengji_icon.svg

    @@ -0,0 +1,35 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<path class="st0" d="M19.6,16.5h-3v-0.7h3c2,0,3.7-1.7,3.7-3.7c0-1.5-0.9-2.9-2.3-3.4l-0.3-0.1l0-0.3c0.1-0.4,0.1-0.7,0.1-1.1
    11
    +			c0-3.7-2.6-6.5-6-6.5c-1.8,0-3.1,0.7-4.5,2.3l-0.2,0.3L9.8,3.1C9,2.6,8.5,2.3,7.5,2.3c-2.5,0-4.3,2-4.3,4.8c0,0.4,0,0.8,0.1,1.2
    12
    +			l0.1,0.3L3.1,8.7c-1.4,0.5-2.4,1.9-2.4,3.4c0,2,1.7,3.7,3.7,3.7h1.2v0.7H4.4c-2.4,0-4.4-2-4.4-4.4c0-1.7,1-3.3,2.6-4
    13
    +			c-0.1-0.3-0.1-0.7-0.1-1c0-3.2,2.1-5.5,5.1-5.5c1.1,0,1.7,0.3,2.4,0.8C11.4,0.7,12.9,0,14.8,0c3.8,0,6.7,3.1,6.7,7.2
    14
    +			c0,0.3,0,0.6-0.1,0.9c1.6,0.7,2.5,2.3,2.5,4C24,14.5,22,16.5,19.6,16.5z"/>
    15
    +	</g>
    16
    +	<g>
    17
    +		<path class="st0" d="M11.7,19.6c-2.1,0-4.1-1.3-4.9-3.4c-1-2.7,0.4-5.7,3.1-6.7l0.3,0.7c-2.3,0.9-3.5,3.5-2.7,5.8
    18
    +			c0.9,2.3,3.5,3.5,5.8,2.7c2.2-0.8,3.4-3.2,2.8-5.5l0.7-0.2c0.7,2.6-0.7,5.4-3.2,6.3C12.9,19.5,12.3,19.6,11.7,19.6z"/>
    19
    +	</g>
    20
    +	<g>
    21
    +		<polygon class="st0" points="11.2,11.4 10.6,11.1 11.4,9.2 9.6,8.4 9.9,7.7 12.4,8.9 		"/>
    22
    +	</g>
    23
    +	<g>
    24
    +		<g>
    25
    +			<rect x="2.5" y="19.9" class="st0" width="4.4" height="0.7"/>
    26
    +		</g>
    27
    +		<g>
    28
    +			<rect x="4.8" y="21.6" class="st0" width="4.4" height="0.7"/>
    29
    +		</g>
    30
    +		<g>
    31
    +			<rect x="6.8" y="23.3" class="st0" width="4.4" height="0.7"/>
    32
    +		</g>
    33
    +	</g>
    34
    +</g>
    35
    +</svg>

    + 22 - 0
    page/templates/page/img/huodongyaoyue_icon.svg

    @@ -0,0 +1,22 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<path class="st0" d="M13,21.3c-0.1,0-0.1,0-0.2-0.1C6.7,17.6,0.9,13.6,0.1,8.3c-0.4-2.3,0.1-4.4,1.3-5.9C2.6,0.7,4.2-0.1,6,0
    11
    +			c2.1,0.1,4.3,1.3,6,3.4c1.7-2.1,3.9-3.3,6-3.4c1.7-0.1,3.3,0.7,4.6,2.3c1.2,1.5,1.7,3.6,1.4,5.9c-0.6,4.4-5.1,7.9-9.5,11.2
    12
    +			L14,19.8c-0.2,0.1-0.4,0.1-0.5-0.1c-0.1-0.2-0.1-0.4,0.1-0.5l0.5-0.4c4.3-3.3,8.7-6.6,9.2-10.7C23.5,6,23,4.1,22,2.8
    13
    +			c-1.1-1.4-2.5-2.1-4-2.1c-2.9,0.1-5.1,2.7-5.7,3.5c-0.1,0.2-0.4,0.2-0.6,0C11.1,3.4,8.9,0.8,6,0.7C4.4,0.7,3.1,1.4,2,2.8
    14
    +			C0.9,4.1,0.5,6,0.8,8.2c0.8,5,6.7,9.1,12.3,12.4c0.2,0.1,0.2,0.3,0.1,0.5C13.2,21.2,13.1,21.3,13,21.3z"/>
    15
    +	</g>
    16
    +	<g>
    17
    +		<path class="st0" d="M12.3,24c-0.4,0-0.7-0.1-1-0.3c-0.8-0.6-1-1.7-0.5-2.5c0.1-0.2,0.3-0.2,0.5-0.1c0.2,0.1,0.2,0.3,0.1,0.5
    18
    +			c-0.3,0.5-0.2,1.2,0.3,1.5c0.2,0.2,0.5,0.2,0.8,0.2c0.3-0.1,0.5-0.2,0.7-0.5c0.3-0.5,0.2-1.2-0.3-1.5c-0.2-0.1-0.2-0.3-0.1-0.5
    19
    +			c0.1-0.2,0.3-0.2,0.5-0.1c0.8,0.6,1,1.7,0.5,2.5c-0.3,0.4-0.7,0.7-1.2,0.8C12.5,24,12.4,24,12.3,24z"/>
    20
    +	</g>
    21
    +</g>
    22
    +</svg>

    + 24 - 0
    page/templates/page/img/jifenzengzhi_icon.svg

    @@ -0,0 +1,24 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<path class="st0" d="M9.2,14.7c-2.9-1.2-4.8-3.9-4.8-7.1C4.4,3.4,7.8,0,12,0c4.2,0,7.6,3.4,7.6,7.6c0,0.7-0.1,1.4-0.3,2l-0.7-0.2
    11
    +			c0.2-0.6,0.2-1.2,0.2-1.8c0-3.8-3.1-6.9-6.9-6.9S5.1,3.8,5.1,7.6c0,2.8,1.7,5.4,4.4,6.4L9.2,14.7z"/>
    12
    +	</g>
    13
    +	<g>
    14
    +		<path class="st0" d="M16.4,24c-4.2,0-7.6-3.4-7.6-7.6c0-4.2,3.4-7.6,7.6-7.6c0.9,0,1.8,0.2,2.7,0.5c2.9,1.1,4.9,4,4.9,7.1
    15
    +			C24,20.6,20.6,24,16.4,24z M16.4,9.5c-3.8,0-6.9,3.1-6.9,6.9s3.1,6.9,6.9,6.9s6.9-3.1,6.9-6.9c0-2.9-1.8-5.4-4.5-6.4
    16
    +			C18,9.6,17.2,9.5,16.4,9.5z"/>
    17
    +	</g>
    18
    +	<g>
    19
    +		<path class="st0" d="M7.6,24C3.4,24,0,20.6,0,16.4c0-3.2,1.9-5.9,4.8-7.1L5.1,10c-2.7,1-4.4,3.6-4.4,6.4c0,3.8,3.1,6.9,6.9,6.9
    20
    +			c1.5,0,2.9-0.5,4.1-1.4c1.8-1.3,2.8-3.3,2.8-5.5c0-2.2-1-4.2-2.7-5.5l0.4-0.6c1.9,1.5,3,3.7,3,6c0,2.4-1.1,4.6-3,6.1
    21
    +			C10.9,23.5,9.3,24,7.6,24z"/>
    22
    +	</g>
    23
    +</g>
    24
    +</svg>

    + 112 - 0
    page/templates/page/img/logo.svg

    @@ -0,0 +1,112 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 450 127" style="enable-background:new 0 0 450 127;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#FFFFFF;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<path class="st0" d="M116.1,75.3c-5.5,24.1-27.1,42.2-52.9,42.2c-29.9,0-54.3-24.3-54.3-54.3S33.2,8.9,63.2,8.9
    11
    +			c26,0,47.7,18.3,53,42.7h9C119.8,22.3,94,0,63.2,0C28.3,0,0,28.3,0,63.1s28.3,63.1,63.2,63.1c30.7,0,56.4-21.9,62-51.1h-9.1V75.3z
    12
    +			"/>
    13
    +		<path class="st0" d="M41.5,33.6h36.2c2.1,0.6,10.8,3.3,10.8,12.9s-9.9,11.1-11.6,11.4H55.2v8.2l35.5,32.6h12.4L67.7,66.4h9.4h0.3
    14
    +			C84.3,65.8,97,61,97,46.6c0-14.1-11.8-20-18-21.3l-45.9-0.1v73.5h39.3v-8.4H41.5V33.6z"/>
    15
    +	</g>
    16
    +	<g>
    17
    +		<g>
    18
    +			<polygon class="st0" points="140.6,30.5 140.6,16.5 134.3,16.5 134.3,12.9 150.7,12.9 150.7,16.5 144.4,16.5 144.4,30.5 			"/>
    19
    +			<g>
    20
    +				<path class="st0" d="M164.9,30.5l-1.1-3.7h-7.4l-1.1,3.7h-3.9l5.1-17.5h7.2l5.1,17.5H164.9z M157.5,23.2h5.4l-1.9-6.6h-1.6
    21
    +					L157.5,23.2z"/>
    22
    +			</g>
    23
    +			<g>
    24
    +				<path class="st0" d="M225,30.8c-3.3,0-6.3-0.2-7.6-3.5c-0.4-1.1-0.6-2.4-0.6-5.6s0.1-4.5,0.6-5.6c1.2-3.3,4.4-3.5,7.6-3.5
    25
    +					c3.3,0,6.3,0.2,7.6,3.5c0.4,1.1,0.6,2.4,0.6,5.6s-0.1,4.5-0.6,5.6C231.3,30.6,228.2,30.8,225,30.8z M225,16.2
    26
    +					c-1.8,0-3.6,0.2-4.2,1.9c-0.2,0.7-0.2,1.9-0.2,3.6s0,3,0.2,3.6c0.6,1.7,2.4,1.9,4.2,1.9c1.8,0,3.6-0.2,4.2-1.9
    27
    +					c0.2-0.7,0.2-1.9,0.2-3.6c0-1.8,0-3-0.2-3.6C228.6,16.4,226.8,16.2,225,16.2z"/>
    28
    +			</g>
    29
    +			<path class="st0" d="M208.9,30.5l-2.7-5.3h-5.3v5.3h-3.8V12.9h9.2c3,0,4.7,0.9,5.4,2.8c0.2,0.7,0.3,1.3,0.3,3.3s-0.1,2.7-0.3,3.3
    30
    +				c-0.3,0.9-0.8,1.5-1.6,2l-0.2,0.1l3,6L208.9,30.5z M200.9,21.5h4.9c0.9,0,1.8-0.1,2.2-0.8c0.2-0.3,0.3-0.8,0.3-1.7
    31
    +				s-0.1-1.3-0.3-1.7c-0.4-0.8-1.3-0.8-2.2-0.8h-4.9V21.5z"/>
    32
    +		</g>
    33
    +		<polygon class="st0" points="185.5,12.9 182.1,23.1 178.6,12.9 172.8,12.9 172.8,30.5 176.5,30.5 176.5,16.8 180.1,27.3 184,27.3 
    34
    +			187.6,16.8 187.6,30.5 191.3,30.5 191.3,12.9 		"/>
    35
    +		<polygon class="st0" points="249.5,12.9 249.5,24.9 243,12.9 243,12.9 238.4,12.9 238.4,12.9 238.4,30.5 238.4,30.5 242.1,30.5 
    36
    +			242.1,30.5 242.1,18.6 248.6,30.5 253.3,30.5 253.3,12.9 		"/>
    37
    +	</g>
    38
    +	<polygon class="st0" points="283.6,39.8 283.6,90.9 290.9,90.9 290.9,45.7 315.2,45.7 315.1,90.9 322.3,90.9 322.3,39.8 	"/>
    39
    +	
    40
    +		<rect x="282.5" y="57.1" transform="matrix(0.7071 -0.7071 0.7071 0.7071 45.7303 232.0038)" class="st0" width="40.8" height="7.4"/>
    41
    +	
    42
    +		<rect x="261.8" y="43.1" transform="matrix(0.7071 -0.7071 0.7071 0.7071 46.5831 206.0767)" class="st0" width="20.5" height="7.4"/>
    43
    +	<rect x="269.7" y="53.8" class="st0" width="7.4" height="37.1"/>
    44
    +	<rect x="330.9" y="75.3" class="st0" width="7.4" height="15.6"/>
    45
    +	<rect x="376.9" y="75.3" class="st0" width="7.4" height="15.6"/>
    46
    +	<rect x="390.8" y="72.3" class="st0" width="7.4" height="18.6"/>
    47
    +	<rect x="418.2" y="71.4" class="st0" width="7.4" height="18.6"/>
    48
    +	<rect x="354" y="49.7" class="st0" width="7.4" height="41.2"/>
    49
    +	<rect x="430" y="39.8" class="st0" width="7.4" height="51.1"/>
    50
    +	<rect x="442.5" y="40.2" class="st0" width="7.4" height="37.9"/>
    51
    +	<rect x="330.9" y="44.8" class="st0" width="7.4" height="20.2"/>
    52
    +	<rect x="331" y="59.5" class="st0" width="53.4" height="7.4"/>
    53
    +	<rect x="331" y="39.9" class="st0" width="53.4" height="7.4"/>
    54
    +	<g>
    55
    +		<path class="st0" d="M140.2,90.9h7.3V78.7h5.8v12.1h7.1V39.8h-20.1L140.2,90.9z M147.5,45.8h5.8v9.9h-5.8V45.8z M147.5,61.5h5.8
    56
    +			v11.4h-5.8V61.5z"/>
    57
    +		<polygon class="st0" points="163.2,87.9 185.7,87.9 185.7,82.7 163.2,82.7 		"/>
    58
    +		<polygon class="st0" points="173,70.9 164.7,70.9 162.2,79.4 189.2,79.4 189.2,90.9 197.1,90.9 197.1,74.6 171.7,74.6 		"/>
    59
    +		<path class="st0" d="M197.4,50.6v-5.1h-3.6l1.8-4.9h-8.5l-1.8,4.9h-1.3v-5.7H176v5.7h-1.7l-2.1-4.9h-8l1.9,4.9h-4v5.1h12.5l-2,2.9
    60
    +			h-10.5v5.1h7l-3.5,5.1h-3.5v5.2h8.3l0.8-1.1h12.5v4.9h7.8v-2.9h6v-6h-4.7l-4-5.1h8.8v-5.1h-16.1l2.1-2.9h13.9V50.6z M183.5,62.9
    61
    +			h-8.8l3-4.3h2.4L183.5,62.9z"/>
    62
    +	</g>
    63
    +	<rect x="390.8" y="49.7" class="st0" width="11.9" height="7.4"/>
    64
    +	<rect x="413.8" y="49.7" class="st0" width="11.9" height="7.4"/>
    65
    +	<rect x="403.2" y="38.2" class="st0" width="10.3" height="6.4"/>
    66
    +	<rect x="390.8" y="59.4" class="st0" width="34.9" height="7.4"/>
    67
    +	<rect x="404.5" y="83.4" class="st0" width="21.1" height="7.4"/>
    68
    +	<rect x="390.9" y="70.6" class="st0" width="34.9" height="7.4"/>
    69
    +	<rect x="435.6" y="70.6" class="st0" width="14.3" height="7.4"/>
    70
    +	<rect x="390.8" y="39.8" class="st0" width="34.9" height="7.4"/>
    71
    +	<rect x="435.5" y="39.8" class="st0" width="14.5" height="7.4"/>
    72
    +	<rect x="281.1" y="75.3" class="st0" width="43.6" height="7.4"/>
    73
    +	<polygon class="st0" points="259.1,54.6 259.1,53 259.1,53 259.1,47 251.1,47 251.1,39.8 243.1,39.8 243.1,47 223.7,47 225.8,37.2 
    74
    +		217.2,37.2 215.2,47 202.6,47 202.6,53 202.6,53 202.6,54.6 213.7,54.6 208.1,83.5 202,83.5 202,90.9 208.4,90.9 215.3,90.9 
    75
    +		222.3,54.6 230,54.6 230,68.4 223,70 223,78.1 230,76.3 230,90.9 237.2,90.9 258.4,90.9 259.1,90.9 259.1,83.5 237.9,83.5 
    76
    +		237.9,74.4 255.5,70.2 257.7,69.6 257.7,61.6 237.9,66.5 237.9,54.6 	"/>
    77
    +	<g>
    78
    +		<path class="st0" d="M140.4,103.9h3v10.2h4.9v2.6h-8.1v-12.8H140.4z"/>
    79
    +		<path class="st0" d="M156.8,110.8v-6.7h3v7.1c0,2.5,0.7,3.3,2.1,3.3c1.3,0,2.1-0.9,2.1-3.3v-7.1h2.9v6.7c0,4.4-1.7,6.3-5.2,6.3
    80
    +			C158.6,117,156.8,115.1,156.8,110.8z"/>
    81
    +		<path class="st0" d="M176.9,103.9h3.4l2,5.5c0.2,0.8,0.4,1.6,0.7,2.4h0.1c0.2-0.8,0.4-1.6,0.7-2.4l2-5.5h3.4v12.8h-2.8v-4.4
    82
    +			c0-1.2,0.2-3.1,0.4-4.5h-0.1l-1.1,3l-1.7,4.7h-1.7l-1.8-4.7l-1-3h-0.1c0.1,1.2,0.4,3.1,0.4,4.5v4.4h-2.8L176.9,103.9L176.9,103.9z
    83
    +			"/>
    84
    +		<path class="st0" d="M199,103.9h3v12.8h-3V103.9z"/>
    85
    +		<path class="st0" d="M212,103.9h3.1l3.1,6.2l1.2,2.8h0.1c-0.2-1.3-0.4-3.3-0.4-4.7v-4.3h2.9v12.8H219l-3.1-6.2l-1.2-2.8h-0.1
    86
    +			c0.1,1.5,0.4,3.1,0.4,4.7v4.3H212V103.9z"/>
    87
    +		<path class="st0" d="M238.1,113.8h-3.8l-0.8,2.9h-3.1l3.9-12.8h3.7l3.9,12.8h-3.3L238.1,113.8z M237.6,111.5l-0.2-1.1
    88
    +			c-0.3-1.2-0.7-2.8-1-4.2h-0.1c-0.3,1.3-0.7,2.8-1,4.2l-0.2,1.1H237.6z"/>
    89
    +		<path class="st0" d="M250.2,110.8v-6.7h3v7.1c0,2.5,0.7,3.3,2.1,3.3c1.3,0,2.1-0.9,2.1-3.3v-7.1h2.9v6.7c0,4.4-1.7,6.3-5.2,6.3
    90
    +			C252,117,250.2,115.1,250.2,110.8z"/>
    91
    +		<path class="st0" d="M269.3,115.2l1.8-2.1c0.9,0.8,2.1,1.3,3.1,1.3c1.1,0,1.7-0.4,1.7-1.1c0-0.8-0.7-1-1.8-1.5l-1.7-0.7
    92
    +			c-1.3-0.6-2.6-1.7-2.6-3.5c0-2.1,1.9-3.9,4.6-3.9c1.5,0,3,0.6,4.2,1.7l-1.6,1.9c-0.9-0.7-1.7-1-2.6-1s-1.6,0.3-1.6,1.1
    93
    +			c0,0.7,0.8,1,1.9,1.5l1.6,0.7c1.6,0.7,2.6,1.7,2.6,3.5c0,2.1-1.8,4-4.9,4C272.4,117,270.6,116.4,269.3,115.2z"/>
    94
    +		<path class="st0" d="M305.9,116.8l-2.4-4.5H302v4.5h-3.1v-12.8h4.7c2.7,0,5.1,0.9,5.1,4c0,1.9-0.9,3-2.2,3.7l2.8,5.1H305.9z
    95
    +			 M302,109.8h1.3c1.5,0,2.2-0.7,2.2-1.8c0-1.2-0.8-1.6-2.2-1.6H302V109.8z"/>
    96
    +		<path class="st0" d="M318.1,103.9h3v12.8h-3V103.9z"/>
    97
    +		<path class="st0" d="M331.1,103.9h3.1l3.1,6.2l1.2,2.8h0.1c-0.2-1.3-0.4-3.3-0.4-4.7v-4.3h2.9v12.8H338l-3.1-6.2l-1.2-2.8h-0.1
    98
    +			c0.1,1.5,0.4,3.1,0.4,4.7v4.3h-2.9V103.9z"/>
    99
    +		<path class="st0" d="M350.6,110.5c0-4.3,2.9-6.7,6.3-6.7c1.9,0,3.3,0.8,4.2,1.7l-1.7,2c-0.7-0.6-1.3-1-2.4-1
    100
    +			c-1.9,0-3.3,1.5-3.3,3.9c0,2.6,1.1,4,3.5,4c0.4,0,0.9-0.1,1.2-0.3v-2h-2v-2.5h4.8v6c-0.9,0.9-2.5,1.6-4.3,1.6
    101
    +			C353.3,117,350.6,114.9,350.6,110.5z"/>
    102
    +		<path class="st0" d="M381,110.5c0-4.3,2.8-6.7,6.2-6.7c1.7,0,3,0.8,3.9,1.7l-1.6,2c-0.7-0.6-1.3-1-2.2-1c-1.7,0-3,1.5-3,3.9
    103
    +			c0,2.6,1.1,4,3,4c1,0,1.8-0.6,2.5-1.1l1.6,1.9c-1.1,1.2-2.5,1.9-4.2,1.9C383.8,117,381,114.9,381,110.5z"/>
    104
    +		<path class="st0" d="M400,103.9h3v10.2h4.9v2.6h-8.1v-12.8H400z"/>
    105
    +		<path class="st0" d="M416.4,110.8v-6.7h3v7.1c0,2.5,0.7,3.3,2.1,3.3c1.3,0,2.1-0.9,2.1-3.3v-7.1h2.9v6.7c0,4.4-1.7,6.3-5.2,6.3
    106
    +			C418.2,117,416.4,115.1,416.4,110.8z"/>
    107
    +		<path class="st0" d="M436.7,103.9h4.5c2.7,0,4.8,0.7,4.8,3.1c0,1.1-0.7,2.4-1.7,2.8v0.1c1.3,0.3,2.2,1.3,2.2,3
    108
    +			c0,2.6-2.2,3.8-5.1,3.8h-4.8V103.9z M441.1,109c1.3,0,1.9-0.6,1.9-1.5c0-0.9-0.6-1.3-1.9-1.3h-1.2v2.7h1.2V109z M441.3,114.4
    109
    +			c1.5,0,2.2-0.6,2.2-1.7c0-1-0.8-1.5-2.2-1.5h-1.6v3.1H441.3z"/>
    110
    +	</g>
    111
    +</g>
    112
    +</svg>

    + 90 - 0
    page/templates/page/img/mianfeitiaojiao_icon.svg

    @@ -0,0 +1,90 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<path class="st0" d="M12.3,20.4c-0.2,0-0.4-0.2-0.4-0.4c0-0.2,0.2-0.4,0.4-0.4c0.2,0,0.3,0,0.5,0c0.2,0,0.4,0.1,0.4,0.3
    11
    +			c0,0.2-0.1,0.4-0.3,0.4C12.6,20.4,12.5,20.4,12.3,20.4C12.3,20.4,12.3,20.4,12.3,20.4z M11.3,20.4C11.3,20.4,11.3,20.4,11.3,20.4
    12
    +			c-0.2,0-0.4,0-0.5-0.1c-0.2,0-0.3-0.2-0.3-0.4c0-0.2,0.2-0.3,0.4-0.3c0.2,0,0.3,0,0.5,0.1c0.2,0,0.3,0.2,0.3,0.4
    13
    +			C11.6,20.2,11.5,20.4,11.3,20.4z M13.7,20.2c-0.2,0-0.3-0.1-0.4-0.3c0-0.2,0.1-0.4,0.3-0.4c0.2,0,0.3-0.1,0.5-0.1
    14
    +			c0.2-0.1,0.4,0.1,0.4,0.2c0.1,0.2-0.1,0.4-0.2,0.4C14.1,20.1,14,20.2,13.7,20.2C13.8,20.2,13.8,20.2,13.7,20.2z M9.8,20.1
    15
    +			C9.8,20.1,9.8,20.1,9.8,20.1C9.6,20,9.4,20,9.2,19.9C9,19.8,8.9,19.6,9,19.4c0.1-0.2,0.3-0.3,0.5-0.2c0.1,0.1,0.3,0.1,0.4,0.1
    16
    +			c0.2,0.1,0.3,0.3,0.3,0.4C10.1,20,10,20.1,9.8,20.1z M15.1,19.7c-0.1,0-0.3-0.1-0.3-0.2c-0.1-0.2,0-0.4,0.2-0.5
    17
    +			c0.1-0.1,0.3-0.1,0.4-0.2c0.2-0.1,0.4,0,0.5,0.2c0.1,0.2,0,0.4-0.2,0.5c-0.2,0.1-0.3,0.1-0.5,0.2C15.2,19.7,15.2,19.7,15.1,19.7z
    18
    +			 M8.4,19.6c-0.1,0-0.1,0-0.2,0c-0.2-0.1-0.3-0.2-0.5-0.2c-0.2-0.1-0.2-0.3-0.1-0.5c0.1-0.2,0.3-0.2,0.5-0.1
    19
    +			c0.1,0.1,0.3,0.2,0.4,0.2c0.2,0.1,0.3,0.3,0.2,0.5C8.7,19.5,8.6,19.6,8.4,19.6z M16.4,19c-0.1,0-0.2-0.1-0.3-0.2
    20
    +			c-0.1-0.2-0.1-0.4,0.1-0.5c0.1-0.1,0.3-0.2,0.4-0.3c0.2-0.1,0.4-0.1,0.5,0.1c0.1,0.2,0.1,0.4-0.1,0.5c-0.1,0.1-0.3,0.2-0.4,0.3
    21
    +			C16.6,19,16.5,19,16.4,19z M7.2,18.8c-0.1,0-0.2,0-0.2-0.1c-0.1-0.1-0.3-0.2-0.4-0.3c-0.2-0.1-0.2-0.4,0-0.5
    22
    +			c0.1-0.2,0.4-0.2,0.5,0c0.1,0.1,0.2,0.2,0.4,0.3c0.2,0.1,0.2,0.3,0.1,0.5C7.4,18.7,7.3,18.8,7.2,18.8z M17.6,18.1
    23
    +			c-0.1,0-0.2,0-0.3-0.1c-0.1-0.1-0.1-0.4,0-0.5c0.1-0.1,0.2-0.2,0.3-0.3c0.1-0.1,0.4-0.2,0.5,0c0.1,0.1,0.2,0.4,0,0.5
    24
    +			c-0.1,0.1-0.2,0.2-0.4,0.4C17.8,18.1,17.7,18.1,17.6,18.1z M6.1,17.8c-0.1,0-0.2,0-0.3-0.1c-0.1-0.1-0.2-0.3-0.3-0.4
    25
    +			c-0.1-0.2-0.1-0.4,0.1-0.5c0.2-0.1,0.4-0.1,0.5,0.1c0.1,0.1,0.2,0.2,0.3,0.4c0.1,0.1,0.1,0.4,0,0.5C6.3,17.7,6.2,17.8,6.1,17.8z
    26
    +			 M18.6,17c-0.1,0-0.1,0-0.2-0.1c-0.2-0.1-0.2-0.3-0.1-0.5c0.1-0.1,0.2-0.3,0.3-0.4c0.1-0.2,0.3-0.2,0.5-0.1
    27
    +			c0.2,0.1,0.2,0.3,0.1,0.5c-0.1,0.1-0.2,0.3-0.3,0.4C18.8,16.9,18.7,17,18.6,17z M5.2,16.6c-0.1,0-0.2-0.1-0.3-0.2
    28
    +			c-0.1-0.1-0.2-0.3-0.3-0.4c-0.1-0.2,0-0.4,0.1-0.5c0.2-0.1,0.4,0,0.5,0.1c0.1,0.1,0.2,0.3,0.2,0.4c0.1,0.2,0.1,0.4-0.1,0.5
    29
    +			C5.3,16.6,5.3,16.6,5.2,16.6z M19.3,15.7c-0.1,0-0.1,0-0.2,0c-0.2-0.1-0.3-0.3-0.2-0.5c0.1-0.1,0.1-0.3,0.2-0.4
    30
    +			c0.1-0.2,0.3-0.3,0.5-0.2c0.2,0.1,0.3,0.3,0.2,0.5c-0.1,0.2-0.1,0.3-0.2,0.5C19.6,15.6,19.4,15.7,19.3,15.7z M4.5,15.3
    31
    +			c-0.1,0-0.3-0.1-0.3-0.2c-0.1-0.2-0.1-0.3-0.2-0.5c-0.1-0.2,0-0.4,0.2-0.5c0.2-0.1,0.4,0,0.5,0.2c0,0.2,0.1,0.3,0.2,0.4
    32
    +			c0.1,0.2,0,0.4-0.2,0.5C4.6,15.3,4.6,15.3,4.5,15.3z M19.8,14.3C19.8,14.3,19.7,14.3,19.8,14.3c-0.3-0.1-0.4-0.3-0.4-0.5
    33
    +			c0-0.2,0.1-0.3,0.1-0.5c0-0.2,0.2-0.3,0.4-0.3c0.2,0,0.3,0.2,0.3,0.4c0,0.2-0.1,0.3-0.1,0.5C20.1,14.2,19.9,14.3,19.8,14.3z
    34
    +			 M4.1,13.9c-0.2,0-0.3-0.1-0.4-0.3c0-0.2-0.1-0.3-0.1-0.5c0-0.2,0.1-0.4,0.3-0.4c0.2,0,0.4,0.1,0.4,0.3c0,0.2,0,0.3,0.1,0.5
    35
    +			C4.5,13.6,4.4,13.8,4.1,13.9C4.2,13.9,4.1,13.9,4.1,13.9z M20,12.9C20,12.9,20,12.9,20,12.9c-0.2,0-0.4-0.2-0.4-0.4
    36
    +			c0-0.2,0-0.3,0-0.5c0-0.2,0.2-0.4,0.4-0.4c0.2,0,0.4,0.1,0.4,0.3v0c0,0.2,0,0.3,0,0.5C20.4,12.7,20.2,12.9,20,12.9z M4,12.4
    37
    +			c-0.2,0-0.4-0.2-0.4-0.4H4l-0.4,0c0-0.2,0-0.3,0-0.5c0-0.2,0.2-0.4,0.4-0.3c0.2,0,0.4,0.2,0.3,0.4c0,0.1,0,0.3,0,0.4
    38
    +			C4.3,12.2,4.2,12.4,4,12.4z M20,11.3c-0.2,0-0.3-0.1-0.4-0.3c0-0.2,0-0.3-0.1-0.5c0-0.2,0.1-0.4,0.3-0.4c0.2,0,0.4,0.1,0.4,0.3
    39
    +			c0,0.2,0.1,0.3,0.1,0.5C20.3,11.1,20.2,11.3,20,11.3C20,11.3,20,11.3,20,11.3z M4.1,10.9C4.1,10.9,4.1,10.9,4.1,10.9
    40
    +			c-0.3,0-0.4-0.2-0.4-0.4c0-0.2,0.1-0.3,0.1-0.5c0-0.2,0.2-0.3,0.4-0.3c0.2,0,0.3,0.2,0.3,0.4c0,0.2-0.1,0.3-0.1,0.5
    41
    +			C4.4,10.8,4.3,10.9,4.1,10.9z M19.6,9.9c-0.2,0-0.3-0.1-0.3-0.3c0-0.2-0.1-0.3-0.2-0.4c-0.1-0.2,0-0.4,0.2-0.5
    42
    +			c0.2-0.1,0.4,0,0.5,0.2c0.1,0.2,0.1,0.3,0.2,0.5c0.1,0.2,0,0.4-0.2,0.5C19.7,9.9,19.7,9.9,19.6,9.9z M4.5,9.5c0,0-0.1,0-0.1,0
    43
    +			C4.2,9.4,4.1,9.2,4.2,9c0.1-0.2,0.1-0.3,0.2-0.5c0.1-0.2,0.3-0.3,0.5-0.2C5,8.4,5.1,8.6,5,8.8C5,9,4.9,9.1,4.9,9.3
    44
    +			C4.8,9.4,4.7,9.5,4.5,9.5z M19.1,8.5c-0.1,0-0.3-0.1-0.3-0.2c-0.1-0.1-0.2-0.3-0.2-0.4c-0.1-0.2-0.1-0.4,0.1-0.5
    45
    +			c0.2-0.1,0.4-0.1,0.5,0.1c0.1,0.1,0.2,0.3,0.3,0.4c0.1,0.2,0,0.4-0.1,0.5C19.2,8.5,19.1,8.5,19.1,8.5z M5.2,8.2
    46
    +			C5.1,8.2,5,8.1,5,8.1C4.8,8,4.8,7.8,4.9,7.6C5,7.5,5,7.3,5.1,7.2C5.3,7,5.5,7,5.7,7.1c0.2,0.1,0.2,0.3,0.1,0.5
    47
    +			C5.7,7.7,5.6,7.9,5.5,8C5.4,8.1,5.3,8.2,5.2,8.2z M18.2,7.3c-0.1,0-0.2,0-0.3-0.1c-0.1-0.1-0.2-0.2-0.3-0.4
    48
    +			c-0.1-0.1-0.1-0.4,0-0.5c0.1-0.1,0.4-0.1,0.5,0c0.1,0.1,0.2,0.3,0.3,0.4c0.1,0.2,0.1,0.4-0.1,0.5C18.4,7.3,18.3,7.3,18.2,7.3z
    49
    +			 M6.1,7C6,7,5.9,6.9,5.8,6.9c-0.1-0.1-0.2-0.4,0-0.5C5.9,6.2,6,6.1,6.1,6c0.1-0.1,0.4-0.1,0.5,0c0.1,0.1,0.1,0.4,0,0.5
    50
    +			C6.5,6.6,6.4,6.7,6.3,6.9C6.3,6.9,6.2,7,6.1,7z M17.2,6.2c-0.1,0-0.2,0-0.2-0.1c-0.1-0.1-0.2-0.2-0.4-0.3
    51
    +			c-0.2-0.1-0.2-0.3-0.1-0.5c0.1-0.2,0.4-0.2,0.5-0.1c0.1,0.1,0.3,0.2,0.4,0.3c0.2,0.1,0.2,0.4,0,0.5C17.4,6.2,17.3,6.2,17.2,6.2z
    52
    +			 M7.1,6C7,6,6.9,5.9,6.9,5.8C6.7,5.7,6.8,5.4,6.9,5.3C7.1,5.2,7.2,5.1,7.3,5C7.5,4.9,7.7,5,7.9,5.1C8,5.3,7.9,5.5,7.8,5.6
    53
    +			C7.6,5.7,7.5,5.8,7.4,5.9C7.3,6,7.2,6,7.1,6z M16,5.4c-0.1,0-0.1,0-0.2,0c-0.1-0.1-0.3-0.2-0.4-0.2c-0.2-0.1-0.3-0.3-0.2-0.5
    54
    +			c0.1-0.2,0.3-0.3,0.5-0.2c0.2,0.1,0.3,0.2,0.5,0.2c0.2,0.1,0.2,0.3,0.1,0.5C16.2,5.3,16.1,5.4,16,5.4z M8.4,5.2
    55
    +			C8.3,5.2,8.1,5.1,8.1,5C8,4.8,8.1,4.6,8.2,4.5c0.2-0.1,0.3-0.2,0.5-0.2c0.2-0.1,0.4,0,0.5,0.2C9.3,4.7,9.2,4.9,9,5
    56
    +			C8.8,5,8.7,5.1,8.6,5.2C8.5,5.2,8.5,5.2,8.4,5.2z M14.6,4.8c0,0-0.1,0-0.1,0c-0.1-0.1-0.3-0.1-0.5-0.1c-0.2-0.1-0.3-0.3-0.3-0.4
    57
    +			c0.1-0.2,0.3-0.3,0.4-0.3c0.2,0,0.3,0.1,0.5,0.2C14.9,4.1,15,4.3,15,4.5C14.9,4.7,14.8,4.8,14.6,4.8z M9.8,4.7
    58
    +			c-0.2,0-0.3-0.1-0.3-0.3C9.4,4.2,9.5,4,9.7,3.9c0.2,0,0.3-0.1,0.5-0.1c0.2,0,0.4,0.1,0.4,0.3c0,0.2-0.1,0.4-0.3,0.4
    59
    +			c-0.2,0-0.3,0.1-0.5,0.1C9.8,4.7,9.8,4.7,9.8,4.7z M13.2,4.4C13.2,4.4,13.2,4.4,13.2,4.4c-0.2,0-0.4,0-0.5-0.1
    60
    +			c-0.2,0-0.3-0.2-0.3-0.4c0-0.2,0.2-0.3,0.4-0.3c0.2,0,0.3,0,0.5,0.1c0.2,0,0.3,0.2,0.3,0.4C13.5,4.3,13.4,4.4,13.2,4.4z M11.2,4.4
    61
    +			c-0.2,0-0.3-0.1-0.4-0.3c0-0.2,0.1-0.4,0.3-0.4c0.2,0,0.3,0,0.5,0c0.2,0,0.4,0.2,0.4,0.4c0,0.2-0.2,0.4-0.4,0.4
    62
    +			C11.6,4.4,11.4,4.4,11.2,4.4C11.3,4.4,11.2,4.4,11.2,4.4z"/>
    63
    +	</g>
    64
    +	<g>
    65
    +		<path class="st0" d="M12,14.6c-0.2,0-0.4-0.2-0.4-0.4V9.8c0-0.2,0.2-0.4,0.4-0.4s0.4,0.2,0.4,0.4v4.4C12.4,14.4,12.2,14.6,12,14.6
    66
    +			z"/>
    67
    +	</g>
    68
    +	<g>
    69
    +		<path class="st0" d="M14.2,12.4H9.8c-0.2,0-0.4-0.2-0.4-0.4s0.2-0.4,0.4-0.4h4.4c0.2,0,0.4,0.2,0.4,0.4S14.4,12.4,14.2,12.4z"/>
    70
    +	</g>
    71
    +	<g>
    72
    +		<g>
    73
    +			<path class="st0" d="M0.4,6.8C0.2,6.8,0,6.7,0,6.5V2.1C0,1,1,0,2.1,0h4.3c0.2,0,0.4,0.2,0.4,0.4S6.7,0.7,6.5,0.7H2.1
    74
    +				c-0.8,0-1.4,0.6-1.4,1.4v4.3C0.7,6.7,0.6,6.8,0.4,6.8z"/>
    75
    +		</g>
    76
    +		<g>
    77
    +			<path class="st0" d="M23.6,6.8c-0.2,0-0.4-0.2-0.4-0.4V2.1c0-0.8-0.6-1.4-1.4-1.4h-4.3c-0.2,0-0.4-0.2-0.4-0.4S17.4,0,17.6,0h4.3
    78
    +				C23.1,0,24,1,24,2.1v4.3C24,6.7,23.8,6.8,23.6,6.8z"/>
    79
    +		</g>
    80
    +		<g>
    81
    +			<path class="st0" d="M6.5,24H2.1C1,24,0,23,0,21.9v-4.3c0-0.2,0.2-0.4,0.4-0.4s0.4,0.2,0.4,0.4v4.3c0,0.8,0.6,1.4,1.4,1.4h4.3
    82
    +				c0.2,0,0.4,0.2,0.4,0.4S6.7,24,6.5,24z"/>
    83
    +		</g>
    84
    +		<g>
    85
    +			<path class="st0" d="M21.9,24h-4.3c-0.2,0-0.4-0.2-0.4-0.4s0.2-0.4,0.4-0.4h4.3c0.8,0,1.4-0.6,1.4-1.4v-4.3
    86
    +				c0-0.2,0.2-0.4,0.4-0.4s0.4,0.2,0.4,0.4v4.3C24,23,23.1,24,21.9,24z"/>
    87
    +		</g>
    88
    +	</g>
    89
    +</g>
    90
    +</svg>

    + 297 - 0
    page/templates/page/img/qr.svg

    @@ -0,0 +1,297 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 120 120" style="enable-background:new 0 0 120 120;" xml:space="preserve">
    5
    +<g>
    6
    +	<rect width="25.5" height="3.6"/>
    7
    +	<rect x="29.1" width="3.6" height="3.6"/>
    8
    +	<rect x="36.4" width="3.6" height="3.6"/>
    9
    +	<rect x="43.6" width="7.3" height="3.6"/>
    10
    +	<rect x="54.5" width="3.6" height="3.6"/>
    11
    +	<rect x="83.6" width="7.3" height="3.6"/>
    12
    +	<rect x="94.5" width="25.5" height="3.6"/>
    13
    +	<rect y="3.6" width="3.6" height="3.6"/>
    14
    +	<rect x="21.8" y="3.6" width="3.6" height="3.6"/>
    15
    +	<rect x="36.4" y="3.6" width="7.3" height="3.6"/>
    16
    +	<rect x="47.3" y="3.6" width="7.3" height="3.6"/>
    17
    +	<rect x="58.2" y="3.6" width="3.6" height="3.6"/>
    18
    +	<rect x="65.5" y="3.6" width="7.3" height="3.6"/>
    19
    +	<rect x="87.3" y="3.6" width="3.6" height="3.6"/>
    20
    +	<rect x="94.5" y="3.6" width="3.6" height="3.6"/>
    21
    +	<rect x="116.4" y="3.6" width="3.6" height="3.6"/>
    22
    +	<rect y="7.3" width="3.6" height="3.6"/>
    23
    +	<rect x="7.3" y="7.3" width="10.9" height="3.6"/>
    24
    +	<rect x="21.8" y="7.3" width="3.6" height="3.6"/>
    25
    +	<rect x="32.7" y="7.3" width="10.9" height="3.6"/>
    26
    +	<rect x="50.9" y="7.3" width="29.1" height="3.6"/>
    27
    +	<rect x="87.3" y="7.3" width="3.6" height="3.6"/>
    28
    +	<rect x="94.5" y="7.3" width="3.6" height="3.6"/>
    29
    +	<rect x="101.8" y="7.3" width="10.9" height="3.6"/>
    30
    +	<rect x="116.4" y="7.3" width="3.6" height="3.6"/>
    31
    +	<rect y="10.9" width="3.6" height="3.6"/>
    32
    +	<rect x="7.3" y="10.9" width="10.9" height="3.6"/>
    33
    +	<rect x="21.8" y="10.9" width="3.6" height="3.6"/>
    34
    +	<rect x="29.1" y="10.9" width="7.3" height="3.6"/>
    35
    +	<rect x="54.5" y="10.9" width="10.9" height="3.6"/>
    36
    +	<rect x="69.1" y="10.9" width="3.6" height="3.6"/>
    37
    +	<rect x="76.4" y="10.9" width="7.3" height="3.6"/>
    38
    +	<rect x="94.5" y="10.9" width="3.6" height="3.6"/>
    39
    +	<rect x="101.8" y="10.9" width="10.9" height="3.6"/>
    40
    +	<rect x="116.4" y="10.9" width="3.6" height="3.6"/>
    41
    +	<rect y="14.5" width="3.6" height="3.6"/>
    42
    +	<rect x="7.3" y="14.5" width="10.9" height="3.6"/>
    43
    +	<rect x="21.8" y="14.5" width="3.6" height="3.6"/>
    44
    +	<rect x="29.1" y="14.5" width="3.6" height="3.6"/>
    45
    +	<rect x="36.4" y="14.5" width="14.5" height="3.6"/>
    46
    +	<rect x="58.2" y="14.5" width="3.6" height="3.6"/>
    47
    +	<rect x="69.1" y="14.5" width="3.6" height="3.6"/>
    48
    +	<rect x="76.4" y="14.5" width="7.3" height="3.6"/>
    49
    +	<rect x="94.5" y="14.5" width="3.6" height="3.6"/>
    50
    +	<rect x="101.8" y="14.5" width="10.9" height="3.6"/>
    51
    +	<rect x="116.4" y="14.5" width="3.6" height="3.6"/>
    52
    +	<rect y="18.2" width="3.6" height="3.6"/>
    53
    +	<rect x="21.8" y="18.2" width="3.6" height="3.6"/>
    54
    +	<rect x="29.1" y="18.2" width="3.6" height="3.6"/>
    55
    +	<rect x="40" y="18.2" width="7.3" height="3.6"/>
    56
    +	<rect x="54.5" y="18.2" width="3.6" height="3.6"/>
    57
    +	<rect x="61.8" y="18.2" width="7.3" height="3.6"/>
    58
    +	<rect x="72.7" y="18.2" width="18.2" height="3.6"/>
    59
    +	<rect x="94.5" y="18.2" width="3.6" height="3.6"/>
    60
    +	<rect x="116.4" y="18.2" width="3.6" height="3.6"/>
    61
    +	<rect y="21.8" width="25.5" height="3.6"/>
    62
    +	<rect x="29.1" y="21.8" width="3.6" height="3.6"/>
    63
    +	<rect x="36.4" y="21.8" width="3.6" height="3.6"/>
    64
    +	<rect x="43.6" y="21.8" width="3.6" height="3.6"/>
    65
    +	<rect x="50.9" y="21.8" width="3.6" height="3.6"/>
    66
    +	<rect x="58.2" y="21.8" width="3.6" height="3.6"/>
    67
    +	<rect x="65.5" y="21.8" width="3.6" height="3.6"/>
    68
    +	<rect x="72.7" y="21.8" width="3.6" height="3.6"/>
    69
    +	<rect x="80" y="21.8" width="3.6" height="3.6"/>
    70
    +	<rect x="87.3" y="21.8" width="3.6" height="3.6"/>
    71
    +	<rect x="94.5" y="21.8" width="25.5" height="3.6"/>
    72
    +	<rect x="29.1" y="25.5" width="7.3" height="3.6"/>
    73
    +	<rect x="50.9" y="25.5" width="3.6" height="3.6"/>
    74
    +	<rect x="61.8" y="25.5" width="3.6" height="3.6"/>
    75
    +	<rect x="69.1" y="25.5" width="14.5" height="3.6"/>
    76
    +	<rect x="87.3" y="25.5" width="3.6" height="3.6"/>
    77
    +	<rect y="29.1" width="3.6" height="3.6"/>
    78
    +	<rect x="14.5" y="29.1" width="3.6" height="3.6"/>
    79
    +	<rect x="21.8" y="29.1" width="10.9" height="3.6"/>
    80
    +	<rect x="36.4" y="29.1" width="7.3" height="3.6"/>
    81
    +	<rect x="47.3" y="29.1" width="3.6" height="3.6"/>
    82
    +	<rect x="54.5" y="29.1" width="14.5" height="3.6"/>
    83
    +	<rect x="72.7" y="29.1" width="36.4" height="3.6"/>
    84
    +	<rect x="116.4" y="29.1" width="3.6" height="3.6"/>
    85
    +	<rect x="7.3" y="32.7" width="3.6" height="3.6"/>
    86
    +	<rect x="18.2" y="32.7" width="3.6" height="3.6"/>
    87
    +	<rect x="32.7" y="32.7" width="3.6" height="3.6"/>
    88
    +	<rect x="40" y="32.7" width="3.6" height="3.6"/>
    89
    +	<rect x="50.9" y="32.7" width="7.3" height="3.6"/>
    90
    +	<rect x="61.8" y="32.7" width="7.3" height="3.6"/>
    91
    +	<rect x="72.7" y="32.7" width="14.5" height="3.6"/>
    92
    +	<rect x="98.2" y="32.7" width="3.6" height="3.6"/>
    93
    +	<rect x="105.5" y="32.7" width="14.5" height="3.6"/>
    94
    +	<rect x="7.3" y="36.4" width="10.9" height="3.6"/>
    95
    +	<rect x="21.8" y="36.4" width="3.6" height="3.6"/>
    96
    +	<rect x="29.1" y="36.4" width="29.1" height="3.6"/>
    97
    +	<rect x="65.5" y="36.4" width="3.6" height="3.6"/>
    98
    +	<rect x="72.7" y="36.4" width="3.6" height="3.6"/>
    99
    +	<rect x="83.6" y="36.4" width="7.3" height="3.6"/>
    100
    +	<rect x="105.5" y="36.4" width="3.6" height="3.6"/>
    101
    +	<rect x="112.7" y="36.4" width="3.6" height="3.6"/>
    102
    +	<rect x="3.6" y="40" width="3.6" height="3.6"/>
    103
    +	<rect x="40" y="40" width="3.6" height="3.6"/>
    104
    +	<rect x="47.3" y="40" width="3.6" height="3.6"/>
    105
    +	<rect x="58.2" y="40" width="3.6" height="3.6"/>
    106
    +	<rect x="72.7" y="40" width="3.6" height="3.6"/>
    107
    +	<rect x="80" y="40" width="7.3" height="3.6"/>
    108
    +	<rect x="90.9" y="40" width="3.6" height="3.6"/>
    109
    +	<rect x="112.7" y="40" width="3.6" height="3.6"/>
    110
    +	<rect y="43.6" width="3.6" height="3.6"/>
    111
    +	<rect x="7.3" y="43.6" width="3.6" height="3.6"/>
    112
    +	<rect x="14.5" y="43.6" width="18.2" height="3.6"/>
    113
    +	<rect x="43.6" y="43.6" width="7.3" height="3.6"/>
    114
    +	<rect x="58.2" y="43.6" width="3.6" height="3.6"/>
    115
    +	<rect x="80" y="43.6" width="21.8" height="3.6"/>
    116
    +	<rect x="105.5" y="43.6" width="3.6" height="3.6"/>
    117
    +	<rect x="112.7" y="43.6" width="7.3" height="3.6"/>
    118
    +	<rect y="47.3" width="10.9" height="3.6"/>
    119
    +	<rect x="18.2" y="47.3" width="3.6" height="3.6"/>
    120
    +	<rect x="25.5" y="47.3" width="7.3" height="3.6"/>
    121
    +	<rect x="40" y="47.3" width="3.6" height="3.6"/>
    122
    +	<rect x="47.3" y="47.3" width="7.3" height="3.6"/>
    123
    +	<rect x="61.8" y="47.3" width="14.5" height="3.6"/>
    124
    +	<rect x="87.3" y="47.3" width="3.6" height="3.6"/>
    125
    +	<rect x="98.2" y="47.3" width="3.6" height="3.6"/>
    126
    +	<rect x="105.5" y="47.3" width="3.6" height="3.6"/>
    127
    +	<rect y="50.9" width="7.3" height="3.6"/>
    128
    +	<rect x="14.5" y="50.9" width="10.9" height="3.6"/>
    129
    +	<rect x="32.7" y="50.9" width="3.6" height="3.6"/>
    130
    +	<rect x="40" y="50.9" width="18.2" height="3.6"/>
    131
    +	<rect x="65.5" y="50.9" width="3.6" height="3.6"/>
    132
    +	<rect x="72.7" y="50.9" width="14.5" height="3.6"/>
    133
    +	<rect x="90.9" y="50.9" width="3.6" height="3.6"/>
    134
    +	<rect x="105.5" y="50.9" width="10.9" height="3.6"/>
    135
    +	<rect y="54.5" width="10.9" height="3.6"/>
    136
    +	<rect x="14.5" y="54.5" width="3.6" height="3.6"/>
    137
    +	<rect x="25.5" y="54.5" width="3.6" height="3.6"/>
    138
    +	<rect x="32.7" y="54.5" width="3.6" height="3.6"/>
    139
    +	<rect x="50.9" y="54.5" width="18.2" height="3.6"/>
    140
    +	<rect x="76.4" y="54.5" width="3.6" height="3.6"/>
    141
    +	<rect x="87.3" y="54.5" width="10.9" height="3.6"/>
    142
    +	<rect y="58.2" width="18.2" height="3.6"/>
    143
    +	<rect x="21.8" y="58.2" width="29.1" height="3.6"/>
    144
    +	<rect x="61.8" y="58.2" width="21.8" height="3.6"/>
    145
    +	<rect x="87.3" y="58.2" width="3.6" height="3.6"/>
    146
    +	<rect x="94.5" y="58.2" width="3.6" height="3.6"/>
    147
    +	<rect x="101.8" y="58.2" width="3.6" height="3.6"/>
    148
    +	<rect x="109.1" y="58.2" width="7.3" height="3.6"/>
    149
    +	<rect y="61.8" width="3.6" height="3.6"/>
    150
    +	<rect x="7.3" y="61.8" width="7.3" height="3.6"/>
    151
    +	<rect x="18.2" y="61.8" width="3.6" height="3.6"/>
    152
    +	<rect x="29.1" y="61.8" width="3.6" height="3.6"/>
    153
    +	<rect x="36.4" y="61.8" width="7.3" height="3.6"/>
    154
    +	<rect x="47.3" y="61.8" width="3.6" height="3.6"/>
    155
    +	<rect x="54.5" y="61.8" width="7.3" height="3.6"/>
    156
    +	<rect x="65.5" y="61.8" width="3.6" height="3.6"/>
    157
    +	<rect x="80" y="61.8" width="7.3" height="3.6"/>
    158
    +	<rect x="90.9" y="61.8" width="3.6" height="3.6"/>
    159
    +	<rect x="105.5" y="61.8" width="7.3" height="3.6"/>
    160
    +	<rect x="116.4" y="61.8" width="3.6" height="3.6"/>
    161
    +	<rect y="65.5" width="7.3" height="3.6"/>
    162
    +	<rect x="10.9" y="65.5" width="3.6" height="3.6"/>
    163
    +	<rect x="18.2" y="65.5" width="7.3" height="3.6"/>
    164
    +	<rect x="29.1" y="65.5" width="7.3" height="3.6"/>
    165
    +	<rect x="40" y="65.5" width="3.6" height="3.6"/>
    166
    +	<rect x="47.3" y="65.5" width="3.6" height="3.6"/>
    167
    +	<rect x="54.5" y="65.5" width="10.9" height="3.6"/>
    168
    +	<rect x="72.7" y="65.5" width="14.5" height="3.6"/>
    169
    +	<rect x="94.5" y="65.5" width="3.6" height="3.6"/>
    170
    +	<rect x="105.5" y="65.5" width="3.6" height="3.6"/>
    171
    +	<rect x="112.7" y="65.5" width="3.6" height="3.6"/>
    172
    +	<rect y="69.1" width="7.3" height="3.6"/>
    173
    +	<rect x="10.9" y="69.1" width="3.6" height="3.6"/>
    174
    +	<rect x="18.2" y="69.1" width="3.6" height="3.6"/>
    175
    +	<rect x="25.5" y="69.1" width="3.6" height="3.6"/>
    176
    +	<rect x="36.4" y="69.1" width="3.6" height="3.6"/>
    177
    +	<rect x="47.3" y="69.1" width="7.3" height="3.6"/>
    178
    +	<rect x="58.2" y="69.1" width="21.8" height="3.6"/>
    179
    +	<rect x="83.6" y="69.1" width="3.6" height="3.6"/>
    180
    +	<rect x="90.9" y="69.1" width="3.6" height="3.6"/>
    181
    +	<rect x="112.7" y="69.1" width="3.6" height="3.6"/>
    182
    +	<rect x="3.6" y="72.7" width="3.6" height="3.6"/>
    183
    +	<rect x="14.5" y="72.7" width="3.6" height="3.6"/>
    184
    +	<rect x="21.8" y="72.7" width="3.6" height="3.6"/>
    185
    +	<rect x="29.1" y="72.7" width="10.9" height="3.6"/>
    186
    +	<rect x="47.3" y="72.7" width="7.3" height="3.6"/>
    187
    +	<rect x="65.5" y="72.7" width="3.6" height="3.6"/>
    188
    +	<rect x="72.7" y="72.7" width="3.6" height="3.6"/>
    189
    +	<rect x="83.6" y="72.7" width="3.6" height="3.6"/>
    190
    +	<rect x="94.5" y="72.7" width="3.6" height="3.6"/>
    191
    +	<rect x="101.8" y="72.7" width="7.3" height="3.6"/>
    192
    +	<rect y="76.4" width="3.6" height="3.6"/>
    193
    +	<rect x="7.3" y="76.4" width="14.5" height="3.6"/>
    194
    +	<rect x="29.1" y="76.4" width="3.6" height="3.6"/>
    195
    +	<rect x="43.6" y="76.4" width="3.6" height="3.6"/>
    196
    +	<rect x="58.2" y="76.4" width="7.3" height="3.6"/>
    197
    +	<rect x="69.1" y="76.4" width="3.6" height="3.6"/>
    198
    +	<rect x="80" y="76.4" width="7.3" height="3.6"/>
    199
    +	<rect x="98.2" y="76.4" width="3.6" height="3.6"/>
    200
    +	<rect x="105.5" y="76.4" width="3.6" height="3.6"/>
    201
    +	<rect x="112.7" y="76.4" width="3.6" height="3.6"/>
    202
    +	<rect x="21.8" y="80" width="10.9" height="3.6"/>
    203
    +	<rect x="40" y="80" width="3.6" height="3.6"/>
    204
    +	<rect x="50.9" y="80" width="3.6" height="3.6"/>
    205
    +	<rect x="58.2" y="80" width="14.5" height="3.6"/>
    206
    +	<rect x="76.4" y="80" width="10.9" height="3.6"/>
    207
    +	<rect x="90.9" y="80" width="3.6" height="3.6"/>
    208
    +	<rect x="98.2" y="80" width="3.6" height="3.6"/>
    209
    +	<rect x="109.1" y="80" width="7.3" height="3.6"/>
    210
    +	<rect x="14.5" y="83.6" width="3.6" height="3.6"/>
    211
    +	<rect x="29.1" y="83.6" width="3.6" height="3.6"/>
    212
    +	<rect x="36.4" y="83.6" width="7.3" height="3.6"/>
    213
    +	<rect x="47.3" y="83.6" width="3.6" height="3.6"/>
    214
    +	<rect x="61.8" y="83.6" width="18.2" height="3.6"/>
    215
    +	<rect x="83.6" y="83.6" width="10.9" height="3.6"/>
    216
    +	<rect x="98.2" y="83.6" width="7.3" height="3.6"/>
    217
    +	<rect x="112.7" y="83.6" width="7.3" height="3.6"/>
    218
    +	<rect y="87.3" width="7.3" height="3.6"/>
    219
    +	<rect x="18.2" y="87.3" width="7.3" height="3.6"/>
    220
    +	<rect x="36.4" y="87.3" width="14.5" height="3.6"/>
    221
    +	<rect x="54.5" y="87.3" width="7.3" height="3.6"/>
    222
    +	<rect x="72.7" y="87.3" width="7.3" height="3.6"/>
    223
    +	<rect x="87.3" y="87.3" width="21.8" height="3.6"/>
    224
    +	<rect x="112.7" y="87.3" width="3.6" height="3.6"/>
    225
    +	<rect x="29.1" y="90.9" width="3.6" height="3.6"/>
    226
    +	<rect x="36.4" y="90.9" width="3.6" height="3.6"/>
    227
    +	<rect x="54.5" y="90.9" width="10.9" height="3.6"/>
    228
    +	<rect x="76.4" y="90.9" width="3.6" height="3.6"/>
    229
    +	<rect x="83.6" y="90.9" width="7.3" height="3.6"/>
    230
    +	<rect x="101.8" y="90.9" width="3.6" height="3.6"/>
    231
    +	<rect x="109.1" y="90.9" width="10.9" height="3.6"/>
    232
    +	<rect y="94.5" width="25.5" height="3.6"/>
    233
    +	<rect x="29.1" y="94.5" width="3.6" height="3.6"/>
    234
    +	<rect x="36.4" y="94.5" width="3.6" height="3.6"/>
    235
    +	<rect x="47.3" y="94.5" width="3.6" height="3.6"/>
    236
    +	<rect x="54.5" y="94.5" width="7.3" height="3.6"/>
    237
    +	<rect x="65.5" y="94.5" width="3.6" height="3.6"/>
    238
    +	<rect x="72.7" y="94.5" width="3.6" height="3.6"/>
    239
    +	<rect x="87.3" y="94.5" width="3.6" height="3.6"/>
    240
    +	<rect x="94.5" y="94.5" width="3.6" height="3.6"/>
    241
    +	<rect x="101.8" y="94.5" width="7.3" height="3.6"/>
    242
    +	<rect x="112.7" y="94.5" width="3.6" height="3.6"/>
    243
    +	<rect y="98.2" width="3.6" height="3.6"/>
    244
    +	<rect x="21.8" y="98.2" width="3.6" height="3.6"/>
    245
    +	<rect x="32.7" y="98.2" width="3.6" height="3.6"/>
    246
    +	<rect x="40" y="98.2" width="7.3" height="3.6"/>
    247
    +	<rect x="69.1" y="98.2" width="3.6" height="3.6"/>
    248
    +	<rect x="80" y="98.2" width="3.6" height="3.6"/>
    249
    +	<rect x="87.3" y="98.2" width="3.6" height="3.6"/>
    250
    +	<rect x="101.8" y="98.2" width="7.3" height="3.6"/>
    251
    +	<rect x="112.7" y="98.2" width="3.6" height="3.6"/>
    252
    +	<rect y="101.8" width="3.6" height="3.6"/>
    253
    +	<rect x="7.3" y="101.8" width="10.9" height="3.6"/>
    254
    +	<rect x="21.8" y="101.8" width="3.6" height="3.6"/>
    255
    +	<rect x="29.1" y="101.8" width="10.9" height="3.6"/>
    256
    +	<rect x="43.6" y="101.8" width="7.3" height="3.6"/>
    257
    +	<rect x="58.2" y="101.8" width="3.6" height="3.6"/>
    258
    +	<rect x="69.1" y="101.8" width="3.6" height="3.6"/>
    259
    +	<rect x="80" y="101.8" width="3.6" height="3.6"/>
    260
    +	<rect x="87.3" y="101.8" width="21.8" height="3.6"/>
    261
    +	<rect x="116.4" y="101.8" width="3.6" height="3.6"/>
    262
    +	<rect y="105.5" width="3.6" height="3.6"/>
    263
    +	<rect x="7.3" y="105.5" width="10.9" height="3.6"/>
    264
    +	<rect x="21.8" y="105.5" width="3.6" height="3.6"/>
    265
    +	<rect x="36.4" y="105.5" width="7.3" height="3.6"/>
    266
    +	<rect x="47.3" y="105.5" width="3.6" height="3.6"/>
    267
    +	<rect x="61.8" y="105.5" width="18.2" height="3.6"/>
    268
    +	<rect x="83.6" y="105.5" width="7.3" height="3.6"/>
    269
    +	<rect x="94.5" y="105.5" width="3.6" height="3.6"/>
    270
    +	<rect x="101.8" y="105.5" width="3.6" height="3.6"/>
    271
    +	<rect x="109.1" y="105.5" width="7.3" height="3.6"/>
    272
    +	<rect y="109.1" width="3.6" height="3.6"/>
    273
    +	<rect x="7.3" y="109.1" width="10.9" height="3.6"/>
    274
    +	<rect x="21.8" y="109.1" width="3.6" height="3.6"/>
    275
    +	<rect x="36.4" y="109.1" width="10.9" height="3.6"/>
    276
    +	<rect x="50.9" y="109.1" width="7.3" height="3.6"/>
    277
    +	<rect x="61.8" y="109.1" width="3.6" height="3.6"/>
    278
    +	<rect x="72.7" y="109.1" width="3.6" height="3.6"/>
    279
    +	<rect x="83.6" y="109.1" width="7.3" height="3.6"/>
    280
    +	<rect x="94.5" y="109.1" width="18.2" height="3.6"/>
    281
    +	<rect y="112.7" width="3.6" height="3.6"/>
    282
    +	<rect x="21.8" y="112.7" width="3.6" height="3.6"/>
    283
    +	<rect x="36.4" y="112.7" width="3.6" height="3.6"/>
    284
    +	<rect x="47.3" y="112.7" width="3.6" height="3.6"/>
    285
    +	<rect x="54.5" y="112.7" width="10.9" height="3.6"/>
    286
    +	<rect x="76.4" y="112.7" width="10.9" height="3.6"/>
    287
    +	<rect x="94.5" y="112.7" width="7.3" height="3.6"/>
    288
    +	<rect y="116.4" width="25.5" height="3.6"/>
    289
    +	<rect x="29.1" y="116.4" width="10.9" height="3.6"/>
    290
    +	<rect x="43.6" y="116.4" width="7.3" height="3.6"/>
    291
    +	<rect x="58.2" y="116.4" width="3.6" height="3.6"/>
    292
    +	<rect x="69.1" y="116.4" width="21.8" height="3.6"/>
    293
    +	<rect x="94.5" y="116.4" width="3.6" height="3.6"/>
    294
    +	<rect x="101.8" y="116.4" width="10.9" height="3.6"/>
    295
    +	<rect x="116.4" y="116.4" width="3.6" height="3.6"/>
    296
    +</g>
    297
    +</svg>

    + 52 - 0
    page/templates/page/img/shenduqingjie_icon.svg

    @@ -0,0 +1,52 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<g>
    11
    +			<path class="st0" d="M11.4,15.7c-0.9,0-1.8-0.2-2.7-0.5c-2-0.7-3.6-2.1-4.5-4C2.4,7.3,4.1,2.6,8.1,0.8c1.9-0.9,4-1,6-0.3
    12
    +				c2,0.7,3.6,2.1,4.5,4l0,0c1.9,3.9,0.2,8.6-3.8,10.4C13.7,15.5,12.6,15.7,11.4,15.7z M11.4,0.7c-1,0-2.1,0.2-3,0.7
    13
    +				c-3.6,1.7-5.1,5.9-3.4,9.5c0.8,1.7,2.3,3,4.1,3.7c1.8,0.6,3.7,0.5,5.5-0.3c3.6-1.7,5.1-5.9,3.4-9.5l0,0c-0.8-1.7-2.3-3-4.1-3.7
    14
    +				C13,0.9,12.2,0.7,11.4,0.7z"/>
    15
    +		</g>
    16
    +	</g>
    17
    +	<g>
    18
    +		<g>
    19
    +			<path class="st0" d="M9.8,12.3c-2.4-0.9-3.7-3.6-2.8-6c0.4-1.2,1.3-2.1,2.4-2.7C10.6,3.1,11.8,3,13,3.4c2.4,0.9,3.7,3.6,2.8,6
    20
    +				l-0.7-0.2c0.7-2.1-0.3-4.3-2.4-5.1c-1-0.4-2.1-0.3-3,0.1c-1,0.5-1.7,1.2-2,2.2c-0.7,2.1,0.3,4.3,2.4,5.1L9.8,12.3z"/>
    21
    +		</g>
    22
    +	</g>
    23
    +	<g>
    24
    +		<g>
    25
    +			<path class="st0" d="M19.4,13.8c-0.3,0.1-0.7,0.1-1-0.1c-0.3-0.2-0.6-0.4-0.7-0.7c-0.1,0.1-0.2,0.3-0.3,0.4
    26
    +				c0.2,0.3,0.5,0.6,0.8,0.8c0.3,0.1,0.5,0.2,0.8,0.2c0.2,0,0.3,0,0.5-0.1c0.1,0,0.2-0.2,0.2-0.3C19.7,13.8,19.6,13.8,19.4,13.8z"/>
    27
    +		</g>
    28
    +		<g>
    29
    +			<path class="st0" d="M20.9,11.7c-0.2-0.5-0.5-0.9-1-1.1c-0.2-0.1-0.5-0.2-0.8-0.2C19,10.6,19,10.8,18.9,11c0.3,0,0.5,0,0.8,0.1
    30
    +				c0.4,0.2,0.6,0.5,0.8,0.8c0.1,0.4,0.1,0.8-0.1,1.1c-0.1,0.1,0,0.3,0.1,0.3c0.1,0.1,0.3,0,0.3-0.1C21,12.7,21,12.2,20.9,11.7z"/>
    31
    +		</g>
    32
    +	</g>
    33
    +	<g>
    34
    +		<path class="st0" d="M19.1,17.3c-0.3,0-0.6-0.2-0.6-0.5c0-0.3-0.3-0.6-0.5-0.6c-0.3-0.1-0.6,0-0.8,0.3c-0.2,0.2-0.5,0.3-0.8,0.1
    35
    +			c-0.3-0.2-0.5-0.4-0.8-0.6c-0.2-0.2-0.3-0.6-0.1-0.8c0.1-0.1,0.2-0.1,0.3,0c0.1,0.1,0.1,0.2,0,0.3c0,0,0,0.1,0,0.2
    36
    +			c0.2,0.2,0.4,0.4,0.7,0.5c0.1,0,0.1,0,0.2,0c0.3-0.4,0.8-0.5,1.3-0.4c0.5,0.1,0.8,0.5,0.9,1c0,0.1,0.1,0.1,0.1,0.1
    37
    +			c0.3,0,0.6,0,0.9-0.1c0.1,0,0.1-0.1,0.1-0.1c-0.1-0.5,0.2-1,0.6-1.2c0.4-0.2,1-0.2,1.4,0.1c0,0,0.1,0,0.2,0
    38
    +			c0.2-0.2,0.4-0.4,0.5-0.7c0-0.1,0-0.1,0-0.2c-0.4-0.3-0.6-0.8-0.4-1.3c0.1-0.5,0.5-0.8,1-0.9c0.1,0,0.1-0.1,0.1-0.1
    39
    +			c0-0.3,0-0.6-0.1-0.9c0-0.1-0.1-0.1-0.1-0.1c-0.5,0.1-1-0.2-1.2-0.6c-0.2-0.4-0.2-1,0.1-1.4c0,0,0-0.1,0-0.2
    40
    +			c-0.2-0.2-0.4-0.4-0.7-0.5c-0.1,0-0.1,0-0.2,0C21,9.1,20.5,9.2,20,9.1c-0.1,0-0.2-0.2-0.2-0.3c0-0.1,0.2-0.2,0.3-0.2
    41
    +			c0.3,0.1,0.6,0,0.8-0.3c0.2-0.2,0.5-0.3,0.8-0.1c0.3,0.2,0.5,0.4,0.7,0.6c0.2,0.2,0.3,0.6,0.1,0.8c-0.2,0.2-0.2,0.6-0.1,0.8
    42
    +			c0.1,0.3,0.4,0.4,0.8,0.4c0.3,0,0.6,0.2,0.7,0.5C24,11.7,24,12,24,12.3c0,0.3-0.2,0.6-0.6,0.6c-0.3,0-0.6,0.2-0.6,0.5
    43
    +			c-0.1,0.3,0,0.6,0.3,0.8c0.2,0.2,0.3,0.6,0.1,0.8c-0.2,0.3-0.4,0.5-0.6,0.7c-0.2,0.2-0.6,0.3-0.8,0.1c-0.2-0.2-0.6-0.2-0.8-0.1
    44
    +			c-0.3,0.1-0.4,0.4-0.4,0.7c0,0.3-0.2,0.6-0.5,0.6C19.8,17.3,19.4,17.3,19.1,17.3C19.1,17.3,19.1,17.3,19.1,17.3z"/>
    45
    +	</g>
    46
    +	<g>
    47
    +		<path class="st0" d="M2.7,24c-0.4,0-0.7-0.1-1-0.3l-1-0.8c-0.7-0.6-0.9-1.6-0.3-2.4l3.7-5c0.1-0.2,0.3-0.2,0.5-0.1
    48
    +			c0.2,0.1,0.2,0.3,0.1,0.5l-3.7,5c-0.3,0.4-0.2,1,0.2,1.3l1,0.8c0.2,0.2,0.5,0.2,0.7,0.2c0.3,0,0.5-0.2,0.6-0.4l5.5-7.8
    49
    +			C9,14.9,9.3,14.9,9.4,15c0.2,0.1,0.2,0.3,0.1,0.5L4,23.3c-0.3,0.4-0.7,0.6-1.1,0.7C2.8,24,2.7,24,2.7,24z"/>
    50
    +	</g>
    51
    +</g>
    52
    +</svg>

    + 17 - 0
    page/templates/page/img/upto.svg

    @@ -0,0 +1,17 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 40 40" style="enable-background:new 0 0 40 40;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{opacity:0.7;fill:#333333;enable-background:new    ;}
    7
    +	.st1{fill:#FFFFFF;}
    8
    +	.st2{fill:none;stroke:#FFFFFF;stroke-width:2.8346;stroke-miterlimit:10;}
    9
    +</style>
    10
    +<g>
    11
    +	<g>
    12
    +		<path class="st0" d="M40,36c0,2.2-1.8,4-4,4H4c-2.2,0-4-1.8-4-4V4c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4V36z"/>
    13
    +	</g>
    14
    +	<polygon class="st1" points="10.8,28 20,13 29.2,28 	"/>
    15
    +	<line class="st2" x1="10.8" y1="11.2" x2="29.2" y2="11.2"/>
    16
    +</g>
    17
    +</svg>

    + 43 - 0
    page/templates/page/img/waiguanqingjie_icon.svg

    @@ -0,0 +1,43 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<polygon class="st0" points="3,10.7 4.4,11.1 3,11.6 2.5,13 2.1,11.6 0.7,11.1 2.1,10.7 2.5,9.3 		"/>
    11
    +	</g>
    12
    +	<g>
    13
    +		<polygon class="st0" points="5.4,8.5 5.9,8.7 5.4,8.8 5.2,9.3 5,8.8 4.5,8.7 5,8.5 5.2,8 		"/>
    14
    +	</g>
    15
    +	<g>
    16
    +		<path class="st0" d="M11,18.9l-5.8-5.8L17.3,0.9c1.1-1.1,3.1-1.1,4.3,0l1.5,1.5c1.2,1.2,1.2,3.1,0,4.3L11,18.9z M6.2,13.1l4.7,4.7
    17
    +			L22.6,6.1c0.9-0.9,0.9-2.4,0-3.3l-1.5-1.5c-0.9-0.9-2.4-0.9-3.3,0l-2.3,2.3L6.2,13.1z"/>
    18
    +	</g>
    19
    +	<g>
    20
    +		<g>
    21
    +			<rect x="-0.6" y="15.9" transform="matrix(0.7078 -0.7065 0.7065 0.7078 -10.8133 6.4561)" class="st0" width="6" height="0.7"/>
    22
    +		</g>
    23
    +		<g>
    24
    +			<rect x="0.4" y="17" transform="matrix(0.7078 -0.7065 0.7065 0.7078 -11.2506 7.5106)" class="st0" width="6" height="0.7"/>
    25
    +		</g>
    26
    +		<g>
    27
    +			<rect x="1.5" y="18" transform="matrix(0.7078 -0.7065 0.7065 0.7078 -11.6882 8.5648)" class="st0" width="6" height="0.7"/>
    28
    +		</g>
    29
    +		<g>
    30
    +			<rect x="2.5" y="19.1" transform="matrix(0.7078 -0.7065 0.7065 0.7078 -12.1255 9.6194)" class="st0" width="6" height="0.7"/>
    31
    +		</g>
    32
    +		<g>
    33
    +			<rect x="3.6" y="20.2" transform="matrix(0.7078 -0.7065 0.7065 0.7078 -12.5624 10.6733)" class="st0" width="6" height="0.7"/>
    34
    +		</g>
    35
    +		<g>
    36
    +			<rect x="4.7" y="21.2" transform="matrix(0.7078 -0.7065 0.7065 0.7078 -12.9997 11.7278)" class="st0" width="6" height="0.7"/>
    37
    +		</g>
    38
    +	</g>
    39
    +	<g>
    40
    +		<rect x="16.9" y="2.8" transform="matrix(0.7072 -0.7071 0.7071 0.7072 1.4577 13.7039)" class="st0" width="0.7" height="4.5"/>
    41
    +	</g>
    42
    +</g>
    43
    +</svg>

    + 38 - 0
    page/templates/page/img/weixiurengongfei_icon.svg

    @@ -0,0 +1,38 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<path class="st0" d="M18.6,24.1c-1.4,0-2.8-0.6-3.8-1.6c-1.5-1.6-2-3.8-1.2-5.9l-6.2-6.4L7,10.7L1.9,9.4L0.7,4.2l1.4-1.4l2,2
    11
    +			l0.5,2l1.7,0.4l1.3-1.3L7,4.2l-2-0.5l-1.9-2l1.4-1.4l5.1,1.3l1.2,5.2l-0.4,0.4l6.2,6.4c2-0.8,4.2-0.3,5.7,1.2
    12
    +			c2.1,2.1,2.1,5.6,0,7.8C21.4,23.6,20.1,24.1,18.6,24.1C18.6,24.1,18.6,24.1,18.6,24.1z M7.4,9.2l7.1,7.2l-0.1,0.2
    13
    +			c-0.8,1.8-0.4,3.9,1,5.3c0.9,0.9,2,1.4,3.3,1.4c1.2,0,2.4-0.5,3.3-1.4c1.8-1.9,1.8-4.9,0-6.8c-1.4-1.4-3.4-1.8-5.2-1l-0.2,0.1
    14
    +			L9.5,7.1l0.6-0.6L9,2.1L4.8,1.1L4.2,1.7L5.5,3l2.2,0.5l0.6,2.5L6.4,8L3.9,7.4L3.4,5.1L2.1,3.8L1.5,4.4l1,4.4l4.3,1.1L7.4,9.2z
    15
    +			 M18.6,21.5c-0.7,0-1.4-0.3-2-0.8c-1.1-1.1-1.1-2.9,0-4c1.1-1.1,2.9-1.1,3.9,0c1.1,1.1,1.1,2.9,0,4l0,0
    16
    +			C20.1,21.2,19.4,21.5,18.6,21.5z M18.6,16.5c-0.5,0-1.1,0.2-1.5,0.6c-0.8,0.8-0.8,2.2,0,3c0.8,0.8,2.1,0.8,2.9,0l0,0
    17
    +			c0.8-0.8,0.8-2.2,0-3C19.7,16.7,19.2,16.5,18.6,16.5z"/>
    18
    +	</g>
    19
    +	<g>
    20
    +		<g>
    21
    +			<path class="st0" d="M4.5,24.1c-0.5,0-0.9-0.2-1.2-0.5l-2.8-2.9c-0.7-0.7-0.7-1.8,0-2.4l4.7-4.8c0.6-0.7,1.8-0.7,2.4,0L7.1,14
    22
    +				c-0.4-0.4-1-0.4-1.4,0L1,18.8c-0.4,0.4-0.4,1,0,1.4l2.8,2.9c0.4,0.4,1,0.4,1.4,0l4.7-4.8c0.4-0.4,0.4-1,0-1.4l0.5-0.5
    23
    +				c0.7,0.7,0.7,1.8,0,2.4l-4.7,4.8C5.4,23.9,5,24.1,4.5,24.1z"/>
    24
    +		</g>
    25
    +		<g>
    26
    +			<path class="st0" d="M19.9,5.8c-0.5,0-0.9-0.2-1.2-0.5l-0.4-0.4c-0.7-0.7-0.7-1.8,0-2.4L21.6,0l1.9,2l-2.4,3.3
    27
    +				C20.8,5.7,20.4,5.8,19.9,5.8z M21.6,1L18.8,3c-0.3,0.4-0.3,1,0,1.4l0.4,0.4c0.4,0.4,1,0.4,1.4,0l2-2.8L21.6,1z"/>
    28
    +		</g>
    29
    +		<g>
    30
    +			
    31
    +				<rect x="13.5" y="6.8" transform="matrix(0.6979 -0.7162 0.7162 0.6979 -7.975954e-02 14.0466)" class="st0" width="6.2" height="0.7"/>
    32
    +		</g>
    33
    +		<g>
    34
    +			<rect x="1.8" y="17.1" transform="matrix(0.6979 -0.7162 0.7162 0.6979 -10.5716 9.92)" class="st0" width="9.3" height="0.7"/>
    35
    +		</g>
    36
    +	</g>
    37
    +</g>
    38
    +</svg>

    + 32 - 0
    page/templates/page/img/yanbao_icon.svg

    @@ -0,0 +1,32 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606261;}
    7
    +	.st1{fill:#606161;}
    8
    +</style>
    9
    +<g>
    10
    +	<g>
    11
    +		<path class="st0" d="M12.1,24c-0.4,0-0.8-0.1-1.2-0.4l-7.4-5.4c-0.5-0.4-0.8-1-0.8-1.7L1.5,4.4c0-1.2,1.3-2.3,2.5-2.6L11.7,0
    12
    +			l8.3,1.8c1.5,0.5,2.5,1.6,2.5,2.6l-1.1,12.2c0,0.6-0.3,1.2-0.8,1.6l-7.3,5.4C12.9,23.9,12.5,24,12.1,24z M21.7,4.3
    13
    +			c0-0.7-0.8-1.5-2-1.9l-8.1-1.7L4.2,2.5c-1.1,0.3-2,1.2-2,1.9l1.1,12.1c0,0.5,0.2,0.8,0.5,1.1l7.4,5.4c0.5,0.3,1.1,0.3,1.5,0
    14
    +			l7.3-5.4c0.3-0.2,0.5-0.6,0.5-1.1"/>
    15
    +	</g>
    16
    +	<g>
    17
    +		<path class="st1" d="M17.8,10.4h0.6c-0.6-2.8-3.1-4.8-6-4.8c-3.4,0-6.1,2.7-6.1,6.1s2.7,6.1,6.1,6.1c2.9,0,5.4-2,6-4.8h-0.6
    18
    +			c-0.6,2.4-2.9,4.2-5.4,4.2c-3,0-5.5-2.5-5.5-5.5s2.5-5.5,5.5-5.5C14.9,6.1,17.2,7.9,17.8,10.4z"/>
    19
    +		<path class="st1" d="M16,15.1l-3.5-3.2h1.3c0.6-0.1,1.8-0.5,1.8-1.8s-1.1-1.9-1.7-2L9.5,8v7h3.6v-0.6H10V8.6h3.7
    20
    +			C14,8.6,15,8.9,15,10s-1.1,1.2-1.3,1.3l0,0h-2v0.6l3.4,3.2H16z"/>
    21
    +	</g>
    22
    +	<g>
    23
    +		<g>
    24
    +			<polygon class="st0" points="4.7,19 0,19 0.6,16.8 0,14.7 2.7,14.7 2.7,15.2 0.6,15.2 1.1,16.8 0.6,18.5 4.7,18.5 			"/>
    25
    +		</g>
    26
    +		<g>
    27
    +			<polygon class="st0" points="24,19 19.3,19 19.3,18.5 23.4,18.5 22.9,16.9 23.4,15.2 21.2,15.2 21.2,14.7 24,14.7 23.4,16.9 			
    28
    +				"/>
    29
    +		</g>
    30
    +	</g>
    31
    +</g>
    32
    +</svg>

    + 68 - 0
    page/templates/page/img/yiwaiweixiuquan_icon.svg

    @@ -0,0 +1,68 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<g>
    11
    +			<ellipse class="st0" cx="6.7" cy="4.6" rx="0.4" ry="0.4"/>
    12
    +		</g>
    13
    +		<g>
    14
    +			<ellipse class="st0" cx="6.7" cy="9" rx="0.4" ry="0.4"/>
    15
    +		</g>
    16
    +		<g>
    17
    +			<ellipse class="st0" cx="6.7" cy="6.8" rx="0.4" ry="0.4"/>
    18
    +		</g>
    19
    +		<g>
    20
    +			<ellipse class="st0" cx="6.7" cy="11.1" rx="0.4" ry="0.4"/>
    21
    +		</g>
    22
    +		<g>
    23
    +			<ellipse class="st0" cx="6.7" cy="13.3" rx="0.4" ry="0.4"/>
    24
    +		</g>
    25
    +		<g>
    26
    +			<ellipse class="st0" cx="6.7" cy="15.5" rx="0.4" ry="0.4"/>
    27
    +		</g>
    28
    +		<g>
    29
    +			<ellipse class="st0" cx="6.7" cy="19.9" rx="0.4" ry="0.4"/>
    30
    +		</g>
    31
    +		<g>
    32
    +			<ellipse class="st0" cx="6.7" cy="17.7" rx="0.4" ry="0.4"/>
    33
    +		</g>
    34
    +	</g>
    35
    +	<g>
    36
    +		<g>
    37
    +			<path class="st0" d="M16.5,15.3c-0.2,0-0.3,0-0.5,0c-1.7-0.3-2.8-1.9-2.5-3.5c0.3-1.7,1.9-2.8,3.5-2.5c1.7,0.3,2.8,1.9,2.5,3.5
    38
    +				l-0.9-0.2c0.2-1.2-0.6-2.3-1.8-2.4c-1.2-0.2-2.3,0.6-2.4,1.8c-0.2,1.2,0.6,2.3,1.8,2.4c0.5,0.1,1,0,1.5-0.3l0.5,0.8
    39
    +				C17.7,15.2,17.1,15.3,16.5,15.3z"/>
    40
    +		</g>
    41
    +		<g>
    42
    +			<path class="st0" d="M18.5,19.7c-0.4,0-0.8-0.2-1-0.6c-0.2-0.4-0.6-0.7-1-0.7h0c-0.4,0-0.8,0.3-1,0.7c-0.2,0.5-0.8,0.7-1.3,0.6
    43
    +				c-0.5-0.1-1-0.3-1.4-0.6c-0.5-0.3-0.7-0.8-0.5-1.3c0.2-0.4,0.1-0.9-0.2-1.2c-0.3-0.3-0.8-0.4-1.2-0.2c-0.5,0.2-1,0-1.3-0.5
    44
    +				c-0.2-0.4-0.4-0.9-0.6-1.4C9,14,9.2,13.4,9.7,13.2c0.4-0.2,0.7-0.6,0.7-1c0-0.4-0.3-0.8-0.7-1C9.2,11,9,10.5,9.1,10
    45
    +				c0.1-0.5,0.3-1,0.6-1.4C10,8.1,10.5,7.9,11,8.1c0.4,0.2,0.8,0.1,1.1-0.2c0.3-0.3,0.4-0.7,0.2-1.1c-0.2-0.5,0-1,0.5-1.3
    46
    +				c0.4-0.2,0.9-0.4,1.4-0.6c0.5-0.2,1.1,0.1,1.3,0.6c0.2,0.4,0.6,0.7,1,0.7c0,0,0,0,0,0c0.4,0,0.8-0.3,1-0.7
    47
    +				c0.2-0.5,0.8-0.7,1.3-0.6c0.5,0.1,0.9,0.3,1.3,0.6c0.5,0.3,0.7,0.8,0.5,1.3c-0.2,0.4-0.1,0.9,0.2,1.2c0.3,0.3,0.8,0.4,1.2,0.2
    48
    +				c0.5-0.2,1.1,0,1.3,0.5C23.6,9,23.8,9.5,24,10c0.2,0.5-0.1,1.1-0.6,1.3c-0.4,0.2-0.6,0.6-0.6,1v0c0,0.4,0.3,0.8,0.6,1
    49
    +				c0.5,0.2,0.8,0.8,0.6,1.3c-0.1,0.5-0.3,0.9-0.6,1.3c-0.3,0.5-0.8,0.7-1.3,0.5c-0.4-0.2-0.9-0.1-1.2,0.2c-0.3,0.3-0.4,0.8-0.2,1.2
    50
    +				c0.2,0.5,0,1.1-0.5,1.3c-0.4,0.2-0.9,0.4-1.4,0.6C18.7,19.7,18.6,19.7,18.5,19.7z M16.5,17.5C16.5,17.5,16.5,17.5,16.5,17.5
    51
    +				c0.8,0,1.5,0.5,1.9,1.2c0,0,0.1,0,0.1,0c0.4-0.1,0.8-0.3,1.2-0.5c0.1,0,0.1-0.1,0.1-0.1c-0.3-0.8-0.1-1.6,0.4-2.2
    52
    +				c0.6-0.6,1.4-0.7,2.2-0.4c0,0,0.1,0,0.1-0.1c0.2-0.4,0.4-0.8,0.5-1.2c0-0.1,0-0.1-0.1-0.1c-0.7-0.3-1.2-1.1-1.2-1.9l0,0
    53
    +				c0-0.8,0.5-1.5,1.2-1.9c0.1,0,0.1-0.1,0.1-0.1c-0.1-0.4-0.3-0.8-0.5-1.2c0,0-0.1-0.1-0.1-0.1c-0.8,0.3-1.6,0.2-2.2-0.4
    54
    +				c-0.6-0.6-0.8-1.5-0.4-2.2c0,0,0-0.1-0.1-0.1c-0.4-0.2-0.8-0.4-1.2-0.5c-0.1,0-0.1,0-0.1,0C18.1,6.5,17.4,7,16.6,7c0,0,0,0,0,0
    55
    +				c-0.8,0-1.5-0.5-1.9-1.2c0,0-0.1,0-0.1,0c-0.4,0.1-0.8,0.3-1.2,0.5c-0.1,0-0.1,0.1-0.1,0.1c0.3,0.8,0.1,1.6-0.5,2.2
    56
    +				c-0.6,0.6-1.4,0.7-2.2,0.4c0,0-0.1,0-0.1,0.1c-0.2,0.4-0.4,0.8-0.5,1.2c0,0.1,0,0.1,0,0.1c0.8,0.3,1.2,1.1,1.2,1.9
    57
    +				c0,0.8-0.5,1.5-1.2,1.9c0,0,0,0.1,0,0.1c0.1,0.4,0.3,0.8,0.5,1.2c0,0.1,0.1,0.1,0.1,0.1c0.8-0.3,1.6-0.1,2.2,0.4
    58
    +				c0.6,0.6,0.7,1.4,0.4,2.2c0,0,0,0.1,0.1,0.1c0.4,0.2,0.8,0.4,1.2,0.5c0.1,0,0.1,0,0.1,0C15,18,15.7,17.5,16.5,17.5z"/>
    59
    +		</g>
    60
    +	</g>
    61
    +	<g>
    62
    +		<path class="st0" d="M20.8,24H7.7v-0.5c0-0.6-0.5-1-1-1s-1,0.5-1,1V24H2.1C0.9,24,0,23.1,0,22V2c0-1.1,0.9-2,2.1-2h3.5v0.5
    63
    +			c0,0.6,0.5,1,1,1s1-0.5,1-1V0h13.1c1.2,0,2.1,0.9,2.1,2v5.1h-1V2c0-0.6-0.5-1.1-1.1-1.1H8.6c-0.2,0.9-1,1.5-1.9,1.5S4.9,1.8,4.7,1
    64
    +			H2.1C1.5,1,1,1.4,1,2v20C1,22.6,1.5,23,2.1,23h2.6c0.2-0.9,1-1.5,1.9-1.5s1.7,0.6,1.9,1.5h12.2c0.6,0,1.1-0.5,1.1-1.1v-4.6h1V22
    65
    +			C22.9,23.1,22,24,20.8,24z"/>
    66
    +	</g>
    67
    +</g>
    68
    +</svg>

    + 47 - 0
    page/templates/page/img/zhuanshulipin_icon.svg

    @@ -0,0 +1,47 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<g>
    11
    +			<g>
    12
    +				<path class="st0" d="M11.1,6.1c-1.2,0-3.2-0.2-4.6-1.2C5.5,4,4.9,3,5,2c0-0.7,0.4-1.3,1-1.6C6.7,0,7.4-0.1,8.2,0.1
    13
    +					c2.4,0.8,4,5.2,4.1,5.4L12.4,6l-0.5,0C11.9,6,11.6,6.1,11.1,6.1z M7.3,0.7C7,0.7,6.7,0.8,6.4,1C6,1.3,5.8,1.6,5.7,2.1
    14
    +					c0,0.7,0.4,1.5,1.2,2.2c1.3,1,3.4,1.1,4.4,1.1c-0.5-1.1-1.8-3.9-3.4-4.5C7.7,0.8,7.5,0.7,7.3,0.7z"/>
    15
    +			</g>
    16
    +			<g>
    17
    +				<path class="st0" d="M11.5,5.8c0,0-1.5-4.2-3.6-5C7.4,0.6,6.9,0.7,6.4,1L6,0.4C6.7,0,7.4-0.1,8.2,0.1c2.4,0.8,4,5.2,4.1,5.4
    18
    +					L11.5,5.8z"/>
    19
    +			</g>
    20
    +		</g>
    21
    +		<g>
    22
    +			<g>
    23
    +				<path class="st0" d="M12.8,6.1c-0.5,0-0.8,0-0.8,0l-0.5,0l0.2-0.4c0.1-0.2,1.7-4.6,4.1-5.4c0.7-0.3,1.5-0.2,2.2,0.3
    24
    +					c0.6,0.4,0.9,1,1,1.6c0.1,1-0.5,2-1.5,2.8C16,5.9,14,6.1,12.8,6.1z M12.5,5.3c1,0,3.1-0.1,4.4-1.1c0.8-0.7,1.3-1.5,1.2-2.2
    25
    +					c0-0.4-0.3-0.8-0.6-1.1c-0.5-0.3-1-0.4-1.6-0.2C14.3,1.4,13,4.2,12.5,5.3z"/>
    26
    +			</g>
    27
    +			<g>
    28
    +				<path class="st0" d="M12.4,5.8l-0.7-0.2c0.1-0.2,1.7-4.6,4.1-5.4c0.7-0.3,1.5-0.2,2.2,0.3L17.5,1c-0.5-0.3-1-0.4-1.6-0.2
    29
    +					C13.9,1.6,12.4,5.8,12.4,5.8z"/>
    30
    +			</g>
    31
    +		</g>
    32
    +	</g>
    33
    +	<g>
    34
    +		<g>
    35
    +			<rect x="0.3" y="14.9" class="st0" width="23.1" height="0.7"/>
    36
    +		</g>
    37
    +		<g>
    38
    +			<path class="st0" d="M21.7,24H2.3C1,24,0,23.1,0,21.9V9.2C0,8,1,7.1,2.3,7.1h19.4C23,7.1,24,8,24,9.2l0,3.7
    39
    +				c0.1,0.5,0.1,1.6,0,4.7v4.3C24,23.1,23,24,21.7,24z M2.3,7.8c-0.9,0-1.5,0.6-1.5,1.4v12.7c0,0.8,0.7,1.4,1.5,1.4h19.4
    40
    +				c0.9,0,1.5-0.6,1.5-1.4v-4.3c0-1.5,0-3.8,0-4.5l0,0l0-4c0-0.8-0.7-1.4-1.5-1.4H2.3z"/>
    41
    +		</g>
    42
    +		<g>
    43
    +			<rect x="11.6" y="7.3" class="st0" width="0.7" height="16.1"/>
    44
    +		</g>
    45
    +	</g>
    46
    +</g>
    47
    +</svg>

    + 29 - 0
    page/templates/page/img/zhuanxiangliyu_icon.svg

    @@ -0,0 +1,29 @@
    1
    +<?xml version="1.0" encoding="utf-8"?>
    2
    +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    3
    +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    4
    +	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
    5
    +<style type="text/css">
    6
    +	.st0{fill:#606161;}
    7
    +</style>
    8
    +<g>
    9
    +	<g>
    10
    +		<path class="st0" d="M11.7,18.9c-0.1,0-0.2,0-0.2-0.1c-2.5-2-4-4.2-4.3-6.1c-0.1-1,0-1.8,0.5-2.5c0.5-0.7,1.2-1,1.9-1
    11
    +			c0.8,0,1.6,0.5,2.3,1.2c0.7-0.7,1.5-1.2,2.3-1.2c0.7,0,1.4,0.3,1.9,1c0.5,0.6,0.7,1.5,0.6,2.5c-0.2,1.4-1.4,2.8-2.4,3.7
    12
    +			c-0.3,0.3-0.6,0.6-0.9,0.8c-0.2,0.1-0.4,0.1-0.5-0.1c-0.1-0.2-0.1-0.4,0.1-0.5c0.3-0.3,0.6-0.5,0.9-0.8c1.3-1.2,2-2.3,2.1-3.3
    13
    +			c0.1-0.8-0.1-1.4-0.4-1.9c-0.3-0.3-0.7-0.7-1.3-0.7c-1,0-1.8,1-2,1.3c-0.1,0.2-0.4,0.2-0.6,0c-0.2-0.3-1-1.2-2-1.3
    14
    +			c-0.5,0-1,0.2-1.4,0.7c-0.4,0.5-0.5,1.2-0.4,1.9c0.3,1.7,1.7,3.7,4,5.6c0.2,0.1,0.2,0.4,0.1,0.5C11.9,18.8,11.8,18.9,11.7,18.9z"
    15
    +			/>
    16
    +	</g>
    17
    +	<g>
    18
    +		<path class="st0" d="M18.2,24c-0.3,0-0.6-0.1-0.8-0.2l-6.5-5.5c-0.2-0.1-0.2-0.4,0-0.5c0.1-0.2,0.4-0.2,0.5,0l6.5,5.5
    19
    +			c0.3,0.2,0.7,0.1,1-0.1c0.3-0.2,0.5-0.6,0.4-1.1l-0.9-6.2c-0.1-0.6,0.1-1.2,0.5-1.6l4.1-4c0.3-0.3,0.4-0.7,0.3-1.1
    20
    +			c-0.1-0.4-0.4-0.7-0.8-0.7l-5.6-0.9c-0.6-0.1-1.1-0.5-1.3-1L13,1.3c-0.2-0.4-0.5-0.6-0.9-0.6c0,0,0,0,0,0c-0.4,0-0.8,0.2-0.9,0.6
    21
    +			L8.6,6.4C8.3,7,7.8,7.3,7.2,7.4L1.6,8.2C1.2,8.3,0.9,8.5,0.8,8.9c-0.1,0.4,0,0.8,0.3,1.1l4,4c0.4,0.4,0.6,1,0.5,1.6l-1,6.2
    22
    +			C4.5,22.3,4.6,22.7,5,23c0.3,0.2,0.7,0.3,1.1,0.1l4.3-3.9c0.1-0.1,0.4-0.1,0.5,0c0.1,0.1,0.1,0.4,0,0.5l-4.3,3.9
    23
    +			C5.8,24,5.1,24,4.5,23.6c-0.6-0.4-0.8-1.1-0.7-1.8l1-6.2c0.1-0.4,0-0.7-0.3-1l-4-4C0,10.1-0.1,9.4,0.1,8.7C0.3,8,0.9,7.6,1.5,7.5
    24
    +			l5.6-0.8c0.3,0,0.6-0.3,0.8-0.6L10.5,1c0.3-0.6,0.9-1,1.6-1c0,0,0,0,0,0c0.7,0,1.3,0.4,1.6,1l2.5,5.2c0.2,0.3,0.4,0.5,0.8,0.6
    25
    +			l5.6,0.9c0.7,0.1,1.2,0.6,1.4,1.2c0.2,0.7,0,1.4-0.5,1.9l-4.1,4c-0.3,0.2-0.4,0.6-0.3,1l0.9,6.2c0.1,0.7-0.2,1.4-0.7,1.8
    26
    +			C18.9,23.9,18.6,24,18.2,24z"/>
    27
    +	</g>
    28
    +</g>
    29
    +</svg>