Browse Source

静态页面

1002884655 3 years ago
parent
commit
7ffdcf79b2

+ 2
- 2
config/dev.js View File

3
     NODE_ENV: '"development"'
3
     NODE_ENV: '"development"'
4
   },
4
   },
5
   defineConstants: {
5
   defineConstants: {
6
-    HOST: '"https://xlk.njyz.tech"',
7
-    // HOST: '"http://127.0.0.1:8081"',
6
+    // HOST: '"https://xlk.njyz.tech"',
7
+    HOST: '"http://127.0.0.1:8081"',
8
     WSS_HOST: '"wss://xlk.njyz.tech"',
8
     WSS_HOST: '"wss://xlk.njyz.tech"',
9
     OSS_PATH: '"https://xlk-assets.oss-accelerate.aliyuncs.com/"',
9
     OSS_PATH: '"https://xlk-assets.oss-accelerate.aliyuncs.com/"',
10
     OSS_FAST_PATH: '"https://xlk-assets.oss-accelerate.aliyuncs.com/"',
10
     OSS_FAST_PATH: '"https://xlk-assets.oss-accelerate.aliyuncs.com/"',

+ 2
- 1
config/index.js View File

24
     '@/store': path.resolve(__dirname, '..', 'src/store'),
24
     '@/store': path.resolve(__dirname, '..', 'src/store'),
25
     '@/services': path.resolve(__dirname, '..', 'src/services'),
25
     '@/services': path.resolve(__dirname, '..', 'src/services'),
26
     '@/utils': path.resolve(__dirname, '..', 'src/utils'),
26
     '@/utils': path.resolve(__dirname, '..', 'src/utils'),
27
+    '@/native': path.resolve(__dirname, '..', 'src/native'),
27
     '@/pages': path.resolve(__dirname, '..', 'src/pages'),
28
     '@/pages': path.resolve(__dirname, '..', 'src/pages'),
28
   },
29
   },
29
   copy: {
30
   copy: {
30
     patterns: [
31
     patterns: [
31
-      { from: 'src/native/', to: 'dist/native/' },
32
+      // { from: 'src/native/', to: 'dist/native/' },
32
     ],
33
     ],
33
     options: {
34
     options: {
34
     }
35
     }

BIN
src/assets/poster-empty.png View File


+ 48
- 20
src/components/Poster/Poster.jsx View File

39
         }
39
         }
40
       })
40
       })
41
 
41
 
42
-      Promise.all([
43
-        sdk.getImage(poster),
44
-        sdk.getImage(miniCode),
45
-        sdk.getImage(avatar),
46
-      ]).then((res) => {
47
-        const [posterImg, miniCodeImg, avatarImg] = res
42
+      // 名称
43
+      sdk.darwText(name, conf.name)
44
+      // 小程序码
45
+      sdk.darwText(desc, conf.desc)
48
 
46
 
49
-        // 封面
47
+      let cnt = 0
48
+      // 封面
49
+      sdk.getImage(poster).then((posterImg) => {
50
         sdk.drawImage(posterImg, conf.poster)
50
         sdk.drawImage(posterImg, conf.poster)
51
-        // 头像
51
+        cnt += 1
52
+      }).catch(() => cnt += 1)
53
+      // 头像
54
+      sdk.getImage(avatar).then((avatarImg) => {
52
         sdk.drawImage(avatarImg, conf.avatar)
55
         sdk.drawImage(avatarImg, conf.avatar)
53
-        // 小程序码
56
+        cnt += 1
57
+      }).catch(() => cnt += 1)
58
+      // 小程序码
59
+      sdk.getImage(miniCode).then((miniCodeImg) => {
54
         sdk.drawImage(miniCodeImg, conf.miniCode)
60
         sdk.drawImage(miniCodeImg, conf.miniCode)
55
-        // 名称
56
-        sdk.darwText(name, conf.name)
57
-        // 小程序码
58
-        sdk.darwText(desc, conf.desc)
61
+        cnt += 1
62
+      }).catch(() => cnt += 1)
59
 
63
 
60
-        //
61
-        const image = sdk.toDataURL()
62
-        onEnd(image, sdk)
63
-      }).catch(([e1, e2, e3]) => {
64
-        if (onError) {
65
-          onError([e1, e2, e3])
64
+      const ticker = setInterval(() => {
65
+        if (cnt >= 3) {
66
+          // 图片全部处理完
67
+          const image = sdk.toDataURL()
68
+          onEnd(image, sdk)
69
+          clearInterval(ticker)
66
         }
70
         }
67
-      })
71
+      }, 200);
72
+
73
+
74
+      // Promise.all([
75
+      //   // sdk.getImage(poster),
76
+      //   sdk.getImage(miniCode),
77
+      //   // sdk.getImage(avatar),
78
+      // ]).then((res) => {
79
+      //   const [posterImg, miniCodeImg, avatarImg] = res
80
+
81
+      //   // 封面
82
+      //   sdk.drawImage(posterImg, conf.poster)
83
+      //   // 头像
84
+      //   sdk.drawImage(avatarImg, conf.avatar)
85
+      //   // 小程序码
86
+      //   sdk.drawImage(miniCodeImg, conf.miniCode)
87
+
88
+      //   //
89
+      //   const image = sdk.toDataURL()
90
+      //   onEnd(image, sdk)
91
+      // }).catch(([e1, e2, e3]) => {
92
+      //   if (onError) {
93
+      //     onError([e1, e2, e3])
94
+      //   }
95
+      // })
68
     }
96
     }
69
   }, [sdk, dataSource, onStart, onEnd, onError])
97
   }, [sdk, dataSource, onStart, onEnd, onError])
70
 
98
 

+ 10
- 6
src/components/Poster/index.jsx View File

84
     })
84
     })
85
   }
85
   }
86
 
86
 
87
+  const handleImage = (e) => {
88
+    Taro.previewImage({ current: img, urls: [img] })
89
+  }
90
+
87
   return (
91
   return (
88
     // <Modal title={title} visible={show} onClose={onClose}>
92
     // <Modal title={title} visible={show} onClose={onClose}>
89
     // eslint-disable-next-line react/jsx-no-undef
93
     // eslint-disable-next-line react/jsx-no-undef
90
-    <page-container show={show} position='bottom' onClickOverlay={onClose}>
91
-      <View className='modal-poster' onClick={onClose}>
94
+    <page-modal show={show} position='bottom' onClickOverlay={onClose} height="60vh">
95
+      <View className='modal-poster'>
92
         <View className='modal-poster-img-box'>
96
         <View className='modal-poster-img-box'>
93
-        {
97
+        {/* {
94
           !processing
98
           !processing
95
-            ? <Image src={img} mode='scaleToFill' onClick={() => Taro.previewImage({ current: img, urls: [img] })} />
99
+            ? <Image src={img} mode='scaleToFill' onClick={handleImage} />
96
             : <Spin2 spinning={processing} size={32} />
100
             : <Spin2 spinning={processing} size={32} />
97
-        }
101
+        } */}
98
         </View>
102
         </View>
99
         <Button className='modal-poster-action' onClick={handleSave} disabled={!img} loading={loading}>
103
         <Button className='modal-poster-action' onClick={handleSave} disabled={!img} loading={loading}>
100
           {btnText}
104
           {btnText}
101
         </Button>
105
         </Button>
102
       </View>
106
       </View>
103
       <Poster dataSource={dataSource} onStart={() => setProcessing(true)} onEnd={handlePoster} />
107
       <Poster dataSource={dataSource} onStart={() => setProcessing(true)} onEnd={handlePoster} />
104
-    </page-container>
108
+    </page-modal>
105
   )
109
   )
106
 }
110
 }

+ 8
- 4
src/components/Poster/style.scss View File

1
 .modal-poster {
1
 .modal-poster {
2
-  width: 100vw;
3
-  height: 100vh;
2
+  // width: 100vw;
3
+  // height: 100vh;
4
   // height: calc(100vh - 62rpx);
4
   // height: calc(100vh - 62rpx);
5
+  height: 100%;
5
   box-sizing: border-box;
6
   box-sizing: border-box;
6
   padding: 40rpx;
7
   padding: 40rpx;
7
 
8
 
8
   &-img-box {
9
   &-img-box {
9
-    flex: auto;
10
-    width: 70%;
11
     height: calc(100% - 92rpx - 40rpx);
10
     height: calc(100% - 92rpx - 40rpx);
12
     margin: 0 auto;
11
     margin: 0 auto;
13
     background: #fff;
12
     background: #fff;
14
     box-shadow: 0 14rpx 24rpx 0 rgba(0, 0, 0, 0.2);
13
     box-shadow: 0 14rpx 24rpx 0 rgba(0, 0, 0, 0.2);
15
     position: relative;
14
     position: relative;
16
 
15
 
16
+    .empty-poster {
17
+      width: auto;
18
+      height: 100%;
19
+    }
20
+
17
     image {
21
     image {
18
       width: 100%;
22
       width: 100%;
19
       height: 100%;
23
       height: 100%;

+ 34
- 25
src/pages/index/activityDetail/index.jsx View File

16
 import {
16
 import {
17
   signupActivity,
17
   signupActivity,
18
   queryActivityDetail,
18
   queryActivityDetail,
19
+<<<<<<< HEAD
19
 } from '@/services/activity';
20
 } from '@/services/activity';
20
 import { getImgURL } from '@/utils/image';
21
 import { getImgURL } from '@/utils/image';
21
 import getDateFormat from '@/utils/chatDate';
22
 import getDateFormat from '@/utils/chatDate';
48
   },
49
   },
49
 };
50
 };
50
 
51
 
52
+=======
53
+} from "@/services/activity";
54
+import { getImgURL } from "@/utils/image";
55
+import getDateFormat from "@/utils/chatDate";
56
+import useParams from "@/utils/hooks/useParams";
57
+import useShare from "@/utils/hooks/useShare";
58
+import useFavor from "@/utils/hooks/useFavor";
59
+import useStatus from './useStatus'
60
+
61
+import { getDownloadURL, times, transferImage } from "@/utils/tools";
62
+import "./index.scss";
63
+
64
+>>>>>>> 9b71da79c5db94acce0d9ed188d5664b36c36c8c
51
 export default withLayout((props) => {
65
 export default withLayout((props) => {
52
   const { router, shareContent, trackData, person, page } = props;
66
   const { router, shareContent, trackData, person, page } = props;
53
   const { id } = router.params;
67
   const { id } = router.params;
62
 
76
 
63
   const buildingId = detail?.buildingId;
77
   const buildingId = detail?.buildingId;
64
 
78
 
79
+  const [btnText, btnDisabled] = useStatus(detail)
80
+
65
   const getDetail = (params) => {
81
   const getDetail = (params) => {
66
     Taro.showLoading();
82
     Taro.showLoading();
67
 
83
 
68
     queryActivityDetail(params).then((res) => {
84
     queryActivityDetail(params).then((res) => {
69
-      const maxperson =
70
-        res.maxEnlistByPerson < 100 ? res.maxEnlistByPerson : 100;
85
+      // const maxperson =
86
+      //   res.maxEnlistByPerson < 100 ? res.maxEnlistByPerson : 100;
71
 
87
 
72
-      setSelector(times(maxperson || 1).map((_, i) => `${i + 1}`));
88
+      const maxperson = 10
89
+
90
+      setSelector(times(maxperson).map((_, i) => `${i + 1}`));
73
 
91
 
74
       setDetail(res);
92
       setDetail(res);
75
       Taro.hideLoading();
93
       Taro.hideLoading();
155
   }
173
   }
156
 
174
 
157
   const handleSignup = () => {
175
   const handleSignup = () => {
158
-    const { isSign } = detail;
159
-
160
-    if (isSign) {
161
-      Taro.showToast({
162
-        icon: 'none',
163
-        title: '你已报名成功',
164
-      });
165
-      return;
166
-    }
167
-    setCanChoose('block');
176
+    setCanChoose("block");
168
   };
177
   };
169
 
178
 
170
   const comfire = () => {
179
   const comfire = () => {
188
 
197
 
189
     signupActivity(payload).then(() => {
198
     signupActivity(payload).then(() => {
190
       Taro.showToast({
199
       Taro.showToast({
191
-        title: '报名成功',
192
-      })
193
-      setSelector('none')
200
+        title: "报名成功",
201
+      });
202
+      setCanChoose('none')
194
       setTimeout(() => {
203
       setTimeout(() => {
195
         getDetail(id)
204
         getDetail(id)
196
       }, 500)
205
       }, 500)
405
                     ></Image>
414
                     ></Image>
406
                   </view>
415
                   </view>
407
 
416
 
408
-                  {detail.type == 'dymic' && dymic()}
409
-                  {detail.type == 'house' && house()}
417
+                  {detail.type == "dymic" && dymic()}
418
+                  {detail.type == "house" && house()}
410
                   <view className='ActivityIntro'>
419
                   <view className='ActivityIntro'>
411
                     <view className='Title'>
420
                     <view className='Title'>
412
                       <text>活动介绍</text>
421
                       <text>活动介绍</text>
419
               </ScrollView>
428
               </ScrollView>
420
             </view>
429
             </view>
421
           </view>
430
           </view>
422
-          {detail.type == 'dymic' && (
431
+          {detail.type == "dymic" && (
423
             <view className='PageBottom flex-h'>
432
             <view className='PageBottom flex-h'>
424
-              <Button className='Share' open-type='share'>
433
+              <button className='Share' open-type='share'>
425
                 <text className='iconfont icon-fenxiang'></text>
434
                 <text className='iconfont icon-fenxiang'></text>
426
                 <text>分享</text>
435
                 <text>分享</text>
427
-              </Button>
436
+              </button>
428
               <view className='Collect' onClick={handleFavor}>
437
               <view className='Collect' onClick={handleFavor}>
429
                 <text
438
                 <text
430
                   className='iconfont icon-shoucang'
439
                   className='iconfont icon-shoucang'
431
-                  style={isSaved ? { color: 'red' } : undefined}
440
+                  style={isSaved ? { color: "red" } : undefined}
432
                 ></text>
441
                 ></text>
433
                 <text>{isSaved ? '已收藏' : '收藏'}</text>
442
                 <text>{isSaved ? '已收藏' : '收藏'}</text>
434
               </view>
443
               </view>
435
               <view className='flex-item'></view>
444
               <view className='flex-item'></view>
436
 
445
 
437
-              <text className='Post' onClick={handleSignup}>
438
-                {activityStatusDict[detail.activityStatus]?.text}
439
-              </text>
446
+              <button disabled={btnDisabled} className='Post' onClick={handleSignup}>
447
+                {btnText}
448
+              </button>
440
             </view>
449
             </view>
441
           )}
450
           )}
442
         </view>
451
         </view>

+ 58
- 0
src/pages/index/activityDetail/useStatus.js View File

1
+import { useEffect, useState } from 'react'
2
+
3
+const ACT_GAMEOVER = 2
4
+const ACT_ENLIST_FULL = 2
5
+const ACT_SIGNED = 1
6
+
7
+export default function useStatus(info) {
8
+  const { dynamicId, isSign, activityStatus, isEnlist, enlistStart, enlistEnd } = info || {}
9
+
10
+  const [disabled, setDisabled] = useState(false)
11
+  const [btnText, setBtnText] = useState('立即报名')
12
+
13
+  useEffect(() => {
14
+    if (!dynamicId) return;
15
+
16
+    // 活动结束
17
+    if (activityStatus === ACT_GAMEOVER) {
18
+      setBtnText('活动已结束')
19
+      setDisabled(true)
20
+      return;
21
+    }
22
+
23
+    // 报名人数已满
24
+    if (isEnlist === ACT_ENLIST_FULL) {
25
+      setBtnText('人数已满')
26
+      setDisabled(true)
27
+      return;
28
+    }
29
+
30
+    // 已报名
31
+    if (isSign === ACT_SIGNED) {
32
+      setBtnText('已报名')
33
+      setDisabled(true)
34
+      return;
35
+    }
36
+
37
+    // 报名时间
38
+    const now = new Date()
39
+    const start = new Date(enlistStart)
40
+    const end = new Date(enlistEnd)
41
+    if (now < start) {
42
+      setBtnText('报名未开始')
43
+      setDisabled(true)
44
+      return;
45
+    }
46
+
47
+    if (now > end) {
48
+      setBtnText('报名已结束')
49
+      setDisabled(true)
50
+      return;
51
+    }
52
+
53
+    setBtnText('立即报名')
54
+    setDisabled(false)
55
+  },[dynamicId])
56
+
57
+  return [btnText, disabled]
58
+}

+ 1
- 1
src/pages/index/buildingDetail/index.config.js View File

2
   navigationBarTitleText: '楼盘详情',
2
   navigationBarTitleText: '楼盘详情',
3
   enableShareAppMessage: true,
3
   enableShareAppMessage: true,
4
   usingComponents: {
4
   usingComponents: {
5
-    'page-container': '/native/PageContainer/index'
5
+    'page-modal': '@/native/PageContainer/index'
6
   }
6
   }
7
 }
7
 }

+ 7
- 0
src/utils/hooks/usePoster.js View File

16
           name: person.name || person.nickname,
16
           name: person.name || person.nickname,
17
           avatar: person.avatarurl,
17
           avatar: person.avatarurl,
18
         })
18
         })
19
+      }).catch(() => {
20
+        setPosterData({
21
+          poster,
22
+          miniCode: undefined,
23
+          name: person.name || person.nickname,
24
+          avatar: person.avatarurl,
25
+        })
19
       })
26
       })
20
     }
27
     }
21
   // eslint-disable-next-line react-hooks/exhaustive-deps
28
   // eslint-disable-next-line react-hooks/exhaustive-deps