From c8ecbe277c0211ba179dc78a52e76a3ce47491d6 Mon Sep 17 00:00:00 2001 From: zhonghua Date: Tue, 17 Mar 2026 11:24:25 +0800 Subject: [PATCH 01/11] =?UTF-8?q?fix:=20=E6=95=99=E5=B8=88=E7=AB=AF?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E4=B8=8E=E6=8E=88=E8=AF=BE=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 assessment_data JSON 字段:普通文本自动包装为有效 JSON - 修复返回时页面 ID 丢失:校验无效 ID 并跳转,goBackToDetail 优先使用路由 ID - 修复上课记录列表:getLessons 支持 pageNum、日期范围、状态映射,list 转 items - 修复班级与课程取值:LessonResponse 增加 courseName/className,接口返回时自动填充 - 备课/详情页增加 ID 校验,防止跳转到 undefined Made-with: Cursor --- reading-platform-frontend/src/api/teacher.ts | 44 +++++++++++++++---- .../teacher/courses/CourseDetailView.vue | 11 +++-- .../views/teacher/courses/CourseListView.vue | 7 ++- .../views/teacher/courses/PrepareModeView.vue | 32 +++++++++++--- .../views/teacher/lessons/LessonListView.vue | 34 +++++++++----- .../teacher/TeacherLessonController.java | 38 ++++++++++++++-- .../platform/dto/response/LessonResponse.java | 6 +++ .../platform/service/CourseLessonService.java | 32 ++++++++++++-- 8 files changed, 167 insertions(+), 37 deletions(-) diff --git a/reading-platform-frontend/src/api/teacher.ts b/reading-platform-frontend/src/api/teacher.ts index a05ca17..fbd3221 100644 --- a/reading-platform-frontend/src/api/teacher.ts +++ b/reading-platform-frontend/src/api/teacher.ts @@ -181,26 +181,52 @@ export interface StudentRecordDto { notes?: string; } +// 后端状态值: scheduled, in_progress, completed, cancelled +const STATUS_TO_BACKEND: Record = { + PLANNED: 'scheduled', + IN_PROGRESS: 'in_progress', + COMPLETED: 'completed', + CANCELLED: 'cancelled', +}; + // 获取授课记录列表 export function getLessons(params?: { pageNum?: number; + page?: number; pageSize?: number; status?: string; - courseId?: number; + startDate?: string; + endDate?: string; }): Promise<{ items: any[]; total: number; page: number; pageSize: number; }> { - return http.get('/v1/teacher/lessons', { - params: { - pageNum: params?.pageNum, - pageSize: params?.pageSize, - status: params?.status, - startDate: params?.courseId, // 如果需要可以传其他参数 - }, - }) as any; + const pageNum = params?.pageNum ?? params?.page ?? 1; + const status = params?.status ? (STATUS_TO_BACKEND[params.status] || params.status) : undefined; + return http + .get<{ list?: any[]; records?: any[]; total?: number | string; pageNum?: number; pageSize?: number }>( + '/v1/teacher/lessons', + { + params: { + pageNum, + pageSize: params?.pageSize ?? 10, + status, + startDate: params?.startDate, + endDate: params?.endDate, + }, + } + ) + .then((res) => { + const list = res?.list ?? res?.records ?? []; + return { + items: Array.isArray(list) ? list : [], + total: typeof res?.total === 'string' ? parseInt(res.total, 10) || 0 : (res?.total ?? 0), + page: res?.pageNum ?? pageNum, + pageSize: res?.pageSize ?? 10, + }; + }); } // 获取单个授课记录详情(id 使用 string 避免 Long 精度丢失) diff --git a/reading-platform-frontend/src/views/teacher/courses/CourseDetailView.vue b/reading-platform-frontend/src/views/teacher/courses/CourseDetailView.vue index deb220a..85632cb 100644 --- a/reading-platform-frontend/src/views/teacher/courses/CourseDetailView.vue +++ b/reading-platform-frontend/src/views/teacher/courses/CourseDetailView.vue @@ -17,7 +17,7 @@ 创建校本版本 - + 开始备课 @@ -281,7 +281,7 @@
教学环节 ({{ lesson.steps.length }}个)
-
{{ index + 1 }}
+
{{ Number(index) + 1 }}
{{ step.name }}
{{ step.duration }}分钟
@@ -870,7 +870,12 @@ const createSchoolVersion = () => { }; const startPrepare = () => { - router.push(`/teacher/courses/${course.value.id}/prepare`); + const id = route.params.id || course.value?.id; + if (!id || id === 'undefined') { + message.warning('课程信息未加载完成,请稍后再试'); + return; + } + router.push(`/teacher/courses/${id}/prepare`); }; const toggleFavorite = () => { diff --git a/reading-platform-frontend/src/views/teacher/courses/CourseListView.vue b/reading-platform-frontend/src/views/teacher/courses/CourseListView.vue index ea6c1fb..f8f0bbe 100644 --- a/reading-platform-frontend/src/views/teacher/courses/CourseListView.vue +++ b/reading-platform-frontend/src/views/teacher/courses/CourseListView.vue @@ -318,7 +318,12 @@ const viewCourseDetail = (course: any) => { }; const prepareCourse = (course: any) => { - router.push(`/teacher/courses/${course.id}/prepare`); + const id = course?.id; + if (id == null || id === 'undefined') { + message.warning('课程信息异常,无法进入备课'); + return; + } + router.push(`/teacher/courses/${id}/prepare`); }; onMounted(() => { diff --git a/reading-platform-frontend/src/views/teacher/courses/PrepareModeView.vue b/reading-platform-frontend/src/views/teacher/courses/PrepareModeView.vue index 6df2ad4..987a006 100644 --- a/reading-platform-frontend/src/views/teacher/courses/PrepareModeView.vue +++ b/reading-platform-frontend/src/views/teacher/courses/PrepareModeView.vue @@ -121,7 +121,7 @@ diff --git a/reading-platform-frontend/src/utils/index.ts b/reading-platform-frontend/src/utils/index.ts new file mode 100644 index 0000000..1a1f9ce --- /dev/null +++ b/reading-platform-frontend/src/utils/index.ts @@ -0,0 +1,51 @@ +/** + * 延迟 + * @param ms + * @returns + */ +export function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} +/*** + * 窗口resize事件封装 + */ +const resizeObjs = reactive<{ + time: any; + callbackList: Function[]; +}>({ + time: -1, + callbackList: [], +}); +window.addEventListener( + "resize", + () => { + if (resizeObjs.time >= 0) { + clearTimeout(resizeObjs.time); + } + resizeObjs.time = setTimeout(() => { + resizeObjs.time = -1; + try { + resizeObjs.callbackList.forEach((callback: Function) => { + callback(); + }); + } catch (error) { + console.error(error); + } + }, 600); + }, + false, +); +/** + * @param callback 添加窗口变化事件 + */ +export function addResizeTimeOut(callback: Function) { + resizeObjs.callbackList.push(callback); +} +/** + * @param callback 移除窗口变化事件 + */ +export function removeResizeTimeOut(callback: Function) { + resizeObjs.callbackList = resizeObjs.callbackList.filter((_callback) => { + return callback != _callback; + }); +} diff --git a/reading-platform-frontend/src/views/office/player.vue b/reading-platform-frontend/src/views/office/player.vue new file mode 100644 index 0000000..4a11ea5 --- /dev/null +++ b/reading-platform-frontend/src/views/office/player.vue @@ -0,0 +1,123 @@ + + + + diff --git a/reading-platform-frontend/typed-router.d.ts b/reading-platform-frontend/typed-router.d.ts index 39a3c46..3aa73b0 100644 --- a/reading-platform-frontend/typed-router.d.ts +++ b/reading-platform-frontend/typed-router.d.ts @@ -191,6 +191,13 @@ declare module 'vue-router/auto-routes' { Record, | never >, + '/office/player': RouteRecordInfo< + '/office/player', + '/office/player', + Record, + Record, + | never + >, '/office/WebOffice': RouteRecordInfo< '/office/WebOffice', '/office/WebOffice', @@ -852,6 +859,12 @@ declare module 'vue-router/auto-routes' { views: | never } + 'src/views/office/player.vue': { + routes: + | '/office/player' + views: + | never + } 'src/views/office/WebOffice.vue': { routes: | '/office/WebOffice' From 459fa434ac8c5b02886cf3d40e11ad840710264f Mon Sep 17 00:00:00 2001 From: zhonghua Date: Tue, 17 Mar 2026 14:43:08 +0800 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20KidsMode=20=E6=96=87=E6=A1=A3/?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E9=A2=84=E8=A7=88=E8=B0=83=E6=95=B4=EF=BC=8C?= =?UTF-8?q?player=20=E5=A2=9E=E5=BC=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - KidsMode: 视频对接 player 组件,文档对接 WebOffice 组件 - WebOffice: 新增 noPage 嵌入模式,支持 props 传入 url/fileName - player: 参考 VideoPlayer 增强功能(title、emit、键盘快捷键、加载遮罩、唯一ID) Made-with: Cursor --- .../src/views/office/WebOffice.vue | 54 +++- .../src/views/office/player.vue | 273 +++++++++++++----- .../teacher/lessons/components/KidsMode.vue | 182 +++++++----- .../components/viewers/VideoPlayer.vue | 70 ++--- 4 files changed, 361 insertions(+), 218 deletions(-) diff --git a/reading-platform-frontend/src/views/office/WebOffice.vue b/reading-platform-frontend/src/views/office/WebOffice.vue index dfcc8f0..172d15f 100644 --- a/reading-platform-frontend/src/views/office/WebOffice.vue +++ b/reading-platform-frontend/src/views/office/WebOffice.vue @@ -1,9 +1,10 @@