字段读取优化

This commit is contained in:
zhonghua 2026-03-16 13:53:44 +08:00
parent 87899886d1
commit 3918ccc9af

View File

@ -13,11 +13,7 @@
</div>
</div>
<div class="header-actions">
<a-range-picker
v-model:value="dateRange"
:placeholder="['开始日期', '结束日期']"
style="width: 240px;"
/>
<a-range-picker v-model:value="dateRange" :placeholder="['开始日期', '结束日期']" style="width: 240px;" />
<a-button class="export-btn">
<DownloadOutlined class="btn-icon" />
导出报告
@ -71,13 +67,8 @@
<!-- 标签页 -->
<div class="report-tabs">
<div class="tab-header">
<div
v-for="tab in tabs"
:key="tab.key"
class="tab-item"
:class="{ 'active': activeTab === tab.key }"
@click="activeTab = tab.key"
>
<div v-for="tab in tabs" :key="tab.key" class="tab-item" :class="{ 'active': activeTab === tab.key }"
@click="activeTab = tab.key">
<BarChartOutlined v-if="tab.icon === 'bar-chart'" class="tab-icon" />
<SolutionOutlined v-else-if="tab.icon === 'solution'" class="tab-icon" />
<ReadOutlined v-else-if="tab.icon === 'read'" class="tab-icon" />
@ -143,7 +134,8 @@
<div class="teacher-info">
<div class="teacher-name">{{ teacher.name }}</div>
<div class="teacher-rating">
<StarFilled v-for="i in 5" :key="i" class="star" :class="{ 'filled': i <= Math.round(teacher.avgRating) }" />
<StarFilled v-for="i in 5" :key="i" class="star"
:class="{ 'filled': i <= Math.round(teacher.avgRating) }" />
<span class="rating-value">{{ teacher.avgRating.toFixed(1) }}</span>
</div>
</div>
@ -187,9 +179,15 @@
<div class="course-info">
<div class="course-name">{{ course.name }}</div>
<div class="course-stats-inline">
<span><BookOutlined style="margin-right: 4px;" />授课{{ course.lessonCount }}</span>
<span><SolutionOutlined style="margin-right: 4px;" />{{ course.teacherCount }}位教师</span>
<span><TeamOutlined style="margin-right: 4px;" />{{ course.studentCount }}名学生</span>
<span>
<BookOutlined style="margin-right: 4px;" />授课{{ course.lessonCount }}
</span>
<span>
<SolutionOutlined style="margin-right: 4px;" />{{ course.teacherCount }}位教师
</span>
<span>
<TeamOutlined style="margin-right: 4px;" />{{ course.studentCount }}名学生
</span>
</div>
</div>
<div class="course-rating">
@ -221,18 +219,24 @@
</div>
<div class="student-stats">
<div class="stat-row">
<span class="stat-label"><BookOutlined style="margin-right: 4px;" />参与课程</span>
<span class="stat-label">
<BookOutlined style="margin-right: 4px;" />参与课程
</span>
<span class="stat-value">{{ student.lessonCount }} </span>
</div>
<div class="stat-row">
<span class="stat-label"><AimOutlined style="margin-right: 4px;" />专注度</span>
<span class="stat-label">
<AimOutlined style="margin-right: 4px;" />专注度
</span>
<div class="progress-mini">
<div class="progress-fill" :style="{ width: student.avgFocus * 20 + '%' }"></div>
</div>
<span class="stat-value">{{ student.avgFocus }}/5</span>
</div>
<div class="stat-row">
<span class="stat-label"><FireOutlined style="margin-right: 4px;" />参与度</span>
<span class="stat-label">
<FireOutlined style="margin-right: 4px;" />参与度
</span>
<div class="progress-mini pink">
<div class="progress-fill" :style="{ width: student.avgParticipation * 20 + '%' }"></div>
</div>
@ -247,12 +251,8 @@
</div>
<!-- 教师详情弹窗 -->
<a-modal
v-model:open="teacherDetailVisible"
:title="`${selectedTeacher?.name} - 教师报告详情`"
width="600px"
:footer="null"
>
<a-modal v-model:open="teacherDetailVisible" :title="`${selectedTeacher?.name} - 教师报告详情`" width="600px"
:footer="null">
<div v-if="selectedTeacher" class="detail-content">
<div class="detail-header">
<div class="detail-avatar">
@ -283,14 +283,17 @@
</div>
<a-divider />
<div class="detail-section">
<h4><BookOutlined style="margin-right: 8px;" />教学概况</h4>
<h4>
<BookOutlined style="margin-right: 8px;" />教学概况
</h4>
<p class="detail-desc">
{{ selectedTeacher.name }} 老师共完成 {{ selectedTeacher.lessonCount }} 次授课
使用了 {{ selectedTeacher.courseCount }} 门不同的课程
累计获得 {{ selectedTeacher.feedbackCount }} 次教学反馈
<template v-if="selectedTeacher.avgRating > 0">
平均评分为 {{ selectedTeacher.avgRating.toFixed(1) }}
{{ selectedTeacher.avgRating >= 4.5 ? '教学效果优秀!' : selectedTeacher.avgRating >= 3.5 ? '教学效果良好。' : '继续努力!' }}
{{ selectedTeacher.avgRating >= 4.5 ? '教学效果优秀!' : selectedTeacher.avgRating >= 3.5 ? '教学效果良好。' : '继续努力!'
}}
</template>
<template v-else>
暂无评分数据
@ -301,12 +304,8 @@
</a-modal>
<!-- 课程详情弹窗 -->
<a-modal
v-model:open="courseDetailVisible"
:title="`${selectedCourse?.name} - 课程报告详情`"
width="600px"
:footer="null"
>
<a-modal v-model:open="courseDetailVisible" :title="`${selectedCourse?.name} - 课程报告详情`" width="600px"
:footer="null">
<div v-if="selectedCourse" class="detail-content">
<div class="detail-header">
<div class="detail-avatar course-avatar">
@ -337,7 +336,9 @@
</div>
<a-divider />
<div class="detail-section">
<h4><ReadOutlined style="margin-right: 8px;" />课程概况</h4>
<h4>
<ReadOutlined style="margin-right: 8px;" />课程概况
</h4>
<p class="detail-desc">
{{ selectedCourse.name }}共被授课 {{ selectedCourse.lessonCount }}
{{ selectedCourse.teacherCount }} 位教师使用该课程进行教学
@ -412,7 +413,7 @@ const studentData = ref<StudentReport[]>([]);
const totalLessons = computed(() => overviewData.value.totalLessons);
const activeTeacherCount = computed(() => overviewData.value.activeTeacherCount);
const usedCourseCount = computed(() => overviewData.value.usedCourseCount);
const avgRating = computed(() => overviewData.value.avgRating.toFixed(1));
const avgRating = computed(() => (overviewData.value.avgRating || 0).toFixed(1));
//
const loadData = async () => {