hookehuyr

feat(checkin): 添加空状态提示并优化数据加载逻辑

在打卡页面添加了van-empty组件用于显示无数据状态
将数据加载逻辑拆分为独立函数,便于复用和维护
移除不再使用的mock数据,优化代码结构
1 <!-- 1 <!--
2 - * @Date: 2025-05-29 15:34:17 2 + * @Date: 2025-05-29 15:34:17
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-06-06 18:27:24 4 + * @LastEditTime: 2025-06-06 20:29:45
5 * @FilePath: /mlaj/src/views/checkin/IndexCheckInPage.vue 5 * @FilePath: /mlaj/src/views/checkin/IndexCheckInPage.vue
6 - * @Description: 文件描述 6 + * @Description: 文件描述
7 ---> 7 + -->
8 -<template> 8 + <template>
9 <AppLayout :hasTitle="false"> 9 <AppLayout :hasTitle="false">
10 <van-config-provider :theme-vars="themeVars"> 10 <van-config-provider :theme-vars="themeVars">
11 <van-calendar :title="taskDetail.title" :poppable="false" :show-confirm="false" :style="{ height: '24rem' }" 11 <van-calendar :title="taskDetail.title" :poppable="false" :show-confirm="false" :style="{ height: '24rem' }"
...@@ -143,6 +143,7 @@ ...@@ -143,6 +143,7 @@
143 <span class="like-count">{{ post.likes }}</span> 143 <span class="like-count">{{ post.likes }}</span>
144 </div> 144 </div>
145 </div> 145 </div>
146 + <van-empty v-if="!checkinDataList.length" image="error" description="暂无数据" />
146 </div> 147 </div>
147 148
148 <div style="height: 5rem;"></div> 149 <div style="height: 5rem;"></div>
...@@ -322,131 +323,6 @@ const stopAllVideos = () => { ...@@ -322,131 +323,6 @@ const stopAllVideos = () => {
322 }); 323 });
323 }; 324 };
324 325
325 -// Mock数据
326 -const mockPosts = ref([
327 - {
328 - id: 1,
329 - user: {
330 - name: '图片预览',
331 - avatar: 'https://cdn.ipadbiz.cn/space/816560/大国少年_FhnF8lsFMPnTDNTBlM6hYa-UFBlW.jpg',
332 - time: '2小时前'
333 - },
334 - content: '今天完成了React基础课程的学习,收获满满!',
335 - images: [
336 - 'https://cdn.ipadbiz.cn/space/816560/大国少年_FhnF8lsFMPnTDNTBlM6hYa-UFBlW.jpg',
337 - 'https://cdn.ipadbiz.cn/mlaj/images/_6HzPU9Hyfg (2).jpg',
338 - 'https://cdn.ipadbiz.cn/space/816560/大国少年_FhnF8lsFMPnTDNTBlM6hYa-UFBlW.jpg',
339 - 'https://cdn.ipadbiz.cn/space/816560/大国少年_FhnF8lsFMPnTDNTBlM6hYa-UFBlW.jpg',
340 - ],
341 - videoList: [],
342 - isPlaying: false,
343 - audio: [],
344 - likes: 12,
345 - is_liked: false,
346 - },
347 - {
348 - id: 2,
349 - user: {
350 - name: '小林',
351 - avatar: 'https://cdn.ipadbiz.cn/space/816560/大国少年_FhnF8lsFMPnTDNTBlM6hYa-UFBlW.jpg',
352 - time: '2小时前'
353 - },
354 - content: '今天完成了React基础课程的学习,收获满满!',
355 - images: [],
356 - video: 'https://cdn.ipadbiz.cn/space/lk3DmvLO02dUC2zPiFwiClDe3nKL.mp4',
357 - videoList: [{
358 - id: 1,
359 - video: 'https://cdn.ipadbiz.cn/space/lk3DmvLO02dUC2zPiFwiClDe3nKL.mp4',
360 - videoCover: '',
361 - isPlaying: false,
362 - }, {
363 - id: 2,
364 - video: 'https://cdn.ipadbiz.cn/space/lk3DmvLO02dUC2zPiFwiClDe3nKL.mp4',
365 - videoCover: '',
366 - isPlaying: false,
367 - }],
368 - isPlaying: false,
369 - audio: [],
370 - likes: 12,
371 - is_liked: false,
372 - },
373 - {
374 - id: 3,
375 - user: {
376 - name: '小林',
377 - avatar: 'https://cdn.ipadbiz.cn/space/816560/大国少年_FhnF8lsFMPnTDNTBlM6hYa-UFBlW.jpg',
378 - time: '2小时前'
379 - },
380 - content: '今天完成了React基础课程的学习,收获满满!',
381 - images: [],
382 - videoList: [],
383 - isPlaying: false,
384 - audio: [
385 - {
386 - title: '学习心得分享1',
387 - artist: '',
388 - url: 'https://cdn.ipadbiz.cn/space/816560/双手合十迎客来_Fs2W-5mnQSFL8S5CDsHho-_xcvaY.mp3',
389 - cover: ''
390 - },
391 - {
392 - title: '学习心得分享2',
393 - artist: '',
394 - url: 'https://cdn.ipadbiz.cn/space/816560/双手合十迎客来_Fs2W-5mnQSFL8S5CDsHho-_xcvaY.mp3',
395 - cover: ''
396 - }
397 - ],
398 - likes: 12,
399 - is_liked: false,
400 - },
401 - {
402 - id: 4,
403 - user: {
404 - name: '小林',
405 - avatar: 'https://cdn.ipadbiz.cn/space/816560/大国少年_FhnF8lsFMPnTDNTBlM6hYa-UFBlW.jpg',
406 - time: '2小时前'
407 - },
408 - content: '今天完成了React基础课程的学习,收获满满!',
409 - images: [],
410 - videoList: [{
411 - id: 3,
412 - video: 'https://cdn.ipadbiz.cn/space/lk3DmvLO02dUC2zPiFwiClDe3nKL.mp4',
413 - videoCover: '',
414 - isPlaying: false,
415 - }, {
416 - id: 4,
417 - video: 'https://cdn.ipadbiz.cn/space/lk3DmvLO02dUC2zPiFwiClDe3nKL.mp4',
418 - videoCover: '',
419 - isPlaying: false,
420 - }],
421 - isPlaying: false,
422 - audio: [],
423 - likes: 12,
424 - is_liked: false,
425 - },
426 - {
427 - id: 5,
428 - user: {
429 - name: '小林',
430 - avatar: 'https://cdn.ipadbiz.cn/space/816560/大国少年_FhnF8lsFMPnTDNTBlM6hYa-UFBlW.jpg',
431 - time: '2小时前'
432 - },
433 - content: '今天完成了React基础课程的学习,收获满满!',
434 - images: [],
435 - videoList: [],
436 - isPlaying: false,
437 - audio: [
438 - {
439 - title: '学习心得分享',
440 - artist: '',
441 - url: 'https://cdn.ipadbiz.cn/space/816560/双手合十迎客来_Fs2W-5mnQSFL8S5CDsHho-_xcvaY.mp3',
442 - cover: ''
443 - }
444 - ],
445 - likes: 12,
446 - is_liked: false,
447 - },
448 -]);
449 -
450 const themeVars = { 326 const themeVars = {
451 calendarSelectedDayBackground: '#4caf50', 327 calendarSelectedDayBackground: '#4caf50',
452 calendarHeaderShadow: 'rgba(0, 0, 0, 0.1)', 328 calendarHeaderShadow: 'rgba(0, 0, 0, 0.1)',
...@@ -496,6 +372,9 @@ const formatter = (day) => { ...@@ -496,6 +372,9 @@ const formatter = (day) => {
496 372
497 const onSelectDay = (day) => { 373 const onSelectDay = (day) => {
498 console.warn('选择了日期', dayjs(day).format('YYYY-MM-DD')); 374 console.warn('选择了日期', dayjs(day).format('YYYY-MM-DD'));
375 + getTaskDetail(dayjs(day).format('YYYY-MM'));
376 + // 获取打卡动态列表
377 + initUploadTaskList(dayjs(day).format('YYYY-MM-DD'));
499 } 378 }
500 379
501 const onClickSubtitle = (evt) => { 380 const onClickSubtitle = (evt) => {
...@@ -593,7 +472,9 @@ const delCheckin = (post) => { ...@@ -593,7 +472,9 @@ const delCheckin = (post) => {
593 if (code) { 472 if (code) {
594 // 删除成功后,刷新页面 473 // 删除成功后,刷新页面
595 showSuccessToast('删除成功'); 474 showSuccessToast('删除成功');
596 - router.go(0); 475 + // router.go(0);
476 + // 删除post_id相应的数据
477 + checkinDataList.value = checkinDataList.value.filter(item => item.id !== post.id);
597 } else { 478 } else {
598 showErrorToast('删除失败'); 479 showErrorToast('删除失败');
599 } 480 }
...@@ -607,8 +488,8 @@ const taskDetail = ref({}); ...@@ -607,8 +488,8 @@ const taskDetail = ref({});
607 const myCheckinDates = ref([]); 488 const myCheckinDates = ref([]);
608 const checkinDataList = ref([]); 489 const checkinDataList = ref([]);
609 490
610 -onMounted(async () => { 491 +const getTaskDetail = async (month) => {
611 - const { code, data } = await getTaskDetailAPI({ i: route.query.id, month: dayjs().format('YYYY-MM') }); 492 + const { code, data } = await getTaskDetailAPI({ i: route.query.id, month });
612 if (code) { 493 if (code) {
613 console.warn(data); 494 console.warn(data);
614 taskDetail.value = data; 495 taskDetail.value = data;
...@@ -621,12 +502,26 @@ onMounted(async () => { ...@@ -621,12 +502,26 @@ onMounted(async () => {
621 return dayjs(date).date(); 502 return dayjs(date).date();
622 }) 503 })
623 } 504 }
624 - // 获取打卡动态列表 505 +}
625 - const task_list = await getUploadTaskListAPI({ task_id: route.query.id, date: dayjs().format('YYYY-MM-DD'), limit: 999 }); 506 +
626 - if (task_list.code) { 507 +const initUploadTaskList = async (date) => {
627 - console.warn(task_list.data?.checkin_list); 508 + const { code, data } = await getUploadTaskListAPI({ task_id: route.query.id, date, limit: 999 });
509 + if (code) {
510 + console.warn(data?.checkin_list);
628 // 整理数据结构 511 // 整理数据结构
629 - task_list.data?.checkin_list.forEach((item, index) => { 512 + checkinDataList.value = formatData(data)
513 + }
514 +}
515 +
516 +onMounted(async () => {
517 + getTaskDetail(dayjs().format('YYYY-MM'));
518 + // 获取打卡动态列表
519 + initUploadTaskList(dayjs().format('YYYY-MM-DD'));
520 +})
521 +
522 +const formatData = (data) => {
523 + let formattedData = [];
524 + formattedData = data?.checkin_list.map((item, index) => {
630 let images = []; 525 let images = [];
631 let audio = []; 526 let audio = [];
632 let videoList = []; 527 let videoList = [];
...@@ -653,7 +548,7 @@ onMounted(async () => { ...@@ -653,7 +548,7 @@ onMounted(async () => {
653 } 548 }
654 }) 549 })
655 } 550 }
656 - checkinDataList.value.push({ 551 + return {
657 id: item.id, 552 id: item.id,
658 task_id: item.task_id, 553 task_id: item.task_id,
659 user: { 554 user: {
...@@ -670,10 +565,10 @@ onMounted(async () => { ...@@ -670,10 +565,10 @@ onMounted(async () => {
670 is_liked: item.is_like, 565 is_liked: item.is_like,
671 is_my: item.is_my, 566 is_my: item.is_my,
672 file_type: item.file_type, 567 file_type: item.file_type,
673 - }) 568 + }
674 }) 569 })
675 - } 570 + return formattedData;
676 -}) 571 +}
677 </script> 572 </script>
678 573
679 <style lang="less"> 574 <style lang="less">
......