; image="BTN-新增-press"/> 133
-                            </button>
122
+                            <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" spacing="3" translatesAutoresizingMaskIntoConstraints="NO" id="cKo-t0-fYb">
123
+                                <rect key="frame" x="303" y="530" width="64" height="131"/>
124
+                                <subviews>
125
+                                    <button contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9N2-vw-PuD">
126
+                                        <rect key="frame" x="0.0" y="0.0" width="64" height="64"/>
127
+                                        <constraints>
128
+                                            <constraint firstAttribute="width" constant="64" id="ZvU-38-X8E"/>
129
+                                            <constraint firstAttribute="height" constant="64" id="tmA-ui-pTy"/>
130
+                                        </constraints>
131
+                                        <state key="normal" image="BTN-scanQR"/>
132
+                                        <state key="selected" image="BTN-扫码-press"/>
133
+                                    </button>
134
+                                    <button contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="f1p-NO-R2Q">
135
+                                        <rect key="frame" x="0.0" y="67" width="64" height="64"/>
136
+                                        <constraints>
137
+                                            <constraint firstAttribute="height" constant="64" id="4PT-EP-AZd"/>
138
+                                            <constraint firstAttribute="width" constant="64" id="B4F-Wn-0g0"/>
139
+                                        </constraints>
140
+                                        <state key="normal" image="BTN-add"/>
141
+                                        <state key="selected" image="BTN-新增-press"/>
142
+                                    </button>
143
+                                </subviews>
144
+                            </stackView>
134 145
                         </subviews>
135 146
                         <color key="backgroundColor" red="0.8784313725490196" green="0.8784313725490196" blue="0.8784313725490196" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
136 147
                         <gestureRecognizers/>
137 148
                         <constraints>
138
-                            <constraint firstItem="WrX-F2-609" firstAttribute="trailing" secondItem="EqW-Tv-dAo" secondAttribute="trailing" constant="8" id="8xh-Ra-Ka9"/>
149
+                            <constraint firstItem="WrX-F2-609" firstAttribute="trailing" secondItem="cKo-t0-fYb" secondAttribute="trailing" constant="8" id="PWG-Fo-tUz"/>
139 150
                             <constraint firstItem="jOc-hp-K8U" firstAttribute="leading" secondItem="WrX-F2-609" secondAttribute="leading" id="Qu3-TE-tcJ"/>
140
-                            <constraint firstItem="WrX-F2-609" firstAttribute="bottom" secondItem="EqW-Tv-dAo" secondAttribute="bottom" id="TQF-Gj-zB1"/>
141
-                            <constraint firstItem="7sh-KD-Wgc" firstAttribute="centerX" secondItem="EqW-Tv-dAo" secondAttribute="centerX" id="dbL-Gy-iB4"/>
151
+                            <constraint firstItem="WrX-F2-609" firstAttribute="bottom" secondItem="cKo-t0-fYb" secondAttribute="bottom" constant="6" id="T1b-BO-JPL"/>
142 152
                             <constraint firstItem="WrX-F2-609" firstAttribute="trailing" secondItem="jOc-hp-K8U" secondAttribute="trailing" id="iMD-9d-Ih2"/>
143
-                            <constraint firstItem="EqW-Tv-dAo" firstAttribute="top" secondItem="7sh-KD-Wgc" secondAttribute="bottom" constant="3" id="oUu-Fy-hJV"/>
144 153
                             <constraint firstItem="jOc-hp-K8U" firstAttribute="top" secondItem="WrX-F2-609" secondAttribute="top" id="pOC-6k-2LI"/>
145 154
                             <constraint firstAttribute="bottom" secondItem="jOc-hp-K8U" secondAttribute="bottom" id="xM5-JS-BLE"/>
146 155
                         </constraints>
@@ -150,13 +159,13 @@
150 159
                     <navigationItem key="navigationItem" id="blv-Da-mEq"/>
151 160
                     <connections>
152 161
                         <outlet property="collectionView" destination="jOc-hp-K8U" id="4Hm-wP-XjU"/>
153
-                        <outlet property="createBtn" destination="EqW-Tv-dAo" id="Q3K-6N-47U"/>
154
-                        <outlet property="scanBtn" destination="7sh-KD-Wgc" id="oZT-w4-Ddq"/>
162
+                        <outlet property="createBtn" destination="f1p-NO-R2Q" id="wDa-iP-DeC"/>
163
+                        <outlet property="scanBtn" destination="9N2-vw-PuD" id="tdK-KP-5Vh"/>
155 164
                     </connections>
156 165
                 </viewController>
157 166
                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
158 167
             </objects>
159
-            <point key="canvasLocation" x="1705" y="-152"/>
168
+            <point key="canvasLocation" x="2356" y="-49"/>
160 169
         </scene>
161 170
         <!--CreateGroupViewController-->
162 171
         <scene sceneID="AAe-LB-J2k">
@@ -251,7 +260,7 @@
251 260
                 </viewController>
252 261
                 <placeholder placeholderIdentifier="IBFirstResponder" id="7bb-Fp-aIh" userLabel="First Responder" sceneMemberID="firstResponder"/>
253 262
             </objects>
254
-            <point key="canvasLocation" x="4628" y="80.50974512743629"/>
263
+            <point key="canvasLocation" x="4354" y="-49"/>
255 264
         </scene>
256 265
         <!--CreateGroupConfirmViewController-->
257 266
         <scene sceneID="zhC-tX-7HT">
@@ -369,7 +378,7 @@
369 378
                 </viewController>
370 379
                 <placeholder placeholderIdentifier="IBFirstResponder" id="hw0-Gp-7zQ" userLabel="First Responder" sceneMemberID="firstResponder"/>
371 380
             </objects>
372
-            <point key="canvasLocation" x="3847.1999999999998" y="80.50974512743629"/>
381
+            <point key="canvasLocation" x="3694" y="-49"/>
373 382
         </scene>
374 383
         <!--LoginViewController-->
375 384
         <scene sceneID="ETR-Op-aEq">

+ 23 - 86
PaiAi/Paiai_iOS/App/Home/ScanQRViewController.swift

@@ -15,7 +15,6 @@ final class ScanQRViewController: UIViewController {
15 15
 
16 16
     // MARK: Storyboard property
17 17
     @IBOutlet weak var scanView: QRCodeScanView!
18
-    @IBOutlet weak var lightLabel: UILabel!
19 18
 
20 19
    // MARK: parameter property
21 20
     var viewModel = ScanQRViewModel()
@@ -24,108 +23,46 @@ final class ScanQRViewController: UIViewController {
24 23
     // MARK: view function
25 24
     override func viewDidLoad() {
26 25
         super.viewDidLoad()
27
-//        navigationController?.navigationBar.setBackgroundImage(UIImage.imageWithColor(UIColor.black), for: .default)
28 26
         scanView.delegate = self
27
+        viewModel.join(code: "http://pai.ai/g/SpA5be3")
29 28
     }
30
-
29
+    
30
+    func setNavigationBar() {
31
+        title = "二维码"
32
+        navigationController?.navigationBar.setBackgroundImage(UIImage.Navigation.blackBackground, for: .default)
33
+    }
34
+    
31 35
     override func viewWillAppear(_ animated: Bool) {
32
-        super.viewWillAppear(true)
33
-//        titleWithbackBar = "二维码"
36
+        super.viewWillAppear(animated)
37
+        setNavigationBar()
34 38
     }
35 39
 
36
-    // MARK: Storyboard  button function
37
-    @IBAction func chooseFromSYSPhoto() {
38
-        scanView.openPhotoLibrary(ctl: self)
40
+    override func viewWillDisappear(_ animated: Bool) {
41
+        super.viewWillDisappear(animated)
42
+        navigationController?.navigationBar.setBackgroundImage(UIImage.Navigation.background, for: .default)
39 43
     }
44
+    
45
+}
40 46
 
41
-    @IBAction func openLight() {
42
-        scanView.openLight()
47
+/// storyboard button action
48
+extension ScanQRViewController {
49
+    @IBAction func openPhotoLibrary(_ sender: UIButton) {
50
+        scanView.openPhotoLibrary(ctl: self)
43 51
     }
44 52
     
45
-    
53
+    @IBAction func openLight(_ sender: UIButton) {
54
+        scanView.openLight()
55
+    }
46 56
 }
47 57
 
48 58
 // MARK: read QR message
49 59
 // MARK: custom delegate function
50 60
 extension ScanQRViewController: QRCodeScanViewDelegate {
51
-    func scanView(_ scanView: QRCodeScanView, didFinshWithError error: NSError?) {
52
-        
53
-    }
61
+    func scanView(_ scanView: QRCodeScanView, didFinshWithError error: NSError?) {}
54 62
     
55 63
     func scanView(_ scanner: QRCodeScanView, receivedScanResult: QRCodeScanResult) {
56 64
         viewModel.join(code: receivedScanResult.result)
57 65
     }
58
-
59
-    func addToTourGroup(group_id: String) {
60
-//        if user_phone.isEmpty {
61
-//            let phone = NSString(string: user_phone).integerValue
62
-//            let params = ["admin_id": group_id, "user_id": SharedUserInfo.userId, "authority": authority, "name": user_name, "phone": phone ] as [String: AnyObject]
63
-
64
-//            let request = GroupNetworkRequest(path: .joinTourGroup, parameter: params)
65
-//            NetworkApi.share.post(request: request, handler: { (res) in
66
-//                let ctl = UIStoryboard.main.instantiateController(GroupViewController.self)
67
-//                ctl.isCreate = true
68
-//                ctl.isScan = true
69
-//                ctl.groupModel = res[0]
70
-//                self.navigationController?.pushViewController(ctl, animated: true)
71
-//            })
72
-//        } else {
73
-//            let ctl = UIStoryboard.main.instantiateController(PersonInformationController.self)
74
-//            ctl.admin_id = group_id
75
-//            navigationController?.pushViewController(ctl, animated: true)
76
-//        }
77
-    }
78
-
79
-    func addToGroup(_ code: String) {
80
-//        let strs = code.components(separatedBy: "/")
81
-//        guard strs.count > 2, var group_id = strs.last else {
82
-//            FFToastView.showToast(inView: self.view, withText: "读取失败")
83
-//            return
84
-//        }
85
-//        FFToastView.showLoadingToast(inView: view, blockSuperView: true)
86
-//        let flag = strs[strs.count-2]
87
-//        guard flag == "s" || flag == "g" || flag == "tgu" else {
88
-//            FFToastView.showToast(inView: self.view, withText: "读取失败")
89
-//            return
90
-//        }
91
-//        if flag == "tgu" {
92
-//            addToTourGroup(group_id: group_id)
93
-//            return
94
-//        }
95
-//        let isGroup = flag == "g"
96
-//        let path = isGroup ? Interfaces.joinGroup : Interfaces.joinSession
97
-//        let idName = isGroup ? "group_id" : "session_id"
98
-//        let lensman_id = (group_id.components(separatedBy: "?").last ?? "").components(separatedBy: "=").last ?? ""
99
-//        group_id = group_id.components(separatedBy: "?").first ?? ""
100
-//        let params = ["user_id": SharedUserInfo.userId, idName: group_id, "nickname": SharedUserInfo.name, "lensman_id" : lensman_id]  as [String: AnyObject]
101
-
102
-//        let request = GroupNetworkRequest(path: path, parameter: params)
103
-//        NetworkApi.share.post(request: request, handler: { (res) in
104
-//            let ctl = UIStoryboard.main.instantiateController(GroupViewController.self)
105
-//            ctl.isCreate = true
106
-//            ctl.isScan = true
107
-//            ctl.groupModel = res[0]
108
-//            self.navigationController?.pushViewController(ctl, animated: true)
109
-//            FFToastView.hideLoadingToast()
110
-//        })
111
-    }
112 66
 }
113 67
 
114
-// MARK: imagePick delegate
115
-extension ScanQRViewController: UIImagePickerControllerDelegate {
116
-
117
-    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String: AnyObject]?) {
118
-        picker.dismiss(animated: true) {
119
-//            if let sessionid = image.decodeQRCodeInImage() {
120
-//                self.addToGroup(sessionid)
121
-//            } else {
122
-//                FFToastView.showToast(inView: self.view, withText: "未检测到群二维码")
123
-//            }
124
-        }
125
-    }
126
-
127
-    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
128
-        picker.dismissController()
129
-    }
130
-
131
-}
68
+extension ScanQRViewController: NavigationBackViewController {}

+ 173 - 173
PaiAi/Paiai_iOS/App/Message/Message.storyboard

@@ -190,203 +190,203 @@
190 190
                         <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
191 191
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
192 192
                         <subviews>
193
-                            <view contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translatesAutoresizingMaskIntoConstraints="NO" id="StI-0Q-fat">
194
-                                <rect key="frame" x="0.0" y="20" width="375" height="647"/>
193
+                            <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="vQs-oc-uao">
194
+                                <rect key="frame" x="0.0" y="20" width="375" height="192"/>
195 195
                                 <subviews>
196
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WTN-Zx-JKR">
196
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nRF-R0-LcP" userLabel="message system">
197 197
                                         <rect key="frame" x="0.0" y="0.0" width="375" height="64"/>
198
+                                        <subviews>
199
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="W1B-Rc-piS">
200
+                                                <rect key="frame" x="0.0" y="0.0" width="375" height="64"/>
201
+                                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
202
+                                                <constraints>
203
+                                                    <constraint firstAttribute="height" constant="64" id="Sh9-mX-758"/>
204
+                                                </constraints>
205
+                                            </button>
206
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message-system" translatesAutoresizingMaskIntoConstraints="NO" id="PdF-av-quF">
207
+                                                <rect key="frame" x="12" y="8" width="48" height="48"/>
208
+                                                <constraints>
209
+                                                    <constraint firstAttribute="width" secondItem="PdF-av-quF" secondAttribute="height" id="X2X-ko-fTx"/>
210
+                                                    <constraint firstAttribute="width" constant="48" id="ozh-Fb-Dwl"/>
211
+                                                </constraints>
212
+                                            </imageView>
213
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="服务提醒" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7m9-4r-95l">
214
+                                                <rect key="frame" x="70" y="22.5" width="65.5" height="19.5"/>
215
+                                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
216
+                                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
217
+                                                <nil key="highlightedColor"/>
218
+                                            </label>
219
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="dyn-zM-jdf">
220
+                                                <rect key="frame" x="341" y="14" width="24" height="36"/>
221
+                                            </imageView>
222
+                                            <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="veG-mJ-Dsh">
223
+                                                <rect key="frame" x="325" y="28" width="8" height="8"/>
224
+                                                <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
225
+                                                <constraints>
226
+                                                    <constraint firstAttribute="height" constant="8" id="OSl-kV-dhl"/>
227
+                                                    <constraint firstAttribute="width" constant="8" id="ojQ-4T-AHY"/>
228
+                                                </constraints>
229
+                                                <userDefinedRuntimeAttributes>
230
+                                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
231
+                                                        <real key="value" value="4"/>
232
+                                                    </userDefinedRuntimeAttribute>
233
+                                                </userDefinedRuntimeAttributes>
234
+                                            </view>
235
+                                        </subviews>
198 236
                                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
199 237
                                         <constraints>
200
-                                            <constraint firstAttribute="height" constant="64" id="xeq-dk-WF7"/>
201
-                                        </constraints>
202
-                                    </button>
203
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message-system" translatesAutoresizingMaskIntoConstraints="NO" id="PdF-av-quF">
204
-                                        <rect key="frame" x="12" y="8" width="48" height="48"/>
205
-                                        <constraints>
206
-                                            <constraint firstAttribute="width" secondItem="PdF-av-quF" secondAttribute="height" id="X2X-ko-fTx"/>
207
-                                            <constraint firstAttribute="width" constant="48" id="ozh-Fb-Dwl"/>
238
+                                            <constraint firstItem="7m9-4r-95l" firstAttribute="leading" secondItem="PdF-av-quF" secondAttribute="trailing" constant="10" id="3Zc-bV-A1v"/>
239
+                                            <constraint firstItem="7m9-4r-95l" firstAttribute="centerY" secondItem="nRF-R0-LcP" secondAttribute="centerY" id="4Uc-VE-e5u"/>
240
+                                            <constraint firstAttribute="bottom" secondItem="W1B-Rc-piS" secondAttribute="bottom" id="ATc-VY-uV1"/>
241
+                                            <constraint firstItem="dyn-zM-jdf" firstAttribute="centerY" secondItem="nRF-R0-LcP" secondAttribute="centerY" id="AgQ-Nz-FaV"/>
242
+                                            <constraint firstAttribute="trailing" secondItem="dyn-zM-jdf" secondAttribute="trailing" constant="10" id="BuW-nY-yJ8"/>
243
+                                            <constraint firstItem="PdF-av-quF" firstAttribute="leading" secondItem="nRF-R0-LcP" secondAttribute="leading" constant="12" id="CVF-7B-S39"/>
244
+                                            <constraint firstItem="dyn-zM-jdf" firstAttribute="leading" secondItem="veG-mJ-Dsh" secondAttribute="trailing" constant="8" id="GCo-tj-G7p"/>
245
+                                            <constraint firstItem="PdF-av-quF" firstAttribute="centerY" secondItem="nRF-R0-LcP" secondAttribute="centerY" id="KHj-j9-uOp"/>
246
+                                            <constraint firstAttribute="height" constant="64" id="NR8-Hm-Hek"/>
247
+                                            <constraint firstItem="W1B-Rc-piS" firstAttribute="leading" secondItem="nRF-R0-LcP" secondAttribute="leading" id="UxI-MO-gXc"/>
248
+                                            <constraint firstItem="W1B-Rc-piS" firstAttribute="top" secondItem="nRF-R0-LcP" secondAttribute="top" id="Ysp-Kx-3q6"/>
249
+                                            <constraint firstItem="veG-mJ-Dsh" firstAttribute="centerY" secondItem="nRF-R0-LcP" secondAttribute="centerY" id="pwl-I4-zYk"/>
250
+                                            <constraint firstAttribute="trailing" secondItem="W1B-Rc-piS" secondAttribute="trailing" id="z9e-Kz-bqH"/>
208 251
                                         </constraints>
209
-                                    </imageView>
210
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="服务提醒" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OGv-b6-6xR">
211
-                                        <rect key="frame" x="70" y="22" width="66" height="20"/>
212
-                                        <fontDescription key="fontDescription" type="system" pointSize="16"/>
213
-                                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
214
-                                        <nil key="highlightedColor"/>
215
-                                    </label>
216
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="mre-Tt-F0S">
217
-                                        <rect key="frame" x="341" y="14" width="24" height="36"/>
218
-                                    </imageView>
219
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="T9q-a4-Ugc">
252
+                                    </view>
253
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FvO-F8-npa" userLabel="message thumbup">
220 254
                                         <rect key="frame" x="0.0" y="64" width="375" height="64"/>
255
+                                        <subviews>
256
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cYK-SK-9WL">
257
+                                                <rect key="frame" x="0.0" y="0.0" width="375" height="64"/>
258
+                                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
259
+                                                <constraints>
260
+                                                    <constraint firstAttribute="height" constant="64" id="CYE-TV-8Ku"/>
261
+                                                </constraints>
262
+                                            </button>
263
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message-thumpub" translatesAutoresizingMaskIntoConstraints="NO" id="Mdm-bD-HR2">
264
+                                                <rect key="frame" x="12" y="8" width="48" height="48"/>
265
+                                                <constraints>
266
+                                                    <constraint firstAttribute="width" constant="48" id="4Df-nG-nZr"/>
267
+                                                    <constraint firstAttribute="width" secondItem="Mdm-bD-HR2" secondAttribute="height" id="Doc-vC-DdB"/>
268
+                                                </constraints>
269
+                                            </imageView>
270
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赞" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vFD-Hf-dPV" userLabel="赞">
271
+                                                <rect key="frame" x="70" y="22.5" width="16.5" height="19.5"/>
272
+                                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
273
+                                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
274
+                                                <nil key="highlightedColor"/>
275
+                                            </label>
276
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="rWa-ZW-l2r">
277
+                                                <rect key="frame" x="341" y="14" width="24" height="36"/>
278
+                                            </imageView>
279
+                                            <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iqd-Ji-zvi">
280
+                                                <rect key="frame" x="325" y="28" width="8" height="8"/>
281
+                                                <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
282
+                                                <constraints>
283
+                                                    <constraint firstAttribute="height" constant="8" id="MLn-gz-qhL"/>
284
+                                                    <constraint firstAttribute="width" constant="8" id="vUg-zy-oPo"/>
285
+                                                </constraints>
286
+                                                <userDefinedRuntimeAttributes>
287
+                                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
288
+                                                        <real key="value" value="4"/>
289
+                                                    </userDefinedRuntimeAttribute>
290
+                                                </userDefinedRuntimeAttributes>
291
+                                            </view>
292
+                                        </subviews>
221 293
                                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
222 294
                                         <constraints>
223
-                                            <constraint firstAttribute="height" constant="64" id="SZg-wA-Ma3"/>
224
-                                        </constraints>
225
-                                    </button>
226
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message-thumpub" translatesAutoresizingMaskIntoConstraints="NO" id="NEm-bF-yno">
227
-                                        <rect key="frame" x="12" y="72" width="48" height="48"/>
228
-                                        <constraints>
229
-                                            <constraint firstAttribute="width" constant="48" id="jD0-aO-eUu"/>
230
-                                            <constraint firstAttribute="width" secondItem="NEm-bF-yno" secondAttribute="height" id="snW-w9-7b3"/>
231
-                                        </constraints>
232
-                                    </imageView>
233
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="8VZ-dR-b6z">
234
-                                        <rect key="frame" x="341" y="78" width="24" height="36"/>
235
-                                    </imageView>
236
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赞" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="J3p-B7-gMi">
237
-                                        <rect key="frame" x="70" y="86" width="17" height="20"/>
238
-                                        <fontDescription key="fontDescription" type="system" pointSize="16"/>
239
-                                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
240
-                                        <nil key="highlightedColor"/>
241
-                                    </label>
242
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="KVD-Az-tyJ">
243
-                                        <rect key="frame" x="0.0" y="128" width="375" height="64"/>
244
-                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
245
-                                        <constraints>
246
-                                            <constraint firstAttribute="height" constant="64" id="zcX-3o-C4B"/>
247
-                                        </constraints>
248
-                                    </button>
249
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message-comment" translatesAutoresizingMaskIntoConstraints="NO" id="cgb-6k-KQJ">
250
-                                        <rect key="frame" x="12" y="136" width="48" height="48"/>
251
-                                        <constraints>
252
-                                            <constraint firstAttribute="width" secondItem="cgb-6k-KQJ" secondAttribute="height" id="FhM-W8-0eM"/>
253
-                                            <constraint firstAttribute="width" constant="48" id="Kmf-oj-nfI"/>
254
-                                        </constraints>
255
-                                    </imageView>
256
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="hJe-J2-RpF">
257
-                                        <rect key="frame" x="341" y="142" width="24" height="36"/>
258
-                                    </imageView>
259
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="评论" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6fy-0a-WYd">
260
-                                        <rect key="frame" x="70" y="150" width="33" height="20"/>
261
-                                        <fontDescription key="fontDescription" type="system" pointSize="16"/>
262
-                                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
263
-                                        <nil key="highlightedColor"/>
264
-                                    </label>
265
-                                    <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oLf-Xb-QSv">
266
-                                        <rect key="frame" x="325" y="28" width="8" height="8"/>
267
-                                        <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
268
-                                        <constraints>
269
-                                            <constraint firstAttribute="height" constant="8" id="8PB-CF-AvI"/>
270
-                                            <constraint firstAttribute="width" constant="8" id="WJH-jN-MFb"/>
271
-                                        </constraints>
272
-                                        <userDefinedRuntimeAttributes>
273
-                                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
274
-                                                <real key="value" value="4"/>
275
-                                            </userDefinedRuntimeAttribute>
276
-                                        </userDefinedRuntimeAttributes>
277
-                                    </view>
278
-                                    <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R8U-gK-x5D">
279
-                                        <rect key="frame" x="325" y="92" width="8" height="8"/>
280
-                                        <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
281
-                                        <constraints>
282
-                                            <constraint firstAttribute="height" constant="8" id="pvk-DY-af3"/>
283
-                                            <constraint firstAttribute="width" constant="8" id="y72-go-9Lu"/>
284
-                                        </constraints>
285
-                                        <userDefinedRuntimeAttributes>
286
-                                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
287
-                                                <real key="value" value="4"/>
288
-                                            </userDefinedRuntimeAttribute>
289
-                                        </userDefinedRuntimeAttributes>
290
-                                    </view>
291
-                                    <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qi9-c7-GCt">
292
-                                        <rect key="frame" x="325" y="156" width="8" height="8"/>
293
-                                        <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
294
-                                        <constraints>
295
-                                            <constraint firstAttribute="height" constant="8" id="d1V-XC-UJk"/>
296
-                                            <constraint firstAttribute="width" constant="8" id="wcE-da-Ggi"/>
297
-                                        </constraints>
298
-                                        <userDefinedRuntimeAttributes>
299
-                                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
300
-                                                <real key="value" value="4"/>
301
-                                            </userDefinedRuntimeAttribute>
302
-                                        </userDefinedRuntimeAttributes>
303
-                                    </view>
304
-                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LMK-Y1-Qex">
305
-                                        <rect key="frame" x="70" y="63.5" width="305" height="0.5"/>
306
-                                        <color key="backgroundColor" red="0.90588235289999997" green="0.90588235289999997" blue="0.90588235289999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
307
-                                        <constraints>
308
-                                            <constraint firstAttribute="height" constant="0.5" id="ygP-zr-Y2l"/>
295
+                                            <constraint firstItem="rWa-ZW-l2r" firstAttribute="centerY" secondItem="FvO-F8-npa" secondAttribute="centerY" id="31J-Kc-V4M"/>
296
+                                            <constraint firstItem="cYK-SK-9WL" firstAttribute="top" secondItem="FvO-F8-npa" secondAttribute="top" id="43p-Ol-SCA"/>
297
+                                            <constraint firstItem="vFD-Hf-dPV" firstAttribute="centerY" secondItem="FvO-F8-npa" secondAttribute="centerY" id="FRm-10-cuU"/>
298
+                                            <constraint firstItem="iqd-Ji-zvi" firstAttribute="centerY" secondItem="FvO-F8-npa" secondAttribute="centerY" id="H7y-qI-qAP"/>
299
+                                            <constraint firstItem="Mdm-bD-HR2" firstAttribute="centerY" secondItem="FvO-F8-npa" secondAttribute="centerY" id="TtU-kN-5jV"/>
300
+                                            <constraint firstAttribute="height" constant="64" id="Uhv-Ry-4pQ"/>
301
+                                            <constraint firstItem="rWa-ZW-l2r" firstAttribute="leading" secondItem="iqd-Ji-zvi" secondAttribute="trailing" constant="8" id="bcO-40-lkC"/>
302
+                                            <constraint firstItem="vFD-Hf-dPV" firstAttribute="leading" secondItem="Mdm-bD-HR2" secondAttribute="trailing" constant="10" id="c1Q-w8-1iV"/>
303
+                                            <constraint firstAttribute="trailing" secondItem="rWa-ZW-l2r" secondAttribute="trailing" constant="10" id="f1H-lD-Bhp"/>
304
+                                            <constraint firstItem="cYK-SK-9WL" firstAttribute="leading" secondItem="FvO-F8-npa" secondAttribute="leading" id="hT5-QW-acn"/>
305
+                                            <constraint firstAttribute="bottom" secondItem="cYK-SK-9WL" secondAttribute="bottom" id="il0-Dm-SVq"/>
306
+                                            <constraint firstAttribute="trailing" secondItem="cYK-SK-9WL" secondAttribute="trailing" id="j9y-uz-ARx"/>
307
+                                            <constraint firstItem="Mdm-bD-HR2" firstAttribute="leading" secondItem="FvO-F8-npa" secondAttribute="leading" constant="12" id="vD8-AI-AAE"/>
309 308
                                         </constraints>
310 309
                                     </view>
311
-                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gIo-ms-963">
312
-                                        <rect key="frame" x="70" y="127.5" width="305" height="0.5"/>
313
-                                        <color key="backgroundColor" red="0.90588235289999997" green="0.90588235289999997" blue="0.90588235289999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
310
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Org-mm-8ZH" userLabel="message comment">
311
+                                        <rect key="frame" x="0.0" y="128" width="375" height="64"/>
312
+                                        <subviews>
313
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pAl-ew-Vda">
314
+                                                <rect key="frame" x="0.0" y="0.0" width="375" height="64"/>
315
+                                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
316
+                                                <constraints>
317
+                                                    <constraint firstAttribute="height" constant="64" id="Dnh-NK-K7H"/>
318
+                                                </constraints>
319
+                                            </button>
320
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="message-comment" translatesAutoresizingMaskIntoConstraints="NO" id="0Ga-dC-0cj">
321
+                                                <rect key="frame" x="12" y="8" width="48" height="48"/>
322
+                                                <constraints>
323
+                                                    <constraint firstAttribute="width" constant="48" id="Hcr-cI-PAb"/>
324
+                                                    <constraint firstAttribute="width" secondItem="0Ga-dC-0cj" secondAttribute="height" id="sQe-Iz-UsK"/>
325
+                                                </constraints>
326
+                                            </imageView>
327
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="评论" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OqS-kg-xEo" userLabel="评论">
328
+                                                <rect key="frame" x="70" y="22.5" width="33" height="19.5"/>
329
+                                                <fontDescription key="fontDescription" type="system" pointSize="16"/>
330
+                                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
331
+                                                <nil key="highlightedColor"/>
332
+                                            </label>
333
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="de8-5g-YER">
334
+                                                <rect key="frame" x="341" y="14" width="24" height="36"/>
335
+                                            </imageView>
336
+                                            <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ywg-9R-Fz9">
337
+                                                <rect key="frame" x="325" y="28" width="8" height="8"/>
338
+                                                <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
339
+                                                <constraints>
340
+                                                    <constraint firstAttribute="width" constant="8" id="ZOh-7N-i3b"/>
341
+                                                    <constraint firstAttribute="height" constant="8" id="fXX-l3-MG3"/>
342
+                                                </constraints>
343
+                                                <userDefinedRuntimeAttributes>
344
+                                                    <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
345
+                                                        <real key="value" value="4"/>
346
+                                                    </userDefinedRuntimeAttribute>
347
+                                                </userDefinedRuntimeAttributes>
348
+                                            </view>
349
+                                        </subviews>
350
+                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
314 351
                                         <constraints>
315
-                                            <constraint firstAttribute="height" constant="0.5" id="VfL-Rd-QTP"/>
352
+                                            <constraint firstItem="OqS-kg-xEo" firstAttribute="centerY" secondItem="Org-mm-8ZH" secondAttribute="centerY" id="14q-Ka-Vk5"/>
353
+                                            <constraint firstItem="pAl-ew-Vda" firstAttribute="top" secondItem="Org-mm-8ZH" secondAttribute="top" id="2Su-bl-RDw"/>
354
+                                            <constraint firstItem="Ywg-9R-Fz9" firstAttribute="centerY" secondItem="Org-mm-8ZH" secondAttribute="centerY" id="9LY-bT-Hr2"/>
355
+                                            <constraint firstAttribute="trailing" secondItem="de8-5g-YER" secondAttribute="trailing" constant="10" id="Aap-8M-fAT"/>
356
+                                            <constraint firstAttribute="trailing" secondItem="pAl-ew-Vda" secondAttribute="trailing" id="ILI-UR-Vba"/>
357
+                                            <constraint firstItem="OqS-kg-xEo" firstAttribute="leading" secondItem="0Ga-dC-0cj" secondAttribute="trailing" constant="10" id="JTR-w3-YbN"/>
358
+                                            <constraint firstAttribute="bottom" secondItem="pAl-ew-Vda" secondAttribute="bottom" id="Klx-LC-YwX"/>
359
+                                            <constraint firstItem="0Ga-dC-0cj" firstAttribute="centerY" secondItem="Org-mm-8ZH" secondAttribute="centerY" id="NZO-sW-7w8"/>
360
+                                            <constraint firstItem="de8-5g-YER" firstAttribute="centerY" secondItem="Org-mm-8ZH" secondAttribute="centerY" id="fWR-wS-1FO"/>
361
+                                            <constraint firstItem="pAl-ew-Vda" firstAttribute="leading" secondItem="Org-mm-8ZH" secondAttribute="leading" id="hUt-K2-O5X"/>
362
+                                            <constraint firstItem="de8-5g-YER" firstAttribute="leading" secondItem="Ywg-9R-Fz9" secondAttribute="trailing" constant="8" id="lwS-rD-Wv9"/>
363
+                                            <constraint firstItem="0Ga-dC-0cj" firstAttribute="leading" secondItem="Org-mm-8ZH" secondAttribute="leading" constant="12" id="p4H-7I-g5Q"/>
364
+                                            <constraint firstAttribute="height" constant="64" id="qf9-lo-sVB"/>
316 365
                                         </constraints>
317 366
                                     </view>
318 367
                                 </subviews>
319
-                                <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
320
-                                <constraints>
321
-                                    <constraint firstItem="PdF-av-quF" firstAttribute="width" secondItem="PdF-av-quF" secondAttribute="height" id="1SJ-Yy-8rF"/>
322
-                                    <constraint firstItem="KVD-Az-tyJ" firstAttribute="leading" secondItem="StI-0Q-fat" secondAttribute="leading" id="1Sn-Ha-d7i"/>
323
-                                    <constraint firstAttribute="trailing" secondItem="KVD-Az-tyJ" secondAttribute="trailing" id="1UZ-ZG-q7u"/>
324
-                                    <constraint firstItem="NEm-bF-yno" firstAttribute="leading" secondItem="T9q-a4-Ugc" secondAttribute="leading" constant="12" id="3CF-yv-4wf"/>
325
-                                    <constraint firstItem="R8U-gK-x5D" firstAttribute="centerY" secondItem="8VZ-dR-b6z" secondAttribute="centerY" id="3Yc-1d-XRV"/>
326
-                                    <constraint firstItem="LMK-Y1-Qex" firstAttribute="leading" secondItem="OGv-b6-6xR" secondAttribute="leading" id="5AB-ql-wr1"/>
327
-                                    <constraint firstItem="NEm-bF-yno" firstAttribute="width" secondItem="NEm-bF-yno" secondAttribute="height" id="5NQ-kl-Eq5"/>
328
-                                    <constraint firstItem="T9q-a4-Ugc" firstAttribute="leading" secondItem="StI-0Q-fat" secondAttribute="leading" id="638-dc-DJj"/>
329
-                                    <constraint firstItem="mre-Tt-F0S" firstAttribute="centerY" secondItem="WTN-Zx-JKR" secondAttribute="centerY" id="7Gh-JK-xlV"/>
330
-                                    <constraint firstItem="hJe-J2-RpF" firstAttribute="leading" secondItem="Qi9-c7-GCt" secondAttribute="trailing" constant="8" id="8cD-ux-8w4"/>
331
-                                    <constraint firstItem="6fy-0a-WYd" firstAttribute="centerY" secondItem="cgb-6k-KQJ" secondAttribute="centerY" id="EAW-Sd-au8"/>
332
-                                    <constraint firstItem="WTN-Zx-JKR" firstAttribute="leading" secondItem="StI-0Q-fat" secondAttribute="leading" id="Ej8-vW-ES1"/>
333
-                                    <constraint firstItem="oLf-Xb-QSv" firstAttribute="centerY" secondItem="mre-Tt-F0S" secondAttribute="centerY" id="Fty-Is-89H"/>
334
-                                    <constraint firstItem="hJe-J2-RpF" firstAttribute="trailing" secondItem="KVD-Az-tyJ" secondAttribute="trailing" constant="-10" id="HLp-UP-zd4"/>
335
-                                    <constraint firstItem="WTN-Zx-JKR" firstAttribute="top" secondItem="StI-0Q-fat" secondAttribute="top" id="Hdq-cw-396"/>
336
-                                    <constraint firstAttribute="trailing" secondItem="gIo-ms-963" secondAttribute="trailing" id="Hfb-BT-Y32"/>
337
-                                    <constraint firstItem="6fy-0a-WYd" firstAttribute="leading" secondItem="cgb-6k-KQJ" secondAttribute="trailing" constant="10" id="IoR-Al-XZl"/>
338
-                                    <constraint firstItem="gIo-ms-963" firstAttribute="bottom" secondItem="T9q-a4-Ugc" secondAttribute="bottom" id="Joq-MV-NEZ"/>
339
-                                    <constraint firstItem="OGv-b6-6xR" firstAttribute="leading" secondItem="PdF-av-quF" secondAttribute="trailing" constant="10" id="K4D-BZ-8ZU"/>
340
-                                    <constraint firstItem="Qi9-c7-GCt" firstAttribute="centerY" secondItem="hJe-J2-RpF" secondAttribute="centerY" id="LUZ-KU-t61"/>
341
-                                    <constraint firstAttribute="trailing" secondItem="LMK-Y1-Qex" secondAttribute="trailing" id="LYk-HD-SVv"/>
342
-                                    <constraint firstItem="OGv-b6-6xR" firstAttribute="centerY" secondItem="PdF-av-quF" secondAttribute="centerY" id="Obx-DC-2Ms"/>
343
-                                    <constraint firstItem="hJe-J2-RpF" firstAttribute="centerY" secondItem="KVD-Az-tyJ" secondAttribute="centerY" id="PGD-Nd-FxL"/>
344
-                                    <constraint firstItem="mre-Tt-F0S" firstAttribute="leading" secondItem="oLf-Xb-QSv" secondAttribute="trailing" constant="8" id="Pgo-iF-JpC"/>
345
-                                    <constraint firstItem="T9q-a4-Ugc" firstAttribute="top" secondItem="WTN-Zx-JKR" secondAttribute="bottom" id="PiP-8o-hlq"/>
346
-                                    <constraint firstItem="J3p-B7-gMi" firstAttribute="centerY" secondItem="NEm-bF-yno" secondAttribute="centerY" id="U2Q-xG-JKb"/>
347
-                                    <constraint firstAttribute="trailing" secondItem="mre-Tt-F0S" secondAttribute="trailing" constant="10" id="Udt-Ur-CYo"/>
348
-                                    <constraint firstItem="cgb-6k-KQJ" firstAttribute="width" secondItem="cgb-6k-KQJ" secondAttribute="height" id="VBI-e4-8KY"/>
349
-                                    <constraint firstItem="NEm-bF-yno" firstAttribute="centerY" secondItem="T9q-a4-Ugc" secondAttribute="centerY" id="VqD-xD-ZFL"/>
350
-                                    <constraint firstItem="NEm-bF-yno" firstAttribute="width" secondItem="NEm-bF-yno" secondAttribute="height" id="WcT-QB-dXH"/>
351
-                                    <constraint firstItem="8VZ-dR-b6z" firstAttribute="leading" secondItem="R8U-gK-x5D" secondAttribute="trailing" constant="8" id="Zm2-DB-9qE"/>
352
-                                    <constraint firstItem="LMK-Y1-Qex" firstAttribute="bottom" secondItem="WTN-Zx-JKR" secondAttribute="bottom" id="hKb-bb-8Re"/>
353
-                                    <constraint firstItem="8VZ-dR-b6z" firstAttribute="trailing" secondItem="T9q-a4-Ugc" secondAttribute="trailing" constant="-10" id="hTL-Jt-Om6"/>
354
-                                    <constraint firstItem="J3p-B7-gMi" firstAttribute="leading" secondItem="NEm-bF-yno" secondAttribute="trailing" constant="10" id="he6-3z-Xta"/>
355
-                                    <constraint firstItem="cgb-6k-KQJ" firstAttribute="leading" secondItem="KVD-Az-tyJ" secondAttribute="leading" constant="12" id="hek-US-nb3"/>
356
-                                    <constraint firstAttribute="trailing" secondItem="WTN-Zx-JKR" secondAttribute="trailing" id="hyd-J3-IAR"/>
357
-                                    <constraint firstItem="cgb-6k-KQJ" firstAttribute="width" secondItem="cgb-6k-KQJ" secondAttribute="height" id="lpl-IR-20q"/>
358
-                                    <constraint firstItem="cgb-6k-KQJ" firstAttribute="width" secondItem="cgb-6k-KQJ" secondAttribute="height" id="oTf-HF-3EN"/>
359
-                                    <constraint firstAttribute="trailing" secondItem="T9q-a4-Ugc" secondAttribute="trailing" id="qPZ-lF-bJJ"/>
360
-                                    <constraint firstItem="gIo-ms-963" firstAttribute="leading" secondItem="J3p-B7-gMi" secondAttribute="leading" id="s1V-MK-hGp"/>
361
-                                    <constraint firstItem="8VZ-dR-b6z" firstAttribute="centerY" secondItem="T9q-a4-Ugc" secondAttribute="centerY" id="vww-WS-1e6"/>
362
-                                    <constraint firstItem="PdF-av-quF" firstAttribute="leading" secondItem="StI-0Q-fat" secondAttribute="leading" constant="12" id="wD2-zK-Qfe"/>
363
-                                    <constraint firstItem="cgb-6k-KQJ" firstAttribute="centerY" secondItem="KVD-Az-tyJ" secondAttribute="centerY" id="wow-yY-0cl"/>
364
-                                    <constraint firstItem="KVD-Az-tyJ" firstAttribute="top" secondItem="T9q-a4-Ugc" secondAttribute="bottom" id="yi0-UM-hgK"/>
365
-                                    <constraint firstItem="PdF-av-quF" firstAttribute="centerY" secondItem="WTN-Zx-JKR" secondAttribute="centerY" id="zfd-Gi-l2q"/>
366
-                                </constraints>
367
-                            </view>
368
+                            </stackView>
368 369
                         </subviews>
369
-                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
370
+                        <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
370 371
                         <constraints>
371
-                            <constraint firstItem="pk7-RT-o9s" firstAttribute="trailing" secondItem="StI-0Q-fat" secondAttribute="trailing" id="1mB-xr-CQ7"/>
372
-                            <constraint firstAttribute="bottom" secondItem="StI-0Q-fat" secondAttribute="bottom" id="DhK-nf-Lrh"/>
373
-                            <constraint firstItem="StI-0Q-fat" firstAttribute="leading" secondItem="pk7-RT-o9s" secondAttribute="leading" id="jFj-Ls-vJb"/>
374
-                            <constraint firstItem="StI-0Q-fat" firstAttribute="top" secondItem="pk7-RT-o9s" secondAttribute="top" id="xbs-D5-7iw"/>
372
+                            <constraint firstItem="vQs-oc-uao" firstAttribute="leading" secondItem="pk7-RT-o9s" secondAttribute="leading" id="WMt-Hu-L7D"/>
373
+                            <constraint firstItem="pk7-RT-o9s" firstAttribute="trailing" secondItem="vQs-oc-uao" secondAttribute="trailing" id="qWK-p3-7fO"/>
374
+                            <constraint firstItem="vQs-oc-uao" firstAttribute="top" secondItem="pk7-RT-o9s" secondAttribute="top" id="u3B-bZ-94D"/>
375 375
                         </constraints>
376 376
                         <viewLayoutGuide key="safeArea" id="pk7-RT-o9s"/>
377 377
                     </view>
378 378
                     <connections>
379
-                        <outlet property="commentBtn" destination="KVD-Az-tyJ" id="TaX-hY-vn2"/>
380
-                        <outlet property="commentUnreadTip" destination="Qi9-c7-GCt" id="xt8-kU-Ort"/>
381
-                        <outlet property="sysBtn" destination="WTN-Zx-JKR" id="j7o-gs-BXE"/>
382
-                        <outlet property="sysUnreadTip" destination="oLf-Xb-QSv" id="K9s-Ru-LqL"/>
383
-                        <outlet property="thumbupBtn" destination="T9q-a4-Ugc" id="f6h-aq-4F0"/>
384
-                        <outlet property="thumbupUnreadTip" destination="R8U-gK-x5D" id="Lxs-zK-zAs"/>
379
+                        <outlet property="commentBtn" destination="pAl-ew-Vda" id="3S2-SN-tES"/>
380
+                        <outlet property="commentUnreadTip" destination="Ywg-9R-Fz9" id="kdE-V6-bFR"/>
381
+                        <outlet property="sysBtn" destination="W1B-Rc-piS" id="7RM-xD-0Ix"/>
382
+                        <outlet property="sysUnreadTip" destination="veG-mJ-Dsh" id="lsK-b7-GGU"/>
383
+                        <outlet property="thumbupBtn" destination="cYK-SK-9WL" id="SpB-pC-x36"/>
384
+                        <outlet property="thumbupUnreadTip" destination="iqd-Ji-zvi" id="IDb-6y-Pp4"/>
385 385
                     </connections>
386 386
                 </viewController>
387 387
                 <placeholder placeholderIdentifier="IBFirstResponder" id="13z-ah-xbs" userLabel="First Responder" sceneMemberID="firstResponder"/>
388 388
             </objects>
389
-            <point key="canvasLocation" x="53.600000000000001" y="28.335832083958024"/>
389
+            <point key="canvasLocation" x="-52" y="-133"/>
390 390
         </scene>
391 391
     </scenes>
392 392
     <resources>

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

@@ -22,7 +22,7 @@ final class GroupCell: UITableViewCell {
22 22
     func setInfo(_ info: GroupItem) {
23 23
         groupImageView.setImage(info.group_avatar, placeholder: UIImage(named: "Group\(info.group_default_avatar)"))
24 24
         groupNameLabel.text = info.group_name
25
-//        createTimeLabel.text =  info.created_at
25
+        createTimeLabel.text =  info.create_at
26 26
         photoNumLabel.text = "有\(info.group_photo_num)张照片"
27 27
     }
28 28
 }

+ 1 - 1
PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift

@@ -32,7 +32,7 @@ final class MineFeedbackViewController: UIViewController {
32 32
 /// storyboard button action
33 33
 extension MineFeedbackViewController {
34 34
     @IBAction func sendFeedBack() {
35
-        Toast.showActivity(message: "正在提交")
35
+        Toast.showActivity(message: "正在提交中")
36 36
         feedbackAPI.submit(text: textView.text).subscribe(onCompleted: {[weak self] in
37 37
             guard let `self` = self else { return }
38 38
             Toast.hide()

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

@@ -28,10 +28,10 @@ class PhotoDetailCommentCell: UITableViewCell {
28 28
     }
29 29
 
30 30
     // MARK: init interface
31
-    func setInfo(_ data: PhotoCommentItem) {
32
-//        headImage.setImageWithNullableURL(data.avatar, placeholderImage: defaultAvatar)
33
-        name.text = data.nickname
34
-        content.text = data.comment
35
-//        time.text = data.create_at.getTimeInfoFromDate()
31
+    func setInfo(_ info: PhotoCommentItem) {
32
+        headImage.setImage(info.avatar, placeholder: UIImage.defaultAvatar)
33
+        name.text = info.nickname
34
+        content.text = info.comment
35
+        time.text = info.create_at
36 36
     }
37 37
 }

+ 1 - 1
PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCoordinator.swift

@@ -52,7 +52,7 @@ extension PhotoDetailCoordinator: PhotoDetailListViewModelDelegate {
52 52
     func didSelected() {
53 53
         let vc = UIStoryboard.photoDetail.instantiateController(PhotoPreviewViewController.self)
54 54
         vc.viewModel = shareListViewModel
55
-        navigationController.pushViewController(vc, animated: true)
55
+        photoDetailViewController.presentController(vc)
56 56
     }
57 57
 }
58 58
 

+ 13 - 13
PaiAi/Paiai_iOS/App/PhotoDetail/PhotoPreviewViewController.swift

@@ -47,21 +47,11 @@ final class PhotoPreviewViewController: UIViewController {
47 47
         navigationController?.setNavigationBarHidden(false, animated: true)
48 48
     }
49 49
     
50
-    @IBAction func download(_ sender: UIButton) {
51
-        guard let cell = collectionView.cellForItem(at: IndexPath(item: viewModel.currIndex, section: 0)) as? ImageCell,
52
-            let image = cell.photoImage.image else {
53
-                //            FFToastView.showToast(inView: view, withText: "未检测到图片")
54
-                return
55
-        }
56
-        
57
-        UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
58
-    }
59
-    
60 50
     @objc func image(_ image: UIImage?, didFinishSavingWithError error: NSError?, contextInfo info: UnsafeMutableRawPointer) {
61 51
         if error != nil {
62
-            //            FFToastView.showToast(inView: view, withText: "保存图片失败")
52
+            Toast.show(message: "保存照片失败")
63 53
         } else {
64
-            //            FFToastView.showImageToast(inView: view, withText: "已保存图片到相册", withImage: "提示弹窗-勾")
54
+            Toast.show(message: "已保存照片到相册中", image: UIImage(named: "icon-success"))
65 55
         }
66 56
     }
67 57
 }
@@ -105,6 +95,7 @@ extension PhotoPreviewViewController {
105 95
     @IBAction  func back() {
106 96
         navigationController?.popViewController(animated: true)
107 97
     }
98
+    
108 99
     @IBAction func rotateTheImage(_ sender: UIButton) {
109 100
         guard let cell = collectionView.cellForItem(at: IndexPath(item: viewModel.currIndex, section: 0)) as? ImageCell else {
110 101
             return
@@ -127,7 +118,16 @@ extension PhotoPreviewViewController {
127 118
         }
128 119
     }
129 120
     
130
-
121
+    @IBAction func download(_ sender: UIButton) {
122
+        Toast.showActivity(message: "正在保存照片到相册")
123
+        guard let cell = collectionView.cellForItem(at: IndexPath(item: viewModel.currIndex, section: 0)) as? ImageCell,
124
+            let image = cell.photoImage.image else {
125
+                Toast.show(message: "未检测到照片")
126
+                return
127
+        }
128
+        
129
+        UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
130
+    }
131 131
 }
132 132
 
133 133
 // MARK: UICollectionView delegate

kodo - Gogs: Go Git Service

Sin Descripción

lensman_views.py 15KB

    # -*- coding: utf-8 -*- from __future__ import division from django.db import transaction from django_curtail_uuid import CurtailUUID from django_logit import logit from django_response import response from ipaddr import client_ip from isoweek import Week from paginator import pagination from TimeConvert import TimeConvert as tc from account.models import LensmanInfo, UserIncomeExpensesInfo, UserInfo from group.models import GroupInfo, GroupPhotoInfo, GroupPhotoOrderInfo from message.models import SystemMessageInfo from pay.models import OrderInfo from photo.models import PhotosInfo from utils.error.errno_utils import LensmanStatusCode, OrderStatusCode, UserStatusCode from utils.message_utils import system_messages from utils.redis.connect import r from utils.redis.rbrief import set_brief_info from utils.redis.rgroup import set_group_info, set_group_info_by_id from utils.redis.rkeys import GROUP_LAST_PHOTO_PK, TODAY_INCOME, TODAY_UPLOAD_PHOTO_AMOUNT, WEEK_INCOME, WEEK_SOLD from utils.redis.rlock import upload_lock from utils.redis.rorder import set_lensman_order_record from utils.redis.rprice import get_lensman_price_fixed, set_lensman_price_fixed from utils.redis.rprofile import set_profile_info from utils.storage_qiniu_utils import file_save @logit def lensman_submit_api(request): """ 摄影师信息提交 """ lensman_type = int(request.POST.get('lensman_type', 0)) unionid = request.POST.get('unionid', '') openid = request.POST.get('openid', '') phone = request.POST.get('phone', '') if LensmanInfo.objects.filter(phone=phone).exclude(unionid=unionid).exists(): return response(LensmanStatusCode.LENSMAN_PHONE_ALREADY_EXISTS) fields = { 'name': request.POST.get('name', ''), 'sex': int(request.POST.get('sex', 1)), 'phone': phone, 'location': request.POST.get('location', ''), 'user_status': LensmanInfo.UNVERIFIED, } lensman, created = LensmanInfo.objects.get_or_create(unionid=unionid, defaults=fields) # 状态为 UNVERIFIED 的允许修改, 其他需要登录摄影师 APP 进行信息的修改 # 用户状态校验 if lensman_type == UserInfo.COMMON: # 普通摄影师校验 if lensman.is_common_lensman and lensman.user_status not in [LensmanInfo.UNVERIFIED, LensmanInfo.REFUSED]: return response(LensmanStatusCode.LENSMAN_ALREADY_NOT_UNVERIFIED) elif lensman_type == UserInfo.OUTTAKE: # 花絮摄影师校验 if lensman.is_common_lensman and lensman.user_status not in [LensmanInfo.UNVERIFIED, LensmanInfo.REFUSED]: return response(LensmanStatusCode.LENSMAN_ALREADY_NOT_UNVERIFIED) for key, value in fields.iteritems(): setattr(lensman, key, value) if lensman_type == LensmanInfo.COMMON: lensman.is_common_lensman = True elif lensman_type == LensmanInfo.OUTTAKE: lensman.is_outtake_lensman = True lensman.save() return response(200, 'Submit Success', u'提交成功') @logit @transaction.atomic def lensman_wx_authorize_api(request): lensman_type = int(request.POST.get('lensman_type', 0)) unionid = request.POST.get('unionid', '') # 用户校验 try: user = UserInfo.objects.select_for_update().get(unionid=unionid, islensman=True, status=True) except UserInfo.DoesNotExist: return response(LensmanStatusCode.LENSMAN_NOT_FOUND) # 用户状态校验 if lensman_type == UserInfo.COMMON: # 普通摄影师校验 if user.is_common_lensman and user.user_status != UserInfo.ACTIVATED: return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) elif lensman_type == UserInfo.OUTTAKE: # 花絮摄影师校验 if user.is_outtake_lensman and user.outtake_status != UserInfo.ACTIVATED: return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) # Set User Key's Value user.openid_lensman = request.POST.get('openid', '') user.sex = request.POST.get('sex', 0) user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '') user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '') user.country = request.POST.get('country', '') user.province = request.POST.get('province', '') user.city = request.POST.get('city', '') user.signup_ip = client_ip(request) user.signup_at = tc.utc_datetime() user.save() set_profile_info(user) return response(200, 'Lensman Login Success', u'摄影师登录成功', user.data) @logit def lensman_price_fix_api(request): lensman_id = request.POST.get('user_id', '') nomark = request.POST.get('nomark', 299) origin = request.POST.get('origin', 999) # 用户校验 try: lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True) except LensmanInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) if 'nomark' in request.POST: lensman.nomark = nomark if 'origin' in request.POST: lensman.origin = origin lensman.save() set_lensman_price_fixed(lensman_id) return response(200, 'Lensman Price Fix Success', u'摄影师定价修改成功') @logit def lensman_photo_upload_api(request): """ 摄影师照片上传 """ lensman_type = int(request.POST.get('lensman_type', 0) or 0) user_id = lensman_id = request.POST.get('user_id', '') nickname = request.POST.get('nickname', '') group_id = request.POST.get('group_id', '') session_id = request.POST.get('session_id', '') photo_id = request.POST.get('photo_id', '') photo = request.FILES.get('photo', '') # 用户校验 try: user = UserInfo.objects.get(user_id=user_id, islensman=True, status=True) except UserInfo.DoesNotExist: return response(LensmanStatusCode.LENSMAN_NOT_FOUND) # 用户状态校验 if lensman_type == UserInfo.COMMON: # 普通摄影师校验 watermark = True if user.is_common_lensman and user.user_status != UserInfo.ACTIVATED: return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) elif lensman_type == UserInfo.OUTTAKE: # 花絮摄影师校验 watermark = False if user.is_outtake_lensman and user.outtake_status != UserInfo.ACTIVATED: return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) if not group_id: # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建 group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, group_from=GroupInfo.SESSION_GROUP, defaults={ 'group_id': CurtailUUID.uuid(GroupInfo, 'group_id'), # 'admin_id': user_id, # 摄影师非管理员,首个扫码进群的用户为管理员 'group_name': user.final_nickname, 'group_default_avatar': 0, }) # Redis 群组数据缓存 if group_created: set_group_info(group) group_id = group.group_id if photo and upload_lock(group_id, user_id, photo): photo_info = file_save(photo, prefix='photo', ext='.jpeg', watermark=watermark, thumbnail=True) # 写 PhotosInfo 表 photo, created = PhotosInfo.objects.get_or_create( lensman_id=lensman_id, session_id=session_id, photo_id=photo_id, ) # 无水印 photo.m_photo_path = photo_info.photo_path # 有水印 photo.p_photo_path = photo_info.photo_watermark_path photo.save() # 获取摄影师定价 price_info = get_lensman_price_fixed(user_id) # 写 GroupPhotoInfo 表 group_photo, created = GroupPhotoInfo.objects.get_or_create( group_id=group_id, user_id=user_id, photo_md5=photo_info.photo_md5, defaults={ 'nickname': user.final_nickname, 'avatar': user.avatar, 'photo_path': photo_info.photo_watermark_path if watermark else photo_info.photo_path, 'has_watermark': watermark, 'photo_w': photo_info.photo_w, 'photo_h': photo_info.photo_h, 'photo_thumbnail_path': photo_info.photo_thumbnail_path, 'photo_thumbnail_w': photo_info.photo_thumbnail_w, 'photo_thumbnail_h': photo_info.photo_thumbnail_h, 'photo_thumbnail2_path': photo_info.photo_thumbnail2_path, 'photo_thumbnail2_w': photo_info.photo_thumbnail2_w, 'photo_thumbnail2_h': photo_info.photo_thumbnail2_h, 'photo_from': GroupPhotoInfo.SESSION_GROUP, 'session_id': photo.session_id, 'lensman_id': photo.lensman_id, 'lensman_photo_id': photo.photo_id, 'nomark': price_info.get('nomark', 999), 'origin': price_info.get('origin', 999), 'lensman_type': lensman_type, } ) if created: # 设置群组最后一张照片PK r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk) # 更新今日上传照片数量 r.incr(TODAY_UPLOAD_PHOTO_AMOUNT % (user_id, tc.local_string(format='%Y%m%d'))) # Redis 群组数据缓存 set_group_info_by_id(group_id) return response(200, 'Lensman Upload Photo Success', u'摄影师照片上传成功', { 'group_id': group_id, }) @logit @transaction.atomic def lensman_origin_photo_upload_api(request): order_id = request.POST.get('order_id', '') user_id = lensman_id = request.POST.get('user_id', '') session_id = request.POST.get('session_id', '') photo_id = request.POST.get('photo_id', '') deleted = int(request.POST.get('deleted', 0)) photo = request.FILES.get('photo', '') try: order = OrderInfo.objects.select_for_update().get(order_id=order_id, pay_status=OrderInfo.PAID) except OrderInfo.DoesNotExist: return response(OrderStatusCode.WX_ORDER_NOT_FOUND) # 原图已删除, 处理退款逻辑 if deleted and order.photo_status == OrderInfo.WANTED: # 用户余额增加 try: from_user = UserInfo.objects.select_for_update().get(user_id=order.from_uid) except UserInfo.DoesNotExist: pass if from_user: # 余额增加 from_user.balance += order.total_fee from_user.save() # 余额记录 UserIncomeExpensesInfo.objects.create( user_id=order.from_uid, photo_id=order.photo_id, type=UserIncomeExpensesInfo.INCOME, amount=order.total_fee, balance=from_user.balance, freeze_income_amount=0, freeze_income_balance=from_user.freeze_income_balance, remark=u'高清图购买退款', ) # 摄影师余额减少 try: to_user = UserInfo.objects.select_for_update().get(user_id=order.to_uid) except UserInfo.DoesNotExist: pass if to_user: # 余额减少 to_user.freeze_income_balance -= order.total_fee to_user.save() # 余额记录 UserIncomeExpensesInfo.objects.create( user_id=order.to_uid, photo_id=order.photo_id, type=UserIncomeExpensesInfo.EXPENSE, amount=order.total_fee, balance=to_user.balance, freeze_income_amount=0, freeze_income_balance=to_user.freeze_income_balance, remark=u'高清图购买退款', ) # 更新订单状态 order.photo_status = OrderInfo.DELETED order.reback_status = True order.reback_at = tc.utc_datetime() order.save() if photo and upload_lock(order_id, user_id, photo): # 写 PhotosInfo 表 photo_info = file_save(photo, prefix='photo', ext='.jpeg') PhotosInfo.objects.filter( lensman_id=lensman_id, session_id=session_id, photo_id=photo_id, ).update( r_photo_path=photo_info.photo_path ) porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create( group_id=order.group_id, session_id=session_id, user_id=order.from_uid, photo_id=order.photo_id, lensman_photo_id=photo_id, ) porder.r_photo_path = photo_info.photo_path porder.save() set_lensman_order_record(porder) # 摄影师余额解冻 try: to_user = UserInfo.objects.select_for_update().get(user_id=order.to_uid) except UserInfo.DoesNotExist: pass if to_user: # 余额解冻 to_user.balance += order.total_fee to_user.freeze_income_balance -= order.total_fee to_user.save() # Redis 数值更新 set_brief_info(order.to_uid, order.photo_type, order.total_fee, dt=order.created_at) # 余额记录 UserIncomeExpensesInfo.objects.create( user_id=order.to_uid, photo_id=order.photo_id, type=UserIncomeExpensesInfo.UNFREEZE, amount=order.total_fee, balance=to_user.balance, freeze_income_amount=order.total_fee, freeze_income_balance=to_user.freeze_income_balance, remark=u'高清图购买退款', ) order.photo_status = OrderInfo.FETCHED order.save() return response(200, 'Lensman Upload Origin Photo Success', u'摄影师照片高清图上传成功') @logit def lensman_brief_api(request): user_id = request.POST.get('user_id', '') ymd = tc.local_string(format='%Y%m%d') week = Week.thisweek().isoformat() # 周收入 origin_week_income = int(r.get(WEEK_INCOME % (user_id, OrderInfo.ORIGIN, week)) or 0) # 日收入 nomark_today_income = int(r.get(TODAY_INCOME % (user_id, OrderInfo.NOMARK, ymd)) or 0) # 日上传 today_upload = int(r.get(TODAY_UPLOAD_PHOTO_AMOUNT % (user_id, ymd)) or 0) # 周售出 week_sold = int(r.get(WEEK_SOLD % (user_id, OrderInfo.ORIGIN, ymd)) or 0) # 摄影师端系统消息 systems = system_messages(user_id, SystemMessageInfo.PAIAI_LENSMAN) systems, left = pagination(systems, 1, 10) systems = [msg.msg_info(user_id) for msg in systems] # 照片购买记录 orders = OrderInfo.objects.filter(to_uid=user_id, pay_status=OrderInfo.PAID, status=True).order_by('-pk') orders, left = pagination(orders, 1, 10) orders = [order.data(user_id) for order in orders] # 获取摄影师定价 price_fixed = get_lensman_price_fixed(user_id) return response(200, 'Get Lensman Brief Success', u'获取摄影师简报成功', { 'origin_week_income': origin_week_income, 'nomark_today_income': nomark_today_income, 'today_upload': today_upload, 'week_sold': week_sold, 'messages': { 'system': systems, 'orders': orders, }, 'price_fixed': price_fixed, }) @logit def lensman_origin_wanted_api(request): user_id = request.POST.get('user_id', '') orders = OrderInfo.objects.filter( to_uid=user_id, photo_type=OrderInfo.ORIGIN, photo_status=OrderInfo.WANTED, pay_status=OrderInfo.PAID, status=True ).order_by('pk') wanted = [order.lensdata for order in orders] return response(200, 'Get Origin Wanted Success', u'获取需要上传原图成功', { 'wanted': wanted })