SNAPSHOT W7 已部署稳定态 — 凯迪ERP+OA一体化平台 (MET 73.3%)
恢复点(restore point)。别人改崩后可 git reset --hard 回到此提交。 == 此快照内容 == - 后端 oa-backend: 734 控制器 / 711 实体 (Spring Boot 3.2.5 + SQLite, 端口8091) - 前端 modern-ui/app: Vue3+Vite, 约700页 (构建产物已在 oa-backend/src/main/resources/static) - 数据库 oa-backend/data/oa.db: 含全部演示数据 (强制入库, 6.6MB) - 交接文档 go.md + go-code-reference/endpoints/entities/database.md - 多代理建设脚本 .claude/wf-*.js == 状态 == - 对 凯迪科技ERP_20260507.xlsx 合规 MET ~73.3% (PARTIAL 75: 34可建+6种子/bug+35外部硬天花板) - 安全: 5轮红队+5轮复检, default-deny分级鉴权, 连续零可利用 - W3~W7 累计补完436缺口; W8末轮(40缺口)为半成品(源码树可编译但未集成) - 运行: cd oa-backend; java -jar build/libs/oa-backend-0.1.0.jar --server.port=8091; admin/123456 == 排除(gitignore, 可再生) == node_modules / oa-backend/build / .jdks / *.log / Backup-ERP-* / 弃用的OFBiz核心(只保留modern-ui) 完整文件夹备份见同目录 Backup-ERP-20260615-191517/ (含上述全部, 仅缺 node_modules) 时间戳: 20260615-191517 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,481 @@
|
||||
.erp-form {
|
||||
display: grid;
|
||||
gap: var(--erp-space-4);
|
||||
}
|
||||
|
||||
.metrics-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||
gap: var(--erp-space-3);
|
||||
}
|
||||
|
||||
.metrics-grid--mini {
|
||||
gap: var(--erp-space-2);
|
||||
}
|
||||
|
||||
.erp-metric-card {
|
||||
--erp-metric-color: var(--erp-color-primary);
|
||||
--erp-metric-soft: var(--erp-color-primary-soft);
|
||||
position: relative;
|
||||
min-height: 104px;
|
||||
padding: var(--erp-space-4);
|
||||
background: var(--erp-color-surface);
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-metric-card.is-success {
|
||||
--erp-metric-color: var(--erp-color-success);
|
||||
--erp-metric-soft: var(--erp-color-success-soft);
|
||||
}
|
||||
|
||||
.erp-metric-card.is-warning {
|
||||
--erp-metric-color: var(--erp-color-warning);
|
||||
--erp-metric-soft: var(--erp-color-warning-soft);
|
||||
}
|
||||
|
||||
.erp-metric-card.is-danger {
|
||||
--erp-metric-color: var(--erp-color-danger);
|
||||
--erp-metric-soft: var(--erp-color-danger-soft);
|
||||
}
|
||||
|
||||
.erp-metric-card__head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: var(--erp-space-3);
|
||||
margin-bottom: var(--erp-space-3);
|
||||
}
|
||||
|
||||
.erp-metric-card__head span {
|
||||
color: var(--erp-color-text-muted);
|
||||
font-size: var(--erp-font-size-xs);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.erp-metric-card__head .el-icon {
|
||||
color: var(--erp-metric-color);
|
||||
}
|
||||
|
||||
.erp-metric-card strong {
|
||||
display: block;
|
||||
margin-bottom: var(--erp-space-1);
|
||||
color: var(--erp-color-text);
|
||||
font-size: 25px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.erp-metric-card small {
|
||||
color: var(--erp-color-text-muted);
|
||||
font-size: var(--erp-font-size-xs);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.erp-metric-card--small,
|
||||
.erp-metric-card--outline {
|
||||
border-color: color-mix(in srgb, var(--erp-metric-color) 44%, var(--erp-color-border-soft));
|
||||
box-shadow: 0 1px 0 rgba(29, 36, 51, 0.03);
|
||||
}
|
||||
|
||||
.erp-metric-card--large,
|
||||
.erp-metric-card--quiet {
|
||||
background: linear-gradient(180deg, var(--erp-metric-soft), #ffffff 66%);
|
||||
border-color: color-mix(in srgb, var(--erp-metric-color) 18%, var(--erp-color-border-soft));
|
||||
}
|
||||
|
||||
.erp-metric-card--mini,
|
||||
.erp-metric-card--compact {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
grid-template-areas:
|
||||
"head value"
|
||||
"delta value";
|
||||
min-height: 74px;
|
||||
align-items: center;
|
||||
padding: var(--erp-space-3);
|
||||
border-color: var(--erp-color-border-soft);
|
||||
}
|
||||
|
||||
.erp-metric-card--mini .erp-metric-card__head,
|
||||
.erp-metric-card--compact .erp-metric-card__head {
|
||||
grid-area: head;
|
||||
justify-content: flex-start;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.erp-metric-card--mini strong,
|
||||
.erp-metric-card--compact strong {
|
||||
grid-area: value;
|
||||
margin-bottom: 0;
|
||||
font-size: 22px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.erp-metric-card--mini small,
|
||||
.erp-metric-card--compact small {
|
||||
grid-area: delta;
|
||||
color: var(--erp-metric-color);
|
||||
}
|
||||
|
||||
.erp-table {
|
||||
--erp-table-header-bg-color: #f2f5fa;
|
||||
--erp-table-header-text-color: #344054;
|
||||
--erp-table-row-hover-bg-color: #f5f8ff;
|
||||
--erp-table-border-color: var(--erp-color-border-soft);
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.erp-table .el-table__cell {
|
||||
padding: 7px 0;
|
||||
}
|
||||
|
||||
.erp-table th.el-table__cell {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.erp-virtual-table {
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-dense-pagination {
|
||||
--el-pagination-font-size: var(--erp-font-size-sm);
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.erp-field-control,
|
||||
.erp-date-range,
|
||||
.erp-entity-lookup,
|
||||
.erp-tree-select {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.erp-choice-group {
|
||||
display: inline-flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--erp-space-2);
|
||||
}
|
||||
|
||||
.erp-side-menu {
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
.erp-side-menu .el-menu-item,
|
||||
.erp-side-menu .el-sub-menu__title {
|
||||
height: 38px;
|
||||
color: #465066;
|
||||
font-size: var(--erp-font-size-sm);
|
||||
}
|
||||
|
||||
.erp-side-menu .el-menu-item.is-active {
|
||||
color: var(--erp-color-primary);
|
||||
background: var(--erp-color-primary-soft);
|
||||
}
|
||||
|
||||
.erp-side-menu .el-sub-menu .el-menu-item {
|
||||
min-width: 0;
|
||||
padding-left: 44px;
|
||||
}
|
||||
|
||||
.erp-breadcrumb {
|
||||
font-size: var(--erp-font-size-sm);
|
||||
}
|
||||
|
||||
.erp-breadcrumb .el-breadcrumb__inner {
|
||||
color: var(--erp-color-text-muted);
|
||||
font-weight: 650;
|
||||
}
|
||||
|
||||
.erp-breadcrumb .el-breadcrumb__item:last-child .el-breadcrumb__inner {
|
||||
color: var(--erp-color-text);
|
||||
}
|
||||
|
||||
.erp-page-header {
|
||||
padding-bottom: var(--erp-space-3);
|
||||
border-bottom: 1px solid var(--erp-color-border-soft);
|
||||
}
|
||||
|
||||
.erp-tabs .el-tabs__header {
|
||||
margin-bottom: var(--erp-space-3);
|
||||
}
|
||||
|
||||
.erp-tabs .el-tabs__item {
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
.erp-action-button,
|
||||
.erp-action-dropdown .el-button {
|
||||
min-width: 86px;
|
||||
}
|
||||
|
||||
.erp-status-tag,
|
||||
.erp-status-badge {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.erp-status-alert {
|
||||
border-radius: var(--erp-radius-sm);
|
||||
}
|
||||
|
||||
.erp-detail-descriptions .el-descriptions__cell {
|
||||
padding: 9px 12px;
|
||||
}
|
||||
|
||||
.erp-detail-descriptions .el-descriptions__label {
|
||||
width: 96px;
|
||||
color: #566176;
|
||||
font-weight: 700;
|
||||
background: #f5f7fb;
|
||||
}
|
||||
|
||||
.erp-entity-card {
|
||||
min-height: 112px;
|
||||
padding: var(--erp-space-4);
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
box-shadow: var(--erp-shadow-sm);
|
||||
}
|
||||
|
||||
.erp-entity-card header {
|
||||
margin-bottom: var(--erp-space-2);
|
||||
color: var(--erp-color-text-muted);
|
||||
font-size: var(--erp-font-size-xs);
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.erp-entity-card strong {
|
||||
display: block;
|
||||
color: var(--erp-color-text);
|
||||
font-size: var(--erp-font-size-lg);
|
||||
}
|
||||
|
||||
.erp-entity-card p {
|
||||
margin: var(--erp-space-2) 0 0;
|
||||
color: var(--erp-color-text-muted);
|
||||
}
|
||||
|
||||
.erp-tree,
|
||||
.erp-tree-select {
|
||||
--el-tree-node-hover-bg-color: var(--erp-color-surface-muted);
|
||||
}
|
||||
|
||||
.erp-upload .el-upload-dragger {
|
||||
padding: var(--erp-space-5);
|
||||
border-color: var(--erp-color-border);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-empty-state {
|
||||
padding: var(--erp-space-5);
|
||||
background: #ffffff;
|
||||
border: 1px dashed var(--erp-color-border);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-progress {
|
||||
--el-color-primary: var(--erp-color-primary);
|
||||
}
|
||||
|
||||
.erp-skeleton {
|
||||
padding: var(--erp-space-4);
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-calendar {
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-calendar .el-calendar__body {
|
||||
padding: var(--erp-space-3);
|
||||
}
|
||||
|
||||
.erp-calendar .el-calendar-table .el-calendar-day {
|
||||
min-height: 44px;
|
||||
height: 44px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.erp-timeline {
|
||||
padding: var(--erp-space-2) 0 0;
|
||||
}
|
||||
|
||||
.erp-steps {
|
||||
padding: var(--erp-space-4);
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-collapse {
|
||||
overflow: hidden;
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-collapse .el-collapse-item__header,
|
||||
.erp-collapse .el-collapse-item__content {
|
||||
padding-right: var(--erp-space-4);
|
||||
padding-left: var(--erp-space-4);
|
||||
}
|
||||
|
||||
.erp-media-preview {
|
||||
width: 220px;
|
||||
height: 132px;
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-carousel {
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-inline-text,
|
||||
.erp-inline-link {
|
||||
font-size: var(--erp-font-size-sm);
|
||||
font-weight: 650;
|
||||
}
|
||||
|
||||
.erp-space {
|
||||
padding: var(--erp-space-3);
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-statistic {
|
||||
min-width: 150px;
|
||||
padding: var(--erp-space-4);
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-md);
|
||||
}
|
||||
|
||||
.erp-switch,
|
||||
.erp-slider,
|
||||
.erp-rate,
|
||||
.erp-color-picker {
|
||||
max-width: 360px;
|
||||
}
|
||||
|
||||
.erp-transfer {
|
||||
max-width: 720px;
|
||||
}
|
||||
|
||||
.erp-dialog,
|
||||
.erp-drawer,
|
||||
.erp-popconfirm,
|
||||
.erp-tooltip {
|
||||
font-size: var(--erp-font-size-sm);
|
||||
}
|
||||
|
||||
.form-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1.15fr 0.85fr 1.2fr 0.85fr;
|
||||
gap: var(--erp-space-4);
|
||||
align-items: end;
|
||||
}
|
||||
|
||||
.form-grid.secondary {
|
||||
grid-template-columns: 1fr 1fr 1.2fr;
|
||||
}
|
||||
|
||||
.table-search {
|
||||
width: 270px;
|
||||
}
|
||||
|
||||
.icon-cell {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
color: #465066;
|
||||
}
|
||||
|
||||
.risk-dot {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.risk-dot::before {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
content: "";
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.risk-low::before {
|
||||
background: var(--erp-color-success);
|
||||
}
|
||||
|
||||
.risk-mid::before {
|
||||
background: var(--erp-color-warning);
|
||||
}
|
||||
|
||||
.risk-high::before {
|
||||
background: var(--erp-color-danger);
|
||||
}
|
||||
|
||||
.component-chip-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 7px;
|
||||
}
|
||||
|
||||
.component-chip {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
min-height: 26px;
|
||||
padding: 4px 8px;
|
||||
color: #344054;
|
||||
font-size: var(--erp-font-size-xs);
|
||||
font-weight: 700;
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--erp-color-border-soft);
|
||||
border-radius: var(--erp-radius-xs);
|
||||
}
|
||||
|
||||
.component-chip small {
|
||||
display: inline-grid;
|
||||
min-width: 16px;
|
||||
height: 16px;
|
||||
place-items: center;
|
||||
padding: 0 4px;
|
||||
color: var(--erp-color-text-muted);
|
||||
font-size: 11px;
|
||||
background: var(--erp-color-surface-muted);
|
||||
border-radius: 999px;
|
||||
}
|
||||
|
||||
.component-chip.priority-高 {
|
||||
color: var(--erp-color-primary-strong);
|
||||
border-color: #bdd0fb;
|
||||
background: #f4f7ff;
|
||||
}
|
||||
|
||||
.component-chip.priority-高 small {
|
||||
color: #ffffff;
|
||||
background: var(--erp-color-primary);
|
||||
}
|
||||
|
||||
.component-chip.priority-中 {
|
||||
color: #525f76;
|
||||
}
|
||||
|
||||
.component-chip.priority-低 {
|
||||
color: #7d8798;
|
||||
background: #fafbfc;
|
||||
}
|
||||
Reference in New Issue
Block a user