diff --git a/backend/app/api/prompt_workshop.py b/backend/app/api/prompt_workshop.py
index 403ee90..c450e28 100644
--- a/backend/app/api/prompt_workshop.py
+++ b/backend/app/api/prompt_workshop.py
@@ -533,9 +533,14 @@ async def get_my_submissions(
async def withdraw_submission(
submission_id: str,
request: Request,
+ force: bool = False,
db: AsyncSession = Depends(get_db)
):
- """撤回待审核的提交"""
+ """
+ 删除提交记录
+ - 待审核(pending)的提交可以直接撤回
+ - 已审核(approved/rejected)的提交需要 force=True 参数才能删除
+ """
user_identifier = get_user_identifier_from_request(request)
if is_workshop_server():
@@ -549,16 +554,21 @@ async def withdraw_submission(
if not submission:
raise HTTPException(status_code=404, detail="提交记录不存在")
- if submission.status != "pending":
- raise HTTPException(status_code=400, detail="只能撤回待审核的提交")
+
+ # 待审核的可以直接撤回,已审核的需要 force 参数
+ if submission.status != "pending" and not force:
+ raise HTTPException(status_code=400, detail="只能撤回待审核的提交,删除已审核记录请使用 force 参数")
await db.delete(submission)
await db.commit()
- return {"success": True, "message": "撤回成功"}
+ if submission.status == "pending":
+ return {"success": True, "message": "撤回成功"}
+ else:
+ return {"success": True, "message": "删除成功"}
else:
try:
- return await workshop_client.withdraw_submission(submission_id, user_identifier)
+ return await workshop_client.withdraw_submission(submission_id, user_identifier, force)
except WorkshopClientError as e:
raise HTTPException(status_code=503, detail=str(e))
diff --git a/backend/app/services/workshop_client.py b/backend/app/services/workshop_client.py
index b76d0be..71a4251 100644
--- a/backend/app/services/workshop_client.py
+++ b/backend/app/services/workshop_client.py
@@ -157,12 +157,17 @@ class WorkshopClient:
async def withdraw_submission(
self,
submission_id: str,
- user_identifier: str
+ user_identifier: str,
+ force: bool = False
) -> Dict:
- """撤回提交"""
+ """撤回/删除提交"""
+ params = {}
+ if force:
+ params["force"] = "true"
return await self._request(
"DELETE",
f"/submissions/{submission_id}",
+ params=params if params else None,
user_identifier=user_identifier
)
diff --git a/frontend/src/pages/PromptWorkshop.tsx b/frontend/src/pages/PromptWorkshop.tsx
index b8ffb02..843763f 100644
--- a/frontend/src/pages/PromptWorkshop.tsx
+++ b/frontend/src/pages/PromptWorkshop.tsx
@@ -241,7 +241,7 @@ export default function PromptWorkshop() {
}
};
- // 撤回提交
+ // 撤回提交(pending状态)
const handleWithdraw = async (submissionId: string) => {
try {
await promptWorkshopApi.withdrawSubmission(submissionId);
@@ -253,6 +253,27 @@ export default function PromptWorkshop() {
}
};
+ // 删除提交记录(已审核状态)
+ const handleDeleteSubmission = async (submission: PromptSubmission) => {
+ Modal.confirm({
+ title: '删除提交记录',
+ content: `确定要删除「${submission.name}」的提交记录吗?此操作不可恢复。`,
+ okText: '删除',
+ okType: 'danger',
+ cancelText: '取消',
+ onOk: async () => {
+ try {
+ await promptWorkshopApi.deleteSubmission(submission.id);
+ message.success('删除成功');
+ loadMySubmissions();
+ } catch (error) {
+ console.error('Failed to delete submission:', error);
+ message.error('删除失败');
+ }
+ },
+ });
+ };
+
// 查看详情
const handleViewDetail = async (item: PromptWorkshopItem) => {
try {
@@ -569,17 +590,30 @@ export default function PromptWorkshop() {
提交时间: {sub.created_at ? new Date(sub.created_at).toLocaleDateString() : '-'}
- {sub.status === 'pending' && (
- }
- onClick={() => handleWithdraw(sub.id)}
- >
- 撤回
-
- )}
+
+ {sub.status === 'pending' && (
+ }
+ onClick={() => handleWithdraw(sub.id)}
+ >
+ 撤回
+
+ )}
+ {sub.status !== 'pending' && (
+ }
+ onClick={() => handleDeleteSubmission(sub)}
+ >
+ 删除记录
+
+ )}
+
diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts
index 9245a85..b8e528c 100644
--- a/frontend/src/services/api.ts
+++ b/frontend/src/services/api.ts
@@ -695,10 +695,16 @@ export const promptWorkshopApi = {
{ params: { status } }
),
- // 撤回提交
+ // 撤回提交(pending状态)
withdrawSubmission: (submissionId: string) =>
api.delete(`/prompt-workshop/submissions/${submissionId}`),
+ // 删除提交记录(所有状态,需要 force=true)
+ deleteSubmission: (submissionId: string) =>
+ api.delete(`/prompt-workshop/submissions/${submissionId}`, {
+ params: { force: true }
+ }),
+
// ========== 管理员 API(仅服务端模式可用) ==========
// 获取待审核列表