feat(admin): 优化后台运维与任务管理

完善平台、基准模型、定价规则和实时负载的紧凑查询与滚动展示,并固定关键操作列。

新增管理员任务记录、批量计费结算和用户组限流、额度及模型权限维护能力,同时补充任务脱敏、查询索引与 OpenAPI 契约。

验证:pnpm openapi、Go 全量测试、pnpm lint、pnpm test、pnpm build、gofmt 与差异格式检查均通过。
This commit is contained in:
2026-07-25 01:32:49 +08:00
parent b29d539d49
commit de10875439
38 changed files with 5015 additions and 425 deletions
+315 -22
View File
@@ -737,8 +737,21 @@
}
.groupTable .shTableRow {
grid-template-columns: minmax(210px, 1.25fr) minmax(100px, 0.55fr) minmax(150px, 0.8fr) minmax(150px, 0.8fr) minmax(100px, 0.55fr) minmax(88px, 0.5fr) minmax(86px, 0.5fr);
min-width: 980px;
grid-template-columns: minmax(190px, 1.15fr) minmax(90px, 0.5fr) minmax(82px, 0.42fr) minmax(145px, 0.8fr) minmax(180px, 1fr) minmax(180px, 1fr) minmax(82px, 0.42fr) minmax(154px, 0.78fr);
min-width: 1305px;
}
.groupTable .shTableRow > :last-child {
position: sticky;
right: 0;
z-index: 1;
background: var(--surface);
box-shadow: -8px 0 12px -12px rgba(16, 24, 40, 0.45);
}
.groupTable > .shTableRow:first-child > :last-child {
z-index: 2;
background: var(--surface-subtle);
}
.auditLogTable .shTableRow {
@@ -774,6 +787,106 @@
width: min(820px, 100%);
}
.userGroupDialog {
width: min(1160px, 100%);
}
.userGroupPermissionDialog {
width: min(1280px, 100%);
max-height: calc(100dvh - 32px);
}
.userGroupPermissionDialogBody {
grid-template-columns: minmax(0, 1fr);
}
.userGroupPermissionDialog .accessTreeBox {
min-height: min(520px, calc(100dvh - 300px));
max-height: calc(100dvh - 300px);
}
.userGroupPolicyEditor {
display: grid;
min-width: 0;
gap: 8px;
padding: 10px;
border: 1px solid var(--border-subtle);
border-radius: 9px;
background: var(--surface-subtle);
}
.userGroupPolicyHeader {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.userGroupPolicyHeader > div {
display: grid;
gap: 2px;
}
.userGroupPolicyHeader strong {
color: var(--text-strong);
font-size: var(--font-size-sm);
}
.userGroupPolicyHeader span {
color: var(--muted-foreground);
font-size: var(--font-size-xs);
}
.userGroupPolicyTable {
min-width: 0;
overflow-x: auto;
border: 1px solid var(--border-subtle);
border-radius: 8px;
background: #fff;
}
.userGroupPolicyRow {
display: grid;
align-items: center;
gap: 6px;
min-width: 850px;
padding: 6px 8px;
border-bottom: 1px solid var(--border-subtle);
}
.userGroupRateLimitTable .userGroupPolicyRow {
grid-template-columns: minmax(170px, 1.15fr) minmax(100px, 0.65fr) minmax(112px, 0.65fr) minmax(120px, 0.72fr) minmax(156px, 0.9fr) 42px;
}
.userGroupQuotaTable .userGroupPolicyRow {
min-width: 620px;
grid-template-columns: minmax(180px, 0.9fr) minmax(120px, 0.55fr) minmax(240px, 1.2fr) 42px;
}
.userGroupPolicyRow:last-child {
border-bottom: 0;
}
.userGroupPolicyTableHead {
min-height: 34px;
background: var(--surface-subtle);
color: var(--muted-foreground);
font-size: var(--font-size-xs);
font-weight: var(--font-weight-semibold);
}
.userGroupPolicyEmpty {
padding: 16px;
color: var(--muted-foreground);
font-size: var(--font-size-xs);
text-align: center;
}
.userGroupPolicySummary strong,
.userGroupPolicySummary small {
max-width: 100%;
}
.formMessage {
margin-top: 12px;
color: var(--muted-foreground);
@@ -1023,15 +1136,175 @@
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.07);
}
.compactAdminTableContent {
display: grid;
gap: 10px;
padding: 10px;
}
.compactAdminToolbar {
display: grid;
align-items: center;
gap: 8px;
}
.platformCompactToolbar {
grid-template-columns: auto minmax(300px, 1fr) auto;
}
.realtimeCompactToolbar {
grid-template-columns: minmax(280px, 1fr) minmax(150px, 0.45fr) minmax(120px, 0.35fr) auto;
}
.catalogCompactToolbar {
grid-template-columns: minmax(320px, 1fr) auto;
}
.billingCompactToolbar {
grid-template-columns: minmax(280px, 1fr) minmax(150px, 220px) auto;
}
.compactAdminToolbar .platformViewTabs {
margin: 0;
padding: 2px;
}
.compactAdminToolbar .platformViewTabs button {
min-height: 28px;
padding: 0 10px;
}
.compactAdminSearch {
width: 100%;
}
.compactAdminToolbarActions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 8px;
}
.compactFilterDialog {
width: min(680px, 100%);
}
.billingSettlementTableViewport {
min-width: 0;
overflow-x: auto;
}
.billingSettlementTable {
min-width: 860px;
}
.billingSettlementTable .shTableRow {
grid-template-columns: 38px minmax(180px, 1.15fr) minmax(104px, 0.55fr) minmax(118px, 0.65fr) minmax(72px, 0.35fr) minmax(180px, 1fr) minmax(110px, 0.55fr);
}
.billingSettlementTable .shTableHead:first-child,
.billingSettlementTable .shTableCell:first-child {
justify-content: center;
}
.compactAdminTableCard .platformFilteredView,
.compactAdminTableCard .platformModelView {
gap: 0;
}
.compactAdminTableCard .platformLimitView {
max-height: calc(100dvh - 150px);
grid-template-rows: minmax(0, 1fr);
gap: 0;
}
.compactAdminTableCard .platformLimitTableViewport {
max-height: calc(100dvh - 160px);
}
.compactAdminTableCard .platformManagementTableViewport {
max-height: calc(100dvh - 160px);
}
.platformFilteredView,
.platformModelView {
display: grid;
gap: 10px;
}
.platformFilterToolbar,
.realtimeLoadToolbar {
display: grid;
grid-template-columns: minmax(280px, 1.4fr) repeat(2, minmax(150px, 0.6fr)) auto;
align-items: end;
gap: 10px;
padding: 10px;
border: 1px solid var(--border-subtle);
border-radius: 10px;
background: var(--surface-subtle);
}
.platformSearchBox {
display: grid;
grid-template-columns: 18px minmax(0, 1fr);
align-items: center;
gap: 8px;
min-height: 32px;
padding-left: 10px;
border: 1px solid var(--input);
border-radius: var(--control-radius);
background: var(--surface);
}
.platformSearchBox svg {
color: var(--text-soft);
}
.platformSearchBox .shInput {
border: 0;
box-shadow: none;
}
.platformFilterSummary,
.realtimeLoadSummary {
color: var(--muted-foreground);
font-size: var(--font-size-xs);
}
.platformDataTable {
border: 1px solid var(--border-subtle);
border-radius: 10px;
background: #fff;
}
.platformManagementTableViewport {
min-width: 0;
min-height: 0;
max-height: calc(100dvh - 220px);
overflow: auto;
overscroll-behavior: contain;
}
.platformManagementTableViewport .shTableHeader {
z-index: 2;
}
.platformManagementTableViewport .shTableRow > :last-child {
position: sticky;
right: 0;
z-index: 1;
background: #fff;
box-shadow: -8px 0 12px -12px rgba(16, 24, 40, 0.45);
}
.platformManagementTableViewport .shTableHeader > :last-child {
z-index: 3;
background: var(--surface-subtle);
}
.platformDataTable .shTableRow {
grid-template-columns: minmax(210px, 1.3fr) minmax(120px, 0.7fr) minmax(150px, 0.9fr) minmax(92px, 0.45fr) minmax(160px, 0.9fr) minmax(76px, 0.4fr) minmax(150px, 0.85fr) minmax(86px, 0.45fr);
min-width: 1040px;
grid-template-columns: minmax(210px, 1.3fr) minmax(120px, 0.7fr) minmax(150px, 0.9fr) minmax(92px, 0.45fr) minmax(160px, 0.9fr) minmax(70px, 0.35fr) minmax(130px, 0.7fr) minmax(82px, 0.4fr) minmax(190px, 1fr) minmax(86px, 0.45fr);
min-width: 1290px;
}
.platformModelView .platformDataTable .shTableRow {
@@ -1100,11 +1373,6 @@
min-height: 30px;
}
.platformModelView {
display: grid;
gap: 12px;
}
.platformLimitView {
display: grid;
grid-template-rows: auto minmax(0, 1fr);
@@ -1165,13 +1433,17 @@
.platformLimitTable .shTableCell {
display: grid;
align-content: center;
min-height: 68px;
padding-right: 10px;
padding-left: 10px;
min-height: 48px;
padding: 8px;
}
.platformLimitTable .shTableHead {
min-height: 74px;
min-height: 50px;
}
.platformLimitTable .platformTableName,
.platformLimitTable .rateMetricCell {
gap: 1px;
}
.platformLimitMetricHead {
@@ -1203,9 +1475,10 @@
.platformRuntimeStatusCell {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
min-width: 0;
gap: 7px;
align-content: start;
align-items: center;
gap: 4px;
}
.platformRestoreButton {
@@ -1272,17 +1545,18 @@
.platformPriorityCell {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
width: 100%;
min-width: 0;
gap: 7px;
align-content: start;
align-items: center;
gap: 4px;
}
.platformPriorityCell .rateMetricCell small {
overflow: visible;
line-height: 1.35;
text-overflow: clip;
white-space: normal;
overflow: hidden;
line-height: 1.2;
text-overflow: ellipsis;
white-space: nowrap;
}
.priorityDemotionTrigger {
@@ -1409,7 +1683,8 @@
.platformModelToolbar {
display: grid;
grid-template-columns: minmax(220px, 0.6fr) minmax(260px, 1fr);
grid-template-columns: minmax(180px, 0.6fr) minmax(240px, 1fr) minmax(150px, 0.55fr) minmax(150px, 0.55fr) auto;
align-items: end;
gap: 12px;
padding: 12px;
border: 1px solid var(--border-subtle);
@@ -1417,6 +1692,11 @@
background: var(--surface-subtle);
}
.realtimeLoadToolbar {
grid-template-columns: minmax(260px, 1.3fr) repeat(4, minmax(140px, 0.55fr)) auto auto;
margin-bottom: 8px;
}
.platformEmptyState {
display: grid;
min-height: 260px;
@@ -2407,6 +2687,17 @@
}
@media (max-width: 860px) {
.platformCompactToolbar,
.realtimeCompactToolbar,
.catalogCompactToolbar,
.billingCompactToolbar {
grid-template-columns: 1fr;
}
.compactAdminToolbarActions {
justify-content: flex-start;
}
.runnerPolicyHeader {
align-items: flex-start;
flex-direction: column;
@@ -2453,6 +2744,8 @@
.platformModelChoices,
.platformModelRow,
.platformModelToolbar,
.platformFilterToolbar,
.realtimeLoadToolbar,
.runtimePolicyGrid,
.fileStorageGrid,
.fileStorageSettingsCard,