feat: add book detail, notes detail, recommendation page and MySQL schema

新增功能:
- 书籍详情弹窗:点击书架书籍展示详细信息(书名、作者、出版社、ISBN、字数、评分、简介、阅读进度),数据实时从微信读书 API 获取并入库
- 笔记详情弹窗:点击有笔记的书展示划线和想法/点评,按章节分组展示,数据实时获取并入库
- 推荐页面:个性化推荐(为你推荐)+ 关键词搜索书籍,数据从微信读书 API 获取并入库
- 修复 Flask 中文 URL 参数编码问题

后端新增 API:
- GET /api/book/detail?book_id=xxx — 书籍详情
- GET /api/book/notes?book_id=xxx — 笔记详情(划线+想法)
- GET /api/recommend?maxIdx=0 — 个性化推荐
- GET /api/search?keyword=xxx — 搜索书籍

数据库新增表:
- book_details, book_progress, book_highlights, book_chapters
- book_reviews, recommended_books, search_results

MySQL 版本建表语句 schema_mysql.sql:
- 18 张表的完整 DDL,含索引、字符集 utf8mb4、字段注释
- 适用于后续从 SQLite 迁移至 MySQL
This commit is contained in:
admin committed 2026-07-17 10:07:05 +08:00
1 parent 1e9c537b86
commit ebfa3a1852
6 files changed
+1660 -4

No files matched your search

+120
View File
@@ -180,6 +180,126 @@ def init_db(db_path):
)
""")
# ===== 按需获取的详细数据表 =====
# 书籍详细信息(来自 /book/info)
c.execute("""
CREATE TABLE IF NOT EXISTS book_details (
book_id TEXT PRIMARY KEY,
title TEXT,
author TEXT,
translator TEXT,
cover TEXT,
intro TEXT,
category TEXT,
publisher TEXT,
publish_time TEXT,
isbn TEXT,
word_count INTEGER,
new_rating REAL,
new_rating_count INTEGER,
fetched_at INTEGER
)
""")
# 阅读进度(来自 /book/getprogress)
c.execute("""
CREATE TABLE IF NOT EXISTS book_progress (
book_id TEXT PRIMARY KEY,
progress INTEGER,
chapter_uid INTEGER,
chapter_offset INTEGER,
update_time INTEGER,
record_reading_time INTEGER,
finish_time INTEGER,
is_start_reading INTEGER,
fetched_at INTEGER
)
""")
# 划线内容(来自 /book/bookmarklist)
c.execute("""
CREATE TABLE IF NOT EXISTS book_highlights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
book_id TEXT,
bookmark_id TEXT,
chapter_uid INTEGER,
mark_text TEXT,
create_time INTEGER,
type INTEGER,
range_text TEXT,
color_style INTEGER,
fetched_at INTEGER
)
""")
# 章节信息(来自 /book/bookmarklist 的 chapters)
c.execute("""
CREATE TABLE IF NOT EXISTS book_chapters (
id INTEGER PRIMARY KEY AUTOINCREMENT,
book_id TEXT,
chapter_uid INTEGER,
chapter_idx INTEGER,
title TEXT,
UNIQUE(book_id, chapter_uid)
)
""")
# 个人想法/点评(来自 /review/list/mine)
c.execute("""
CREATE TABLE IF NOT EXISTS book_reviews (
id INTEGER PRIMARY KEY AUTOINCREMENT,
book_id TEXT,
review_id TEXT,
content TEXT,
create_time INTEGER,
star INTEGER,
chapter_name TEXT,
is_finish INTEGER,
fetched_at INTEGER
)
""")
# 推荐书籍(来自 /book/recommend)
c.execute("""
CREATE TABLE IF NOT EXISTS recommended_books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
book_id TEXT,
title TEXT,
author TEXT,
cover TEXT,
intro TEXT,
category TEXT,
reason TEXT,
reading_count INTEGER,
new_rating REAL,
new_rating_count INTEGER,
rating_title TEXT,
fetched_at INTEGER
)
""")
# 搜索结果(来自 /store/search)
c.execute("""
CREATE TABLE IF NOT EXISTS search_results (
id INTEGER PRIMARY KEY AUTOINCREMENT,
keyword TEXT,
book_id TEXT,
title TEXT,
author TEXT,
cover TEXT,
intro TEXT,
publisher TEXT,
category TEXT,
reading_count INTEGER,
new_rating REAL,
new_rating_count INTEGER,
rating_title TEXT,
search_idx INTEGER,
fetched_at INTEGER
)
""")
conn.commit()
return conn