前端
This commit is contained in:
+1
-1
@@ -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; }
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user