diff --git a/web/tenant/src/router/tenant.ts b/web/tenant/src/router/tenant.ts index f1e0298..4858bb0 100644 --- a/web/tenant/src/router/tenant.ts +++ b/web/tenant/src/router/tenant.ts @@ -109,35 +109,41 @@ const tenantRoutes: RouteRecordRaw[] = [ component: () => import('@/views/service/ModelsPage.vue'), meta: { title: '可用模型', icon: 'cube', sort: 30, roles: ['owner', 'admin', 'member'] }, }, + { + path: 'playground', + name: 'TenantPlayground', + component: () => import('@/views/service/PlaygroundPage.vue'), + meta: { title: '在线体验', icon: 'terminal', sort: 31, roles: ['owner', 'admin', 'member'], badge: '⚡' }, + }, { path: 'model-comparison', name: 'TenantModelComparison', component: () => import('@/views/service/ModelComparisonPage.vue'), - meta: { title: '模型对比', icon: 'chart', sort: 31, roles: ['owner', 'admin', 'member'] }, + meta: { title: '模型对比', icon: 'chart', sort: 32, roles: ['owner', 'admin', 'member'] }, }, { path: 'api-keys', name: 'TenantApiKeys', component: () => import('@/views/service/ApiKeysPage.vue'), - meta: { title: 'API 密钥', icon: 'key', sort: 32, roles: ['owner', 'admin', 'member'], viewportTable: true }, + meta: { title: 'API 密钥', icon: 'key', sort: 33, roles: ['owner', 'admin', 'member'], viewportTable: true }, }, { path: 'usage-logs', name: 'TenantUsageLogs', component: () => import('@/views/service/UsageLogsPage.vue'), - meta: { title: '用量日志', icon: 'chart', sort: 33, roles: ['owner', 'admin', 'member'], viewportTable: true }, + meta: { title: '用量日志', icon: 'chart', sort: 34, roles: ['owner', 'admin', 'member'], viewportTable: true }, }, { path: 'request-audit-logs', name: 'TenantRequestAuditLogs', component: () => import('@/views/service/RequestAuditLogsPage.vue'), - meta: { title: '请求审计日志', icon: 'clipboard', sort: 34, roles: ['owner', 'admin'], viewportTable: true }, + meta: { title: '请求审计日志', icon: 'clipboard', sort: 35, roles: ['owner', 'admin'], viewportTable: true }, }, { path: 'task-logs', name: 'TenantTaskLogs', component: () => import('@/views/service/TaskLogsPage.vue'), - meta: { title: '任务日志', icon: 'clock', sort: 35, roles: ['owner', 'admin', 'member'], viewportTable: true }, + meta: { title: '任务日志', icon: 'clock', sort: 36, roles: ['owner', 'admin', 'member'], viewportTable: true }, }, // 财务 (40-49) { @@ -177,12 +183,6 @@ const tenantRoutes: RouteRecordRaw[] = [ component: () => import('@/views/notification/NotificationPreferencesPage.vue'), meta: { title: '通知偏好', roles: ['owner', 'admin'] }, }, - { - path: 'playground', - name: 'TenantPlayground', - component: () => import('@/views/service/PlaygroundPage.vue'), - meta: { title: '在线体验', icon: 'terminal', sort: 50, roles: ['owner', 'admin', 'member'], badge: '⚡' }, - }, { path: 'tickets', name: 'TenantTickets', diff --git a/web/tenant/src/styles/main.css b/web/tenant/src/styles/main.css index dd42ecc..faa91ca 100644 --- a/web/tenant/src/styles/main.css +++ b/web/tenant/src/styles/main.css @@ -459,6 +459,16 @@ body.modal-open { flex: 0 0 auto; } } + +/* Naive UI flex-height 表格空态垂直居中:空态节点 .n-data-table-empty 自带 flex-grow:1 + 居中, + 但其父级滚动 content(.n-scrollbar-content)默认高度塌成内容高且非 flex 容器,flex-grow 无从生效, + 「暂无数据」会顶在表体上方。空数据时把 content 拉满表体高度并转纵向 flex 即可; + 限定 :has(空态节点) 保证有数据时表格布局零影响 */ +.n-data-table--flex-height .n-data-table-base-table-body .n-scrollbar-content:has(> .n-data-table-empty) { + min-height: 100%; + display: flex; + flex-direction: column; +} .table-container-flush { border: 0; border-radius: 0; diff --git a/web/tenant/src/views/service/PlaygroundPage.vue b/web/tenant/src/views/service/PlaygroundPage.vue index ace4f5b..6b9c67f 100644 --- a/web/tenant/src/views/service/PlaygroundPage.vue +++ b/web/tenant/src/views/service/PlaygroundPage.vue @@ -1,5 +1,5 @@