瀏覽代碼

静态页面

1002884655 3 年之前
父節點
當前提交
295af3cf4a
共有 2 個檔案被更改,包括 466 行新增170 行删除
  1. 262
    170
      src/pages/index/activityDetail/index.jsx
  2. 204
    0
      src/pages/index/activityDetail/index.scss

+ 262
- 170
src/pages/index/activityDetail/index.jsx 查看文件

@@ -1,6 +1,6 @@
1
-import { useState, useEffect } from "react";
2
-import Taro from "@tarojs/taro";
3
-import withLayout from "@/layout";
1
+import { useState, useEffect } from 'react';
2
+import Taro from '@tarojs/taro';
3
+import withLayout from '@/layout';
4 4
 import {
5 5
   ScrollView,
6 6
   Image,
@@ -9,42 +9,42 @@ import {
9 9
   Text,
10 10
   Input,
11 11
   Picker,
12
-} from "@tarojs/components";
13
-import Disclaimer from "@/components/Disclaimer";
14
-import { useSelector } from "react-redux";
12
+  Button
13
+} from '@tarojs/components';
14
+import Disclaimer from '@/components/Disclaimer';
15
+import { useSelector } from 'react-redux';
15 16
 import {
16
-  // addActivityShareNum,
17 17
   signupActivity,
18 18
   queryActivityDetail,
19
-} from "@/services/activity";
20
-import { getImgURL } from "@/utils/image";
21
-import getDateFormat from "@/utils/chatDate";
22
-import useParams from "@/utils/hooks/useParams";
23
-import useShare from "@/utils/hooks/useShare";
24
-import useFavor from "@/utils/hooks/useFavor";
25
-import { getDownloadURL, times, transferImage } from "@/utils/tools";
26
-import "./index.scss";
19
+} from '@/services/activity';
20
+import { getImgURL } from '@/utils/image';
21
+import getDateFormat from '@/utils/chatDate';
22
+import useParams from '@/utils/hooks/useParams';
23
+import useShare from '@/utils/hooks/useShare';
24
+import useFavor from '@/utils/hooks/useFavor';
25
+import { times } from '@/utils/tools';
26
+import './index.scss';
27 27
 
28 28
 const activityStatusDict = {
29 29
   0: {
30
-    text: "立即参与",
31
-    text1: "立即参团",
32
-    className: "yellow",
30
+    text: '立即参与',
31
+    text1: '立即参团',
32
+    className: 'yellow',
33 33
   },
34 34
   1: {
35
-    text: "未开始",
36
-    text1: "未开始",
37
-    className: "blue",
35
+    text: '未开始',
36
+    text1: '未开始',
37
+    className: 'blue',
38 38
   },
39 39
   2: {
40
-    text: "已结束",
41
-    text1: "已结束",
42
-    className: "grey",
40
+    text: '已结束',
41
+    text1: '已结束',
42
+    className: 'grey',
43 43
   },
44 44
   3: {
45
-    text: "已参与",
46
-    text1: "已结束",
47
-    className: "yellow",
45
+    text: '已参与',
46
+    text1: '已结束',
47
+    className: 'yellow',
48 48
   },
49 49
 };
50 50
 
@@ -54,11 +54,11 @@ export default withLayout((props) => {
54 54
 
55 55
   const user = useSelector((state) => state.user);
56 56
 
57
-  const [detail, setDetail] = useState();
58
-  const [canChoose, setCanChoose] = useState("none");
59
-  const [inputName, setInputName] = useState("");
60
-  const [selectorChecked, setSelectorChecked] = useState("1");
61
-  const [selector, setSelector] = useState("");
57
+  const [detail, setDetail] = useState({})
58
+  const [canChoose, setCanChoose] = useState('none');
59
+  const [inputName, setInputName] = useState('');
60
+  const [selectorChecked, setSelectorChecked] = useState('1');
61
+  const [selector, setSelector] = useState('');
62 62
 
63 63
   const buildingId = detail?.buildingId;
64 64
 
@@ -105,31 +105,77 @@ export default withLayout((props) => {
105 105
     if (id) {
106 106
       getDetail(id);
107 107
     }
108
-  }, [id]);
108
+  }, [id])
109
+
110
+  const [CountDown, setCountDown] = useState({
111
+    day: 0,
112
+    hours: 0,
113
+    minutes: 0,
114
+    seconds: 0,
115
+  })
116
+
117
+  useEffect(() => {
118
+    if(detail.title) {
119
+      const CountsTime = new Date(detail.enlistEnd).getTime() - Date.now()
120
+      if(CountsTime) {
121
+        SetCountsDown(CountsTime)
122
+      }
123
+    }
124
+  }, [detail])
125
+
126
+  const SetCountsDown = (counts) => {
127
+    let Num = counts - 0
128
+    let Timer = setInterval(() => {
129
+      if(Num) {
130
+        Num -= 1000
131
+        let Time = Num
132
+        let day = Math.floor(Time / 1000 / 60 / 60 / 24)
133
+        Time = Time % (1000 * 60 * 60 * 24) 
134
+        let hours = Math.floor(Time / 1000 / 60 / 60)
135
+        Time = Time % (1000 * 60 * 60) 
136
+        let minutes = Math.floor(Time / 1000 / 60)
137
+        Time = Time % (1000 * 60) 
138
+        let seconds = Math.floor(Time / 1000)
139
+        setCountDown({
140
+          day,
141
+          hours,
142
+          minutes,
143
+          seconds
144
+        })
145
+      } else {
146
+        clearInterval(Timer)
147
+        setCountDown({
148
+          day: 0,
149
+          hours: 0,
150
+          minutes: 0,
151
+          seconds: 0,
152
+        })
153
+      }
154
+    }, 1000)
155
+  }
109 156
 
110 157
   const handleSignup = () => {
111
-    const { buildingId, dynamicId, isSign } = detail;
158
+    const { isSign } = detail;
112 159
 
113 160
     if (isSign) {
114 161
       Taro.showToast({
115
-        icon: "none",
116
-        title: "你已报名成功",
162
+        icon: 'none',
163
+        title: '你已报名成功',
117 164
       });
118 165
       return;
119 166
     }
120
-    setCanChoose("block");
167
+    setCanChoose('block');
121 168
   };
122 169
 
123
-  const comfire = (e) => {
124
-    const { dynamicId } =detail;
125
-    // console.log(user, "user");
126
-    const { userInfo: { person: { phone,  tel } } } = user
127
-    if (inputName == "") {
170
+  const comfire = () => {
171
+    const { dynamicId } = detail
172
+    const { userInfo: { person: { phone, tel } } } = user
173
+    if (inputName === '') {
128 174
       Taro.showToast({
129
-        title: "请输入姓名",
130
-        icon: "none",
131
-      });
132
-      return;
175
+        title: '请输入姓名',
176
+        icon: 'none'
177
+      })
178
+      return
133 179
     }
134 180
 
135 181
     const payload = {
@@ -140,23 +186,19 @@ export default withLayout((props) => {
140 186
       attendNum: selectorChecked,
141 187
     };
142 188
 
143
-    signupActivity(payload).then((res) => {
189
+    signupActivity(payload).then(() => {
144 190
       Taro.showToast({
145
-        title: "报名成功",
146
-      });
191
+        title: '报名成功',
192
+      })
147 193
       setSelector('none')
148
-      // this.setState({
149
-      //   isSign: true,
150
-      //   canChoose: "none",
151
-      // });
152 194
       setTimeout(() => {
153
-        getDetail(id);
154
-      }, 500);
195
+        getDetail(id)
196
+      }, 500)
155 197
     });
156 198
   };
157 199
 
158
-  function hideModal() {
159
-    setCanChoose("none");
200
+  function hideModal () {
201
+    setCanChoose('none');
160 202
   }
161 203
 
162 204
   const onInputText = (e) => {
@@ -164,159 +206,209 @@ export default withLayout((props) => {
164 206
   };
165 207
 
166 208
   const dymic = () => (
167
-    <view className="Info">
209
+    <view className='Info'>
168 210
       <view>
169
-        <view className="Title flex-h">
170
-          <view className="flex-item">
211
+        <view className='Title flex-h'>
212
+          <view className='flex-item'>
171 213
             <text>{detail.halfTitle}</text>
172 214
           </view>
173
-          <text className="Tips">{detail.enlisted || 0}人已报名</text>
215
+          <text className='Tips'>{detail.enlisted || 0}人已报名</text>
174 216
         </view>
175
-        <text className="Time">
217
+        <text className='Time'>
176 218
           报名截止时间:
177 219
           {getDateFormat(
178 220
             new Date(detail.enlistEnd).valueOf(),
179 221
             true,
180
-            "yyyy/M/d"
222
+            'yyyy/M/d'
181 223
           )}
182 224
         </text>
183
-        <text className="Name">{detail.title}</text>
184
-        <view className="flex-h Address">
225
+        <text className='Name'>{detail.title}</text>
226
+        <view className='flex-h Address'>
185 227
           <text>地址:</text>
186
-          <view className="flex-item">
228
+          <view className='flex-item'>
187 229
             <text>{detail.address}</text>
188 230
           </view>
189 231
         </view>
190
-        <view className="flex-h Date">
232
+        <view className='flex-h Date'>
191 233
           <text>时间:</text>
192
-          <view className="flex-item">
234
+          <view className='flex-item'>
193 235
             <text>
194 236
               {getDateFormat(
195 237
                 new Date(detail.startDate).valueOf(),
196 238
                 true,
197
-                "yyyy/M/d"
198
-              )}{" "}
199
-              -{" "}
239
+                'yyyy/M/d'
240
+              )}{' '}
241
+              -{' '}
200 242
               {getDateFormat(
201 243
                 new Date(detail.endDate).valueOf(),
202 244
                 true,
203
-                "yyyy/M/d"
245
+                'yyyy/M/d'
204 246
               )}
205 247
             </text>
206 248
           </view>
207 249
         </view>
208
-        <view className="Btn">
209
-          <button open-type="share">
250
+        <view className='Btn'>
251
+          <Button open-type='share'>
210 252
             <text>分享好友</text>
211
-          </button>
253
+          </Button>
212 254
         </view>
213 255
       </view>
214 256
     </view>
215 257
   );
216 258
 
217 259
   const house = () => (
218
-    <view className="houseInfo">
219
-      {/* <view> */}
220
-      <view className="flex-h">
221
-        <view className="left">
222
-          <view className="Title">
223
-            <view className="flex-item">
224
-              <text>{detail.title}</text>
225
-            </view>
226
-          </view>
227
-          <view className="flex-h Address">
228
-            <text className="iconfont icon-dingwei"></text>
229
-            <view className="flex-item">
260
+
261
+    <view className='BuildingInfo'>
262
+
263
+      <view className='flex-h Title'>
264
+        <view className='flex-item'>
265
+          <text className='Name'>{detail.title}</text>
266
+          <view className='Address flex-h'>
267
+            <text className='iconfont icon-dingwei'></text>
268
+            <view className='flex-item'>
230 269
               <text>{detail.address}</text>
231 270
             </view>
232
-            <text className="price">价格待定</text>
271
+            <text className='Price'>价格待定</text>
233 272
           </view>
234
-          <text className="flex-h Time">
235
-            时间:
236
-            {getDateFormat(
237
-              new Date(detail.startDate).valueOf(),
238
-              true,
239
-              "yyyy/M/d"
240
-            )}{" "}
241
-            -{" "}
242
-            {getDateFormat(
243
-              new Date(detail.endDate).valueOf(),
244
-              true,
245
-              "yyyy/M/d"
246
-            )}
247
-          </text>
273
+          <text className='Time'>时间:{getDateFormat(new Date(detail.startDate).valueOf(), true, 'yyyy/M/d')} - {getDateFormat(new Date(detail.endDate).valueOf(), true, 'yyyy/M/d')}</text>
248 274
         </view>
249
-        <view className="right">
275
+        <view className='Option'>
250 276
           <view>
251
-            <button open-type="share">
252
-              <text className="iconfont icon-fenxiang"></text>
253
-              <text>分享</text>
254
-            </button>
255
-            {/* <text className="iconfont icon-dingwei"></text>
256
-            <text>分享</text> */}
277
+            <text className='iconfont icon-fenxiang1'></text>
278
+            <text>分享</text>
279
+            <Button open-type='share' className='ShareBtn'>分享</Button>
257 280
           </view>
258 281
           <view>
259
-            <text className="iconfont icon-dingwei"></text>
282
+            <text className='iconfont icon-haibao'></text>
260 283
             <text>海报</text>
261 284
           </view>
262 285
         </view>
263 286
       </view>
264 287
 
265
-      <view className="lastdate">
266
-        <text className="text">距离结束还有</text>
267
-        <text className="text day">7</text>
268
-        <text className="text">天</text>
269
-        <text className="text time">2</text>
270
-        <text className="text">时</text>
271
-        <text className="text time">4</text>
272
-        <text className="text">分</text>
273
-        <text className="text time">5</text>
274
-        <text className="text">秒</text>
275
-        {/* <view>距离结束还有</view> */}
288
+      <view className='CountDown'>
289
+        <text>距离结束还有</text>
290
+        <text className='Red'>{CountDown.day}</text>
291
+        <text>天</text>
292
+        <text className='Number' style={{ marginLeft: '40rpx' }}>{CountDown.hours}</text>
293
+        <text className='active'>时</text>
294
+        <text className='Number'>{CountDown.minutes}</text>
295
+        <text className='active'>分</text>
296
+        <text className='Number'>{CountDown.seconds}</text>
297
+        <text className='active'>秒</text>
276 298
       </view>
277 299
 
278
-      <view className="flex-h join">
279
-        <view className="Collect" onClick={handleFavor}>
280
-          <text
281
-            className="iconfont icon-shoucang"
282
-            style={isSaved ? { color: "red" } : undefined}
283
-          ></text>
284
-          <text>{isSaved ? "已收藏" : "收藏"}</text>
300
+      <view className='Apply flex-h'>
301
+        <view className='Collect' onClick={handleFavor}>
302
+          <text className='iconfont icon-shoucang' style={isSaved ? { color: 'red' } : undefined}></text>
303
+          <text>{isSaved ? '已收藏' : '收藏'}</text>
285 304
         </view>
286
-        <view className="enlisted">
287
-          <view>
288
-            <text className="iconfont icon-shoucang"></text>
289
-            <text>{detail.enlisted || 0}人已报名</text>
290
-          </view>
291
-        </view>
292
-        <view className="btn" onClick={handleSignup}>
293
-          <text>{activityStatusDict[detail.activityStatus]?.text1}</text>
305
+        <text className='iconfont icon-baoming'></text>
306
+        <view className='flex-item'>
307
+          <text>{detail.enlisted || 0}人已报名</text>
294 308
         </view>
309
+        <text className='Btn' onClick={handleSignup}>{activityStatusDict[detail.activityStatus]?.text1}</text>
295 310
       </view>
296
-      {/* </view> */}
311
+
297 312
     </view>
313
+    // <view className='houseInfo'>
314
+    //   {/* <view> */}
315
+    //   <view className='flex-h'>
316
+    //     <view className='left'>
317
+    //       <view className='Title'>
318
+    //         <view className='flex-item'>
319
+    //           <text>{detail.title}</text>
320
+    //         </view>
321
+    //       </view>
322
+    //       <view className='flex-h Address'>
323
+    //         <text className='iconfont icon-dingwei'></text>
324
+    //         <view className='flex-item'>
325
+    //           <text>{detail.address}</text>
326
+    //         </view>
327
+    //         <text className='price'>价格待定</text>
328
+    //       </view>
329
+    //       <text className='flex-h Time'>
330
+    //         时间:
331
+    //         {getDateFormat(
332
+    //           new Date(detail.startDate).valueOf(),
333
+    //           true,
334
+    //           'yyyy/M/d'
335
+    //         )}{' '}
336
+    //         -{' '}
337
+    //         {getDateFormat(
338
+    //           new Date(detail.endDate).valueOf(),
339
+    //           true,
340
+    //           'yyyy/M/d'
341
+    //         )}
342
+    //       </text>
343
+    //     </view>
344
+    //     <view className='right'>
345
+    //       <view>
346
+    //         {/* <Button open-type='share'>
347
+    //           <text className='iconfont icon-fenxiang'></text>
348
+    //           <text>分享</text>
349
+    //         </Button> */}
350
+    //         <text className='iconfont icon-fenxiang'></text>
351
+    //         <text>分享</text>
352
+    //       </view>
353
+    //       <view>
354
+    //         <text className='iconfont icon-dingwei'></text>
355
+    //         <text>海报</text>
356
+    //       </view>
357
+    //     </view>
358
+    //   </view>
359
+
360
+    //   <view className='lastdate'>
361
+    //     <text className='text'>距离结束还有</text>
362
+    //     <text className='text day'>7</text>
363
+    //     <text className='text'>天</text>
364
+    //     <text className='text time'>2</text>
365
+    //     <text className='text'>时</text>
366
+    //     <text className='text time'>4</text>
367
+    //     <text className='text'>分</text>
368
+    //     <text className='text time'>5</text>
369
+    //     <text className='text'>秒</text>
370
+    //     {/* <view>距离结束还有</view> */}
371
+    //   </view>
372
+
373
+    //   <view className='flex-h join'>
374
+    //     <view className='Collect' onClick={handleFavor}>
375
+    //       <text className='iconfont icon-shoucang' style={isSaved ? { color: 'red' } : undefined}></text>
376
+    //       <text>{isSaved ? '已收藏' : '收藏'}</text>
377
+    //     </view>
378
+    //     <view className='enlisted'>
379
+    //       <view>
380
+    //         <text className='iconfont icon-shoucang'></text>
381
+    //         <text>{detail.enlisted || 0}人已报名</text>
382
+    //       </view>
383
+    //     </view>
384
+    //     <view className='btn' onClick={handleSignup}>
385
+    //       <text>{activityStatusDict[detail.activityStatus]?.text1}</text>
386
+    //     </view>
387
+    //   </view>
388
+    //   {/* </view> */}
389
+    // </view>
298 390
   );
299 391
 
300 392
   return (
301 393
     <>
302 394
       {detail && (
303
-        <view className="Page activityDetail flex-v">
304
-          <view className="flex-item">
395
+        <view className='Page activityDetail flex-v'>
396
+          <view className='flex-item'>
305 397
             <view>
306 398
               <ScrollView scroll-y>
307
-                <view className="PageContent">
308
-                  <view className="Top">
399
+                <view className='PageContent'>
400
+                  <view className='Top'>
309 401
                     <Image
310
-                      mode="aspectFill"
402
+                      mode='aspectFill'
311 403
                       src={getImgURL(detail.bannerListImg)}
312
-                      className="centerLabel"
404
+                      className='centerLabel'
313 405
                     ></Image>
314 406
                   </view>
315 407
 
316
-                  {detail.type == "dymic" && dymic()}
317
-                  {detail.type == "house" && house()}
318
-                  <view className="ActivityIntro">
319
-                    <view className="Title">
408
+                  {detail.type == 'dymic' && dymic()}
409
+                  {detail.type == 'house' && house()}
410
+                  <view className='ActivityIntro'>
411
+                    <view className='Title'>
320 412
                       <text>活动介绍</text>
321 413
                     </view>
322 414
                     <RichText nodes={detail.desc} />
@@ -327,22 +419,22 @@ export default withLayout((props) => {
327 419
               </ScrollView>
328 420
             </view>
329 421
           </view>
330
-          {detail.type == "dymic" && (
331
-            <view className="PageBottom flex-h">
332
-              <button className="Share" open-type="share">
333
-                <text className="iconfont icon-fenxiang"></text>
422
+          {detail.type == 'dymic' && (
423
+            <view className='PageBottom flex-h'>
424
+              <Button className='Share' open-type='share'>
425
+                <text className='iconfont icon-fenxiang'></text>
334 426
                 <text>分享</text>
335
-              </button>
336
-              <view className="Collect" onClick={handleFavor}>
427
+              </Button>
428
+              <view className='Collect' onClick={handleFavor}>
337 429
                 <text
338
-                  className="iconfont icon-shoucang"
339
-                  style={isSaved ? { color: "red" } : undefined}
430
+                  className='iconfont icon-shoucang'
431
+                  style={isSaved ? { color: 'red' } : undefined}
340 432
                 ></text>
341
-                <text>{isSaved ? "已收藏" : "收藏"}</text>
433
+                <text>{isSaved ? '已收藏' : '收藏'}</text>
342 434
               </view>
343
-              <view className="flex-item"></view>
435
+              <view className='flex-item'></view>
344 436
 
345
-              <text className="Post" onClick={handleSignup}>
437
+              <text className='Post' onClick={handleSignup}>
346 438
                 {activityStatusDict[detail.activityStatus]?.text}
347 439
               </text>
348 440
             </view>
@@ -350,29 +442,29 @@ export default withLayout((props) => {
350 442
         </view>
351 443
       )}
352 444
 
353
-      <View className="page-body" style={{ display: canChoose }}>
354
-        <View className="mask" onClick={() => hideModal()}></View>
355
-        <View className="page-section">
356
-          <Text className="page-section__title">报名信息</Text>
357
-          <View className="page-content">
445
+      <View className='page-body' style={{ display: canChoose }}>
446
+        <View className='mask' onClick={() => hideModal()}></View>
447
+        <View className='page-section'>
448
+          <Text className='page-section__title'>报名信息</Text>
449
+          <View className='page-content'>
358 450
             <Input
359
-              className="inputName"
451
+              className='inputName'
360 452
               onInput={onInputText}
361
-              type="text"
362
-              placeholder="请输入姓名"
453
+              type='text'
454
+              placeholder='请输入姓名'
363 455
             />
364 456
             <Picker
365
-              mode="selector"
457
+              mode='selector'
366 458
               range={selector}
367 459
               onChange={(e) => setSelectorChecked(selector[e.detail.value])}
368 460
             >
369
-              <View className="picker">
461
+              <View className='picker'>
370 462
                 <Text>参加人数</Text>
371
-                <Text className="content">{selectorChecked}</Text>
463
+                <Text className='content'>{selectorChecked}</Text>
372 464
                 <Text>人</Text>
373 465
               </View>
374 466
             </Picker>
375
-            <View onClick={comfire} className="comfire">
467
+            <View onClick={comfire} className='comfire'>
376 468
               确认
377 469
             </View>
378 470
           </View>

+ 204
- 0
src/pages/index/activityDetail/index.scss 查看文件

@@ -17,6 +17,210 @@
17 17
           position: relative;
18 18
           overflow: hidden;
19 19
           min-height: 100vh;
20
+          .BuildingInfo {
21
+            padding: 0 30px;
22
+            position: relative;
23
+            overflow: hidden;
24
+            margin-top: 40px;
25
+            >.Title {
26
+              align-items: center;
27
+              >.flex-item {
28
+                margin-right: 30px;
29
+                position: relative;
30
+                overflow: hidden;
31
+                padding-right: 30px;
32
+                &::after {
33
+                  content: '';
34
+                  width: 2px;
35
+                  height: 100%;
36
+                  background: rgba(0, 0, 0, 0.1);
37
+                  display: block;
38
+                  position: absolute;
39
+                  right: 0;
40
+                  top: 0;
41
+                }
42
+                >.Name {
43
+                  display: block;
44
+                  font-size: 34px;
45
+                  font-weight: bold;
46
+                  line-height: 1;
47
+                  white-space: nowrap;
48
+                  overflow: hidden;
49
+                  text-overflow: ellipsis;
50
+                }
51
+                >.Address {
52
+                  align-items: center;
53
+                  margin-top: 28px;
54
+                  >.iconfont {
55
+                    font-size: 20px;
56
+                    color: #666;
57
+                    line-height: 1.1;
58
+                  }
59
+                  >.flex-item {
60
+                    margin-left: 4px;
61
+                    >text {
62
+                      display: block;
63
+                      font-size: 26px;
64
+                      font-weight: bold;
65
+                      white-space: nowrap;
66
+                      overflow: hidden;
67
+                      text-overflow: ellipsis;
68
+                      line-height: 1.1;
69
+                    }
70
+                  }
71
+                  >.Price {
72
+                    font-size: 26px;
73
+                    font-weight: bold;
74
+                    color: #FF0000;
75
+                    margin-left: 30px;
76
+                    line-height: 1.1;
77
+                  }
78
+                }
79
+                >.Time {
80
+                  display: block;
81
+                  font-size: 24px;
82
+                  color: #666;
83
+                  white-space: nowrap;
84
+                  overflow: hidden;
85
+                  text-overflow: ellipsis;
86
+                  margin-top: 28px;
87
+                }
88
+              }
89
+              >.Option {
90
+                >view {
91
+                  font-size: 0;
92
+                  white-space: nowrap;
93
+                  text-align: center;
94
+                  margin-top: 30px;
95
+                  padding-right: 30px;
96
+                  position: relative;
97
+                  overflow: hidden;
98
+                  >.ShareBtn {
99
+                    display: block;
100
+                    position: absolute;
101
+                    left: 0;
102
+                    top: 0;
103
+                    bottom: 0;
104
+                    z-index: 2;
105
+                    opacity: 0;
106
+                  }
107
+                  &:first-child {
108
+                    margin-top: 0;
109
+                  }
110
+                  >text {
111
+                    display: inline-block;
112
+                    vertical-align: middle;
113
+                    font-size: 24px;
114
+                    margin-left: 10px;
115
+                    position: relative;
116
+                    z-index: 1;
117
+                    &:first-child {
118
+                      margin-left: 0;
119
+                      font-size: 30px;
120
+                    }
121
+                  }
122
+                }
123
+              }
124
+            }
125
+            >.CountDown {
126
+              position: relative;
127
+              overflow: hidden;
128
+              background: rgba(25, 60, 131, 0.08);
129
+              padding: 23px 0;
130
+              text-align: center;
131
+              font-size: 0;
132
+              white-space: nowrap;
133
+              margin-top: 44px;
134
+              border-radius: 8px;
135
+              >text {
136
+                display: inline-block;
137
+                vertical-align: middle;
138
+                font-size: 28px;
139
+                line-height: 1;
140
+                margin-left: 10px;
141
+                &:first-child {
142
+                  margin-left: 0;
143
+                }
144
+                &.active {
145
+                  color: #193C83;
146
+                }
147
+                &.Number {
148
+                  color: #fff;
149
+                  background: #193C83;
150
+                  width: 38px;
151
+                  line-height: 38px;
152
+                  text-align: center;
153
+                  border-radius: 4px;
154
+                }
155
+                &.Red {
156
+                  color: #FF0000;
157
+                }
158
+              }
159
+            }
160
+            >.Apply {
161
+              position: relative;
162
+              overflow: hidden;
163
+              background: rgba(25, 60, 131, 0.08);
164
+              align-items: center;
165
+              margin-top: 40px;
166
+              border-radius: 8px;
167
+              >.Collect {
168
+                position: relative;
169
+                overflow: hidden;
170
+                width: 90px;
171
+                &::after {
172
+                  content: '';
173
+                  width: 2px;
174
+                  height: 34px;
175
+                  background: rgba(0, 0, 0, 0.08);
176
+                  display: block;
177
+                  position: absolute;
178
+                  right: 0;
179
+                  top: 50%;
180
+                  transform: translateY(-50%);
181
+                  -webkit-transform: translateY(-50%);
182
+                }
183
+                >text {
184
+                  display: block;
185
+                  text-align: center;
186
+                  font-size: 24px;
187
+                  line-height: 1;
188
+                  margin-top: 10px;
189
+                  &:first-child {
190
+                    margin-top: 0;
191
+                    font-size: 30px;
192
+                  }
193
+                }
194
+              }
195
+              >text {
196
+                &.iconfont {
197
+                  font-size: 30px;
198
+                  color: #193C83;
199
+                  margin-left: 24px;
200
+                }
201
+                &.Btn {
202
+                  font-size: 32px;
203
+                  width: 360px;
204
+                  line-height: 92px;
205
+                  border-radius: 92px;
206
+                  background: #193C83;
207
+                  text-align: center;
208
+                  margin-left: 0;
209
+                  color: #fff;
210
+                }
211
+              }
212
+              >.flex-item {
213
+                margin-left: 12px;
214
+                >text {
215
+                  display: block;
216
+                  white-space: nowrap;
217
+                  overflow: hidden;
218
+                  text-overflow: ellipsis;
219
+                  font-size: 30px;
220
+                }
221
+              }
222
+            }
223
+          }
20 224
           > .Top {
21 225
             width: 100%;
22 226
             padding-bottom: 56%;