init: 管理会计OS初始代码

包含前后端完整代码:
- 前端:Vue3+Vite+ElementPlus
- 后端:FastAPI+SQLAlchemy
- 模块:驾驶舱/KPI/战略地图/预警/预算/成本/预测/改善行动
- 当前版本:v1.0.0
This commit is contained in:
Hermes CI Fix
2026-05-28 17:32:22 +08:00
commit 3dddd36866
142 changed files with 18533 additions and 0 deletions
+356
View File
@@ -0,0 +1,356 @@
/* ===== 博海网络科技 · 全栈学习平台 — 全局响应式样式 ===== */
/* === Reset === */
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body, #app {
height: 100%;
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Microsoft YaHei', Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* === CSS 自定义属性(设计令牌) === */
:root {
/* 颜色系统 */
--bh-primary: #409eff;
--bh-primary-dark: #337ecc;
--bh-primary-light: #a0cfff;
--bh-success: #67c23a;
--bh-warning: #e6a23c;
--bh-danger: #f56c6c;
--bh-info: #909399;
--bh-bg-main: #f0f2f5;
--bh-bg-card: #ffffff;
--bh-bg-dark: #304156;
--bh-bg-dark-light: #3a4a5e;
--bh-text-primary: #303133;
--bh-text-regular: #606266;
--bh-text-secondary: #909399;
--bh-text-placeholder: #c0c4cc;
--bh-border: #e4e7ed;
--bh-border-light: #ebeef5;
/* 侧边栏暗色(永恒不变,无论明暗模式) */
--sidebar-bg: #304156;
--sidebar-bg-hover: #263445;
--sidebar-text: #bfcbd9;
--sidebar-text-active: #409eff;
--sidebar-logo-bg: #2b3a4a;
/* 间距系统 */
--bh-space-xs: 4px;
--bh-space-sm: 8px;
--bh-space-md: 12px;
--bh-space-lg: 16px;
--bh-space-xl: 20px;
--bh-space-2xl: 24px;
/* 圆角 */
--bh-radius-sm: 4px;
--bh-radius-md: 8px;
--bh-radius-lg: 12px;
/* 阴影 */
--bh-shadow-sm: 0 1px 2px rgba(0,0,0,0.06);
--bh-shadow-md: 0 2px 8px rgba(0,0,0,0.08);
/* 侧边栏宽度 */
--bh-sidebar-width: 220px;
--bh-sidebar-collapsed: 64px;
/* 顶栏高度 */
--bh-header-height: 60px;
/* 移动端底部导航高度 */
--bh-mobile-nav-height: 56px;
/* 断点变量(用于 JS */
--bh-breakpoint-sm: 768px;
--bh-breakpoint-md: 992px;
--bh-breakpoint-lg: 1200px;
--bh-breakpoint-xl: 1920px;
}
/* 暗黑模式覆盖 — 只影响内容区,侧边栏保持不变 */
html.dark {
--bh-bg-main: #121212;
--bh-bg-card: #1e1e1e;
--bh-text-primary: #e0e0e0;
--bh-text-regular: #b0b0b0;
--bh-text-secondary: #808080;
--bh-border: #333333;
--bh-border-light: #2a2a2a;
/* Element Plus 暗黑变量覆盖 — 让 el-card 等卡片用我们的色值 */
--el-bg-color: #1e1e1e;
--el-bg-color-overlay: #1e1e1e;
--el-bg-color-page: #121212;
--el-text-color-primary: #e0e0e0;
--el-text-color-regular: #b0b0b0;
--el-text-color-secondary: #808080;
--el-border-color: #333333;
--el-border-color-light: #2a2a2a;
--el-fill-color: #252525;
--el-fill-color-light: #2a2a2a;
--el-fill-color-lighter: #303030;
--el-mask-color: rgba(0, 0, 0, 0.6);
}
/* === 侧边栏全局样式(不受暗黑影响) === */
.sidebar-dark {
background-color: var(--sidebar-bg) !important;
}
.sidebar-dark .el-menu {
background-color: var(--sidebar-bg) !important;
border-right: none;
}
.sidebar-dark .el-menu-item {
color: var(--sidebar-text) !important;
background-color: transparent !important;
}
.sidebar-dark .el-menu-item:hover {
background-color: var(--sidebar-bg-hover) !important;
}
.sidebar-dark .el-menu-item.is-active {
color: var(--sidebar-text-active) !important;
background-color: var(--sidebar-bg-hover) !important;
}
.sidebar-dark .el-menu-item * {
color: inherit !important;
}
/* === 响应式工具类 === */
.d-only { display: revert; }
.m-only { display: none !important; }
@media (max-width: 768px) {
.d-only { display: none !important; }
.m-only { display: revert; }
:root {
--bh-sidebar-width: 0px;
--bh-sidebar-collapsed: 0px;
--bh-header-height: 52px;
}
}
@media (max-width: 480px) {
:root {
--bh-header-height: 48px;
}
}
/* === 通用响应式容器 === */
.bh-container {
width: 100%;
max-width: 1400px;
margin: 0 auto;
padding-left: var(--bh-space-lg);
padding-right: var(--bh-space-lg);
}
@media (max-width: 768px) {
.bh-container {
padding-left: var(--bh-space-md);
padding-right: var(--bh-space-md);
}
}
/* === 滚动条美化 === */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #c0c4cc; border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: #909399; }
/* 暗黑模式滚动条 */
html.dark ::-webkit-scrollbar-thumb { background: #555; }
html.dark ::-webkit-scrollbar-thumb:hover { background: #777; }
/* === Element Plus 全局覆盖 === */
.el-main {
background: var(--bh-bg-main);
min-height: calc(100vh - var(--bh-header-height));
}
/* el-card 暗黑适配 */
html.dark .el-card {
background-color: var(--bh-bg-card);
border-color: var(--bh-border);
}
html.dark .el-card__header {
border-bottom-color: var(--bh-border);
}
/* el-table 暗黑适配 */
html.dark .el-table {
--el-table-bg-color: var(--bh-bg-card);
--el-table-tr-bg-color: var(--bh-bg-card);
--el-table-header-bg-color: var(--bh-bg-dark);
--el-table-row-hover-bg-color: #2a2a2a;
border-color: var(--bh-border);
}
html.dark .el-table th.el-table__cell {
background-color: var(--bh-bg-dark);
color: var(--sidebar-text);
}
html.dark .el-table__inner-wrapper::before,
html.dark .el-table__border-left-patch {
background-color: var(--bh-border);
}
html.dark .el-table__body-wrapper::-webkit-scrollbar-thumb {
background: #555;
}
/* el-tabs 暗黑适配 */
html.dark .el-tabs__header {
border-bottom-color: var(--bh-border);
}
html.dark .el-tabs__item {
color: var(--bh-text-regular);
}
html.dark .el-tabs__item.is-active {
color: var(--bh-primary);
}
/* el-progress 暗黑适配 */
html.dark .el-progress__text {
color: var(--bh-text-secondary);
}
/* el-collapse 暗黑适配 */
html.dark .el-collapse {
border-top-color: var(--bh-border);
border-bottom-color: var(--bh-border);
}
html.dark .el-collapse-item__header {
background-color: var(--bh-bg-card);
color: var(--bh-text-primary);
border-bottom-color: var(--bh-border);
}
html.dark .el-collapse-item__wrap {
background-color: var(--bh-bg-card);
}
html.dark .el-collapse-item__content {
color: var(--bh-text-regular);
}
/* el-dialog 暗黑适配 */
html.dark .el-dialog {
background-color: var(--bh-bg-card);
}
html.dark .el-dialog__title {
color: var(--bh-text-primary);
}
html.dark .el-dialog__body {
color: var(--bh-text-regular);
}
/* 自定义弹窗内下拉选择框层级修复 */
.dialog-select-popper {
z-index: 10001 !important;
}
/* el-empty 暗黑适配 */
html.dark .el-empty__description p {
color: var(--bh-text-secondary);
}
/* el-alert 暗黑适配(info 类型保持原样) */
html.dark .el-alert--info {
background-color: #1a1a2e;
}
/* el-tag 暗黑适配 */
html.dark .el-tag.el-tag--success {
--el-tag-bg-color: #1a3a1a;
--el-tag-text-color: #67c23a;
--el-tag-border-color: #2a5a2a;
}
html.dark .el-tag.el-tag--danger {
--el-tag-bg-color: #3a1a1a;
--el-tag-text-color: #f56c6c;
--el-tag-border-color: #5a2a2a;
}
/* el-form 暗黑适配 */
html.dark .el-form-item__label {
color: var(--bh-text-regular);
}
/* el-timeline 暗黑适配 */
html.dark .el-timeline-item__timestamp {
color: var(--bh-text-secondary);
}
/* el-dropdown 暗黑适配 */
html.dark .el-dropdown-menu {
background-color: var(--bh-bg-card);
border-color: var(--bh-border);
}
html.dark .el-dropdown-menu__item {
color: var(--bh-text-regular);
}
html.dark .el-dropdown-menu__item:hover {
background-color: var(--bh-fill-color, #252525);
}
/* el-drawer 暗黑适配 */
html.dark .el-drawer {
background-color: var(--bh-bg-card);
}
html.dark .el-drawer__header {
color: var(--bh-text-primary);
}
/* 表格在小屏横向滚动 */
.el-table {
@media (max-width: 768px) {
width: 100% !important;
overflow-x: auto;
display: block;
}
}
/* el-card 间距在手机上缩小 */
@media (max-width: 768px) {
.el-card { margin-bottom: 12px !important; }
.el-card__body { padding: 14px !important; }
}
/* 表单在小屏上 label 置顶 */
@media (max-width: 576px) {
.el-form--label-top .el-form-item__label {
padding-bottom: 0;
}
}
/* el-message-box / el-dialog 弹窗全局居中修复 —
注意:不移除 .el-overlay 的 display:flex 会导致遮罩层布局问题,
Element Plus 默认的 el-overlay 已经有 position:fixed + inset:0
居中应该用 center 属性而非覆盖样式 */
.el-message-box {
margin: 0 !important;
}
.el-dialog {
--el-dialog-margin-top: 1vh !important;
}
/* 过渡动画 — 明暗切换平滑过渡 */
html.dark,
html,
html *,
html *::before,
html *::after {
transition: background-color 0.3s ease,
color 0.3s ease,
border-color 0.3s ease,
box-shadow 0.3s ease;
}