Files
CICD/docs/design/003_textbooks_module_implementation.md
SpecialX 57807def37
Some checks failed
CI / build-and-test (push) Failing after 3m50s
CI / deploy (push) Has been skipped
完整性更新
现在已经实现了大部分基础功能
2026-01-08 11:14:03 +08:00

7.9 KiB
Raw Permalink Blame History

Textbooks Module Implementation Details

Date: 2025-12-23 Updated: 2025-12-31 Author: DevOps Architect Module: Textbooks (src/modules/textbooks)


1. 概述 (Overview)

本文档记录了教材模块 (Textbooks Module) 的全栈实现细节。该模块负责教材、章节结构及知识点映射的数字化管理,采用了 Vertical Slice ArchitectureImmersive Workbench 交互设计。

2. 架构设计 (Architecture)

2.1 目录结构

所有教材相关的业务逻辑、数据访问和组件均封装在 src/modules/textbooks 下,实现了高度的模块化和隔离。

src/
├── app/
│   └── (dashboard)/
│       └── teacher/
│           └── textbooks/          # 路由层 (Server Components)
│               ├── page.tsx        # 列表页
│               ├── loading.tsx     # 列表骨架屏
│               └── [id]/           # 详情页
│                   ├── page.tsx
│                   └── loading.tsx
│
│       └── student/
│           └── learning/
│               └── textbooks/      # 学生端只读阅读Server Components
│                   ├── page.tsx    # 列表页(复用筛选与卡片)
│                   └── [id]/       # 详情页(阅读器)
│                       └── page.tsx
│
├── modules/
│   └── textbooks/                  # 业务模块
│       ├── actions.ts              # Server Actions (增删改)
│       ├── data-access.ts          # 数据访问层 (Mock/DB)
│       ├── types.ts                # 类型定义 (Schema-aligned)
│       └── components/             # 模块私有组件
│           ├── textbook-content-layout.tsx # [核心] 三栏布局工作台
│           ├── textbook-reader.tsx         # [新增] 学生端只读阅读器URL state
│           ├── chapter-sidebar-list.tsx    # 递归章节树
│           ├── knowledge-point-panel.tsx   # 知识点管理面板
│           ├── create-chapter-dialog.tsx   # 章节创建弹窗
│           └── ... (其他交互组件)

2.2 渲染策略

  • Server Components: 页面入口 (page.tsx) 负责初始数据获取 (Data Fetching),利用 Promise.all 并行拉取教材、章节和知识点数据,实现 "Render-as-you-fetch"。
  • Client Components: 工作台布局 (textbook-content-layout.tsx) 标记为 'use client',接管后续的所有交互逻辑(状态管理、局部更新、弹窗控制),提供类似 SPA 的流畅体验。

3. UI/UX 细节

3.1 布局 (Layout)

采用 Immersive Workbench (沉浸式工作台) 三栏设计:

  • 左侧 (Navigation):
    • 展示递归的章节树 (Recursive Tree)。
    • 支持折叠/展开,清晰展示教材结构。
    • 顶部提供 "+" 按钮快速创建新章节。
  • 中间 (Content):
    • 阅读模式: 渲染 Markdown 格式的章节正文。
    • 编辑模式: 提供 Textarea 进行内容创作,支持实时保存。
  • 右侧 (Context):
    • 上下文感知: 仅显示当前选中章节的关联知识点。
    • 提供知识点的快速添加 (Dialog) 和删除操作。

3.2 交互 (Interactions)

  • Selection State: 点击左侧章节,中间和右侧区域即时更新,无需页面跳转。
  • Optimistic UI: 虽然使用 Server Actions但通过本地状态 (useState) 实现了操作的即时反馈(如保存正文后立即退出编辑模式)。
  • Feedback: 使用 sonner (toast) 提供操作成功或失败的提示。

3.3 学生端阅读体验Read-Only Reader

  • 两栏阅读左侧章节树右侧正文渲染Markdown
  • URL State:选中章节通过 ?chapterId= 写入 URL支持刷新/分享后保持定位nuqs
  • 只读边界:学生端不暴露创建/删除/编辑/知识点管理入口,避免误用教师工作台能力。

4. 数据流与逻辑 (Data Flow)

4.1 Server Actions

所有数据变更操作均通过 src/modules/textbooks/actions.ts 定义的 Server Actions 处理:

  • createChapterAction: 创建章节(支持嵌套)。
  • updateChapterContentAction: 更新正文内容。
  • createKnowledgePointAction: 创建知识点并自动关联当前章节。
  • deleteKnowledgePointAction: 删除知识点并刷新详情页数据。
  • updateTextbookAction: 更新教材元数据Title, Subject, Grade, Publisher
  • deleteTextbookAction: 删除教材及其关联数据。
  • delete...Action: 处理删除逻辑。

4.2 数据访问层 (Data Access)

  • DB Implementation: 教材模块已接入真实数据库访问,data-access.ts 使用 drizzle-orm 直接查询并返回教材、章节、知识点数据。
  • 章节树构建: 章节采用父子关系存储,通过一次性拉取后在内存中构建嵌套树结构,避免 N+1 查询。
  • 级联删除: 删除章节时会同时删除其子章节以及关联的知识点,确保数据一致性。
  • Type Safety: 定义严格的 TypeScript 类型(如 Chapter, KnowledgePoint, UpdateTextbookInput),保证数据契约与 UI 组件一致。

5. 组件复用

  • 使用了 src/shared/components/ui 中的 Shadcn 组件:
    • Dialog, ScrollArea, Card, Button, Input, Textarea, Select.
    • Collapsible 用于实现递归章节树。
    • AlertDialog 用于危险操作的二次确认(删除章节/删除知识点)。
  • 图标库统一使用 lucide-react.

6. Settings 功能实现 (New)

  • 入口: 详情页右上角的 "Settings" 按钮。
  • 组件: TextbookSettingsDialog
  • 功能:
    • Edit: 修改教材的基本信息。
    • Delete: 提供红色删除按钮,二次确认后执行删除并跳转回列表页。

7. 关键更新记录 (Changelog)

7.1 数据与页面

  • 教材模块从 Mock 切换为真实 DB新增教材/章节/知识点的数据访问与 Server Actions 刷新策略。
  • 列表页支持过滤/搜索:通过 query 参数驱动,统一空状态反馈。

7.2 章节侧边栏与弹窗

  • 修复子章节创建弹窗“闪现后消失”:改为受控 Dialog 状态管理。
  • 修复移动端操作按钮不可见/被遮挡:调整布局与可见性策略,确保小屏可点。
  • 删除章节使用确认弹窗并提供删除中状态。

7.3 Markdown 阅读体验

  • 阅读模式使用 react-markdown 渲染章节内容,支持 GFM表格/任务列表等)。
  • 启用 Typographyprose)排版样式,使 h1/h2/... 在视觉上有明显层级差异。
  • 修复阅读模式内容区无法滚动:为 flex 容器补齐 min-h-0 等必要约束。

7.4 知识点删除交互

  • 删除知识点从浏览器 confirm() 升级为 AlertDialog
    • 显示目标名称、危险样式按钮
    • 删除中禁用交互并显示 loading 文案
    • 删除成功后刷新页面数据

7.5 学生端 Textbooks 列表与阅读页New

  • 新增学生端路由:
    • /student/learning/textbooks教材列表页RSC复用筛选组件nuqs与卡片布局。
    • /student/learning/textbooks/[id]教材阅读页RSC + client 阅读器容器),章节选择与阅读不跳页。
  • 复用与适配:
    • TextbookCard 增加可配置跳转基地址,避免学生端卡片误跳到教师端详情页。
    • 新增 TextbookReaderclient用于只读阅读体验左侧章节树 + 右侧正文渲染,章节定位 URL 化(chapterId)。
  • 质量门禁:
    • 通过 npm run lint / typecheck / build

8. 后续计划 (Next Steps)

  • 富文本编辑器: 集成编辑器替换当前 Markdown Textarea提升编辑体验。
  • 拖拽排序: 实现章节树拖拽排序与持久化。
  • 知识点能力增强: 支持编辑、排序、分层(如需要)。