feat(ai): 统一 AI 配置入口到 /admin/ai-settings
## 新增 - 创建 /admin/ai-settings 统一配置页(AiProviderSettingsCard + AiUsageDashboard) - admin 侧边栏新增"AI 配置"菜单项(权限 AI_CONFIGURE,图标 Sparkles) - 新增 deleteAiProvider 数据访问层(事务删除 + 自动转移默认) - 新增 deleteAiProviderAction Server Action(Zod 校验 + 权限校验) - AiProviderSettingsCard 新增删除按钮(AlertDialog 确认 + destructive 变体) - 新增 i18n 翻译键(delete/deleteConfirm/deleteSuccess 等,zh-CN + en) ## 移除 - 从 /settings 移除 AI 标签页(原 VALID_TABS 含 "ai",现仅 4 标签页) - 从考试页面移除 AI 配置弹窗(Dialog + AiProviderSettingsCard 内嵌) - 从 ai-provider-selector.tsx 移除配置弹窗(managePanel/manageOpen props) - 移除 settings-view.tsx 中 canConfigureAi 逻辑和未使用 import ## 变更 - 考试页面"管理"按钮改为 Link 跳转到 /admin/ai-settings - ai-provider-selector.tsx"管理"按钮改为 Link 跳转到 /admin/ai-settings - exam-form.tsx 移除 providerDialogOpen/providerDialogKey 状态 - 修正架构文档 004 中 Action 命名(getAiProvidersAction → getAiProviderSummaries 等) ## 架构文档同步 - 004 更新 settings 模块章节(V3 标记/修正 Action 名称/新增 deleteAiProvider) - 005 新增 deleteAiProviderAction 节点 + /admin/ai-settings 路由
This commit is contained in:
43
src/app/(dashboard)/admin/ai-settings/page.tsx
Normal file
43
src/app/(dashboard)/admin/ai-settings/page.tsx
Normal file
@@ -0,0 +1,43 @@
|
||||
import type { Metadata } from "next"
|
||||
import type { JSX } from "react"
|
||||
|
||||
import { requirePermission } from "@/shared/lib/auth-guard"
|
||||
import { Permissions } from "@/shared/types/permissions"
|
||||
import { AiProviderSettingsCard } from "@/modules/settings/components/ai-provider-settings-card"
|
||||
import { AiUsageDashboard } from "@/modules/ai/components/ai-usage-dashboard"
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "AI 配置 - Next_Edu",
|
||||
description: "统一管理 AI 服务商、API 密钥与使用统计",
|
||||
}
|
||||
|
||||
export const dynamic = "force-dynamic"
|
||||
|
||||
/**
|
||||
* AI 统一配置页
|
||||
*
|
||||
* 作为 AI 模块的独立配置入口,取代:
|
||||
* - /settings?tab=ai(已移除 AI 标签页)
|
||||
* - 考试页面内嵌的 AI 配置弹窗(已改为跳转链接)
|
||||
*
|
||||
* 权限:AI_CONFIGURE(当前仅 admin 角色拥有)
|
||||
*/
|
||||
export default async function AiSettingsPage(): Promise<JSX.Element> {
|
||||
await requirePermission(Permissions.AI_CONFIGURE)
|
||||
return (
|
||||
<div className="flex h-full flex-col gap-8 p-8">
|
||||
<div className="flex flex-col justify-between gap-4 md:flex-row md:items-center">
|
||||
<div className="space-y-1">
|
||||
<h1 className="text-3xl font-bold tracking-tight">AI 配置</h1>
|
||||
<div className="text-sm text-muted-foreground">
|
||||
统一管理 AI 服务商、API 密钥与使用统计
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="space-y-6">
|
||||
<AiProviderSettingsCard />
|
||||
<AiUsageDashboard />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user