This commit is contained in:
2026-08-11 15:53:44 +08:00 Unverified
parent 85c7c7a683
commit 21b00be7a3
5 changed files with 21 additions and 21 deletions
+1 -1
View File
@@ -122,7 +122,7 @@ button { cursor: pointer; }
.content { padding: 28px 32px 48px; max-width: 1540px; margin: 0 auto; } .content { padding: 28px 32px 48px; max-width: 1540px; margin: 0 auto; }
.mobile-only { display: none; } .mobile-only { display: none; }
.section-kicker { color: var(--teal); font: 700 10px/1.2 Consolas, monospace; letter-spacing: .16em; } .section-kicker { color: var(--teal); font: 700 11px/1.2 "Microsoft YaHei", sans-serif; letter-spacing: .1em; }
.term-hero { min-height: 178px; padding: 32px 36px; display: flex; align-items: end; color: white; background: linear-gradient(118deg, #233876, #192d67 65%, #116d70); position: relative; overflow: hidden; } .term-hero { min-height: 178px; padding: 32px 36px; display: flex; align-items: end; color: white; background: linear-gradient(118deg, #233876, #192d67 65%, #116d70); position: relative; overflow: hidden; }
.term-hero::after { content: ""; position: absolute; right: -40px; top: -110px; width: 360px; height: 360px; border: 54px solid rgba(255,255,255,.055); border-radius: 50%; } .term-hero::after { content: ""; position: absolute; right: -40px; top: -110px; width: 360px; height: 360px; border: 54px solid rgba(255,255,255,.055); border-radius: 50%; }
.term-hero h2 { margin: 12px 0 7px; font-family: "STZhongsong", "Songti SC", serif; font-size: clamp(25px, 3vw, 38px); letter-spacing: .05em; } .term-hero h2 { margin: 12px 0 7px; font-family: "STZhongsong", "Songti SC", serif; font-size: clamp(25px, 3vw, 38px); letter-spacing: .05em; }
+11 -11
View File
@@ -356,7 +356,7 @@ onMounted(() => load())
<div class="page-stack message-center"> <div class="page-stack message-center">
<section class="page-intro message-intro"> <section class="page-intro message-intro">
<div> <div>
<span class="section-kicker">MESSAGE CENTER</span> <span class="section-kicker">消息中心</span>
<h2>消息中心</h2> <h2>消息中心</h2>
<p>系统通知审核待办课程变动与成绩消息统一汇总重要信息不再散落在业务页面</p> <p>系统通知审核待办课程变动与成绩消息统一汇总重要信息不再散落在业务页面</p>
</div> </div>
@@ -373,6 +373,15 @@ onMounted(() => load())
> >
发消息 发消息
</el-button> </el-button>
<el-button
:icon="Check"
:loading="markingAllRead"
:disabled="!unreadCount"
:title="unreadCount ? '将全部未读消息标为已读' : '当前没有未读消息'"
@click="markAllRead"
>
全部已读
</el-button>
<el-button :icon="Refresh" @click="activeTab === 'sent' ? loadSent() : load()"> <el-button :icon="Refresh" @click="activeTab === 'sent' ? loadSent() : load()">
刷新 刷新
</el-button> </el-button>
@@ -433,15 +442,6 @@ onMounted(() => load())
@clear="load(true)" @clear="load(true)"
/> />
<el-checkbox v-model="unreadOnly" @change="load(true)">仅看未读</el-checkbox> <el-checkbox v-model="unreadOnly" @change="load(true)">仅看未读</el-checkbox>
<el-button
v-if="unreadCount"
:icon="Check"
:loading="markingAllRead"
text
@click="markAllRead"
>
全部已读
</el-button>
</section> </section>
<section v-loading="loading" class="message-list"> <section v-loading="loading" class="message-list">
@@ -508,7 +508,7 @@ onMounted(() => load())
> >
<header class="compose-overview"> <header class="compose-overview">
<div> <div>
<span class="panel-kicker">AUTHORIZED DELIVERY</span> <span class="panel-kicker">发送范围</span>
<h3>编写并发送消息</h3> <h3>编写并发送消息</h3>
<p>收件范围始终受当前账号的数据权限约束发送后不可撤回</p> <p>收件范围始终受当前账号的数据权限约束发送后不可撤回</p>
</div> </div>
+3 -3
View File
@@ -355,7 +355,7 @@ onMounted(loadOverview)
<div v-loading="loading" class="student-overview"> <div v-loading="loading" class="student-overview">
<section class="student-overview-hero"> <section class="student-overview-hero">
<div class="student-hero-copy"> <div class="student-hero-copy">
<span class="section-kicker">MY ACADEMIC DAY</span> <span class="section-kicker">我的学习安排</span>
<h2>{{ dashboardGreeting?.title ?? `${greeting}${auth.user?.displayName ?? '同学'}` }}</h2> <h2>{{ dashboardGreeting?.title ?? `${greeting}${auth.user?.displayName ?? '同学'}` }}</h2>
<p>{{ dashboardGreeting?.subtitle ?? todayLabel }}<template v-if="!dashboardGreeting && timetable?.term"> · {{ timetable.term.name }}</template></p> <p>{{ dashboardGreeting?.subtitle ?? todayLabel }}<template v-if="!dashboardGreeting && timetable?.term"> · {{ timetable.term.name }}</template></p>
</div> </div>
@@ -379,7 +379,7 @@ onMounted(loadOverview)
<section class="student-risk-radar" :class="{ attention: activeWarnings.length }"> <section class="student-risk-radar" :class="{ attention: activeWarnings.length }">
<header> <header>
<div> <div>
<span class="panel-kicker">ACADEMIC RADAR</span> <span class="panel-kicker">学业提醒</span>
<h3>学业风险雷达</h3> <h3>学业风险雷达</h3>
</div> </div>
<button type="button" @click="router.push('/warnings')">查看全部 <el-icon><ArrowRight /></el-icon></button> <button type="button" @click="router.push('/warnings')">查看全部 <el-icon><ArrowRight /></el-icon></button>
@@ -395,7 +395,7 @@ onMounted(loadOverview)
</section> </section>
<section v-if="graduation?.baseline" class="graduation-nav"> <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> <div><span class="panel-kicker">毕业进度</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> <button type="button" @click="router.push('/academic-planning')">查看毕业航线 <el-icon><ArrowRight /></el-icon></button>
</section> </section>
+1 -1
View File
@@ -31,7 +31,7 @@ onMounted(load)
<el-result v-if="failed" icon="warning" title="教学驾驶舱加载失败" sub-title="请检查服务连接后重新加载。"><template #extra><el-button type="primary" @click="load">重新加载</el-button></template></el-result> <el-result v-if="failed" icon="warning" title="教学驾驶舱加载失败" sub-title="请检查服务连接后重新加载。"><template #extra><el-button type="primary" @click="load">重新加载</el-button></template></el-result>
<template v-else-if="greeting"> <template v-else-if="greeting">
<section class="cockpit-hero"> <section class="cockpit-hero">
<span>TEACHING COCKPIT</span><h2>{{ greeting.title }}</h2><p>{{ greeting.subtitle }}</p><small>{{ greeting.narrative }}</small> <span>教学工作台</span><h2>{{ greeting.title }}</h2><p>{{ greeting.subtitle }}</p><small>{{ greeting.narrative }}</small>
</section> </section>
<section class="cockpit-metrics"><article v-for="item in greeting.insights" :key="item.label" :class="item.tone"><span>{{ item.label }}</span><strong>{{ item.value }}</strong><small>{{ item.hint }}</small></article></section> <section class="cockpit-metrics"><article v-for="item in greeting.insights" :key="item.label" :class="item.tone"><span>{{ item.label }}</span><strong>{{ item.value }}</strong><small>{{ item.hint }}</small></article></section>
<section class="cockpit-grid"> <section class="cockpit-grid">
+5 -5
View File
@@ -753,7 +753,7 @@ onMounted(async () => {
<section class="timetable-heading"> <section class="timetable-heading">
<div> <div>
<span class="section-kicker">{{ isMine && isTeacher ? 'MY TEACHING SCHEDULE' : isMine ? 'MY TIMETABLE' : isTeacherView ? 'TEACHER TIMETABLE' : isManager ? 'TIMETABLE CENTER' : 'CLASS TIMETABLE' }}</span> <span class="section-kicker">{{ isMine && isTeacher ? '我的授课安排' : isMine ? '我的课程安排' : isTeacherView ? '教师课表' : isManager ? '课表管理' : '班级课表' }}</span>
<h2>{{ isMine && isTeacher ? '我的授课课表' : isMine ? '我的课表' : isTeacherView ? '教师课表' : isManager ? '课表查询中心' : '班级课表查询' }}</h2> <h2>{{ isMine && isTeacher ? '我的授课课表' : isMine ? '我的课表' : isTeacherView ? '教师课表' : isManager ? '课表查询中心' : '班级课表查询' }}</h2>
<p v-if="isMine && isTeacher">展示本人本学期所有授课安排仅采用教务处已发布课表</p> <p v-if="isMine && isTeacher">展示本人本学期所有授课安排仅采用教务处已发布课表</p>
<p v-else-if="isMine">行政班课程与本人已选课程统一展示仅采用教务处已发布课表</p> <p v-else-if="isMine">行政班课程与本人已选课程统一展示仅采用教务处已发布课表</p>
@@ -1097,7 +1097,7 @@ onMounted(async () => {
<section v-if="viewMode === 'overview' && sortedExamEntries.length" class="exam-overview"> <section v-if="viewMode === 'overview' && sortedExamEntries.length" class="exam-overview">
<header> <header>
<div> <div>
<span>EXAM AGENDA</span> <span>考试安排</span>
<strong>已发布考试安排</strong> <strong>已发布考试安排</strong>
</div> </div>
<small> {{ sortedExamEntries.length }} · 按考试日期排序</small> <small> {{ sortedExamEntries.length }} · 按考试日期排序</small>
@@ -1133,7 +1133,7 @@ onMounted(async () => {
> >
<header> <header>
<div> <div>
<span>LAB SESSIONS</span> <span>实验安排</span>
<strong>个人实验安排</strong> <strong>个人实验安排</strong>
</div> </div>
<small> {{ sortedExperimentEntries.length }} · 预约变化会自动同步</small> <small> {{ sortedExperimentEntries.length }} · 预约变化会自动同步</small>
@@ -1170,7 +1170,7 @@ onMounted(async () => {
<div v-loading="calendarLoading" class="calendar-subscription"> <div v-loading="calendarLoading" class="calendar-subscription">
<template v-if="calendarSubscription?.isEnabled"> <template v-if="calendarSubscription?.isEnabled">
<div class="calendar-status active"> <div class="calendar-status active">
<span>LIVE FEED</span> <span>实时变动</span>
<div> <div>
<strong>订阅已启用</strong> <strong>订阅已启用</strong>
<small>课表考试和实验安排变更后日历客户端会在下次同步时自动更新</small> <small>课表考试和实验安排变更后日历客户端会在下次同步时自动更新</small>
@@ -1214,7 +1214,7 @@ onMounted(async () => {
<template v-else-if="calendarSubscription"> <template v-else-if="calendarSubscription">
<div class="calendar-status"> <div class="calendar-status">
<span>PRIVATE CALENDAR</span> <span>个人日历</span>
<div> <div>
<strong>将教学安排同步到常用日历</strong> <strong>将教学安排同步到常用日历</strong>
<small>启用后会生成仅属于你的长期订阅地址可随时重置或停用</small> <small>启用后会生成仅属于你的长期订阅地址可随时重置或停用</small>