File size: 7,640 Bytes
b611bf8
 
 
 
 
 
 
 
 
 
75d3623
 
e74eb63
75d3623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e74eb63
75d3623
 
 
e74eb63
75d3623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e74eb63
75d3623
 
e74eb63
75d3623
 
 
 
 
 
e74eb63
75d3623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e74eb63
75d3623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94dbdd7
75d3623
743953f
75d3623
 
 
 
743953f
75d3623
 
 
 
743953f
75d3623
 
 
 
743953f
75d3623
 
 
 
743953f
75d3623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
743953f
 
 
75d3623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e74eb63
75d3623
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e74eb63
 
75d3623
 
 
 
 
e74eb63
75d3623
 
 
 
 
 
e74eb63
75d3623
 
 
 
 
743953f
 
 
75d3623
 
 
 
 
 
 
 
 
743953f
 
 
75d3623
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
---
title: 交互式学习平台
emoji: 📚
colorFrom: blue
colorTo: purple
sdk: docker
app_port: 7860
pinned: false
---

# 交互式英语学习平台

基于 data 数据结构的交互式英语学习应用,支持点读、音频播放、翻译显示等功能。

## 📋 功能特性

### 书籍目录页面
- 📚 显示所有可用教材
- 🔍 搜索教材名称和分类
- 📊 显示统计信息(教材数、页面数、内容片段数等)
- 🎨 精美的卡片式布局

### 阅读页面
- 📖 交互式点读功能
- 🔊 音频播放控制
- 🌐 中英文翻译切换
- 📑 章节目录导航
- 🔖 书签功能
- 🔍 全文搜索
- ⚙️ 个性化设置(播放速度、自动翻译等)
- ⌨️ 键盘快捷键支持

## 🚀 快速开始

### 1. 环境要求

- Python 3.12
- SQLite 3
- 现代浏览器(Chrome、Firefox、Safari、Edge)

### 2. 安装依赖

```bash
pip install flask flask-cors
```

### 3. 准备数据`data` 目录放置在项目根目录下:

```
/data/zhangl/code/hf/point/
├── data/          # 教材数据目录
│   ├── 168_一年级上册/
│   │   ├── book_info.json
│   │   ├── pages.json
│   │   ├── catalog.json
│   │   ├── images/
│   │   └── audios/
│   ├── 169_二年级上册/
│   └── ...
├── app.py
├── import_book_data.py
└── ...
```

### 4. 导入数据到数据库

```bash
# 首次导入(会自动创建数据库)
python3 import_book_data.py data

# 重新导入所有数据(删除现有数据库)
python3 import_book_data.py data --recreate

# 仅验证数据
python3 import_book_data.py --verify-only
```

导入选项:
- `data_dir`: 数据目录路径(默认:data)
- `--db`: 数据库文件路径(默认:books.db)
- `--schema`: Schema 文件路径(默认:db_schema.sql)
- `--recreate`: 删除现有数据库并重新创建
- `--verify-only`: 仅验证数据,不导入

### 5. 启动应用

```bash
python3 app.py
```

应用将在 `http://0.0.0.0:7860` 启动。

访问地址:
- 书籍目录:`http://localhost:7860/`
- 阅读页面:`http://localhost:7860/reader?book_id=168`

## 📁 项目结构

```
/data/zhangl/code/hf/point/
├── data/          # 教材数据目录
├── static/
│   ├── css/
│   │   ├── style.css        # 主样式文件
│   │   ├── inter.css        # Inter 字体
│   │   └── all.min.css      # Font Awesome 图标
│   └── js/
│       ├── catalog.js       # 书籍目录页面逻辑
│       └── reader.js        # 阅读页面逻辑
├── app.py                   # Flask 应用主文件
├── db_manager.py            # 数据库管理器
├── import_book_data.py      # 数据导入脚本
├── db_schema.sql            # 数据库结构定义
├── index.html               # 书籍目录页面
├── reader.html              # 阅读页面
├── books.db                 # SQLite 数据库(自动生成)
└── README.md
```

## 🗄️ 数据库结构

### books 表
存储书籍的基本信息:
- `market_book_id`: 书籍ID(主键)
- `market_book_name`: 书籍名称
- `market_book_cover`: 封面图片路径
- `max_page`: 最大页码
- `grade_id`: 年级ID
- `reel_id`: 学期ID(1=上册,2=下册)
- 等等...

### pages 表
存储页面信息:
- `page_id`: 页面ID(主键)
- `book_id`: 所属书籍ID
- `page_number`: 页码
- `origin_img_url`: 原始图片路径
- `encrypt_img_url`: 加密图片路径

### pieces 表
存储页面内容片段:
- `piece_id`: 片段ID(主键)
- `page_id`: 所属页面ID
- `original`: 原文(英文)
- `translation`: 译文(中文)
- `origin_sound_url`: 音频路径
- `duration`: 音频时长
- `coordinate_x/y/width/height`: 坐标信息
- 等等...

### catalogs 表
存储书籍目录结构:
- `catalog_id`: 目录项ID(主键)
- `book_id`: 所属书籍ID
- `catalog_name`: 目录名称(英文)
- `catalog_name_cn`: 目录名称(中文)
- `start_page/end_page`: 起止页码
- `parent_id`: 父级目录ID(支持树形结构)

### pieces_fts 表
全文搜索索引(FTS5):
- 支持在 `original` 和 `translation` 字段中快速搜索

## 🔌 API 接口

### 书籍相关

#### 获取所有书籍列表
```
GET /api/v2/books?grade_id=40
```

#### 获取书籍详情
```
GET /api/v2/books/{book_id}
```

#### 获取书籍页面列表
```
GET /api/v2/books/{book_id}/pages
```

#### 获取书籍目录结构
```
GET /api/v2/books/{book_id}/catalog
```

#### 获取页面内容
```
GET /api/v2/books/{book_id}/pages/{page_number}
```

### 搜索相关

#### 在书籍中搜索
```
GET /api/v2/books/{book_id}/search?keyword=hello&limit=20
```

#### 全局搜索
```
GET /api/v2/search?keyword=hello&limit=50
```

### 统计相关

#### 获取书籍统计信息
```
GET /api/v2/books/{book_id}/statistics
```

#### 获取整体统计信息
```
GET /api/v2/statistics
```

## ⌨️ 键盘快捷键

在阅读页面中:
- `←` / `→`: 上一页 / 下一页
- `Space`: 播放/暂停音频
- `T`: 切换翻译显示
- `I`: 切换交互区域显示
- `Esc`: 关闭弹出面板

## 🎨 功能亮点

1. **按需加载**: 页面内容按需加载,提高性能
2. **全文搜索**: 使用 SQLite FTS5 实现高效全文搜索
3. **响应式设计**: 自适应不同屏幕尺寸
4. **交互式点读**: 点击文本片段播放对应音频
5. **坐标系统**: 使用相对坐标,适配不同分辨率
6. **目录导航**: 支持章节目录快速跳转
7. **本地资源**: 支持从本地 data 目录加载资源

## 🔧 开发调试

### 启用调试模式

```bash
export FLASK_DEBUG=True
python3 app.py
```

### 查看日志

应用日志存储在 `logs/app.log`

### 数据库操作

使用 `db_manager.py` 提供的数据库管理器:

```python
from db_manager import get_db_instance

db = get_db_instance('books.db')

# 获取所有书籍
books = db.get_all_books()

# 搜索内容
results = db.search_content(book_id=168, keyword='hello', limit=20)

# 获取统计信息
stats = db.get_overall_statistics()
```

## 📝 数据格式说明

### 坐标系统
文本片段的坐标使用相对坐标(0-1范围):
```json
{
  "coordinate": {
    "x": 0.0482,      // 左上角X坐标(相对于图片宽度)
    "y": 0.0357,      // 左上角Y坐标(相对于图片高度)
    "width": 0.3195,  // 宽度(相对于图片宽度)
    "height": 0.0982  // 高度(相对于图片高度)
  }
}
```

### 资源路径
资源路径采用相对路径格式:
```
168_一年级上册/images/page_001.jpg
168_一年级上册/audios/page_002_piece_00.mp3
```

实际访问时会自动拼接为:
```
data/168_一年级上册/images/page_001.jpg
data/168_一年级上册/audios/page_002_piece_00.mp3
```

## 🐛 故障排除

### 数据库导入失败
- 检查 data 目录是否存在
- 确保每个书籍目录包含 book_info.json、pages.json
- 检查 db_schema.sql 文件是否存在

### 页面加载失败
- 检查数据库是否正确导入
- 查看浏览器控制台是否有错误
- 检查 data 目录下的资源文件是否完整

### 音频播放失败
- 检查音频文件路径是否正确
- 确保浏览器支持 MP3 格式
- 查看浏览器控制台错误信息

## 📄 许可证

本项目仅供学习和研究使用。

## 👥 贡献

欢迎提交 Issue 和 Pull Request。

## 📞 联系方式

如有问题或建议,请联系开发团队。

---

**版本**: v2.0.0  
**更新日期**: 2025-10-17  
**Python版本**: 3.12  
**数据库**: SQLite 3