- 重构 AppLayout 为可折叠侧边栏导航布局 - 实现统计仪表盘:统计摘要卡片 + 请求趋势图表 - Provider 页面使用 Card 包裹优化视觉层次 - 主题切换按钮移至侧边栏底部,支持折叠态 - Header 适配暗色主题,添加分隔线优化视觉过渡 - 添加全局样式重置(SCSS) - 完善组件测试和 E2E 测试覆盖 - 同步 OpenSpec 规范到主 specs
108 lines
2.5 KiB
TypeScript
108 lines
2.5 KiB
TypeScript
import { Button, Table, Tag, Popconfirm, Space, Card } from 'antd';
|
|
import type { ColumnsType } from 'antd/es/table';
|
|
import type { Provider, Model } from '@/types';
|
|
import { ModelTable } from './ModelTable';
|
|
|
|
interface ProviderTableProps {
|
|
providers: Provider[];
|
|
loading: boolean;
|
|
onAdd: () => void;
|
|
onEdit: (provider: Provider) => void;
|
|
onDelete: (id: string) => void;
|
|
onAddModel: (providerId: string) => void;
|
|
onEditModel: (model: Model) => void;
|
|
}
|
|
|
|
function maskApiKey(key: string | null | undefined): string {
|
|
if (!key) return '****';
|
|
if (key.length <= 4) return '****';
|
|
return `****${key.slice(-4)}`;
|
|
}
|
|
|
|
export function ProviderTable({
|
|
providers,
|
|
loading,
|
|
onAdd,
|
|
onEdit,
|
|
onDelete,
|
|
onAddModel,
|
|
onEditModel,
|
|
}: ProviderTableProps) {
|
|
const columns: ColumnsType<Provider> = [
|
|
{
|
|
title: '名称',
|
|
dataIndex: 'name',
|
|
key: 'name',
|
|
},
|
|
{
|
|
title: 'Base URL',
|
|
dataIndex: 'baseUrl',
|
|
key: 'baseUrl',
|
|
},
|
|
{
|
|
title: 'API Key',
|
|
dataIndex: 'apiKey',
|
|
key: 'apiKey',
|
|
render: (key: string | null | undefined) => maskApiKey(key),
|
|
},
|
|
{
|
|
title: '状态',
|
|
dataIndex: 'enabled',
|
|
key: 'enabled',
|
|
render: (enabled: boolean) =>
|
|
enabled ? <Tag color="green">启用</Tag> : <Tag color="red">禁用</Tag>,
|
|
width: 80,
|
|
},
|
|
{
|
|
title: '操作',
|
|
key: 'action',
|
|
width: 160,
|
|
render: (_, record) => (
|
|
<Space>
|
|
<Button type="link" size="small" onClick={() => onEdit(record)}>
|
|
编辑
|
|
</Button>
|
|
<Popconfirm
|
|
title="确定要删除这个供应商吗?关联的模型也会被删除。"
|
|
onConfirm={() => onDelete(record.id)}
|
|
okText="确定"
|
|
cancelText="取消"
|
|
>
|
|
<Button type="link" danger size="small">
|
|
删除
|
|
</Button>
|
|
</Popconfirm>
|
|
</Space>
|
|
),
|
|
},
|
|
];
|
|
|
|
return (
|
|
<Card
|
|
title="供应商列表"
|
|
extra={
|
|
<Button type="primary" onClick={onAdd}>
|
|
添加供应商
|
|
</Button>
|
|
}
|
|
>
|
|
<Table<Provider>
|
|
columns={columns}
|
|
dataSource={providers}
|
|
rowKey="id"
|
|
loading={loading}
|
|
expandable={{
|
|
expandedRowRender: (record) => (
|
|
<ModelTable
|
|
providerId={record.id}
|
|
onAdd={() => onAddModel(record.id)}
|
|
onEdit={onEditModel}
|
|
/>
|
|
),
|
|
}}
|
|
pagination={false}
|
|
/>
|
|
</Card>
|
|
);
|
|
}
|