paper-question-hand.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <div class="text-main mb-3">
  3. 当前查询知识点(从左侧选择):<el-text type="primary font-bold">{{ knowledgeNode?.name }}</el-text>
  4. </div>
  5. <div class="flex flex-row items-center gap-3">
  6. <el-input v-model="keywordLocal" clearable prefix-icon="search" placeholder="输入题目关键字-回车触发搜索"
  7. style="width: 250px" @keydown.enter="confirmKeyword" @clear="confirmKeyword"/>
  8. <el-select v-model="qtpye" clearable style="width: 220px">
  9. <el-option v-for="t in qTypes" :value="t.dictValue" :label="t.dictLabel"></el-option>
  10. </el-select>
  11. <el-popover width="250">
  12. <span v-if="currentSubject" class="text-sm font-bold">科目:{{ currentSubject.subjectName }}</span>
  13. <div v-for="g in groupedQuestions" class="flex flex-col">
  14. <el-divider style="margin: 10px 0"/>
  15. <span>{{ g.qtpye }}:{{ g.questions.length }}道</span>
  16. <el-link type="danger" plain icon="delete" class="self-end" @click="removeQuestionGroup(g.qtpye)">清除
  17. </el-link>
  18. </div>
  19. <el-divider style="margin: 10px 0"/>
  20. <div class="flex items-center justify-between">
  21. <el-link type="danger" plain icon="delete" @click="clearCart">全部清除</el-link>
  22. <el-button type="primary">生成试卷</el-button>
  23. </div>
  24. <template #reference>
  25. <el-button type="primary" size="large" icon="shopping-cart" class="ml-auto">试题篮({{
  26. cart.length
  27. }})
  28. </el-button>
  29. </template>
  30. </el-popover>
  31. </div>
  32. <el-divider/>
  33. <el-empty v-if="total==0"/>
  34. <template v-else v-for="q in questionList">
  35. <question-content :question="q" @parse="showParseQuestion=q,showParse=true">
  36. <el-button v-if="!hasQuestion(q)" type="primary" icon="plus" class="ml-auto" @click="addQuestion(q)">
  37. 加入试题篮
  38. </el-button>
  39. <el-button v-else type="danger" plain icon="delete" class="ml-auto" @click="removeQuestion(q)">移出试题篮
  40. </el-button>
  41. </question-content>
  42. <el-divider/>
  43. </template>
  44. <pagination v-show="total>0" :total="total" v-model:page="pageNum" v-model:limit="pageSize"
  45. @pagination="getQuestionList"/>
  46. <el-dialog v-model="showParse" append-to-body show-close @close="showParse=false">
  47. <template #title>ID:{{ showParseQuestion.id }} 试题解析</template>
  48. <div v-if="showParseQuestion.answer0" v-html="`【正确答案】` + showParseQuestion.answer0"/>
  49. <div v-if="showParseQuestion.parse" v-html="`【解析】` + showParseQuestion.parse" class="mt-5"></div>
  50. <div v-if="showParseQuestion.parse0" v-html="`【解析】` + showParseQuestion.parse0" class="mt-5"></div>
  51. <template #footer>
  52. <el-button type="primary" @click="showParse=false">确 定</el-button>
  53. </template>
  54. </el-dialog>
  55. </template>
  56. <script setup name="PaperQuestionHand">
  57. import {useProvidePaperQuestionCondition} from "@/views/dz/papers/hooks/usePaperQuestionCondition.js";
  58. import {useInjectPaperExactCondition} from "@/views/dz/papers/hooks/usePaperExactCondition.js";
  59. import {useInjectPaperFullCondition} from "@/views/dz/papers/hooks/usePaperFullCondition.js";
  60. import QuestionContent from "@/views/components/question-content.vue";
  61. const props = defineProps({
  62. allowMultiple: Boolean,
  63. exactMode: Boolean
  64. })
  65. const showParse = ref(false)
  66. const showParseQuestion = ref(null)
  67. const {knowledgeNode} = props.exactMode ? useInjectPaperExactCondition() : useInjectPaperFullCondition()
  68. const {
  69. keyword,
  70. qtpye,
  71. qTypes,
  72. pageNum,
  73. pageSize,
  74. total,
  75. questionList,
  76. getQuestionList,
  77. cart,
  78. groupedQuestions,
  79. currentSubject,
  80. hasQuestion,
  81. addQuestion,
  82. removeQuestion,
  83. removeQuestionGroup,
  84. clearCart
  85. } = useProvidePaperQuestionCondition(props.exactMode, props.allowMultiple)
  86. const keywordLocal = ref('')
  87. const confirmKeyword = (val) => keyword.value = keywordLocal.value
  88. </script>
  89. <style scoped>
  90. </style>