首页问候语-智能化进程1 #2
@@ -24,6 +24,14 @@ const rows = computed(() => [
|
|||||||
|
|
||||||
const selectedRow = computed(() => rows.value.find(item => item.key === activeScope.value) ?? rows.value[0])
|
const selectedRow = computed(() => rows.value.find(item => item.key === activeScope.value) ?? rows.value[0])
|
||||||
const selectedDistribution = computed(() => selectedRow.value?.value.distribution ?? [])
|
const selectedDistribution = computed(() => selectedRow.value?.value.distribution ?? [])
|
||||||
|
const recommendation = computed(() => {
|
||||||
|
const value = selectedRow.value?.value
|
||||||
|
if (!value) return ''
|
||||||
|
if (Number(value.passRate) < 70) return `合格率为 ${score(value.passRate)}%,建议优先复核低分段学生的平时与期末分项,并安排针对性答疑。`
|
||||||
|
if (Number(value.averageScore) < 70) return `平均分为 ${score(value.averageScore)},建议检查易失分知识点与教学进度,结合分数段安排补强。`
|
||||||
|
if (Number(value.standardDeviation) > 20) return `成绩离散度较高,建议关注不同教学班或学生群体的学习差异,核对评价标准与教学支持。`
|
||||||
|
return `平均分 ${score(value.averageScore)}、合格率 ${score(value.passRate)}%,当前表现稳定;可重点关注低分段学生的持续跟进。`
|
||||||
|
})
|
||||||
|
|
||||||
function score(value: unknown) {
|
function score(value: unknown) {
|
||||||
return Number(value).toFixed(1)
|
return Number(value).toFixed(1)
|
||||||
@@ -210,6 +218,7 @@ onBeforeUnmount(() => {
|
|||||||
</dl>
|
</dl>
|
||||||
</article>
|
</article>
|
||||||
</section>
|
</section>
|
||||||
|
<section v-if="recommendation" class="action-advice"><span>ACTION ADVICE</span><p>{{ recommendation }}</p></section>
|
||||||
<el-empty v-else-if="!loading" description="暂无可展示的课程统计" />
|
<el-empty v-else-if="!loading" description="暂无可展示的课程统计" />
|
||||||
|
|
||||||
<section v-if="rows.length" class="chart-panel">
|
<section v-if="rows.length" class="chart-panel">
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ const exams = ref<ExamItem[]>([])
|
|||||||
const grades = ref<GradeItem[]>([])
|
const grades = ref<GradeItem[]>([])
|
||||||
const dashboardGreeting = ref<DashboardGreeting | null>(null)
|
const dashboardGreeting = ref<DashboardGreeting | null>(null)
|
||||||
const warnings = ref<WarningItem[]>([])
|
const warnings = ref<WarningItem[]>([])
|
||||||
|
const graduation = ref<any>(null)
|
||||||
const now = ref(new Date())
|
const now = ref(new Date())
|
||||||
|
|
||||||
const categoryLabels: Record<string, string> = {
|
const categoryLabels: Record<string, string> = {
|
||||||
@@ -311,6 +312,7 @@ async function loadOverview() {
|
|||||||
http.get('/grades/student/transcript'),
|
http.get('/grades/student/transcript'),
|
||||||
http.get<DashboardGreeting>('/dashboard/greeting'),
|
http.get<DashboardGreeting>('/dashboard/greeting'),
|
||||||
http.get<WarningItem[]>('/warnings/my-warnings'),
|
http.get<WarningItem[]>('/warnings/my-warnings'),
|
||||||
|
http.get('/student/academic-planning'),
|
||||||
])
|
])
|
||||||
|
|
||||||
if (results[0].status === 'fulfilled') {
|
if (results[0].status === 'fulfilled') {
|
||||||
@@ -342,6 +344,7 @@ async function loadOverview() {
|
|||||||
} else {
|
} else {
|
||||||
failedSections.value.push('学业风险雷达')
|
failedSections.value.push('学业风险雷达')
|
||||||
}
|
}
|
||||||
|
if (results[6].status === 'fulfilled') graduation.value = results[6].value.data
|
||||||
loading.value = false
|
loading.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,6 +394,11 @@ onMounted(loadOverview)
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section v-if="graduation?.baseline" class="graduation-nav">
|
||||||
|
<div><span class="panel-kicker">GRADUATION NAVIGATION</span><h3>毕业导航</h3><p>已完成 {{ graduation.baseline.planCompletedCredits ?? 0 }} 学分,距离培养方案要求还差 {{ graduation.baseline.creditGap ?? 0 }} 学分。</p></div>
|
||||||
|
<button type="button" @click="router.push('/academic-planning')">查看毕业航线 <el-icon><ArrowRight /></el-icon></button>
|
||||||
|
</section>
|
||||||
|
|
||||||
<el-alert
|
<el-alert
|
||||||
v-if="failedSections.length"
|
v-if="failedSections.length"
|
||||||
type="warning"
|
type="warning"
|
||||||
@@ -648,6 +656,7 @@ onMounted(loadOverview)
|
|||||||
border: 1px solid #dce6eb;
|
border: 1px solid #dce6eb;
|
||||||
background: #fbfdfd;
|
background: #fbfdfd;
|
||||||
}
|
}
|
||||||
|
.graduation-nav{padding:19px 22px;display:flex;justify-content:space-between;align-items:center;gap:18px;border:1px solid #dce6eb;background:#f7faf9}.graduation-nav h3{margin:7px 0;color:var(--ink);font-size:17px}.graduation-nav p{margin:0;color:#59677a;font-size:12px;line-height:1.6}.graduation-nav button{display:inline-flex;align-items:center;gap:5px;border:0;background:transparent;color:var(--indigo);font-size:12px;white-space:nowrap}
|
||||||
|
|
||||||
.student-risk-radar.attention { border-left: 3px solid #c4812a; background: #fffcf6; }
|
.student-risk-radar.attention { border-left: 3px solid #c4812a; background: #fffcf6; }
|
||||||
.student-risk-radar header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
|
.student-risk-radar header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
|
||||||
@@ -1002,6 +1011,7 @@ onMounted(loadOverview)
|
|||||||
@media (max-width: 600px) {
|
@media (max-width: 600px) {
|
||||||
.student-greeting-insights { padding: 15px 18px; grid-template-columns: 1fr; }
|
.student-greeting-insights { padding: 15px 18px; grid-template-columns: 1fr; }
|
||||||
.student-risk-radar { padding: 18px; }
|
.student-risk-radar { padding: 18px; }
|
||||||
|
.graduation-nav{padding:18px;align-items:flex-start;flex-direction:column}
|
||||||
.risk-list button { grid-template-columns: 1fr auto; }
|
.risk-list button { grid-template-columns: 1fr auto; }
|
||||||
.risk-list span { grid-column: 1 / -1; }
|
.risk-list span { grid-column: 1 / -1; }
|
||||||
.student-overview {
|
.student-overview {
|
||||||
|
|||||||
Reference in New Issue
Block a user