2026-06-04 14:30:53 -07:00
|
|
|
|
# WordLoop 单词循环记忆系统
|
|
|
|
|
|
|
|
|
|
|
|
输入中文/英文 → 自动翻译 → 加入个人单词库 → 每日测验 → 根据答题情况反复记忆 → 达标后进入已掌握词库。
|
|
|
|
|
|
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
|
|
|
|
|
|
|
- **前端**: Vue 3 + Vite + TypeScript
|
|
|
|
|
|
- **后端**: Python FastAPI
|
|
|
|
|
|
- **数据库**: MySQL(本地 `wordloop` 库)
|
|
|
|
|
|
|
|
|
|
|
|
## 本地启动
|
|
|
|
|
|
|
|
|
|
|
|
端口:**前端 18003** · **后端 18004**
|
|
|
|
|
|
|
|
|
|
|
|
**推荐** 在项目根目录一条命令同时启动:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
chmod +x start.sh # 首次
|
|
|
|
|
|
./start.sh # 或 ./start.sh all
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
也可开两个终端分别执行 `./start.sh backend` / `./start.sh frontend`,或手动进入子目录:
|
|
|
|
|
|
|
|
|
|
|
|
### MySQL
|
|
|
|
|
|
|
|
|
|
|
|
本地需已安装 MySQL,并创建库(账号示例与默认 `.env` 一致):
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
mysql -h localhost -u boot -p888888 -e "CREATE DATABASE IF NOT EXISTS wordloop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
连接参数在 `backend/.env`(可从 `backend/.env.example` 复制):
|
|
|
|
|
|
|
|
|
|
|
|
| 变量 | 默认值 |
|
|
|
|
|
|
|------|--------|
|
|
|
|
|
|
| `MYSQL_HOST` | localhost |
|
|
|
|
|
|
| `MYSQL_PORT` | 3306 |
|
|
|
|
|
|
| `MYSQL_USER` | boot |
|
|
|
|
|
|
| `MYSQL_PASSWORD` | 888888 |
|
|
|
|
|
|
| `MYSQL_DATABASE` | wordloop |
|
|
|
|
|
|
|
|
|
|
|
|
首次启动后端时会自动建表。
|
|
|
|
|
|
|
|
|
|
|
|
### 导入离线翻译词典
|
|
|
|
|
|
|
|
|
|
|
|
后端启动后,将内置词条(或自定义词库)导入 `dictionary_entries` 表:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd backend
|
|
|
|
|
|
source venv/bin/activate # Windows: venv\Scripts\activate
|
|
|
|
|
|
|
|
|
|
|
|
# 导入默认 seed 词库(36 条)
|
|
|
|
|
|
python -m scripts.import_dictionary
|
|
|
|
|
|
|
|
|
|
|
|
# 导入自定义 JSON / CSV
|
|
|
|
|
|
python -m scripts.import_dictionary --file /path/to/your_dict.json --source ecdict
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**JSON 格式**(数组或 `{ "entries": [...] }`):
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
[
|
|
|
|
|
|
{
|
|
|
|
|
|
"lemma_en": "apple",
|
|
|
|
|
|
"zh": "苹果",
|
|
|
|
|
|
"phonetic": "/ˈæpəl/",
|
|
|
|
|
|
"example_en": "I eat an apple every day.",
|
|
|
|
|
|
"example_cn": "我每天吃一个苹果。"
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**CSV 列名**:`lemma_en`, `zh`, `phonetic`, `example_en`, `example_cn`(也支持 `en` / `cn` 别名)。
|
|
|
|
|
|
|
|
|
|
|
|
翻译 API 会优先查该表;未命中时返回占位结果,暂不接入外部 API。
|
|
|
|
|
|
|
|
|
|
|
|
### 从线上导入 ECDICT 词库(推荐)
|
|
|
|
|
|
|
|
|
|
|
|
自动从 GitHub 下载 [ECDICT](https://github.com/skywind3000/ECDICT) SQLite 词库(约 340 万词条)并写入数据库:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd backend
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# 常用词(默认,约 83 万条,含 transformer 等)
|
|
|
|
|
|
python -m scripts.import_dictionary_online
|
|
|
|
|
|
|
|
|
|
|
|
# 核心词(Collins / 牛津,约 1.4 万条,速度快)
|
|
|
|
|
|
python -m scripts.import_dictionary_online --preset core
|
|
|
|
|
|
|
|
|
|
|
|
# 全量(约 338 万条,耗时长、占空间大)
|
|
|
|
|
|
python -m scripts.import_dictionary_online --preset full
|
|
|
|
|
|
|
|
|
|
|
|
# 已有本地 cache 时跳过下载
|
|
|
|
|
|
python -m scripts.import_dictionary_online --skip-download
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
首次运行会下载约 207MB 压缩包并解压到 `backend/data/cache/`(已加入 `.gitignore`)。
|
|
|
|
|
|
|
|
|
|
|
|
### 后端
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd backend
|
|
|
|
|
|
python -m venv venv
|
|
|
|
|
|
|
|
|
|
|
|
# macOS / Linux
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# Windows
|
|
|
|
|
|
venv\Scripts\activate
|
|
|
|
|
|
|
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
cp .env.example .env # 首次,按需改密码
|
|
|
|
|
|
uvicorn main:app --reload --host 0.0.0.0 --port 18004
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
API 文档:http://localhost:18004/docs
|
|
|
|
|
|
|
|
|
|
|
|
### 前端
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd frontend
|
|
|
|
|
|
npm install
|
|
|
|
|
|
npm run dev
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
浏览器访问:http://localhost:18003
|
|
|
|
|
|
|
2026-06-06 21:09:27 +08:00
|
|
|
|
### 词书(沪版 / 商务)
|
|
|
|
|
|
|
|
|
|
|
|
词书目录为全局数据,与「日常积累」练习**完全分开**(独立统计、记忆曲线、选题池)。
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd backend
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
pip install openpyxl # 首次从 GitHub 拉取 xlsx 时需要
|
|
|
|
|
|
|
|
|
|
|
|
# 从 lilinji/English 下载沪版牛津 + BEC 词汇,生成 JSON 并导入库
|
|
|
|
|
|
python -m scripts.fetch_hujiao_books --import-db
|
|
|
|
|
|
|
|
|
|
|
|
# 若已有 backend/data/books/*.json,仅导入数据库:
|
|
|
|
|
|
python -m scripts.import_word_books
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
生产部署后 `deploy/install-production.sh` 会自动执行 `import_word_books`(需随代码发布 `data/books/*.json`)。
|
|
|
|
|
|
|
|
|
|
|
|
内置词书:小学 `hujiao-primary-1`…`5`、初中 `hujiao-junior-6`…`9`、高中 `hujiao-senior-1`…`3`(高一至高三)、`business-daily`(日常商务)。首页可切换「日常积累 / 词书练习」;词书在「词书设置」页下拉选择并调整每日练习量。
|
|
|
|
|
|
|
2026-06-04 14:30:53 -07:00
|
|
|
|
## 默认测试账号
|
|
|
|
|
|
|
|
|
|
|
|
注册后即可使用,或自行注册新账号。
|
|
|
|
|
|
|
|
|
|
|
|
## 线上部署(105 服务器 · w.tkmind.cn)
|
|
|
|
|
|
|
|
|
|
|
|
生产目录:**`/root/wordloop`**,服务器 **`120.26.184.105`**,RDS MySQL。
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
chmod +x deploy/publish.sh deploy/install-production.sh
|
|
|
|
|
|
./deploy/publish.sh # 默认 root@120.26.184.105
|
|
|
|
|
|
# 数据库等可写在 deploy/secrets.env(见 secrets.env.example)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Cloudflare DNS:子域 **`w`** → A 记录 **`120.26.184.105`**(橙云代理)。Tunnel 方案见 **[deploy/DEPLOY.md](deploy/DEPLOY.md)**。
|
|
|
|
|
|
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
wordloop/
|
|
|
|
|
|
├── backend/ # FastAPI 后端
|
|
|
|
|
|
├── frontend/ # Vue 3 前端
|
|
|
|
|
|
├── deploy/ # Nginx、Cloudflare Tunnel、部署说明
|
|
|
|
|
|
└── README.md
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 核心功能
|
|
|
|
|
|
|
|
|
|
|
|
- 用户注册 / 登录(JWT)
|
|
|
|
|
|
- 中英互译(本地词典 MVP,可扩展 AI)
|
2026-06-04 14:57:39 -07:00
|
|
|
|
- 个人单词库(新词 / 学习中 / 已掌握 / 易错词,记录进入词库时间)
|
|
|
|
|
|
- 记忆曲线与 Obsidian 式单词关系力导向图
|
2026-06-04 14:30:53 -07:00
|
|
|
|
- 每日选择题训练
|
2026-06-04 14:57:39 -07:00
|
|
|
|
- 拼写练习(中文释义 + 音标,输入英文单词)
|
2026-06-04 18:11:49 -07:00
|
|
|
|
- 记忆对话(Q/K/V token 引导推导英文,显示中文释义与记忆保持,计入练习记录)
|
|
|
|
|
|
- Transformer 记忆预测(轻量序列模型 + 遗忘曲线,见 [backend/docs/MEMORY_TRANSFORMER.md](backend/docs/MEMORY_TRANSFORMER.md))
|
2026-06-04 14:30:53 -07:00
|
|
|
|
- 掌握规则与复习间隔
|
|
|
|
|
|
- 学习统计与设置
|