index.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <template>
  2. <div class="page_target page_search">
  3. <TargetSubject ></TargetSubject>
  4. <!-- 错题巩固 -->
  5. <div class="consolidate_item">
  6. <div class="left_filter">
  7. <div class="filter_list">
  8. <div class="list_check">
  9. <span class="label_name">范围:</span>
  10. <el-checkbox-group v-model="checkGrades">
  11. <el-checkbox :label="item.label" :value="item.value" v-for="item in gradeList" />
  12. </el-checkbox-group>
  13. </div>
  14. <div class="list_check">
  15. <span class="label_name">维度:</span>
  16. <el-checkbox-group v-model="checkDimension">
  17. <el-checkbox :label="item.label" :value="item.value" v-for="item in dimensionList" />
  18. </el-checkbox-group>
  19. </div>
  20. <div class="list_check">
  21. <span class="label_name">日期:</span>
  22. <el-date-picker
  23. class="data_picker"
  24. v-model="dataValue"
  25. type="daterange"
  26. range-separator="至"
  27. start-placeholder="开始日期"
  28. end-placeholder="结束日期">
  29. </el-date-picker>
  30. </div>
  31. </div>
  32. <div class="page_jg_10">
  33. </div>
  34. <div class="filter_tree">
  35. <div class="tree_title">
  36. 知识点树
  37. </div>
  38. <CommonTree
  39. ref="treeTestRef"
  40. :tree-data="mockTreeData"
  41. :tree-props="{ label: 'knowledgeName', children: 'children' }"
  42. node-key="id"
  43. show-checkbox
  44. :default-expand-all="false"
  45. @node-click="HandleTestNodeClick"
  46. @node-check="HandleTestNodeCheck"
  47. @ai-explain="HandleTestAiExplain"
  48. />
  49. </div>
  50. </div>
  51. <div class="right_list ">
  52. <div class="search_content">
  53. <div class="content_left">
  54. <span class="left_title">错题详情</span> <span>共50道题</span>
  55. </div>
  56. <div class="content_right">
  57. <el-button type="primary" >导出PDF</el-button>
  58. </div>
  59. </div>
  60. <div class="page_jg_20">
  61. </div>
  62. <div class="question_item" v-for="(item, index) in questionList" :key="index">
  63. <QuestionItem :question="item" :index="index+1"></QuestionItem>
  64. </div>
  65. <div class="page_jg_20">
  66. </div>
  67. </div>
  68. </div>
  69. </div>
  70. </template>
  71. <script>
  72. import TargetSubject from "@/views/targetImprove/components/TargetSubject.vue"//顶部筛选科目组件
  73. import QuestionItem from "@/views/targetImprove/components/QuestionItem.vue"//题目公共组件
  74. import CommonTree from '@/components/CommonTree.vue';//树形组件
  75. import { mapState } from 'vuex'
  76. export default {
  77. components: {
  78. TargetSubject,
  79. QuestionItem,
  80. CommonTree
  81. },
  82. data() {
  83. return {
  84. questionList: [
  85. {},{},{},{},{},{},{}
  86. ],
  87. courseList:[],//科目列表
  88. grades:[],//选择的年纪
  89. // gradeList:[],//年级列表
  90. dimensionList:[
  91. {
  92. label: '考试',
  93. value: 1
  94. },
  95. {
  96. label: '练习',
  97. value: 2
  98. }
  99. ],//维度列表维度 1考试 2练习
  100. checkGrades:[],//年级选择
  101. checkDimension:[],//维度选择
  102. dataValue:[],//时间选择
  103. mockTreeData:[],//知识点树形数据
  104. }
  105. },
  106. computed:{
  107. ...mapState('target', ['subjectCode']),
  108. gradeList()
  109. {
  110. return this.$store.state.target.gradesList;
  111. }
  112. },
  113. watch:{
  114. // 监听顶部的subjectCode变化
  115. subjectCode(newVal, oldVal){
  116. console.log('科目编码改变了', newVal, oldVal)
  117. // ========= 业务逻辑写这里 =========
  118. // 例如:切换科目,重置步骤、重新请求知识点图谱数据
  119. }
  120. },
  121. mounted()
  122. {
  123. console.log('打印科目编码', this.gradeList)
  124. // this.GetTargetErrorTopData();//获取错题筛选数据
  125. this.GetTargetErrorQuestionListData();//获取错题列表
  126. this.GetTargetErrorKnowledgeList();//获取知识点树形数据
  127. },
  128. methods: {
  129. // // 获取错题筛选数据
  130. // GetTargetErrorTopData()
  131. // {
  132. // this.$api.target.getTargetErrorTopData().then(res => {
  133. // console.log('打印学生端错题头部信息', res)
  134. // if(res.code==200)
  135. // {
  136. // let courseItem=res.data.filter(item => item.courseCode == this.subjectCode)[0];
  137. // console.log('打印课程信息', courseItem)
  138. // this.gradeList = courseItem.grades;
  139. // console.log('打印年级列表', this.gradeList)
  140. // }
  141. // });
  142. // },
  143. // 获取错题列表
  144. GetTargetErrorQuestionListData()
  145. {
  146. let params={
  147. pageParam: {
  148. pageNum: 1,
  149. pageSize: 10
  150. },
  151. knowledgeIds: ['123'],
  152. courseCode: this.subjectCode,
  153. gradeCodes: [7],
  154. types: [1,2],//维度 1考试 2练习
  155. beginAt: "",
  156. endAt: ""
  157. };
  158. this.$api.target.getTargetErrorQuestionListData(params).then(res => {
  159. console.log('打印错题列表', res)
  160. if(res.code == 200)
  161. {
  162. this.questionList = res.data.records || [{},{},{},{},{},{},{}];
  163. }
  164. });
  165. },
  166. // 获取知识点树形数据
  167. GetTargetErrorKnowledgeList()
  168. {
  169. let params={
  170. pageParam: {
  171. pageNum: 1,
  172. pageSize: 10
  173. },
  174. knowledgeIds: ['123'],
  175. courseCode: this.subjectCode,
  176. gradeCodes: [7],
  177. types: [1,2],//维度 1考试 2练习
  178. beginAt: "",
  179. endAt: ""
  180. };
  181. this.$api.target.getTargetErrorKnowledgeList(params).then().then(res => {
  182. console.log('打印知识点列表数据', res)
  183. if(res.code == 200)
  184. {
  185. this.mockTreeData=res.data || [];//知识点数据
  186. }
  187. });
  188. },
  189. /**
  190. * 【事件回传1】树节点点击(单选)
  191. * @param {Object} data - 当前节点用户数据
  192. * @param {Object} node - el-tree 节点实例
  193. */
  194. HandleTestNodeClick(data, node) {
  195. const logMsg =
  196. `节点ID: ${data.id}\n` +
  197. `节点名称: ${data.label}\n` +
  198. `节点层级: ${node.level}\n` +
  199. `是否叶子: ${node.isLeaf ? '是' : '否'}\n` +
  200. `计数count: ${data.count ?? '无'}\n` +
  201. `\n完整data: ${JSON.stringify(data, null, 2)}`;
  202. console.log('%c[KnowledgeGraph] node-click 回传数据: ', 'background:#2E64FA;color:#fff;padding:4px 8px;border-radius:4px;', { data, node });
  203. this.appendLog('info', '节点点击', logMsg);
  204. },
  205. /**
  206. * 【事件回传2】复选框勾选变化(多选)
  207. * @param {Object} data - 当前操作的节点数据
  208. * @param {Object} checkedInfo - 勾选状态详情 { checkedNodes, checkedKeys, halfCheckedKeys }
  209. */
  210. HandleTestNodeCheck(data, checkedInfo) {
  211. const selectedLabels = checkedInfo.checkedNodes.map(n => n.label).join('、') || '(无)';
  212. const logMsg =
  213. `当前操作节点: ${data.label}\n` +
  214. `已勾选节点数: ${checkedInfo.checkedNodes.length}\n` +
  215. `已勾选key: [${checkedInfo.checkedKeys.join(', ')}]\n` +
  216. `半选key: [${(checkedInfo.halfCheckedKeys || []).join(', ') || '无'}]\n` +
  217. `\n已勾选节点名称: ${selectedLabels}`;
  218. console.log('%c[KnowledgeGraph] node-check 回传数据: ', 'background:#3BA272;color:#fff;padding:4px 8px;border-radius:4px;', { data, checkedInfo });
  219. this.appendLog('success', '复选框勾选', logMsg);
  220. },
  221. /**
  222. * 【事件回传3】AI讲解按钮点击
  223. * @param {Object} payload { nodeData, nodeInstance, nodeKey, nodeLabel }
  224. */
  225. HandleTestAiExplain(payload) {
  226. const { nodeData, nodeKey, nodeLabel } = payload;
  227. const logMsg =
  228. `节点Key: ${nodeKey}\n` +
  229. `节点名称: ${nodeLabel}\n` +
  230. `节点层级: ${payload.nodeInstance.level}\n` +
  231. `计数count: ${nodeData.count ?? '无'}\n` +
  232. `\n完整节点数据: ${JSON.stringify(nodeData, null, 2)}`;
  233. console.log('%c[KnowledgeGraph] ai-explain 回传数据: ', 'background:#FAC858;color:#333;padding:4px 8px;border-radius:4px;', payload);
  234. this.appendLog('warn', 'AI讲解', logMsg);
  235. },
  236. }
  237. };
  238. </script>
  239. <style lang="scss" scoped>
  240. .consolidate_item
  241. {
  242. width: 100%;
  243. display: flex;
  244. justify-content: space-between;
  245. height: calc(100% - 50px);
  246. .left_filter
  247. {
  248. width: 320px;
  249. height: 100%;
  250. }
  251. .right_list
  252. {
  253. width: calc(100% - 330px);
  254. height: calc(100% - 10px);
  255. background: #fff;
  256. padding: 20px;
  257. overflow-y: auto;
  258. box-sizing: border-box;
  259. border-radius: 10px 10px 10px 10px;
  260. }
  261. }
  262. .question_item
  263. {
  264. background: #FFFFFF;
  265. border-radius: 10px 10px 10px 10px;
  266. border: 1px solid #DCDFE6;
  267. padding: 16px;
  268. box-sizing: border-box;
  269. margin-bottom: 20px;
  270. }
  271. </style>