Jelajahi Sumber

错题巩固更新 增加年级list

dengshaobo 3 hari lalu
induk
melakukan
89176b1ca3

+ 1 - 1
src/http/api/target.js

@@ -24,7 +24,7 @@ const targetImprove = {
 
   //获取学生端错题知识点列表接口
   getTargetErrorKnowledgeList(data) {
-    return get( base.prefix+ `/api/v1/studentError/error_knowledge`, data)
+    return post( base.prefix+ `/api/v1/studentError/error_knowledge`, data)
   },
 
   //获取学生端知识点错题列表接口

+ 7 - 0
src/store/modules/target.js

@@ -2,6 +2,7 @@
 let state = {
   subjectList:JSON.parse(localStorage.getItem('student_subjectList') || '[]'),//顶部筛选的科目列表
   subjectCode:'',//顶部筛选的科目
+  gradesList:JSON.parse(localStorage.getItem('student_gradesList') || '[]'),//顶部筛选的年级列表
   levelCode:localStorage.getItem('level_code'),  //当前学段  
 };
 // 同步
@@ -17,6 +18,12 @@ let mutations = {
     // 存入本地存储
     localStorage.setItem('student_subjectList', JSON.stringify(list))
   },
+  // 设置年级列表,同时写入localStorage
+  SetGradesList(state, list) {
+    state.gradesList = list
+    // 存入本地存储
+    localStorage.setItem('student_gradesList', JSON.stringify(list))
+  },
   // 设置当前学段,同时本地存储
   SetLevelCode(state,code){
     state.levelCode = code

+ 60 - 0
src/styles/common.scss

@@ -11125,3 +11125,63 @@ body {
     background-position: 0% 0%;
   }
 }
+
+
+
+
+.filter_list
+{
+  width:100%;
+  height:auto;
+  padding: 10px;
+  background: #fff;
+  border-radius: 10px 10px 10px 10px;
+  box-sizing: border-box;
+  .list_check
+  {
+    display: flex;
+    align-items: center;
+    justify-content:flex-start;
+    height: 36px;
+    .label_name
+    {
+      font-weight: 550;
+      font-size: 14px;
+      color: #333;
+      padding-right: 10px;
+    }
+
+    .check_box
+    {
+      margin-left: 10px;
+    }
+
+    .data_picker
+    {
+      width: 240px;
+      height: 36px;
+      line-height: 36px;
+
+      padding: 0px 10px;
+    }
+  }
+}
+
+.filter_tree
+{
+  width:100%;
+  height:auto;
+  padding: 10px;
+  background: #fff;
+  border-radius: 10px 10px 10px 10px;
+  box-sizing: border-box;
+
+  .tree_title
+  {
+    font-weight: 550;
+    font-size: 16px;
+    color: #333333;
+    line-height: 25px;
+
+  }
+}

+ 0 - 0
src/styles/target.scss


+ 0 - 1
src/views/targetImprove/components/QuestionItem.vue

@@ -24,7 +24,6 @@
 import { mapGetters } from "vuex";
 export default {
   components: {
-
   },
   props: {
     questionData: {

+ 30 - 25
src/views/targetImprove/components/TargetSubject.vue

@@ -10,6 +10,8 @@ export default {
   components: {
     FiltersItem,
   },
+
+
   computed: {
    
   },
@@ -20,7 +22,7 @@ export default {
         {
           name:'科目名称',
           value:'1',
-          list:[],
+          list:this.$store.state.target.subjectList,
         },
       ],
     };
@@ -32,37 +34,40 @@ export default {
     
   },
   mounted() {
+   
     this.GetHeaderData();//获取头部数据
+    
   },
   methods: {
 
     // 获取头部数据
     GetHeaderData()
     {
-        if(this.$store.state.target.subjectList.length > 0)
-        {
-          this.filtersData[0].list = this.$store.state.target.subjectList;
-          
-        }
-        else
-        {
-            this.$api.target.getTargetHeaderData().then(res => {
-                if(res.code == 200)
-                {
-                    console.log("打印顶部筛选数据",res.data);
-                    let list=(res.data.subjectData || []).map(item => {
-                        return {
-                            label: item.subjectName,   // 后端显示文本,例如 "化学"
-                            value: item.subjectCode // 
-                        }
-                    });
-                    this.$store.commit('target/SetSubjectList', list)
-                    this.filtersData[0].list = list;
-                    this.$store.commit('target/SetLevelCode',res.data.levelCode)
-                    this.$store.commit('target/SetFilterSubjectCode', '1')  //目前同filtersData[0]的默认value一样是静态的
-                }
-            });
-        }
+        
+      this.$api.target.getTargetHeaderData().then(res => {
+          if(res.code == 200)
+          {
+              console.log("打印顶部筛选数据",res.data);
+              let list=(res.data.subjectData || []).map(item => {
+                  return {
+                      label: item.subjectName,   // 后端显示文本,例如 "化学"
+                      value: item.subjectCode // 
+                  }
+              });
+              let gradesList=(res.data.gradeData || []).map(item => {
+                  return {
+                      label: item.gradeName,   // 后端显示文本,例如 " chemistry"
+                      value: item.gradeCode // 
+                  }
+              });
+              this.$store.commit('target/SetSubjectList', list)
+              this.$store.commit('target/SetGradesList',gradesList)
+              this.filtersData[0].list = list;
+              this.$store.commit('target/SetLevelCode',res.data.levelCode)
+              this.$store.commit('target/SetFilterSubjectCode', '1')  //目前同filtersData[0]的默认value一样是静态的
+          }
+      });
+        
         
     },
     

+ 172 - 6
src/views/targetImprove/consolidate/index.vue

@@ -1,10 +1,55 @@
 <template>
   <div class="page_target page_search">
-    <TargetSubject></TargetSubject>
+    <TargetSubject ></TargetSubject>
     <!-- 错题巩固 -->
     <div class="consolidate_item">
       <div class="left_filter">
+        <div class="filter_list">
+          <div class="list_check">
+            <span class="label_name">范围:</span>
+            <el-checkbox-group v-model="checkGrades">
+              <el-checkbox :label="item.label" :value="item.value" v-for="item in gradeList" />
+              
+            </el-checkbox-group>
+          </div>
+          <div class="list_check">
+            <span class="label_name">维度:</span>
+            <el-checkbox-group v-model="checkDimension">
+              <el-checkbox :label="item.label" :value="item.value" v-for="item in dimensionList" />
+              
+            </el-checkbox-group>
+          </div>
+          <div class="list_check">
+            <span class="label_name">日期:</span>
+            <el-date-picker
+              class="data_picker"
+              v-model="dataValue"
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </div>
+        </div>
+        <div class="page_jg_10">
 
+        </div>
+        <div class="filter_tree">
+          <div class="tree_title">
+            知识点树
+          </div>
+          <CommonTree
+            ref="treeTestRef"
+            :tree-data="mockTreeData"
+            :tree-props="{ label: 'knowledgeName', children: 'children' }"
+            node-key="id"
+            show-checkbox
+            :default-expand-all="false"
+            @node-click="HandleTestNodeClick"
+            @node-check="HandleTestNodeCheck"
+            @ai-explain="HandleTestAiExplain"
+          />
+        </div>
       </div>
       <div class="right_list ">
   
@@ -33,22 +78,47 @@
 <script>
 import TargetSubject from "@/views/targetImprove/components/TargetSubject.vue"//顶部筛选科目组件
 import QuestionItem from "@/views/targetImprove/components/QuestionItem.vue"//题目公共组件
+import CommonTree from '@/components/CommonTree.vue';//树形组件
 import { mapState } from 'vuex'
 export default {
   components: {
     TargetSubject,
-    QuestionItem
+    QuestionItem,
+    CommonTree
 
   },
   data() {
     return {
       questionList: [
         {},{},{},{},{},{},{}
-      ]
+      ],
+      courseList:[],//科目列表
+      grades:[],//选择的年纪
+      // gradeList:[],//年级列表
+      dimensionList:[
+        {
+          label: '考试',
+          value: 1
+        },
+        { 
+          label: '练习',
+          value: 2
+        }
+      ],//维度列表维度 1考试 2练习
+      checkGrades:[],//年级选择
+      checkDimension:[],//维度选择
+      dataValue:[],//时间选择
+
+      mockTreeData:[],//知识点树形数据
+
     }
   },
   computed:{
-    ...mapState('target', ['subjectCode'])
+    ...mapState('target', ['subjectCode']),
+    gradeList()
+    {
+      return this.$store.state.target.gradesList;
+    }
   },
   watch:{
     // 监听顶部的subjectCode变化
@@ -61,9 +131,29 @@ export default {
   },
   mounted() 
   {
+    console.log('打印科目编码', this.gradeList)
+    // this.GetTargetErrorTopData();//获取错题筛选数据
     this.GetTargetErrorQuestionListData();//获取错题列表
+    this.GetTargetErrorKnowledgeList();//获取知识点树形数据
   },
   methods: { 
+
+    // // 获取错题筛选数据
+    // GetTargetErrorTopData()
+    // {
+
+    //   this.$api.target.getTargetErrorTopData().then(res => {
+    //     console.log('打印学生端错题头部信息', res)
+    //     if(res.code==200)
+    //     {
+    //       let courseItem=res.data.filter(item => item.courseCode == this.subjectCode)[0];
+    //       console.log('打印课程信息', courseItem)
+    //       this.gradeList = courseItem.grades;
+    //       console.log('打印年级列表', this.gradeList)
+
+    //     }
+    //   });
+    // },
     
 
     // 获取错题列表
@@ -74,9 +164,9 @@ export default {
           pageNum: 1,
           pageSize: 10
         },
-        knowledgeIds: [''],
+        knowledgeIds: ['123'],
         courseCode: this.subjectCode,
-        gradeCodes: [],
+        gradeCodes: [7],
         types: [1,2],//维度 1考试 2练习
         beginAt: "",
         endAt: ""
@@ -89,6 +179,80 @@ export default {
         }
       });
     },
+    // 获取知识点树形数据
+    GetTargetErrorKnowledgeList()
+    {
+      let params={
+        pageParam: {
+          pageNum: 1,
+          pageSize: 10
+        },
+        knowledgeIds: ['123'],
+        courseCode: this.subjectCode,
+        gradeCodes: [7],
+        types: [1,2],//维度 1考试 2练习
+        beginAt: "",
+        endAt: ""
+      };
+      this.$api.target.getTargetErrorKnowledgeList(params).then().then(res => {
+        console.log('打印知识点列表数据', res)
+        if(res.code == 200)
+        {
+          this.mockTreeData=res.data || [];//知识点数据
+        
+        }
+      });
+    },
+
+        /**
+     * 【事件回传1】树节点点击(单选)
+     * @param {Object} data - 当前节点用户数据
+     * @param {Object} node - el-tree 节点实例
+     */
+    HandleTestNodeClick(data, node) {
+      const logMsg =
+        `节点ID: ${data.id}\n` +
+        `节点名称: ${data.label}\n` +
+        `节点层级: ${node.level}\n` +
+        `是否叶子: ${node.isLeaf ? '是' : '否'}\n` +
+        `计数count: ${data.count ?? '无'}\n` +
+        `\n完整data: ${JSON.stringify(data, null, 2)}`;
+      console.log('%c[KnowledgeGraph] node-click 回传数据: ', 'background:#2E64FA;color:#fff;padding:4px 8px;border-radius:4px;', { data, node });
+      this.appendLog('info', '节点点击', logMsg);
+    },
+
+    /**
+     * 【事件回传2】复选框勾选变化(多选)
+     * @param {Object} data        - 当前操作的节点数据
+     * @param {Object} checkedInfo - 勾选状态详情 { checkedNodes, checkedKeys, halfCheckedKeys }
+     */
+    HandleTestNodeCheck(data, checkedInfo) {
+      const selectedLabels = checkedInfo.checkedNodes.map(n => n.label).join('、') || '(无)';
+      const logMsg =
+        `当前操作节点: ${data.label}\n` +
+        `已勾选节点数: ${checkedInfo.checkedNodes.length}\n` +
+        `已勾选key: [${checkedInfo.checkedKeys.join(', ')}]\n` +
+        `半选key: [${(checkedInfo.halfCheckedKeys || []).join(', ') || '无'}]\n` +
+        `\n已勾选节点名称: ${selectedLabels}`;
+      console.log('%c[KnowledgeGraph] node-check 回传数据: ', 'background:#3BA272;color:#fff;padding:4px 8px;border-radius:4px;', { data, checkedInfo });
+      this.appendLog('success', '复选框勾选', logMsg);
+    },
+
+    /**
+     * 【事件回传3】AI讲解按钮点击
+     * @param {Object} payload { nodeData, nodeInstance, nodeKey, nodeLabel }
+     */
+    HandleTestAiExplain(payload) {
+      const { nodeData, nodeKey, nodeLabel } = payload;
+      const logMsg =
+        `节点Key: ${nodeKey}\n` +
+        `节点名称: ${nodeLabel}\n` +
+        `节点层级: ${payload.nodeInstance.level}\n` +
+        `计数count: ${nodeData.count ?? '无'}\n` +
+        `\n完整节点数据: ${JSON.stringify(nodeData, null, 2)}`;
+      console.log('%c[KnowledgeGraph] ai-explain 回传数据: ', 'background:#FAC858;color:#333;padding:4px 8px;border-radius:4px;', payload);
+      this.appendLog('warn', 'AI讲解', logMsg);
+    },
 
 
   }
@@ -107,6 +271,8 @@ export default {
     width: 320px;
     height: 100%;
 
+
+
   }
   .right_list
   {

+ 1 - 1
src/views/targetImprove/index.vue

@@ -111,5 +111,5 @@ export default {
 }
 </script>
 <style lang="scss" scoped>
-
+@import "@/styles/target.scss";
 </style>