# English PK 开发文档 ## 项目简介 这是一个面向中班英语课堂的浏览器 Web 应用,已改造为 Next.js 项目。应用包含两个主要页面: - `/pk`:课堂 PK 比赛页面。 - `/admin`:后台管理页面,使用 shadcn/ui 风格组件。 旧版单文件 HTML 与 Tauri 目录仍保留为历史参考,但当前主架构以 Next.js 和 SQLite 为准。 ## 技术栈 - Next.js 16 App Router - React 19 - TypeScript - Tailwind CSS - shadcn/ui 风格本地组件 - Sonner toast - SQLite(Node `node:sqlite`) - Edge TTS(`edge-tts-universal`) - Web Speech API - Web Audio API ## 目录结构 ```text englishPk/ ├─ app/ │ ├─ layout.tsx # 全局布局和顶部导航 │ ├─ page.tsx # 根路径重定向到 /pk │ ├─ globals.css # Tailwind 和 shadcn CSS 变量 │ ├─ pk/page.tsx # PK 比赛页面 │ ├─ admin/page.tsx # 后台管理页面 │ └─ api/ # SQLite CRUD API ├─ components/ui/ # shadcn 风格基础组件 ├─ data/english-pk.sqlite # SQLite 数据库,运行时自动创建 ├─ lib/db.ts # SQLite 建表、种子数据和 CRUD ├─ lib/utils.ts # cn 工具函数 ├─ public/audio/ # Edge TTS 生成的单词音频 ├─ components.json # shadcn 配置 ├─ tailwind.config.ts # Tailwind 配置 ├─ package.json # Next.js 开发脚本 ├─ frontend/ # 旧 HTML/Tauri 前端入口,历史保留 └─ src-tauri/ # 旧 Tauri 桌面壳,历史保留 ``` ## 路由说明 ### `/pk` 课堂比赛页面。主要功能: - 进入页面后先选择年级和班级类型。 - 班级类型从 SQLite 数据库读取,只展示已启用项。 - 只从当前年级、班级类型且已启用的词库中出题。 - 朗读时优先播放数据库里的本地音频;没有音频时会尝试生成并入库,失败后回退到系统朗读。 - 红队、蓝队轮流答题。 - 每题 4 个选项。 - 答对加 10 分,答错不扣分。 - 使用浏览器语音能力朗读英文单词。 - 使用浏览器音频能力播放答对、答错提示音。 - 页面为左右布局,大屏左右分栏,小屏自动堆叠。 ### `/admin` 后台管理页面。当前已接入 SQLite 持久化,包含: - 词库总览。 - 启用词库数量统计。 - 年级、班级类型筛选和题库英语搜索。 - 词库新增、编辑、删除、中文、图标/图片配置和启用/停用。 - 可点击生成语音,服务端通过 Edge TTS 生成 mp3 并写回数据库。 - 可一键生成当前筛选词库的语音,并显示生成进度、成功数和失败数。 - 添加和编辑词库使用弹窗;编辑年级、班型或英语后会清空旧语音,需要重新生成。 - 设置使用弹窗,包含 Edge TTS 声音下拉、语速、试听、加分细则和课堂规则,并持久化到 SQLite。 - 操作反馈使用 Sonner toast。 - 班级类型新增、编辑、删除和启用/停用。 - 答对得分、自动朗读等课堂规则控件。 - 跳转 PK 页面入口。 ## 本地开发 安装依赖: ```bash npm install ``` 启动开发服务: ```bash npm run dev ``` 访问页面: ```text http://localhost:3000/pk http://localhost:3000/admin ``` 生产构建: ```bash npm run build ``` 启动生产服务: ```bash npm run start ``` ## SQLite 数据库 数据库文件会在首次访问 API 时自动创建: ```text data/english-pk.sqlite ``` 数据库包含两张表: ```text class_types - id - name - enabled - created_at - updated_at words - id - grade - class_type_id - english - chinese - image - audio - enabled - created_at - updated_at settings - key - value - updated_at ``` 首次初始化会写入默认班级类型: - 基础班 - 提高班 - 复习班 也会写入原始 12 个中班 XYZ 单词。 `words.image` 可填写 emoji、站内图片路径、外部图片地址或 `data:image/...`: ```text 🍎 /images/apple.png https://example.com/apple.png data:image/png;base64,... ``` `words.audio` 保存生成后的音频路径,例如: ```text /audio/1-box.mp3 ``` 后台管理页点击某个词库项的麦克风按钮,会调用 Edge TTS 生成 mp3 到 `public/audio/`,然后把音频路径写入 SQLite。PK 页面朗读时会优先播放该音频;没有音频时才使用浏览器系统朗读作为兜底。 ## API ```text GET /api/words POST /api/words PUT /api/words/:id DELETE /api/words/:id POST /api/words/:id/generate-audio GET /api/class-types POST /api/class-types PUT /api/class-types/:id DELETE /api/class-types/:id GET /api/settings PUT /api/settings ``` ## 后续开发建议 - 增加课堂成绩记录和历史对局统计。 - 增加删除确认弹窗,避免误删。 - 引入本地音频文件,保证离线环境下发音稳定。