feat(admin): 优化后台运维与任务管理
完善平台、基准模型、定价规则和实时负载的紧凑查询与滚动展示,并固定关键操作列。 新增管理员任务记录、批量计费结算和用户组限流、额度及模型权限维护能力,同时补充任务脱敏、查询索引与 OpenAPI 契约。 验证:pnpm openapi、Go 全量测试、pnpm lint、pnpm test、pnpm build、gofmt 与差异格式检查均通过。
This commit is contained in:
+315
-22
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user