Bladeren bron

个人画像-功能开发,接口调用

吴朋磊 3 maanden geleden
bovenliggende
commit
df2de41871

+ 0 - 1
public/index.html

@@ -10,7 +10,6 @@
     <title><%= htmlWebpackPlugin.options.title %></title>
    
     <link rel="stylesheet" href="//at.alicdn.com/t/c/font_4939100_wnefpnxejys.css">
-    
   </head>
   <body>
     <noscript>

+ 17 - 1
src/http/api/personalProfile.js

@@ -5,7 +5,23 @@ const report = {
     // 学生-历次变化
     examScoreList(data){
         return get(`${base.prefix}/api/v1/studentPinpoint/examScoreList`,data);
-  } ,
+    } ,
+    // 学生-历次考试知识点追踪
+    examKnowledgePointTrack(data){
+        return post(`${base.prefix}/api/v1/studentPinpoint/examKnowledgePointTrack`,data);
+    },
+    // 知识点图谱
+    knowledgeTreeData(data){
+        return post(`${base.prefix}/api/v1/studentPinpoint/knowledgeTreeData`,data);
+    },
+    // 历次变化
+    knowledgeExamPrevious(data){
+        return post(`${base.prefix}/api/v1/studentPinpoint/knowledgeExamPrevious`,data);
+    },
+    // 推送试题列表
+    pushQuestionList(data){
+        return get(`${base.prefix}/api/v1/studentPinpoint/pushQuestionList`,data);
+    }
 };
 
 export default report;

+ 473 - 13
src/views/analysisReport/personalProfile/HistoricalChangeChart.vue

@@ -1,29 +1,489 @@
 <template>
-    <div class="HistoricalChangeChart">
-        <div class="title">2、历次变化</div>
+    <div class="historical_change_chart">
+        <div class="chart_title">
+            <span class="secondary_title" style="font-weight: bold;">2、</span>
+            <span class="secondary_title" v-if="titleParts.knowledgeName">{{ titleParts.knowledgeName }} / </span>
+            <span class="main_title">历次变化</span>
+        </div>
+        <div style="position: relative">
+            <el-checkbox @change="(e) => { this.allSeriesSelected = e; this.toggleAllSeries(e); }"
+                v-model="allSeriesSelected" :indeterminate="isIndeterminate" class="checkbox"
+                v-if="hasData">显示全部</el-checkbox>
+            <div ref="chart" class="chart" v-show="hasData"></div>
+            <div v-show="!hasData" class="module_chart no_content_data no_data" element-loading-background="#ffffff">
+                <span>暂无数据</span>
+            </div>
+        </div>
     </div>
 </template>
+
 <script>
+import * as echarts from 'echarts';
+
 export default {
-    name: "HistoricalChangeChart",
+    name: 'HistoricalChangeChart',
     props: {
-        mode: {
+        // 个人得分率
+        personalList: {
+            type: Array,
+            default: () => []
+        },
+        // 班级得分率
+        classList: {
+            type: Array,
+            default: () => []
+        },
+        // 年级得分率
+        gradeList: {
+            type: Array,
+            default: () => []
+        },
+        // 考试名称
+        examName: {
+            type: Array,
+            default: () => []
+        },
+
+        // 知识点名称
+        knowledgeName: {
             type: String,
-            default: "grade"
+            default: ''
+        },
+    },
+    computed: {
+        // 判断是否有数据
+        hasData() {
+            return this.personalList && this.personalList.length > 0 &&
+                    ((this.classList && this.classList.length > 0) ||
+                    (this.gradeList && this.gradeList.length > 0) ||
+                    (this.examName && this.examName.length > 0));
+        },
+
+        // 动态生成标题各部分
+        titleParts() {
+            return {
+                knowledgeName: this.knowledgeName || ''
+            };
+        }
+    },
+    data() {
+        return {
+            chart: null, // echarts实例
+            allSeriesSelected: true, // 显示全部复选框状态
+            isIndeterminate: false, // 不确定状态
+        };
+    },
+    mounted() {
+        // 初始化echarts图表,确保DOM渲染完成
+        this.$nextTick(() => {
+            if (this.hasData) {
+                this.initChart();
+            }
+        });
+
+        // 监听窗口大小变化
+        window.addEventListener('resize', () => {
+            if (this.chart) {
+                this.chart.resize();
+            }
+        });
+    },
+    beforeDestroy() {
+        // 销毁echarts实例
+        if (this.chart) {
+            this.chart.dispose();
+        }
+    },
+    watch: {
+        // 监听hasData变化,动态初始化或销毁图表
+        hasData(newVal) {
+            this.$nextTick(() => {
+                if (newVal) {
+                    this.initChart();
+                } else if (this.chart) {
+                    this.chart.dispose();
+                    this.chart = null;
+                }
+            });
+        },
+        // 监听props变化,动态更新图表数据
+        personalList: {
+            handler(newVal) {
+                if (this.hasData) {
+                    this.initChart();
+                }
+            },
+            deep: true
+        },
+        classList: {
+            handler(newVal) {
+                if (this.hasData) {
+                    this.initChart();
+                }
+            },
+            deep: true
+        },
+        gradeList: {
+            handler(newVal) {
+                if (this.hasData) {
+                    this.initChart();
+                }
+            },
+            deep: true
+        },
+        examName: {
+            handler(newVal) {
+                if (this.hasData) {
+                    this.initChart();
+                }
+            },
+            deep: true
+        },
+    },
+    methods: {
+        // 初始化echarts图表
+        initChart() {
+            // 销毁现有的图表实例
+            if (this.chart) {
+                this.chart.dispose();
+            }
+
+            // 创建echarts实例
+            this.chart = echarts.init(this.$refs.chart);
+
+            // 使用props中的数据
+            const examNames = this.examName; // 考试名称
+            const personalList = this.personalList; ///个人得分率
+            const classList = this.classList; //班级得分率
+            const gradeList = this.gradeList; //年级得分率
+            // 动态生成series数组,只包含有数据的系列
+            const series = [];
+            const legendData = [];
+            // 判断个人得分率数据是否有效(非空且包含有效值)
+            const hasPersonalData = personalList && personalList.length > 0 && personalList.some(data => data !== null && data !== undefined);
+            // 判断班级数据是否有效(非空且包含有效值)
+            const hasClassData = classList && classList.length > 0 && classList.some(score => score !== null && score !== undefined);
+            // 判断年级数据是否有效(非空且包含有效值)
+            const hasGradeData = gradeList && gradeList.length > 0 && gradeList.some(data => data !== null && data !== undefined);
+
+
+            // 如果有个人得分率数据,添加个人得分率系列(使用柱状图)
+            if (hasPersonalData) {
+                series.push({
+                    name: '个人',
+                    type: 'bar',
+                    data: personalList,
+                    barWidth: 60,
+                    itemStyle: {
+                        color: '#5470C6'
+                    },
+                    label: {
+                        show: true,
+                        position: 'top',
+                        formatter: '{c}%',
+                        fontSize: 14,
+                        color: '#666666'
+                    }
+                });
+                legendData.push('个人');
+            }
+
+            // 如果有班级数据,添加班级系列(折线图)
+            if (hasClassData) {
+                series.push({
+                    name: '班级',
+                    type: 'line',
+                    data: classList,
+                    itemStyle: {
+                        color: '#ffffff',
+                        borderColor: '#91CC75',
+                        borderWidth: 2 // 边框宽度
+                    },
+                    lineStyle: {
+                        color: '#91CC75',
+                        width: 2
+                    },
+                    // 默认显示圆点
+                    showSymbol: true,
+                    symbol: 'circle',
+                    symbolSize: 10,
+                    // 鼠标经过时显示圆点
+                    emphasis: {
+                        showSymbol: true,
+                        itemStyle: {
+                            color: '#ffffff',
+                            borderColor: '#91CC75',
+                            borderWidth: 3
+                        },
+                        symbolSize: 10
+                    }
+                });
+                legendData.push('班级');
+            }
+
+            // 如果有年级数据,添加年级系列
+            if (hasGradeData) {
+                series.push({
+                    name: '年级',
+                    type: 'line',
+                    data: personalList,
+                    // smooth: true,
+                    itemStyle: {
+                        color: '#ffffff',
+                        borderColor: '#EE6666',
+                        borderWidth: 2 // 边框宽度
+                    },
+                    lineStyle: {
+                        color: '#EE6666',
+                        width: 2
+                    },
+                    // 默认显示圆点
+                    showSymbol: true,
+                    symbol: 'circle',
+                    symbolSize: 10,
+                    // 鼠标经过时显示圆点
+                    emphasis: {
+                        showSymbol: true,
+                        itemStyle: {
+                            color: '#ffffff',
+                            borderColor: '#EE6666',
+                            borderWidth: 3,
+                        },
+                        symbolSize: 10
+                    }
+                });
+                legendData.push('年级');
+            }
+
+            // 配置项
+            const option = {
+                tooltip: {
+                    trigger: 'axis',
+                    axisPointer: {
+                        type: 'cross',
+                    },
+                    formatter: function (params) {
+                        if (params.length === 0) return '';
+                        let result = params[0].name + ':<br/>';
+                        params.forEach(item => {
+                            let span = '';
+                            if(item.seriesName === '年级'){
+                                span = `<span 
+                                        style="width:10px;
+                                        height:10px;
+                                        display:inline-block;
+                                        background-color:#EE6666;
+                                        border-radius:50%;
+                                        margin-left:5px;
+                                        margin-right:10px;
+                                        "></span>`;
+                            }else if(item.seriesName === '班级'){
+                                span = `<span 
+                                        style="width:10px;
+                                        height:10px;
+                                        display:inline-block;
+                                        background-color:#91CC75;
+                                        border-radius:50%;
+                                        margin-left:5px;
+                                        margin-right:10px;
+                                        "></span>`;
+                            }else{
+                                span = `<span 
+                                        style="width:20px;
+                                        height:10px;
+                                        display:inline-block;
+                                        background-color:#5470C6;
+                                        border-radius:2px;
+                                        margin-right:5px;
+                                        "></span>`;
+                            }
+                            if (item.value !== null && item.value !== undefined && item.value !== '') {
+                                result += `${span}${item.seriesName}得分率: ${item.value}%<br/>`;
+                            } else {
+                                result += `${span}${item.seriesName}得分率: 暂无数据<br/>`;
+                            }
+                        });
+                        return result;
+                    }
+                },
+                legend: {
+                    data: legendData,
+                    left: 80,
+                    top: -2,
+                    orient: 'horizontal',
+                    itemGap: 20,
+                    itemWidth: 20,
+                    itemHeight: 10,
+                    textStyle: {
+                        fontSize: 12,
+                        color: '#333'
+                    },
+                    selectedMode: 'multiple',
+                    selected: {
+                        // 默认选中所有有数据的系列
+                        ...(hasClassData ? { '班级': true } : {}),
+                        ...(hasPersonalData ? { '个人': true } : {}),
+                        ...(hasGradeData ? { '年级': true } : {})
+                    }
+                },
+                grid: {
+                    left: '0%',
+                    right: '0%',
+                    bottom: '2%',
+                    top: '15%',
+                    containLabel: true
+                },
+                xAxis: {
+                    type: 'category',
+                    data: examNames,
+                    axisLabel: {
+                        fontSize: 14,
+                        rotate: 0,
+                        color: '#666',
+                        formatter: function (value) {
+                            // 名称过长时换行,每4个字符换一行
+                            if (value.length > 10) {
+                                return value.replace(/(.{10})/g, '$1\n');
+                            }
+                            return value;
+                        },
+                        height: 60, // 设置足够的高度来容纳多行标签
+                        verticalAlign: 'top'
+                    }
+                },
+                yAxis: {
+                    type: 'value',
+                    // name: '百分比',
+                    axisLabel: {
+                        formatter: '{value}%',
+                        fontSize: 14,
+                        color: '#666',
+                    },
+                    max: 100
+                },
+                series: series
+            };
+
+            // 设置配置项
+            this.chart.setOption(option);
+
+            // 监听图例点击事件,更新全选状态
+            this.chart.on('legendselectchanged', (params) => {
+                const selected = params.selected;
+                const selectedSeriesCount = Object.values(selected).filter(Boolean).length;
+                const totalSeriesCount = legendData.length;
+
+                // 检查是否所有系列都被选中
+                const isAllSelected = selectedSeriesCount === totalSeriesCount;
+                const isNoneSelected = selectedSeriesCount === 0;
+
+                this.$nextTick(() => {
+                    this.allSeriesSelected = isAllSelected;
+                    this.isIndeterminate = !isAllSelected && !isNoneSelected;
+                });
+            });
+        },
+
+        // 切换所有系列的显示状态
+        toggleAllSeries(showAll) {
+            if (this.chart) {
+                // 动态生成selected对象,只包含有数据的系列
+                const selected = {};
+
+
+                // 判断个人数据是否有效
+                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({
+                    legend: {
+                        selected: selected
+                    }
+                });
+                this.isIndeterminate = false;
+            }
         }
     }
-}
+};
 </script>
-<style scoped lang="scss">
-.HistoricalChangeChart {
-    background-color: #ffffff;
+
+<style lang="scss" scoped>
+.historical_change_chart {
+    background: #FFFFFF;
     border-radius: 10px;
     padding: 20px;
-    box-sizing: border-box;
-    .title {
+    margin-bottom: 10px;
+    height: 316px;
+    display: flex;
+    flex-direction: column;
+
+    .chart_title {
         font-size: 16px;
-        font-weight: 600;
-        color: #333333;
+        margin-bottom: 20px;
+
+        .main_title {
+            font-weight: 600;
+            color: #333;
+        }
+
+        .secondary_title {
+            font-weight: normal;
+            color: #999;
+        }
+    }
+
+    .chart {
+        flex: 1;
+        width: 100%;
+        height: calc(100% - 10px);
+        min-height: 290px;
+
+    }
+
+    .radios {
+        width: 10px;
+        height: 10px;
+        border-radius: 50%;
+        display: inline-block;
+    }
+
+    [style^="position: relative"] {
+        flex: 1;
+        display: flex;
+        flex-direction: column;
+    }
+
+    .checkbox {
+        position: absolute;
+        left: 0;
+        top: 0;
+        color: #333;
+
+        // margin-top: 4px;
+        :deep(.el-checkbox__label) {
+            font-size: 12px !important;
+        }
+    }
+
+    .no_data {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        width: 100%;
+        height: 290px;
+        font-size: 14px;
+        color: #999999;
+        background-color: #fafafa;
+        border-radius: 4px;
     }
 }
 </style>
+

+ 46 - 3
src/views/analysisReport/personalProfile/KnowledgeTrack.vue

@@ -1,17 +1,26 @@
 <template>
   <div class="knowledgeTrack">
     <h3 class="title">历次考试知识点追踪</h3>
-
     <!-- 内容区域 -->
-    <div class="map_content">
+    <div class="map_content" v-if="knowledgeStats.length > 0">
       <!-- 考试范围说明 -->
       <div class="knowledge_stats">
+        <p class="range_text">
+          <span class="dot"></span>历次考试:<span v-html="examRange" style="color:#333333;font-weight:600;"></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>
 
+    <!-- 暂无数据 -->
+    <div class="noData" v-else>
+      <div class="module_chart no_content_data no_data" element-loading-background="#ffffff">
+        <span>暂无数据</span>
+      </div>
+    </div>
+
   </div>
 </template>
 
@@ -19,10 +28,20 @@
 export default {
   name: "KnowledgeTrack",
   props: {
-    // 支持从父组件传入数据
+    // 考试范围
+    examRange: {
+      type: String,
+      default: ''
+    },
+    // 包含知识点数据
     knowledgeStats: {
       type: Array,
       default: () => []
+    },
+    // 模式:class/grade/student
+    mode: {
+      type: String,
+      default: 'grade'
     }
   },
   data() {
@@ -82,6 +101,30 @@ export default {
       }
     }
   }
+
+  //暂无数据
+  .noData {
+    position: relative;
+    height: 250px;
+
+    /* 暂无数据样式 */
+    .no_data {
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%, -50%);
+      font-size: 16px;
+      color: #909399;
+      text-align: center;
+      width: 100%;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      background-color: #fafafa;
+      border-radius: 8px;
+    }
+  }
 }  
 
 </style>

+ 75 - 51
src/views/analysisReport/personalProfile/MyGradeHistory.vue

@@ -1,15 +1,11 @@
 <template>
   <div class="myGradeHistory">
     <h3 class="title">我的历次成绩</h3>
-    <div class="content">
-      <el-table 
-        :data="tableData" 
-        style="width: 100%" border 
-        :header-cell-style="headerCellStyle" 
-        :cell-style="cellStyle" stripe
-      >
+    <div class="content" v-if="gradeHistoryData.length > 0">
+      <el-table :data="tableData" style="width: 100%" border :header-cell-style="headerCellStyle"
+        :cell-style="cellStyle" stripe>
         <el-table-column type="index" label="序号" width="70" align="center"></el-table-column>
-        <el-table-column prop="examName" label="考试名称"  align="center"></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>
@@ -28,49 +24,51 @@
       </el-table>
 
     </div>
+
+    <!-- 暂无数据 -->
+    <div class="noData" v-else>
+      <div class="module_chart no_content_data no_data" element-loading-background="#ffffff">
+        <span>暂无数据</span>
+      </div>
+    </div>
   </div>
+
+
 </template>
 
 <script>
 export default {
   name: "MyGradeHistory",
+  props: {
+    mode: {
+      type: String,
+      default: 'grade'
+    },
+    // 接收历次成绩数据
+    gradeHistoryData: {
+      type: Array,
+      default: () => []
+    }
+  },
   data() {
     return {
-      tableData: [
-        {
-          id: 1,
-          examName: '期中考试',
-          fullScore: 150,
-          rawScore: 120,
-          classRank: 5,
-          gradeRank: 20,
-          standardScore: 750,
-          scoreRate: 80
-        },
-        {
-          id: 2,
-          examName: '期末考试',
-          fullScore: 150,
-          rawScore: 135,
-          classRank: 2,
-          gradeRank: 10,
-          standardScore: 780,
-          scoreRate: 90
-        },
-        {
-          id: 3,
-          examName: '模拟考试',
-          fullScore: 150,
-          rawScore: 128,
-          classRank: 3,
-          gradeRank: 15,
-          standardScore: 765,
-          scoreRate: 85.3
-        }
-      ],
     };
   },
   computed: {
+    // 处理数据,映射接口字段到表格字段
+    tableData() {
+      return this.gradeHistoryData.map(item => ({
+        id: item.id || Math.random(),
+        examName: item.examName || '',
+        fullScore: item.fullScore,
+        rawScore: item.originalScore, // 接口字段originalScore映射到rawScore
+        classRank: item.classRank,
+        gradeRank: item.gradeRank,
+        standardScore: item.standardScore,
+        scoreRate: item.scoreRate
+      }));
+    },
+    // 表头样式
     headerCellStyle() {
       return {
         backgroundColor: '#F5F7FA',
@@ -81,6 +79,7 @@ export default {
         lineHeight: '50px'
       };
     },
+    // 表格内容样式
     cellStyle() {
       return {
         color: '#606266',
@@ -119,21 +118,22 @@ export default {
 
   /* 表格区域 */
   .content {
+
     /* 调整表格斑马条纹颜色 */
     :deep(.el-table--striped .el-table__body tr.el-table__row--striped) {
       background-color: #FAFAFA !important;
     }
-    
+
     /* 确保表头行高 */
     :deep(.el-table__header tr) {
       height: 50px !important;
     }
-    
+
     /* 确保表格内容行高 */
     :deep(.el-table__body tr) {
       height: 50px !important;
     }
-    
+
     /* 移除表头单元格内外边距 */
     :deep(.el-table__header th.el-table__cell) {
       padding: 0 !important;
@@ -141,7 +141,7 @@ export default {
       height: 50px !important;
       line-height: 50px !important;
     }
-    
+
     /* 移除表格内容单元格内外边距 */
     :deep(.el-table__body td.el-table__cell) {
       padding: 0 !important;
@@ -149,40 +149,40 @@ export default {
       height: 50px !important;
       line-height: 50px !important;
     }
-    
+
     /* 表格圆角样式 */
     :deep(.el-table) {
       border-radius: 6px !important;
       overflow: hidden;
     }
-    
+
     /* 表头圆角 */
     :deep(.el-table__header-wrapper) {
       border-radius: 6px 6px 0 0;
       overflow: hidden;
     }
-    
+
     /* 表尾圆角 */
     :deep(.el-table__body-wrapper) {
       border-radius: 0 0 6px 6px;
       overflow: hidden;
     }
-    
+
     /* 表头首列圆角 */
     :deep(.el-table__header th.el-table__cell:first-child) {
       border-radius: 6px 0 0 0 !important;
     }
-    
+
     /* 表头末列圆角 */
     :deep(.el-table__header th.el-table__cell:last-child) {
       border-radius: 0 6px 0 0 !important;
     }
-    
+
     /* 表尾首列圆角 */
     :deep(.el-table__body tr:last-child td.el-table__cell:first-child) {
       border-radius: 0 0 0 6px !important;
     }
-    
+
     /* 表尾末列圆角 */
     :deep(.el-table__body tr:last-child td.el-table__cell:last-child) {
       border-radius: 0 0 6px 0 !important;
@@ -195,5 +195,29 @@ export default {
       align-items: center;
     }
   }
+
+  // 暂无数据样式
+  .noData {
+    position: relative;
+    height: 250px;
+
+    /* 暂无数据样式 */
+    .no_data {
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%, -50%);
+      font-size: 16px;
+      color: #909399;
+      text-align: center;
+      width: 100%;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      background-color: #fafafa;
+      border-radius: 8px;
+    }
+  }
 }
 </style>

+ 455 - 102
src/views/analysisReport/personalProfile/index.vue

@@ -1,28 +1,45 @@
 <template>
     <div class="personalProfile">
-        <div class="report_header">
-            <el-radio-group v-model="radio1" @change="portraitTab">
-                <el-radio-button label="grade">年级画像</el-radio-button>
-                <el-radio-button label="class">班级画像</el-radio-button>
-            </el-radio-group>
-        </div>
-        
         <!-- 我的历次成绩子组件 -->
-        <MyGradeHistory :mode="radio1" />
+        <MyGradeHistory :grade-history-data="gradeHistoryData" v-loading="historyloading" />
 
         <!-- 历次考试知识点追踪 -->
-        <KnowledgeTrack :knowledge-stats="knowledgeStats" :mode="radio1" />
+        <KnowledgeTrack 
+            :exam-range="knowledgeMapData.examRange" 
+            :knowledge-stats="knowledgeStats" 
+            v-loading="knowledgeloading"
+        />
 
         <!-- 零分知识点、高频错题知识点 -->
         <zeroScoreKnowledge 
-            :table-data="treeData"
-            :fatal-vulnerability="fatalVulnerability" 
-            :high-vulnerability="highVulnerability"
-            :mode="radio1"
+            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" 
+            @activeTabChange="handleActiveTabChange" 
+            v-loading="zeroloading"
         />
 
         <!-- 历次变化 -->
-        <HistoricalChangeChart :mode="radio1" />
+        <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"
+        />
     </div>
 </template>
 <script>
@@ -30,6 +47,7 @@ import MyGradeHistory from './MyGradeHistory.vue'; //我的历次成绩子组件
 import KnowledgeTrack from './KnowledgeTrack.vue'; //历次考试知识点追踪子组件
 import zeroScoreKnowledge from './zeroScoreKnowledge.vue'; //零分知识点、高频错题知识点子组件
 import HistoricalChangeChart from './HistoricalChangeChart.vue'; //历次变化子组件
+import knowledgePaps from './knowledgePaps.vue'; //薄弱知识点精准提升子组件
 
 export default {
     name: "PersonalProfile",
@@ -37,140 +55,476 @@ export default {
         MyGradeHistory,
         KnowledgeTrack,
         zeroScoreKnowledge,
-        HistoricalChangeChart
+        HistoricalChangeChart,
+        knowledgePaps
     },
     computed: {
-        portraitData(){
+        portraitData() {
             return this.$store.state.report.filterObject;
         },
         // 动态生成知识统计文本,使用repeatKnowledgeNum
         knowledgeStats() {
             const stats = [];
+            const prefix = ''; // 定义prefix变量
             // 当konwLenght不等于0时,显示第一行文本
-            stats.push(
-            `共包含<span style='color:#2E64FA'>23</span>个知识点,
-            分别为<span style='color:#333333;font-weight:600;'>多角度探究作品意蕴、熟语;</span>`
-            ); //包含知识点
+            if (this.knowledgeMapData.konwLenght > 0) {
+                stats.push(
+                    `共包含<span style='color:#2E64FA'>${this.knowledgeMapData.konwLenght}</span>个知识点,
+                分别为<span style='color:#333333;font-weight:600;'>${this.knowledgeMapData.knowledgeList}</span>`
+                ); //包含知识点
+            }
             // 当repeatKnowledgeNum不等于0时,显示第二行文本
-            stats.push(
-                `其中<span style='color:#2E64FA'>15</span>个为多次考试的高频考点,
-                其中<span style='color:#333333;font-weight:600;'>概括分析、比较材料</span>
-                你的得分率<span style='color:#3BA272;font-weight:600;'>提升</span>
-                <span style='color:#333333;font-weight:600;'>文言文断句、文言文阅读、材料作文</span>
-                你的得分率<span style="color:#F56C6C;font-weight:600;">下降</span>,
-                希望针对下降的知识点进行总结和反思。`
-            ); //重复知识点
+            if (this.knowledgeMapData.repeatKnowledgeNum > 0) {
+                // 获取得分率变化的文本部分
+                let changeText = '';
+                const hasRaise = this.knowledgeMapData.raiseKnowledgeList;
+                const hasDrop = this.knowledgeMapData.dropKnowledgeList;
+                // 只有当raiseKnowledgeList不为空时,添加得分率提升的部分
+                if (hasRaise) {
+                    changeText += `其中<span style="color:#333333;font-weight:600;">
+                        ${this.knowledgeMapData.raiseKnowledgeList}</span>
+                        ${prefix}得分率<span style="color:#3BA272;font-weight:600;">提升</span>`;
+                }
+                // 只有当dropKnowledgeList不为空时,添加得分率下降的部分
+                if (hasDrop) {
+                    if (hasRaise) {
+                        changeText += `,`;
+                    }
+                    changeText += `<span style="color:#333333;font-weight:600;">${this.knowledgeMapData.dropKnowledgeList}</span>${prefix}得分率
+                    <span style="color:#F56C6C;font-weight:600;">下降</span>,希望针对下降的知识点进行总结和反思。`;
+                } else if (hasRaise) {
+                    // 如果只有提升,添加句号
+                    changeText += `。`;
+                }
+                // 确保始终返回数组
+                if (changeText) {
+                    stats.push(changeText);
+                }
+            }
             return stats;
         },
 
     },
     data() {
         return {
-            // 画像切换
-            radio1: "grade",
-
+            // 历次成绩数据
+            gradeHistoryData: [],
+            // 历次考试知识点追踪数据
+            knowledgeMapData: {
+                examRange: "", //考试名称
+                konwLenght: 0, // 包含知识点数
+                knowledgeList: [],// 包含知识点列表 
+                repeatKnowledgeNum: 0, // 重复知识点数
+                raiseKnowledgeList: [], //提升知识点
+                dropKnowledgeList: [],//下降知识点 
+            },
+            // 零点知识点数据
+            activeView: 'graph', // 默认图形视图
+            // 按图形查看
+            subjectScoreRate: 0, // 科目得分率
             // 知识点树状图数据
             treeData: [],
             // 零分知识点数据
             fatalVulnerability: [],
             // 高频错题知识点数据
-            highVulnerability: [], 
+            highVulnerability: [],
+
+            // 知识点名称
+            knowledgeName: '',
+            knowledgeId: '',
+            // 历次变化图表数据
+            historicalChangeData: {
+                personalList: [], //个人得分率
+                classList: [], //班级得分率
+                gradeList: [],//年级得分率
+                examName: [] // 考试名称
+            },
+            // 我的历次成绩-加载状态
+            historyloading: false,
+            // 历次考试知识点追踪-加载状态
+            knowledgeloading: false,
+            // 零分知识点、高频错题知识点-加载状态
+            zeroloading: false,
+            // 历次变化图表-加载状态
+            historicalChangeLoading: false,
+            // 薄弱知识点精准提升-加载状态
+            knowledgePapsLoading: false,
         };
     },
+    watch: {
+        // 监听knowledgeId变化
+        portraitData(newVal, oldVal) {
+            if (newVal !== oldVal) {
+                // 点击知识点后,更新历次变化
+                this.MyGradeHistoryData();
+            }
+        }
+    },
     created() {
-        // 历次考试知识点追踪数据
+        // 我的历次成绩-并且获取历次考试ids examIds用于调用其余接口
         this.MyGradeHistoryData();
-        //零分知识点、高频知识点
-        this.vulerabData();
-        // 年级画像
     },
     methods: {
-        // 画像切换
-        portraitTab() {
-        },
-        // 历次考试知识点---年级画像
-        MyGradeHistoryData(){
+        // 我的历次成绩---年级画像
+        MyGradeHistoryData() {
+            // 加载状态-清空数据
+            this.historyloading = true;
+            // 历次考试知识点追踪-加载状态
+             this.knowledgeloading = false,
+            // 零分知识点、高频错题知识点-加载状态
+             this.zeroloading = false,
+            // 历次变化图表-加载状态
+             this.historicalChangeLoading = false,
+            this.gradeHistoryData = [];
             let examParams = {
                 examId: this.portraitData.examId,
                 subjectCode: this.portraitData.subjectCode,
             };
             this.$api.personalProfile.examScoreList(examParams).then(res => {
                 if (res.code === 200) {
-                    this.treeData = res.data;
-                    console.log(this.treeData);
+                    let data = res.data || [];
+                    if (data) {
+                        this.gradeHistoryData = res.data;
+                        let examIds = this.gradeHistoryData.map(item => item.examId || '');
+                        this.portraitData.examIds = examIds;
+                        // 加载状态
+                        this.historyloading = false;
+
+                        // 零分知识点、高频错题知识点
+                        this.vulerabData();
+                        // 历次考试知识点追踪
+                        this.previousExamsData();
+                    }else{
+                        // 加载状态
+                        this.historyloading = false;
+                        this.gradeHistoryData = [];
+                    }
+                }else{
+                    // 加载状态
+                    this.historyloading = false;
+                    this.gradeHistoryData = [];
                 }
             })
         },
+
+        //历次考试知识点追踪
+        previousExamsData() {
+            // 加载状态-清空数据
+            this.knowledgeloading = true;
+            this.knowledgeMapData = {
+                examRange: "", //考试名称
+                konwLenght: 0, // 包含知识点数
+                knowledgeList: [],// 包含知识点列表 
+                repeatKnowledgeNum: 0, // 重复知识点数
+                raiseKnowledgeList: [], //提升知识点
+                dropKnowledgeList: [],//下降知识点 
+            };
+            let examParams = {
+                examId: this.portraitData.examId, //当前考试id
+                subjectCode: this.portraitData.subjectCode, //学科code
+                examIds: this.portraitData.examIds, //历次考试ids
+            };
+            this.$api.personalProfile.examKnowledgePointTrack(examParams).then(res => {
+                if (res.code === 200) {
+                    let data = res.data;
+                    if (data) {
+                        this.knowledgeloading = false;
+                        // 考试名称列表
+                        if (data.examNameList) {
+                            this.knowledgeMapData.examRange = data.examNameList.join('、');
+                        }
+                        // 知识点列表
+                        if (data.knowledgeList) {
+                            this.knowledgeMapData.konwLenght = data.knowledgeList.length || 0; //知识点列表长度
+                            this.knowledgeMapData.knowledgeList = data.knowledgeList.join('、');
+                        }
+                        this.knowledgeMapData.repeatKnowledgeNum = data.repeatKnowledgeNum || 0; //重复知识点数
+                        // 提升知识点
+                        if (data.raiseKnowledgeList) {
+                            this.knowledgeMapData.raiseKnowledgeList = data.raiseKnowledgeList.join('、');
+                        }
+                        // 下降知识点
+                        if (data.dropKnowledgeList) {
+                            this.knowledgeMapData.dropKnowledgeList = data.dropKnowledgeList.join('、');
+                        }
+
+                    }else{
+                        // 加载状态
+                        this.knowledgeloading = false;
+                        this.knowledgeMapData = {
+                            examRange: "", //考试名称
+                            konwLenght: 0, // 包含知识点数
+                            knowledgeList: [],// 包含知识点列表 
+                            repeatKnowledgeNum: 0, // 重复知识点数
+                            raiseKnowledgeList: [], //提升知识点
+                            dropKnowledgeList: [],//下降知识点 
+                        };
+                    }
+                }else{
+                    // 加载状态
+                    this.knowledgeloading = false;
+                    this.knowledgeMapData = {
+                        examRange: "", //考试名称
+                        konwLenght: 0, // 包含知识点数
+                        knowledgeList: [],// 包含知识点列表 
+                        repeatKnowledgeNum: 0, // 重复知识点数
+                        raiseKnowledgeList: [], //提升知识点
+                        dropKnowledgeList: [],//下降知识点 
+                    };
+                }
+            })
+        },
+
         // 零分知识点、高频错题知识点----年级
         vulerabData() {
-            // 零分知识点数据
-            this.fatalVulnerability = [
-                {
-                    "knowledgeName": "区间的关系与运算",
-                    "knowledgeId": 10550,
-                    "parentId": 10548,
-                    "gradeScoreRate": "50", // 年级得分率
-                    "classScoreRate": "54.55", // 班级得分率
-                    "scoreRateDiff": "4.55",   // 得分率差值
-                    "knowledgeType": 1, // 知识点类型 1:零分知识点 2:高频错题知识点
-                    "examNum": 2 // 考试次数
-                },
-                {
-                    "knowledgeName": "具体函数的定义域",
-                    "knowledgeId": 10552,
-                    "parentId": 10551,
-                    "gradeScoreRate": "37.9",
-                    "classScoreRate": "27.27",
-                    "scoreRateDiff": "-10.63",
-                    "knowledgeType": 1,
-                    "examNum": 2
+            // 加载状态-清空数据
+            this.zeroloading = true;
+            this.treeData = [];
+            this.subjectScoreRate = 0; //科目得分率
+            this.fatalVulnerability = []; // 零分知识点数据
+            this.highVulnerability = []; // 高频错题知识点数据
+            let examParams = {
+                examId: this.portraitData.examId, //当前考试id
+                examIds: this.portraitData.examIds, //历次考试ids
+                subjectCode: this.portraitData.subjectCode, //学科code
+                knowledgeId: this.portraitData.knowledgeId, //	知识点id(针对历次和试题查询)
+            };
+            this.$api.personalProfile.knowledgeTreeData(examParams).then(res => {
+                if (res.code === 200) {
+                    let data = res.data;
+                    if (data) {
+                        // 加载状态-清空数据
+                        this.zeroloading = false;
+
+                        // 知识点树状图数据
+                        this.treeData = data.tree || [];
+                        // 将字符串转换为数字类型
+                        this.subjectScoreRate = parseFloat(data.subjectScoreRate) || 0; //科目得分率
+                        // 零分知识点数据
+                        this.fatalVulnerability = data.fatalVulnerability || [];
+                        // 高频错题知识点数据
+                        this.highVulnerability = data.highVulnerability || [];
+
+                        // 接口调用成功后,刷新图表
+                        this.$nextTick(() => {
+                            if (this.$refs.knowledgeGraphRef) {
+                                this.$refs.knowledgeGraphRef.updateChart();
+                            }
+                        });
+                        // 获取知识点第一条数据id
+                        if (this.fatalVulnerability.length > 0) {
+                            this.knowledgeName = this.fatalVulnerability[0].knowledgeName || '';
+                            this.knowledgeId = this.fatalVulnerability[0].knowledgeId || 0;
+                        } else {
+                            // 高频错题知识点
+                            if (this.highVulnerability.length > 0) {
+                                this.knowledgeName = this.highVulnerability[0].knowledgeName || '';
+                                this.knowledgeId = this.highVulnerability[0].knowledgeId || 0;
+                            } else {
+                                this.knowledgeName = '';
+                                this.knowledgeId = '';
+                            }
+                        }
+                        
+                        // 首次加载默认获取知识点
+                        this.KnowledgeTrackData();
+                        // 加载推送试题
+                        this.pushQuestionData();
+                    }else{
+                        this.treeData = [];
+                        this.subjectScoreRate = 0; //科目得分率
+                        this.fatalVulnerability = []; // 零分知识点数据
+                        this.highVulnerability = []; // 高频错题知识点数据
+                        // 首次加载默认获取知识点
+                        this.zeroloading = false;
+                    }
+                }else{
+                    this.treeData = [];
+                    this.subjectScoreRate = 0; //科目得分率
+                    this.fatalVulnerability = []; // 零分知识点数据
+                    this.highVulnerability = []; // 高频错题知识点数据
+                    // 加载状态
+                    this.zeroloading = false;
                 }
-            ];
-            // 高频错题知识点数据
-            this.highVulnerability = [
-                {
-                    "knowledgeName": "抽象函数的定义域",
-                    "knowledgeId": 10553,
-                    "parentId": 10551,
-                    "gradeScoreRate": "6.45",
-                    "classScoreRate": "12.12",
-                    "scoreRateDiff": "5.67",
-                    "knowledgeType": 1,
-                    "examNum": 2
-                },
-                {
-                    "knowledgeName": "求函数的零点",
-                    "knowledgeId": 10820,
-                    "parentId": 10818,
-                    "gradeScoreRate": "34.03",
-                    "classScoreRate": "35.76",
-                    "scoreRateDiff": "1.73",
-                    "knowledgeType": 1,
-                    "examNum": 1
+            })
+        },
+
+        // 获取历次变化数据
+        KnowledgeTrackData() {
+            // 加载状态-清空数据
+            this.historicalChangeLoading = false;
+            // 清除历次变化图表数据
+            this.historicalChangeData = {
+                personalList: [],
+                classList: [],
+                gradeList: [],
+                examName: []
+            };
+            // return
+            let params = {
+                examId: this.portraitData.examId, //当前考试id
+                examIds: this.portraitData.examIds, //历次考试ids
+                subjectCode: this.portraitData.subjectCode, //学科code
+                knowledgeId: this.knowledgeId, //	知识点id(针对历次和试题查询)
+            };
+            this.$api.personalProfile.knowledgeExamPrevious(params).then(res => {
+                if (res.code === 200) {
+                    let data = res.data
+                    if (!data) {
+                        this.$message.error(res.msg);
+                        return
+                    }
+                    // 加载状态-清空数据
+                    this.historicalChangeLoading = false;
+
+                    // 初始化空数组
+                    let personalList = []; //个人得分率
+                    let classList = []; //班级得分率
+                    let gradeList = []; //年级得分率
+                    let examNames = []; //考试名称
+
+                    // 遍历数据
+                    if (data && Array.isArray(data)) {
+                        data.forEach(item => {
+                            // 添加个人得分率
+                            personalList.push(item.personalScoreRate);
+                            // 添加班级得分率
+                            classList.push(item.classScoreRate);
+                            // 添加年级得分率
+                            gradeList.push(item.gradeScoreRate);
+                            // 添加考试名称
+                            examNames.push(item.examName);
+                        });
+                    }
+                    // 更新历次变化图表数据
+                    this.historicalChangeData = {
+                        personalList: personalList,
+                        classList: classList,
+                        gradeList: gradeList,
+                        examName: examNames,
+                    };
+                    
+                    this.$nextTick(() => {
+                        if (this.$refs.historicalChangeChartRef) {
+                            this.$refs.historicalChangeChartRef.initChart();
+                        }
+                    });
+                } else {
+                    // 清除历次变化图表数据
+                    this.historicalChangeData = {
+                        personalList: [],
+                        classList: [],
+                        gradeList: [],
+                        examName: []
+                    };
+                    // 加载状态-清空数据
+                    this.historicalChangeLoading = false;
                 }
-            ];
+            }).catch(err => {
+                // 清除历次变化图表数据
+                this.historicalChangeData = {
+                    personalList: [],
+                    classList: [],
+                    gradeList: [],
+                    examName: []
+                };
+                // 加载状态-清空数据
+                this.historicalChangeLoading = false;
+            })
+        },
+
+        // 推题列表
+        pushQuestionData(){
+            let params = {
+                examId: this.portraitData.examId, //当前考试id
+                subjectCode: this.portraitData.subjectCode, //学科code
+                knowledgeId: this.knowledgeId, //知识点id(针对历次和试题查询)
+            };
+            this.$api.personalProfile.pushQuestionList(params).then(res => {
+                if (res.code === 200) {
+                    let data = res.data || [];
+                    console.log(data);
+                } else {
+                   
+                }
+            });
+        },
+
+        // 知识点列表点击事件
+        handleKnowledgeItemClick(data) {
+            // 点击知识点后,更新图表数据
+            this.knowledgeId = data.item.knowledgeId ;
+            this.knowledgeName = data.item.knowledgeName ;
+            // 点击知识点后,更新历次变化
+            this.KnowledgeTrackData();
+            // 点击知识点后,更新推题列表
+            this.pushQuestionData();
+        },
+
+        // 零分、高频切换
+        handleActiveTabChange(tab) {
+            // highFreq 高频
+            // zero 零分
+            if (tab === 'highFreq') {
+                // 高频知识点
+                if(this.highVulnerability.length > 0) {
+                    this.knowledgeId = this.highVulnerability[0].knowledgeId ;
+                    this.knowledgeName = this.highVulnerability[0].knowledgeName;
+                } else {
+                    this.knowledgeId = '';
+                    this.knowledgeName = '';
+                }
+            } else if (tab === 'zero') {
+                // 零分知识点
+                if(this.fatalVulnerability.length > 0) {
+                    this.knowledgeId = this.fatalVulnerability[0].knowledgeId || 0;
+                    this.knowledgeName = this.fatalVulnerability[0].knowledgeName || '';
+                } else {
+                    this.knowledgeId = '';
+                    this.knowledgeName = '';
+                }
+            }
+            if(!this.knowledgeId){
+                this.historicalChangeData = {
+                    personalList: [],
+                    classList: [],
+                    gradeList: [],
+                    examName: []
+                };
+                this.$nextTick(() => {
+                    if (this.$refs.historicalChangeChartRef) {
+                        this.$refs.historicalChangeChartRef.initChart();
+                    }
+                });
+                return
+            }
+            // 点击知识点后,更新历次变化
+            this.KnowledgeTrackData();
+            // 点击知识点后,更新推题列表
+            this.pushQuestionData();
         },
     },
 }
 </script>
 
 <style scoped lang="scss">
-.personalProfile{
+.personalProfile {
+
     // 确保所有子组件之间有10px的间隔
-    > * {
+    >* {
         margin-bottom: 10px;
         font-family: PingFang SC, PingFang SC;
         font-size: 14px;
         font-weight: 400;
         color: #333333;
     }
-    
-    > *:last-child {
+
+    >*:last-child {
         margin-bottom: 0;
     }
-    
+
     // 画像切换
-    .report_header{
+    .report_header {
         padding: 10px 0;
         text-align: center;
         font-size: 14px;
@@ -183,19 +537,18 @@ export default {
 
         /* 选中状态 */
         :deep(.el-radio-button__orig-radio:checked + .el-radio-button__inner) {
-        font-weight: 600 !important;
-        color: #ffffff !important;
+            font-weight: 600 !important;
+            color: #ffffff !important;
         }
 
         :deep(.el-radio-button__inner) {
-        height: 36px;
-        line-height: 34px;
-        padding: 0px;
-        width: 76px;
-        text-align: center;
-        color: #999999;
+            height: 36px;
+            line-height: 34px;
+            padding: 0px;
+            width: 76px;
+            text-align: center;
+            color: #999999;
         }
     }
 }
-
 </style>

+ 290 - 0
src/views/analysisReport/personalProfile/knowledgePaps.vue

@@ -0,0 +1,290 @@
+<template>
+    <div class="knowledgePaps">
+        <div class="chart_title">
+            <div class="title_left">
+                <span class="secondary_title" style="font-weight: bold;">3、</span>
+                <span class="secondary_title" v-if="titleParts.knowledgeName">{{ titleParts.knowledgeName }} / </span>
+                <span class="main_title">薄弱知识点精准提升</span>
+            </div>
+            <button class="export_btn">
+                <i class="iconfont icon_export"></i>
+                导出精准提升试题
+            </button>
+        </div>
+
+        <div class="data_container" v-if="knowledgePapsData.length > 0">
+            <div class="question_item" v-for="(item, index) in knowledgePapsData" :key="index">
+                <div class="question_header">
+                    <div class="question_meta">
+                        <span class="question_num">{{ index + 1 }}</span>
+                        <span class="question_type">题型类型:
+                            <i class="typeColor" style="color:#333333">{{ item.type }}</i>
+                        </span>
+                        <span class="question_difficulty">难度:
+                            <i class="typeColor" style="color:#fac858">{{ item.difficulty }}</i>
+                        </span>
+                    </div>
+                    <div class="question_source">来源:
+                        <i class="typeColor" style="color:#333333">{{ item.source }}</i>
+                    </div>
+                </div>
+                <div class="question_content">
+                    <p>{{ item.question }}</p>
+                    <div class="options">
+                        <div v-for="(option, optIndex) in item.options" :key="optIndex" class="option_item">
+                            <span class="option_letter">{{ String.fromCharCode(65 + optIndex) }}.</span>
+                            <span class="option_text">{{ option }}</span>
+                        </div>
+                    </div>
+                </div>
+                <div class="question_tags">
+                    <span class="tags_label">知识点:</span>
+                    <span class="tag" v-for="(tag, tagIndex) in item.tags" :key="tagIndex">{{ tag }}</span>
+                </div>
+            </div>
+        </div>
+        <div class="map_content" v-else>
+            <p>暂无数据</p>
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    name: "knowledgePaps",
+    props: {
+        // 知识点名称
+        knowledgeName: {
+            type: String,
+            default: ''
+        }
+    },
+    computed: {
+        // 标题部分
+        titleParts() {
+            return {
+                knowledgeName: this.knowledgeName
+            }
+        }
+    },
+    data() {
+        return {
+            // 薄弱知识点精准提升数据
+            knowledgePapsData: []
+        }
+    },
+    mounted() {
+        // 加载薄弱知识点精准提升数据
+        this.knowledgePapsData = [
+            {
+                type: "语言表达",
+                difficulty: "较易",
+                source: "大数据题库",
+                question: "下列各组词语中书写无误的一组是",
+                options: [
+                    "寻常巷陌 舞榭歌台 歌忱无忧 惊滔拍岸",
+                    "玉枕纱厨 故国神游 淡装浓抹 夜弦西边",
+                    "刎颈之交 玉簪螺髻 烟柳画桥 晓风残月",
+                    "良晨好景 吟赏烟霞 完璧归赵 神鸦社鼓"
+                ],
+                tags: ["古代诗歌阅读", "分析、鉴赏诗歌意境"]
+            },
+            {
+                type: "阅读理解",
+                difficulty: "中等",
+                source: "大数据题库",
+                question: "下列对文章内容的理解,不正确的一项是",
+                options: [
+                    "作者认为,学习的目的是为了提升自身修养,而不是为了追求功名利禄",
+                    "文章通过对比古今学者的学习态度,强调了脚踏实地的重要性",
+                    "作者主张学习应该广泛涉猎,不必专注于某一领域",
+                    "文章最后提出了“学以致用”的观点,认为学习应该服务于实践"
+                ],
+                tags: ["现代文阅读", "分析文章结构,归纳内容要点"]
+            }
+        ];
+    }
+}
+</script>
+<style scoped lang="scss">
+.knowledgePaps {
+    background: #FFFFFF;
+    border-radius: 10px;
+    padding: 20px;
+    margin-bottom: 10px;
+    position: relative;
+
+    // 标题部分
+    .chart_title {
+        font-size: 16px;
+        margin-bottom: 10px;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        flex-wrap: wrap;
+        gap: 10px;
+
+        .title_left {
+            display: flex;
+            align-items: center;
+            gap: 5px;
+        }
+
+        .main_title {
+            font-weight: 600;
+            color: #333;
+        }
+
+        .secondary_title {
+            font-weight: normal;
+            color: #999;
+        }
+
+        .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;
+            }
+        }
+    }
+    // 内容部分
+    .question_item {
+        background: #FFFFFF;
+        border-radius: 10px 10px 10px 10px;
+        border: 1px solid #DCDFE6;
+        padding: 20px;
+        margin-bottom: 10px;
+        transition: all 0.3s ease;
+        &:hover {
+            box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+        }
+        // 试题标题
+        .question_header {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding-bottom: 20px;
+            flex-wrap: wrap;
+            gap: 10px;
+            border-bottom: 1px solid #EBEEF5;
+            .question_meta {
+                display: flex;
+                align-items: center;
+                gap: 10px;
+                flex-wrap: wrap;
+
+                .question_num {
+                    display: inline-block;
+                    width: 24px;
+                    height: 24px;
+                    line-height: 24px;
+                    background: #2E64FA;
+                    color: white;
+                    border-radius: 4px;
+                    text-align: center;
+                    font-size: 14px;
+                }
+
+                .question_type,
+                .question_difficulty {
+                    font-size: 14px;
+                    color: #999999;
+                }
+            }
+
+            .question_source {
+                font-size: 14px;
+                color: #999;
+            }
+        }
+        // 试题内容
+        .question_content {
+            padding: 20px 0;
+            border-bottom: 1px solid #EBEEF5;
+            p {
+                font-size: 14px;
+                color: #666666;
+                margin-bottom: 10px;
+                line-height: 1.5;
+            }
+
+            .options {
+                display: grid;
+                grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+                gap: 10px;
+
+                .option_item {
+                    display: flex;
+                    align-items: flex-start;
+                    gap: 8px;
+                    font-size: 14px;
+                    color: #666;
+                    line-height: 1.5;
+
+                    .option_letter {
+                        min-width: 20px;
+                    }
+
+                    .option_text {
+                        flex: 1;
+                    }
+                }
+            }
+        }
+        // 试题底部
+        .question_tags {
+            display: flex;
+            align-items: center;
+            gap: 10px;
+            flex-wrap: wrap;
+            margin-top: 20px;
+            .tags_label {
+                font-size: 14px;
+                color: #666;
+            }
+            .tag {
+                display: inline-block;
+                padding: 4px 10px;
+                background: rgba(59,162,114,0.1);
+                border-radius: 4px 4px 4px 4px;
+                border: 1px solid #3BA272;
+                color: #3BA272;
+            }
+        }
+    }
+    .question_item:last-child {
+        margin-bottom: 0;
+    }
+    .map_content {
+        p {
+            margin-bottom: 5px;
+            text-align: center;
+            color: #999;
+            padding: 40px 0;
+        }
+    }
+}
+
+</style>

File diff suppressed because it is too large
+ 404 - 380
src/views/analysisReport/personalProfile/zeroScoreKnowledge.vue


Some files were not shown because too many files changed in this diff