hookehuyr

✨ feat: 捐书功能模块API联调

...@@ -3,16 +3,38 @@ ...@@ -3,16 +3,38 @@
3 </template> 3 </template>
4 4
5 <script setup> 5 <script setup>
6 +import Cookies from 'js-cookie'
7 +
6 import axios from '@/utils/axios' 8 import axios from '@/utils/axios'
7 import { useRoute, useRouter } from 'vue-router' 9 import { useRoute, useRouter } from 'vue-router'
8 import { onMounted } from 'vue' 10 import { onMounted } from 'vue'
9 import { Toast } from 'vant' 11 import { Toast } from 'vant'
10 import { mainStore } from './store'; 12 import { mainStore } from './store';
13 +
11 const store = mainStore(); 14 const store = mainStore();
12 const $router = useRouter(); 15 const $router = useRouter();
13 16
14 -onMounted(() => { 17 +/**
15 -}) 18 + * 获取默认儿童信息
19 + * @returns name, perf_id, kg_id
20 + */
21 +if (!Cookies.get('default_perf')) {
22 + axios.get('/srv/?a=default_perf')
23 + .then(res => {
24 + if (res.data.code === 1) {
25 + Cookies.set('default_perf', JSON.stringify(res.data.data));
26 + } else {
27 + console.warn(res);
28 + Toast({
29 + icon: 'close',
30 + message: res.data.msg
31 + });
32 + }
33 + })
34 + .catch(err => {
35 + console.error(err);
36 + });
37 +}
16 </script> 38 </script>
17 39
18 <style lang="less"> 40 <style lang="less">
...@@ -37,4 +59,4 @@ body { ...@@ -37,4 +59,4 @@ body {
37 padding: 0; 59 padding: 0;
38 } 60 }
39 } 61 }
40 -</style>
...\ No newline at end of file ...\ No newline at end of file
62 +</style>
......
...@@ -5,13 +5,13 @@ ...@@ -5,13 +5,13 @@
5 <van-row> 5 <van-row>
6 <van-col> 6 <van-col>
7 <div class="donate-book"> 7 <div class="donate-book">
8 - <van-image width="80" height="80" src="https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed" /> 8 + <van-image width="80" height="80" :src="item.avatar" />
9 </div> 9 </div>
10 </van-col> 10 </van-col>
11 <van-col> 11 <van-col>
12 <div class="donate-detail"> 12 <div class="donate-detail">
13 - <p class="text">逃家小兔绘本</p> 13 + <p class="text">{{ item.name }}</p>
14 - <p class="price">¥59</p> 14 + <p class="price">¥{{ item.price }}</p>
15 </div> 15 </div>
16 </van-col> 16 </van-col>
17 </van-row> 17 </van-row>
...@@ -50,6 +50,8 @@ ...@@ -50,6 +50,8 @@
50 </template> 50 </template>
51 51
52 <script setup> 52 <script setup>
53 +import Cookies from 'js-cookie'
54 +
53 import MyButton from '@/components/MyButton/index.vue' 55 import MyButton from '@/components/MyButton/index.vue'
54 import { ref, reactive, onMounted } from 'vue' 56 import { ref, reactive, onMounted } from 'vue'
55 import { useRoute, useRouter } from 'vue-router' 57 import { useRoute, useRouter } from 'vue-router'
...@@ -70,7 +72,7 @@ onMounted(() => { ...@@ -70,7 +72,7 @@ onMounted(() => {
70 import mixin from 'common/mixin'; 72 import mixin from 'common/mixin';
71 73
72 export default { 74 export default {
73 - props: ['showPopup'], 75 + props: ['showPopup', 'item'],
74 mixins: [mixin.init], 76 mixins: [mixin.init],
75 data() { 77 data() {
76 return { 78 return {
...@@ -81,6 +83,9 @@ export default { ...@@ -81,6 +83,9 @@ export default {
81 } 83 }
82 }, 84 },
83 mounted() { 85 mounted() {
86 + // 缺省儿童信息
87 + const default_perf = Cookies.get('default_perf') ? JSON.parse(Cookies.get('default_perf')) : '';
88 + this.donate_name = default_perf.name;
84 }, 89 },
85 watch: { 90 watch: {
86 showPopup(value, pre) { 91 showPopup(value, pre) {
...@@ -103,13 +108,31 @@ export default { ...@@ -103,13 +108,31 @@ export default {
103 this.closeBtn(); 108 this.closeBtn();
104 }, 109 },
105 donateBook() { 110 donateBook() {
106 - console.warn(this.donate_name); 111 + // 爱心捐书接口
107 - console.warn(this.donate_number); 112 + axios.post('/srv/?a=add_donate', {
108 - this.closeBtn(); 113 + book_id: this.item.book_id,
114 + qty: this.donate_number,
115 + donate_name: this.donate_name,
116 + })
117 + .then(res => {
118 + if (res.data.code === 1) {
119 + console.warn(res.data.data);
120 + this.closeBtn();
109 121
110 - // 交易成功跳转回调页面 122 + // 交易成功跳转回调页面
111 - this.$router.push({ 123 + this.$router.push({
112 - path: '/client/wechatpayCallback' 124 + path: '/client/wechatpayCallback'
125 + })
126 + } else {
127 + console.warn(res);
128 + Toast({
129 + icon: 'close',
130 + message: res.data.msg
131 + });
132 + }
133 + })
134 + .catch(err => {
135 + console.error(err);
113 }) 136 })
114 }, 137 },
115 } 138 }
...@@ -172,4 +195,4 @@ export default { ...@@ -172,4 +195,4 @@ export default {
172 flex: 1; 195 flex: 1;
173 padding: 0 0.5rem; 196 padding: 0 0.5rem;
174 } 197 }
175 -</style>
...\ No newline at end of file ...\ No newline at end of file
198 +</style>
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
9 <span style="font-size: 0.8rem; color: #272727;">尊敬的</span> 9 <span style="font-size: 0.8rem; color: #272727;">尊敬的</span>
10 </van-col> 10 </van-col>
11 <van-col> 11 <van-col>
12 - <div style="color: #713610; padding: 1rem;" class="van-hairline--bottom">{{ name }}</div> 12 + <div style="color: #713610; padding: 1rem;" class="van-hairline--bottom">{{ item.name }}</div>
13 </van-col> 13 </van-col>
14 <van-col>:</van-col> 14 <van-col>:</van-col>
15 </van-row> 15 </van-row>
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
19 </div> 19 </div>
20 <div class="price"> 20 <div class="price">
21 <div>爱心捐赠</div> 21 <div>爱心捐赠</div>
22 - <div>{{ price }}&nbsp;元</div> 22 + <div>{{ item.amt }}&nbsp;元</div>
23 </div> 23 </div>
24 <div class="organizer"> 24 <div class="organizer">
25 <div class="wrapper"> 25 <div class="wrapper">
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
33 </div> 33 </div>
34 </div> 34 </div>
35 </div> 35 </div>
36 - <div class="date">{{ datetime }}</div> 36 + <div class="date">{{ item.donate_date }}</div>
37 </div> 37 </div>
38 </template> 38 </template>
39 39
...@@ -60,6 +60,7 @@ import mixin from 'common/mixin'; ...@@ -60,6 +60,7 @@ import mixin from 'common/mixin';
60 60
61 export default { 61 export default {
62 mixins: [mixin.init], 62 mixins: [mixin.init],
63 + props: ['item'],
63 data() { 64 data() {
64 return { 65 return {
65 name: '杨桐桐', 66 name: '杨桐桐',
...@@ -132,4 +133,4 @@ export default { ...@@ -132,4 +133,4 @@ export default {
132 padding-right: 2rem; 133 padding-right: 2rem;
133 } 134 }
134 } 135 }
135 -</style>
...\ No newline at end of file ...\ No newline at end of file
136 +</style>
......
...@@ -16,7 +16,6 @@ axios.interceptors.request.use( ...@@ -16,7 +16,6 @@ axios.interceptors.request.use(
16 // 绑定默认请求头 16 // 绑定默认请求头
17 config.params = _.merge(config.params, { 17 config.params = _.merge(config.params, {
18 f: 'voice', 18 f: 'voice',
19 - client_id: '313939'
20 }) 19 })
21 return config; 20 return config;
22 }, 21 },
......
...@@ -75,7 +75,7 @@ ...@@ -75,7 +75,7 @@
75 <span style="font-size: 0.85rem;">订阅</span> 75 <span style="font-size: 0.85rem;">订阅</span>
76 </div> 76 </div>
77 <div class="button"> 77 <div class="button">
78 - <my-button @on-click="payFor" type="plain">爱心捐书</my-button> 78 + <my-button @on-click="toDonate" type="plain">爱心捐书</my-button>
79 </div> 79 </div>
80 <div class="button"> 80 <div class="button">
81 <my-button @on-click="uploadVideo" type="primary">上传作品</my-button> 81 <my-button @on-click="uploadVideo" type="primary">上传作品</my-button>
...@@ -91,6 +91,9 @@ ...@@ -91,6 +91,9 @@
91 <p>请前往个人中心进行实名认证</p> 91 <p>请前往个人中心进行实名认证</p>
92 </div> 92 </div>
93 </notice-overlay> 93 </notice-overlay>
94 +
95 + <donate-book :showPopup="showDonate" :item="donateItem" @on-close="closeDonate"></donate-book>
96 +
94 </template> 97 </template>
95 98
96 <script setup> 99 <script setup>
...@@ -100,6 +103,7 @@ import { useVideoList } from '@/composables/useVideoList.js' ...@@ -100,6 +103,7 @@ import { useVideoList } from '@/composables/useVideoList.js'
100 import MyButton from '@/components/MyButton/index.vue' 103 import MyButton from '@/components/MyButton/index.vue'
101 import VideoCard from '@/components/VideoCard/index.vue' 104 import VideoCard from '@/components/VideoCard/index.vue'
102 import NoticeOverlay from '@/components/NoticeOverlay/index.vue' 105 import NoticeOverlay from '@/components/NoticeOverlay/index.vue'
106 +import DonateBook from '@/components/DonateBook/index.vue'
103 107
104 import icon_video from '@images/video.png' 108 import icon_video from '@images/video.png'
105 import icon_up from '@images/icon-guanbi@2x.png' 109 import icon_up from '@images/icon-guanbi@2x.png'
...@@ -168,11 +172,26 @@ const onSubscribe = () => { ...@@ -168,11 +172,26 @@ const onSubscribe = () => {
168 }) 172 })
169 } 173 }
170 174
171 -// 爱心捐书 175 +/*************** 捐书模块START ***************/
172 -// TODO: 需要联调捐书接口 176 +const donateItem = ref({})
173 -const payFor = () => { 177 +// 弹出捐赠弹框模块
174 - console.warn('弹出框'); 178 +const showDonate = ref(false);
179 +
180 +const toDonate = () => {
181 + showDonate.value = true;
182 + // 捐书数据
183 + donateItem.value = {
184 + book_id: $route.query.id,
185 + avatar: bookInfo.value.cover,
186 + name: bookInfo.value.name,
187 + price: bookInfo.value.price
188 + }
189 +}
190 +
191 +const closeDonate = (v) => {
192 + showDonate.value = v;
175 } 193 }
194 +/**********************************/
176 195
177 // 跳转个人中心 196 // 跳转个人中心
178 const onSubmit = () => { 197 const onSubmit = () => {
...@@ -197,9 +216,12 @@ const uploadVideo = () => { ...@@ -197,9 +216,12 @@ const uploadVideo = () => {
197 if (res.data.code === 1) { 216 if (res.data.code === 1) {
198 // 实名认证标识 217 // 实名认证标识
199 if (res.data.data.can_upload) { 218 if (res.data.data.can_upload) {
200 - // TODO: 上传视频直接跳转?不需要表示判断是上传哪个幼儿园吗? 219 + // 已读隐私条例,直接跳转上传页面
201 - if (Cookies.get('privacy_notice')) { // 已读隐私条例,直接跳转上传页面 220 + if (Cookies.get('privacy_notice')) {
202 - location.href = 'https://jinshuju.net/f/NAGn1D'; 221 + // x_field_1是金数据表单传入的参数,家长上传的格式为:book_id-perf_id,perf_id是当前缺省的儿童id
222 + let default_perf = Cookies.get('default_perf') ? JSON.parse(Cookies.get('default_perf')) : '';
223 + let str = `${$route.query.id}-${default_perf.perf_id}`
224 + location.href = `https://jinshuju.net/f/NAGn1D?x_field_1=${str}`;
203 } else { 225 } else {
204 $router.push({ 226 $router.push({
205 path: '/client/privacyNotice' 227 path: '/client/privacyNotice'
......
1 <template> 1 <template>
2 <div class="donate-certificate-page content-bg"> 2 <div class="donate-certificate-page content-bg">
3 - <donate-cert></donate-cert> 3 + <donate-cert :item="certItem"></donate-cert>
4 </div> 4 </div>
5 + <shortcut-fixed type="C" :item="shortcutItem"></shortcut-fixed>
5 </template> 6 </template>
6 7
7 <script setup> 8 <script setup>
8 import DonateCert from '@/components/DonateCert/index.vue' 9 import DonateCert from '@/components/DonateCert/index.vue'
10 +import ShortcutFixed from '@/components/ShortcutFixed/index.vue'
9 11
10 import { ref, reactive, onMounted } from 'vue' 12 import { ref, reactive, onMounted } from 'vue'
11 import { useRoute, useRouter } from 'vue-router' 13 import { useRoute, useRouter } from 'vue-router'
...@@ -15,11 +17,30 @@ import { Toast } from 'vant'; ...@@ -15,11 +17,30 @@ import { Toast } from 'vant';
15 const $route = useRoute(); 17 const $route = useRoute();
16 const $router = useRouter(); 18 const $router = useRouter();
17 19
18 -// TODO: 捐款成功后,查询生成捐赠证书 20 +// 配置快捷跳转条
21 +const shortcutItem = ref(['home']);
19 22
20 - onMounted(() => { 23 +const certItem = ref('')
21 - 24 +// TODO: 捐款成功后,查询生成捐赠证书
22 - }) 25 +axios.get('/srv/?a=one_cert', {
26 + params: {
27 + donate_id: $route.query.donate_id
28 + }
29 +})
30 +.then(res => {
31 + if (res.data.code === 1) {
32 + certItem.value = res.data.data;
33 + } else {
34 + console.warn(res);
35 + Toast({
36 + icon: 'close',
37 + message: res.data.msg
38 + });
39 + }
40 +})
41 +.catch(err => {
42 + console.error(err);
43 +})
23 </script> 44 </script>
24 45
25 <script> 46 <script>
...@@ -47,4 +68,4 @@ export default { ...@@ -47,4 +68,4 @@ export default {
47 height: 96vh; 68 height: 96vh;
48 padding: 2vh; 69 padding: 2vh;
49 } 70 }
50 -</style>
...\ No newline at end of file ...\ No newline at end of file
71 +</style>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
18 </div> 18 </div>
19 </div> 19 </div>
20 20
21 - <donate-book :showPopup="showDonate" @on-close="closeDonate"></donate-book> 21 + <donate-book :showPopup="showDonate" :item="donateItem" @on-close="closeDonate"></donate-book>
22 </template> 22 </template>
23 23
24 <script setup> 24 <script setup>
...@@ -35,16 +35,29 @@ import { Toast } from 'vant'; ...@@ -35,16 +35,29 @@ import { Toast } from 'vant';
35 const $route = useRoute(); 35 const $route = useRoute();
36 const $router = useRouter(); 36 const $router = useRouter();
37 37
38 -// TODO: 作品上传完成后,回调到成功页面 38 +/*************** 捐书模块START ***************/
39 +const donateItem = ref({})
39 40
41 +// TODO: 作品上传完成后,回调到成功页面,需要返回书籍的详情
40 // 弹出捐赠弹框模块 42 // 弹出捐赠弹框模块
41 const showDonate = ref(false); 43 const showDonate = ref(false);
42 -const closeDonate = (v) => { // 查看更多回复 44 +
43 - showDonate.value = v;
44 -}
45 const toDonate = () => { 45 const toDonate = () => {
46 showDonate.value = true; 46 showDonate.value = true;
47 + // TODO: 这些信息到时候需要后台带过来
48 + donateItem.value = {
49 + book_id: '314134',
50 + avatar: 'https://lanhu.oss-cn-beijing.aliyuncs.com/SketchPngc434046fdf1f9499d251b280af2568ddbe64839799d00a9aee226edbeb710aed',
51 + name: '逃家小兔绘本',
52 + price: '59'
53 + }
47 } 54 }
55 +
56 +const closeDonate = (v) => {
57 + showDonate.value = v;
58 +}
59 +/**********************************/
60 +
48 const goBack = () => { 61 const goBack = () => {
49 $router.push({ 62 $router.push({
50 path: '/client/bookDetail' 63 path: '/client/bookDetail'
...@@ -81,4 +94,4 @@ export default { ...@@ -81,4 +94,4 @@ export default {
81 color: #222222; 94 color: #222222;
82 text-align: center; 95 text-align: center;
83 } 96 }
84 -</style>
...\ No newline at end of file ...\ No newline at end of file
97 +</style>
......
...@@ -52,9 +52,13 @@ export default { ...@@ -52,9 +52,13 @@ export default {
52 }, 52 },
53 methods: { 53 methods: {
54 getCert () { 54 getCert () {
55 + // TODO: 需要获取 donate_id
55 // 跳转到捐赠证书页面,替换掉当前页面,不能返回这个页面 56 // 跳转到捐赠证书页面,替换掉当前页面,不能返回这个页面
56 this.$router.replace({ 57 this.$router.replace({
57 - path: '/client/donateCertificate' 58 + path: '/client/donateCertificate',
59 + query: {
60 + donate_id: '314358' // 测试默认值
61 + }
58 }); 62 });
59 } 63 }
60 } 64 }
......