Files
englishPk/DEVELOPMENT.md
2026-06-29 23:56:38 +08:00

199 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
- SQLiteNode `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
```
## 后续开发建议
- 增加课堂成绩记录和历史对局统计。
- 增加删除确认弹窗,避免误删。
- 引入本地音频文件,保证离线环境下发音稳定。