hookehuyr

✨ feat(我的捐赠): 完善页面显示和捐赠证书显示逻辑

1 import { createApp } from 'vue'; 1 import { createApp } from 'vue';
2 -import { Button, Image as VanImage, Col, Row, Icon, Form, Field, CellGroup, ConfigProvider, Toast, Uploader, Empty, Tab, Tabs, Overlay, NumberKeyboard, Lazyload, List, PullRefresh, Popup, Picker, Sticky, Stepper, Tag } from 'vant'; 2 +import { Button, Image as VanImage, Col, Row, Icon, Form, Field, CellGroup, ConfigProvider, Toast, Uploader, Empty, Tab, Tabs, Overlay, NumberKeyboard, Lazyload, List, PullRefresh, Popup, Picker, Sticky, Stepper, Tag, Swipe, SwipeItem } from 'vant';
3 import router from './router'; 3 import router from './router';
4 import App from './App.vue'; 4 import App from './App.vue';
5 import axios from './utils/axios'; 5 import axios from './utils/axios';
...@@ -33,6 +33,8 @@ app.use(Picker); ...@@ -33,6 +33,8 @@ app.use(Picker);
33 app.use(Sticky); 33 app.use(Sticky);
34 app.use(Stepper); 34 app.use(Stepper);
35 app.use(Tag); 35 app.use(Tag);
36 +app.use(Swipe);
37 +app.use(SwipeItem);
36 38
37 app.use(ConfigProvider); 39 app.use(ConfigProvider);
38 40
......
1 <template> 1 <template>
2 - <div class=""></div> 2 + <div class="donate-list-page">
3 + <div style="background: linear-gradient(310deg, #FDD347 0%, #FFED6D 100%); padding: 1rem; text-align: center; color: #713610;">
4 + <van-row>
5 + <van-col span="11" style="line-height: 1.5;">
6 + <p>捐赠总金额</p>
7 + <p style="font-weight: bold; font-size: 1.25rem;">3562.5元</p>
8 + </van-col>
9 + <van-col span="1"><div style="border-right: 1px solid #733912; height: 100%; opacity: 0.15;"></div></van-col>
10 + <van-col span="11" style="line-height: 1.5;">
11 + <p>点亮书籍</p>
12 + <p style="font-weight: bold; font-size: 1.25rem;">4个</p>
13 + </van-col>
14 + </van-row>
15 + </div>
16 +
17 + <div class="donate-book-wrapper">
18 + <template v-for="(item, key) in dataList" :key="key">
19 + <div class="book-row">
20 + <van-row>
21 + <van-col span="8" class="book-col" v-for="(v, key) in item">
22 + <div @click="showCert(v)" v-if="v.status === 'ENABLE'" class="ENABLE">
23 + <van-image width="90%" height="95%" :src="v.src" />
24 + </div>
25 + <div v-else class="DISABLE">
26 + <van-image width="90%" height="95%" :src="v.src" />
27 + <div class="mask">
28 + <img :src="icon_lock">
29 + </div>
30 + </div>
31 + <p class="van-ellipsis text">{{ v.name }}</p>
32 + </van-col>
33 + </van-row>
34 + </div>
35 + </template>
36 + </div>
37 + </div>
38 +
39 + <van-overlay :show="show" @click="show = false">
40 + <div style="width: auto; height: 100%; margin: 2rem 2rem 0 2rem; overflow: hidden;">
41 +
42 + <van-swipe class="my-swipe">
43 + <van-swipe-item>
44 + <donate-cert></donate-cert>
45 + <div style="height: 2rem;"></div>
46 + </van-swipe-item>
47 + <van-swipe-item>
48 + <donate-cert></donate-cert>
49 + </van-swipe-item>
50 + <van-swipe-item>
51 + <donate-cert></donate-cert>
52 + </van-swipe-item>
53 + <template #indicator="{ active, total }">
54 + <div class="custom-indicator">{{ active + 1 }}/{{ total }}</div>
55 + </template>
56 + </van-swipe>
57 + </div>
58 + </van-overlay>
59 +
3 </template> 60 </template>
4 61
5 <script setup> 62 <script setup>
63 +import DonateCert from '@/components/DonateCert/index.vue'
64 +
65 +import icon_lock from '@images/suo@2x.png'
66 +
6 import { ref, reactive, onMounted } from 'vue' 67 import { ref, reactive, onMounted } from 'vue'
7 import { useRoute, useRouter } from 'vue-router' 68 import { useRoute, useRouter } from 'vue-router'
8 import axios from '@/utils/axios'; 69 import axios from '@/utils/axios';
9 import $ from 'jquery' 70 import $ from 'jquery'
71 +import _ from 'lodash'
10 import { Toast } from 'vant'; 72 import { Toast } from 'vant';
11 const $route = useRoute(); 73 const $route = useRoute();
12 const $router = useRouter(); 74 const $router = useRouter();
13 75
76 +const show = ref(false);
77 +
78 +const rawList = ref([
79 + {
80 + name: '逃家小兔',
81 + src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
82 + status: 'ENABLE'
83 + },
84 + {
85 + name: '小猫的情绪',
86 + src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
87 + status: 'DISABLE'
88 + },
89 + {
90 + name: '逃家小兔',
91 + src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
92 + status: 'ENABLE'
93 + },
94 + {
95 + name: '小猫的情绪',
96 + src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
97 + status: 'DISABLE'
98 + },
99 + {
100 + name: '逃家小兔',
101 + src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
102 + status: 'DISABLE'
103 + },
104 + {
105 + name: '小猫的情绪',
106 + src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
107 + status: 'DISABLE'
108 + },
109 +])
110 +let dataList = ref([]);
111 +
112 +// 显示捐赠证书
113 +const showCert = (v) => {
114 + console.warn(v);
115 + show.value = true
116 +}
117 +
14 onMounted(() => { 118 onMounted(() => {
15 - 119 + dataList.value = _.chunk(rawList.value, 3);
16 }) 120 })
17 </script> 121 </script>
18 122
...@@ -23,11 +127,9 @@ export default { ...@@ -23,11 +127,9 @@ export default {
23 mixins: [mixin.init], 127 mixins: [mixin.init],
24 data () { 128 data () {
25 return { 129 return {
26 -
27 } 130 }
28 }, 131 },
29 mounted () { 132 mounted () {
30 -
31 }, 133 },
32 methods: { 134 methods: {
33 135
...@@ -36,5 +138,53 @@ export default { ...@@ -36,5 +138,53 @@ export default {
36 </script> 138 </script>
37 139
38 <style lang="less" scoped> 140 <style lang="less" scoped>
141 +.donate-list-page {
142 + .donate-book-wrapper {
143 + padding: 0 1rem;
144 + .book-row {
145 + margin: 1rem 0;
146 + text-align: center;
147 + .book-col {
148 + padding: 0 0.5rem;
149 + .ENABLE {
150 + background: #FFFFFF;
151 + box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.15);
152 + border-radius: 5px;
153 + border: 1px solid #FFE000;
154 + }
155 + .DISABLE {
156 + border-radius: 6px;
157 + position: relative;
158 + .mask {
159 + position: absolute;
160 + width: 100%;
161 + height: 100%;
162 + background: rgba(0, 0, 0, 0.4);
163 + border-radius: 6px;
164 + top: 0;
165 + img {
166 + margin-top: 20%;
167 + width: 50%;
168 + }
169 + }
170 + }
171 + .text {
172 + font-size: 1rem;
173 + margin-top: 0.5rem;
174 + color: #222222;
175 + }
176 + }
177 + }
178 + }
179 +}
39 180
181 +.custom-indicator {
182 + position: absolute;
183 + bottom: 5px;
184 + padding: 2px 5px;
185 + font-size: 12px;
186 + color: #FFFFFF;
187 + text-align: center;
188 + width: 100%;
189 +}
40 </style> 190 </style>
...\ No newline at end of file ...\ No newline at end of file
......