LessonDetails.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <template>
  2. <div class="section-list">
  3. <div v-for="section in pagedSections" :key="section.id" class="section-block">
  4. <div class="section-title">{{ section.title }}</div>
  5. <div v-for="lesson in section.lessons" :key="lesson.id" class="lesson-row">
  6. <div class="lesson-cover">
  7. <a-avatar shape="square" :size="48" icon="play-circle" />
  8. </div>
  9. <div class="lesson-info">
  10. <div class="lesson-title">{{ lesson.title }}</div>
  11. <div class="lesson-meta">
  12. <span>时长:{{ lesson.duration }}</span>
  13. <span>视频大小:{{ lesson.size }}</span>
  14. <span>发布时间:{{ lesson.publishTime }}</span>
  15. <span>发布人:{{ lesson.author }}</span>
  16. </div>
  17. </div>
  18. <div class="lesson-actions">
  19. <EditOutlined class="action-icon" @click="$emit('edit-lesson', lesson)" />
  20. <DeleteOutlined class="action-icon" @click="$emit('delete-lesson', lesson)" />
  21. </div>
  22. </div>
  23. </div>
  24. <!-- 分页 -->
  25. <div class="pagination-box">
  26. <a-pagination
  27. :current="currentPage"
  28. :page-size="pageSize"
  29. :total="sectionsLength"
  30. @change="$emit('page-change', $event)"
  31. show-quick-jumper
  32. :show-total="(total) => `共${total}章`"
  33. />
  34. <a-select
  35. v-model:value="localPageSize"
  36. style="width: 100px; margin-left: 16px"
  37. @change="emits('page-size-change', $event)"
  38. >
  39. <a-select-option :value="5">5/页</a-select-option>
  40. <a-select-option :value="10">10/页</a-select-option>
  41. </a-select>
  42. </div>
  43. </div>
  44. </template>
  45. <script setup>
  46. import { defineProps, defineEmits, ref, watch } from 'vue'
  47. import { EditOutlined, DeleteOutlined } from '@ant-design/icons-vue'
  48. const props = defineProps({
  49. pagedSections: Array,
  50. currentPage: Number,
  51. pageSize: Number,
  52. sectionsLength: Number
  53. })
  54. const emits = defineEmits(['edit-lesson', 'delete-lesson', 'page-change', 'page-size-change'])
  55. const localPageSize = ref(props.pageSize)
  56. watch(
  57. () => props.pageSize,
  58. (newVal) => {
  59. localPageSize.value = newVal
  60. }
  61. )
  62. </script>
  63. <style scoped>
  64. .section-list {
  65. width: 1200px;
  66. margin: 0 auto;
  67. background: #fff;
  68. border-radius: 0 0 12px 12px;
  69. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.04);
  70. padding: 1px 32px 32px 32px;
  71. }
  72. .section-block {
  73. margin-top: 32px;
  74. }
  75. .section-title {
  76. font-size: 16px;
  77. font-weight: 600;
  78. color: #222;
  79. margin-bottom: 18px;
  80. }
  81. .lesson-row {
  82. display: flex;
  83. align-items: center;
  84. background: #f7f8fa;
  85. border-radius: 8px;
  86. margin-bottom: 16px;
  87. padding: 16px 24px;
  88. box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.03);
  89. transition: box-shadow 0.2s;
  90. }
  91. .lesson-row:hover {
  92. box-shadow: 0 4px 16px 0 rgba(52, 122, 255, 0.08);
  93. background: #f0f6ff;
  94. }
  95. .lesson-cover {
  96. margin-right: 20px;
  97. }
  98. .lesson-cover .ant-avatar {
  99. background: #e6e9ef;
  100. font-size: 24px;
  101. }
  102. .lesson-info {
  103. flex: 1;
  104. }
  105. .lesson-title {
  106. font-size: 15px;
  107. font-weight: 500;
  108. color: #222;
  109. margin-bottom: 6px;
  110. }
  111. .lesson-meta {
  112. font-size: 13px;
  113. color: #888;
  114. }
  115. .lesson-meta span {
  116. margin-right: 18px;
  117. }
  118. .lesson-actions {
  119. display: flex;
  120. align-items: center;
  121. }
  122. .action-icon {
  123. font-size: 18px;
  124. color: #347aff;
  125. margin-left: 18px;
  126. cursor: pointer;
  127. transition: color 0.2s;
  128. }
  129. .action-icon:hover {
  130. color: #1d5fd6;
  131. }
  132. .pagination-box {
  133. display: flex;
  134. align-items: center;
  135. justify-content: flex-end;
  136. margin-top: 32px;
  137. }
  138. .pagination-box .ant-pagination {
  139. margin-right: 16px;
  140. }
  141. .pagination-box .ant-select {
  142. min-width: 90px;
  143. }
  144. </style>