feat(checkin): 添加空状态提示并优化数据加载逻辑
在打卡页面添加了van-empty组件用于显示无数据状态 将数据加载逻辑拆分为独立函数,便于复用和维护 移除不再使用的mock数据,优化代码结构
Showing
1 changed file
with
37 additions
and
142 deletions
| 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"> | ... | ... |
-
Please register or login to post a comment