已完成“考试安排与考场管理”模块:
考试计划草稿、场次配置与正式发布。 教学班、考试时间、考场、监考教师关联。 自动校验考场容量。 阻止考场、监考教师和学生考试时间冲突。 管理员查看考生名单。 教师查看个人监考安排。 学生查看已发布考试日程。 SQLite 增量升级和 MySQL 正式迁移。
This commit is contained in:
1 parent
af52e27a3a
commit
7f3e37de20
18 files changed
+3057
-2
No files matched your search
@@ -11,6 +11,7 @@ import {
|
||||
Calendar,
|
||||
CircleCheck,
|
||||
DocumentChecked,
|
||||
AlarmClock,
|
||||
User,
|
||||
UserFilled,
|
||||
} from '@element-plus/icons-vue'
|
||||
@@ -43,6 +44,7 @@ const pageTitle = computed(() => {
|
||||
schedules: '排课与课表',
|
||||
'course-selections': '选课与教学班',
|
||||
grades: '成绩与学业档案',
|
||||
exams: '考试与考场',
|
||||
users: '用户与权限',
|
||||
}
|
||||
return titles[String(route.name)] ?? '教务管理'
|
||||
@@ -138,6 +140,13 @@ onMounted(() => auth.refresh().catch(() => undefined))
|
||||
<el-icon><DocumentChecked /></el-icon>
|
||||
<template #title>{{ auth.user?.roles.includes('Student') ? '学业成绩' : '成绩管理' }}</template>
|
||||
</el-menu-item>
|
||||
<el-menu-item
|
||||
v-if="auth.user?.roles.some((role) => ['SuperAdmin', 'AcademicAdmin', 'Teacher', 'Student'].includes(role))"
|
||||
index="/exams"
|
||||
>
|
||||
<el-icon><AlarmClock /></el-icon>
|
||||
<template #title>{{ auth.user?.roles.includes('Student') ? '我的考试' : auth.user?.roles.includes('Teacher') ? '我的监考' : '考试管理' }}</template>
|
||||
</el-menu-item>
|
||||
<el-menu-item v-if="auth.isSuperAdmin" index="/users">
|
||||
<el-icon><User /></el-icon>
|
||||
<template #title>用户与权限</template>
|
||||
|
||||
@@ -74,6 +74,12 @@ const router = createRouter({
|
||||
roles: ['SuperAdmin', 'AcademicAdmin', 'CollegeAdmin', 'Teacher', 'Student'],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'exams',
|
||||
name: 'exams',
|
||||
component: () => import('../views/ExamsView.vue'),
|
||||
meta: { roles: ['SuperAdmin', 'AcademicAdmin', 'Teacher', 'Student'] },
|
||||
},
|
||||
{
|
||||
path: 'users',
|
||||
name: 'users',
|
||||
|
||||
@@ -510,6 +510,42 @@ button { cursor: pointer; }
|
||||
.transcript-result b { margin: 5px 0 3px; color: var(--indigo); font: 700 25px/1 Consolas, monospace; }
|
||||
.transcript-result small { color: var(--muted); font-size: 9px; }
|
||||
|
||||
.exam-plan-strip { padding: 10px; display: flex; gap: 9px; overflow-x: auto; border: 1px solid var(--line); background: white; }
|
||||
.exam-plan-strip button { flex: 0 0 275px; padding: 14px; display: grid; grid-template-columns: 1fr auto; gap: 6px; text-align: left; border: 1px solid var(--line); background: #fafbfc; }
|
||||
.exam-plan-strip button.active { color: white; border-color: var(--indigo); background: var(--indigo); }
|
||||
.exam-plan-strip b { grid-column: 1/-1; font-family: "STZhongsong","Songti SC",serif; }
|
||||
.exam-plan-strip span, .exam-plan-strip small, .exam-plan-strip i { color: #8c94a3; font-size: 9px; font-style: normal; }
|
||||
.exam-plan-strip button.active span, .exam-plan-strip button.active small { color: #c5cee5; }
|
||||
.exam-board { border: 1px solid var(--line); background: white; }
|
||||
.exam-board > header { padding: 22px 24px; display: flex; align-items: center; justify-content: space-between; gap: 20px; border-bottom: 1px solid var(--line); }
|
||||
.exam-board header span { color: var(--teal); font: 700 9px Consolas,monospace; letter-spacing: .13em; }
|
||||
.exam-board header h3 { margin: 7px 0 5px; font: 600 21px "STZhongsong","Songti SC",serif; }
|
||||
.exam-board header p { margin: 0; color: var(--muted); font-size: 10px; }
|
||||
.exam-timeline { padding: 10px 22px 24px 42px; }
|
||||
.exam-timeline article { min-height: 108px; display: grid; grid-template-columns: 120px minmax(220px,1fr) 210px 120px; align-items: center; gap: 20px; position: relative; border-bottom: 1px solid var(--line); }
|
||||
.exam-timeline article::before { content:""; position:absolute; left:-24px; width:9px; height:9px; border:3px solid white; border-radius:50%; background:var(--teal); box-shadow:0 0 0 1px var(--teal); }
|
||||
.exam-timeline article::after { content:""; position:absolute; left:-20px; top:0; bottom:0; width:1px; background:#cdd4df; z-index:-1; }
|
||||
.exam-timeline time b, .exam-timeline time span { display:block; }
|
||||
.exam-timeline time b { color:var(--indigo); font:700 15px Consolas,monospace; }
|
||||
.exam-timeline time span { margin-top:5px; color:var(--muted); font-size:9px; }
|
||||
.exam-timeline article > div > span { color:var(--teal); font-size:9px; }
|
||||
.exam-timeline h4 { margin:6px 0 4px; font-size:14px; }
|
||||
.exam-timeline p { margin:0; color:var(--muted); font-size:9px; }
|
||||
.exam-staff { padding-left:18px; border-left:1px solid var(--line); }
|
||||
.exam-staff b,.exam-staff small { display:block; margin-top:5px; font-size:10px; }
|
||||
.exam-staff small { color:var(--muted); }
|
||||
.exam-row-actions { text-align:right; }
|
||||
.exam-ticket-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; }
|
||||
.exam-ticket-grid article { min-height:180px; display:grid; grid-template-columns:105px 1fr; border:1px solid var(--line); background:white; overflow:hidden; }
|
||||
.exam-ticket-date { padding:20px 14px; display:grid; place-content:center; text-align:center; color:white; background:linear-gradient(145deg,#182d64,#21706f); }
|
||||
.exam-ticket-date b { font:700 17px Consolas,monospace; }
|
||||
.exam-ticket-date span { margin-top:8px; color:#bfe0da; font-size:9px; }
|
||||
.exam-ticket-grid article > div:nth-child(2) { padding:24px 20px; }
|
||||
.exam-ticket-grid article > div:nth-child(2) span { color:var(--teal); font-size:9px; }
|
||||
.exam-ticket-grid h3 { margin:9px 0 7px; font:600 19px "STZhongsong","Songti SC",serif; }
|
||||
.exam-ticket-grid p { margin:0; color:var(--muted); font-size:10px; }
|
||||
.exam-ticket-grid footer { grid-column:1/-1; padding:12px 17px; display:flex; align-items:center; gap:7px; border-top:1px dashed var(--line); color:#586275; font-size:10px; }
|
||||
|
||||
.login-page { min-height: 100vh; display: grid; grid-template-columns: minmax(440px, 1.2fr) minmax(420px, .8fr); background: white; }
|
||||
.login-story { min-height: 100vh; padding: 54px clamp(45px, 6vw, 90px); display: flex; flex-direction: column; color: white; background: linear-gradient(142deg, #13224d, #243a77 62%, #176b71); overflow: hidden; position: relative; }
|
||||
.login-story::before { content: ""; position: absolute; inset: 0; opacity: .28; background-image: linear-gradient(rgba(255,255,255,.06) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.06) 1px, transparent 1px); background-size: 46px 46px; }
|
||||
@@ -615,6 +651,8 @@ button { cursor: pointer; }
|
||||
.transcript-list > article { grid-template-columns: 1fr 120px; }
|
||||
.grade-scale { grid-column: 1 / -1; grid-row: 2; }
|
||||
.transcript-result { grid-column: 2; grid-row: 1; }
|
||||
.exam-timeline article { grid-template-columns:100px 1fr 180px; }
|
||||
.exam-row-actions { grid-column:2/-1; padding-bottom:10px; text-align:left; }
|
||||
.role-editor-summary { align-items: flex-start; flex-direction: column; gap: 4px; }
|
||||
.form-grid, .form-grid.three { grid-template-columns: 1fr; gap: 0; }
|
||||
.el-dialog { width: calc(100vw - 24px) !important; }
|
||||
@@ -654,6 +692,12 @@ button { cursor: pointer; }
|
||||
.transcript-list > article { grid-template-columns: 1fr; gap: 17px; }
|
||||
.transcript-result { grid-column: auto; grid-row: auto; padding: 12px 0 0; border-left: none; border-top: 1px solid var(--line); text-align: left; }
|
||||
.grade-scale { grid-column: auto; grid-row: auto; }
|
||||
.exam-board > header { align-items:flex-start; flex-direction:column; }
|
||||
.exam-timeline { padding-left:28px; }
|
||||
.exam-timeline article { padding:16px 0; grid-template-columns:1fr; gap:9px; }
|
||||
.exam-staff { padding:10px 0 0; border-left:none; border-top:1px solid var(--line); }
|
||||
.exam-row-actions { grid-column:auto; padding:0; }
|
||||
.exam-ticket-grid { grid-template-columns:1fr; }
|
||||
.el-drawer { width: 100% !important; }
|
||||
}
|
||||
|
||||
|
||||
Loaded 3 of 18 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user