index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <ie-page>
  3. <z-paging ref="paging" v-model="knowledgeList" :auto="false" :loading-more-enabled="false"
  4. :safe-area-inset-bottom="true" :hide-no-more-by-limit="10" @query="handleQuery">
  5. <template #top>
  6. <ie-navbar title="视频课程" />
  7. <uv-tabs :current="current" keyName="label" :list="subjects" :scrollable="false" @change="handleTabChange" />
  8. <uv-line margin="0" />
  9. </template>
  10. <view class="h-[8px] bg-back" />
  11. <uv-collapse ref="collapse" :border="false">
  12. <uv-collapse-item v-for="item in knowledgeList" :key="item.code" :data="item" :duration="200" :lazy="true" :load="handleLoad">
  13. <template #title="{ expanded, loading }">
  14. <view class="flex items-center justify-between">
  15. <view class="flex items-center gap-10">
  16. <uv-icon name="arrow-right" size="14" color="#888" custom-class="transition-transform duration-300"
  17. :class="{ 'rotate-90': expanded }" />
  18. <uv-loading-icon v-if="loading" mode="spinner" size="16"></uv-loading-icon>
  19. <view>{{ item.label }}</view>
  20. </view>
  21. </view>
  22. </template>
  23. <template #right-icon>
  24. <view></view>
  25. </template>
  26. <template #default="{ expanded }">
  27. <view class="pl-20">
  28. <view v-for="child in item.children" :key="child.name" class="flex items-center gap-20 mb-20">
  29. <ie-image :src="child.img" custom-class="w-100 h-64" />
  30. <view class="flex-1 min-w-1 ellipsis-1 text-28 text-fore-title">{{ child.name }}</view>
  31. <view
  32. class="px-20 py-8 border border-solid border-primary rounded-full text-24 text-primary flex items-center gap-8"
  33. @click.stop="handlePlay(item, child)">
  34. <uv-icon name="play-circle" size="16" color="var(--primary-color)" />
  35. <text>播放</text>
  36. </view>
  37. </view>
  38. </view>
  39. </template>
  40. </uv-collapse-item>
  41. </uv-collapse>
  42. </z-paging>
  43. </ie-page>
  44. </template>
  45. <script lang="ts" setup>
  46. import { getVideoCourseSubjects, getVideoCourseKnowledges, getVideoCourseList } from '@/api/modules/study';
  47. import type { Study } from '@/types';
  48. import { useTransferPage } from '@/hooks/useTransferPage';
  49. const { transferTo, routes } = useTransferPage();
  50. const paging = ref<ZPagingInstance>();
  51. const subjects = ref<Study.VideoCourseSubject[]>([]);
  52. const current = ref(0);
  53. const knowledgeList = ref<Study.VideoCourseKnowledge[]>([]);
  54. const handleQuery = (page: number, size: number) => {
  55. getVideoCourseKnowledges(subjects.value[current.value].code).then(res => {
  56. paging.value?.completeByNoMore(res.rows, true);
  57. });
  58. }
  59. const handleTabChange = (e: any) => {
  60. current.value = e.index;
  61. paging.value?.reload();
  62. }
  63. const handlePlay = (parent: Study.VideoCourseKnowledge, data: Study.VideoCourse) => {
  64. transferTo(routes.pageCourseVideoPlay, {
  65. data: {
  66. knowledge: parent,
  67. video: data,
  68. }
  69. });
  70. }
  71. const handleLoad = async (data: Study.VideoCourseKnowledge, callback: () => {}) => {
  72. const queryParams = {
  73. pageNum: 1,
  74. pageSize: 1000,
  75. subject: subjects.value[current.value].code,
  76. knowledge: data.code,
  77. } as Study.VideoCourseRequestDTO;
  78. getVideoCourseList(queryParams).then(res => {
  79. data.children = res.rows;
  80. callback();
  81. });
  82. }
  83. const loadData = async () => {
  84. const queryParams = {
  85. pageNum: 1,
  86. pageSize: 1000,
  87. type: 1,
  88. } as Study.VideoCourseSubjectRequestDTO;
  89. getVideoCourseSubjects(queryParams).then(res => {
  90. subjects.value = res.rows;
  91. setTimeout(() => {
  92. paging.value?.reload();
  93. }, 100);
  94. });
  95. }
  96. onLoad(() => {
  97. loadData();
  98. });
  99. </script>