From cf09a15893bcb196f98f6d7f9c6834bd7d4f5df3 Mon Sep 17 00:00:00 2001 From: fly6516 Date: Fri, 20 Jun 2025 11:42:10 +0800 Subject: [PATCH] feat(creater): realise problem-editor interactive with database logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 edit-code-panel、edit-description-panel、edit-detail-panel、edit-solution-panel 和 edit-testcase-panel 组件中添加保存逻辑 - 实现与后端 API 的交互,包括保存代码模板、题目描述、详情、解析和测试用例 -优化错误处理和用户提示,使用 toast 组件显示操作结果 - 调整界面布局和交互细节,提升用户体验 --- src/app/actions/getProblem.ts | 8 +- src/components/creater/edit-code-panel.tsx | 68 ++-- .../creater/edit-description-panel.tsx | 57 ++- src/components/creater/edit-detail-panel.tsx | 50 ++- .../creater/edit-solution-panel.tsx | 83 ++-- .../creater/edit-testcase-panel.tsx | 382 ++++++++---------- src/components/creater/problem-maintain.tsx | 230 +++++++++++ 7 files changed, 561 insertions(+), 317 deletions(-) create mode 100644 src/components/creater/problem-maintain.tsx diff --git a/src/app/actions/getProblem.ts b/src/app/actions/getProblem.ts index 7fd776c..223f2eb 100644 --- a/src/app/actions/getProblem.ts +++ b/src/app/actions/getProblem.ts @@ -2,11 +2,11 @@ 'use server'; import prisma from '@/lib/prisma'; -import { Locale } from '@/generated/client'; // ✅ 导入 enum Locale +import { Locale } from '@/generated/client'; import { serialize } from 'next-mdx-remote/serialize'; -export async function getProblemData(problemId: string, locale: string) { - const selectedLocale = locale as Locale; // ✅ 强制转换 string 为 Prisma enum +export async function getProblemData(problemId: string, locale?: string) { + const selectedLocale = locale as Locale; const problem = await prisma.problem.findUnique({ where: { id: problemId }, @@ -17,7 +17,7 @@ export async function getProblemData(problemId: string, locale: string) { }, localizations: { where: { - locale: selectedLocale, // ✅ 这里使用枚举 + locale: selectedLocale, }, }, }, diff --git a/src/components/creater/edit-code-panel.tsx b/src/components/creater/edit-code-panel.tsx index 5479e92..8b73b59 100644 --- a/src/components/creater/edit-code-panel.tsx +++ b/src/components/creater/edit-code-panel.tsx @@ -1,11 +1,14 @@ -'use client'; +"use client" -import { useEffect, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { getProblemData } from '@/app/actions/getProblem'; +import { updateProblemTemplate } from '@/components/creater/problem-maintain'; import { Label } from '@/components/ui/label'; import { Button } from '@/components/ui/button'; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { CoreEditor } from "@/components/core-editor"; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { CoreEditor } from '@/components/core-editor'; +import { Language } from '@/generated/client'; +import { toast } from 'sonner'; interface Template { language: string; @@ -14,65 +17,50 @@ interface Template { interface EditCodePanelProps { problemId: string; - onUpdate?: (data: Template) => Promise<{ success: boolean }>; } -// 模拟保存函数 -async function saveTemplate(data: Template): Promise<{ success: boolean }> { - try { - console.log('保存模板数据:', data); - await new Promise(resolve => setTimeout(resolve, 500)); - return { success: true }; - } catch { - return { success: false }; - } -} - -export default function EditCodePanel({ problemId, onUpdate = saveTemplate }: EditCodePanelProps) { +export default function EditCodePanel({ problemId }: EditCodePanelProps) { const [codeTemplate, setCodeTemplate] = useState