index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <!-- 教材管理列表 -->
  2. <template>
  3. <CoursewareList
  4. :status-list="statusList"
  5. :current-status.sync="activeStatus"
  6. :total="total"
  7. @getList="queryMyProjectList_Leader"
  8. >
  9. <template #card>
  10. <div v-for="item in list" :key="item.id" class="prod-card">
  11. <div class="card-cover">
  12. <img v-if="item.cover_iamge_file_url.length > 0" :src="item.cover_iamge_file_url" alt="封面" />
  13. </div>
  14. <div class="card-right" @click="jumpToDetail(item.id)">
  15. <div class="card-name" :title="item.name">{{ item.name || '-' }}</div>
  16. <div class="card-meta">
  17. <div class="meta-row">
  18. <span class="meta-label">项目组长:</span>
  19. <div class="avatar-group">
  20. <div
  21. v-for="(name, idx) in splitMembers(item.leader_name_desc)"
  22. :key="`${item.id}-leader-${idx}`"
  23. class="mini-avatar"
  24. >
  25. {{ getFirstChar(name) }}
  26. </div>
  27. </div>
  28. </div>
  29. <div class="meta-row">
  30. <span class="meta-label">项目成员:</span>
  31. <div class="avatar-group">
  32. <div
  33. v-for="(name, idx) in splitMembers(item.member_name_desc)"
  34. :key="`${item.id}-member-${idx}`"
  35. class="mini-avatar"
  36. >
  37. {{ getFirstChar(name) }}
  38. </div>
  39. </div>
  40. </div>
  41. <div class="card-time">计划完成日期:{{ item.plan_publish_date || '-' }}</div>
  42. </div>
  43. <div class="card-bottom">
  44. <div class="progress-bar">
  45. <div class="fill" :style="{ width: `${item.progress_percent || 0}%` }"></div>
  46. </div>
  47. <span class="progress-text">{{ item.progress_percent || 0 }}%</span>
  48. <button class="status-btn" :class="statusClass(item)" type="button" @click.stop>
  49. {{ item.status_name || '-' }}
  50. </button>
  51. </div>
  52. </div>
  53. </div>
  54. </template>
  55. </CoursewareList>
  56. </template>
  57. <script>
  58. import CoursewareList from '@/components/CoursewareList.vue';
  59. import { PageQueryMyProjectList_Leader } from '@/api/list';
  60. export default {
  61. name: 'CoursewareProjectPage',
  62. components: {
  63. CoursewareList,
  64. },
  65. data() {
  66. return {
  67. list: [],
  68. page_capacity: 9,
  69. cur_page: 1,
  70. total: 0,
  71. activeStatus: 'all',
  72. statusList: [
  73. { key: 'all', label: '全部', status: -1 },
  74. { key: 'producing', label: '制作中', status: 0 },
  75. { key: 'reviewing', label: '审核中', status: 1 },
  76. { key: 'done', label: '已终审', status: 2 },
  77. { key: 'published', label: '已上架', status: 3 },
  78. ],
  79. };
  80. },
  81. created() {
  82. this.queryMyProjectList_Leader();
  83. },
  84. methods: {
  85. queryMyProjectList_Leader(data) {
  86. const params = {
  87. page_capacity: this.page_capacity,
  88. cur_page: this.cur_page,
  89. status: this.statusList.find((s) => s.key === this.activeStatus)?.status,
  90. };
  91. PageQueryMyProjectList_Leader({ ...params, ...data }).then(({ project_list, cur_page, total_count }) => {
  92. this.list = project_list || [];
  93. this.cur_page = cur_page || 1;
  94. this.total = total_count || 0;
  95. });
  96. },
  97. /**
  98. * 分割成员字符串为数组
  99. * @param {string} memberDesc - 成员描述字符串,格式为 "name1;name2;name3"
  100. * @returns {Array} 成员名称数组
  101. */
  102. splitMembers(memberDesc = '') {
  103. return memberDesc
  104. .split(';')
  105. .map((v) => v.trim())
  106. .filter(Boolean);
  107. },
  108. getFirstChar(name = '') {
  109. return name ? name.trim().slice(0, 1) : '-';
  110. },
  111. statusClass(item) {
  112. const n = Number(item.status);
  113. if (n === 0) return 'building';
  114. if (n === 1) return 'reviewing';
  115. if (n === 2) return 'done';
  116. return 'published';
  117. },
  118. jumpToDetail(id) {
  119. this.$router.push({ name: 'CoursewareDetail', params: { id }, query: { type: 'manage' } });
  120. },
  121. },
  122. };
  123. </script>
  124. <style lang="scss" scoped></style>