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(); }