选课批次:时间窗口、退课截止、学分上限、开放/关闭。
教学班投放:容量、班级范围、全校开放。 学生选退课:容量、重复课程、学分上限、课表冲突校验。 教学班实时名单。 校级、学院级、学生角色分级操作。 SQLite 本地增量升级及演示数据。 MySQL 正式 EF Core 迁移。 Vue 已编译进 wwwroot,单服务运行无需 npm run dev。 学生端和管理端均完成桌面、手机响应式检查。
This commit is contained in:
@@ -249,6 +249,135 @@ button { cursor: pointer; }
|
||||
.schedule-card > button { position: absolute; right: 4px; top: 3px; border: none; color: #b9c4df; background: transparent; font-size: 14px; }
|
||||
.schedule-card > button:hover { color: white; }
|
||||
|
||||
.selection-page { min-width: 0; }
|
||||
.selection-round-strip {
|
||||
min-height: 104px; padding: 10px; display: flex; gap: 9px; overflow-x: auto;
|
||||
border: 1px solid var(--line); background: white;
|
||||
}
|
||||
.selection-round-strip > button {
|
||||
flex: 0 0 285px; min-height: 82px; padding: 13px 15px; display: grid;
|
||||
grid-template-columns: 1fr auto; gap: 5px 12px; text-align: left;
|
||||
border: 1px solid var(--line); border-left: 3px solid #bdc3ce;
|
||||
color: var(--ink); background: #fafbfc;
|
||||
}
|
||||
.selection-round-strip > button:hover { background: white; }
|
||||
.selection-round-strip > button.active {
|
||||
border-color: var(--indigo); border-left-color: #48c8b7;
|
||||
color: white; background: linear-gradient(115deg, #1b3067, #294584);
|
||||
}
|
||||
.selection-round-strip span, .selection-round-strip small {
|
||||
overflow: hidden; color: #868f9e; font-size: 9px; white-space: nowrap; text-overflow: ellipsis;
|
||||
}
|
||||
.selection-round-strip b {
|
||||
grid-column: 1 / -1; overflow: hidden; font-family: "STZhongsong", "Songti SC", serif;
|
||||
font-size: 14px; white-space: nowrap; text-overflow: ellipsis;
|
||||
}
|
||||
.selection-round-strip i {
|
||||
align-self: start; padding: 3px 7px; border-radius: 10px;
|
||||
color: #6d7583; background: #edf0f3; font-size: 9px; font-style: normal;
|
||||
}
|
||||
.selection-round-strip i.open { color: var(--teal); background: #e5f4f1; }
|
||||
.selection-round-strip > button.active span,
|
||||
.selection-round-strip > button.active small { color: #c6d0e8; }
|
||||
.selection-round-strip > button.active i { color: white; background: rgba(255,255,255,.14); }
|
||||
.selection-window {
|
||||
min-height: 142px; display: grid; grid-template-columns: 105px minmax(300px, 1fr) auto;
|
||||
align-items: stretch; color: white;
|
||||
background:
|
||||
linear-gradient(rgba(255,255,255,.035) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(255,255,255,.035) 1px, transparent 1px),
|
||||
linear-gradient(112deg, #162858, #243d7d 70%, #176b70);
|
||||
background-size: 28px 28px, 28px 28px, auto;
|
||||
overflow: hidden;
|
||||
}
|
||||
.window-seal {
|
||||
padding: 20px 12px; display: grid; place-content: center; justify-items: center; gap: 9px;
|
||||
border-right: 1px solid rgba(255,255,255,.13); color: #57d4c2;
|
||||
}
|
||||
.window-seal .el-icon { font-size: 26px; }
|
||||
.window-seal span { font-size: 10px; font-weight: 700; letter-spacing: .08em; }
|
||||
.window-copy { padding: 24px 27px; align-self: center; min-width: 0; }
|
||||
.window-copy > span { color: #5ed4c4; font: 700 9px/1 Consolas, monospace; letter-spacing: .15em; }
|
||||
.window-copy h3 {
|
||||
margin: 9px 0 8px; overflow: hidden; font-family: "STZhongsong", "Songti SC", serif;
|
||||
font-size: 22px; font-weight: 500; letter-spacing: .03em; white-space: nowrap; text-overflow: ellipsis;
|
||||
}
|
||||
.window-copy p { margin: 0; color: #c4cee8; font-size: 10px; }
|
||||
.window-copy em {
|
||||
margin-left: 13px; padding-left: 13px; border-left: 1px solid rgba(255,255,255,.2);
|
||||
color: #edcf9a; font-style: normal;
|
||||
}
|
||||
.credit-meter {
|
||||
width: 310px; padding: 22px 28px; align-self: center;
|
||||
border-left: 1px solid rgba(255,255,255,.13);
|
||||
}
|
||||
.credit-meter > div:first-child { display: flex; align-items: baseline; gap: 7px; }
|
||||
.credit-meter span, .credit-meter small { color: #c2cce5; font-size: 10px; }
|
||||
.credit-meter b { margin-left: auto; color: #5bd4c3; font: 700 34px/1 Consolas, monospace; }
|
||||
.credit-track { height: 5px; margin-top: 12px; overflow: hidden; background: rgba(255,255,255,.15); }
|
||||
.credit-track i { height: 100%; display: block; background: linear-gradient(90deg, #49c9b7, #e3ad54); }
|
||||
.credit-meter p { margin: 9px 0 0; color: #aeb9d8; font-size: 9px; }
|
||||
.round-actions {
|
||||
width: 285px; padding: 23px; display: flex; flex-wrap: wrap; align-content: center;
|
||||
justify-content: flex-end; gap: 8px; border-left: 1px solid rgba(255,255,255,.13);
|
||||
}
|
||||
.round-actions .el-button + .el-button { margin-left: 0; }
|
||||
.selection-ledger-head {
|
||||
min-height: 95px; padding: 18px 21px; display: flex; align-items: center;
|
||||
justify-content: space-between; gap: 20px; border-bottom: 1px solid var(--line);
|
||||
}
|
||||
.selection-ledger-head span { color: var(--teal); font: 700 9px/1 Consolas, monospace; letter-spacing: .14em; }
|
||||
.selection-ledger-head h3 { margin: 7px 0 4px; font-family: "STZhongsong", "Songti SC", serif; font-size: 19px; }
|
||||
.selection-ledger-head p { margin: 0; color: var(--muted); font-size: 10px; }
|
||||
.capacity-number { color: var(--indigo); font: 700 13px/1 Consolas, monospace; }
|
||||
.offering-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 15px; }
|
||||
.offering-ticket {
|
||||
min-width: 0; min-height: 250px; display: flex; flex-direction: column;
|
||||
border: 1px solid var(--line); background: white; box-shadow: 0 6px 18px rgba(24,36,68,.045);
|
||||
}
|
||||
.offering-ticket > header {
|
||||
min-height: 99px; padding: 19px 20px; display: flex; justify-content: space-between;
|
||||
gap: 16px; border-bottom: 1px dashed #d7dce4; position: relative;
|
||||
}
|
||||
.offering-ticket > header::before,
|
||||
.offering-ticket > header::after {
|
||||
content: ""; position: absolute; bottom: -7px; width: 12px; height: 12px;
|
||||
border-radius: 50%; background: var(--soft);
|
||||
}
|
||||
.offering-ticket > header::before { left: -7px; }
|
||||
.offering-ticket > header::after { right: -7px; }
|
||||
.offering-ticket header span { color: var(--teal); font: 700 9px/1 Consolas, monospace; letter-spacing: .08em; }
|
||||
.offering-ticket h3 {
|
||||
margin: 8px 0 6px; font-family: "STZhongsong", "Songti SC", serif;
|
||||
font-size: 20px; font-weight: 600;
|
||||
}
|
||||
.offering-ticket header p { margin: 0; color: var(--muted); font-size: 11px; }
|
||||
.selected-mark {
|
||||
flex: 0 0 auto; height: fit-content; padding: 5px 9px; display: flex; align-items: center; gap: 4px;
|
||||
border-radius: 13px; color: var(--teal); background: #e8f5f2; font-size: 10px; font-style: normal;
|
||||
}
|
||||
.ticket-schedules { min-height: 85px; padding: 14px 20px; display: grid; align-content: center; gap: 8px; }
|
||||
.ticket-schedules > div { display: flex; align-items: flex-start; gap: 7px; color: #4e596d; font-size: 10px; line-height: 1.5; }
|
||||
.ticket-schedules .el-icon { flex: 0 0 auto; margin-top: 1px; color: var(--indigo); }
|
||||
.schedule-missing { color: #a36d22; font-size: 10px; }
|
||||
.offering-ticket > footer {
|
||||
margin-top: auto; min-height: 65px; padding: 13px 20px; display: flex; align-items: center;
|
||||
gap: 18px; background: #fafbfc; border-top: 1px solid #edf0f4;
|
||||
}
|
||||
.seat-meter { flex: 1; min-width: 0; }
|
||||
.seat-meter > span { display: block; margin-bottom: 7px; color: var(--muted); font-size: 9px; }
|
||||
.seat-meter > div { height: 4px; overflow: hidden; background: #e2e6ec; }
|
||||
.seat-meter i { height: 100%; display: block; background: var(--teal); }
|
||||
.roster-summary {
|
||||
margin: 0 0 18px; padding: 16px; display: flex; align-items: center; gap: 14px;
|
||||
color: white; background: linear-gradient(115deg, #1b3067, #294584);
|
||||
}
|
||||
.roster-summary > .el-icon { font-size: 28px; color: #5bd4c3; }
|
||||
.roster-summary span, .roster-summary b, .roster-summary small { display: block; }
|
||||
.roster-summary span { color: #59d2c1; font: 700 9px Consolas, monospace; }
|
||||
.roster-summary b { margin-top: 5px; font-size: 14px; }
|
||||
.roster-summary small { margin-top: 4px; color: #bec8e2; 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; }
|
||||
@@ -339,6 +468,13 @@ button { cursor: pointer; }
|
||||
.schedule-search { flex-wrap: wrap; }
|
||||
.schedule-search .el-input { width: 100%; }
|
||||
.schedule-search > span { width: 100%; margin-left: 0; }
|
||||
.selection-window { grid-template-columns: 82px 1fr; }
|
||||
.credit-meter, .round-actions {
|
||||
grid-column: 1 / -1; width: auto; border-top: 1px solid rgba(255,255,255,.13);
|
||||
border-left: none;
|
||||
}
|
||||
.round-actions { justify-content: flex-start; }
|
||||
.offering-grid { grid-template-columns: 1fr; }
|
||||
.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; }
|
||||
@@ -350,6 +486,21 @@ button { cursor: pointer; }
|
||||
.login-panel { padding: 32px 22px; background: white; }
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.selection-round-strip > button { flex-basis: 240px; }
|
||||
.selection-window { display: block; }
|
||||
.window-seal { min-height: 54px; padding: 10px; display: flex; border-right: none; border-bottom: 1px solid rgba(255,255,255,.13); }
|
||||
.window-seal .el-icon { font-size: 18px; }
|
||||
.window-copy { padding: 20px 18px; }
|
||||
.window-copy h3 { white-space: normal; }
|
||||
.window-copy em { display: block; margin: 7px 0 0; padding: 0; border: none; }
|
||||
.credit-meter, .round-actions { padding: 18px; }
|
||||
.selection-ledger-head { align-items: flex-start; flex-direction: column; }
|
||||
.offering-ticket > footer { align-items: stretch; flex-direction: column; }
|
||||
.offering-ticket > footer .el-button { width: 100%; }
|
||||
.el-drawer { width: 100% !important; }
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
*, *::before, *::after { scroll-behavior: auto !important; transition: none !important; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user