字段读取优化
This commit is contained in:
parent
87899886d1
commit
3918ccc9af
@ -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 () => {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user