
教育管理系统APP绑定教程用Codex自动生成项目代码
APP绑定教程模块连接教材章节、教案主体和 NotebookLM 资源,是学生端课程内容能否按章节准确打开的关键配置。它维护的不是简单绑定关系,而是从教材路径解析出学段、学科、版本、教材和章节,再把章节映射到 LessonPlan 中的 NotebookLM 教案计划。
本文基于 server_backend/modules/Config/views_app/LessonPlanChapter.py、modules/Config/tasks.py 与 server_vue3/src/views/modules/Config/LessonPlanChapter/ 的真实代码,说明如何把章节初始化、批量绑定、异步状态轮询和资源回显转换成 Codex 可执行的项目代码生成任务。
文章目录
设计与需求
APP绑定教程不能只写成"维护章节绑定 ID"。当前代码里,LessonPlanChapter 用 text_book 保存完整教材路径,用 lesson_plan_notebook_id 和 lesson_plan_notebook_name 绑定 LessonPlan,序列化器还会从 LessonPlan 读取音频概览、视频概览、演示文稿、测验、闪卡、信息图、表格、思维导图和报告 Markdown 等 NotebookLM 资源字段。这个模块要放回教育管理系统的课程分发场景中设计。
APP教程需求
绑定模块设计
章节路径设计
绑定模型设计
任务接口设计
权限验收设计
Codex生成代码
章节资源可用
| 需求层描述 | 设计层转换 | Codex 代码生成方向 |
|---|---|---|
| APP 需要按教材章节打开教程 | text_book 保存 学段/学科/版本/教材/章节 路径 |
生成路径解析、筛选字段和章节树接口 |
| 教程需要绑定教案主体 | 使用 lesson_plan_notebook_id、lesson_plan_notebook_name 关联 LessonPlan |
生成手动选择、清除关联和保存接口 |
| 初始化教案耗时较长 | update_subject_chapter_book 通过 Celery 提交任务 |
生成任务提交、状态查询和前端轮询 |
| 批量绑定需要减少人工操作 | batch_bind_notebook_by_title 按章节标题与 LessonPlan.subtitle 匹配 |
生成批量绑定接口、筛选范围和统计回显 |
| APP 端需要获取资源信息 | resolve_notebook_id 返回绑定 ID、名称和 notebook_json |
生成资源回显接口和字段映射 |
| 页面需要高效检索章节 | 列表筛选按学段、学科、版本、教材、章节、绑定名称展开 | 生成 FastCrud 列表、筛选区和弹窗交互 |
模块能力可以拆成三个层面。数据层使用 LessonPlanChapter 保存章节路径和绑定结果;服务层负责章节初始化、批量匹配、任务状态查询和资源解析;页面层负责筛选、编辑绑定、选择 LessonPlan、批量绑定和初始化弹窗。Codex 只有拿到这些边界,才能避免把模块写成单纯的 ID 编辑表。
可以直接使用下面的Prompt进行模块功能的设计
text
请基于当前教育管理系统源码设计 APP绑定教程模块。不要把它设计成普通 CRUD,而要围绕教材章节、LessonPlan 绑定、NotebookLM 资源回显、异步初始化和批量绑定完成模块设计。
后端需要参考 server_backend/modules/Config/models.py 中的 LessonPlanChapter 模型,字段包括 text_book、lesson_plan_notebook_id、lesson_plan_notebook_name、lesson_plan_notebook_json。接口需要参考 server_backend/modules/Config/views_app/LessonPlanChapter.py 和 server_backend/modules/Config/tasks.py。
模块需要支持章节列表、筛选查询、新增、编辑、软删除、初始化教案任务提交、初始化任务状态查询、批量按标题绑定 NotebookLM 教案计划、按章节名称解析绑定 ID、章节树查询。
序列化器需要把 text_book 解析成 type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name,并从 LessonPlan 中读取 notebooklm_audio_overview、notebooklm_video_overview、notebooklm_presentation、notebooklm_quiz、notebooklm_flashcard、notebooklm_infographic、notebooklm_table、notebooklm_mindmap、notebooklm_report,组装为 notebook_json。
前端需要参考 server_vue3/src/views/modules/Config/LessonPlanChapter/index.vue、api.ts、crud.tsx、components/InitChapterDialog.vue、components/LessonPlanPickerDialog.vue,实现章节列表、筛选、编辑绑定、从 LessonPlan 选择、清除关联、初始化教案、任务轮询和批量绑定。
请输出完整模块设计,覆盖页面结构、模型字段、接口规则、异步任务、批量绑定、资源回显、权限控制和验收标准,再按当前项目结构生成代码。
后端设计
APP绑定教程后端的重点是搭建章节与教案资源的绑定底座。LessonPlanChapterSerializer 不只是返回模型字段,还通过 parse_text_book 生成筛选展示字段,通过 NOTEBOOK_JSON_FIELD_MAP 把 LessonPlan 的 NotebookLM 资源字段转换为统一 notebook_json。LessonPlanChapterViewSet 还提供初始化、批量绑定、任务状态、章节树和资源解析等自定义接口。
| 后端设计项 | 设计重点 | Codex 生成方向 |
|---|---|---|
| 数据模型 | LessonPlanChapter 保存教材路径、绑定 ID、绑定名称和 JSON 载体 |
生成章节绑定模型与软删除能力 |
| 序列化逻辑 | 解析 text_book 并隐藏原始 lesson_plan_notebook_json |
生成展示字段和资源字段映射 |
| 筛选查询 | filter_queryset 按学段、学科、版本、教材、章节过滤 |
生成路径前缀和包含查询 |
| 异步初始化 | 通过 config_update_subject_chapter_book_task 调用 TextBookViewSet.update_subject_chapter_book |
生成 Celery 任务提交与状态接口 |
| 批量绑定 | 按章节标题归一化匹配 LessonPlan.subtitle |
生成匹配规则、统计结果和批量更新 |
| 资源解析 | resolve_notebook_id 返回绑定信息和 notebook_json |
生成 APP 端资源查询接口 |
| 章节树 | chapter_tree 按学段、学科、版本、教材、章节构建树 |
生成筛选导航数据 |
后端需要特别处理两个边界。批量绑定不能直接覆盖所有数据,代码中 only_unbound 默认只处理未绑定记录,并通过已初始化教材前缀限定当前有效目录。资源回显不能只返回绑定 ID,还要读取 LessonPlan 的 NotebookLM 字段并归一化为空值,避免 APP 端拿到缺字段的结构。
可以直接使用下面的Prompt进行后端代码的设计
text
请为教育管理系统配置中心实现 APP绑定教程模块后端代码,要求从零设计或补齐现有代码,并贴合当前项目结构。
后端模块路径:server_backend/modules/Config/。
模型参考:server_backend/modules/Config/models.py 中的 LessonPlanChapter。
接口参考:server_backend/modules/Config/views_app/LessonPlanChapter.py。
任务参考:server_backend/modules/Config/tasks.py。
请实现 LessonPlanChapter 数据模型,字段包含 text_book、lesson_plan_notebook_id、lesson_plan_notebook_name、lesson_plan_notebook_json,并支持软删除。
请实现 LessonPlanChapterSerializer。序列化时需要把 text_book 解析为 type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name。需要从绑定的 LessonPlan 读取 notebooklm_audio_overview、notebooklm_video_overview、notebooklm_presentation、notebooklm_quiz、notebooklm_flashcard、notebooklm_infographic、notebooklm_table、notebooklm_mindmap、notebooklm_report,并组装 notebook_json。
请实现 LessonPlanChapterViewSet,包含列表、详情、新增、编辑、软删除、update_subject_chapter_book、update_subject_chapter_book_task_status、batch_bind_notebook_by_title、chapter_tree、resolve_notebook_id。列表筛选需要支持 type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name、lesson_plan_notebook_name。
update_subject_chapter_book 需要提交 Celery 异步任务 config_update_subject_chapter_book_task,并返回 task_id、state、subject、level、filename、reset_task_queue。update_subject_chapter_book_task_status 需要根据 task_id 返回 PENDING、PROGRESS、SUCCESS、FAILURE 状态和结果。
batch_bind_notebook_by_title 需要按当前筛选条件限定范围,默认 only_unbound=true,只处理未绑定章节。匹配规则需要归一化章节标题和 LessonPlan.subtitle,并优先匹配 NotebookLM 类型和学科一致的数据。返回 updated_count、matched_count、unmatched_count、non_bindable_skipped、already_bound_skipped、unchanged_count、样例标题和 filters。
resolve_notebook_id 需要按 chapter_name 查询章节绑定,返回 matched、lesson_plan_notebook_id、lesson_plan_notebook_name、notebook_json、教材解析字段和 text_book。未匹配时返回空 notebook_json。
请补齐序列化规则、接口视图、路由注册、筛选查询、权限控制和基础校验,保证前端 LessonPlanChapter 页面和 APP 端资源查询都能使用。
前端设计
APP绑定教程前端的重点不是让用户手填绑定 ID,而是让管理员能快速定位章节、选择教案主体、批量匹配未绑定数据,并观察初始化任务执行结果。index.vue 使用 FastCrud 承载列表,在 actionbar 中放置 InitChapterDialog 和"批量绑定APP"按钮,编辑表单中把 lesson_plan_notebook_id 替换为自定义绑定编辑器。
| 前端设计项 | 设计重点 | Codex 生成方向 |
|---|---|---|
| 页面入口 | index.vue 使用 fs-page、fs-crud、初始化弹窗和批量绑定按钮 |
生成主页面与 actionbar 插槽 |
| 接口封装 | api.ts 封装列表、编辑、软删除、初始化任务、任务状态、批量绑定、LessonPlan 选择 |
生成统一请求函数 |
| 列表配置 | crud.tsx 展示学段、学科、版本、教材、章节、绑定名称 |
生成 FastCrud 列表和筛选项 |
| 字段转换 | buildTextBookByParts 与 normalizeSubmitForm 负责路径拼接与提交清洗 |
生成保存前格式转换 |
| 绑定编辑 | 表单插槽提供"从 LessonPlan 选择"和"清除关联" | 生成自定义编辑器和回填逻辑 |
| 初始化任务 | InitChapterDialog 提交任务并按 task_id 轮询状态 |
生成异步任务 UI、轮询和统计提示 |
| 批量绑定 | handleBatchBindApp 按当前筛选条件构造 payload |
生成确认框、加载状态和结果提示 |
| LessonPlan 选择 | LessonPlanPickerDialog 按关键词搜索 select_for_binding |
生成选择弹窗、分页和选中回填 |
前端字段转换是这个模块最容易出错的位置。后端保存的是 text_book 一条路径,前端展示和筛选却拆成 type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name。编辑保存前必须重新拼接路径,并删除展示字段,避免把只读字段误提交给后端。
可以直接使用下面的Prompt进行前端代码的设计
text
请为教育管理系统配置中心实现 APP绑定教程模块前端代码,要求贴合当前 server_vue3 项目和 FastCrud 写法。
前端模块路径:server_vue3/src/views/modules/Config/LessonPlanChapter/。
需要实现或补齐 index.vue、api.ts、crud.tsx、components/InitChapterDialog.vue、components/LessonPlanPickerDialog.vue。
index.vue 需要使用 fs-page 和 fs-crud 承载章节绑定列表,在 actionbar-left 插槽放置 InitChapterDialog 和批量绑定APP按钮。编辑表单中需要为 lesson_plan_notebook_id 提供自定义插槽,支持从 LessonPlan 选择、清除关联、显示当前绑定名称和 ID。
api.ts 需要封装 /api/Config/LessonPlanChapter/ 的列表、详情、新增、编辑、软删除,并封装 update_subject_chapter_book、update_subject_chapter_book_task_status、batch_bind_notebook_by_title、resolve_notebook_id、get_init_menu、TeachingCenter/LessonPlan/select_for_binding。
crud.tsx 需要生成列表字段和筛选项:type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name、lesson_plan_notebook_name。text_book 原始字段可隐藏。保存前需要把学段、学科、版本、教材名称、章节名称重新拼接为 text_book,并删除只读展示字段。
InitChapterDialog.vue 需要从 TextBook/get_init_menu 获取学段学科菜单,展示章节初始化状态。初始化单学科时提交 update_subject_chapter_book,拿到 task_id 后轮询 update_subject_chapter_book_task_status,直到 SUCCESS 或 FAILURE。当前页一键初始化需要逐个学科执行,并汇总成功、失败、缺教材、章节新增、恢复、跳过、软删、任务队列等统计。
LessonPlanPickerDialog.vue 需要按关键词查询 /api/TeachingCenter/LessonPlan/select_for_binding/,展示 id、plan_code、subtitle、subject、text_book、content_preview,并支持分页和选择回填。
批量绑定APP需要根据当前列表筛选条件构造 payload,默认 only_unbound=true,调用 batch_bind_notebook_by_title 后展示 updated_count、matched_count、unmatched_count、non_bindable_skipped、already_bound_skipped,并刷新列表。
扩展功能
APP绑定教程的扩展能力都来自真实源码。数据联动负责把 text_book 路径拆分、筛选和保存重新拼接起来;批量处理负责初始化教案和按标题批量绑定;资源预览负责把 LessonPlan 中的 NotebookLM 资源字段稳定返回给 APP 或调用方。这些能力让模块从普通绑定表升级为课程资源分发的配置闭环。
| 扩展功能 | 主要用途 | 落地重点 |
|---|---|---|
| 数据联动 | 保证教材路径、筛选字段、表单提交和列表回显一致 | 路径解析、展示字段、提交清洗和刷新逻辑 |
| 批量处理 | 批量初始化章节教案、按标题批量绑定未绑定数据 | Celery 任务、状态轮询、匹配统计和范围控制 |
| 资源预览 | 返回绑定 LessonPlan 的 NotebookLM 资源结构 | 字段映射、空值归一、APP 查询接口 |
数据联动
数据联动围绕 text_book 展开。后端用 LessonPlanChapterViewUtils.parse_text_book 把 普通高中/化学/鲁科版/教材册/章节 拆成多个展示字段;前端 crud.tsx 在保存前通过 buildTextBookByParts 再拼回 text_book;列表筛选则把学段、学科、版本、教材和章节字段转成后端可理解的查询参数。
结果阶段
处理阶段
输入阶段
筛选字段
编辑绑定
选择教案
路径解析
拼接路径
提交保存
刷新列表
列表回显
绑定更新
资源可查
Codex 生成联动逻辑时,需要避免把拆分字段当成真实模型字段。type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name 是序列化展示字段,不应直接入库;提交时只保存 text_book、lesson_plan_notebook_id、lesson_plan_notebook_name 等模型字段。
可以直接使用下面的Prompt进行数据联动设计
text
请为 APP绑定教程模块实现数据联动逻辑。
后端使用 LessonPlanChapter.text_book 保存完整教材路径,格式为 学段/学科/版本/教材名称/章节路径。序列化时需要通过 LessonPlanChapterViewUtils.parse_text_book 拆出 type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name。
前端列表需要展示并筛选这些拆分字段,但新增和编辑提交时不能把这些字段直接保存到模型。请在 crud.tsx 中实现 buildTextBookByParts 和 normalizeSubmitForm,把拆分字段重新拼接为 text_book,并删除 type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name。
从 LessonPlanPickerDialog 选择记录后,需要回填 lesson_plan_notebook_id 和 lesson_plan_notebook_name。清除关联时需要同时清空 ID 和名称。保存成功后刷新当前列表。
请保证列表筛选、编辑回显、选择 LessonPlan、清除绑定、保存提交和列表刷新之间一致。
批量处理
批量处理包含两类真实能力:一类是 InitChapterDialog 对当前页学科逐个提交初始化教案任务,并通过 update_subject_chapter_book_task_status 轮询 Celery 状态;另一类是 batch_bind_notebook_by_title 按当前筛选范围,把未绑定章节与 LessonPlan.subtitle 做标题归一化匹配并批量更新。
结果阶段
处理阶段
输入阶段
当前页学科
当前筛选
提交任务
轮询状态
标题匹配
批量更新
初始化统计
绑定统计
刷新列表
批量绑定的边界必须写清楚:默认 only_unbound=true,已绑定数据跳过;范围来自当前筛选条件;目录节点或不可绑定章节要跳过;未匹配标题需要返回样例,便于人工修正。初始化任务也不能用前端长请求硬等,当前源码已经通过 Celery 拆成提交和轮询两个接口。
可以直接使用下面的Prompt进行批量处理功能设计
text
请为 APP绑定教程模块实现批量处理能力。
批量初始化教案:前端 InitChapterDialog 打开时请求 TextBook/get_init_menu,单学科初始化需要调用 LessonPlanChapter/update_subject_chapter_book 提交异步任务,拿到 task_id 后每 1200ms 请求 update_subject_chapter_book_task_status,直到 SUCCESS 或 FAILURE。当前页一键初始化需要逐个学科执行,并汇总成功、失败、缺教材、章节新增、恢复、跳过、软删、任务总数和队列总数。
批量绑定APP:前端根据当前列表筛选条件构造 payload,包括 type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name、lesson_plan_notebook_name、only_unbound=true,调用 batch_bind_notebook_by_title。
后端 batch_bind_notebook_by_title 需要限定当前筛选范围,并只处理当前已初始化教材目录下的数据。标题匹配需要对章节名和 LessonPlan.subtitle 做归一化,优先选择 NotebookLM 类型和学科匹配的 LessonPlan。目录节点、已绑定数据、未匹配数据需要分别统计。
接口返回 updated_count、matched_count、unmatched_count、non_bindable_skipped、already_bound_skipped、unchanged_count、empty_title_count、unmatched_sample_titles、non_bindable_sample_titles、filters。前端需要展示汇总提示并刷新列表。
资源预览
资源预览在源码里体现为 notebook_json 回显。LessonPlanChapterSerializer 通过绑定 ID 查询 LessonPlan,从 notebooklm_audio_overview、notebooklm_video_overview、notebooklm_presentation、notebooklm_quiz、notebooklm_flashcard、notebooklm_infographic、notebooklm_table、notebooklm_mindmap、notebooklm_report 中提取资源地址或内容,并映射为 audio_overview、video_overview、presentation、choice_quiz、flashcard_quiz、infographic、data_table、mindmap、report_md。
结果阶段
处理阶段
输入阶段
章节名称
绑定ID
查询章节
读取LessonPlan
映射资源
返回绑定
返回资源
这部分不是新建文件预览器,而是为 APP 或调用方提供稳定资源结构。Codex 生成时要保证未绑定、绑定 ID 为空、绑定数据不存在时都返回空结构,不能让前端因为缺字段报错。resolve_notebook_id 还要兼容旧字段 lesson_plan_notebook,因为历史页面可能仍读取该字段。
可以直接使用下面的Prompt进行资源预览功能设计
text
请为 APP绑定教程模块实现 NotebookLM 资源预览与回显能力。
后端 LessonPlanChapterSerializer 需要根据 lesson_plan_notebook_id 查询 LessonPlan。如果 ID 为空、为默认值 notebook教案计划,或 LessonPlan 不存在,则返回空 notebook_json。空结构必须包含 audio_overview、video_overview、presentation、choice_quiz、flashcard_quiz、infographic、data_table、mindmap、report_md。
如果绑定的 LessonPlan 存在,请从 notebooklm_audio_overview、notebooklm_video_overview、notebooklm_presentation、notebooklm_quiz、notebooklm_flashcard、notebooklm_infographic、notebooklm_table、notebooklm_mindmap、notebooklm_report 读取资源字段,并映射到 notebook_json。
resolve_notebook_id 接口需要按 chapter_name 查询章节绑定,返回 matched、id、lesson_plan_notebook_id、lesson_plan_notebook_name、lesson_plan_notebook、notebook_json、type_book_level、type_book_subject、type_book_version、textbook_name、chapter_name、text_book。未匹配时返回 matched=false 和空资源结构。
请保证 APP 或前端调用该接口时,不会因为未绑定、空字段或资源缺失导致结构不完整。
Codex开发标准
使用 Codex 开发 APP绑定教程模块,需要用需求边界、PDD、SOP、接口权限规则和验收标准约束开发过程。这个模块跨 Config、TeachingCenter 和 Celery 任务,必须让 Codex 先读上下文,再分阶段实现绑定、任务、批量处理和资源回显。
验收交付
Codex开发
模块设计
输入约束
需求边界
PDD设计
SOP目录规范
接口与权限规则
后端设计
前端设计
扩展能力
读取上下文
生成后端代码
生成前端代码
补齐任务与绑定
功能自检
PDD验收
问题修复
模块交付
SOP 标准
SOP 用来约束 APP绑定教程的目录、文件职责和开发顺序。这个模块的后端主逻辑在 Config,绑定候选数据来自 TeachingCenter/LessonPlan,异步初始化由 Config/tasks.py 承接,前端页面集中在 LessonPlanChapter 目录。
text
ManageBak-ExamEdu/
├── server_backend/
│ └── modules/
│ ├── Config/
│ │ ├── models.py
│ │ ├── urls.py
│ │ ├── utils.py
│ │ ├── tasks.py
│ │ └── views_app/
│ │ ├── LessonPlanChapter.py
│ │ └── TextBook.py
│ └── TeachingCenter/
│ ├── models.py
│ └── views_app/
│ └── LessonPlan.py
├── server_vue3/
│ └── src/
│ └── views/
│ └── modules/
│ └── Config/
│ └── LessonPlanChapter/
│ ├── index.vue
│ ├── api.ts
│ ├── crud.tsx
│ └── components/
│ ├── InitChapterDialog.vue
│ └── LessonPlanPickerDialog.vue
└── docs/
└── modules/
└── config-lesson-plan-chapter/
├── pdd.md
├── api.md
├── test-cases.md
└── codex-sop.md
| 开发阶段 | Codex 执行目标 | 输出结果 |
|---|---|---|
| 模块设计 | 明确章节绑定、异步初始化、批量绑定和资源回显边界 | pdd.md |
| 目录规划 | 沿用 Config/LessonPlanChapter 前后端目录 |
codex-sop.md |
| 后端实现 | 生成模型、序列化、筛选、任务接口、批量绑定、资源解析 | 后端模块代码 |
| 前端实现 | 生成列表、筛选、绑定编辑器、初始化弹窗、选择弹窗 | 前端页面代码 |
| 数据联动 | 打通路径解析、保存拼接、选择回填和刷新逻辑 | 联动逻辑代码 |
| 扩展功能 | 补齐批量处理和 NotebookLM 资源回显 | 任务与资源代码 |
| 验收修复 | 按 PDD 检查绑定、任务、批量和资源结构 | 验收记录与修复提交 |
可以直接使用下面的Prompt进行SOP撰写
text
请按照教育管理系统模块开发 SOP,从零实现或补齐配置中心的 APP绑定教程模块。
开发前先输出目录结构,不要直接写代码。目录必须贴合当前项目:后端放在 server_backend/modules/Config/,前端放在 server_vue3/src/views/modules/Config/LessonPlanChapter/,候选绑定数据读取 server_backend/modules/TeachingCenter/,文档放在 docs/modules/config-lesson-plan-chapter/。
请先生成 docs/modules/config-lesson-plan-chapter/pdd.md、api.md、test-cases.md 和 codex-sop.md。文档需要明确 LessonPlanChapter 模型字段、text_book 路径解析、LessonPlan 绑定、NotebookLM 资源字段映射、异步初始化任务、批量绑定、前端筛选和验收规则。
文档确认后,再根据 SOP 生成或补齐后端模型、序列化、接口视图、路由注册、筛选查询、权限控制、Celery 任务、前端页面、接口封装、FastCrud 列表、InitChapterDialog 和 LessonPlanPickerDialog。
实现过程中不得新增代码里不存在的 LLM 内容生成、OCR、审批、统计、导入导出功能。只实现源码真实存在的数据联动、批量处理和 NotebookLM 资源回显。
PDD 标准
PDD 是 APP绑定教程的设计与验收文档,用来约束 Codex 输出是否符合真实业务。这个模块的验收重点在绑定关系是否准确、异步任务是否可追踪、批量绑定是否受筛选范围约束、NotebookLM 资源结构是否稳定。
| 验收维度 | 验收标准 | 不通过表现 |
|---|---|---|
| 业务目标 | 能把教材章节绑定到 LessonPlan 的 NotebookLM 教案计划 |
只保存一个无上下文的 ID |
| 页面结构 | 包含章节列表、筛选区、编辑绑定、初始化教案、批量绑定、LessonPlan 选择弹窗 | 缺少绑定选择或任务入口 |
| 数据模型 | LessonPlanChapter 字段覆盖 text_book、绑定 ID、绑定名称、JSON 载体 |
字段与后端模型不一致 |
| 接口规则 | 列表、编辑、软删除、任务提交、任务状态、批量绑定、章节树、资源解析可用 | 前端按钮存在但后端接口缺失 |
| 权限控制 | 后端接口和前端操作遵守当前项目权限体系 | 只隐藏按钮,接口可越权调用 |
| 测试用例 | 覆盖筛选、编辑绑定、清除绑定、初始化任务、批量绑定、资源解析 | 只有页面打开验证 |
| 数据联动 | text_book 拆分展示、保存拼接和筛选参数一致 |
编辑保存后路径丢失或字段错位 |
| 批量处理 | 任务轮询可完成,批量绑定只处理筛选范围和未绑定数据 | 长请求超时或覆盖已绑定数据 |
| 资源预览 | notebook_json 结构完整,未绑定也返回空结构 |
APP 端因缺字段报错 |
可以直接使用下面的Prompt进行PDD 验收
text
请根据 docs/modules/config-lesson-plan-chapter/pdd.md 对 APP绑定教程模块进行 PDD 验收。
验收范围包括 server_backend/modules/Config/models.py、server_backend/modules/Config/views_app/LessonPlanChapter.py、server_backend/modules/Config/tasks.py、server_backend/modules/Config/utils.py、server_backend/modules/Config/urls.py,以及 server_vue3/src/views/modules/Config/LessonPlanChapter/index.vue、api.ts、crud.tsx、components/InitChapterDialog.vue、components/LessonPlanPickerDialog.vue。
请检查 LessonPlanChapter 字段是否完整,text_book 是否能解析为学段、学科、版本、教材、章节,列表筛选是否按这些字段生效,编辑保存是否重新拼接 text_book,软删除是否通过 is_deleted 更新。
请检查 update_subject_chapter_book 是否提交 Celery 任务,update_subject_chapter_book_task_status 是否能返回任务状态,InitChapterDialog 是否能轮询任务结果并展示初始化统计。
请检查 batch_bind_notebook_by_title 是否默认 only_unbound=true,是否按当前筛选范围处理,是否返回更新、命中、未匹配、不可绑定跳过和已绑定跳过统计。请检查 LessonPlanPickerDialog 是否能查询候选 LessonPlan 并回填绑定 ID 与名称。
请检查 resolve_notebook_id 和 serializer 返回的 notebook_json 是否包含 audio_overview、video_overview、presentation、choice_quiz、flashcard_quiz、infographic、data_table、mindmap、report_md,并在未绑定时返回空结构。
请输出验收结果表,标记通过、未通过和需要修复的文件位置。不要只给结论,需要指出具体问题、影响范围和修复建议。
总结
APP绑定教程模块的开发价值,在于把教材章节、教案主体和 NotebookLM 资源组织成可查询、可绑定、可批量处理的课程资源闭环。它服务的是 APP 端按章节访问教程内容的业务链路,不是普通后台 ID 维护页面。
使用 Codex 开发这类模块时,PDD 要定义绑定边界、异步任务、批量规则和资源结构,SOP 要约束 Config/LessonPlanChapter 的目录结构和开发顺序,Prompt 要把页面、模型、接口、权限和真实扩展能力分阶段交给 Codex 实现。