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 @@
+
+
+
+
+
+
+
+
+
+
+ ¥{{ ((record.price || 0) / 100).toFixed(2) }}
+
+
+
+ {{ grade }}
+
+
+
+
+ {{ record.status === 'PENDING_REVIEW' ? '待审核' : '已驳回' }}
+
+
+
+ {{ formatDate(record.submittedAt) }}
+
+
+
+
+ 审核
+
+
+ 查看原因
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentPackage.name }}
+
+ ¥{{ ((currentPackage.price || 0) / 100).toFixed(2) }}
+
+
+
+ {{ grade }}
+
+
+ {{ currentPackage.courseCount }}
+
+ {{ currentPackage.description || '-' }}
+
+
+
+
包含课程包
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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();
}