hookehuyr

✨ feat(我的捐赠): API联调

1 <template> 1 <template>
2 <div class="donate-list-page"> 2 <div class="donate-list-page">
3 - <div style="background: linear-gradient(310deg, #FDD347 0%, #FFED6D 100%); padding: 1rem; text-align: center; color: #713610;"> 3 + <div class="donate-header">
4 <van-row> 4 <van-row>
5 - <van-col span="11" style="line-height: 1.5;"> 5 + <van-col span="11" class="sum">
6 <p>捐赠总金额</p> 6 <p>捐赠总金额</p>
7 - <p style="font-weight: bold; font-size: 1.25rem;">3562.5元</p> 7 + <p>{{ donateInfo.total }}&nbsp;元</p>
8 </van-col> 8 </van-col>
9 - <van-col span="1"><div style="border-right: 1px solid #733912; height: 100%; opacity: 0.15;"></div></van-col> 9 + <van-col span="1"><div class="line"></div></van-col>
10 - <van-col span="11" style="line-height: 1.5;"> 10 + <van-col class="book" span="11">
11 <p>点亮书籍</p> 11 <p>点亮书籍</p>
12 - <p style="font-weight: bold; font-size: 1.25rem;">4个</p> 12 + <p>{{ donateInfo.num }}&nbsp;个</p>
13 </van-col> 13 </van-col>
14 </van-row> 14 </van-row>
15 </div> 15 </div>
...@@ -18,12 +18,12 @@ ...@@ -18,12 +18,12 @@
18 <template v-for="(item, key) in dataList" :key="key"> 18 <template v-for="(item, key) in dataList" :key="key">
19 <div class="book-row"> 19 <div class="book-row">
20 <van-row> 20 <van-row>
21 - <van-col span="8" class="book-col" v-for="(v, key) in item"> 21 + <van-col span="8" class="book-col" v-for="(v, index) in item" :key="index">
22 - <div @click="showCert(v)" v-if="v.status === 'ENABLE'" class="ENABLE"> 22 + <div @click="showCert(v)" v-if="v.is_donate" class="ENABLE">
23 - <van-image width="90%" height="95%" :src="v.src" /> 23 + <van-image width="90%" height="7rem" :src="v.cover" />
24 </div> 24 </div>
25 <div v-else class="DISABLE"> 25 <div v-else class="DISABLE">
26 - <van-image width="90%" height="95%" :src="v.src" /> 26 + <van-image width="90%" height="7rem" :src="v.cover" />
27 <div class="mask"> 27 <div class="mask">
28 <img :src="icon_lock"> 28 <img :src="icon_lock">
29 </div> 29 </div>
...@@ -36,20 +36,13 @@ ...@@ -36,20 +36,13 @@
36 </div> 36 </div>
37 </div> 37 </div>
38 38
39 - <van-overlay :show="show" @click="show = false"> 39 + <van-overlay :show="show" @click="onHide">
40 <div style="width: auto; height: 100%; margin: 2rem 2rem 0 2rem; overflow: hidden;"> 40 <div style="width: auto; height: 100%; margin: 2rem 2rem 0 2rem; overflow: hidden;">
41 - 41 + <van-swipe class="my-swipe" ref="swipe">
42 - <van-swipe class="my-swipe"> 42 + <van-swipe-item v-for="(d, k) in certItems" :key="k">
43 - <van-swipe-item> 43 + <donate-cert :item="d"></donate-cert>
44 - <donate-cert></donate-cert>
45 <div style="height: 2rem;"></div> 44 <div style="height: 2rem;"></div>
46 </van-swipe-item> 45 </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 }"> 46 <template #indicator="{ active, total }">
54 <div class="custom-indicator">{{ active + 1 }}/{{ total }}</div> 47 <div class="custom-indicator">{{ active + 1 }}/{{ total }}</div>
55 </template> 48 </template>
...@@ -64,7 +57,7 @@ import DonateCert from '@/components/DonateCert/index.vue' ...@@ -64,7 +57,7 @@ import DonateCert from '@/components/DonateCert/index.vue'
64 57
65 import icon_lock from '@images/suo@2x.png' 58 import icon_lock from '@images/suo@2x.png'
66 59
67 -import { ref, reactive, onMounted } from 'vue' 60 +import { ref, reactive, onMounted, getCurrentInstance, nextTick, watch } from 'vue'
68 import { useRoute, useRouter } from 'vue-router' 61 import { useRoute, useRouter } from 'vue-router'
69 import axios from '@/utils/axios'; 62 import axios from '@/utils/axios';
70 import $ from 'jquery' 63 import $ from 'jquery'
...@@ -73,54 +66,69 @@ import { Toast } from 'vant'; ...@@ -73,54 +66,69 @@ import { Toast } from 'vant';
73 const $route = useRoute(); 66 const $route = useRoute();
74 const $router = useRouter(); 67 const $router = useRouter();
75 68
76 -// TODO: 我的捐赠列表 69 +// 我的捐赠列表
77 -// TODO: 我的捐赠证书列表 70 +const donateInfo = ref('');
78 - 71 +const dataList = ref([]);
79 -const show = ref(false); 72 +axios.post('/srv/?a=my_donate')
80 - 73 +.then(res => {
81 -const rawList = ref([ 74 + if (res.data.code === 1) {
82 - { 75 + donateInfo.value = res.data.data;
83 - name: '逃家小兔', 76 + dataList.value = _.chunk(res.data.data.book, 3);
84 - src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed', 77 + } else {
85 - status: 'ENABLE' 78 + console.warn(res);
86 - }, 79 + Toast({
87 - { 80 + icon: 'close',
88 - name: '小猫的情绪', 81 + message: res.data.msg
89 - src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed', 82 + });
90 - status: 'DISABLE' 83 + }
91 - }, 84 +})
92 - { 85 +.catch(err => {
93 - name: '逃家小兔', 86 + console.error(err);
94 - src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed', 87 +});
95 - status: 'ENABLE'
96 - },
97 - {
98 - name: '小猫的情绪',
99 - src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
100 - status: 'DISABLE'
101 - },
102 - {
103 - name: '逃家小兔',
104 - src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
105 - status: 'DISABLE'
106 - },
107 - {
108 - name: '小猫的情绪',
109 - src: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
110 - status: 'DISABLE'
111 - },
112 -])
113 -let dataList = ref([]);
114 88
115 // 显示捐赠证书 89 // 显示捐赠证书
90 +const show = ref(false);
91 +const certItems = ref([])
116 const showCert = (v) => { 92 const showCert = (v) => {
117 - console.warn(v); 93 + // 捐款成功后,查询生成捐赠证书
118 - show.value = true 94 + axios.get('/srv/?a=cert_list', {
95 + params: {
96 + book_id: v.id
97 + }
98 + })
99 + .then(res => {
100 + if (res.data.code === 1) {
101 + certItems.value = res.data.data;
102 + show.value = true
103 + } else {
104 + console.warn(res);
105 + Toast({
106 + icon: 'close',
107 + message: res.data.msg
108 + });
109 + }
110 + })
111 + .catch(err => {
112 + console.error(err);
113 + })
119 } 114 }
120 115
121 - onMounted(() => { 116 +const onHide = () => {
122 - dataList.value = _.chunk(rawList.value, 3); 117 + show.value = false;
123 - }) 118 +}
119 +
120 +// 关闭弹框后重置index
121 +const internalInstance = getCurrentInstance();
122 +watch(show, (v) => {
123 + if (!v) {
124 + setTimeout(() => {
125 + nextTick(() => {
126 + internalInstance.ctx.$refs.swipe.swipeTo(0);
127 + })
128 + }, 1000)
129 + }
130 +})
131 +
124 </script> 132 </script>
125 133
126 <script> 134 <script>
...@@ -142,6 +150,31 @@ export default { ...@@ -142,6 +150,31 @@ export default {
142 150
143 <style lang="less" scoped> 151 <style lang="less" scoped>
144 .donate-list-page { 152 .donate-list-page {
153 + .donate-header {
154 + background: linear-gradient(310deg, #FDD347 0%, #FFED6D 100%);
155 + padding: 1rem;
156 + text-align: center;
157 + color: #713610;
158 + .sum {
159 + line-height: 1.5;
160 + p:last-child {
161 + font-weight: bold;
162 + font-size: 1.25rem;
163 + }
164 + }
165 + .line {
166 + border-right: 1px solid #733912;
167 + height: 100%;
168 + opacity: 0.15;
169 + }
170 + .book {
171 + line-height: 1.5;
172 + p:last-child {
173 + font-weight: bold;
174 + font-size: 1.25rem;
175 + }
176 + }
177 + }
145 .donate-book-wrapper { 178 .donate-book-wrapper {
146 padding: 0 1rem; 179 padding: 0 1rem;
147 .book-row { 180 .book-row {
...@@ -190,4 +223,4 @@ export default { ...@@ -190,4 +223,4 @@ export default {
190 text-align: center; 223 text-align: center;
191 width: 100%; 224 width: 100%;
192 } 225 }
193 -</style>
...\ No newline at end of file ...\ No newline at end of file
226 +</style>
......