/* ======================================== 现代化后台管理系统样式 简约商务风格 - 完整改造版本 ======================================== */ /* CSS变量定义 */ :root { /* 主色调系统 */ --primary: #2563eb; --primary-light: #3b82f6; --primary-dark: #1d4ed8; --primary-50: rgba(37, 99, 235, 0.05); --primary-100: rgba(37, 99, 235, 0.1); /* 辅助色系 */ --success: #10b981; --warning: #f59e0b; --danger: #ef4444; --info: #06b6d4; /* 中性色系 */ --gray-50: #f9fafb; --gray-100: #f3f4f6; --gray-200: #e5e7eb; --gray-300: #d1d5db; --gray-400: #9ca3af; --gray-500: #6b7280; --gray-600: #4b5563; --gray-700: #374151; --gray-800: #1f2937; --gray-900: #111827; /* 背景色系 */ --bg-primary: #ffffff; --bg-secondary: #f8fafc; --bg-tertiary: #f1f5f9; --bg-dark: #0f172a; --bg-sidebar: #1e293b; /* 文字色系 */ --text-primary: #0f172a; --text-secondary: #475569; --text-muted: #64748b; --text-light: #94a3b8; --text-white: #ffffff; /* 边框色系 */ --border-light: #e2e8f0; --border-medium: #cbd5e1; --border-dark: #94a3b8; /* 阴影系统 */ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); /* 圆角系统 */ --radius-sm: 4px; --radius: 6px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; /* 间距系统 */ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-8: 32px; --space-10: 40px; --space-12: 48px; --space-16: 64px; /* 字体系统 */ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; --font-mono: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; /* 过渡动画 */ --transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); --transition-fast: all 0.15s cubic-bezier(0.4, 0, 0.2, 1); --transition-slow: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } /* ======================================== 全局重置和基础样式 ======================================== */ * { margin: 0; padding: 0; box-sizing: border-box; } html { font-size: 14px; line-height: 1.5; } body { font-family: var(--font-sans); color: var(--text-primary); background-color: var(--bg-secondary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; min-width: 1200px; } /* 滚动条样式 */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: var(--gray-100); border-radius: 3px; } ::-webkit-scrollbar-thumb { background: var(--gray-300); border-radius: 3px; transition: var(--transition); } ::-webkit-scrollbar-thumb:hover { background: var(--gray-400); } /* ======================================== 布局系统 ======================================== */ .admin-layout { display: flex; height: 100vh; overflow: hidden; } /* ======================================== 左侧边栏样式 ======================================== */ .admin-sidebar { width: 260px; background: linear-gradient(180deg, var(--bg-sidebar) 0%, #0f172a 100%); border-right: 1px solid rgba(255, 255, 255, 0.1); display: flex; flex-direction: column; position: relative; z-index: 100; } /* Logo区域 */ .sidebar-header { padding: var(--space-6); border-bottom: 1px solid rgba(255, 255, 255, 0.1); background: rgba(255, 255, 255, 0.02); } .sidebar-logo { display: flex; align-items: center; gap: var(--space-3); } .sidebar-logo img { width: 36px; height: 36px; border-radius: var(--radius-md); background: rgba(255, 255, 255, 0.1); padding: var(--space-2); } .sidebar-logo-text { color: var(--text-white); font-size: 18px; font-weight: 700; letter-spacing: -0.025em; } .sidebar-logo-subtitle { color: rgba(255, 255, 255, 0.7); font-size: 12px; font-weight: 400; margin-top: 2px; } /* 导航菜单 */ .sidebar-nav { flex: 1; padding: var(--space-4) 0; overflow-y: auto; } .nav-section { margin-bottom: var(--space-6); } .nav-section-title { color: rgba(255, 255, 255, 0.5); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; padding: 0 var(--space-6) var(--space-2); margin-bottom: var(--space-2); } .nav-menu { list-style: none; } .nav-item { margin: 0 var(--space-3) var(--space-1); } .nav-link { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); color: rgba(255, 255, 255, 0.8); text-decoration: none; border-radius: var(--radius-md); font-size: 14px; font-weight: 500; transition: var(--transition); position: relative; } .nav-link:hover { background: rgba(255, 255, 255, 0.1); color: var(--text-white); transform: translateX(2px); } .nav-link.active { background: var(--primary); color: var(--text-white); box-shadow: var(--shadow-md); } .nav-link.active::before { content: ''; position: absolute; left: -12px; top: 50%; transform: translateY(-50%); width: 3px; height: 20px; background: var(--text-white); border-radius: 2px; } .nav-icon { width: 20px; height: 20px; flex-shrink: 0; opacity: 0.8; } .nav-text { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .nav-badge { background: var(--danger); color: var(--text-white); font-size: 10px; font-weight: 600; padding: 2px 6px; border-radius: 10px; min-width: 18px; text-align: center; } /* 子菜单 */ .nav-submenu { list-style: none; margin-top: var(--space-1); padding-left: var(--space-8); } .nav-submenu .nav-link { padding: var(--space-2) var(--space-3); font-size: 13px; color: rgba(255, 255, 255, 0.6); } .nav-submenu .nav-link:hover { color: rgba(255, 255, 255, 0.9); } .nav-submenu .nav-link.active { background: rgba(255, 255, 255, 0.1); color: var(--text-white); } /* 侧边栏底部 */ .sidebar-footer { padding: var(--space-4) var(--space-6); border-top: 1px solid rgba(255, 255, 255, 0.1); background: rgba(0, 0, 0, 0.2); } .sidebar-user { display: flex; align-items: center; gap: var(--space-3); color: rgba(255, 255, 255, 0.8); font-size: 13px; } .sidebar-user-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--primary); display: flex; align-items: center; justify-content: center; color: var(--text-white); font-weight: 600; } .sidebar-user-info { flex: 1; min-width: 0; } .sidebar-user-name { font-weight: 500; color: var(--text-white); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .sidebar-user-role { font-size: 11px; color: rgba(255, 255, 255, 0.5); } /* ======================================== 主内容区域 ======================================== */ .admin-main { flex: 1; display: flex; flex-direction: column; overflow: hidden; } /* 顶部栏 */ .admin-header { height: 64px; background: var(--bg-primary); border-bottom: 1px solid var(--border-light); display: flex; align-items: center; justify-content: space-between; padding: 0 var(--space-6); box-shadow: var(--shadow-sm); position: relative; z-index: 50; } .header-left { display: flex; align-items: center; gap: var(--space-4); } .header-breadcrumb { display: flex; align-items: center; gap: var(--space-2); color: var(--text-secondary); font-size: 14px; } .breadcrumb-item { display: flex; align-items: center; gap: var(--space-2); } .breadcrumb-separator { color: var(--text-muted); } .header-right { display: flex; align-items: center; gap: var(--space-4); } .header-action { display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: var(--radius-md); color: var(--text-secondary); transition: var(--transition); cursor: pointer; position: relative; } .header-action:hover { background: var(--gray-100); color: var(--text-primary); } .header-user { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-3); border-radius: var(--radius-md); cursor: pointer; transition: var(--transition); } .header-user:hover { background: var(--gray-100); } .header-user-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--primary); display: flex; align-items: center; justify-content: center; color: var(--text-white); font-weight: 600; font-size: 12px; } .header-user-info { display: flex; flex-direction: column; align-items: flex-start; } .header-user-name { font-size: 14px; font-weight: 500; color: var(--text-primary); line-height: 1.2; } .header-user-role { font-size: 12px; color: var(--text-muted); line-height: 1.2; } /* 内容区域 */ .admin-content { flex: 1; padding: var(--space-6); overflow-y: auto; background: var(--bg-secondary); } /* ======================================== 按钮系统 ======================================== */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); border: 1px solid transparent; border-radius: var(--radius-md); font-size: 14px; font-weight: 500; line-height: 1.5; text-decoration: none; cursor: pointer; transition: var(--transition); white-space: nowrap; user-select: none; outline: none; } .btn:focus { outline: 2px solid transparent; outline-offset: 2px; } /* 按钮尺寸 */ .btn-xs { padding: var(--space-1) var(--space-2); font-size: 12px; border-radius: var(--radius-sm); } .btn-sm { padding: var(--space-2) var(--space-3); font-size: 13px; } .btn-lg { padding: var(--space-3) var(--space-6); font-size: 16px; } .btn-xl { padding: var(--space-4) var(--space-8); font-size: 18px; } /* 主要按钮 */ .btn-primary { background: var(--primary); color: var(--text-white); box-shadow: var(--shadow-sm); } .btn-primary:hover { background: var(--primary-dark); box-shadow: var(--shadow-md); transform: translateY(-1px); } .btn-primary:active { transform: translateY(0); box-shadow: var(--shadow-sm); } .btn-primary:focus { box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.2); } /* 次要按钮 */ .btn-secondary { background: var(--bg-primary); color: var(--text-secondary); border-color: var(--border-medium); } .btn-secondary:hover { background: var(--gray-50); border-color: var(--border-dark); color: var(--text-primary); } /* 成功按钮 */ .btn-success { background: var(--success); color: var(--text-white); } .btn-success:hover { background: #059669; transform: translateY(-1px); } /* 警告按钮 */ .btn-warning { background: var(--warning); color: var(--text-white); } .btn-warning:hover { background: #d97706; transform: translateY(-1px); } /* 危险按钮 */ .btn-danger { background: var(--danger); color: var(--text-white); } .btn-danger:hover { background: #dc2626; transform: translateY(-1px); } /* 信息按钮 */ .btn-info { background: var(--info); color: var(--text-white); } .btn-info:hover { background: #0891b2; transform: translateY(-1px); } /* 轮廓按钮 */ .btn-outline-primary { background: transparent; color: var(--primary); border-color: var(--primary); } .btn-outline-primary:hover { background: var(--primary); color: var(--text-white); } .btn-outline-secondary { background: transparent; color: var(--text-secondary); border-color: var(--border-medium); } .btn-outline-secondary:hover { background: var(--gray-100); color: var(--text-primary); } /* 幽灵按钮 */ .btn-ghost { background: transparent; color: var(--text-secondary); border: none; } .btn-ghost:hover { background: var(--gray-100); color: var(--text-primary); } /* 链接按钮 */ .btn-link { background: transparent; color: var(--primary); border: none; padding: 0; text-decoration: underline; } .btn-link:hover { color: var(--primary-dark); } /* 按钮状态 */ .btn:disabled, .btn.disabled { opacity: 0.5; cursor: not-allowed; transform: none !important; box-shadow: none !important; } .btn.loading { position: relative; color: transparent; } .btn.loading::after { content: ''; position: absolute; width: 16px; height: 16px; border: 2px solid currentColor; border-radius: 50%; border-top-color: transparent; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* 按钮组 */ .btn-group { display: inline-flex; border-radius: var(--radius-md); overflow: hidden; box-shadow: var(--shadow-sm); } .btn-group .btn { border-radius: 0; border-right-width: 0; } .btn-group .btn:first-child { border-top-left-radius: var(--radius-md); border-bottom-left-radius: var(--radius-md); } .btn-group .btn:last-child { border-top-right-radius: var(--radius-md); border-bottom-right-radius: var(--radius-md); border-right-width: 1px; } /* ======================================== 卡片组件 ======================================== */ .card { background: var(--bg-primary); border: 1px solid var(--border-light); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); overflow: hidden; } .card-header { padding: var(--space-4) var(--space-6); border-bottom: 1px solid var(--border-light); background: var(--gray-50); } .card-title { font-size: 16px; font-weight: 600; color: var(--text-primary); margin: 0; } .card-body { padding: var(--space-6); } .card-footer { padding: var(--space-4) var(--space-6); border-top: 1px solid var(--border-light); background: var(--gray-50); } /* ======================================== 表单组件 ======================================== */ .form-group { margin-bottom: var(--space-4); } .form-label { display: block; font-size: 14px; font-weight: 500; color: var(--text-primary); margin-bottom: var(--space-2); } .form-control { width: 100%; padding: var(--space-3) var(--space-4); border: 1px solid var(--border-medium); border-radius: var(--radius-md); font-size: 14px; line-height: 1.5; color: var(--text-primary); background: var(--bg-primary); transition: var(--transition); } .form-control:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); } .form-control::placeholder { color: var(--text-muted); } .form-control:disabled { background: var(--gray-100); color: var(--text-muted); cursor: not-allowed; } /* ======================================== 表格组件 ======================================== */ .table-container { background: var(--bg-primary); border: 1px solid var(--border-light); border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-sm); } .table { width: 100%; border-collapse: collapse; } .table th, .table td { padding: var(--space-3) var(--space-4); text-align: left; border-bottom: 1px solid var(--border-light); } .table th { background: var(--gray-50); font-weight: 600; color: var(--text-primary); font-size: 13px; text-transform: uppercase; letter-spacing: 0.05em; } .table tbody tr:hover { background: var(--gray-50); } .table tbody tr:last-child td { border-bottom: none; } /* ======================================== 工具类 ======================================== */ /* 间距工具类 */ .m-0 { margin: 0 !important; } .m-1 { margin: var(--space-1) !important; } .m-2 { margin: var(--space-2) !important; } .m-3 { margin: var(--space-3) !important; } .m-4 { margin: var(--space-4) !important; } .m-5 { margin: var(--space-5) !important; } .m-6 { margin: var(--space-6) !important; } .p-0 { padding: 0 !important; } .p-1 { padding: var(--space-1) !important; } .p-2 { padding: var(--space-2) !important; } .p-3 { padding: var(--space-3) !important; } .p-4 { padding: var(--space-4) !important; } .p-5 { padding: var(--space-5) !important; } .p-6 { padding: var(--space-6) !important; } /* 文字工具类 */ .text-xs { font-size: 12px !important; } .text-sm { font-size: 13px !important; } .text-base { font-size: 14px !important; } .text-lg { font-size: 16px !important; } .text-xl { font-size: 18px !important; } .font-normal { font-weight: 400 !important; } .font-medium { font-weight: 500 !important; } .font-semibold { font-weight: 600 !important; } .font-bold { font-weight: 700 !important; } .text-left { text-align: left !important; } .text-center { text-align: center !important; } .text-right { text-align: right !important; } /* 颜色工具类 */ .text-primary { color: var(--text-primary) !important; } .text-secondary { color: var(--text-secondary) !important; } .text-muted { color: var(--text-muted) !important; } .text-success { color: var(--success) !important; } .text-warning { color: var(--warning) !important; } .text-danger { color: var(--danger) !important; } /* 显示工具类 */ .d-none { display: none !important; } .d-block { display: block !important; } .d-flex { display: flex !important; } .d-inline-flex { display: inline-flex !important; } /* Flex工具类 */ .flex-row { flex-direction: row !important; } .flex-column { flex-direction: column !important; } .justify-start { justify-content: flex-start !important; } .justify-center { justify-content: center !important; } .justify-end { justify-content: flex-end !important; } .justify-between { justify-content: space-between !important; } .items-start { align-items: flex-start !important; } .items-center { align-items: center !important; } .items-end { align-items: flex-end !important; } /* ======================================== 响应式设计 ======================================== */ @media (max-width: 1200px) { .admin-sidebar { width: 220px; } .admin-content { padding: var(--space-4); } } @media (max-width: 992px) { .admin-sidebar { width: 200px; } .sidebar-logo-text { font-size: 16px; } .nav-link { font-size: 13px; } } @media (max-width: 768px) { body { min-width: auto; } .admin-layout { flex-direction: column; } .admin-sidebar { width: 100%; height: auto; max-height: 200px; } .admin-main { flex: 1; } .admin-content { padding: var(--space-3); } } /* ======================================== 兼容性和覆盖样式 ======================================== */ /* 覆盖原有的深色背景 */ .menu-index-left, .menu-index-right-title { background: var(--bg-sidebar) !important; } /* 覆盖原有的按钮样式 */ button, input[type="button"], input[type="submit"] { font-family: var(--font-sans); } /* 覆盖layui样式 */ .layui-btn { background: var(--primary); border: none; border-radius: var(--radius-md); font-weight: 500; transition: var(--transition); } .layui-btn:hover { background: var(--primary-dark); transform: translateY(-1px); } .layui-btn-primary { background: var(--primary); } .layui-btn-normal { background: var(--success); } .layui-btn-warm { background: var(--warning); } .layui-btn-danger { background: var(--danger); }