+
+
租户管理
+
+ } onClick={() => refetch()}>
+ 刷新
+
+ }
+ onClick={() => setCreateModalOpen(true)}
+ >
+ 新建租户
+
+
+
+
+ {/* Statistics Cards */}
+
+
+
+
+ }
+ valueStyle={{ color: '#1890ff' }}
+ />
+
+
+
+
+
+
+ }
+ valueStyle={{ color: '#52c41a' }}
+ />
+
+
+
+
+
+
+ }
+ valueStyle={{ color: '#faad14' }}
+ />
+
+
+
+
+
+
+ }
+ valueStyle={{ color: '#722ed1' }}
+ />
+
+
+
+
+
+
+ }
+ valueStyle={{ color: '#13c2c2' }}
+ />
+
+
+
+
+
+
+ }
+ valueStyle={{ color: '#eb2f96' }}
+ />
+
+
+
+
+
+ {/* Filters */}
+
+
+
+
+
+ {/* Tenants Table */}
+
+
+ `共 ${total} 条`,
+ }}
+ onChange={handleTableChange}
+ />
+
+
+
+ {/* Tenant Detail Drawer */}
+ {
+ setDetailDrawerOpen(false);
+ setSelectedTenantId(null);
+ }}
+ extra={
+ }
+ onClick={() => setAdminModalOpen(true)}
+ >
+ 添加管理员
+
+ }
+ >
+
+ {tenantDetail && (
+
+
+
}
+ style={{ backgroundColor: tenantDetail.plan === 'ENTERPRISE' ? '#faad14' : '#1890ff' }}
+ />
+
+
{tenantDetail.name}
+
+
+ {STATUS_LABELS[tenantDetail.status]}
+
+
+ {PLAN_LABELS[tenantDetail.plan]}
+
+
+
+
+
+
+
+ {tenantDetail.id}
+
+ {tenantDetail.slug}
+
+ {tenantDetail.currentUserCount} / {tenantDetail.maxUsers}
+
+
+ {tenantDetail.currentConversationCount} / {tenantDetail.maxConversationsPerMonth}
+
+
+ {(tenantDetail.currentStorageBytes / (1024 * 1024)).toFixed(2)} MB / {tenantDetail.maxStorageMb} MB
+
+
+ {tenantDetail.billingEmail || '-'}
+
+
+ {tenantDetail.billingName || '-'}
+
+
+ {tenantDetail.billingPhone || '-'}
+
+
+ {dayjs(tenantDetail.createdAt).format('YYYY-MM-DD HH:mm:ss')}
+
+ {tenantDetail.suspendedAt && (
+
+ {dayjs(tenantDetail.suspendedAt).format('YYYY-MM-DD HH:mm:ss')}
+
+ )}
+
+
+ {/* Tenant Admins */}
+
管理员列表
+
+ {tenantAdmins && tenantAdmins.length > 0 ? (
+ (
+
+ } />}
+ title={
+
+ {admin.name}
+ {admin.role}
+ {!admin.isActive && 已禁用}
+
+ }
+ description={
+
+
用户名: {admin.username}
+ {admin.email &&
邮箱: {admin.email}
}
+ {admin.lastLoginAt && (
+
最后登录: {dayjs(admin.lastLoginAt).format('YYYY-MM-DD HH:mm')}
+ )}
+
+ }
+ />
+
+ )}
+ />
+ ) : (
+ 暂无管理员
+ )}
+
+
+ )}
+
+
+
+ {/* Create Tenant Modal */}
+ {
+ setCreateModalOpen(false);
+ createForm.resetFields();
+ }}
+ footer={null}
+ width={600}
+ >
+
+
+
+
+
+
+
+
+
+ {/* Edit Tenant Modal */}
+ {
+ setEditModalOpen(false);
+ editForm.resetFields();
+ }}
+ footer={null}
+ width={600}
+ >
+
+
+
+
+
+
+
+
+
+ {/* Create Admin Modal */}
+ {
+ setAdminModalOpen(false);
+ adminForm.resetFields();
+ }}
+ footer={null}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/admin-client/src/shared/components/MainLayout.tsx b/packages/admin-client/src/shared/components/MainLayout.tsx
index e8c174e..b63a7ec 100644
--- a/packages/admin-client/src/shared/components/MainLayout.tsx
+++ b/packages/admin-client/src/shared/components/MainLayout.tsx
@@ -16,6 +16,7 @@ import {
AuditOutlined,
LineChartOutlined,
MessageOutlined,
+ ClusterOutlined,
} from '@ant-design/icons';
import { useAuth } from '../hooks/useAuth';
@@ -70,6 +71,11 @@ const menuItems: MenuProps['items'] = [
icon: ,
label: '对话管理',
},
+ {
+ key: '/tenants',
+ icon: ,
+ label: '租户管理',
+ },
{
key: '/settings',
icon: ,