首页问候语-智能化进程1 #2

Merged
biss merged 9 commits from codex/smart into master 2026-08-10 12:02:04 +08:00
2 changed files with 19 additions and 0 deletions
Showing only changes of commit 20faea492b - Show all commits
@@ -24,6 +24,14 @@ const rows = computed(() => [
const selectedRow = computed(() => rows.value.find(item => item.key === activeScope.value) ?? rows.value[0])
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) {
return Number(value).toFixed(1)
@@ -210,6 +218,7 @@ onBeforeUnmount(() => {
</dl>
</article>
</section>
<section v-if="recommendation" class="action-advice"><span>ACTION ADVICE</span><p>{{ recommendation }}</p></section>
<el-empty v-else-if="!loading" description="暂无可展示的课程统计" />
<section v-if="rows.length" class="chart-panel">
+10
View File
@@ -102,6 +102,7 @@ const exams = ref<ExamItem[]>([])
const grades = ref<GradeItem[]>([])
const dashboardGreeting = ref<DashboardGreeting | null>(null)
const warnings = ref<WarningItem[]>([])
const graduation = ref<any>(null)
const now = ref(new Date())
const categoryLabels: Record<string, string> = {
@@ -311,6 +312,7 @@ async function loadOverview() {
http.get('/grades/student/transcript'),
http.get<DashboardGreeting>('/dashboard/greeting'),
http.get<WarningItem[]>('/warnings/my-warnings'),
http.get('/student/academic-planning'),
])
if (results[0].status === 'fulfilled') {
@@ -342,6 +344,7 @@ async function loadOverview() {
} else {
failedSections.value.push('学业风险雷达')
}
if (results[6].status === 'fulfilled') graduation.value = results[6].value.data
loading.value = false
}
@@ -391,6 +394,11 @@ onMounted(loadOverview)
</div>
</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
v-if="failedSections.length"
type="warning"
@@ -648,6 +656,7 @@ onMounted(loadOverview)
border: 1px solid #dce6eb;
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 header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
@@ -1002,6 +1011,7 @@ onMounted(loadOverview)
@media (max-width: 600px) {
.student-greeting-insights { padding: 15px 18px; grid-template-columns: 1fr; }
.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 span { grid-column: 1 / -1; }
.student-overview {