Files
SharedClassManager/frontend/assets/css/style.css
canglan 16059ad3bf feat: 多班级版班级管理系统 v2.0
技术栈:Go (Gin + GORM) + PHP + MySQL 5.7 + Redis

主要功能:
- 多班级完全隔离(class_id 贯穿全系统)
- 后端 Go Gin(端口 56789),Nginx 反代
- 超级管理员独立登录(env 配置,默认账密 admin/Admin123)
- bcrypt 密码加密(无 PASSWORD_SALT)
- 科任老师/课代表新角色
- 课代表作业管理页面
- 排行榜分项排行(操行分/考勤/作业)
- 角色加减分上下限由班主任配置
- 家长改密功能(可开关)
- 班级角色按需开关
- 宿舍号格式:南0-000
- 周度/月度重置功能
- MySQL 5.7 兼容
- 43 轮代码审查 + 全部修复

开发者: Canglan
版权归属: Sea Network Technology Studio
许可证: Apache License 2.0
2026-06-23 05:19:43 +08:00

999 lines
19 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 多班级版班级管理系统 - 全局样式
*
* 开发者: Canglan
* 联系方式: admin@sea-studio.top
* 版权归属: Sea Network Technology Studio
* 许可证: Apache License 2.0
*
* 版权所有 © Sea Network Technology Studio
*/
:root {
/* 主色调 */
--color-primary: #4361ee;
--color-primary-light: #eef0ff;
--color-primary-dark: #3651d4;
--color-primary-hover: #3a56d4;
/* 语义色 */
--color-danger: #e53e3e;
--color-danger-light: #fff5f5;
--color-danger-dark: #c53030;
--color-success: #38a169;
--color-success-light: #f0fff4;
--color-warning: #d69e2e;
--color-warning-light: #fffff0;
/* 灰度 */
--color-text: #1a202c;
--color-text-secondary: #4a5568;
--color-text-muted: #a0aec0;
--color-bg: #f5f7fb;
--color-card: #ffffff;
--color-border: #e2e8f0;
--color-border-light: #edf2f7;
--color-hover: #f7fafc;
/* 按钮 */
--btn-primary-bg: var(--color-primary);
--btn-primary-text: #ffffff;
--btn-outline-bg: transparent;
--btn-outline-border: var(--color-primary);
--btn-outline-text: var(--color-primary);
--btn-danger-bg: var(--color-danger);
--btn-danger-text: #ffffff;
--btn-ghost-text: var(--color-text-secondary);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background: var(--color-bg);
min-height: 100vh;
font-size: 14px;
color: var(--color-text);
}
/* ========== 登录页面 ========== */
.login-container {
background: white;
border-radius: 16px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
padding: 40px;
width: 400px;
max-width: 90%;
margin: 100px auto;
}
.login-header {
text-align: center;
margin-bottom: 30px;
}
.login-header h1 {
font-size: 24px;
color: var(--color-text);
margin-bottom: 8px;
}
.login-header p {
color: var(--color-text-secondary);
font-size: 14px;
}
.login-form .form-group {
margin-bottom: 20px;
}
.login-form label {
display: block;
margin-bottom: 6px;
color: var(--color-text-secondary);
font-weight: 500;
}
.login-form input {
width: 100%;
padding: 12px;
border: 1px solid var(--color-border);
border-radius: 8px;
font-size: 14px;
transition: border-color 0.3s;
}
.login-form input:focus {
outline: none;
border-color: var(--color-primary);
}
.btn-login {
width: 100%;
padding: 12px;
background: linear-gradient(135deg, var(--color-primary) 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: bold;
cursor: pointer;
transition: opacity 0.3s;
}
.btn-login:hover {
opacity: 0.9;
}
.error-msg {
background: var(--color-danger-light);
color: var(--color-danger);
padding: 10px;
border-radius: 8px;
margin-top: 15px;
text-align: center;
font-size: 13px;
}
.login-footer {
text-align: center;
margin-top: 30px;
padding-top: 20px;
border-top: 1px solid var(--color-border-light);
color: var(--color-text-muted);
font-size: 12px;
}
/* ========== 公共头部 ========== */
.header {
background: white;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
padding: 12px 24px;
display: flex;
justify-content: space-between;
align-items: center;
position: sticky;
top: 0;
z-index: 100;
}
.header h1 {
font-size: 18px;
color: var(--color-text);
}
.header-info {
display: flex;
align-items: center;
gap: 16px;
}
.user-name {
color: var(--color-text-secondary);
font-weight: 500;
}
.user-role {
background: var(--color-primary);
color: white;
padding: 2px 8px;
border-radius: 20px;
font-size: 11px;
}
.btn-logout {
background: var(--color-danger);
color: white;
border: none;
padding: 6px 16px;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
transition: background 0.3s;
}
.btn-logout:hover {
background: var(--color-danger-dark);
}
/* ========== 导航菜单 ========== */
.nav {
background: white;
padding: 0 24px;
border-bottom: 1px solid var(--color-border-light);
display: flex;
gap: 4px;
overflow-x: auto;
}
.nav-item {
padding: 12px 20px;
background: none;
border: none;
color: var(--color-text-secondary);
cursor: pointer;
font-size: 14px;
transition: all 0.3s;
border-bottom: 2px solid transparent;
text-decoration: none;
display: inline-block;
}
.nav-item:hover {
color: var(--color-primary);
}
.nav-item.active {
color: var(--color-primary);
border-bottom-color: var(--color-primary);
}
/* ========== 容器 ========== */
.container {
max-width: 1200px;
margin: 24px auto;
padding: 0 24px;
}
/* ========== 卡片 ========== */
.card {
background: white;
border-radius: 12px;
padding: 20px;
margin-bottom: 20px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.card-title {
font-size: 18px;
font-weight: bold;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 2px solid var(--color-primary);
color: var(--color-text);
}
/* ========== 统计卡片网格 ========== */
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 16px;
margin-bottom: 24px;
}
.stat-card {
background: white;
border-radius: 12px;
padding: 20px;
text-align: center;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.stat-value {
font-size: 32px;
font-weight: bold;
color: var(--color-primary);
margin: 10px 0;
}
.stat-label {
color: var(--color-text-secondary);
font-size: 13px;
}
/* ========== 表格 ========== */
.table-wrapper {
overflow-x: auto;
overflow-y: visible;
}
table {
width: 100%;
border-collapse: collapse;
}
th, td {
padding: 12px;
text-align: left;
border-bottom: 1px solid var(--color-border-light);
}
th {
background: var(--color-hover);
font-weight: 600;
color: var(--color-text-secondary);
}
tr:hover {
background: var(--color-hover);
}
/* ========== 状态标签 ========== */
.status-badge {
display: inline-block;
padding: 4px 10px;
border-radius: 20px;
font-size: 12px;
font-weight: 500;
}
.status-submitted {
background: #c6f6d5;
color: #22543d;
}
.status-not_submitted {
background: #fed7d7;
color: #742a2a;
}
.status-late {
background: #feebc8;
color: #7c2d12;
}
.status-present {
background: #c6f6d5;
color: #22543d;
}
.status-absent {
background: #fed7d7;
color: #742a2a;
}
.status-leave {
background: #e9d8fd;
color: #553c9a;
}
/* ========== 按钮 ========== */
.btn {
padding: 8px 16px;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
transition: all 0.3s;
}
.btn-primary {
background: var(--btn-primary-bg);
color: var(--btn-primary-text);
border: 1px solid transparent;
}
.btn-primary:hover {
background: var(--color-primary-hover);
}
.btn-danger {
background: var(--btn-danger-bg);
color: var(--btn-danger-text);
border: 1px solid transparent;
}
.btn-danger:hover {
background: var(--color-danger-dark);
}
.btn-success {
background: var(--color-success-light);
color: var(--color-success);
border: 1px solid #c6f6d5;
}
.btn-success:hover {
background: #c6f6d5;
}
.btn-warning {
background: var(--color-warning-light);
color: var(--color-warning);
border: 1px solid #fefcbf;
}
.btn-warning:hover {
background: #fefcbf;
}
.btn-info {
background: #e3f2fd;
color: #1565c0;
border: 1px solid #bbdefb;
}
.btn-info:hover {
background: #bbdefb;
}
.btn-secondary {
background: var(--color-hover);
color: var(--color-text-secondary);
border: 1px solid var(--color-border);
}
.btn-secondary:hover {
background: var(--color-border-light);
}
.btn-outline {
background: transparent;
color: var(--color-primary);
border: 1px solid var(--color-primary);
}
.btn-outline:hover {
background: var(--color-primary-light);
}
.btn-ghost {
background: transparent;
color: var(--color-text-secondary);
border: 1px solid var(--color-border);
}
.btn-ghost:hover {
background: var(--color-hover);
border-color: var(--color-text-muted);
}
.btn-outline-danger {
background: transparent;
color: var(--color-danger);
border: 1px solid var(--color-danger);
}
.btn-outline-danger:hover {
background: var(--color-danger-light);
}
.btn-sm {
padding: 4px 10px;
font-size: 12px;
}
/* ========== 模态框 ========== */
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
justify-content: center;
align-items: center;
z-index: 1000;
}
.modal-content {
background: white;
border-radius: 12px;
padding: 24px;
width: 500px;
max-width: 90%;
max-height: 80vh;
overflow-y: auto;
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 1px solid var(--color-border-light);
}
.modal-header h3 {
font-size: 18px;
color: var(--color-text);
}
.modal-close {
background: none;
border: none;
font-size: 24px;
cursor: pointer;
color: var(--color-text-muted);
}
.modal-footer {
margin-top: 20px;
padding-top: 16px;
border-top: 1px solid var(--color-border-light);
display: flex;
justify-content: flex-end;
gap: 12px;
}
/* ========== 表单 ========== */
.form-group {
margin-bottom: 16px;
}
.form-group label {
display: block;
margin-bottom: 6px;
font-weight: 500;
color: var(--color-text-secondary);
}
.form-group input,
.form-group select,
.form-group textarea {
width: 100%;
padding: 10px;
border: 1px solid var(--color-border);
border-radius: 6px;
font-size: 14px;
}
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
outline: none;
border-color: var(--color-primary);
}
.form-group small {
display: block;
color: var(--color-text-muted);
font-size: 12px;
margin-top: 4px;
}
.form-group textarea {
min-height: 60px;
resize: vertical;
}
/* ========== 复选框组 ========== */
.checkbox-group {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
}
.checkbox-group input {
width: auto;
}
/* ========== 操作栏 ========== */
.action-bar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
flex-wrap: wrap;
gap: 12px;
}
.action-buttons {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.search-bar {
display: flex;
gap: 10px;
}
.search-bar input {
padding: 8px 12px;
border: 1px solid var(--color-border);
border-radius: 6px;
width: 200px;
}
/* ========== 分页 ========== */
.pagination {
display: flex;
justify-content: center;
align-items: center;
gap: 6px;
margin-top: 20px;
flex-wrap: wrap;
}
.pagination a, .pagination span {
padding: 6px 12px;
border: 1px solid var(--color-border);
border-radius: 4px;
text-decoration: none;
color: var(--color-text-secondary);
cursor: pointer;
min-width: 36px;
text-align: center;
box-sizing: border-box;
transition: all 0.2s;
}
.pagination a:hover {
background: var(--color-primary-light);
border-color: var(--color-primary);
color: var(--color-primary);
}
.pagination .active {
background: var(--color-primary);
color: white;
border-color: var(--color-primary);
}
.pagination .ellipsis {
border: none;
cursor: default;
padding: 6px 4px;
color: var(--color-text-muted);
min-width: auto;
}
.pagination .page-jump {
display: flex;
align-items: center;
gap: 4px;
margin-left: 8px;
font-size: 13px;
color: var(--color-text-secondary);
}
.pagination .page-jump input {
width: 50px;
padding: 5px 8px;
border: 1px solid var(--color-border);
border-radius: 4px;
text-align: center;
font-size: 13px;
outline: none;
}
.pagination .page-jump input:focus {
border-color: var(--color-primary);
box-shadow: 0 0 0 2px rgba(67, 97, 238, 0.15);
}
.pagination .page-nav {
padding: 6px 10px;
font-size: 13px;
}
/* ========== 提示消息 ========== */
.toast {
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
padding: 12px 24px;
border-radius: 8px;
color: white;
font-size: 14px;
z-index: 1100;
animation: fadeInUp 0.3s ease;
}
.toast-success {
background: var(--color-success);
}
.toast-error {
background: var(--color-danger);
}
.toast-warning {
background: #ed8936;
}
.toast-info {
background: var(--color-primary);
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateX(-50%) translateY(20px);
}
to {
opacity: 1;
transform: translateX(-50%) translateY(0);
}
}
/* ========== 加载动画 ========== */
.loading {
display: inline-block;
width: 20px;
height: 20px;
border: 2px solid var(--color-border);
border-top-color: var(--color-primary);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* ========== 底部 ========== */
.footer {
text-align: center;
padding: 20px;
color: var(--color-text-muted);
font-size: 12px;
}
/* ========== 记录项 ========== */
.record-item {
padding: 12px 0;
border-bottom: 1px solid var(--color-border-light);
display: flex;
justify-content: space-between;
align-items: center;
}
.record-points {
font-weight: bold;
}
.record-points.plus {
color: var(--color-success);
}
.record-points.minus {
color: var(--color-danger);
}
.record-reason {
flex: 1;
margin: 0 15px;
color: var(--color-text-secondary);
}
.record-time {
font-size: 12px;
color: var(--color-text-muted);
}
.view-more {
text-align: center;
margin-top: 15px;
}
.view-more a {
color: var(--color-primary);
text-decoration: none;
}
.conduct-score {
text-align: center;
padding: 20px;
}
.score-number {
font-size: 64px;
font-weight: bold;
color: var(--color-primary);
}
/* ========== 响应式 ========== */
@media (max-width: 768px) {
.container {
padding: 0 16px;
}
.stats-grid {
grid-template-columns: repeat(2, 1fr);
gap: 12px;
}
th, td {
padding: 8px;
font-size: 12px;
}
.card {
padding: 16px;
}
.nav {
padding: 0 16px;
}
.nav-item {
padding: 10px 14px;
font-size: 13px;
}
.action-bar {
flex-direction: column;
align-items: stretch;
}
.search-bar {
width: 100%;
}
.search-bar input {
flex: 1;
}
}
/* ========== 操作列下拉菜单 ========== */
.action-dropdown {
position: relative;
display: inline-flex;
align-items: center;
gap: 4px;
}
.action-dropdown-toggle {
background: var(--color-hover);
color: var(--color-text-secondary);
border: 1px solid var(--color-border);
padding: 4px 10px;
font-size: 12px;
cursor: pointer;
border-radius: 6px;
transition: all 0.2s;
white-space: nowrap;
}
.action-dropdown-toggle:hover {
background: var(--color-border-light);
border-color: #cbd5e0;
}
.action-dropdown-toggle.open {
background: var(--color-border-light);
border-color: var(--color-text-muted);
}
.action-dropdown-menu {
display: none;
background: white;
border-radius: 8px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
border: 1px solid var(--color-border);
min-width: 120px;
z-index: 9999;
padding: 4px 0;
}
.action-dropdown-menu.show {
display: block;
}
.action-dropdown-menu a {
display: block;
padding: 8px 14px;
color: var(--color-text-secondary);
font-size: 13px;
cursor: pointer;
text-decoration: none;
transition: background 0.15s;
white-space: nowrap;
}
.action-dropdown-menu a:hover {
background: var(--color-hover);
color: #2d3748;
}
.action-dropdown-menu a.danger {
color: var(--color-danger);
border-top: 1px solid var(--color-border-light);
margin-top: 4px;
padding-top: 10px;
}
.action-dropdown-menu a.danger:hover {
background: var(--color-danger-light);
color: var(--color-danger-dark);
}
/* ========== 链接 ========== */
.link {
color: var(--color-primary);
text-decoration: none;
}
.link:hover {
text-decoration: underline;
}
/* ========== 文本工具类 ========== */
.text-danger { color: var(--color-danger); }
.text-success { color: var(--color-success); }
.text-muted { color: var(--color-text-muted); }
/* ========== 标签 ========== */
.tag { padding: 2px 8px; border-radius: 10px; font-size: 12px; }
.tag-success { background: #e8f5e9; color: #2e7d32; }
.tag-danger { background: #ffebee; color: #c62828; }
.tag-warning { background: #fff3e0; color: #e65100; }
.tag-info { background: #e3f2fd; color: #1565c0; }
/* ========== 历史记录页优化 ========== */
/* 时间列:确保分两行显示(日期+时间) */
.history-time {
white-space: nowrap;
min-width: 80px;
line-height: 1.5;
vertical-align: top;
}
/* 原因列每行最少7个字自动换行使用td前缀提升优先级防止被preserve-newlines覆盖 */
td.history-reason {
min-width: 7em;
max-width: 200px;
white-space: normal !important;
word-break: break-word;
line-height: 1.5;
vertical-align: top;
}
/* 学生名列:允许换行 */
.history-students {
white-space: normal;
word-break: break-word;
min-width: 60px;
max-width: 120px;
line-height: 1.5;
vertical-align: top;
}
/* 合并记录复选框样式 */
.history-grouped-label {
display: inline-flex;
align-items: center;
gap: 6px;
cursor: pointer;
font-size: 13px;
padding: 6px 12px;
border: 1px solid var(--color-border);
border-radius: 6px;
background: var(--color-hover);
transition: all 0.2s;
white-space: nowrap;
user-select: none;
}
.history-grouped-label:hover {
border-color: var(--color-primary);
background: var(--color-primary-light);
}
.history-grouped-label input[type="checkbox"] {
width: 16px;
height: 16px;
cursor: pointer;
}
/* 合并记录按钮样式 */
.btn-outline-danger {
background: transparent;
color: var(--color-danger);
border: 1px solid var(--color-danger);
padding: 4px 10px;
font-size: 12px;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
white-space: nowrap;
}
.btn-outline-danger:hover {
background: var(--color-danger-light);
color: var(--color-danger-dark);
border-color: var(--color-danger-dark);
}