ss="lines-num lines-num-new"> 54
+            Toast.show(message: "网络出现未知错误")
55
+        }
69 56
     }
70 57
     
58
+    
71 59
     public func post<A: Resource>(resource: A) -> Single<A.Model> {
72 60
         return Single<A.Model>.create(subscribe: { observer in
73 61
             let request = self.session.request(resource.host + resource.path.rawValue,
@@ -91,6 +79,7 @@ class NetworkApi {
91 79
                         }
92 80
                         
93 81
                     case .failure(let error):
82
+                        self.handlingError(error: error)
94 83
                         observer(.error(error))
95 84
                     }
96 85
             }
@@ -106,6 +95,7 @@ class NetworkApi {
106 95
                 .responseJSON { (res) in
107 96
                     switch res.result {
108 97
                     case .success(let json):
98
+                        print(json)
109 99
                         guard let json = json as? [String: AnyObject],
110 100
                             let data = resource.parse(json) else {
111 101
                                 observer(.error(ParseError()))
@@ -113,6 +103,7 @@ class NetworkApi {
113 103
                         }
114 104
                         observer(.success(data))
115 105
                     case .failure(let error):
106
+                        self.handlingError(error: error)
116 107
                         observer(.error(error))
117 108
                     }
118 109
             }
@@ -156,6 +147,7 @@ class NetworkApi {
156 147
                             observer(.error(BusinessError(id: status)))
157 148
                         }
158 149
                     case .failure(let error):
150
+                        self.handlingError(error: error)
159 151
                         observer(.error(error))
160 152
                     }
161 153
                 })

+ 72 - 111
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/WXUserInfoRemoteAPI.swift

@@ -12,64 +12,28 @@ import RxSwift
12 12
 fileprivate let WXAppid = "wx4e22a0c8ae6d766d"
13 13
 fileprivate let WXSecret = "636ac848016c593575d11143c55c8333"
14 14
 
15
-//fileprivate protocol WXUserInfoParse: Parsable where Model == JSON {}
16
-//
17
-//extension DefaultResource: WXUserInfoParse {
18
-//    func parse(_ json: JSON) -> JSON? { return json }
19
-//}
20
-//
21
-//fileprivate struct WXResource: Resource, Parsable {
22
-//    typealias Model = UserInfo
23
-//
24
-//    var path: Interfaces { return .authorize }
25
-//    var parameter: Parameter = [:]
26
-//
27
-//    func parse(_ json: JSON) -> UserInfo? {
28
-//        guard let result = json["data"] as? JSON else { return nil }
29
-//        return UserInfo(json: result)
30
-//    }
31
-//}
32
-
33
-class WXUserInfoRemoteAPI: UserInfoRemoteAPI {
34
-    
35
-    typealias Model = UserInfo
36
-//    fileprivate var wxResource: WXResource
37
-//    fileprivate var wxTokenResource: DefaultResource
38
-//    fileprivate var wxUserInfoResource: DefaultResource
15
+struct WXUserInfoRemoteAPI: UserInfoRemoteAPI {
39 16
     
40
-    init() {
41
-        let wxUrl = "https://api.weixin.qq.com"
42
-//        self.wxResource = WXResource()
43
-//        self.wxTokenResource = DefaultResource(host: wxUrl, path: .wxAccessToken, parameter: [:])
44
-//        self.wxUserInfoResource = DefaultResource(host: wxUrl, path: .wxUserInfo, parameter: [:])
45
-    }
17
+    init() {}
46 18
     
47 19
     func login() -> Single<UserInfo> {
20
+        #if (arch(i386) || arch(x86_64))
48 21
         return Single.create(subscribe: { (observer) in
49 22
             observer(.success(UserInfo(json: ["user_id": "fiDz2Ms" as AnyObject, "userName": "郑剑飞" as AnyObject, "photoPath": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJibSYLgvXpMakvD9FaCqfiaWqcMiaiaz905YxWPuO4hy8F2lGheV7kVr9vKKXFgmL1S5s4QJgxwuwtVw/132" as AnyObject])))
50 23
             return Disposables.create()
51 24
         })
52
-        return Single.create(subscribe: { (observer) -> Disposable in
53
-            
54
-//            let wxLoginObserver = self.addWXLoginDidFinish()
55
-//            let wxTokenObserver = self.getWXToken()
56
-//            let wxUserInfoObserver = self.getWXUserInfo()
57
-//            let loginObserver = self.wxLogin()
58
-//            
59
-//            Single.of(wxLoginObserver,
60
-//                          wxTokenObserver,
61
-//                          wxUserInfoObserver)
62
-//                .concat().asSingle()
63
-//                .subscribe({_ in
64
-//                    loginObserver.asSingle()
65
-//                        .subscribe(onNext: { (userInfo) in
66
-//                            observer.onNext(userInfo)
67
-//                            self.removeWXLoginDidFinish()
68
-//                    }).dispose()
69
-//                }).dispose()
70
-            
71
-            return Disposables.create()
25
+        #else
26
+        loginWithWeChat()
27
+        return addWXLoginDidFinish().flatMap({
28
+            return self.getWXToken(param: $0)
29
+        }).flatMap({
30
+            return self.getWXUserInfo(param: $0)
31
+        }).flatMap({
32
+            return self.wxLogin(param: $0)
33
+        }).do(onSuccess: { res in
34
+            print(res)
72 35
         })
36
+        #endif
73 37
     }
74 38
     
75 39
     fileprivate func loginWithWeChat() {
@@ -80,68 +44,65 @@ class WXUserInfoRemoteAPI: UserInfoRemoteAPI {
80 44
         WXApi.send(request)
81 45
     }
82 46
     
83
-//    fileprivate func addWXLoginDidFinish() -> Completable {
84
-//        return Single.create { (observer) in
85
-////            NotificationCenter.default.addObserver(forName: Notification.WXLoginNotification, object: nil, queue: nil) { (notification) in
86
-////                guard let userInfo = notification.userInfo,
87
-////                    let code = userInfo["code"] as? String else { return }
88
-////                self.wxTokenResource.parameter = ["appid": WXAppid, "secret": WXSecret,
89
-////                                                  "code": code, "grant_type": "authorization_code"]
90
-////                observer.onCompleted()
91
-////            }
92
-////
93
-//            return Disposables.create()
94
-//        }
95
-//    }
96
-//
97
-//    fileprivate func getWXToken() -> Completable {
98
-//        return Single.create({ (observer) in
99
-////            let resource = ContentResource.init(host:"https://api.weixin.qq.com",
100
-////                                                path: .wxAccessToken,
101
-////                                                parameter: <#T##Parameter#>, parseJSON: <#T##(JSON) -> _?#>)
102
-////            NetworkApi.share.get(resource: self.wxTokenResource) { (result) in
103
-////                guard case let .success(data) = result,
104
-////                    let token = data["access_token"] as? String,
105
-////                    let openId = data["openid"] as? String else { return }
106
-////                self.wxUserInfoResource.parameter = ["access_token": token, "openid": openId]
107
-////                observer.onCompleted()
108
-////            }
109
-//
110
-//            return Disposables.create()
111
-//        })
112
-//    }
113
-//
114
-//    fileprivate func getWXUserInfo() -> Completable {
115
-//        return Single.create({ (observer) in
116
-////            NetworkApi.share.get(resource: self.wxUserInfoResource) { (result) in
117
-////                guard case let .success(data) = result else { return }
118
-////                if let errcode = data["errcode"] as? Int,
119
-////                    errcode == 40003 { return }
120
-////                self.wxResource.parameter = data
121
-////                observer.onCompleted()
122
-////            }
123
-//
124
-//            return Disposables.create()
125
-//        })
126
-//    }
127
-//
128
-//    fileprivate func wxLogin() -> Single<UserInfo> {
129
-//        return Single.create({ (observer) in
130
-////            NetworkApi.share.post(resource: self.wxResource) { (result) in
131
-////                guard case let .success(data) = result else { return }
132
-////                observer.onNext(data)
133
-////                observer.onCompleted()
134
-////            }
135
-////
136
-//            return Disposables.create()
137
-//        })
138
-//    }
47
+    fileprivate func addWXLoginDidFinish() -> Single<[String: String]> {
48
+        return Single.create(subscribe: { observer -> Disposable in
49
+            NotificationCenter.default.addObserver(forName: Notification.wxNotification.login, object: nil, queue: nil, using: { notification in
50
+                guard let userInfo = notification.userInfo,
51
+                    let errcode = userInfo["errCode"] as? Int,
52
+                    let code = userInfo["code"] as? String else {
53
+                        Toast.show(message: "获取code失败")
54
+                        return observer(.error(ParseError()))
55
+                }
56
+                switch errcode {
57
+                case 0:
58
+                    observer(.success(["appid": WXAppid, "secret": WXSecret,
59
+                                       "code": code, "grant_type": "authorization_code"]))
60
+                case -4:
61
+                    Toast.show(message: "您拒绝授权,登录失败")
62
+                    break
63
+                case -2:
64
+                    Toast.show(message: "您取消了登录,登录失败")
65
+                    break
66
+                default:
67
+                    Toast.show(message: "发生未知错误,登录失败")
68
+                    break
69
+                }
70
+                return observer(.error(BusinessError(id: errcode)))
71
+            })
72
+            return Disposables.create()
73
+        })
74
+    }
75
+
76
+    fileprivate func parseWxToken(json: JSON) -> [String: String]? {
77
+        guard let token = json["access_token"] as? String,
78
+            let openId = json["openid"] as? String else { return nil }
79
+        return ["access_token": token, "openid": openId]
80
+    }
81
+    
82
+    fileprivate func getWXToken(param: [String: String]) -> Single<[String: String]> {
83
+        let resource = ContentResource<[String: String]>(host: "https://api.weixin.qq.com",
84
+                                                      path: .wxAccessToken,
85
+                                                      parameter: param,
86
+                                                      parseJSON: parseWxToken)
87
+        
88
+        return NetworkApi.share.get(resource: resource)
89
+    }
90
+
91
+    fileprivate func getWXUserInfo(param: [String: String]) -> Single<[String: Any]> {
92
+        let resource = ContentResource<[String: Any]>(host: "https://api.weixin.qq.com",
93
+                                                      path: .wxUserInfo,
94
+                                                      parameter: param,
95
+                                                      parseJSON: { $0 })
96
+        return NetworkApi.share.get(resource: resource)
97
+    }
139 98
     
140
-    fileprivate func removeWXLoginDidFinish() {
141
-        NotificationCenter.default.removeObserver(self, name: Notification.WXLoginNotification, object: nil)
99
+    fileprivate func parseAuthorize(json: JSON) -> UserInfo? {
100
+        guard let data = json["data"] as? [String: AnyObject] else { return nil }
101
+        return UserInfo(json: data)
142 102
     }
143
-}
144 103
 
145
-extension Notification {
146
-    static let WXLoginNotification = Notification.Name("WXLoginDidFinishNotification")
104
+    fileprivate func wxLogin(param: [String: Any]) -> Single<UserInfo> {
105
+        let resource = ContentResource<UserInfo>(path: .authorize, parameter: param, parseJSON: parseAuthorize)
106
+        return resource.loadContent()
107
+    }
147 108
 }

+ 6 - 0
PaiAi/PaiaiDataKit/PresentLayer/UserInfoViewModel.swift

@@ -77,11 +77,17 @@ public class UserInfoViewModel {
77 77
     }
78 78
     
79 79
     public func wxLogin() {
80
+        Toast.showActivity(message: "正在登陆")
80 81
         repository.wxLogin().subscribe(onSuccess: { (userInfo) in
81 82
             self.shareUserInfo.accept(userInfo)
82 83
             self._loginCompleted.onNext(())
83 84
         }) { (error) in
85
+            print(error)
84 86
             #warning("错误处理")
85 87
         }.disposed(by: disposeBag)
86 88
     }
89
+    
90
+    deinit {
91
+        print("销毁")
92
+    }
87 93
 }

+ 1 - 0
PaiAi/PaiaiDataKit/Resuable/Extension/Notification+wxPay.swift

@@ -11,5 +11,6 @@ import Foundation
11 11
 public extension Notification {
12 12
     struct wxNotification {
13 13
         public static let payDidFinish = Notification.Name("WXPayDidFinishNotification")
14
+        public static let login = Notification.Name("WXLoginDidFinishNotification")
14 15
     }
15 16
 }

+ 0 - 1
PaiAi/Paiai_iOS/App/LoginViewController.swift

@@ -83,6 +83,5 @@ extension LoginViewController {
83 83
                     self.guestLoginBtn.isHidden = false
84 84
                 }
85 85
             }).disposed(by: disposeBag)
86
-        
87 86
     }
88 87
 }

pai2 - Gogs: Go Git Service

拍爱

strip_utils.py 98B

    # -*- coding: utf-8 -*- def tstrip(s): return s.strip() if isinstance(s, basestring) else s