Sfoglia il codice sorgente

个人画像-动态表头、禁止图谱平移、导出精准试题

吴朋磊 2 settimane fa
parent
commit
976324265f

+ 16 - 126
src/views/analysisReport/personalProfile/HistoricalChangeChart.vue

@@ -161,12 +161,6 @@ export default {
             const legendData = [];
             // 判断个人得分率数据是否有效(非空且包含有效值)
             const hasPersonalData = personalList && personalList.length > 0 && personalList.some(data => data !== null && data !== undefined && data !== '');
-            // 判断班级数据是否有效(非空且包含有效值)
-            const hasClassData = classList && classList.length > 0 && classList.some(score => score !== null && score !== undefined && score !== '');
-            // 判断年级数据是否有效(非空且包含有效值)
-            const hasGradeData = gradeList && gradeList.length > 0 && gradeList.some(data => data !== null && data !== undefined && data !== '');
-
-
             // 如果有个人得分率数据,添加个人得分率系列(使用柱状图)
             if (hasPersonalData) {
                 // 将personalList转换为数字数组,确保echarts能正确显示
@@ -174,7 +168,7 @@ export default {
                     const num = parseFloat(val);
                     return isNaN(num) ? null : num;
                 });
-                
+
                 series.push({
                     name: '个人',
                     type: 'bar',
@@ -194,84 +188,13 @@ export default {
                 legendData.push('个人');
             }
 
-            // 如果有班级数据,添加班级系列(折线图)
-            // if (hasClassData) {
-            //     // 将classList转换为数字数组,确保echarts能正确显示
-            //     const numericClassList = classList.map(val => {
-            //         const num = parseFloat(val);
-            //         return isNaN(num) ? null : num;
-            //     });
-                
-            //     series.push({
-            //         name: '班级',
-            //         type: 'line',
-            //         data: numericClassList,
-            //         itemStyle: {
-            //             color: '#ffffff',
-            //             borderColor: '#3BA272',
-            //             borderWidth: 2 // 边框宽度
-            //         },
-            //         lineStyle: {
-            //             color: '#3BA272',
-            //             width: 2
-            //         },
-            //         // 默认显示圆点
-            //         showSymbol: true,
-            //         symbol: 'circle',
-            //         symbolSize: 10,
-            //         // 鼠标经过时显示圆点
-            //         emphasis: {
-            //             showSymbol: true,
-            //             itemStyle: {
-            //                 color: '#ffffff',
-            //                 borderColor: '#3BA272',
-            //                 borderWidth: 3
-            //             },
-            //             symbolSize: 10
-            //         }
-            //     });
-            //     legendData.push('班级');
-            // }
-
-            // // 如果有年级数据,添加年级系列
-            // if (hasGradeData) {
-            //     // 将gradeList转换为数字数组,确保echarts能正确显示
-            //     const numericGradeList = gradeList.map(val => {
-            //         const num = parseFloat(val);
-            //         return isNaN(num) ? null : num;
-            //     });
-                
-            //     series.push({
-            //         name: '年级',
-            //         type: 'line',
-            //         data: numericGradeList,
-            //         // smooth: true,
-            //         itemStyle: {
-            //             color: '#ffffff',
-            //             borderColor: '#FAC858',
-            //             borderWidth: 2 // 边框宽度
-            //         },
-            //         lineStyle: {
-            //             color: '#FAC858',
-            //             width: 2
-            //         },
-            //         // 默认显示圆点
-            //         showSymbol: true,
-            //         symbol: 'circle',
-            //         symbolSize: 10,
-            //         // 鼠标经过时显示圆点
-            //         emphasis: {
-            //             showSymbol: true,
-            //             itemStyle: {
-            //                 color: '#ffffff',
-            //                 borderColor: '#FAC858',
-            //                 borderWidth: 3,
-            //             },
-            //             symbolSize: 10
-            //         }
-            //     });
-            //     legendData.push('年级');
-            // }
+            // 计算动态的最大值,基于所有数据的最大值
+            const allValues = [
+               ...(personalList || []).filter(v => v !== null && v !== undefined)
+            ];
+            const maxValue = allValues.length > 0 ? Math.max(...allValues) : 0;
+            // 动态计算y轴最大值,满格显示
+            const dynamicMax = maxValue > 0 ? Math.ceil(maxValue / 10) * 10 : 100;
 
             // 配置项
             const option = {
@@ -284,34 +207,10 @@ export default {
                         if (params.length === 0) return '';
                         let result = `<span style="font-size:14px; font-weight:bold;">${params[0].name}</span>` + ':<br/>';
                         params.forEach(item => {
-                            let span = '';
-                            if (item.seriesName === '年级') {
-                                span = `<span         
-                                        style="
-                                        background-color:#FAC858;
-                                        width:15px;
-                                        height:2px;
-                                        display:block;
-                                        float:left;
-                                        border-radius:10px;
-                                        position:absolute;
-                                        top:10px;
-                                        left:0;
-                                        "></span>`;
-                            } else if (item.seriesName === '班级') {
-                                span = `<span 
-                                        style="background-color:#3BA272;
-                                        width:15px;
-                                        height:2px;
-                                        display:block;
-                                        float:left;
-                                        border-radius:10px;
-                                        position:absolute;
-                                        top:10px;
-                                        left:0;
-                                        "></span>`;
-                            } else {
-                                span = `<span 
+                            // 只处理个人数据
+                            if (item.seriesName !== '个人') return;
+                            
+                            let span = `<span 
                                         style="
                                         background-color:#5470C6;
                                         width:10px;
@@ -322,14 +221,13 @@ export default {
                                         top:7px;
                                         left:2px;
                                         "></span>`;
-                            }
+                            
                             if (item.value !== null && item.value !== undefined && item.value !== '') {
-                                result += `<div style="width:100%; margin:0; padding:0; position:relative; padding-left:20px;">${span} <span style="font-size:12px;">${item.seriesName}得分率: ${item.value}%</span></div>`;
+                                result += `<div style="width:100%; margin:0; padding:0; position:relative; padding-left:20px;">${span} <span style="font-size:12px;">个人得分率: ${item.value}%</span></div>`;
                             } else {
                                 result += `<div style="width:100%; margin:0; padding:0; position:relative; padding-left:20px;">
-                                    ${span} <span style="font-size:12px;">${item.seriesName}得分率:暂无数据</span>
+                                    ${span} <span style="font-size:12px;">个人得分率:暂无数据</span>
                                 </div>`;
-                             
                             }
                         });
                         return result;
@@ -350,9 +248,7 @@ export default {
                     selectedMode: 'multiple',
                     selected: {
                         // 默认选中所有有数据的系列
-                        ...(hasClassData ? { '班级': true } : {}),
                         ...(hasPersonalData ? { '个人': true } : {}),
-                        ...(hasGradeData ? { '年级': true } : {})
                     }
                 },
                 grid: {
@@ -388,7 +284,7 @@ export default {
                         fontSize: 14,
                         color: '#666',
                     },
-                    max: 100
+                    max: dynamicMax
                 },
                 series: series
             };
@@ -422,14 +318,8 @@ export default {
 
                 // 判断个人数据是否有效
                 const hasPersonalData = this.personalList && this.personalList.length > 0 && this.personalList.some(data => data !== null && data !== undefined);
-                // 判断班级数据是否有效
-                const hasClassData = this.classList && this.classList.length > 0 && this.classList.some(score => score !== null && score !== undefined && score !== '');
-                // 判断年级数据是否有效
-                const hasGradeData = this.gradeList && this.gradeList.length > 0 && this.gradeList.some(data => data !== null && data !== undefined);
 
                 if (hasPersonalData) selected['个人'] = showAll;
-                if (hasClassData) selected['班级'] = showAll;
-                if (hasGradeData) selected['年级'] = showAll;
 
 
                 this.chart.setOption({

+ 29 - 7
src/views/analysisReport/personalProfile/KnowledgeTrack.vue

@@ -2,15 +2,22 @@
   <div class="knowledgeTrack">
     <h3 class="title">历次考试知识点追踪</h3>
     <!-- 内容区域 -->
-    <div class="map_content" v-if="examRange || knowledgeStats.length > 0">
+    <div class="map_content" v-if="examRange.length > 0 || knowledgeStats.length > 0">
       <!-- 考试范围说明 -->
       <div class="knowledge_stats">
-        <p class="range_text" >
+        <!-- <p class="range_text" v-if="examRange">
           <span class="dot"></span>历次考试:<span v-html="examRange" style="color:#333333;font-weight:600;"></span>
+        </p> -->
+        <p class="range_text">
+          <span class="dot"></span>
+          本次选择考试 <span v-for="(item, index) in examRange" :key="index" >
+            {{ item.examName }}<i :style="{background: item.knowledgeNum >0 ? '#2E64FA' : '#FB9F34'}">{{ item.knowledgeNum }}</i>
+            <span v-if="index < examRange.length - 1">、</span>
+          </span>
         </p>
-        <p class="stats_text" v-for="(item, index) in knowledgeStats" :key="index">
-          <span class="dot"></span> <span v-html="item"></span>
-        </p>
+          <p class="stats_text" v-for="(item, index) in knowledgeStats" :key="index">
+            <span class="dot"></span> <span v-html="item"></span>
+          </p>
       </div>
     </div>
 
@@ -30,8 +37,10 @@ export default {
   props: {
     // 考试范围
     examRange: {
-      type: String,
-      default: ''
+      type: Array,
+      default: function () {
+        return [];
+      }
     },
     // 包含知识点数据
     knowledgeStats: {
@@ -101,6 +110,19 @@ export default {
         border-radius: 50%;
       }
     }
+    .range_text{
+      span{
+        color:#333333;
+        font-weight:600;
+        i{
+          font-size: 10px;
+          color: #ffffff;
+          border-radius: 4px 4px 4px 4px;
+          padding: 2px 4px;
+          margin-left: 5px;
+        }
+      }
+    }
   }
 
   //暂无数据

+ 175 - 25
src/views/analysisReport/personalProfile/MyGradeHistory.vue

@@ -6,28 +6,29 @@
         <img src="../../../assets/studentAnalysis/echarts.svg" alt="图表" class="btn_icon">
         历次考试对比
       </el-button> -->
+      <button class="export_btn" @click="$emit('export-knowledge-paps')">
+        <i class="iconfont icon_export"></i>
+        导出精准提升试题
+      </button>
     </div>
 
-    <div class="content" v-if="gradeHistoryData.length > 0">
+    <div class="content"
+      v-if="gradeHistoryData && (Array.isArray(gradeHistoryData) ? gradeHistoryData.length > 0 : (gradeHistoryData.records && gradeHistoryData.records.length > 0))">
       <el-table ref="gradeTable" :data="tableData" style="width: 100%" border :header-cell-style="headerCellStyle"
         :cell-style="cellStyle" stripe @selection-change="handleSelectionChange" width="55" align="center">
         <el-table-column type="selection" width="55" align="center"></el-table-column>
         <el-table-column type="index" label="序号" width="70" align="center">
           <template slot-scope="scope">
-            {{scope.$index <10 ? '0' + (scope.$index + 1) : scope.$index + 1 }}
-          </template>
-        </el-table-column>
-        <el-table-column prop="examName" label="考试名称" align="center"></el-table-column>
-        <!-- <el-table-column prop="fullScore" label="满分" width="90" align="center"></el-table-column> -->
-        <el-table-column prop="rawScore" label="原始分" width="90" align="center"></el-table-column>
-        <!-- <el-table-column prop="classRank" label="班级排名" width="90" align="center"></el-table-column>
-        <el-table-column prop="gradeRank" label="年级排名" width="90" align="center"></el-table-column>
-        <el-table-column prop="standardScore" label="标准分" width="90" align="center"></el-table-column> -->
-        <el-table-column prop="scoreRate" label="得分率" width="90" align="center">
-          <template slot-scope="scope">
-            {{ scope.row.scoreRate }}%
-          </template>
+            {{ scope.$index < 10 ? '0' + (scope.$index + 1) : scope.$index + 1 }} </template>
         </el-table-column>
+        <template v-for="(header, index) in tableHeaders">
+          <el-table-column v-if="header.display" :key="index" :prop="header.prop" :label="header.label"
+            :width="header.prop === 'examName' ? '225' : ''" align="center">
+            <template slot-scope="scope">
+              {{ scope.row[header.prop] != null ? scope.row[header.prop] : '-' }}
+            </template>
+          </el-table-column>
+        </template>
         <el-table-column label="操作" width="120" align="center">
           <template slot-scope="scope">
             <el-button type="text" @click="viewDetails(scope.row)">查看答题卡</el-button>
@@ -35,6 +36,12 @@
         </el-table-column>
       </el-table>
 
+      <!-- 分页器 -->
+      <div class="pagination">
+        <el-pagination background layout="prev, pager, next, total" :total="total" :page-size="pageSize"
+          :current-page="currentPage" @current-change="handleCurrentChange" />
+      </div>
+
     </div>
 
     <!-- 暂无数据 -->
@@ -73,13 +80,13 @@ export default {
     },
     // 接收历次成绩数据
     gradeHistoryData: {
-      type: Array,
-      default: () => []
+      type: [Array, Object],
+      default: () => { }
     },
     // 接收个人画像数据
     portraitData: {
       type: Object,
-      default: () => {}
+      default: () => { }
     }
   },
   data() {
@@ -87,7 +94,7 @@ export default {
       showStudentPaperDialog: false, //显示答题卡弹框
       paperInfo: {},
       paperTitle: '', //答题卡弹框标题
-      currentPageIndex: 0 ,//当前选中的答题卡第几页
+      currentPageIndex: 0,//当前选中的答题卡第几页
       // 控制弹窗显示/隐藏
       showBenchTaskSelect: false,
       // 是否允许多选
@@ -96,13 +103,28 @@ export default {
       benchTaskTitle: '历次考试对比',
       // 是否正在初始化全选
       isInitializing: false,
+      // 分页相关数据
+      currentPage: 1,
+      pageSize: 10,
+      total: 0,
     };
   },
   watch: {
     // 监听gradeHistoryData变化,数据加载完成后默认全选
     gradeHistoryData: {
       handler(newVal) {
-        if (newVal && newVal.length > 0) {
+        // 检查数据是否有效
+        const hasData = newVal && (Array.isArray(newVal) ? newVal.length > 0 : (newVal.records && newVal.records.length > 0));
+
+        if (hasData) {
+          // 如果gradeHistoryData是一个对象,可能包含total属性
+          if (typeof newVal === 'object' && newVal.total !== undefined) {
+            this.total = Number(newVal.total);
+          } else if (Array.isArray(newVal) && this.$parent && this.$parent.gradeHistoryData && this.$parent.gradeHistoryData.total !== undefined) {
+            // 尝试从父组件获取total值
+            this.total = Number(this.$parent.gradeHistoryData.total);
+          }
+
           this.$nextTick(() => {
             if (this.$refs.gradeTable) {
               // 设置初始化标志,避免触发selection-change事件
@@ -137,19 +159,69 @@ export default {
         isTotal: this.$store.state.report.filterObject.isTotal //是否为总分科目 1为总分 0为非总分
       }
     }, //分析报告公共参数变量
+    // 根据displayType获取表头标签
+    displayTypeLabel() {
+      // 获取第一个数据行的displayType
+      const firstRow = this.tableData[0];
+      if (!firstRow) return '';
+
+      switch (firstRow.displayType) {
+        case 0:
+          return '分数';
+        case 1:
+          return '对错';
+        case 2:
+          return '等级';
+        default:
+          return '';
+      }
+    },
+    // 获取表头配置
+    tableHeaders() {
+      if (Array.isArray(this.gradeHistoryData)) {
+        return this.gradeHistoryData[0]?.headers || [];
+      }
+      const records = this.gradeHistoryData.records || [];
+      return records[0]?.headers || [];
+    },
     // 处理数据,映射接口字段到表格字段
     tableData() {
-      return this.gradeHistoryData.map(item => ({
+      if (Array.isArray(this.gradeHistoryData)) {
+        return this.gradeHistoryData.map(item => ({
+          id: item.id || Math.random(),
+          examName: item.examName || '',
+          fullScore: item.fullScore,
+          originalScore: item.originalScore,
+          rawScore: item.originalScore,
+          classRank: item.classRank,
+          gradeRank: item.gradeRank,
+          standardScore: item.standardScore,
+          scoreRate: item.scoreRate ? item.scoreRate+'%': '',
+          examId: item.examId,
+          subjectId: item.subjectId,
+          displayType: item.displayType,
+          displayName: item.displayName || '',
+          correctType: item.correctType,
+        }));
+      }
+      const records = this.gradeHistoryData.records || [];
+      const firstRecord = records[0];
+      const data = firstRecord?.data || [];
+      return data.map(item => ({
         id: item.id || Math.random(),
         examName: item.examName || '',
         fullScore: item.fullScore,
-        rawScore: item.originalScore, // 接口字段originalScore映射到rawScore
+        originalScore: item.originalScore,
+        rawScore: item.originalScore,
         classRank: item.classRank,
         gradeRank: item.gradeRank,
         standardScore: item.standardScore,
-        scoreRate: item.scoreRate,
-        examId: item.examId, //考试id
-        subjectId: item.subjectId, //科目id
+        scoreRate: item.scoreRate ? item.scoreRate+'%': '',
+        examId: item.examId,
+        subjectId: item.subjectId,
+        displayType: item.displayType,
+        displayName: item.displayName || '',
+        correctType: item.correctType,
       }));
     },
     // 表头样式
@@ -204,6 +276,12 @@ export default {
       this.showStudentPaperDialog = true
       // 实际项目中可以跳转到详情页面或展开详情
     },
+    // 处理分页变化
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      // 触发父组件的分页事件,以便重新获取数据
+      this.$emit('page-change', { currentPage: val, pageSize: this.pageSize });
+    },
   }
 }
 </script>
@@ -216,11 +294,16 @@ export default {
   box-sizing: border-box;
 
   .chart_title {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 20px;
+    height: 36px;
     .title {
       font-size: 16px;
       font-weight: 600;
       color: #333333;
-      margin: 0 0 20px 0;
+
     }
 
     // 历史考试对比
@@ -246,6 +329,37 @@ export default {
         vertical-align: middle;
       }
     }
+
+    // 导出精准提升试题
+    .export_btn {
+      display: flex;
+      align-items: center;
+      gap: 5px;
+      width: 152px;
+      height: 36px;
+      line-height: 36px;
+      background: #2E64FA;
+      color: white;
+      border: none;
+      border-radius: 4px;
+      font-size: 14px;
+      cursor: pointer;
+      padding: 0;
+      transition: all 0.3s ease;
+
+      &:hover {
+        background: #5883fb;
+      }
+
+      &:active {
+        background: #2E64FA;
+      }
+
+      .iconfont {
+        width: 14px;
+        margin-left: 10px;
+      }
+    }
   }
 
 
@@ -326,6 +440,42 @@ export default {
       display: flex;
       justify-content: flex-end;
       align-items: center;
+
+      /* 分页器样式 */
+      :deep(.el-pagination) {
+
+        /* 分页按钮通用样式 */
+        .el-pager li {
+          height: 32px;
+          line-height: 32px;
+          border-radius: 4px;
+          margin: 0 5px;
+
+          /* 未选中状态 */
+          background-color: #f3f3f3;
+          color: #606266;
+
+          /* 选中状态 */
+          &.active {
+            background-color: #2e64fa;
+            color: #ffffff;
+          }
+        }
+
+        /* 上一页/下一页按钮 */
+        .btn-prev,
+        .btn-next {
+          height: 32px;
+          line-height: 32px;
+          border-radius: 4px;
+          background-color: #f3f3f3;
+          color: #606266;
+
+          &:hover {
+            background-color: #e6e8eb;
+          }
+        }
+      }
     }
   }
 

+ 105 - 105
src/views/analysisReport/personalProfile/index.vue

@@ -1,58 +1,33 @@
 <template>
     <div class="personalProfile">
         <!-- 我的历次成绩子组件 -->
-        <MyGradeHistory :grade-history-data="gradeHistoryData" v-loading="historyloading" @selection-change="handleSelectionChange" />
+        <MyGradeHistory :grade-history-data="gradeHistoryData" v-loading="historyloading"
+            @selection-change="handleSelectionChange" @page-change="handlePageChange" 
+            @export-knowledge-paps="exportKnowledgePaps"/>
 
         <!-- 历次考试知识点追踪 -->
-        <KnowledgeTrack 
-            :exam-range="knowledgeMapData.examRange" 
-            :knowledge-stats="knowledgeStats" 
-            v-loading="knowledgeloading"
-        />
+        <KnowledgeTrack :exam-range="knowledgeMapData.examRange" :knowledge-stats="knowledgeStats"
+            v-loading="knowledgeloading" />
 
         <!-- 零分知识点、高频错题知识点 -->
-        <zeroScoreKnowledge 
-            ref="knowledgeGraphRef" 
-            @knowledge-item-click="handleKnowledgeItemClick"
-            :active-view="activeView" 
-            @view-change="activeView = $event" 
-            :subject-name="portraitData.subjectName"
-            :subject-score-rate="subjectScoreRate" 
-            :table-data="treeData" 
-            :fatal-vulnerability="fatalVulnerability"
-            :high-vulnerability="highVulnerability" 
-            :all-knowledge-list="allKnowledgeList"
-            @activeTabChange="handleActiveTabChange" 
-            @legend-change="handleLegendChange"
-            v-loading="zeroloading"
-        />
+        <zeroScoreKnowledge ref="knowledgeGraphRef" @knowledge-item-click="handleKnowledgeItemClick"
+            :active-view="activeView" @view-change="activeView = $event" :subject-name="portraitData.subjectName"
+            :subject-score-rate="subjectScoreRate" :table-data="treeData" :fatal-vulnerability="fatalVulnerability"
+            :high-vulnerability="highVulnerability" :all-knowledge-list="allKnowledgeList"
+            @activeTabChange="handleActiveTabChange" @legend-change="handleLegendChange" v-loading="zeroloading" />
 
         <!-- 历次变化 -->
-        <HistoricalChangeChart 
-            ref="historicalChangeChartRef"
-            :personalList="historicalChangeData.personalList"
-            :classList="historicalChangeData.classList" 
-            :gradeList="historicalChangeData.gradeList"
-            :examName="historicalChangeData.examName" 
-            :knowledgeName="knowledgeName" 
-            v-loading="historicalChangeLoading"
-        />
+        <HistoricalChangeChart ref="historicalChangeChartRef" :personalList="historicalChangeData.personalList"
+            :classList="historicalChangeData.classList" :gradeList="historicalChangeData.gradeList"
+            :examName="historicalChangeData.examName" :knowledgeName="knowledgeName"
+            v-loading="historicalChangeLoading" />
         <!-- 薄弱知识点精准提升 -->
-         <knowledgePaps
-            :knowledgeName="knowledgeName"
-            v-loading="knowledgePapsLoading"
-            :knowledgData="knowledgData"
-            @export-knowledge-paps="exportKnowledgePaps"
-        />
+        <knowledgePaps :knowledgeName="knowledgeName" v-loading="knowledgePapsLoading" :knowledgData="knowledgData"
+             />
         <!-- 下载试题 -->
-        <Download 
-            ref="downloadRef" 
-            :visible.sync="visible"
-            :examId="portraitData.examId" 
-            :subjectCode="portraitData.subjectCode" 
-            :knowledgeId="knowledgeId" 
-        />
-        
+        <Download ref="downloadRef" :visible.sync="visible" :examId="portraitData.examId"
+            :subjectCode="portraitData.subjectCode" :knowledgeId="knowledgeId" />
+
     </div>
 </template>
 <script>
@@ -81,7 +56,7 @@ export default {
         knowledgeStats() {
             const stats = [];
             const prefix = ''; // 定义prefix变量
-            
+
             // 当有知识点数据时,生成统计文本
             if (this.knowledgeMapData.konwLenght > 0 || this.knowledgeMapData.knowledgeList) {
                 // 获取得分率变化的文本部分
@@ -90,17 +65,16 @@ export default {
                 const hasDrop = this.knowledgeMapData.dropKnowledgeList;   // 下降部分
                 const hasKnowledgeList = this.knowledgeMapData.knowledgeList; // 知识点列表
                 const knowledgeNum = this.knowledgeMapData.konwLenght; // 知识点数量
-                
                 // 基础文本:包含的知识点数量
                 if (knowledgeNum > 0) {
                     changeText += `共包含<span style='color:#2E64FA'>${knowledgeNum}</span>个知识点`;
                 }
-                
+
                 // 添加知识点列表(可选)
-                if (hasKnowledgeList) {
-                    changeText += `,包括<span style="color:#333333;font-weight:600;">${this.knowledgeMapData.knowledgeList}</span>`;
+                if (hasKnowledgeList && hasKnowledgeList.length > 0) {
+                    changeText += `,共有<span style="color:#2E64FA">${this.knowledgeMapData.repeatKnowledgeNum}</span>个知识点重复出现`;
                 }
-                
+
                 // 当repeatKnowledgeNum大于0时,添加得分率变化信息
                 if (this.knowledgeMapData.repeatKnowledgeNum > 0) {
                     // 只有当raiseKnowledgeList不为空时,添加得分率提升的部分
@@ -123,11 +97,13 @@ export default {
                         // 如果只有提升,添加句号
                         changeText += `。`;
                     }
-                } else {
+                } else if(this.knowledgeMapData.repeatKnowledgeNum === 0){
                     // 如果repeatKnowledgeNum为0,添加完整句号
+                    changeText += ``;
+                }else{
                     changeText += `。`;
                 }
-                
+
                 // 确保始终返回数组
                 if (changeText) {
                     stats.push(changeText);
@@ -136,7 +112,7 @@ export default {
                 // 如果只有考试范围数据,添加说明文本
                 stats.push(`本次考试涵盖<span style="color:#333333;font-weight:600;">${this.knowledgeMapData.knowledgeList}</span>,暂无详细知识点追踪数据。`);
             }
-            
+
             return stats;
         },
 
@@ -147,7 +123,7 @@ export default {
             gradeHistoryData: [],
             // 历次考试知识点追踪数据
             knowledgeMapData: {
-                examRange: "", //考试名称
+                examRange: [], //考试名称
                 konwLenght: 0, // 包含知识点数
                 knowledgeList: [],// 包含知识点列表 
                 repeatKnowledgeNum: 0, // 重复知识点数
@@ -207,28 +183,34 @@ export default {
     },
     methods: {
         // 我的历次成绩---年级画像
-        MyGradeHistoryData() {
+        MyGradeHistoryData(currentPage = 1, pageSize = 10) {
             // 加载状态-清空数据
             this.historyloading = true;
             // 历次考试知识点追踪-加载状态
-            this.knowledgeloading = true;
+             this.knowledgeloading = true;
             // 零分知识点、高频错题知识点-加载状态
-            this.zeroloading = true;
+             this.zeroloading = true;
              // 薄弱知识点精准提升-加载状态
              this.knowledgePapsLoading = true;
             // 历次变化图表-加载状态
             this.historicalChangeLoading = true;
-            this.gradeHistoryData = [];
+            this.gradeHistoryData = { records: [], total: 0 };
             let examParams = {
                 examId: this.portraitData.examId,
                 subjectCode: this.portraitData.subjectCode,
+                page: currentPage,
+                size: pageSize,
             };
             this.$api.personalProfile.examScoreList(examParams).then(res => {
                 if (res.code === 200) {
-                    let data = res.data || [];
+                    let data = res.data || {};
                     if (data) {
-                        this.gradeHistoryData = res.data.records || [];
-                        let examIds = this.gradeHistoryData.map(item => item.examId || '');
+                        // 确保total是数字类型
+                        if (data.total !== undefined) {
+                            data.total = Number(data.total);
+                        }
+                        this.gradeHistoryData = data;
+                        let examIds = (data.records[0].data || []).map(item => item.examId || '');
                         this.portraitData.examIds = examIds;
                         // 加载状态
                         this.historyloading = false;
@@ -237,7 +219,7 @@ export default {
                         this.vulerabData();
                         // 历次考试知识点追踪
                         this.previousExamsData();
-                    }else{
+                    } else {
                         // 加载状态
                         // 历次考试知识点追踪-加载状态
                         this.knowledgeloading = false;
@@ -246,14 +228,22 @@ export default {
                         // 薄弱知识点精准提升-加载状态
                         this.knowledgePapsLoading = false;
                         // 历次变化图表-加载状态
-                        this.historicalChangeLoading = false;    
+                        this.historicalChangeLoading = false;
                         this.historyloading = false;
-                        this.gradeHistoryData = [];
+                        this.gradeHistoryData = { records: [], total: 0 };
                     }
-                }else{
+                } else {
                     // 加载状态
                     this.historyloading = false;
-                    this.gradeHistoryData = [];
+                    // 历次考试知识点追踪-加载状态
+                    this.knowledgeloading = false;
+                    // 零分知识点、高频错题知识点-加载状态
+                    this.zeroloading = false;
+                    // 薄弱知识点精准提升-加载状态
+                    this.knowledgePapsLoading = false;
+                    // 历次变化图表-加载状态
+                    this.historicalChangeLoading = false;
+                    this.gradeHistoryData = { records: [], total: 0 };
                 }
             })
         },
@@ -265,12 +255,18 @@ export default {
             // 零分知识点、高频错题知识点(会自动调用 KnowledgeTrackData 和 pushQuestionData)
             this.vulerabData();
         },
+        // 处理分页变化
+        handlePageChange(pageInfo) {
+            const { currentPage, pageSize } = pageInfo;
+            // 重新调用接口获取对应页码的数据
+            this.MyGradeHistoryData(currentPage, pageSize);
+        },
         //历次考试知识点追踪
         previousExamsData() {
             // 加载状态-清空数据
             this.knowledgeloading = true;
             this.knowledgeMapData = {
-                examRange: "", //考试名称
+                examRange: [], //考试名称
                 konwLenght: 0, // 包含知识点数
                 knowledgeList: [],// 包含知识点列表 
                 repeatKnowledgeNum: 0, // 重复知识点数
@@ -289,7 +285,7 @@ export default {
                         this.knowledgeloading = false;
                         // 考试名称列表
                         if (data.examNameList) {
-                            this.knowledgeMapData.examRange = data.examNameList.join('、') || '';
+                            this.knowledgeMapData.examRange =data.examNameList ? data.examNameList : [];
                         }
                         // 知识点列表
                         if (data.knowledgeList) {
@@ -305,11 +301,11 @@ export default {
                         if (data.dropKnowledgeList) {
                             this.knowledgeMapData.dropKnowledgeList = data.dropKnowledgeList.join('、') || '';
                         }
-                    }else{
+                    } else {
                         // 加载状态
                         this.knowledgeloading = false;
                         this.knowledgeMapData = {
-                            examRange: "", //考试名称
+                            examRange: [], //考试名称
                             konwLenght: 0, // 包含知识点数
                             knowledgeList: [],// 包含知识点列表 
                             repeatKnowledgeNum: 0, // 重复知识点数
@@ -317,11 +313,11 @@ export default {
                             dropKnowledgeList: [],//下降知识点 
                         };
                     }
-                }else{
+                } else {
                     // 加载状态
                     this.knowledgeloading = false;
                     this.knowledgeMapData = {
-                        examRange: "", //考试名称
+                        examRange: [], //考试名称
                         konwLenght: 0, // 包含知识点数
                         knowledgeList: [],// 包含知识点列表 
                         repeatKnowledgeNum: 0, // 重复知识点数
@@ -365,7 +361,7 @@ export default {
 
                         // 新增:调用studentKnowledgeDataTree API获取treeData
                         this.getStudentKnowledgeDataTree();
-                        
+
                         // 获取知识点第一条数据id 全部>高频错题>零分知识点
                         if (this.allKnowledgeList.length > 0) {
                             this.knowledgeName = this.allKnowledgeList[0].knowledgeName || '';
@@ -374,7 +370,7 @@ export default {
                             if (this.highVulnerability.length > 0) {
                                 this.knowledgeName = this.highVulnerability[0].knowledgeName || '';
                                 this.knowledgeId = this.highVulnerability[0].knowledgeId || 0;
-                            }else if (this.fatalVulnerability.length > 0) {
+                            } else if (this.fatalVulnerability.length > 0) {
                                 this.knowledgeName = this.fatalVulnerability[0].knowledgeName || '';
                                 this.knowledgeId = this.fatalVulnerability[0].knowledgeId || 0;
                             } else {
@@ -382,12 +378,12 @@ export default {
                                 this.knowledgeId = '';
                             }
                         }
-                        
+
                         // 首次加载默认获取知识点
                         this.KnowledgeTrackData();
                         // 加载推送试题
                         this.pushQuestionData();
-                    }else{
+                    } else {
                         this.treeData = [];
                         this.subjectScoreRate = 0; //科目得分率
                         this.fatalVulnerability = []; // 零分知识点数据
@@ -411,7 +407,7 @@ export default {
                             }
                         });
                     }
-                }else{
+                } else {
                     this.treeData = [];
                     this.subjectScoreRate = 0; //科目得分率
                     this.fatalVulnerability = []; // 零分知识点数据
@@ -428,7 +424,7 @@ export default {
                 }
             })
         },
-        
+
         // 新增:获取知识点树状图数据
         getStudentKnowledgeDataTree(knowledgeType = 0, scoreRateTypes = null) {
             this.treeData = [];
@@ -440,14 +436,14 @@ export default {
                 scoreRateTypes: scoreRateTypes, // 得分率类型 1薄弱 2良好 3优秀(精准提升),为空是全部
                 knowledgeType: knowledgeType // 知识点类型 0全部 1高频错题知识点 2零分知识点(精准提升)
             };
-            
+
             this.$api.personalProfile.studentKnowledgeDataTree(params).then(res => {
                 if (res.code === 200) {
                     let data = res.data;
                     if (data) {
                         // 从新API获取treeData
                         this.treeData = data || [];
-                        
+
                         // 接口调用成功后,刷新图表
                         this.$nextTick(() => {
                             if (this.$refs.knowledgeGraphRef) {
@@ -474,7 +470,7 @@ export default {
                 }
             });
         },
-        
+
         // 处理图例变化事件
         handleLegendChange(data) {
             // 调用getStudentKnowledgeDataTree方法,传递knowledgeType和scoreRateTypes
@@ -534,7 +530,7 @@ export default {
                         gradeList: gradeList,
                         examName: examNames,
                     };
-                    
+
                     this.$nextTick(() => {
                         if (this.$refs.historicalChangeChartRef) {
                             this.$refs.historicalChangeChartRef.initChart();
@@ -565,7 +561,7 @@ export default {
         },
 
         // 推题列表
-        pushQuestionData(){
+        pushQuestionData() {
             this.knowledgData = [];
             let params = {
                 examId: this.portraitData.examId, //当前考试id
@@ -574,23 +570,23 @@ export default {
             };
             this.$api.personalProfile.pushQuestionList(params).then(res => {
                 if (res.code === 200) {
-                    let data = res.data ;
+                    let data = res.data;
                     if (data) {
                         // 加载状态-清空数据
                         this.knowledgePapsLoading = false;
-                         // 更新推题列表数据
+                        // 更新推题列表数据
                         this.knowledgData = data || [];
-                    }else{
+                    } else {
                         // 加载状态-清空数据
                         this.knowledgePapsLoading = false;
-                         // 更新推题列表数据
-                        this.knowledgData =  [];
+                        // 更新推题列表数据
+                        this.knowledgData = [];
                     }
                 } else {
-                   // 加载状态-清空数据
+                    // 加载状态-清空数据
                     this.knowledgePapsLoading = false;
                     // 更新推题列表数据
-                    this.knowledgData =  [];
+                    this.knowledgData = [];
                 }
             });
         },
@@ -598,8 +594,8 @@ export default {
         // 知识点列表点击事件
         handleKnowledgeItemClick(data) {
             // 点击知识点后,更新图表数据
-            this.knowledgeId = data.item.knowledgeId ;
-            this.knowledgeName = data.item.knowledgeName ;
+            this.knowledgeId = data.item.knowledgeId;
+            this.knowledgeName = data.item.knowledgeName;
             // 点击知识点后,更新历次变化
             this.KnowledgeTrackData();
             // 点击知识点后,更新推题列表
@@ -612,12 +608,12 @@ export default {
             // zero 零分
             // all 所有知识点
             let knowledgeType = 0;
-            
+
             if (tab === 'highFreq') {
                 // 高频知识点
                 knowledgeType = 1;
-                if(this.highVulnerability.length > 0) {
-                    this.knowledgeId = this.highVulnerability[0].knowledgeId ;
+                if (this.highVulnerability.length > 0) {
+                    this.knowledgeId = this.highVulnerability[0].knowledgeId;
                     this.knowledgeName = this.highVulnerability[0].knowledgeName;
                 } else {
                     this.knowledgeId = '';
@@ -626,7 +622,7 @@ export default {
             } else if (tab === 'zero') {
                 // 零分知识点
                 knowledgeType = 2;
-                if(this.fatalVulnerability.length > 0) {
+                if (this.fatalVulnerability.length > 0) {
                     this.knowledgeId = this.fatalVulnerability[0].knowledgeId || 0;
                     this.knowledgeName = this.fatalVulnerability[0].knowledgeName || '';
                 } else {
@@ -636,7 +632,7 @@ export default {
             } else if (tab === 'all') {
                 // 所有知识点
                 knowledgeType = 0;
-                if(this.allKnowledgeList.length > 0) {
+                if (this.allKnowledgeList.length > 0) {
                     this.knowledgeId = this.allKnowledgeList[0].knowledgeId || 0;
                     this.knowledgeName = this.allKnowledgeList[0].knowledgeName || '';
                 } else {
@@ -644,7 +640,7 @@ export default {
                     this.knowledgeName = '';
                 }
             }
-            
+
             // 重置图例状态:让三个图例恢复成原先的模样
             if (this.$refs.knowledgeGraphRef) {
                 this.$refs.knowledgeGraphRef.selectedLegend = {
@@ -659,11 +655,11 @@ export default {
                     }
                 });
             }
-            
+
             // 根据tab切换调用新API,传递对应的knowledgeType和重置后的scoreRateTypes=null
             this.getStudentKnowledgeDataTree(knowledgeType, null);
-            
-            if(!this.knowledgeId){
+
+            if (!this.knowledgeId) {
                 this.historicalChangeData = {
                     personalList: [],
                     classList: [],
@@ -685,12 +681,16 @@ export default {
 
         // 导出精准提升试题
         exportKnowledgePaps() {
-            if(this.knowledgData.length === 0){
-                this.$message.warning('暂无知识点推题');
-                return
-            }
+            // if (this.knowledgData.length === 0) {
+            //     this.$message.warning('暂无知识点推题');
+            //     return
+            // }
             // 触发Download组件弹窗
             this.visible = true;
+        },
+        // 导出试题(供父组件调用)
+        ExportQuestions() {
+            this.exportKnowledgePaps();
         }
     },
 }

+ 8 - 5
src/views/analysisReport/personalProfile/knowledgePaps.vue

@@ -6,10 +6,10 @@
                 <span class="secondary_title" v-if="titleParts.knowledgeName">{{ titleParts.knowledgeName }} / </span>
                 <span class="main_title">薄弱知识点精准提升</span>
             </div>
-            <button class="export_btn" @click="$emit('export-knowledge-paps')">
+            <!-- <button class="export_btn" @click="$emit('export-knowledge-paps')">
                 <i class="iconfont icon_export"></i>
                 导出精准提升试题
-            </button>
+            </button> -->
         </div>
 
         <div class="data_container" v-if="knowledgData.length > 0">
@@ -34,9 +34,9 @@
                     <p v-html ='item.title || "" '></p>
                 </div>
                 <!-- 推题底部 -->
-                <div class="question_tags">
+                <div class="question_tags" v-if="item.knowledge">
                     <span class="tags_label">知识点:</span>
-                    <span class="tag" v-for="(knowledge, index) in (item.knowledge || '').split('、')" :key="index" v-if="knowledge">
+                    <span class="tag" v-for="(knowledge, index) in getKnowledgeList(item.knowledge)" :key="index">
                         {{ knowledge }}
                     </span>
                 </div>
@@ -88,7 +88,10 @@ export default {
         // }
     },
     methods: {
-        
+        // 处理知识点分割和过滤
+        getKnowledgeList(knowledge) {
+            return (knowledge || '').split('、').filter(item => item);
+        }
     },
 }
 </script>

+ 1 - 9
src/views/analysisReport/personalProfile/zeroScoreKnowledge.vue

@@ -857,7 +857,7 @@ export default {
               expandAndCollapse: false,
               // 调整树状图布局参数,确保节点均匀分布
               orient: 'radial',
-              roam: true,
+              roam: false, // 禁用缩放和平移
               
               // 使用边距控制图表位置,实现水平垂直居中
               left: '8%',   // 左边距(百分比/像素)
@@ -867,19 +867,11 @@ export default {
 
               // 根据节点数量动态调整内外半径,防止节点遮盖
               radius: getOptimalRadius(),
-              
-              // 动态计算合适的缩放比例,根据屏幕宽度和节点数量调整
-              zoom: getOptimalZoom(),
-              scaleLimit: {
-                min: 0.2,
-                max: 5
-              },
 
               // 调整节点大小比例和间距,确保节点不遮盖
               nodeScaleRatio: 1,
               // 根据节点数量调整层级间距,节点少的时候增大间距
               layerPadding: outermostCount <= 5 ? [20, 10] : [10, 5],
-              roam: true,
 
               // 使用表格数据生成树形结构
               data: [