diff --git a/web/admin/src/styles/main.css b/web/admin/src/styles/main.css index 44fd04f..64839ab 100644 --- a/web/admin/src/styles/main.css +++ b/web/admin/src/styles/main.css @@ -242,6 +242,17 @@ body { color: #64748b; } +/* 表格横向滚动条细化:Arco 默认轨道 15px、滑块 9px,列多时悬停表头会出现粗滚动条遮住表头文字。 + 压成 3px 细线贴在底部,仅作「可横向滚动」的提示;拖拽/点击滚动同步逻辑不变,表头表体通用 */ +.arco-table .arco-scrollbar-track-direction-horizontal { + height: 3px; +} + +.arco-table .arco-scrollbar-thumb-direction-horizontal .arco-scrollbar-thumb-bar { + height: 3px; + margin: 0; +} + .arco-table-td { border-bottom: 1px solid var(--ta-border-light); } @@ -259,6 +270,40 @@ body { vertical-align: middle; } +/* page-table 布局下表体被拉伸为滚动容器,固定 240px 的空态行会顶在表体上方。 + 空数据时把表体区域(含固定列触发的表头/表体分离结构:Scrollbar 根 → arco-table-body → + table)逐层拉满表头以下的剩余高度,再让空态行撑满表格,「暂无数据」即在整个表体 + 可视区内垂直居中,表头行高度不变 */ +.page-table .arco-table-content:has(.arco-table-tr-empty) { + display: flex; + flex-direction: column; +} + +/* 表体区域的 Scrollbar 根(表头是第一个子节点,取 last-child 只拉伸表体) */ +.page-table .arco-table-content:has(.arco-table-tr-empty) > .arco-scrollbar:last-child { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; +} + +/* 表体滚动容器(Arco 把 body 类挂在 scrollbar-container 上) */ +.page-table .arco-table-content:has(.arco-table-tr-empty) .arco-table-body { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; +} + +.page-table .arco-table-content:has(.arco-table-tr-empty) .arco-table-body .arco-table-element { + flex: 1; +} + +/* 空态行撑满拉高后的表格(此表只剩该行,无表头行分高) */ +.page-table .arco-table-content:has(.arco-table-tr-empty) .arco-table-tr-empty { + height: 100%; +} + /* Card */ .arco-card { border-radius: var(--ta-radius); @@ -464,16 +509,16 @@ body { z-index: 12; } -/* 右下角分页栏 */ +/* 右下角分页栏:表格底线(末行 td 的 border-bottom)即分隔线, + footer 不再画 border-top / 留 margin-top,避免表格底部出现两条临近分割线, + 仅用 padding-top 与表格保持间距 */ .page-table .table-footer { flex-shrink: 0; display: flex; align-items: center; justify-content: flex-end; gap: 12px; - margin-top: 12px; padding-top: 12px; - border-top: 1px solid var(--ta-border-light); } /* 统计总数从表格左上角移到底部后:footer 内存在统计栏时两端对齐(统计居左、分页居右), diff --git a/web/admin/src/views/ai/ChannelsPage.vue b/web/admin/src/views/ai/ChannelsPage.vue index debbe72..b6b1f70 100644 --- a/web/admin/src/views/ai/ChannelsPage.vue +++ b/web/admin/src/views/ai/ChannelsPage.vue @@ -692,9 +692,7 @@ const { exporting, exportFile } = useExport({ align-items: center; justify-content: space-between; gap: 12px; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } /* 统计栏移入底部后,去掉全局样式的下边距,与分页栏垂直居中 */ .table-footer :deep(.table-stats) { diff --git a/web/admin/src/views/ai/ModelGroupsPage.vue b/web/admin/src/views/ai/ModelGroupsPage.vue index f433f12..017d891 100644 --- a/web/admin/src/views/ai/ModelGroupsPage.vue +++ b/web/admin/src/views/ai/ModelGroupsPage.vue @@ -326,12 +326,13 @@ onMounted(() => { :on-before-ok="handleSaveModels" :ok-loading="modelsLoading" > - + @@ -347,7 +348,6 @@ onMounted(() => { align-items: center; justify-content: space-between; gap: 12px; - margin-top: 16px; } /* 统计栏移入底部后,去掉全局样式的下边距,与分页栏垂直居中 */ .table-footer :deep(.table-stats) { @@ -356,4 +356,12 @@ onMounted(() => { .mb-4 { margin-bottom: 16px; } +/* 模型穿梭框:弹窗内水平居中,两侧列表加高 */ +.models-transfer-wrap { + display: flex; + justify-content: center; +} +.models-transfer :deep(.arco-transfer-view) { + height: 420px; +} diff --git a/web/admin/src/views/ai/ModelsPage.vue b/web/admin/src/views/ai/ModelsPage.vue index 9d493bb..5665b39 100644 --- a/web/admin/src/views/ai/ModelsPage.vue +++ b/web/admin/src/views/ai/ModelsPage.vue @@ -1010,9 +1010,7 @@ function resetImport() { align-items: center; justify-content: space-between; gap: 12px; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } /* 统计栏移入底部后,去掉全局样式的下边距,与分页栏垂直居中 */ .table-footer :deep(.table-stats) { diff --git a/web/admin/src/views/ai/TaskLogsPage.vue b/web/admin/src/views/ai/TaskLogsPage.vue index 9516c92..12cdc8a 100644 --- a/web/admin/src/views/ai/TaskLogsPage.vue +++ b/web/admin/src/views/ai/TaskLogsPage.vue @@ -418,9 +418,7 @@ onMounted(() => { align-items: center; justify-content: space-between; gap: 12px; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } /* 统计栏移入底部后,去掉全局样式的下边距,与分页栏垂直居中 */ .table-footer :deep(.table-stats) { diff --git a/web/admin/src/views/finance/TransactionsPage.vue b/web/admin/src/views/finance/TransactionsPage.vue index afb9ee3..cff5c04 100644 --- a/web/admin/src/views/finance/TransactionsPage.vue +++ b/web/admin/src/views/finance/TransactionsPage.vue @@ -138,8 +138,6 @@ onMounted(fetchData) .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } diff --git a/web/admin/src/views/operation/EmailLogsPage.vue b/web/admin/src/views/operation/EmailLogsPage.vue index ac6c2db..4526a1b 100644 --- a/web/admin/src/views/operation/EmailLogsPage.vue +++ b/web/admin/src/views/operation/EmailLogsPage.vue @@ -312,9 +312,7 @@ onMounted(() => { .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--color-border-light, #e5e6eb); } .email-body { background: var(--color-fill-2, #f7f8fa); diff --git a/web/admin/src/views/security/AuditPage.vue b/web/admin/src/views/security/AuditPage.vue index ed2148f..37a219d 100644 --- a/web/admin/src/views/security/AuditPage.vue +++ b/web/admin/src/views/security/AuditPage.vue @@ -367,8 +367,6 @@ const { exporting, exportFile } = useExport({ .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } diff --git a/web/admin/src/views/security/PermissionsPage.vue b/web/admin/src/views/security/PermissionsPage.vue index d61901f..110fd85 100644 --- a/web/admin/src/views/security/PermissionsPage.vue +++ b/web/admin/src/views/security/PermissionsPage.vue @@ -549,9 +549,7 @@ const columns: TableColumnData[] = [ .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } .perm-toolbar { diff --git a/web/admin/src/views/security/RequestAuditLogsPage.vue b/web/admin/src/views/security/RequestAuditLogsPage.vue index 39d5a6b..fbdf68e 100644 --- a/web/admin/src/views/security/RequestAuditLogsPage.vue +++ b/web/admin/src/views/security/RequestAuditLogsPage.vue @@ -462,9 +462,7 @@ onMounted(() => { align-items: center; justify-content: space-between; gap: 12px; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--color-border-light, #e5e6eb); } /* 统计栏移入底部后,去掉全局样式的下边距,与分页栏垂直居中 */ .table-footer :deep(.table-stats) { diff --git a/web/admin/src/views/system/FilesPage.vue b/web/admin/src/views/system/FilesPage.vue index 02760d7..8ce081c 100644 --- a/web/admin/src/views/system/FilesPage.vue +++ b/web/admin/src/views/system/FilesPage.vue @@ -615,7 +615,6 @@ onMounted(() => { .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; } .retention-pop { width: 260px; diff --git a/web/admin/src/views/system/PluginsPage.vue b/web/admin/src/views/system/PluginsPage.vue index 7c088b7..c5a5d2c 100644 --- a/web/admin/src/views/system/PluginsPage.vue +++ b/web/admin/src/views/system/PluginsPage.vue @@ -398,8 +398,6 @@ onMounted(() => { .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } diff --git a/web/admin/src/views/system/UsersPage.vue b/web/admin/src/views/system/UsersPage.vue index a52497a..91ccd0a 100644 --- a/web/admin/src/views/system/UsersPage.vue +++ b/web/admin/src/views/system/UsersPage.vue @@ -532,9 +532,7 @@ const { exporting, exportFile } = useExport({ .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } .role-empty-hint { diff --git a/web/admin/src/views/tenant/MembersPage.vue b/web/admin/src/views/tenant/MembersPage.vue index aa88362..ecc15dc 100644 --- a/web/admin/src/views/tenant/MembersPage.vue +++ b/web/admin/src/views/tenant/MembersPage.vue @@ -477,8 +477,6 @@ const { exporting, exportFile } = useExport({ .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } diff --git a/web/admin/src/views/tenant/TenantsPage.vue b/web/admin/src/views/tenant/TenantsPage.vue index 0d33b3d..02520bf 100644 --- a/web/admin/src/views/tenant/TenantsPage.vue +++ b/web/admin/src/views/tenant/TenantsPage.vue @@ -492,8 +492,6 @@ const { exporting, exportFile } = useExport({ .table-footer { display: flex; justify-content: flex-end; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } diff --git a/web/admin/src/views/tenant/UsageLogsPage.vue b/web/admin/src/views/tenant/UsageLogsPage.vue index 1a048e1..ad93618 100644 --- a/web/admin/src/views/tenant/UsageLogsPage.vue +++ b/web/admin/src/views/tenant/UsageLogsPage.vue @@ -1551,9 +1551,7 @@ const { exporting, exportFile } = useExport({ align-items: center; justify-content: space-between; gap: 16px; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--color-border-light, #e5e6eb); } .table-footer-left { diff --git a/web/admin/src/views/tenant/detail/common.css b/web/admin/src/views/tenant/detail/common.css index e0573e7..5470188 100644 --- a/web/admin/src/views/tenant/detail/common.css +++ b/web/admin/src/views/tenant/detail/common.css @@ -7,9 +7,7 @@ align-items: center; justify-content: space-between; gap: 12px; - margin-top: 16px; padding-top: 16px; - border-top: 1px solid var(--ta-border-light); } .table-footer .table-stats { margin-bottom: 0; diff --git a/web/tenant/src/views/service/playground/GenerationProgressCard.vue b/web/tenant/src/views/service/playground/GenerationProgressCard.vue new file mode 100644 index 0000000..9d003a5 --- /dev/null +++ b/web/tenant/src/views/service/playground/GenerationProgressCard.vue @@ -0,0 +1,242 @@ + + + + +