index.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <!-- 个人题库 -->
  2. <template>
  3. <div class="personal">
  4. <HomeCommon ref="common" :data="exercise_list" :total="total_count" @getList="pageQueryExerciseList">
  5. <template #default>
  6. <el-table-column prop="index" label="序号" width="65">
  7. <template slot-scope="{ $index }">{{ $index + 1 }}</template>
  8. </el-table-column>
  9. <el-table-column prop="name" label="练习名称" width="180" />
  10. <el-table-column prop="tag" label="标签" width="120">
  11. <template slot-scope="{ row }">
  12. <span v-for="(item, i) in row.label_list" :key="i" class="tag">{{ item }}</span>
  13. </template>
  14. </el-table-column>
  15. <el-table-column prop="creator_name" label="创建者" width="120" />
  16. <el-table-column prop="create_time" label="创建时间" width="140" />
  17. <el-table-column prop="last_modifier_name" label="最近编辑" width="100" />
  18. <el-table-column prop="last_modify_time" label="最近编辑时间" width="140" />
  19. <el-table-column prop="intro" label="简介" width="200" />
  20. <el-table-column label="状态" width="90">
  21. <template slot-scope="{ row }">
  22. <span :class="statusList[row.status].class">{{ statusList[row.status].name }}</span>
  23. </template>
  24. </el-table-column>
  25. <el-table-column prop="operation" label="操作">
  26. <template slot-scope="{ row }">
  27. <span class="link" @click="$router.push({ path: '/exercise', query: { id: row.id } })">编辑</span>
  28. <span class="link">分享</span>
  29. <span class="link">公开</span>
  30. <span class="link danger" @click="deleteExercise(row.id)">删除</span>
  31. </template>
  32. </el-table-column>
  33. </template>
  34. <template #operation>
  35. <el-button type="primary" @click="createExercise">创建练习</el-button>
  36. </template>
  37. <template #search>
  38. <span class="search-name">搜索</span>
  39. <el-input
  40. v-model="searchData.search_content"
  41. placeholder="全部"
  42. suffix-icon="el-icon-search"
  43. @keyup.enter.native="getPageList"
  44. />
  45. <span class="search-name">创建者</span>
  46. <el-input v-model="searchData.creator_name" placeholder="请输入内容" @keyup.enter.native="getPageList" />
  47. <span class="search-name">状态</span>
  48. <el-select v-model="searchData.status_list" multiple placeholder="全部" @change="getPageList">
  49. <el-option v-for="{ label, value } in statusType" :key="value" :label="label" :value="value" />
  50. </el-select>
  51. </template>
  52. </HomeCommon>
  53. <CreateExercise :dialog-visible.sync="dialogVisible" />
  54. </div>
  55. </template>
  56. <script>
  57. import { PageQueryExerciseList, DeleteExercise } from '@/api/exercise';
  58. import HomeCommon from '../common.vue';
  59. import CreateExercise from './CreateExercise.vue';
  60. export default {
  61. name: 'PersonalQuestion',
  62. components: {
  63. HomeCommon,
  64. CreateExercise
  65. },
  66. data() {
  67. return {
  68. // 搜索数据
  69. searchData: {
  70. search_content: '',
  71. creator_name: '',
  72. status_list: []
  73. },
  74. statusType: [
  75. { label: '未发布', value: 0 },
  76. { label: '已发布', value: 1 }
  77. ],
  78. statusList: [
  79. { name: '未发布', class: 'unpublished' },
  80. { name: '已发布', class: 'published' }
  81. ],
  82. // 表格数据
  83. exercise_list: [],
  84. total_count: 0, // 总条数
  85. dialogVisible: false
  86. };
  87. },
  88. methods: {
  89. getPageList() {
  90. this.$refs.common.getList();
  91. },
  92. pageQueryExerciseList(data) {
  93. PageQueryExerciseList({ ...data, store_type: 1, ...this.searchData }).then(({ total_count, exercise_list }) => {
  94. this.total_count = total_count;
  95. this.exercise_list = exercise_list;
  96. });
  97. },
  98. deleteExercise(exercise_id) {
  99. DeleteExercise({ exercise_id })
  100. .then(() => {
  101. this.$message.success('删除成功');
  102. this.getPageList();
  103. })
  104. .catch(() => {
  105. this.$message.error('删除失败');
  106. });
  107. },
  108. createExercise() {
  109. this.dialogVisible = true;
  110. }
  111. }
  112. };
  113. </script>
  114. <style lang="scss" scoped>
  115. .personal {
  116. height: 100%;
  117. .unpublished,
  118. .published {
  119. display: flex;
  120. align-items: center;
  121. &::before {
  122. display: inline-block;
  123. width: 6px;
  124. height: 6px;
  125. margin-right: 8px;
  126. content: '';
  127. border-radius: 50%;
  128. }
  129. }
  130. .published {
  131. &::before {
  132. background-color: $main-color;
  133. }
  134. }
  135. .unpublished {
  136. &::before {
  137. background-color: $danger-color;
  138. }
  139. }
  140. }
  141. </style>