feat: 新增纯顶部导航模式,统一平台管理员样式

新增纯顶部导航模式(超管/校管),移除侧边栏并调整布局样式;统一按钮、卡片、统计图标等视觉风格为教育蓝体系,优化弹窗、输入框、主按钮等组件样式,确保平台管理员界面一致性。
fix/exam-question-access-material-excel-delete-draft
qinzhenpen 2 weeks ago
parent 9893e33a56
commit a23ab33ca5

@ -249,6 +249,13 @@
} }
} }
/* 纯顶部导航模式(超管/校管,不渲染侧边栏):清除侧边菜单默认宽度的占位 */
/* 需压过 #app .teacherLayout .main-container 的 margin-left:180px !important(位置更靠后),用双类提权 */
.topNavbarOnly.teacherLayout .main-container,
.topNavbarOnly .main-container {
margin-left: 0 !important;
}
/* 超管端主区域:与教师端一致改浅色(body.teacher-light-mode 时),保留暗色作为无亮色主题时的兜底 */ /* 超管端主区域:与教师端一致改浅色(body.teacher-light-mode 时),保留暗色作为无亮色主题时的兜底 */
.platform-admin-main { .platform-admin-main {
height: calc(100vh - 50px); height: calc(100vh - 50px);
@ -273,17 +280,19 @@
/* @at-root 跳出 #app 并提升特异性(压过 #app .platform-admin-main 的 ID 权重深色规则) */ /* @at-root 跳出 #app 并提升特异性(压过 #app .platform-admin-main 的 ID 权重深色规则) */
@at-root body.teacher-light-mode #app .platform-admin-main { @at-root body.teacher-light-mode #app .platform-admin-main {
background: // 纯白画布,与教师端/学生端亮色体系一致(禁渐变、禁浅灰底)
radial-gradient(circle at 12% 18%, rgba(30, 136, 229, 0.05), transparent 34%), background: #ffffff !important;
radial-gradient(circle at 78% 6%, rgba(66, 165, 245, 0.04), transparent 28%),
linear-gradient(135deg, #f7fafd 0%, #eef4fb 48%, #f5f8fc 100%) !important;
&::-webkit-scrollbar-track { &::-webkit-scrollbar-track {
background: rgba(30, 60, 100, 0.06); background: transparent;
} }
&::-webkit-scrollbar-thumb { &::-webkit-scrollbar-thumb {
background: rgba(59, 130, 246, 0.35); background: #d1d5db;
&:hover {
background: #9ca3af;
}
} }
} }

@ -1569,9 +1569,10 @@ body.teacher-light-mode {
} }
} }
// ===== 弹窗(teacher-dialog / admin-edit-dialog:扁平纯白 + 教育风令牌)===== // ===== 弹窗(teacher-dialog / admin-edit-dialog / platform-admin-dialog:扁平纯白 + 教育风令牌)=====
.teacher-dialog, .teacher-dialog,
.admin-edit-dialog { .admin-edit-dialog,
.platform-admin-dialog {
// dialog 作用域内重设 EP CSS 变量,防止 html.dark 的 --el-color-primary:#00aaff 污染 // dialog 作用域内重设 EP CSS 变量,防止 html.dark 的 --el-color-primary:#00aaff 污染
--el-color-primary: #3b82f6; --el-color-primary: #3b82f6;
--el-color-primary-light-3: #60a5fa; --el-color-primary-light-3: #60a5fa;
@ -1582,6 +1583,20 @@ body.teacher-light-mode {
--el-color-primary-dark-2: #2563eb; --el-color-primary-dark-2: #2563eb;
--el-color-white: #ffffff; --el-color-white: #ffffff;
// 令牌重设:teleport 到 body 的弹层继承不到 #app .teacherLayout 上的变量,必须在本作用域重发
--edu-primary: #3b82f6;
--edu-primary-deep: #2563eb;
--edu-primary-soft: #eff6ff;
--text-strong: #1f2937;
--text-body: #4b5563;
--text-muted: #9ca3af;
--border-color: #e5e7eb;
--r-card: 12px;
--r-control: 8px;
--fs-page: 17px;
--fs-body: 12px;
--fs-tag: 11px;
background: #ffffff !important; background: #ffffff !important;
border: 1px solid var(--border-color) !important; border: 1px solid var(--border-color) !important;
border-radius: var(--r-card) !important; border-radius: var(--r-card) !important;
@ -1647,6 +1662,50 @@ body.teacher-light-mode {
font-size: var(--fs-body); font-size: var(--fs-body);
} }
// 输入框 / 选择器外壳:白底灰边(覆盖 admin-theme.scss 的深色 wrapper 残留)
// select 边框在 .el-select__wrapper 上,必须与 .el-input__wrapper 同步覆盖
.el-input__wrapper,
.el-select__wrapper,
.el-select .el-input__wrapper,
.el-textarea__inner {
background: #ffffff !important;
background-image: none !important;
border: 1px solid var(--border-color) !important;
box-shadow: none !important;
&:hover {
border-color: #d1d5db !important;
}
&.is-focus,
&.is-focused,
&:focus-within {
border-color: var(--edu-primary) !important;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.12) !important;
}
}
// 禁用态:浅灰底
.el-input.is-disabled .el-input__wrapper,
.el-select .el-select__wrapper.is-disabled,
.el-select.is-disabled .el-select__wrapper {
background: #f3f4f6 !important;
border-color: var(--border-color) !important;
}
// select 选中值 / placeholder 文字颜色(覆盖 admin-theme 暗色残留)
.el-select__placeholder,
.el-select__selected-item,
.el-select__input {
color: var(--text-strong) !important;
}
.el-select__placeholder.is-transparent,
.el-input__inner::placeholder,
.el-textarea__inner::placeholder {
color: var(--text-muted) !important;
}
// input / textarea / select 文字 // input / textarea / select 文字
.el-input__inner, .el-input__inner,
.el-textarea__inner { .el-textarea__inner {
@ -1713,6 +1772,28 @@ body.teacher-light-mode {
} }
} }
// 主按钮(保存/提交):方案 A 实心深蓝,恢复被上方默认兜底漂白的 primary
.el-button--primary:not(.is-text):not(.is-link) {
background: #2563eb !important;
background-image: none !important;
border-color: #2563eb !important;
color: #ffffff !important;
box-shadow: 0 1px 2px rgba(37, 99, 235, 0.35) !important;
&:hover,
&:focus {
background: #1d4ed8 !important;
border-color: #1d4ed8 !important;
color: #ffffff !important;
}
&.is-disabled {
background: #93c5fd !important;
border-color: #93c5fd !important;
color: #ffffff !important;
}
}
// ===== radio-button(题型选择器):教育风蓝色选中 ===== // ===== radio-button(题型选择器):教育风蓝色选中 =====
// 注意:不能用 --el-color-primary CSS 变量,因为 html.dark 可能设成暗色 #00aaff, // 注意:不能用 --el-color-primary CSS 变量,因为 html.dark 可能设成暗色 #00aaff,
// 必须显式写 var(--edu-primary) 让 teacher-light-mode 令牌生效 // 必须显式写 var(--edu-primary) 让 teacher-light-mode 令牌生效

@ -1,5 +1,5 @@
<template> <template>
<div :class="['navbar', { 'teacher-navbar': role === 3, 'student-navbar': role === 4 }]"> <div :class="['navbar', { 'teacher-navbar': role === 3 || role === 1, 'student-navbar': role === 4 }]">
<!-- 背景装饰(学生端已移除,仅平台/学校管理员保留) --> <!-- 背景装饰(学生端已移除,仅平台/学校管理员保留) -->
<svg v-if="role === 1 || role === 2" class="nav-bg-decoration" viewBox="0 0 1920 60" preserveAspectRatio="xMidYMid slice"> <svg v-if="role === 1 || role === 2" class="nav-bg-decoration" viewBox="0 0 1920 60" preserveAspectRatio="xMidYMid slice">
<defs> <defs>
@ -81,7 +81,7 @@
</div> </div>
<div class="divider"></div> <div class="divider"></div>
<div class="avatar-container"> <div class="avatar-container">
<el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click" :popper-class="role === 3 ? 'teacher-dropdown-popper' : role === 4 ? 'student-dropdown-popper' : ''"> <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click" :popper-class="role === 3 || role === 1 ? 'teacher-dropdown-popper' : role === 4 ? 'student-dropdown-popper' : ''">
<div class="avatar-wrapper"> <div class="avatar-wrapper">
<div class="avatar-ring"> <div class="avatar-ring">
<img src="../../assets/images/头像.webp" class="user-avatar" /> <img src="../../assets/images/头像.webp" class="user-avatar" />
@ -608,7 +608,9 @@ onMounted(() => {
.nav-bg-decoration { display: none; } .nav-bg-decoration { display: none; }
// 品牌区:去渐变去模糊,logo 描边收敛为教育蓝 // 品牌区:去渐变去模糊,logo 描边收敛为教育蓝
.TnavTitle { // 超管端(role=1)品牌区使用 .navTitle,教师端(role=3)使用 .TnavTitle,统一覆盖
.TnavTitle,
.navTitle {
background: transparent; background: transparent;
backdrop-filter: none; backdrop-filter: none;
@ -620,11 +622,13 @@ onMounted(() => {
path:first-child { fill: rgba(59, 130, 246, 0.1); } path:first-child { fill: rgba(59, 130, 246, 0.1); }
} }
span { span,
.nacber-name {
color: #1f2937; color: #1f2937;
font-size: 15px; font-size: 15px;
font-weight: 700; font-weight: 700;
letter-spacing: 0; letter-spacing: 0;
text-shadow: none;
} }
} }
} }

@ -42,6 +42,7 @@ const classObj = computed(() => ({
mobile: device.value === "mobile", mobile: device.value === "mobile",
teacherLayout: role.value === 3 || role.value === 1, teacherLayout: role.value === 3 || role.value === 1,
studentLayout: role.value !== 1 && role.value !== 2 && role.value !== 3, studentLayout: role.value !== 1 && role.value !== 2 && role.value !== 3,
topNavbarOnly: role.value === 1 || role.value === 2,
})); }));
const { width, height } = useWindowSize(); const { width, height } = useWindowSize();

@ -102,7 +102,7 @@
<!-- 教师管理卡片 --> <!-- 教师管理卡片 -->
<div class="quick-card" @click="go('/platform-teachers/index')"> <div class="quick-card" @click="go('/platform-teachers/index')">
<div class="card-icon teacher"> <div class="card-icon">
<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"> <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/> <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/> <circle cx="9" cy="7" r="4"/>
@ -155,8 +155,8 @@
</div> </div>
</div> </div>
<div class="stat-card"> <div class="stat-card">
<div class="stat-icon accent"> <div class="stat-icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ff6b35" stroke-width="1.5"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#2563eb" stroke-width="1.5">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/> <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/>
<circle cx="9" cy="7" r="4"/> <circle cx="9" cy="7" r="4"/>
</svg> </svg>
@ -173,8 +173,8 @@
</div> </div>
</div> </div>
<div class="stat-card"> <div class="stat-card">
<div class="stat-icon success"> <div class="stat-icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#2ba471" stroke-width="1.5"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#2563eb" stroke-width="1.5">
<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/> <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/>
<path d="M22 4L12 14.01l-3-3"/> <path d="M22 4L12 14.01l-3-3"/>
</svg> </svg>
@ -191,8 +191,8 @@
</div> </div>
</div> </div>
<div class="stat-card"> <div class="stat-card">
<div class="stat-icon warning"> <div class="stat-icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffbe00" stroke-width="1.5"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#2563eb" stroke-width="1.5">
<circle cx="12" cy="12" r="10"/> <circle cx="12" cy="12" r="10"/>
<path d="M12 6v6l4 2"/> <path d="M12 6v6l4 2"/>
</svg> </svg>
@ -224,14 +224,14 @@
</div> </div>
<div class="activity-list"> <div class="activity-list">
<div class="activity-item"> <div class="activity-item">
<div class="activity-dot school"></div> <div class="activity-dot"></div>
<div class="activity-content"> <div class="activity-content">
<p class="activity-text"><strong>华东理工大学</strong> 提交入驻申请</p> <p class="activity-text"><strong>华东理工大学</strong> 提交入驻申请</p>
<span class="activity-time">10 分钟前</span> <span class="activity-time">10 分钟前</span>
</div> </div>
</div> </div>
<div class="activity-item"> <div class="activity-item">
<div class="activity-dot teacher"></div> <div class="activity-dot"></div>
<div class="activity-content"> <div class="activity-content">
<p class="activity-text"><strong>张老师</strong> 申请成为管理教师</p> <p class="activity-text"><strong>张老师</strong> 申请成为管理教师</p>
<span class="activity-time">25 分钟前</span> <span class="activity-time">25 分钟前</span>
@ -245,7 +245,7 @@
</div> </div>
</div> </div>
<div class="activity-item"> <div class="activity-item">
<div class="activity-dot teacher"></div> <div class="activity-dot"></div>
<div class="activity-content"> <div class="activity-content">
<p class="activity-text"><strong>李老师</strong> 完成教师认证</p> <p class="activity-text"><strong>李老师</strong> 完成教师认证</p>
<span class="activity-time">2 小时前</span> <span class="activity-time">2 小时前</span>
@ -331,7 +331,7 @@ const schoolAdminLinks = [
align-items: center; align-items: center;
justify-content: center; justify-content: center;
border-radius: 10px; border-radius: 10px;
background: #e5e7eb; background: #ffffff;
border: 1px solid #e5e7eb; border: 1px solid #e5e7eb;
} }
@ -380,12 +380,6 @@ const schoolAdminLinks = [
background: #eff6ff; background: #eff6ff;
border: 1px solid #dbeafe; border: 1px solid #dbeafe;
color: #2563eb; color: #2563eb;
&.teacher {
background: rgba(234, 88, 12, 0.08);
border-color: rgba(234, 88, 12, 0.25);
color: #ea580c;
}
} }
h2 { h2 {
@ -440,7 +434,7 @@ const schoolAdminLinks = [
&:hover { &:hover {
border-color: #3b82f6; border-color: #3b82f6;
background: #f9fafb; background: #ffffff;
} }
} }
@ -452,22 +446,7 @@ const schoolAdminLinks = [
justify-content: center; justify-content: center;
border-radius: 12px; border-radius: 12px;
background: #eff6ff; background: #eff6ff;
border: 1px solid #e5e7eb; border: 1px solid #dbeafe;
&.accent {
background: rgba(234, 88, 12, 0.08);
border-color: rgba(234, 88, 12, 0.25);
}
&.success {
background: rgba(43, 164, 113, 0.1);
border-color: rgba(43, 164, 113, 0.3);
}
&.warning {
background: rgba(232, 163, 61, 0.12);
border-color: rgba(232, 163, 61, 0.3);
}
} }
.stat-info { .stat-info {
@ -532,7 +511,7 @@ const schoolAdminLinks = [
transition: all 0.2s; transition: all 0.2s;
&:hover { &:hover {
background: #f9fafb; background: #ffffff;
border-color: #e5e7eb; border-color: #e5e7eb;
} }
} }
@ -543,20 +522,10 @@ const schoolAdminLinks = [
border-radius: 50%; border-radius: 50%;
margin-top: 5px; margin-top: 5px;
flex-shrink: 0; flex-shrink: 0;
&.school {
background: #2563eb; background: #2563eb;
box-shadow: 0 0 8px rgba(37, 99, 235, 0.35);
}
&.teacher {
background: #ea580c;
box-shadow: none;
}
&.success { &.success {
background: #2ba471; background: #2ba471;
box-shadow: none;
} }
} }

@ -353,7 +353,7 @@ onMounted(load);
} }
.config-hint { .config-hint {
color: #7a8499; color: #9ca3af;
font-size: 12px; font-size: 12px;
line-height: 1.6; line-height: 1.6;
margin-top: 6px; margin-top: 6px;
@ -387,42 +387,42 @@ onMounted(load);
// 查看按钮 // 查看按钮
&.view { &.view {
color: #00aaff; color: #3b82f6;
.btn-icon { .btn-icon {
background: rgba(0, 170, 255, 0.12); background: rgba(59, 130, 246, 0.12);
} }
&:hover { &:hover {
background: rgba(0, 170, 255, 0.1); background: rgba(59, 130, 246, 0.1);
.btn-icon { .btn-icon {
background: rgba(0, 170, 255, 0.25); background: rgba(59, 130, 246, 0.25);
} }
} }
} }
// 编辑按钮 // 编辑按钮
&.edit { &.edit {
color: #00ff9d; color: #3b82f6;
.btn-icon { .btn-icon {
background: rgba(0, 255, 157, 0.1); background: rgba(59, 130, 246, 0.1);
} }
&:hover { &:hover {
background: rgba(0, 255, 157, 0.1); background: rgba(59, 130, 246, 0.1);
.btn-icon { .btn-icon {
background: rgba(0, 255, 157, 0.2); background: rgba(59, 130, 246, 0.2);
} }
} }
} }
// 删除按钮 // 删除按钮
&.delete { &.delete {
color: #ff6b6b; color: #ef4444;
.btn-icon { .btn-icon {
background: rgba(255, 107, 107, 0.1); background: rgba(239, 68, 68, 0.1);
} }
&:hover { &:hover {
background: rgba(255, 107, 107, 0.1); background: rgba(239, 68, 68, 0.1);
.btn-icon { .btn-icon {
background: rgba(255, 107, 107, 0.2); background: rgba(239, 68, 68, 0.2);
} }
} }
} }

@ -266,42 +266,42 @@ onMounted(async () => {
// 查看按钮 // 查看按钮
&.view { &.view {
color: #00aaff; color: #3b82f6;
.btn-icon { .btn-icon {
background: rgba(0, 170, 255, 0.12); background: rgba(59, 130, 246, 0.12);
} }
&:hover { &:hover {
background: rgba(0, 170, 255, 0.1); background: rgba(59, 130, 246, 0.1);
.btn-icon { .btn-icon {
background: rgba(0, 170, 255, 0.25); background: rgba(59, 130, 246, 0.25);
} }
} }
} }
// 编辑按钮 // 编辑按钮
&.edit { &.edit {
color: #00ff9d; color: #3b82f6;
.btn-icon { .btn-icon {
background: rgba(0, 255, 157, 0.1); background: rgba(59, 130, 246, 0.1);
} }
&:hover { &:hover {
background: rgba(0, 255, 157, 0.1); background: rgba(59, 130, 246, 0.1);
.btn-icon { .btn-icon {
background: rgba(0, 255, 157, 0.2); background: rgba(59, 130, 246, 0.2);
} }
} }
} }
// 删除按钮 // 删除按钮
&.delete { &.delete {
color: #ff6b6b; color: #ef4444;
.btn-icon { .btn-icon {
background: rgba(255, 107, 107, 0.1); background: rgba(239, 68, 68, 0.1);
} }
&:hover { &:hover {
background: rgba(255, 107, 107, 0.1); background: rgba(239, 68, 68, 0.1);
.btn-icon { .btn-icon {
background: rgba(255, 107, 107, 0.2); background: rgba(239, 68, 68, 0.2);
} }
} }
} }

Loading…
Cancel
Save