@@ -1179,9 +1179,9 @@  | 
            ||
| 1179 | 1179 | 
                A69FFAA31E7004700006FEE0 /* PhotoDetailViewController.swift */,  | 
            
| 1180 | 1180 | 
                A69FFA9E1E7004700006FEE0 /* PhotoDetailCommentCell.swift */,  | 
            
| 1181 | 1181 | 
                05594C022240E94E002D4910 /* PhotoDetailImageCell.swift */,  | 
            
| 1182 | 
                - A69FFAA61E7004700006FEE0 /* ImageCell.swift */,  | 
            |
| 1183 | 1182 | 
                A69FFAA81E7004700006FEE0 /* ShareController.swift */,  | 
            
| 1184 | 1183 | 
                A69FFAA91E7004700006FEE0 /* PhotoPreviewViewController.swift */,  | 
            
| 1184 | 
                + A69FFAA61E7004700006FEE0 /* ImageCell.swift */,  | 
            |
| 1185 | 1185 | 
                A69FFB881E7018CC0006FEE0 /* PhotoDetail.storyboard */,  | 
            
| 1186 | 1186 | 
                );  | 
            
| 1187 | 1187 | 
                path = PhotoDetail;  | 
            
                @@ -88,7 +88,7 @@ extension PhotoItem: Mappable {
               | 
            ||
| 88 | 88 | 
                }  | 
            
| 89 | 89 | 
                     mutating public func mapping(map: Map) {
               | 
            
| 90 | 90 | 
                let dateFormatter = DateFormatter()  | 
            
| 91 | 
                - dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"  | 
            |
| 91 | 
                + dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"  | 
            |
| 92 | 92 | 
                created_at <- (map["created_at"], DateFormatterTransform(dateFormatter:dateFormatter))  | 
            
| 93 | 93 | 
                avatar <- map["avatar"]  | 
            
| 94 | 94 | 
                comment_num <- map["comment_num"]  | 
            
                @@ -14,9 +14,9 @@ struct FileModel {
               | 
            ||
| 14 | 14 | 
                let fileData: Data  | 
            
| 15 | 15 | 
                let mimeType: String  | 
            
| 16 | 16 | 
                 | 
            
| 17 | 
                -    init(name: String, fileName: String? = nil, fileData: Data, mimeType: String = "image/jpeg") {
               | 
            |
| 17 | 
                +    init(name: String = "photo", fileName: String, fileData: Data, mimeType: String = "image/jpeg") {
               | 
            |
| 18 | 18 | 
                self.name = name  | 
            
| 19 | 
                - self.fileName = fileName ?? name  | 
            |
| 19 | 
                + self.fileName = fileName  | 
            |
| 20 | 20 | 
                self.fileData = fileData  | 
            
| 21 | 21 | 
                self.mimeType = mimeType  | 
            
| 22 | 22 | 
                }  | 
            
                @@ -33,8 +33,9 @@ struct GroupPhotoRemoteAPI {
               | 
            ||
| 33 | 33 | 
                }  | 
            
| 34 | 34 | 
                 | 
            
| 35 | 35 | 
                     func uploadPhoto(data: Data) -> Single<[PhotoItem]> {
               | 
            
| 36 | 
                -// let name = groupId + "" + "\(Date.timeIntervalSinceReferenceDate)"  | 
            |
| 37 | 
                - let file = FileModel(name: "photo", fileData: data)  | 
            |
| 36 | 
                + let name = ShareUserId + "\(Date.timeIntervalSinceReferenceDate)"  | 
            |
| 37 | 
                + print(name)  | 
            |
| 38 | 
                + let file = FileModel(fileName: name, fileData: data)  | 
            |
| 38 | 39 | 
                let uploadResource = UploadResource<[PhotoItem]>(path: .photoUpload,  | 
            
| 39 | 40 | 
                parameter: ["user_id": ShareUserId,  | 
            
| 40 | 41 | 
                "group_id": groupId,  | 
            
                @@ -143,11 +143,18 @@ class NetworkApi {
               | 
            ||
| 143 | 143 | 
                                     switch res.result {
               | 
            
| 144 | 144 | 
                case .success(let json):  | 
            
| 145 | 145 | 
                guard let json = json as? [String: AnyObject],  | 
            
| 146 | 
                + let status = json["status"] as? Int,  | 
            |
| 146 | 147 | 
                                             let data = resource.parse(json) else {
               | 
            
| 148 | 
                + Toast.show(message: "解析失败")  | 
            |
| 147 | 149 | 
                observer(.error(ParseError()))  | 
            
| 148 | 150 | 
                return  | 
            
| 149 | 151 | 
                }  | 
            
| 150 | 
                - observer(.success(data))  | 
            |
| 152 | 
                +                        if status == 200 {
               | 
            |
| 153 | 
                + observer(.success(data))  | 
            |
| 154 | 
                +                        } else {
               | 
            |
| 155 | 
                + Toast.show(message: (json["description"] as? String) ?? "")  | 
            |
| 156 | 
                + observer(.error(BusinessError(id: status)))  | 
            |
| 157 | 
                + }  | 
            |
| 151 | 158 | 
                case .failure(let error):  | 
            
| 152 | 159 | 
                observer(.error(error))  | 
            
| 153 | 160 | 
                }  | 
            
                @@ -77,7 +77,6 @@ public class GroupViewModel {
               | 
            ||
| 77 | 77 | 
                }  | 
            
| 78 | 78 | 
                 | 
            
| 79 | 79 | 
                     public func submit(data: Data) {
               | 
            
| 80 | 
                - Toast.showActivity(message: "正在上传照片")  | 
            |
| 81 | 80 | 
                         repository.upload(data: data).subscribe(onSuccess: { [weak self] result in
               | 
            
| 82 | 81 | 
                             guard let `self` = self else { return }
               | 
            
| 83 | 82 | 
                self.items.accept(result)  | 
            
                @@ -33,9 +33,9 @@ public final class PhotoDetailViewModel {
               | 
            ||
| 33 | 33 | 
                })  | 
            
| 34 | 34 | 
                }  | 
            
| 35 | 35 | 
                 | 
            
| 36 | 
                -    public var groupAvatar: Observable<String> {
               | 
            |
| 36 | 
                +    public var groupAvatar: Observable<Int> {
               | 
            |
| 37 | 37 | 
                         return item.map({ v in
               | 
            
| 38 | 
                - return v.group_avatar  | 
            |
| 38 | 
                + return v.group_default_avatar  | 
            |
| 39 | 39 | 
                })  | 
            
| 40 | 40 | 
                }  | 
            
| 41 | 41 | 
                 | 
            
                @@ -53,7 +53,7 @@ public final class PhotoDetailViewModel {
               | 
            ||
| 53 | 53 | 
                 | 
            
| 54 | 54 | 
                     public var photoTime: Observable<String> {
               | 
            
| 55 | 55 | 
                         return item.map({ v in
               | 
            
| 56 | 
                - return v.create_at  | 
            |
| 56 | 
                + return v.create_at_time_interval  | 
            |
| 57 | 57 | 
                })  | 
            
| 58 | 58 | 
                }  | 
            
| 59 | 59 | 
                 | 
            
                @@ -29,8 +29,7 @@ extension Date {
               | 
            ||
| 29 | 29 | 
                 | 
            
| 30 | 30 | 
                     public func getTimeInfoFromDate() -> String {
               | 
            
| 31 | 31 | 
                let dateNow = Date()  | 
            
| 32 | 
                - let time = dateNow.timeIntervalSince(self)  | 
            |
| 33 | 
                -  | 
            |
| 32 | 
                + let time = dateNow.timeIntervalSince(self) - 28800  | 
            |
| 34 | 33 | 
                var retTime: TimeInterval = 1.0  | 
            
| 35 | 34 | 
                         if time < 3600 {
               | 
            
| 36 | 35 | 
                retTime = time / 60  | 
            
                @@ -19,9 +19,11 @@ public extension UIImage {
               | 
            ||
| 19 | 19 | 
                     func scaledImage(length: CGFloat, with quality: CGFloat) -> Data? {
               | 
            
| 20 | 20 | 
                let edge = size.width > size.height ? size.height : size.width  | 
            
| 21 | 21 | 
                let outputSize = size * (length / edge)  | 
            
| 22 | 
                -  | 
            |
| 23 | 22 | 
                let renderer = UIGraphicsImageRenderer(size: outputSize)  | 
            
| 24 | 
                -        return renderer.image(actions: {_ in }).jpegData(compressionQuality: quality)
               | 
            |
| 23 | 
                +        return renderer.jpegData(withCompressionQuality: quality) { _ in
               | 
            |
| 24 | 
                + let content = UIGraphicsGetCurrentContext()  | 
            |
| 25 | 
                + content?.draw(cgImage!, in: CGRect.init(origin: CGPoint.zero, size: outputSize))  | 
            |
| 26 | 
                + }  | 
            |
| 25 | 27 | 
                }  | 
            
| 26 | 28 | 
                }  | 
            
| 27 | 29 | 
                 | 
            
                @@ -252,11 +252,13 @@ extension GroupViewController: UIImagePickerControllerDelegate, UINavigationCont  | 
            ||
| 252 | 252 | 
                }  | 
            
| 253 | 253 | 
                 | 
            
| 254 | 254 | 
                     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
               | 
            
| 255 | 
                - dismiss(animated: true, completion: nil)  | 
            |
| 256 | 
                - guard let image = info[.originalImage] as? UIImage,  | 
            |
| 257 | 
                -            let data = image.scaledImage(length: 1280, with: 0.4) else { return }
               | 
            |
| 255 | 
                + Toast.showActivity(message: "正在上传照片")  | 
            |
| 256 | 
                +        dismiss(animated: true) {
               | 
            |
| 257 | 
                + guard let image = info[.originalImage] as? UIImage,  | 
            |
| 258 | 
                +                let data = image.scaledImage(length: 1280, with: 0.4) else { return }
               | 
            |
| 259 | 
                + self.viewModel.submit(data: data)  | 
            |
| 260 | 
                + }  | 
            |
| 258 | 261 | 
                 | 
            
| 259 | 
                - viewModel.submit(data: data)  | 
            |
| 260 | 262 | 
                }  | 
            
| 261 | 263 | 
                 | 
            
| 262 | 264 | 
                     func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
               | 
            
                @@ -151,6 +151,7 @@ extension PhotoDetailViewController {
               | 
            ||
| 151 | 151 | 
                 | 
            
| 152 | 152 | 
                bindViewModelToUserName()  | 
            
| 153 | 153 | 
                bindgingViewModelToUserAvatar()  | 
            
| 154 | 
                + bindViewModelToPhotoTime()  | 
            |
| 154 | 155 | 
                 | 
            
| 155 | 156 | 
                bindViewModelToThumbupCount()  | 
            
| 156 | 157 | 
                bindViewModelToThumbupView()  | 
            
                @@ -183,10 +184,9 @@ extension PhotoDetailViewController {
               | 
            ||
| 183 | 184 | 
                 | 
            
| 184 | 185 | 
                     func bindViewModelToGroupAvatar() {
               | 
            
| 185 | 186 | 
                viewModel.groupAvatar  | 
            
| 186 | 
                -            .subscribe(onNext: {[weak self] (avatar) in
               | 
            |
| 187 | 
                -            guard let `self` = self else { return }
               | 
            |
| 188 | 
                - self.groupAvatar.setImage(avatar)  | 
            |
| 189 | 
                - }).disposed(by: disposeBag)  | 
            |
| 187 | 
                +            .map { UIImage(named: #"Group\#($0)"#)}
               | 
            |
| 188 | 
                + .bind(to: groupAvatar.rx.image)  | 
            |
| 189 | 
                + .disposed(by: disposeBag)  | 
            |
| 190 | 190 | 
                }  | 
            
| 191 | 191 | 
                 | 
            
| 192 | 192 | 
                     func bindgingViewModelToUserAvatar() {
               | 
            
                @@ -198,7 +198,7 @@ extension PhotoDetailViewController {
               | 
            ||
| 198 | 198 | 
                }  | 
            
| 199 | 199 | 
                 | 
            
| 200 | 200 | 
                     func bindViewModelToUserName() {
               | 
            
| 201 | 
                - viewModel.groupName.bind(to: userName.rx.text).disposed(by: disposeBag)  | 
            |
| 201 | 
                + viewModel.userName.bind(to: userName.rx.text).disposed(by: disposeBag)  | 
            |
| 202 | 202 | 
                }  | 
            
| 203 | 203 | 
                 | 
            
| 204 | 204 | 
                     func bindViewModelToPhotoTime() {
               | 
            
                @@ -94,7 +94,7 @@ extension PhotoPreviewViewController {
               | 
            ||
| 94 | 94 | 
                /// storyboard button action  | 
            
| 95 | 95 | 
                 extension PhotoPreviewViewController {
               | 
            
| 96 | 96 | 
                     @IBAction  func back() {
               | 
            
| 97 | 
                - navigationController?.popViewController(animated: true)  | 
            |
| 97 | 
                + dismissController()  | 
            |
| 98 | 98 | 
                }  | 
            
| 99 | 99 | 
                 | 
            
| 100 | 100 | 
                     @IBAction func rotateTheImage(_ sender: UIButton) {
               |