From 87899886d1118632955e6c03d95b9f581d209f8c Mon Sep 17 00:00:00 2001 From: zhonghua Date: Mon, 16 Mar 2026 13:43:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A5=97=E9=A4=90=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E7=AE=A1=E7=90=86=20-=20=E5=AE=A1=E6=A0=B8=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E3=80=81=E9=A9=B3=E5=9B=9E=E5=8F=AF=E9=87=8D=E6=96=B0=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E6=8F=90=E4=BA=A4=E3=80=81=E5=AE=A1=E6=A0=B8=E9=A1=B5?= =?UTF-8?q?=E5=B7=B2=E9=A9=B3=E5=9B=9E=E4=B8=8D=E5=85=81=E8=AE=B8=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- reading-platform-frontend/src/api/index.ts | 2 +- reading-platform-frontend/src/api/package.ts | 1 + reading-platform-frontend/src/router/index.ts | 6 + .../admin/packages/PackageDetailView.vue | 15 +- .../views/admin/packages/PackageListView.vue | 54 ++- .../admin/packages/PackageReviewView.vue | 319 ++++++++++++++++++ .../admin/AdminPackageController.java | 5 +- 7 files changed, 386 insertions(+), 16 deletions(-) create mode 100644 reading-platform-frontend/src/views/admin/packages/PackageReviewView.vue diff --git a/reading-platform-frontend/src/api/index.ts b/reading-platform-frontend/src/api/index.ts index 18d4053..dfea31a 100644 --- a/reading-platform-frontend/src/api/index.ts +++ b/reading-platform-frontend/src/api/index.ts @@ -57,7 +57,7 @@ request.interceptors.response.use( message.error('请求的资源不存在'); break; case 500: - message.error('服务器错误'); + message.error(data?.message || '服务器错误'); break; default: message.error(data?.message || '请求失败'); diff --git a/reading-platform-frontend/src/api/package.ts b/reading-platform-frontend/src/api/package.ts index 48ec87a..7d82674 100644 --- a/reading-platform-frontend/src/api/package.ts +++ b/reading-platform-frontend/src/api/package.ts @@ -17,6 +17,7 @@ export interface CoursePackage { publishedAt?: string; submittedAt?: string; reviewedAt?: string; + reviewComment?: string; updatedAt?: string; courses?: PackageCourse[]; } diff --git a/reading-platform-frontend/src/router/index.ts b/reading-platform-frontend/src/router/index.ts index a5abb4d..1b5d0a1 100644 --- a/reading-platform-frontend/src/router/index.ts +++ b/reading-platform-frontend/src/router/index.ts @@ -82,6 +82,12 @@ const routes: RouteRecordRaw[] = [ component: () => import('@/views/admin/packages/PackageListView.vue'), meta: { title: '套餐管理' }, }, + { + path: 'packages/review', + name: 'AdminPackageReview', + component: () => import('@/views/admin/packages/PackageReviewView.vue'), + meta: { title: '套餐审核管理' }, + }, { path: 'packages/create', name: 'AdminPackageCreate', diff --git a/reading-platform-frontend/src/views/admin/packages/PackageDetailView.vue b/reading-platform-frontend/src/views/admin/packages/PackageDetailView.vue index f689c60..0fb15a2 100644 --- a/reading-platform-frontend/src/views/admin/packages/PackageDetailView.vue +++ b/reading-platform-frontend/src/views/admin/packages/PackageDetailView.vue @@ -8,7 +8,12 @@ 返回 编辑 - 提交审核 + + + 提交审核 + + + 提交审核 发布 @@ -121,12 +126,16 @@ const handleEdit = () => { }; const handleSubmit = async () => { + if ((pkg.value?.courseCount || 0) === 0) { + message.warning('套餐必须包含至少一个课程包,请先编辑添加'); + return; + } try { await submitPackage(route.params.id as string); message.success('提交成功'); fetchData(); - } catch (error) { - message.error('提交失败'); + } catch (error: any) { + message.error(error.response?.data?.message || '提交失败'); } }; diff --git a/reading-platform-frontend/src/views/admin/packages/PackageListView.vue b/reading-platform-frontend/src/views/admin/packages/PackageListView.vue index 8cc53c3..b95f9ae 100644 --- a/reading-platform-frontend/src/views/admin/packages/PackageListView.vue +++ b/reading-platform-frontend/src/views/admin/packages/PackageListView.vue @@ -5,10 +5,16 @@ 课程套餐管理 @@ -54,19 +60,32 @@ 编辑 + + + 提交 + + 提交 + + 审核 + ([]); +const pendingCount = ref(0); const filters = reactive({ status: undefined as string | undefined, }); @@ -159,9 +179,15 @@ const fetchData = async () => { pageNum: pagination.current, pageSize: pagination.pageSize, }) as any; - // 后端返回 PageResult 格式:{ list, total, pageNum, pageSize, pages } dataSource.value = res.list || []; pagination.total = res.total || 0; + // 获取待审核数量 + try { + const pendingRes = await getPackageList({ status: 'PENDING_REVIEW', pageNum: 1, pageSize: 1 }) as any; + pendingCount.value = pendingRes.total || 0; + } catch { + pendingCount.value = 0; + } } catch (error) { console.error('获取套餐列表失败', error); } finally { @@ -187,13 +213,21 @@ const handleEdit = (record: any) => { router.push(`/admin/packages/${record.id}/edit`); }; +const handleReview = (record: any) => { + router.push('/admin/packages/review'); +}; + const handleSubmit = async (record: any) => { + if ((record.courseCount || 0) === 0) { + message.warning('套餐必须包含至少一个课程包,请先编辑添加'); + return; + } try { await submitPackage(record.id); message.success('提交成功'); fetchData(); - } catch (error) { - message.error('提交失败'); + } catch (error: any) { + message.error(error.response?.data?.message || '提交失败'); } }; diff --git a/reading-platform-frontend/src/views/admin/packages/PackageReviewView.vue b/reading-platform-frontend/src/views/admin/packages/PackageReviewView.vue new file mode 100644 index 0000000..da00be1 --- /dev/null +++ b/reading-platform-frontend/src/views/admin/packages/PackageReviewView.vue @@ -0,0 +1,319 @@ + + + + + diff --git a/reading-platform-java/src/main/java/com/reading/platform/controller/admin/AdminPackageController.java b/reading-platform-java/src/main/java/com/reading/platform/controller/admin/AdminPackageController.java index 4b26251..48d5b22 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/controller/admin/AdminPackageController.java +++ b/reading-platform-java/src/main/java/com/reading/platform/controller/admin/AdminPackageController.java @@ -3,6 +3,7 @@ package com.reading.platform.controller.admin; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.reading.platform.common.annotation.RequireRole; import com.reading.platform.common.enums.UserRole; +import com.reading.platform.common.security.SecurityUtils; import com.reading.platform.common.response.PageResult; import com.reading.platform.common.response.Result; import com.reading.platform.dto.request.PackageCreateRequest; @@ -98,7 +99,7 @@ public class AdminPackageController { @Operation(summary = "提交审核") @RequireRole(UserRole.ADMIN) public Result submit(@PathVariable Long id) { - packageService.submitPackage(id, 1L); // TODO: 从token获取userId + packageService.submitPackage(id, SecurityUtils.getCurrentUserId()); return Result.success(); } @@ -108,7 +109,7 @@ public class AdminPackageController { public Result review( @PathVariable Long id, @RequestBody ReviewRequest request) { - packageService.reviewPackage(id, 1L, request.getApproved(), request.getComment()); + packageService.reviewPackage(id, SecurityUtils.getCurrentUserId(), request.getApproved(), request.getComment()); return Result.success(); }