已完成“成绩管理与学业档案”模块:
教师批量录入平时、期中、期末成绩。 自动计算总评、绩点和及格状态。 支持缺考、缓考、免修。 教师提交 → 学院审核/退回 → 校级发布。 学生只能查看正式发布成绩。 自动统计平均分、完成度、及格率和加权 GPA。 SQLite 本地增量升级和 MySQL 正式迁移均已完成。 分级权限在前后端同时校验。
This commit is contained in:
@@ -378,6 +378,138 @@ button { cursor: pointer; }
|
||||
.roster-summary b { margin-top: 5px; font-size: 14px; }
|
||||
.roster-summary small { margin-top: 4px; color: #bec8e2; font-size: 10px; }
|
||||
|
||||
.grade-page { min-width: 0; }
|
||||
.grade-toolbar {
|
||||
min-height: 68px; padding: 13px 16px; display: flex; align-items: center; gap: 10px;
|
||||
border: 1px solid var(--line); background: white;
|
||||
}
|
||||
.grade-toolbar .el-select { width: 210px; }
|
||||
.grade-toolbar > span { margin-left: auto; color: var(--muted); font-size: 10px; }
|
||||
.grade-workspace {
|
||||
min-height: 650px; display: grid; grid-template-columns: 285px minmax(0, 1fr);
|
||||
border: 1px solid var(--line); background: white;
|
||||
}
|
||||
.grade-sheet-list {
|
||||
min-width: 0; border-right: 1px solid var(--line); background: #fafbfc;
|
||||
}
|
||||
.grade-sheet-list > button {
|
||||
width: 100%; min-height: 100px; padding: 16px 17px; display: grid;
|
||||
grid-template-columns: 1fr auto; gap: 6px 10px; text-align: left;
|
||||
border: none; border-bottom: 1px solid var(--line); border-left: 3px solid transparent;
|
||||
color: var(--ink); background: transparent;
|
||||
}
|
||||
.grade-sheet-list > button:hover { background: white; }
|
||||
.grade-sheet-list > button.active { border-left-color: var(--teal); background: white; }
|
||||
.grade-sheet-list span, .grade-sheet-list small {
|
||||
overflow: hidden; color: var(--muted); font-size: 9px; white-space: nowrap; text-overflow: ellipsis;
|
||||
}
|
||||
.grade-sheet-list b {
|
||||
grid-column: 1 / -1; overflow: hidden; font-family: "STZhongsong", "Songti SC", serif;
|
||||
font-size: 14px; white-space: nowrap; text-overflow: ellipsis;
|
||||
}
|
||||
.grade-sheet-list i {
|
||||
padding: 3px 7px; border-radius: 10px; color: #777f8c;
|
||||
background: #eceff3; font-size: 9px; font-style: normal;
|
||||
}
|
||||
.grade-sheet-list i.submitted { color: #a66b16; background: #fbefd9; }
|
||||
.grade-sheet-list i.approved, .grade-sheet-list i.published { color: var(--teal); background: #e4f4f0; }
|
||||
.grade-sheet-list i.returned { color: #b05252; background: #f8e7e7; }
|
||||
.grade-register { min-width: 0; }
|
||||
.grade-create-empty {
|
||||
min-height: 620px; display: grid; place-content: center; justify-items: center;
|
||||
padding: 30px; text-align: center;
|
||||
}
|
||||
.grade-create-empty > .el-icon { font-size: 50px; color: #98a5be; }
|
||||
.grade-create-empty h3 { margin: 18px 0 8px; font-family: "STZhongsong", "Songti SC", serif; font-size: 23px; }
|
||||
.grade-create-empty p { max-width: 440px; margin: 0 0 20px; color: var(--muted); font-size: 11px; line-height: 1.7; }
|
||||
.grade-register-head {
|
||||
min-height: 108px; padding: 21px 24px; display: flex; align-items: center;
|
||||
justify-content: space-between; gap: 20px; border-bottom: 1px solid var(--line);
|
||||
}
|
||||
.grade-register-head span { color: var(--teal); font: 700 9px/1 Consolas, monospace; letter-spacing: .1em; }
|
||||
.grade-register-head h3 { margin: 8px 0 5px; font-family: "STZhongsong", "Songti SC", serif; font-size: 22px; }
|
||||
.grade-register-head p { margin: 0; color: var(--muted); font-size: 10px; }
|
||||
.grade-register-head > i {
|
||||
padding: 7px 12px; border-radius: 15px; color: #657083; background: #edf0f4;
|
||||
font-size: 10px; font-style: normal;
|
||||
}
|
||||
.grade-register-head > i.submitted { color: #a66b16; background: #fbefd9; }
|
||||
.grade-register-head > i.approved, .grade-register-head > i.published { color: var(--teal); background: #e4f4f0; }
|
||||
.grade-register-head > i.returned { color: #ad4e4e; background: #f7e5e5; }
|
||||
.grade-register-ruler {
|
||||
min-height: 92px; display: grid; grid-template-columns: repeat(4, 120px) 1fr;
|
||||
color: white; background:
|
||||
repeating-linear-gradient(90deg, transparent 0, transparent 23px, rgba(255,255,255,.07) 24px),
|
||||
linear-gradient(105deg, #17295a, #263f80);
|
||||
}
|
||||
.grade-register-ruler > div { padding: 17px 19px; border-right: 1px solid rgba(255,255,255,.14); }
|
||||
.grade-register-ruler span, .grade-register-ruler b { display: block; }
|
||||
.grade-register-ruler span { color: #b6c0dc; font-size: 9px; }
|
||||
.grade-register-ruler b { margin-top: 7px; color: #5bd4c3; font: 700 24px/1 Consolas, monospace; }
|
||||
.grade-register-ruler p { margin: 0; padding: 20px 22px; align-self: center; color: #cbd3e8; font-size: 10px; text-align: right; }
|
||||
.grade-register > .el-alert { border-radius: 0; }
|
||||
.grade-table-scroll { max-width: 100%; overflow-x: auto; }
|
||||
.grade-entry-table { min-width: 800px; }
|
||||
.grade-entry-table .el-input-number { width: 92px; }
|
||||
.grade-entry-table .el-input-number .el-input__inner { text-align: center; }
|
||||
.total-score { color: var(--indigo); font: 700 15px/1 Consolas, monospace; }
|
||||
.total-score.excellent { color: var(--teal); }
|
||||
.total-score.failed { color: #b44c4c; }
|
||||
.total-score.pending { color: #a0a6b0; }
|
||||
.grade-actions {
|
||||
min-height: 78px; padding: 14px 20px; display: flex; align-items: center;
|
||||
justify-content: flex-end; gap: 8px; border-top: 1px solid var(--line); background: #fafbfc;
|
||||
}
|
||||
.grade-actions > div { margin-right: auto; }
|
||||
.grade-actions span, .grade-actions b { display: block; }
|
||||
.grade-actions span { color: var(--muted); font-size: 9px; }
|
||||
.grade-actions b { margin-top: 4px; font-size: 13px; }
|
||||
.grade-actions .el-button + .el-button { margin-left: 0; }
|
||||
.grade-weight-form { margin-top: 18px; }
|
||||
.transcript-identity {
|
||||
min-height: 135px; padding: 24px 28px; display: flex; align-items: center;
|
||||
justify-content: space-between; gap: 25px; 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 72%, #176b70);
|
||||
background-size: 28px 28px, 28px 28px, auto;
|
||||
}
|
||||
.transcript-identity span { color: #5bd4c3; font: 700 9px/1 Consolas, monospace; letter-spacing: .15em; }
|
||||
.transcript-identity h3 { margin: 9px 0 6px; font-family: "STZhongsong", "Songti SC", serif; font-size: 25px; }
|
||||
.transcript-identity p { margin: 0; color: #c2cce5; font-size: 10px; }
|
||||
.transcript-identity label { width: 265px; }
|
||||
.transcript-identity label > span { display: block; margin-bottom: 7px; }
|
||||
.transcript-identity .el-select { width: 100%; }
|
||||
.transcript-ribbon { display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--line); background: white; }
|
||||
.transcript-ribbon > div { min-height: 85px; padding: 17px 22px; display: flex; align-items: baseline; gap: 7px; border-right: 1px solid var(--line); }
|
||||
.transcript-ribbon > div:last-child { border-right: none; }
|
||||
.transcript-ribbon span { color: var(--muted); font-size: 10px; }
|
||||
.transcript-ribbon b { margin-left: auto; color: var(--indigo); font: 700 27px/1 Consolas, monospace; }
|
||||
.transcript-ribbon small { color: var(--muted); font-size: 9px; }
|
||||
.transcript-list { display: grid; gap: 10px; }
|
||||
.transcript-list > article {
|
||||
min-height: 114px; padding: 18px 21px; display: grid;
|
||||
grid-template-columns: minmax(230px, 1fr) minmax(200px, 1.4fr) 105px;
|
||||
align-items: center; gap: 28px; border: 1px solid var(--line); background: white;
|
||||
}
|
||||
.transcript-course span { color: var(--teal); font-size: 9px; }
|
||||
.transcript-course h3 { margin: 7px 0 5px; font-family: "STZhongsong", "Songti SC", serif; font-size: 18px; }
|
||||
.transcript-course p { margin: 0; color: var(--muted); font-size: 10px; }
|
||||
.grade-scale { height: 22px; display: grid; grid-template-columns: repeat(11, 1fr); position: relative; border-bottom: 2px solid #cfd5de; }
|
||||
.grade-scale > i { border-left: 1px solid #cfd5de; }
|
||||
.grade-scale > span {
|
||||
position: absolute; bottom: -12px; transform: translateX(-50%); padding: 4px 6px;
|
||||
border-radius: 9px; color: white; background: var(--indigo); font: 700 10px Consolas, monospace;
|
||||
}
|
||||
.grade-scale > span.excellent { background: var(--teal); }
|
||||
.grade-scale > span.failed { background: #b44c4c; }
|
||||
.transcript-result { padding-left: 20px; border-left: 1px solid var(--line); text-align: right; }
|
||||
.transcript-result span, .transcript-result b, .transcript-result small { display: block; }
|
||||
.transcript-result span { color: var(--muted); font-size: 9px; }
|
||||
.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; }
|
||||
|
||||
.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; }
|
||||
@@ -475,6 +607,14 @@ button { cursor: pointer; }
|
||||
}
|
||||
.round-actions { justify-content: flex-start; }
|
||||
.offering-grid { grid-template-columns: 1fr; }
|
||||
.grade-workspace { display: block; }
|
||||
.grade-sheet-list { max-height: 300px; overflow-y: auto; border-right: none; border-bottom: 1px solid var(--line); }
|
||||
.grade-register-ruler { grid-template-columns: repeat(4, 1fr); }
|
||||
.grade-register-ruler > div { padding: 14px; }
|
||||
.grade-register-ruler p { grid-column: 1 / -1; padding: 10px 14px; text-align: left; border-top: 1px solid rgba(255,255,255,.14); }
|
||||
.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; }
|
||||
.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; }
|
||||
@@ -498,6 +638,22 @@ button { cursor: pointer; }
|
||||
.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%; }
|
||||
.grade-toolbar { flex-wrap: wrap; }
|
||||
.grade-toolbar .el-select { flex: 1 1 140px; width: auto; }
|
||||
.grade-toolbar > span { width: 100%; margin-left: 0; }
|
||||
.grade-register-head { align-items: flex-start; }
|
||||
.grade-register-ruler { grid-template-columns: 1fr 1fr; }
|
||||
.grade-register-ruler > div:nth-child(2) { border-right: none; }
|
||||
.grade-actions { align-items: stretch; flex-direction: column; }
|
||||
.grade-actions > div { margin: 0 0 5px; }
|
||||
.grade-actions .el-button { width: 100%; }
|
||||
.transcript-identity { align-items: stretch; flex-direction: column; }
|
||||
.transcript-identity label { width: 100%; }
|
||||
.transcript-ribbon { grid-template-columns: 1fr; }
|
||||
.transcript-ribbon > div { min-height: 65px; border-right: none; border-bottom: 1px solid var(--line); }
|
||||
.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; }
|
||||
.el-drawer { width: 100% !important; }
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user