From 5608562f0269f81903c87d218b3934e04c65ae46 Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 17 Jul 2026 14:34:35 +0800 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20weread=20?= =?UTF-8?q?=E5=90=AF=E5=81=9C=E5=91=BD=E4=BB=A4=20&=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20macOS=20SSL=20=E8=AF=81=E4=B9=A6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 weread CLI 脚本,支持 weread start/stop [port] 一键管理服务 - app.py 端口改为从环境变量 WEREAD_PORT 读取,默认 8080 - 修复 macOS Python urllib 调用微信读书 API 时 SSL 证书验证失败问题(引入 certifi) --- app.py | 14 ++++++-- weread | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 3 deletions(-) create mode 100755 weread diff --git a/app.py b/app.py index d780e04..594216f 100644 --- a/app.py +++ b/app.py @@ -18,6 +18,7 @@ import json import os +import ssl import subprocess import time import urllib.request @@ -25,6 +26,12 @@ from datetime import datetime from functools import wraps import pymysql + +try: + import certifi + _ssl_context = ssl.create_default_context(cafile=certifi.where()) +except ImportError: + _ssl_context = ssl.create_default_context() from flask import Flask, jsonify, render_template, request # ====================================================================== @@ -158,7 +165,7 @@ def weread_api_call(api_name, **kwargs): }, method="POST", ) - with urllib.request.urlopen(req, timeout=30) as resp: + with urllib.request.urlopen(req, timeout=30, context=_ssl_context) as resp: return json.loads(resp.read().decode("utf-8")) @@ -1270,5 +1277,6 @@ if __name__ == "__main__": else: print(f"[信息] {msg}") - # 启动 Flask 服务,监听 8080 端口 - app.run(host="0.0.0.0", port=8080, debug=False) + # 启动 Flask 服务,端口从环境变量 WEREAD_PORT 读取,默认 8080 + port = int(os.environ.get("WEREAD_PORT", 8080)) + app.run(host="0.0.0.0", port=port, debug=False) diff --git a/weread b/weread new file mode 100755 index 0000000..6fbb375 --- /dev/null +++ b/weread @@ -0,0 +1,102 @@ +#!/bin/bash +# weread - 微信读书数据看板 服务管理命令 +# 用法: +# weread start [port] 启动服务(默认端口 8080) +# weread stop [port] 停止服务(默认端口 8080) + +PROJECT_DIR="/Users/hwj/Codes/MyProjects/WeReadBoard" +PID_FILE="$PROJECT_DIR/.server.pid" +LOG_FILE="/tmp/weread_server.log" +DEFAULT_PORT=8080 + +get_port() { + echo "${1:-$DEFAULT_PORT}" +} + +get_pid() { + local port="$1" + if [ -f "$PID_FILE" ]; then + local saved_port + saved_port=$(sed -n '2p' "$PID_FILE" 2>/dev/null) + local pid + pid=$(head -1 "$PID_FILE" 2>/dev/null) + if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then + echo "$pid" + return + fi + fi + lsof -i :"$port" -t 2>/dev/null | head -1 +} + +is_running() { + local port="$1" + if [ -n "$(get_pid "$port")" ]; then + return 0 + fi + return 1 +} + +cmd_start() { + local port + port=$(get_port "$1") + + if is_running "$port"; then + echo "❌ 服务已在运行 (PID: $(get_pid "$port"), 端口: $port)" + exit 1 + fi + + echo "启动服务(端口: $port)..." + WEREAD_PORT="$port" nohup python3 "$PROJECT_DIR/app.py" > "$LOG_FILE" 2>&1 & + local pid=$! + printf '%s\n%s\n' "$pid" "$port" > "$PID_FILE" + sleep 2 + + if kill -0 "$pid" 2>/dev/null; then + echo "✅ 服务已启动" + echo " PID: $pid" + echo " 端口: $port" + echo " 访问: http://127.0.0.1:$port" + echo " 日志: $LOG_FILE" + else + echo "❌ 启动失败,请查看日志: $LOG_FILE" + cat "$LOG_FILE" 2>/dev/null + rm -f "$PID_FILE" + exit 1 + fi +} + +cmd_stop() { + local port + port=$(get_port "$1") + + if ! is_running "$port"; then + echo "服务未运行(端口: $port)" + exit 0 + fi + + local pid + pid=$(get_pid "$port") + echo "停止服务 (PID: $pid, 端口: $port)..." + kill "$pid" 2>/dev/null + sleep 1 + + if kill -0 "$pid" 2>/dev/null; then + kill -9 "$pid" 2>/dev/null + fi + + rm -f "$PID_FILE" + echo "✅ 已停止" +} + +usage() { + echo "用法:" + echo " weread start [port] 启动服务(默认端口 8080)" + echo " weread stop [port] 停止服务(默认端口 8080)" + exit 1 +} + +case "${1}" in + start) cmd_start "$2" ;; + stop) cmd_stop "$2" ;; + *) usage ;; +esac From 3d5a40211765baa8b9ee8d8b2d72977c12ed4bce Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 17 Jul 2026 15:30:48 +0800 Subject: [PATCH 02/16] =?UTF-8?q?fix(button):=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E9=AB=98=E5=BA=A6=E6=8A=96=E5=8A=A8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 分析发现字符 ↻ 在某些字体下被当作大尺寸字符导致换行 - 修复方案将按钮拆分为图标和文字两层结构 - 使用 inline-flex 布局配合固定高度防止高度变化 - 替换不稳定字符 ↻ 为更稳定的 ⟳ (U+27F3) - 添加 flex-shrink:0 防止被父容器压缩 - 通过独立选择器控制文字更新保留图标结构 --- .workbuddy/memory/2026-07-17.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.workbuddy/memory/2026-07-17.md b/.workbuddy/memory/2026-07-17.md index 4a236ce..56faf0b 100644 --- a/.workbuddy/memory/2026-07-17.md +++ b/.workbuddy/memory/2026-07-17.md @@ -143,3 +143,16 @@ - 原因:Flask 开发服务器缓存静态文件,修改后需重启服务才能生效 - 解决:pkill + 重启 app.py - 提示用户浏览器也要 Cmd+Shift+R 强制刷新清除缓存 + +## 13:27 按钮高度抖动根因:↻ 字符渲染异常 + width 限制 + +- 截图分析:按钮变成竖长方形,"⟳"和"同步中..."分两行显示 +- 根因:字符 ↻ (U+21BB) 在某些字体下被当成大尺寸字符 + - 配合 width:120px,文字强制换行成两行 + - 高度从 36px 暴涨到 150px+ +- 修复方案: + - HTML: 拆成 + 两层结构 + - CSS: display:inline-flex + align-items:center + 固定 height:36px + - 图标字符: ↻ → ⟳ (U+27F3),更稳定 + - JS: 通过 .btn-text 选择器单独更新文字,保留图标 span +- 关键 CSS: flex-shrink:0 防止被 flex 父容器压缩 From 92a48d14cdf8342a35a6ecb644be50d2243d1729 Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 17 Jul 2026 22:11:27 +0800 Subject: [PATCH 03/16] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E8=AF=BB=E5=8F=96=E5=B7=A5=E5=85=B7=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BB=8E=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E5=92=8C?= =?UTF-8?q?=20.env=20=E6=96=87=E4=BB=B6=E5=8A=A0=E8=BD=BD=20WEREAD=5FAPI?= =?UTF-8?q?=5FKEY=20fix:=20=E4=BF=AE=E5=A4=8D=E5=90=AF=E5=8A=A8=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E4=B8=AD=E7=9A=84=20Python=20=E8=A7=A3=E9=87=8A?= =?UTF-8?q?=E5=99=A8=E8=B7=AF=E5=BE=84=E8=AF=86=E5=88=AB=20style:=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=B7=E5=BC=8F=E4=BB=A5=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E6=9C=80=E5=B0=8F=E5=AE=BD=E5=BA=A6=E5=92=8C?= =?UTF-8?q?=E7=81=B5=E6=B4=BB=E5=B8=83=E5=B1=80=20docs:=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=9C=80=E7=BB=88=E6=96=87=E6=A1=A3?= =?UTF-8?q?=EF=BC=8C=E6=95=B4=E5=90=88=E5=90=84=E7=B1=BB=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=8E=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + app.py | 22 +-- config_utils.py | 118 ++++++++++++++++ docs/PROJECT_FINAL_DOC.md | 286 ++++++++++++++++++++++++++++++++++++++ fetch_data.py | 13 +- requirements.txt | 1 + start_server.sh | 15 +- static/css/style.css | 18 ++- static/js/app.js | 4 +- 9 files changed, 461 insertions(+), 20 deletions(-) create mode 100644 config_utils.py create mode 100644 docs/PROJECT_FINAL_DOC.md diff --git a/.gitignore b/.gitignore index 7363bf8..2827a81 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,7 @@ Thumbs.db # Env .env .server.pid + +# Tool artifacts +.qoder/ +.workbuddy/ diff --git a/app.py b/app.py index 594216f..6d30ba4 100644 --- a/app.py +++ b/app.py @@ -20,6 +20,7 @@ import json import os import ssl import subprocess +import sys import time import urllib.request from datetime import datetime @@ -27,6 +28,8 @@ from functools import wraps import pymysql +from config_utils import get_env_value + try: import certifi _ssl_context = ssl.create_default_context(cafile=certifi.where()) @@ -56,7 +59,6 @@ MYSQL_CONFIG = { # 微信读书 API 配置 # ====================================================================== WEREAD_API_URL = "https://i.weread.qq.com/api/agent/gateway" -WEREAD_API_KEY = os.environ.get("WEREAD_API_KEY", "") WEREAD_SKILL_VERSION = "1.0.4" @@ -154,13 +156,17 @@ def weread_api_call(api_name, **kwargs): Raises: Exception: API 调用失败时抛出异常 """ + api_key = get_env_value("WEREAD_API_KEY", "") + if not api_key: + raise RuntimeError("WEREAD_API_KEY 未设置,请检查当前终端环境、项目 .env 或 ~/.zshrc") + body = {"api_name": api_name, "skill_version": WEREAD_SKILL_VERSION} body.update(kwargs) req = urllib.request.Request( WEREAD_API_URL, data=json.dumps(body).encode("utf-8"), headers={ - "Authorization": f"Bearer {WEREAD_API_KEY}", + "Authorization": f"Bearer {api_key}", "Content-Type": "application/json", }, method="POST", @@ -1199,14 +1205,14 @@ def api_search(conn): def sync_data(): """运行 fetch_data.py + migrate_to_mysql.py,全量同步数据""" project_dir = os.path.dirname(os.path.abspath(__file__)) - python_bin = os.path.join( - os.path.expanduser("~"), - ".workbuddy/binaries/python/envs/default/bin/python", - ) + python_bin = sys.executable or "python3" env = os.environ.copy() - env["WEREAD_API_KEY"] = env.get("WEREAD_API_KEY", "") + env["WEREAD_API_KEY"] = get_env_value("WEREAD_API_KEY", "") if not env["WEREAD_API_KEY"]: - return jsonify({"ok": False, "error": "WEREAD_API_KEY 未设置"}), 500 + return jsonify({ + "ok": False, + "error": "WEREAD_API_KEY 未设置,请检查当前终端环境、项目 .env 或 ~/.zshrc", + }), 500 results = {"steps": []} try: diff --git a/config_utils.py b/config_utils.py new file mode 100644 index 0000000..9eac5fa --- /dev/null +++ b/config_utils.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +""" +项目配置读取工具。 + +读取顺序: +1. 当前进程环境变量 +2. 项目根目录下的 .env / .env.local +3. 用户常见 shell 配置文件中的 export 语句 +""" + +from pathlib import Path +import os + + +PROJECT_DIR = Path(__file__).resolve().parent +ENV_FILE_NAMES = (".env", ".env.local") +SHELL_RC_FILES = ( + Path("~/.zshrc").expanduser(), + Path("~/.zprofile").expanduser(), + Path("~/.zlogin").expanduser(), + Path("~/.bash_profile").expanduser(), + Path("~/.bashrc").expanduser(), + Path("~/.profile").expanduser(), +) + + +def _parse_assignment(line): + """解析 KEY=VALUE 或 export KEY=VALUE 形式的配置行。""" + stripped = line.strip() + if not stripped or stripped.startswith("#"): + return None + + if stripped.startswith("export "): + stripped = stripped[7:].strip() + + if "=" not in stripped: + return None + + key, value = stripped.split("=", 1) + key = key.strip() + value = value.strip() + + if not key or any(ch.isspace() for ch in key): + return None + + if value[:1] in {"'", '"'} and value[-1:] == value[:1]: + value = value[1:-1] + else: + value = value.split(" #", 1)[0].strip() + + return key, value + + +def _read_var_from_file(file_path, var_name): + """从文本配置文件里读取指定变量,后出现的值优先。""" + try: + lines = file_path.read_text(encoding="utf-8").splitlines() + except OSError: + return "" + + result = "" + for line in lines: + parsed = _parse_assignment(line) + if not parsed: + continue + key, value = parsed + if key == var_name and value: + result = value + return result + + +def _project_env_files(project_dir=None): + base_dir = Path(project_dir) if project_dir else PROJECT_DIR + return [base_dir / name for name in ENV_FILE_NAMES] + + +def load_project_env(project_dir=None): + """把项目 .env 文件里的变量加载到当前进程环境中。""" + for file_path in _project_env_files(project_dir): + if not file_path.exists(): + continue + try: + lines = file_path.read_text(encoding="utf-8").splitlines() + except OSError: + continue + for line in lines: + parsed = _parse_assignment(line) + if not parsed: + continue + key, value = parsed + if key and value and key not in os.environ: + os.environ[key] = value + + +def get_env_value(var_name, default="", project_dir=None): + """按项目约定顺序读取配置值,并回填到当前进程环境。""" + value = os.environ.get(var_name, "") + if value: + return value + + load_project_env(project_dir) + value = os.environ.get(var_name, "") + if value: + return value + + for file_path in _project_env_files(project_dir): + value = _read_var_from_file(file_path, var_name) + if value: + os.environ[var_name] = value + return value + + for file_path in SHELL_RC_FILES: + value = _read_var_from_file(file_path, var_name) + if value: + os.environ[var_name] = value + return value + + return default diff --git a/docs/PROJECT_FINAL_DOC.md b/docs/PROJECT_FINAL_DOC.md new file mode 100644 index 0000000..9f6bad7 --- /dev/null +++ b/docs/PROJECT_FINAL_DOC.md @@ -0,0 +1,286 @@ +# 微信读书数据看板最终文档 + +本文档用于替代 `.qoder/` 与 `.workbuddy/` 中分散的工具生成文档,作为当前仓库内的单一最终说明。内容以仓库现状为准,吸收了工具文档中的架构说明、接口说明、数据库分组、部署信息和迭代记录,同时剔除了已经过期或仅对工具自身有意义的中间信息。 + +## 1. 文档与目录约定 + +- 本文件是 `.qoder/repowiki` 与 `.workbuddy/memory` 的合并结果,也是这两个目录的人工可维护替代品。 +- `.qoder/`、`.workbuddy/` 属于外部工具的中间产物,不参与 Git 管理。 +- 深度技术细节仍保留在仓库原有文档中: + - [TECHNICAL_DOC.md](/Users/kinghwj/Codes/WeReadBoard/docs/TECHNICAL_DOC.md) + - [METADATA_DOC.md](/Users/kinghwj/Codes/WeReadBoard/docs/METADATA_DOC.md) + +## 2. 项目定位 + +这是一个基于微信读书 Agent Gateway API 的个人阅读数据看板。系统将微信读书中的书架、阅读统计、笔记、推荐和搜索能力整合到一个本地运行的网站中,提供可视化图表、分页书架、笔记概览和按需详情查询。 + +当前实现采用: + +- 后端:Flask + PyMySQL +- 前端:原生 HTML / CSS / JavaScript + ECharts +- 缓存与采集:SQLite +- 在线查询数据源:MySQL +- 外部能力:微信读书 Agent Gateway API + +## 3. 当前仓库结构 + +核心文件与职责如下: + +- [app.py](/Users/kinghwj/Codes/WeReadBoard/app.py):Flask 后端服务,提供页面和 `/api/*` 接口。 +- [fetch_data.py](/Users/kinghwj/Codes/WeReadBoard/fetch_data.py):全量采集脚本,将微信读书数据写入 SQLite。 +- [migrate_to_mysql.py](/Users/kinghwj/Codes/WeReadBoard/migrate_to_mysql.py):将 SQLite 数据迁移到 MySQL。 +- [schema_mysql.sql](/Users/kinghwj/Codes/WeReadBoard/schema_mysql.sql):MySQL 31 张表建表语句。 +- [config_utils.py](/Users/kinghwj/Codes/WeReadBoard/config_utils.py):运行时配置读取工具。 +- [start_server.sh](/Users/kinghwj/Codes/WeReadBoard/start_server.sh):本地服务生命周期脚本。 +- [templates/index.html](/Users/kinghwj/Codes/WeReadBoard/templates/index.html):页面骨架。 +- [static/js/app.js](/Users/kinghwj/Codes/WeReadBoard/static/js/app.js):前端交互逻辑。 +- [static/css/style.css](/Users/kinghwj/Codes/WeReadBoard/static/css/style.css):主题、布局和组件样式。 + +## 4. 系统架构 + +系统采用“采集 -> 迁移 -> 展示 -> 按需回填”的模式: + +1. `fetch_data.py` 从微信读书 API 拉取全量数据,落入本地 `weread.db`。 +2. `migrate_to_mysql.py` 将 SQLite 中的数据按表迁移到 MySQL `weread_dashboard`。 +3. `app.py` 从 MySQL 读取基础数据,向前端提供 REST API。 +4. 部分详情型接口会在用户点击时再去调用微信读书 API,并把结果缓存回 MySQL。 +5. 前端点击“刷新”时会调用 `/api/sync`,串行执行全量采集与迁移。 + +## 5. 运行时配置 + +### 5.1 微信读书 API Key + +当前代码通过 [config_utils.py](/Users/kinghwj/Codes/WeReadBoard/config_utils.py) 读取 `WEREAD_API_KEY`,优先级如下: + +1. 当前进程环境变量 +2. 项目根目录 `.env` +3. 项目根目录 `.env.local` +4. 用户 shell 配置文件,如 `~/.zshrc`、`~/.zprofile`、`~/.bash_profile` + +这层逻辑的目的,是避免“终端里已经 export,但服务进程没有继承”导致的误报。 + +### 5.2 MySQL 配置 + +当前 MySQL 连接配置仍写在代码中,`app.py` 与 `migrate_to_mysql.py` 各维护一份: + +- host: `127.0.0.1` +- port: `3306` +- user: `root` +- password: `258963` +- database: `weread_dashboard` + +这部分目前能工作,但仍属于后续值得继续抽离的技术债。 + +### 5.3 端口与启动 + +- 默认端口:`8080` +- 可选环境变量:`WEREAD_PORT` +- 启动脚本使用当前机器上可用的 `python3` 或 `python` + +常用命令: + +```bash +pip install -r requirements.txt +python3 app.py +./start_server.sh daemon +./start_server.sh stop +./start_server.sh status +``` + +## 6. 主要功能 + +### 6.1 概览与图表 + +- 总阅读时长、阅读天数、书架数量、笔记总数 +- 年度阅读趋势 +- 24 小时时段分布 +- 偏好分类 +- 偏好作者 +- 阅读时长排行 + +### 6.2 书架 + +- 关键词搜索书名 / 作者 +- 分类筛选与父子分类树 +- 仅看已读完 +- 分页浏览 +- 一键刷新同步微信读书数据 + +### 6.3 笔记与想法 + +- 笔记本概览 +- 点击书籍查看按章节整理的划线、想法和点评 +- 想法详情页按类型筛选 + +### 6.4 发现能力 + +- 为你推荐 +- 搜索书籍 +- 推荐 / 搜索结果写回本地缓存 + +## 7. API 总览 + +当前后端接口主要分为四类: + +### 7.1 系统接口 + +- `GET /api/health`:数据库健康检查 +- `POST /api/sync`:执行全量采集与迁移 + +### 7.2 基础统计接口 + +- `GET /api/overview` +- `GET /api/yearly-trend` +- `GET /api/top-books` +- `GET /api/categories` +- `GET /api/authors` +- `GET /api/time-distribution` +- `GET /api/read-stats` +- `GET /api/archives` + +### 7.3 书架与笔记接口 + +- `GET /api/shelf` +- `GET /api/notebooks` + +### 7.4 按需详情 / 发现接口 + +- `GET /api/book/detail` +- `GET /api/book/notes` +- `GET /api/recommend` +- `GET /api/search` + +接口返回格式、参数细节和字段说明,仍以 [TECHNICAL_DOC.md](/Users/kinghwj/Codes/WeReadBoard/docs/TECHNICAL_DOC.md) 为准。 + +## 8. 数据模型分组 + +当前 MySQL 使用 31 张表,按职责分为以下几组: + +### 8.1 书架 + +- `books` +- `shelf_albums` +- `shelf_meta` +- `archives` + +### 8.2 阅读统计 + +- `reading_stats` +- `read_times` +- `read_longest` +- `read_stat_items` +- `prefer_categories` +- `prefer_authors` +- `prefer_publishers` +- `prefer_cps` +- `prefer_books` +- `prefer_time` +- `read_rank` +- `medals` +- `year_reports` + +### 8.3 笔记与书籍内容 + +- `notebooks` +- `book_highlights` +- `book_chapters` +- `book_reviews` +- `book_best_bookmarks` +- `book_underlines` +- `public_reviews` + +### 8.4 书籍详情与进度 + +- `book_details` +- `book_progress` + +### 8.5 推荐与搜索 + +- `recommended_books` +- `similar_books` +- `search_sessions` +- `search_results` + +### 8.6 系统元信息 + +- `fetch_meta` + +设计特征: + +- MySQL 统一使用 `utf8mb4` + `InnoDB` +- 大多数时间字段采用“整型时间戳 + `_dt` 可读时间列”的双列模式 +- 每张表统一维护 `created_at` 与 `updated_at` + +完整字段说明见 [METADATA_DOC.md](/Users/kinghwj/Codes/WeReadBoard/docs/METADATA_DOC.md)。 + +## 9. 前端实现要点 + +当前前端是单页标签切换式界面,主要包括: + +- 主题切换:支持明暗主题与本地持久化 +- 图表懒加载:首次进入图表页时才初始化 ECharts +- 高清封面策略:低清 URL 自动升级为高清版本 +- 书架筛选:关键词、分类、已读完、分页 +- 想法详情页:从弹窗升级为独立页面 +- 刷新同步:按钮触发 `/api/sync` 后再刷新书架数据 + +## 10. 部署与运维要点 + +- MySQL 需要先执行 [schema_mysql.sql](/Users/kinghwj/Codes/WeReadBoard/schema_mysql.sql) 建库建表。 +- 初次准备数据时,执行: + +```bash +python3 fetch_data.py +python3 migrate_to_mysql.py +``` + +- 日常使用可直接启动 Web 服务,前端点“刷新”会自动触发同步。 +- 若样式或静态资源修改后页面无变化,优先检查: + - 服务是否使用了旧进程 + - 浏览器是否使用了缓存 + +## 11. 合并后的迭代记录 + +以下内容来自 `.workbuddy/memory/2026-07-17.md`,但已按主题重整并去掉工具内部流程描述。 + +### 11.1 数据层演进 + +- 项目由 SQLite 展示切换为 MySQL 展示。 +- 建表从 18 张表扩展到 31 张表,对齐官方接口字段。 +- 迁移脚本重写,支持全量导入与时间字段转换。 + +### 11.2 后端演进 + +- 新增 `db_required` 装饰器统一管理数据库连接。 +- 新增 `/api/health` 用于前端健康检查。 +- 新增 `/api/sync`,打通“采集 -> 迁移 -> 展示”的刷新流程。 +- 新增按需详情接口,失败时可回退本地缓存。 + +### 11.3 前端演进 + +- 新增明暗主题切换和图表配色适配。 +- 阅读排行从卡片改为列表。 +- 想法详情从弹窗改为独立页面。 +- 新增顶部搜索框、书架分类树、推荐与搜索页。 +- 书架增加刷新按钮,并在后续多次修复其加载态抖动问题。 + +### 11.4 启动与配置演进 + +- `start_server.sh` 从硬编码路径改为动态识别项目目录与解释器。 +- `WEREAD_API_KEY` 从单纯依赖当前 shell 环境,演进为支持 `.env` 和 shell 配置回退读取。 + +## 12. 当前已知技术债 + +- MySQL 连接配置仍硬编码在 `app.py` 和 `migrate_to_mysql.py`,存在重复维护。 +- `README.md` 仍保留较早期的 SQLite 描述,后续可与当前架构再对齐。 +- 当前仍以本地脚本为主,未引入更正式的进程管理和自动化部署方案。 + +## 13. 结论 + +现在仓库内推荐遵循的文档与资料体系如下: + +- 最终总说明:本文件 [PROJECT_FINAL_DOC.md](/Users/kinghwj/Codes/WeReadBoard/docs/PROJECT_FINAL_DOC.md) +- 技术展开说明:[TECHNICAL_DOC.md](/Users/kinghwj/Codes/WeReadBoard/docs/TECHNICAL_DOC.md) +- 表结构与字段说明:[METADATA_DOC.md](/Users/kinghwj/Codes/WeReadBoard/docs/METADATA_DOC.md) + +`.qoder/` 与 `.workbuddy/` 继续保留给工具使用即可,但不再视为仓库的正式文档来源。 diff --git a/fetch_data.py b/fetch_data.py index 567e8ca..4bca0ac 100644 --- a/fetch_data.py +++ b/fetch_data.py @@ -26,9 +26,10 @@ import time import urllib.request from datetime import datetime, timezone, timedelta +from config_utils import get_env_value + # ===== 配置 ===== API_URL = "https://i.weread.qq.com/api/agent/gateway" -API_KEY = os.environ.get("WEREAD_API_KEY", "") SKILL_VERSION = "1.0.4" DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "weread.db") PROJECT_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -54,13 +55,17 @@ def now_str(): def api_call(api_name, **kwargs): """调用微信读书 API""" + api_key = get_env_value("WEREAD_API_KEY", "") + if not api_key: + raise RuntimeError("WEREAD_API_KEY 未设置,请检查当前终端环境、项目 .env 或 ~/.zshrc") + body = {"api_name": api_name, "skill_version": SKILL_VERSION} body.update(kwargs) req = urllib.request.Request( API_URL, data=json.dumps(body).encode("utf-8"), headers={ - "Authorization": f"Bearer {API_KEY}", + "Authorization": f"Bearer {api_key}", "Content-Type": "application/json", }, method="POST", @@ -1020,9 +1025,9 @@ def fetch_notebooks(conn): # ===== 主函数 ===== def main(): - if not API_KEY: + if not get_env_value("WEREAD_API_KEY", ""): print("错误: 请先设置 WEREAD_API_KEY 环境变量") - print(" export WEREAD_API_KEY=wrk-xxxxxxxx") + print(" 可配置在当前终端、项目 .env,或 ~/.zshrc") return print("=" * 60) diff --git a/requirements.txt b/requirements.txt index 001e7c4..1f9e10e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ flask>=3.0 +PyMySQL>=1.1 diff --git a/start_server.sh b/start_server.sh index 01c7e2e..7bc727b 100755 --- a/start_server.sh +++ b/start_server.sh @@ -7,8 +7,8 @@ # ./start_server.sh restart 重启服务 # ./start_server.sh status 查看状态 -PROJECT_DIR="/Users/hwj/WorkBuddy/2026-07-17-09-48-20" -PYTHON="/Users/hwj/.workbuddy/binaries/python/envs/default/bin/python" +PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" +PYTHON="${PYTHON:-$(command -v python3 || command -v python)}" PID_FILE="$PROJECT_DIR/.server.pid" LOG_FILE="/tmp/weread_server.log" PORT=8080 @@ -61,6 +61,10 @@ start_foreground() { echo "服务已在运行 (PID: $(get_pid))" exit 1 fi + if [ -z "$PYTHON" ]; then + echo "未找到可用的 Python 解释器" + exit 1 + fi echo "启动服务(前台模式)..." exec "$PYTHON" app.py } @@ -70,9 +74,12 @@ start_daemon() { echo "服务已在运行 (PID: $(get_pid))" exit 1 fi + if [ -z "$PYTHON" ]; then + echo "未找到可用的 Python 解释器" + exit 1 + fi echo "启动服务(后台守护模式)..." - WEREAD_API_KEY="${WEREAD_API_KEY:-wrk-ZL_oy0woT5yKFaO1jn_15AAA}" \ - nohup "$PYTHON" app.py > "$LOG_FILE" 2>&1 & + nohup "$PYTHON" app.py > "$LOG_FILE" 2>&1 & local pid=$! echo "$pid" > "$PID_FILE" sleep 2 diff --git a/static/css/style.css b/static/css/style.css index 92e4e86..6d475a0 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -748,6 +748,7 @@ body { display: flex; align-items: center; gap: 16px; + flex-wrap: wrap; } .shelf-search { @@ -769,6 +770,7 @@ body { .shelf-refresh-btn { padding: 0 16px; height: 36px; + min-width: 112px; border: 1px solid var(--border); border-radius: var(--radius-sm); font-size: 13px; @@ -781,7 +783,7 @@ body { align-items: center; justify-content: center; gap: 4px; - flex-shrink: 0; + flex: 0 0 112px; white-space: nowrap; } @@ -789,6 +791,15 @@ body { display: inline-block; font-size: 14px; line-height: 1; + flex: 0 0 auto; +} + +.shelf-refresh-btn .btn-text { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 4.5em; + line-height: 1; } .shelf-refresh-btn:hover:not(:disabled) { @@ -801,7 +812,7 @@ body { cursor: wait; } -.shelf-refresh-btn.loading { +.shelf-refresh-btn.is-loading { border-color: var(--accent); color: var(--accent); } @@ -2022,6 +2033,9 @@ body { .shelf-search { width: 140px; } + .shelf-filters { + gap: 10px; + } .shelf-categories { gap: 6px; } diff --git a/static/js/app.js b/static/js/app.js index daf6e68..1f563d2 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -324,7 +324,7 @@ async function refreshShelf() { const btn = document.getElementById("shelfRefreshBtn"); const textEl = btn.querySelector(".btn-text"); btn.disabled = true; - btn.classList.add("loading"); + btn.classList.add("is-loading"); textEl.textContent = "同步中..."; try { @@ -344,7 +344,7 @@ async function refreshShelf() { alert("刷新失败: " + (e.message || "未知错误")); } finally { btn.disabled = false; - btn.classList.remove("loading"); + btn.classList.remove("is-loading"); textEl.textContent = "刷新"; } } From 8e8a0bfba6057c8556699a5357a308dde6391641 Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 11 Sep 2026 17:30:10 +0800 Subject: [PATCH 04/16] =?UTF-8?q?feat(web):=20=E7=A7=BB=E6=A4=8D=202.0=20?= =?UTF-8?q?=E9=98=85=E8=AF=BB=E7=9C=8B=E6=9D=BF=E6=8E=A2=E7=B4=A2=20Demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/code-design.md | 50 +++++++ docs/feature-checklist.md | 127 ++++++++++++++++++ docs/technical-guide.md | 57 ++++++++ web-demo/app.js | 273 ++++++++++++++++++++++++++++++++++++++ web-demo/demo-data.js | 25 ++++ web-demo/index.html | 16 +++ web-demo/styles.css | 11 ++ 7 files changed, 559 insertions(+) create mode 100644 docs/code-design.md create mode 100644 docs/feature-checklist.md create mode 100644 docs/technical-guide.md create mode 100644 web-demo/app.js create mode 100644 web-demo/demo-data.js create mode 100644 web-demo/index.html create mode 100644 web-demo/styles.css diff --git a/docs/code-design.md b/docs/code-design.md new file mode 100644 index 0000000..0223520 --- /dev/null +++ b/docs/code-design.md @@ -0,0 +1,50 @@ +# 阅间 Demo 设计与数据流 + +## 页面分工 + +统计并入阅读概览;导航保留阅读概览、我的书架、阅读目标、笔记与划线、发现好书。概览展示阅读统计和目标摘要,目标页管理多份具体阅读清单。 + +完整功能、业务规则、接口落点与状态见 [功能目标清单](feature-checklist.md)。该清单先于本轮实现建立,后续代码开发继续追加和更新。 + +此版本属于 2.0 设计探索。正式版本需要接入真实接口、完成验收并合并到正式 Web 项目的 `master`,随后再创建 `v2.0` 标签。 + +## 数据流 + +`demo-data.js` 提供样例书籍、书单及初始目标。`app.js` 根据当前页面和筛选条件渲染内容;用户输入写入目标草稿,验证通过后保存到浏览器,再更新目标列表。现有 Flask 服务和数据采集代码不参与本轮 Demo。 + +书籍卡片打开详情;详情页可选目录、个人笔记、热门划线、点评、相似书。个人笔记与公开点评使用不同数据集合。热门划线中的想法继续打开单条详情。 + +书籍、书单详情均可加入已有目标,也可带着已选内容创建新目标。 + +## 阅读目标口径与例子 + +目标字段:`id`、`name`、`start`、`end`、`ids`、`sources`。`ids` 存放去重后的书籍 ID;`sources` 记录曾加入的书单名称,作为来源说明,不表示持续关联。 + +例:单独选择已读完的《活着》,再加入包含《活着》《人生海海》《悉达多》的书单。保存后总数为 3 本、已读完为 1 本,进度为 33%。从目标中移除《人生海海》后,进度为 1 / 2,即 50%。 + +完成状态取书籍当前已读状态,不受目标起止日期约束。同一本书可计入多个目标。同一目标内不重复计数。 + +状态判断先检查是否全部读完,再检查日期。例如目标时间为未来一周,但其中两本书都已读完,直接显示已完成;尚未全部完成时,按日期显示未开始、进行中、已到期。 + +书单采用加入时的书目,不自动跟随外部增删。移除目标内一本书,只影响这个目标,不改变书架或其他目标。 + +## 实现位置 + +| 职责 | 位置 | +|---|---| +| 去重与完成率、状态 | `app.js`:`uniqueIds`、`goalMetrics` | +| 新建、编辑、书单混选 | `app.js`:`openGoalEditor`、`renderPicker`、`saveGoal` | +| 加入已有目标 | `app.js`:`chooseTarget`、`appendGoal` | +| 本地持久化与异常恢复 | `app.js`:初始加载、`persistGoals` | +| 页面与详情导航 | `app.js`:`navigate`、`renderPage`、`handleAction` | +| 笔记导出 | `app.js`:`exportNotes` | + +用户输入的目标名称和来源在 HTML 渲染前转义。日期和内容在保存前校验;原生对话框提供焦点管理和 Escape 关闭。 + +## 示例与真实接口的边界 + +概览图表使用固定样例;目标日期状态使用浏览器当前本地日期。笔记导出包含当前选中书目的划线和个人想法全集,不受内容类型筛选影响,不包含书签内容及公开点评。 + +书架的有声内容完结不等于用户读完,所以未用其完结状态计算阅读目标。文章收藏是入口,不假装能直接列出内部文章。缺失资料显示暂无,不补造 ISBN 等字段。 + +正式接口接入单独推进,必须核对实时可用接口、鉴权、分页、错误、升级提示及字段口径;本轮 Demo 的完成状态不得用于宣称这些能力已真实接入。 diff --git a/docs/feature-checklist.md b/docs/feature-checklist.md new file mode 100644 index 0000000..03597b2 --- /dev/null +++ b/docs/feature-checklist.md @@ -0,0 +1,127 @@ +# 阅间功能目标清单 + +> 创建日期:2026-09-11。本文先于本轮 Demo 开发建立,是后续实现、验收和追加需求的统一清单。 + +当前版本定位:本目录中的静态 Demo 是 2.0 设计探索,不是正式 2.0 发布。只有后续真实功能合并到正式 Web 项目的 `master` 并完成验收后,才创建 `v2.0` 标签。 + +## 使用方式 + +- 功能编号固定,后续需求追加新编号,不复用或删除旧编号。 +- 分别维护「Demo 状态」与「真实接入状态」。假数据交互完成,不等于接口或正式功能完成。 +- 状态使用:待实现、进行中、已验证、待接口验证、暂不支持。 +- 实现后记录文件和函数或元素位置、验收结果;业务口径变化时同步更新规则与变更记录。 +- 当前范围为优化本地假数据 Demo,不接入账号,不修改原 Python 业务逻辑,不推送。 + +## 已确认业务口径 + +| 编号 | 规则 | +|---|---| +| R01 | 合并阅读概览与阅读统计,统计在概览内展示,不设置重复导航。 | +| R02 | 支持多个阅读目标,每个目标有名称、开始日期、结束日期。结束日期不得早于开始日期。 | +| R03 | 目标可添加具体书籍、一个或多个书单,允许混合选择。 | +| R04 | 同一目标内按书籍 ID 去重;同一本书可属于多个目标。 | +| R05 | 已读完的书直接计为完成,不要求在目标时间范围内读完,不做重读。 | +| R06 | 完成率 = 已读完书籍数 / 去重后目标书籍数。创建目标至少选一本;空目标展示未开始,不除零。 | +| R07 | 时间范围仅安排计划和提示状态,不改变书籍是否读完。全部读完优先显示已完成;否则按未开始、进行中、已到期展示。 | +| R08 | 本版把书单当前成员加入目标并展示来源,保存时提示「加入当前书目」。书单后续变动不自动增删目标书籍;自动跟随属于后续待讨论项。 | +| R09 | Demo 目标保存在当前浏览器,刷新保留;不写回微信读书。现有文档没有目标写回接口。 | +| R10 | 接入时按接口已读完状态判断,不把进度 1 当作完成:书架 finishReading=1;独立进度需要 progress=100 且存在 finishTime。冲突、缺失数据需处理,不伪造已读状态。 | +| R11 | 书架条目数 = books.length + albums.length + (mp 非空 ? 1 : 0)。有声专辑「已完结」不是用户「已读完」。 | +| R12 | 笔记总数 = 划线数 + 想法/点评数 + 书签数。公开点评不计入个人笔记;书签目前仅有数量,无内容。 | +| R13 | 时间戳显示 YYYY-MM-DD;时长按秒转换为小时/分钟;评分按对应接口说明转换,不能混用百分制、五分制。 | +| R14 | 演示数据与真实数据明确区分。无 deepLink 不拼接阅读链接。可选字段缺失不当作 0,也不补造内容。 | + +## 功能目标与追踪 + +以下位置已按本轮实现回填。函数名作为稳定定位依据,行号仅对应本次版本。 + +| ID | 功能与验收标准 | Demo 状态 | 真实接入状态 | 代码位置 | +|---|---|---|---|---| +| F01 | 五个入口:概览、书架、目标、笔记、发现;暗亮切换及移动适配 | 已验证(示例) | 不涉及接口 | `web-demo/app.js:54` `navigate`; `web-demo/app.js:30` `setTheme` | +| F02 | 概览内切换周/月/年/总计,展示时长、天数、日均、排行、偏好 | 已验证(示例) | 待实现 | `web-demo/app.js:85` `renderOverview` | +| F03 | 多目标列表、名称、时间范围、封面组合、完成率、到期状态 | 已验证(示例) | 本地功能,待正式持久化 | `web-demo/app.js:76` `renderGoals`; `web-demo/app.js:67` `goalMetrics` | +| F04 | 创建与编辑目标,校验日期和非空内容;刷新保留 | 已验证(示例) | 本地功能,待正式持久化 | `web-demo/app.js:122` `openGoalEditor`; `web-demo/app.js:138` `saveGoal` | +| F05 | 目标混合选择单书与书单,去重,已读直接计完成 | 已验证(示例) | 待接真实书籍状态 | `web-demo/app.js:131` `selectedGoalBooks`; `web-demo/app.js:67` `goalMetrics` | +| F06 | 目标详情查看成员、来源、单本进度;编辑移除成员 | 已验证(示例) | 待接真实书籍状态 | `web-demo/app.js:118` `openGoalDetail`; `web-demo/app.js:122` `openGoalEditor` | +| F07 | 我的书架:在读/已读/想读、书单、有声书和文章收藏入口 | 已验证(示例) | 待实现 | `web-demo/app.js:105` `renderShelf` | +| F08 | 我的书单列表与详情;从书单添加目标 | 已验证(示例) | 待实现 | `web-demo/app.js:104` `renderLists`; `web-demo/app.js:113` `openList` | +| F09 | 发现页:书籍/书单搜索、公开书单详情示意、空结果 | 已验证(示例) | 搜索待实现;公开书单成员待接口验证 | `web-demo/app.js:158` `renderDiscover`; `web-demo/app.js:113` `openList` | +| F10 | 书籍详情:信息、阅读进度、目录;加入目标 | 已验证(示例) | 待实现 | `web-demo/app.js:192` `openBook`; `web-demo/app.js:197` `renderBookTab` | +| F11 | 笔记本、划线与个人想法、书签数量、按书过滤、内容导出 | 内容/导出预览已验证;文件下载待验证 | 待实现;书签内容暂不支持 | `web-demo/app.js:177` `renderNotes`; `web-demo/app.js:184` `exportNotes` | +| F12 | 热门划线、章节热度、划线下想法及想法详情 | 已验证(示例) | 待实现 | `web-demo/app.js:197` `renderBookTab`; `web-demo/app.js:208` `openThought` | +| F13 | 公开点评筛选、点评详情,与个人笔记分离 | 已验证(示例) | 待实现 | `web-demo/app.js:197` `renderBookTab`; `web-demo/app.js:208` `openThought` | +| F14 | 个性化推荐和相似书推荐,可查详情和加入目标 | 已验证(示例) | 待实现 | `web-demo/app.js:158` `renderDiscover`; `web-demo/app.js:197` `renderBookTab` | +| F15 | 搜索其余类型:作者、网文、听书、全文、公众号、文章、综合 | 已验证(示例) | 待实现;非书籍回包结构需实测 | `web-demo/app.js:158` `renderDiscover` | +| F16 | 数据状态:加载、空、失败及重试;演示来源常驻 | 已验证(示例) | 待实现 | `web-demo/app.js:158` `renderDiscover` | +| F17 | API Key 仅服务端使用;版本上报、升级中断、错误转换、分页 | 不属于本轮 Demo | 待实现 | 后续核对 `app.py` 和 `fetch_data.py`,复用现有服务端能力 | +| F18 | 可选统计:阅读时段、作者/出版社/版权方、阅读听书比例、好友排行、勋章、年报 | 已验证(示例) | 待实现;按实际返回字段显示 | `web-demo/app.js:85` `renderOverview` | + +## 全部文档接口的落点 + +依据本地 weread-skills 1.0.4 能力文档。未调用实时 `/_list`,因此此表是文档已知能力,不宣称已发现网关所有实际接口。 + +| 接口 | 使用场景 | 约束与后续接入要求 | +|---|---|---| +| /_list | 接入前核对网关可用接口 | 获取后补齐本清单;不可将未验证能力标完成 | +| /shelf/sync | 书架、我的书单、专辑、文章收藏 | archive 包含名称与 bookIds;mp 仅入口,不是文章内容 | +| /store/search | 综合、电子书、网文、听书、作者、全文、书单、公众号、文章 | 显式 scope;分页看 hasMore/searchIdx;书单成员结构待验证 | +| /book/info | 详情资料与评分 | 按返回字段展示,不补造 ISBN 等信息 | +| /book/chapterinfo | 目录与章节选择 | 使用 chapterUid,保留层级和付费状态 | +| /book/getprogress | 书籍进度、已读状态 | 进度 0–100;时长秒;最近阅读优先加载,避免全书架逐本请求 | +| /readdata/detail | 概览全部阅读统计 | 自然周期;总量用 totalReadTime;日均按自然日;preferTime 从 6 点开始;可选数据缺失时隐藏 | +| /user/notebooks | 笔记本与数量 | count + lastSort 分页;总数含书签 | +| /book/bookmarklist | 划线内容 | 不含书签内容 | +| /review/list/mine | 个人想法与点评 | 与划线合并导出;使用 bookid 参数及 synckey 分页 | +| /book/underlines | 章节划线热度 | 只有人数/位置等统计,不含文本 | +| /book/bestbookmarks | 热门划线 | 固定前 20 条,不支持分页 | +| /book/readreviews | 划线下想法 | 使用返回 range、chapterUid;每个 range 独立分页 | +| /review/single | 想法、点评详情 | 富文本正式接入时需净化后渲染 | +| /review/list | 公开点评及筛选 | 双层 review 包装;20/40/60/80/100 对应 1–5 星 | +| /book/recommend | 为你推荐 | 使用 searchIdx 分页 | +| /book/similar | 相似推荐 | 显式 count/maxIdx;后续携带 sessionId | + +## 验收记录 + +2026-09-11 在本地浏览器实测,结果如下。均为假数据 Demo 验证,不代表真实接口验收。 + +| 场景 | 输入或操作 | 实际结果 | +|---|---|---| +| 导航合并 | 查看侧边栏 | 共 5 个入口,无独立阅读统计 | +| 日期校验 | 开始 2026-09-12,结束 2026-09-01 | 原生表单阻止保存,提示结束日期过早 | +| 非空校验 | 只填写名称与日期,未选择书籍 | 提示至少选择一本书或一个书单 | +| 混合去重 | 单独选《活着》,再加入含它的三本书单 | 已选 3 本,1 本已读完,保存显示 33% | +| 保存刷新 | 保存“周末慢读清单”后刷新 | 名称、日期、3 本书与进度保留 | +| 编辑移除 | 从上述目标移除《人生海海》 | 剩余 2 本,1 本完成,显示 50% | +| 已有目标去重 | 重复加入“心理学,向内走一程”书单 | 原目标仍为 3 本,1 本完成 | +| 书单查询 | 发现页选择书单,输入“心理学” | 仅显示匹配书单,详情可加入已有目标 | +| 书籍内容 | 三体 → 目录 → 示例章节 2 → 划线想法 → 详情 | 展示对应入口及示例内容 | +| 点评筛选 | 读者点评选择“一般” | 仅显示三星的一般点评示例 | +| 相似推荐 | 在书籍详情选择相似推荐 | 展示其他 4 本书,可进入详情 | +| 笔记边界 | 全部笔记 → 书签数量 | 总数 10,划线 2、想法 2、书签 6;不显示书签内容 | +| 导出预览 | 导出全部笔记 | 生成 4 条内容:2 条划线、2 条想法,包含演示声明 | +| 文件下载 | 等待浏览器下载事件 | 事件超时,未确认落盘;保留可复制预览和下载链接,后续实测下载 | +| 搜索类型 | 推荐、作者、网文、听书、全文、公众号、文章、综合 | 均切换为对应类型示意 | +| 失败重试 | 预览状态选失败,再点击重试 | 显示失败状态,重试恢复结果 | +| 统计周期 | 切换月、年、总计、周 | 图表与总量切换;年度最终核对为 128小时42分钟 | +| 书架边界 | 我的书单、有声书、文章收藏 | 展示书单、有声信息和收藏入口边界说明 | +| 主题与响应式 | 1440px 桌面、390px 手机,暗亮切换 | 桌面双列目标;手机单列且编辑弹窗可滚动,无横向溢出 | +| 静态检查 | Node 语法检查 app.js 和 demo-data.js | 均通过 | + +可重复手工验收:新建空内容目标检查提示;选择《活着》和文学书单验证 1/3;刷新验证保存;移除一本验证 1/2。不要把验收用目标写入未来真实账号。 + +## 变更记录 + +| 日期 | 变更 | 依据 | +|---|---|---| +| 2026-09-11 | 建立清单;确认多目标、日期范围、单书与书单混合、已读直接完成 | 本任务用户需求 | +| 2026-09-11 | 完成第二版 Demo,回填代码位置与验收;真实接口接入保留待实现 | 本轮浏览器实测 | + +## 后续追加模板 + +复制下面一行到功能目标表,分配下一个编号,并在完成时同步验收记录。 + +| ID | 功能与验收标准 | Demo 状态 | 真实接入状态 | 代码位置 | +|---|---|---|---|---| +| F19 | 待填写;涉及新规则时追加 R 编号 | 待实现 | 待实现 | 实现后填写文件、函数和行号 | + +后续开发顺序:核对实时 `/_list` 与公开书单成员能力 → 服务端鉴权及只读接口 → 替换 Demo 数据 → 校验分页与字段口径 → 正式目标持久化。每次只将已实际验收的范围标为完成。 diff --git a/docs/technical-guide.md b/docs/technical-guide.md new file mode 100644 index 0000000..36b457f --- /dev/null +++ b/docs/technical-guide.md @@ -0,0 +1,57 @@ +# 阅间设计 Demo 使用说明 + +## 范围与启动 + +这是独立的静态设计 Demo,不调用微信读书接口,不需要 API Key,也不修改现有 Flask 服务、数据采集脚本和 8080 页面。功能与接口的后续实现进度统一维护在 [功能目标清单](feature-checklist.md)。 + +该 Demo 定位为 2.0 设计探索。当前提交用于保存探索成果,不代表 2.0 正式发布,也不创建 `v2.0` 标签。 + +在项目根目录执行: + +```sh +python3 -m http.server 8765 --bind 127.0.0.1 --directory web-demo +``` + +访问 `http://127.0.0.1:8765`。也可以直接打开 `web-demo/index.html`;推荐通过本地服务器使用,以便浏览器稳定保存目标数据。 + +无需安装前端依赖。页面由以下文件构成: + +| 文件 | 内容 | +|---|---| +| `web-demo/index.html` | 页面外壳、导航、详情与目标编辑弹窗 | +| `web-demo/styles.css` | 暗亮主题、书封示意、响应式排版 | +| `web-demo/demo-data.js` | 书籍、书单、初始目标、笔记与点评样例 | +| `web-demo/app.js` | 页面渲染、目标操作、搜索筛选、导出 | + +## 保存与数据边界 + +目标使用当前来源的 `localStorage` 键 `weread-demo-goals-v2`,主题使用 `weread-demo-theme`。刷新后保留;更换浏览器、地址或端口不会自动迁移;清除网站数据会清除本地目标。 + +书单加入目标时保存当前书籍集合,后续不自动跟随书单变化。同一目标内书籍去重,已读完直接计为完成。新增目标必须有名称、有效时间范围和至少一本书。 + +本地存储读取失败时显示示例目标并提示,不自动覆盖原存储;保存失败时保留编辑表单并提示重试。 + +所有阅读数据、书单成员、封面、目录、笔记和点评都是示例。用户编辑的目标只保存在本机,不会写回微信读书。公开书单完整成员获取方式仍需接口验证。 + +## 使用入口 + +- 阅读目标:新建目标,填写日期,勾选书籍或点击书单快捷加入,保存后可再编辑。 +- 我的书架:切换我的书单、有声书、文章收藏与阅读状态。 +- 发现好书:选择搜索类型;右侧预览状态可查看加载、空结果、失败及重试效果。 +- 书籍详情:从卡片进入,切换目录、个人笔记、热门划线、点评、相似推荐。 +- 笔记:按书目和类型筛选,导出当前书目的划线与想法,书签仅显示数量。 + +## 验证 + +语法检查: + +```sh +node --check web-demo/app.js +node --check web-demo/demo-data.js +``` + +交互验收记录见 [功能目标清单](feature-checklist.md)。真实 API、鉴权、分页和服务器持久化尚未验证。 + +## 与 1.0 的关系 + +1.0 继续由根目录的 `app.py`、`fetch_data.py`、`templates/` 和 `static/` 提供,运行在 8080 端口。2.0 探索 Demo 位于 `web-demo/`,两者可以独立预览。 diff --git a/web-demo/app.js b/web-demo/app.js new file mode 100644 index 0000000..f720af6 --- /dev/null +++ b/web-demo/app.js @@ -0,0 +1,273 @@ +const $ = selector => document.querySelector(selector); +const esc = value => String(value).replace(/[&<>"']/g, char => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[char])); +const findBook = id => books.find(book => book.id === id); +const uniqueIds = ids => [...new Set(ids)].filter(id => findBook(id)); +const today = () => new Date().toLocaleDateString('sv-SE'); +const storageKey = 'weread-demo-goals-v2'; +let page = 'overview', shelfTab = 'reading', discoverTab = 'books', searchQuery = '', period = 'week'; +let noteBook = 'all', noteType = 'all', goalFilter = 'all', dataState = 'ready'; +let detailBook = null, bookTab = 'info', reviewFilter = '全部', selectedChapter = 'all'; +let editingGoalId = null, draftIds = new Set(), draftSources = [], goals = initialGoals.map(goal => ({...goal, ids:[...goal.ids], sources:[...goal.sources]})); +let toastTimer, storageWarning = ''; +// 本地数据损坏时保留原存储并恢复示例;保存前仍要求用户通过有效表单提交。 +try { + const saved = localStorage.getItem(storageKey); + if (saved) { + const parsed = JSON.parse(saved); + if (!Array.isArray(parsed) || !parsed.every(goal => typeof goal.id === 'string' && typeof goal.name === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(goal.start) && /^\d{4}-\d{2}-\d{2}$/.test(goal.end) && goal.start <= goal.end && Array.isArray(goal.ids) && Array.isArray(goal.sources))) throw new Error('invalid'); + goals = parsed.map(goal => ({...goal,ids:uniqueIds(goal.ids)})); + } +} catch { storageWarning = '本地目标暂时无法读取,已显示示例目标;原存储未修改。'; } +function toast(message) { + clearTimeout(toastTimer); $('#toast').textContent = message; $('#toast').classList.remove('hidden'); + toastTimer = setTimeout(() => $('#toast').classList.add('hidden'), 3500); +} +function persistGoals(next) { + try { localStorage.setItem(storageKey, JSON.stringify(next)); } + catch { $('#goal-error').textContent = '浏览器无法保存数据,请允许本地存储后重试。'; return false; } + goals = next; return true; +} +function setTheme(theme) { + document.documentElement.dataset.theme = theme; + $('#theme').innerHTML = ``; + $('#theme').setAttribute('aria-label', `切换至${theme === 'dark' ? '亮' : '暗'}色主题`); +} +try { setTheme(localStorage.getItem('weread-demo-theme') === 'dark' ? 'dark' : 'light'); } catch { setTheme('light'); } +$('#theme').onclick = () => { + const theme = document.documentElement.dataset.theme === 'dark' ? 'light' : 'dark'; setTheme(theme); + try { localStorage.setItem('weread-demo-theme', theme); } catch { toast('主题已切换,本次浏览有效。'); } +}; +function cover(book, mini = false) { + if (mini) return ``; + return `
${book.en}${book.short.replaceAll('\n','
')}
${book.author}READING SPACE · 示意封面
`; +} +function bookCard(book) { + return ``; +} +function bookRow(book, source = '') { + return `
${cover(book,true)}
${book.title}

${book.author}${source ? ' · '+esc(source) : ''}

${book.status === 'done' ? '已读完' : `${book.progress}%`}
`; +} +function welcome(title, subtitle, action = '') { + return `
A LITTLE READING, EVERY DAY

${title}

${subtitle}

${action}
`; +} +const pageNames = {overview:'阅读概览',shelf:'我的书架',goals:'阅读目标',notes:'笔记与划线',discover:'发现好书'}; +function navigate(next) { + page = next; $('#crumb').textContent = pageNames[page]; + document.querySelectorAll('[data-page]').forEach(button => {button.classList.toggle('active',button.dataset.page === page);button.setAttribute('aria-current',button.dataset.page === page ? 'page' : 'false');}); + renderPage(); +} +function renderPage() { + const views = {overview:renderOverview,shelf:renderShelf,goals:renderGoals,notes:renderNotes,discover:renderDiscover}; + $('#page-content').innerHTML = views[page](); +} +function tabs(items, selected, action) { + return `
${items.map(([id,label]) => ``).join('')}
`; +} +// 已读状态与目标日期无关;先按书籍 ID 去重,再计算完成率。 +function goalMetrics(goal, date = today()) { + const ids = uniqueIds(goal.ids), done = ids.filter(id => findBook(id).status === 'done').length; + const status = ids.length && done === ids.length ? '已完成' : date < goal.start ? '未开始' : date > goal.end ? '已到期' : '进行中'; + return {total:ids.length,done,percent:ids.length ? Math.round(done/ids.length*100):0,status}; +} +function goalCard(goal) { + const result = goalMetrics(goal); + return `
${result.status}

${esc(goal.name)}

${goal.start} — ${goal.end}
${goal.ids.slice(0,4).map(id=>cover(findBook(id),true)).join('')}${result.total>4?`+ ${result.total-4} 本`:''}
${result.done} / ${result.total} 本已读完${result.percent}%
`; +} +function renderGoals() { + const list = goals.filter(goal => goalFilter === 'all' || (goalFilter === 'complete' ? goalMetrics(goal).status === '已完成' : goalMetrics(goal).status !== '已完成')); + return welcome('把想读,变成读过','几本书、一份书单,或一段想留给阅读的时间。', '')+ + `
YOUR NEXT CHAPTER

目标不必宏大,开始就很好。

每份清单都有自己的节奏。已经读完的书,也会成为你完成目标的一部分。

${goals.length}个目标${goals.filter(g=>goalMetrics(g).status==='已完成').length}个已完成${uniqueIds(goals.flatMap(g=>g.ids)).length}本不同的书
❧
`+ + tabs([['all','全部目标'],['active','未完成'],['complete','已完成']],goalFilter,'goal-filter')+`
${list.map(goalCard).join('') || '
这里还没有目标,创建一份属于你的阅读清单。
'}
`; +} +function summaryGoals() { + return `

我的阅读目标

${goals.slice(0,3).map(goal=>{const m=goalMetrics(goal);return ``;}).join('')}
`; +} +function renderOverview() { + const values = {week:[42,65,33,57,86,71,48],month:[48,54,65,38,70,52,64,75,68,42,46],year:[8,11,14,9,18,15,12,14,27.7],overall:[75,96,128.7]}[period]; + const labels = {week:['一','二','三','四','五','六','日'],month:['1日','2日','3日','4日','5日','6日','7日','8日','9日','10日','11日'],year:['1月','2月','3月','4月','5月','6月','7月','8月','9月'],overall:['2024','2025','2026']}[period]; + const max = Math.ceil(Math.max(...values)/10)*10; + const totalMinutes = values.reduce((a,b)=>a+b,0)*(period==='year'||period==='overall'?60:1); + const duration = `${Math.floor(totalMinutes/60)}小时${Math.round(totalMinutes%60)}分钟`; + const days = {week:7,month:11,year:132,overall:412}[period]; + const naturalDays = {week:7,month:11,year:254,overall:985}[period]; + const units = period==='year'||period==='overall'?'时':'分'; + const stats = [['阅读 / 收听时长',duration,'当前所选周期','clock'],['有效阅读天数',`${days}天`,'单日满 1 分钟计一天','flag'],['自然日均阅读',`${Math.round(totalMinutes/naturalDays)}分钟`,'按周期自然日计算','chart'],['笔记总数','10条','划线 2 · 想法 2 · 书签 6','note']]; + return welcome('在字里行间,遇见自己','阅读、目标与灵感,在这里慢慢积累。','')+ + `
${tabs([['week','本周'],['month','本月'],['year','本年'],['overall','总计']],period,'period')}统计示例 · ${period==='overall'?'2024—2026':'2026 年'}
${stats.map(([label,value,hint,icon])=>`
${label}
${value}
${hint}
`).join('')}
+

阅读的日常 每一天,都算数

${period==='year'?'按月':period==='overall'?'按年':'按日'}
${duration}阅读与收听合计
${[max,Math.round(max*2/3),Math.round(max/3),0].map(n=>``).join('')}
${values.map((v,i)=>``).join('')}

继续阅读

${books.filter(b=>b.status==='reading').map(bookCard).join('')}
+

读得最多

${books.slice(0,3).map((b,i)=>`
${i+1}. ${b.title}${[2,1,1][i]}小时${[12,35,6][i]}分钟
`).join('')}

偏爱的阅读方向

${[['文学',80],['心理学',60],['科幻',40]].map(([label,val])=>`
${label}相对偏好 ${val}
`).join('')}

相对偏好权重,不是阅读占比

留给自己的时段

${Array.from({length:24},(_,i)=>``).join('')}
06:0018:00次日 05:00

偏好夜间阅读 · 示例时段分布

+
更多阅读画像 · 作者、听书、勋章与年度回顾

偏好作者与出版方

刘慈欣3 本 · 5小时30分钟
示例出版社4 本
示例版权方3 本

阅读与收听

文字阅读80%

示例分布;正式接入只在接口返回时展示。

阅读足迹

好友排行本周第 3 · 示例
勋章初读 · 笔记 · 坚持
`; +} +function listCard(list, index) { + return ``; +} +function renderLists(lists) { return `
${lists.map(listCard).join('') || '
没有匹配的书单,换个关键词试试。
'}
`; } +function renderShelf() { + let content; + if (shelfTab==='lists') content=renderLists(booklists.filter(l=>l.source==='我的书单')); + else if (shelfTab==='audio') content=`
♫

晚间听书 · 文学选读

示例演播者 · 24 集 · 内容已完结

内容完结不代表已听完;当前不纳入按本阅读目标。

`; + else if(shelfTab==='articles') content=`
▤

文章收藏

这是书架中的收藏入口。

当前书架接口不提供入口内文章列表;可在发现页搜索文章。

`; + else content=`
${books.filter(b=>shelfTab==='all'||b.status===shelfTab).map(bookCard).join('')}
`; + return welcome('我的书架','8 本电子书 · 1 个有声专辑 · 1 个文章收藏入口,共 10 个书架条目。')+tabs([['all','全部电子书 8'],['reading','在读 4'],['done','已读完 2'],['wish','想读 2'],['lists','我的书单 2'],['audio','有声书 1'],['articles','文章收藏']],shelfTab,'shelf-tab')+content; +} +function openList(id) { + const list=booklists.find(l=>l.id===id); + showDetail('书单详情',`
A COLLECTION OF GOOD BOOKS

${list.name}

${list.description}

${list.source} · ${list.ids.length} 本 · 示例成员

${list.ids.map(id=>bookRow(findBook(id))).join('')}
${list.source.startsWith('公开')?'

公开书单成员为设计示意,完整成员获取方式待真实接口验证。

':''}`); +} +function showDetail(title, html) { $('#detail-title').textContent=title;$('#detail-content').innerHTML=html;if(!$('#detail').open)$('#detail').showModal(); } +function openGoalDetail(id) { + const goal=goals.find(g=>g.id===id), m=goalMetrics(goal); + showDetail('阅读目标',`
${m.status}${goal.start} — ${goal.end}

${esc(goal.name)}

${m.done} / ${m.total}本已读完${m.percent}%已完成

已读完直接计入完成,不受目标日期影响。

${goal.sources.length?`

加入过的书单:${goal.sources.map(esc).join('、')} · 保存时的书目

`:''}
${goal.ids.map(id=>bookRow(findBook(id))).join('')}
`); +} +function openGoalEditor(id=null, prefill=[], sources=[]) { + $('#detail').close(); editingGoalId=id; + const goal=id?goals.find(g=>g.id===id):null; + draftIds=new Set(goal?goal.ids:prefill);draftSources=[...(goal?goal.sources:sources)]; + $('#editor-title').textContent=goal?'编辑阅读目标':'新建阅读目标';$('#goal-name').value=goal?goal.name:''; + $('#goal-start').value=goal?goal.start:today();$('#goal-end').value=goal?goal.end:`${today().slice(0,4)}-12-31`; + $('#goal-end').min=$('#goal-start').value;$('#goal-end').setCustomValidity('');$('#goal-name').setCustomValidity(''); + $('#picker-search').value='';$('#goal-error').textContent='';renderPicker();$('#goal-editor').showModal(); +} +function selectedGoalBooks() { return uniqueIds([...draftIds]); } +function renderPicker() { + const query=$('#picker-search').value.trim().toLowerCase(); + const list=books.filter(b=>`${b.title}${b.author}`.toLowerCase().includes(query)); + $('#selection-count').textContent=`已选 ${draftIds.size} 本 · ${[...draftIds].filter(id=>findBook(id).status==='done').length} 本已读完`; + $('#goal-picker').innerHTML=`

快捷加入书单当前书目

${booklists.filter(l=>!query||l.name.includes(query)||l.ids.some(id=>list.some(b=>b.id===id))).map(l=>``).join('')}
${list.map(b=>``).join('')||'
没有匹配的书籍
'}
`; +} +function saveGoal(event) { + event.preventDefault();const name=$('#goal-name').value.trim(),start=$('#goal-start').value,end=$('#goal-end').value,ids=selectedGoalBooks(); + if(!name){$('#goal-name').setCustomValidity('请输入目标名称');$('#goal-name').reportValidity();return;} + if(endg.id===editingGoalId?goal:g):[goal,...goals]; + if(!persistGoals(next))return; + $('#goal-editor').close();navigate('goals');toast('阅读目标已保存,已读完的书已计入完成。'); +} +function chooseTarget(ids,sources=[]) { + showDetail('加入阅读目标',`

选择已有目标,或为这些书新建目标。重复书籍只加入一次。

${goals.map(g=>`
${esc(g.name)}

${g.start} — ${g.end} · ${g.ids.length} 本

`).join('')}
`); + pendingBooks=ids;pendingSources=sources; +} +let pendingBooks=[],pendingSources=[]; +function appendGoal(id) { + const next=goals.map(g=>g.id===id?{...g,ids:uniqueIds([...g.ids,...pendingBooks]),sources:[...new Set([...g.sources,...pendingSources])]}:g); + try { localStorage.setItem(storageKey,JSON.stringify(next)); } catch { toast('无法保存到浏览器,请允许本地存储后重试。');return; } + goals=next;renderPage();openGoalDetail(id);toast('已加入目标,重复书籍已自动去重。'); +} +function renderDiscover() { + const options=[['books','书籍'],['lists','书单'],['recommend','为你推荐'],['all','综合'],['author','作者'],['novel','网文'],['audio','听书'],['fulltext','全文'],['account','公众号'],['article','文章']]; + const matched=books.filter(b=>`${b.title}${b.author}`.toLowerCase().includes(searchQuery.toLowerCase())); + let content=''; + if(dataState!=='ready') { + const copy={loading:['正在寻找好书','加载状态示意,点击下方按钮查看结果。'],empty:['暂时没有找到','换个关键词,或看看为你推荐。'],error:['暂时无法获取数据','连接失败示意,你的阅读目标仍保存在本地。']}[dataState]; + content=`
${dataState==='loading'?'LOADING':dataState==='error'?'TRY AGAIN':'NOT FOUND'}

${copy[0]}

${copy[1]}

`; + } else if(discoverTab==='lists') content=renderLists(booklists.filter(l=>`${l.name}${l.description}`.includes(searchQuery))); + else if(discoverTab==='books'||discoverTab==='recommend') content=`${discoverTab==='recommend'?'
PICKED FOR YOUR NEXT CHAPTER

读过的书,会带你遇见下一本。

根据你对文学与心理学的兴趣推荐 · 推荐理由为示例

':''}
${(discoverTab==='recommend'?matched.filter(b=>b.status==='wish'||b.id==='b0'):matched).map(bookCard).join('')||'
没有找到相关书籍,试试其他书名或作者。
'}
`; + else if(discoverTab==='author') content=`
${[...new Set(matched.map(b=>b.author))].map(name=>`
${name.slice(0,1)}
${name}

作者结果 · 示例

`).join('')||'
没有匹配的作者。
'}
`; + else if(discoverTab==='all') content=`

书籍

${matched.slice(0,4).map(bookCard).join('')||'
没有匹配的书籍。
'}

书单

${renderLists(booklists.filter(l=>l.name.includes(searchQuery)))}`; + else { + const examples={novel:['星河来信','网文小说 · 示例作品','连载中 · 128 章'],audio:['夜晚的文学课','有声专辑 · 示例演播者','24 集 · 内容已完结'],fulltext:['关于阅读的一段文字','全文搜索 · 原创示例文本','阅读让日常拥有了更宽阔的边界。'],account:['一页书房','公众号 · 示例账号','记录阅读、日常与思考'],article:['如何为自己留一点阅读时间','文章 · 原创示例','2026-09-11 · 一页书房']}[discoverTab]; + const matches=!searchQuery||examples.join('').includes(searchQuery); + content=matches?`
${discoverTab==='audio'?'♫':'▤'}

${examples[0]}

${examples[1]}

${examples[2]}

`:'
没有匹配的演示内容,可清空关键词查看该类型示意。
'; + } + return welcome('下一本,遇见什么?','寻找一本书,也发现一份恰好适合你的书单。')+ + `
${tabs(options,discoverTab,'discover-tab')}
${content}

搜索、推荐、书单均为设计样例,未请求微信读书服务。

`; +} +function renderNotes() { + const list=personalNotes.filter(note=>(noteBook==='all'||note.bookId===noteBook)&&(noteType==='all'||note.type===noteType)); + const counts=personalNotes.filter(note=>noteBook==='all'||note.bookId===noteBook); + const bookmarks=noteBook==='all'?6:noteBook==='b0'?3:noteBook==='b1'?2:noteBook==='b2'?1:0; + return welcome('把读过的,留在心里','划线、想法与每一次停顿,都有自己的意义。','')+ + `
${counts.length+bookmarks}条笔记划线 ${counts.filter(n=>n.type==='highlight').length}想法 ${counts.filter(n=>n.type==='thought').length}书签 ${bookmarks}
${tabs([['all','全部内容'],['highlight','划线'],['thought','想法 / 个人点评'],['bookmark','书签数量']],noteType,'note-type')}${noteType==='bookmark'?`
${bookmarks} 个书签 · 当前接口只提供数量,不提供书签内容。
`:list.map(note=>`
${note.type==='thought'?'我的想法':'划线示意'}
${note.text}
《${findBook(note.bookId).title}》 · ${note.date}

原创示例文本,非书中原文

`).join('')||'
当前筛选没有笔记。
'}

总笔记数包含书签;导出包含划线和个人想法,不含公开点评及书签内容。

`; +} +function exportNotes() { + // 导出按当前选中书目取划线和想法全集,内容类型筛选不影响导出完整性。 + const notes=personalNotes.filter(note=>noteBook==='all'||note.bookId===noteBook); + const text='# 阅间笔记 · 演示数据\n\n原创示例,非书中原文。书签仅提供数量,不导出内容。\n\n'+notes.map(n=>`## ${findBook(n.bookId).title}\n\n${n.type==='thought'?'想法':'划线示意'} · ${n.date}\n\n${n.text}`).join('\n\n'); + const url=URL.createObjectURL(new Blob([text],{type:'text/markdown;charset=utf-8'})); + showDetail('导出笔记', `

已生成当前书目的划线与想法。可下载 Markdown,或直接选中下方内容复制;不含书签内容。

`); + $('#detail').addEventListener('close',()=>URL.revokeObjectURL(url),{once:true}); +} +function openBook(id) { detailBook=id;bookTab='info';selectedChapter='all';renderBookDetail(); } +function renderBookDetail() { + const book=findBook(detailBook); + showDetail('书籍详情',`
${cover(book)}
READING SPACE / BOOK

${book.title}

${book.author}

评分 ${Math.round(Number(book.score)*10)}/100 · 示例评分

${book.status==='done'?'已读完':`已读 ${book.progress}%`} · 累计 2小时18分钟

${[['info','简介'],['chapters','目录'],['notes','我的笔记'],['popular','热门划线'],['reviews','读者点评'],['similar','相似推荐']].map(([id,label])=>``).join('')}
${renderBookTab(book)}

全部为设计示例 · 目录、文字和读者资料非真实接口内容。

`); +} +function renderBookTab(book) { + if(bookTab==='info')return `

${book.desc}

分类:${book.id==='b1'?'科幻':'文学 / 人文'} · 示例
最近阅读:2026-09-11
出版社:示例出版社
译者 / ISBN:暂无演示数据
字数:约 20 万字 · 示例
出版日期:暂无演示数据
`; + if(bookTab==='chapters')return `

目录结构示意;选择章节可查看该章热门划线与热度。

${['序章 · 故事的开始','第一章 · 在旅途中','第二章 · 看见新的世界','第三章 · 留给自己的答案'].map((name,i)=>`
${String(i+1).padStart(2,'0')}   ${name} · 示例章节
`).join('')}`; + if(bookTab==='notes') { + const notes=personalNotes.filter(n=>n.bookId===book.id); + return notes.map(n=>`
${n.type==='thought'?'个人想法':'划线示意'}
${n.text}
${n.date} · 原创示例文本
`).join('')||'
这本书暂无个人笔记示例。
'; + } + if(bookTab==='popular')return `
${selectedChapter==='all'?'全书':`示例章节 ${Number(selectedChapter)+1}`} · 热门划线最多展示 20 条
${['阅读让我们有机会,在自己的生活之外再生活一次。','那些认真思考过的问题,会在未来的某一天回应你。'].map((text,i)=>`
${[1286,862][i]} 人划线 · 示例热度
${text}
原创示例文本,非书中原文
`).join('')}

章节热度提供人数与位置,原文来自热门划线;这里用示例文本说明展示方式。

`; + if(bookTab==='reviews')return tabs([['全部','全部'],['推荐','推荐'],['一般','一般'],['不行','不行'],['最新','最新']],reviewFilter,'review-filter')+publicReviews.filter(r=>reviewFilter==='全部'||reviewFilter==='最新'||r.type===reviewFilter).map(review=>`
${review.name} · 示例读者${'★'.repeat(review.rating)}${'☆'.repeat(5-review.rating)}

${review.text}

${review.date} · 公开点评示例
`).join(''); + return `

相似推荐示例 · 根据主题与阅读兴趣推荐

${books.filter(b=>b.id!==book.id).slice(0,4).map(bookCard).join('')}
`; +} +function openThought(text, subtitle) { showDetail('想法详情',`
示例内容
${esc(text)}
${esc(subtitle)} · 2026-09-11

这里展示单条想法的完整内容;不生成未经接口提供的评论或点赞列表。

`); } +function handleAction(button) { + const action=button.dataset.action,id=button.dataset.id; + switch(action) { + case 'page':navigate(id);break; + case 'new-goal':openGoalEditor();break; + case 'edit-goal':openGoalEditor(id);break; + case 'goal-detail':openGoalDetail(id);break; + case 'goal-filter':goalFilter=id;renderPage();break; + case 'close-detail':$('#detail').close();break; + case 'close-editor':$('#goal-editor').close();break; + case 'pick-list':{ + const list=booklists.find(l=>l.id===id);list.ids.forEach(bookId=>draftIds.add(bookId)); + if(!draftSources.includes(list.name))draftSources.push(list.name);renderPicker();break; + } + case 'book':openBook(id);break; + case 'list':openList(id);break; + case 'add-book':chooseTarget([id]);break; + case 'add-list':{const list=booklists.find(l=>l.id===id);chooseTarget(list.ids,[list.name]);break;} + case 'append-goal':appendGoal(id);break; + case 'new-with-selection':openGoalEditor(null,pendingBooks,pendingSources);break; + case 'shelf-tab':shelfTab=id;renderPage();break; + case 'period':period=id;renderPage();break; + case 'discover-tab':discoverTab=id;renderPage();break; + case 'retry':dataState='ready';renderPage();break; + case 'notebook':noteBook=id;renderPage();break; + case 'note-type':noteType=id;renderPage();break; + case 'export-notes':exportNotes();break; + case 'personal-note':{const note=personalNotes.find(n=>n.id===id);openThought(note.text,findBook(note.bookId).title+' · 个人笔记示例');break;} + case 'book-tab':bookTab=id;renderBookDetail();break; + case 'chapter':selectedChapter=id;bookTab='popular';renderBookDetail();break; + case 'review-filter':reviewFilter=id;renderBookDetail();break; + case 'review-detail':{const r=publicReviews.find(r=>r.id===id);openThought(r.text,r.name+' · 公开点评示例');break;} + case 'highlight-thoughts':showDetail('划线下的想法',`
${id==='0'?'阅读让我们有机会,在自己的生活之外再生活一次。':'那些认真思考过的问题,会在未来的某一天回应你。'}

原创划线示意

山间来信 · 示例读者2026-09-11

这句话让我想起,每一段阅读经历都有自己的时间。

仅展示一条想法示例,真实内容需分页获取。

`);break; + case 'thought-detail':openThought('这句话让我想起,每一段阅读经历都有自己的时间。','山间来信 · 公开想法示例');break; + case 'author-books':searchQuery=button.dataset.name;discoverTab='books';$('#global-search').value=searchQuery;renderPage();break; + case 'article-search':searchQuery='';discoverTab='article';navigate('discover');break; + case 'search-example':openThought('这是此类搜索结果的详情布局示意。实际内容、可跳转地址及字段以未来接口返回为准。','搜索结果 · '+id);break; + case 'year-report':showDetail('年度回顾',`
2026 / A YEAR IN BOOKS

翻过的每一页,都算数。

128小时42分钟 · 132 个阅读日 · 示例年度数据

偏爱文学,习惯在夜晚阅读。每一次阅读,都是给自己的时间。

年报布局示意,真实年度报告入口只使用服务端返回的链接。

`);break; + } +} +document.addEventListener('click',event=>{ + const action=event.target.closest('[data-action]');if(action){handleAction(action);return;} + const nav=event.target.closest('[data-page]');if(nav){searchQuery='';$('#global-search').value='';navigate(nav.dataset.page);} +}); +document.addEventListener('change',event=>{ + if(event.target.matches('[data-pick-book]')){const id=event.target.dataset.pickBook;event.target.checked?draftIds.add(id):draftIds.delete(id);renderPicker();} + if(event.target.id==='data-state'){dataState=event.target.value;renderPage();} + if(event.target.id==='chapter-filter'){selectedChapter=event.target.value;renderBookDetail();} +}); +$('#goal-start').onchange=()=>{$('#goal-end').min=$('#goal-start').value;}; +$('#goal-name').oninput=()=>$('#goal-name').setCustomValidity(''); +$('#goal-form').onsubmit=saveGoal;$('#picker-search').oninput=renderPicker; +$('#global-search').oninput=event=>{searchQuery=event.target.value.trim();dataState='ready';if(page!=='discover')discoverTab='books';navigate('discover');}; +document.addEventListener('input',event=>{ + if(event.target.id==='discover-search'){ + const position=event.target.selectionStart;searchQuery=event.target.value;$('#global-search').value=searchQuery;renderPage(); + $('#discover-search').focus();$('#discover-search').setSelectionRange(position,position); + } +}); +document.addEventListener('keydown',event=>{if((event.metaKey||event.ctrlKey)&&event.key==='k'){event.preventDefault();$('#global-search').focus();}}); +// 原生 dialog 提供焦点管理与 Escape 关闭;只有点击实际遮罩时才关闭。 +document.querySelectorAll('dialog').forEach(dialog=>dialog.addEventListener('click',event=>{ + const rect=dialog.getBoundingClientRect();if(event.target===dialog&&(event.clientXrect.right||event.clientYrect.bottom))dialog.close(); +})); +navigate('overview');if(storageWarning)toast(storageWarning); diff --git a/web-demo/demo-data.js b/web-demo/demo-data.js new file mode 100644 index 0000000..ea9740a --- /dev/null +++ b/web-demo/demo-data.js @@ -0,0 +1,25 @@ +// 所有数据均为设计示例,不来自真实账号。 +const books = [{title:'也许你该找个人聊聊',short:'也许你该\n找个人\n聊聊',author:'洛莉·戈特利布',en:'MAYBE YOU SHOULD TALK TO SOMEONE',cover:'c1',progress:68,status:'reading',score:'9.1',desc:'一位心理治疗师的回忆录。跟随几个普通人的故事,理解关系、失去与成长,也重新认识自己。'},{title:'三体',short:'三体',author:'刘慈欣',en:'THE THREE-BODY PROBLEM',cover:'c2',progress:42,status:'reading',score:'9.4',desc:'从一段隐秘的往事出发,走进人类与宇宙文明的宏大故事。科学、想象与命运交织,打开另一种观看世界的尺度。'},{title:'蛤蟆先生去看心理医生',short:'蛤蟆先生\n去看\n心理医生',author:'罗伯特·戴博德',en:'COUNSELLING FOR TOADS',cover:'c3',progress:85,status:'reading',score:'8.8',desc:'借由蛤蟆先生与心理咨询师的对话,探索情绪与行为背后的原因。这是一次关于理解自己、为自己负责的旅程。'},{title:'人生海海',short:'人生\n海海',author:'麦家',en:'LIFE IS A VAST SEA',cover:'c4',progress:26,status:'reading',score:'9.0',desc:'在复杂的时代与人情之中,讲述一个人的秘密与命运。人生如海,有暗流,也有让人继续前行的力量。'},{title:'活着',short:'活着',author:'余华',en:'TO LIVE',cover:'c3',progress:100,status:'done',score:'9.5',desc:'一个人与时代相遇的故事,关于生命的韧性与日常的重量。'},{title:'被讨厌的勇气',short:'被讨厌\n的勇气',author:'岸见一郎 / 古贺史健',en:'THE COURAGE TO BE DISLIKED',cover:'c1',progress:100,status:'done',score:'8.6',desc:'以对话的方式讨论人际关系、自我接纳与选择的自由。'},{title:'悉达多',short:'悉达多',author:'赫尔曼·黑塞',en:'SIDDHARTHA',cover:'c4',progress:0,status:'wish',score:'9.2',desc:'一个寻找自我的人,穿过不同的人生经验,在河流边学会倾听。'},{title:'置身事内',short:'置身\n事内',author:'兰小欢',en:'INSIDE THE SYSTEM',cover:'c2',progress:0,status:'wish',score:'9.3',desc:'从具体的经济生活出发,理解政府与经济发展的关系。'}]; +books.forEach((book, index) => { book.id = `b${index}`; }); +const booklists = [ + {id:'l1',name:'在故事里,读懂人生',source:'我的书单',description:'从别人的故事里,找到自己生活的回声。',ids:['b3','b4','b6']}, + {id:'l2',name:'心理学,向内走一程',source:'我的书单',description:'理解情绪与关系,也练习温柔地对待自己。',ids:['b0','b2','b5']}, + {id:'l3',name:'重新认识这个世界',source:'公开书单 · 示例',description:'从宇宙到日常,拓宽理解世界的尺度。',ids:['b1','b7','b6']}, + {id:'l4',name:'适合慢慢读的夜晚',source:'公开书单 · 示例',description:'把时间留给文学,让心绪落在书页之间。',ids:['b4','b6','b0']} +]; +const initialGoals = [ + {id:'g1',name:'秋季文学计划',start:'2026-09-01',end:'2026-11-30',ids:['b3','b4','b6','b1'],sources:['在故事里,读懂人生']}, + {id:'g2',name:'给内心一点生长的空间',start:'2026-09-01',end:'2026-10-31',ids:['b0','b2','b5'],sources:['心理学,向内走一程']}, + {id:'g3',name:'读完的书,成为自己的底气',start:'2026-08-01',end:'2026-08-31',ids:['b4','b5'],sources:[]} +]; +const personalNotes = [ + {id:'n1',bookId:'b0',type:'thought',text:'把注意力还给生活本身,让平凡的日子有迹可循。',date:'2026-09-11'}, + {id:'n2',bookId:'b1',type:'highlight',text:'在辽阔的未知面前,每一个问题都值得被认真对待。',date:'2026-09-10'}, + {id:'n3',bookId:'b2',type:'thought',text:'允许情绪出现,也给自己一些理解它的时间。',date:'2026-09-08'}, + {id:'n4',bookId:'b3',type:'highlight',text:'人生的答案,或许藏在继续向前的日子里。',date:'2026-09-06'} +]; +const publicReviews = [ + {id:'r1',name:'山间来信',rating:5,type:'推荐',text:'适合放慢速度去读。最打动我的,是读完之后还会不断回想的那些问题。',date:'2026-09-10'}, + {id:'r2',name:'晚风书屋',rating:3,type:'一般',text:'有一些有趣的视角,也有需要耐心消化的地方。每个人会读出不同的感受。',date:'2026-09-09'}, + {id:'r3',name:'一页一页',rating:1,type:'不行',text:'这次阅读没有找到共鸣,可能还不是适合我当下阅读的书。',date:'2026-09-08'} +]; diff --git a/web-demo/index.html b/web-demo/index.html new file mode 100644 index 0000000..f390a29 --- /dev/null +++ b/web-demo/index.html @@ -0,0 +1,16 @@ + + + + +阅间 · 微信读书看板 + + + + + +
L
设计预览 · 全部为示例数据目标保存在当前浏览器
阅间 · 与好书相伴,与自己相遇独立设计 Demo · 未连接微信读书账号
+

书籍详情

+
MAKE ROOM FOR READING

新建阅读目标

想读些什么?

选择书籍或加入书单当前书目,重复书籍只算一本,已读完直接计入完成。

+ \ No newline at end of file diff --git a/web-demo/styles.css b/web-demo/styles.css new file mode 100644 index 0000000..c40ae2d --- /dev/null +++ b/web-demo/styles.css @@ -0,0 +1,11 @@ + +:root{--bg:#f7f8fa;--panel:#fff;--text:#242a34;--muted:#9298a4;--line:#edf0f3;--accent:#356ce5;--soft:#edf3ff;--sidebar:#fff;--shadow:0 8px 32px #24355005;--quote:#f8f6f1;--green:#449682} +[data-theme=dark]{--bg:#14171e;--panel:#1d222c;--text:#e7eaf0;--muted:#8892a4;--line:#2c323f;--accent:#80a5ff;--soft:#26344e;--sidebar:#191d26;--shadow:0 8px 32px #0001;--quote:#292820;--green:#75c6ac;color-scheme:dark} +*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:"PingFang SC","Microsoft YaHei",sans-serif;font-size:14px;transition:background .25s,color .25s}button,input{font:inherit}button{cursor:pointer;color:inherit}button:focus-visible,a:focus-visible,input:focus-visible{outline:3px solid var(--accent);outline-offset:4px}button{border:0;background:none}svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;vertical-align:middle}.sidebar{position:fixed;inset:0 auto 0 0;width:218px;padding:39px 23px 24px;background:var(--sidebar);border-right:1px solid var(--line);display:flex;flex-direction:column;z-index:5}.logo{display:flex;align-items:center;gap:11px;font-size:24px;font-weight:650;letter-spacing:2px}.logo-mark{background:#356ce5;color:white;width:37px;height:37px;display:grid;place-items:center;border-radius:12px}.logo-mark svg{width:25px;height:25px}.logo small{display:block;letter-spacing:2px;font-size:9px;color:var(--muted);margin-top:3px;font-weight:500}.navlabel{font-size:10px;color:var(--muted);letter-spacing:1.7px;margin:53px 14px 15px}.nav{display:flex;flex-direction:column;gap:9px}.nav button{text-align:left;padding:14px 17px;border-radius:9px;display:flex;align-items:center;gap:13px;color:#818997}.nav button.active{color:var(--accent);background:var(--soft);font-weight:600}.nav button:hover{background:var(--soft)}.nav em{margin-left:auto;font-size:10px;font-style:normal;background:var(--line);padding:2px 6px;border-radius:4px}.sidebar-bottom{margin-top:auto}.connection{padding:16px 12px;border:1px solid var(--line);border-radius:10px;font-size:12px;line-height:1.9}.dot{display:inline-block;background:var(--green);width:6px;height:6px;border-radius:50%;margin-right:7px}.connection small{display:block;font-size:10px;color:var(--muted)}.profile{display:flex;align-items:center;gap:10px;margin-top:24px;padding:0 8px}.avatar{width:33px;height:33px;border-radius:50%;display:grid;place-items:center;background:#e4eadf;color:#5e7252;font-family:Georgia;font-size:18px}.profile small{display:block;font-size:10px;color:var(--muted);margin-top:4px}.main{margin-left:218px;padding:0 40px 32px;max-width:1800px}.topbar{height:91px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line)}.breadcrumb{font-size:12px;color:var(--muted)}.breadcrumb span{color:var(--text);margin-left:12px}.top-actions{display:flex;align-items:center;gap:20px}.searchbox{display:flex;align-items:center;gap:10px;color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:9px 12px}.searchbox input{background:none;border:0;outline:none;width:180px;color:var(--text);font-size:11px}.key{font-size:10px;border:1px solid var(--line);border-radius:4px;padding:2px 4px}.iconbtn{padding:7px;border:1px solid var(--line);border-radius:8px;background:var(--panel)}.welcome{display:flex;justify-content:space-between;align-items:center;margin:33px 0 27px}.eyebrow{font-size:10px;letter-spacing:2px;color:var(--muted);margin-bottom:10px}h1{font-size:27px;letter-spacing:.5px;margin:0 0 10px;font-weight:600}h1 span{font-family:Georgia;font-size:25px;color:#c3a977}p{margin:0;color:var(--muted);font-size:12px;line-height:1.8}.welcome-right{display:flex;gap:12px;align-items:center}.demo-tag{font-size:10px;padding:6px 9px;background:var(--quote);border:1px solid var(--line);border-radius:5px;color:var(--muted)}.primary{background:#356ce5;color:white;padding:11px 16px;border-radius:7px;font-size:12px}.primary svg{width:15px;height:15px;margin-right:6px}.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-bottom:23px}.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow)}.stat{padding:21px 23px}.stat-label{display:flex;justify-content:space-between;align-items:center;color:var(--muted);font-size:12px}.stat-label svg{width:17px;height:17px;color:#9aa8bf}.stat-value{font-family:Georgia,serif;font-size:34px;letter-spacing:-1px;margin:14px 0 12px}.stat-value small{font-family:"PingFang SC",sans-serif;font-size:11px;color:var(--muted);letter-spacing:0;margin-left:5px}.stat-foot{font-size:10px;color:var(--muted)}.stat-foot b{color:var(--green);font-weight:500;margin-right:7px}.columns{display:grid;grid-template-columns:minmax(0,1fr) 296px;gap:23px}.section-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px}.section-head h2{font-size:15px;font-weight:600;margin:0}.section-head h2 small{font-weight:400;color:var(--muted);font-size:10px;margin-left:10px}.text-button{font-size:11px;color:var(--muted);padding:3px}.text-button:hover{color:var(--accent)}.trend{padding:24px 25px;margin-bottom:23px}.segmented{background:var(--bg);padding:3px;display:flex;border-radius:6px}.segmented button{font-size:10px;padding:5px 12px;color:var(--muted);border-radius:4px}.segmented button.active{background:var(--panel);color:var(--accent);box-shadow:0 1px 5px #0001}.trend-total{font-family:Georgia;font-size:25px;margin-bottom:10px}.trend-total small{font-family:"PingFang SC";font-size:10px;color:var(--muted);margin-left:9px}.chart{height:130px;position:relative;padding-left:30px}.gridlines{position:absolute;inset:0 0 15px 30px;display:flex;flex-direction:column;justify-content:space-between}.gridlines i{border-top:1px dashed var(--line);position:relative}.gridlines i:before{content:attr(data-label);position:absolute;left:-29px;top:-6px;color:var(--muted);font-size:9px;font-style:normal}.bars{display:flex;align-items:end;justify-content:space-around;height:100%;gap:14px;position:relative;padding-bottom:15px}.bar{height:var(--h);max-width:33px;flex:1;background:#dbe6fc;border-radius:4px 4px 0 0;position:relative;transition:height .35s}.bar:nth-child(5){background:#4d7ce7}.bar span{position:absolute;top:calc(100% + 9px);left:50%;transform:translateX(-50%);font-size:9px;color:var(--muted);white-space:nowrap}.bar:hover{background:#7199ef}.bar:hover:before{content:attr(data-tip);position:absolute;bottom:calc(100% + 6px);left:50%;transform:translateX(-50%);white-space:nowrap;background:var(--text);color:var(--panel);padding:5px 7px;font-size:10px;border-radius:4px}.shelf{padding:24px 25px}.tabs{display:flex;gap:25px;border-bottom:1px solid var(--line);margin-top:-4px;margin-bottom:24px}.tabs button{padding:0 0 12px;font-size:11px;color:var(--muted);border-bottom:2px solid transparent}.tabs button.active{color:var(--accent);border-bottom-color:var(--accent)}.books{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:23px}.book{text-align:left;padding:0;min-width:0;transition:transform .2s}.book:hover{transform:translateY(-5px)}.cover{height:160px;width:112px;max-width:100%;border-radius:2px 5px 5px 2px;position:relative;padding:15px 12px;overflow:hidden;box-shadow:5px 8px 13px #17212c20,inset 4px 0 3px #ffffff25;display:flex;flex-direction:column;color:#fff}.cover:after{content:"";position:absolute;inset:0;border-left:4px solid #0002;pointer-events:none}.cover .tiny{font-size:6px;letter-spacing:1px;opacity:.8}.cover .title{font-family:"Songti SC","STSong",serif;line-height:1.3;font-size:22px;margin-top:15px;font-weight:700}.cover .author{font-size:7px;margin-top:10px}.cover .publisher{font-size:6px;margin-top:auto;letter-spacing:1px}.c1{background:#efe9d8;color:#374432}.c1 .title{font-size:19px;letter-spacing:1px;margin-top:15px;z-index:1}.c1:before{content:"";position:absolute;width:130px;height:110px;border:1px solid #73876a66;border-radius:50%;left:-29px;bottom:-24px;box-shadow:0 0 0 8px #72826313,0 0 0 18px #72826313,0 0 0 30px #72826313}.c2{background:#182b3b}.c2 .title{font-size:37px;letter-spacing:6px}.c2:before{content:"";position:absolute;left:20px;bottom:-42px;width:115px;height:115px;border:1px solid #b8855144;border-radius:50%;box-shadow:0 0 0 8px #b8855122,0 0 0 17px #b8855111}.c3{background:#db502e}.c3 .title{font-size:19px;color:#fff3d7}.c3:before{content:"";position:absolute;width:60px;height:60px;background:#f4c66a;bottom:13px;right:-8px;border-radius:50%}.c4{background:#f0eee2;color:#282722}.c4 .title{font-size:24px}.c4:before{content:"";position:absolute;width:90px;height:90px;bottom:-24px;right:-25px;background:repeating-linear-gradient(45deg,#3d6274 0 5px,transparent 5px 10px);transform:rotate(-15deg)}.book h3{font-size:12px;font-weight:500;margin:14px 0 5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.book p{font-size:10px}.progress{height:3px;background:var(--line);border-radius:3px;margin-top:13px}.progress i{display:block;height:100%;background:#8aa7d8;width:var(--progress)}.book-meta{font-size:9px;color:var(--muted);display:flex;justify-content:space-between;margin-top:7px}.rightcol{display:flex;flex-direction:column;gap:23px}.goal{padding:24px}.goal-ring{margin:12px auto 16px;width:142px;height:142px;border-radius:50%;background:conic-gradient(#679483 0 216deg,var(--line) 216deg);padding:9px;transform:rotate(-90deg)}.ring-inner{width:100%;height:100%;border-radius:50%;background:var(--panel);display:flex;flex-direction:column;align-items:center;justify-content:center;transform:rotate(90deg)}.ring-inner strong{font-family:Georgia;font-size:36px;font-weight:400}.ring-inner small{color:var(--muted);font-size:10px;margin-top:5px}.goal-caption{text-align:center;font-size:11px;margin-bottom:18px}.goal-caption span{color:var(--green)}.goal-footer{padding-top:15px;border-top:1px solid var(--line);display:flex;justify-content:space-between;font-size:10px;color:var(--muted)}.goal-footer b{color:var(--text);font-weight:500}.notes{padding:24px}.note{border-left:2px solid #d7bd7e;padding-left:13px;margin:0 0 19px}.note blockquote{font-family:"Songti SC","STSong",serif;font-size:13px;line-height:1.9;margin:0 0 11px}.note small{font-size:9px;color:var(--muted)}.note:last-child{margin-bottom:0}.quote{padding:20px 24px;background:var(--quote);border-radius:12px;position:relative}.quote .eyebrow{font-size:9px;letter-spacing:1.5px}.quote p{font-family:"Songti SC",serif;color:var(--text);font-size:13px;line-height:1.9}.quote small{display:block;text-align:right;margin-top:12px;color:var(--muted);font-size:9px}.footer{display:flex;justify-content:space-between;margin-top:24px;font-size:9px;color:var(--muted)}.empty{padding:40px;text-align:center;color:var(--muted);grid-column:1/-1}.notes-page{display:grid;gap:20px}.notes-page .note{padding:20px;margin:0}.hidden{display:none!important}dialog{border:1px solid var(--line);background:var(--panel);color:var(--text);border-radius:18px;padding:32px;width:520px;max-width:90vw;box-shadow:0 30px 100px #0003}dialog::backdrop{background:#10182877;backdrop-filter:blur(5px)}.dialog-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.dialog-top h2{margin:0;font-size:18px}.detail-body{display:flex;gap:26px;margin-bottom:22px}.detail-info{flex:1}.detail-info h3{font-size:22px;margin:8px 0}.detail-info p{margin:8px 0}.detail-desc{font-size:13px;line-height:2;color:var(--muted)}#toast{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:var(--text);color:var(--panel);padding:13px 23px;border-radius:10px;z-index:30;font-size:12px}.fade{animation:fade .5s ease both}@keyframes fade{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:translateY(0)}}@media(min-width:1500px){.main{padding-left:55px;padding-right:55px}.columns{grid-template-columns:minmax(0,1fr) 330px}.cover{height:185px;width:130px}.chart{height:160px}}@media(max-width:1150px){.sidebar{width:180px;padding-left:16px;padding-right:16px}.main{margin-left:180px;padding:0 24px 24px}.columns{grid-template-columns:minmax(0,1fr) 250px;gap:16px}.books{gap:12px}.cover{height:140px}.stats{gap:12px}.stat{padding:18px 15px}.shelf,.trend{padding:20px}.searchbox input{width:130px}.welcome-right .demo-tag{display:none}}@media(max-width:900px){.stats{grid-template-columns:repeat(2,1fr)}.sidebar{width:76px;padding:28px 12px}.logo{justify-content:center}.logo>div:last-child,.navlabel,.nav button span,.nav em,.sidebar-bottom{display:none}.nav{margin-top:45px}.nav button{padding:14px;justify-content:center}.main{margin-left:76px;padding:0 22px 24px}.columns{grid-template-columns:1fr}.rightcol{display:grid;grid-template-columns:1fr 1fr}.quote{grid-column:1/-1}.cover{height:165px}.welcome-right .primary{font-size:0}.welcome-right .primary svg{margin:0}.stat-value{font-size:28px}.topbar{height:75px}}@media(max-width:600px){.main{padding:0 16px 20px;margin-left:60px}.sidebar{width:60px;padding:25px 6px}.logo-mark{width:33px;height:33px}.nav button{padding:12px}.searchbox{padding:8px}.searchbox input{width:112px}.key,.breadcrumb,.top-actions>.avatar{display:none}.top-actions{width:100%;justify-content:space-between;gap:8px}.welcome{margin-top:25px}h1{font-size:21px}.welcome p{font-size:10px}.eyebrow{font-size:8px}.stats{grid-template-columns:repeat(2,1fr)}.stat{padding:16px}.stat-value{margin:10px 0}.rightcol{display:flex}.books{grid-template-columns:repeat(2,1fr);gap:24px 15px}.cover{height:160px;width:112px}.section-head h2 small{display:none}.tabs{gap:18px}.footer{font-size:8px}.footer span:last-child{display:none}.detail-body{gap:16px}.detail-info h3{font-size:18px}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}} +/* 阅读目标与内容页:与既有主题变量共用色彩。 */ +:root{--muted:#717b8b}[data-theme=dark]{--muted:#a2adbf}h3{font-size:14px;margin:0}button:disabled{opacity:.45;cursor:not-allowed}.demo-banner{display:flex;justify-content:space-between;color:var(--muted);font-size:10px;margin-top:18px}.welcome{margin-top:26px}.page-actions{display:flex;align-items:center;gap:10px}.secondary{padding:10px 15px;border:1px solid var(--line);background:var(--panel);border-radius:7px;font-size:12px}.pill{display:inline-block;padding:5px 8px;font-size:10px;border-radius:5px;background:var(--soft);color:var(--accent);white-space:nowrap}.pill.green{background:#6a9a8219;color:var(--green)}.pill.amber{background:#c3923919;color:#b78a3f}.hint{font-size:11px;color:var(--muted);line-height:1.8}.panel{padding:24px}.panel+.panel{margin-top:20px}.toolbar{display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap;margin:0 0 22px}.toolbar .tabs{margin:0;flex-wrap:wrap}.toolbar input,.toolbar select,.field input,select{border:1px solid var(--line);border-radius:7px;padding:10px 12px;background:var(--panel);color:var(--text);font:inherit;font-size:12px}.toolbar select{max-width:100%}.field{display:flex;flex-direction:column;gap:8px;font-size:12px;margin-bottom:18px}.field input{width:100%;background:var(--bg)}.date-fields{display:grid;grid-template-columns:1fr 1fr;gap:16px}.metrics-row{display:flex;gap:24px;padding:18px 0;margin-bottom:10px;color:var(--muted);font-size:11px}.metrics-row strong{font-family:Georgia;font-size:28px;color:var(--text);margin-right:6px;font-weight:400}.goals-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.goal-card{padding:25px;position:relative;overflow:hidden}.goal-card:before{content:'';position:absolute;inset:0 auto 0 0;width:3px;background:var(--green)}.goal-card h3{font-size:19px;margin:17px 0 8px;word-break:break-word}.goal-card .section-head{margin-bottom:0}.goal-date{font-size:11px;color:var(--muted)}.cover-stack{display:flex;gap:0;margin:24px 0 20px;height:92px;padding-left:4px}.mini-cover{width:66px;height:92px;padding:10px 8px;border-radius:2px 4px 4px 2px;box-shadow:4px 5px 10px #0002;display:flex;flex-direction:column;flex-shrink:0;position:relative;overflow:hidden;border-left:3px solid #0002}.cover-stack .mini-cover{margin-left:-4px;transform:rotate(-3deg);transform-origin:bottom}.cover-stack .mini-cover:nth-child(2n){transform:rotate(4deg)}.mini-cover b{font-family:'Songti SC',serif;font-size:12px;position:relative;z-index:1;line-height:1.5}.mini-cover small{font-size:6px;position:relative;margin-top:auto}.stack-more{align-self:center;margin-left:18px;color:var(--muted);font-size:12px}.goal-progress{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--muted);margin:12px 0 9px}.goal-progress strong{font-size:22px;color:var(--text);font-family:Georgia;font-weight:400}.goal-card .progress{height:5px;margin:0 0 19px}.goal-card .progress i{background:var(--green)}.goal-card-footer{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--line);padding-top:16px}.goal-card-footer small{font-size:10px;color:var(--muted)}.goal-card-footer button{font-size:11px;color:var(--accent)}.goal-intro{display:grid;grid-template-columns:1fr auto;gap:28px;background:var(--quote);padding:26px 30px;margin-bottom:24px;border:1px solid var(--line);border-radius:12px}.goal-intro h2{font-family:'Songti SC',serif;font-size:23px;font-weight:500;margin:0 0 10px}.goal-intro p{max-width:500px}.goal-intro .symbol{font-family:Georgia;font-size:65px;align-self:center;color:#819583}.goal-summary-row{display:block;text-align:left;width:100%;padding:16px 0;border-top:1px solid var(--line)}.goal-summary-row strong{font-size:12px;font-weight:500}.goal-summary-row small{display:block;margin-top:7px;color:var(--muted);font-size:10px}.goal-summary-row .progress{margin-top:10px}.list-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}.list-card{padding:21px;display:block;text-align:left;transition:transform .2s}.list-card:hover{transform:translateY(-3px)}.list-art{height:117px;display:flex;align-items:center;justify-content:center;background:var(--quote);border-radius:7px;margin-bottom:18px}.list-art .mini-cover:nth-child(2){transform:translateY(-5px);margin:0 -4px;z-index:1}.list-card h3{font-size:15px;margin-bottom:8px}.list-card p{font-size:11px}.list-card>small{display:block;color:var(--muted);font-size:10px;margin-top:15px}.full-books{grid-template-columns:repeat(5,minmax(0,1fr));gap:26px}.full-books .cover{height:168px;width:118px}.row-list{display:flex;flex-direction:column}.book-row{display:flex;align-items:center;gap:15px;padding:14px 0;border-bottom:1px solid var(--line)}.book-row:last-child{border:0}.book-row .mini-cover{width:42px;height:58px;padding:5px}.book-row .mini-cover b{font-size:8px}.book-row .mini-cover small{display:none}.book-row-text{flex:1;min-width:0}.book-row-text b{font-size:12px;font-weight:500}.book-row-text p{font-size:10px;margin-top:4px}.book-row .text-button{color:var(--accent)}.book-row-status{font-size:11px;color:var(--green)}.book-row .progress{max-width:200px}.notebook-grid{display:grid;grid-template-columns:230px minmax(0,1fr);gap:24px}.notebook-menu button{display:block;width:100%;text-align:left;border-radius:8px;padding:16px;margin-bottom:7px;border:1px solid transparent}.notebook-menu button.active{background:var(--soft);border-color:var(--line)}.notebook-menu button b{font-size:12px;font-weight:500}.notebook-menu button small{display:block;font-size:10px;margin-top:6px;color:var(--muted)}.note-content{padding:22px;margin:0 0 15px;background:var(--panel);border:1px solid var(--line);border-radius:10px}.note-content blockquote{margin:15px 0;font-family:'Songti SC',serif;font-size:16px;line-height:1.9}.note-content small{color:var(--muted);font-size:10px}.note-original{background:var(--quote);border-left:2px solid #b6a475;padding:12px;font-size:12px;line-height:1.9;margin-top:12px}.detail-tabs{display:flex;gap:19px;border-bottom:1px solid var(--line);margin:25px 0 18px;overflow:auto}.detail-tabs button{white-space:nowrap;font-size:12px;color:var(--muted);padding:0 0 12px;border-bottom:2px solid transparent}.detail-tabs button.active{color:var(--accent);border-color:var(--accent)}#detail{width:760px;max-height:90vh}#goal-editor{width:700px;max-height:90vh}.picker-head{margin:22px 0 10px}.picker-list{max-height:280px;overflow:auto;border:1px solid var(--line);border-radius:8px;margin-top:12px}.pick-row{display:flex;align-items:center;gap:12px;padding:12px 15px;border-bottom:1px solid var(--line);cursor:pointer}.pick-row:last-child{border:0}.pick-row input{accent-color:#356ce5;width:16px;height:16px}.pick-row b{font-size:12px;font-weight:500}.pick-row small{display:block;color:var(--muted);font-size:10px;margin-top:4px}.pick-row .pill{margin-left:auto}.picker-lists{display:flex;gap:7px;flex-wrap:wrap;margin:12px 0}.picker-lists button{border:1px solid var(--line);border-radius:6px;font-size:11px;padding:8px;background:var(--bg)}.picker-lists button.active{background:var(--soft);color:var(--accent)}.editor-footer{display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--line);padding-top:20px;margin-top:12px}.editor-footer>span{font-size:10px;color:var(--muted)}.form-error{color:#bd5151;font-size:12px;margin:12px 0}.insight-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;margin-top:22px}.insight h3{margin-bottom:20px}.insight-line{display:flex;justify-content:space-between;gap:12px;padding:10px 0;color:var(--muted);font-size:11px}.insight-line b{color:var(--text);font-weight:500}.insight .progress{margin-top:5px}.section-space{margin-top:24px}.discovery-hero{padding:27px;background:var(--quote);border-radius:10px;margin-bottom:24px}.discovery-hero h2{font-family:'Songti SC',serif;font-size:22px;font-weight:500;margin:0 0 8px}.status-box{text-align:center;padding:65px 20px}.status-box h3{margin:12px}.status-box button{margin-top:18px}.type-chips{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:20px}.type-chips button{padding:8px 11px;font-size:11px;border-radius:7px;border:1px solid var(--line)}.type-chips button.active{background:var(--soft);color:var(--accent);border-color:transparent}.review-row{border-bottom:1px solid var(--line);padding:18px 0}.review-row p{font-size:13px;color:var(--text);margin-top:12px}.review-row .meta{display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--muted)}.detail-subtitle{margin:15px 0}.book-details-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;font-size:12px}.book-details-grid span{color:var(--muted)}.chapter-row{padding:14px 0;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;font-size:12px}.media-card{display:flex;gap:18px;align-items:center;padding:24px}.media-icon{width:65px;height:65px;flex-shrink:0;background:var(--soft);color:var(--accent);border-radius:14px;display:grid;place-items:center;font-size:27px}.hour-bars{height:58px;display:flex;align-items:end;gap:3px}.hour-bars i{height:var(--height);flex:1;background:#84a4d8;border-radius:2px 2px 0 0}.insight-detail{margin-top:20px}.insight-detail summary{cursor:pointer;font-size:12px;color:var(--accent);padding:15px 0}.source-tag{font-size:10px;color:var(--muted);margin:8px 0}.goal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:22px}.detail-empty{padding:35px;color:var(--muted);font-size:12px;text-align:center}.cover .title{flex-shrink:0}.cover .tiny{font-size:5px}.c1 .title,.c3 .title{font-size:17px}.cover .author{font-size:6px}.cover .publisher{font-size:5px}.trend-total small{display:inline-block;font-size:11px}.trend{margin-bottom:0}.shelf{margin-top:22px}.list-index{color:var(--muted);font-size:10px;margin-right:5px}.summary-goals{margin-bottom:0} +@media(max-width:1200px){.full-books{grid-template-columns:repeat(4,minmax(0,1fr))}.list-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.insight-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:900px){.goals-grid{grid-template-columns:1fr}.columns>.rightcol{display:flex}.notebook-grid{grid-template-columns:1fr}.notebook-menu{display:flex;overflow:auto}.notebook-menu button{min-width:160px}.full-books{grid-template-columns:repeat(3,minmax(0,1fr))}.insight-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.sidebar .nav{gap:9px}.welcome{align-items:flex-start;gap:15px}.welcome h1{line-height:1.4}.welcome .primary{white-space:nowrap}.goal-intro{padding:22px}.demo-banner span:last-child{display:none}}@media(max-width:600px){.full-books{grid-template-columns:repeat(2,minmax(0,1fr))}.list-grid,.insight-grid{grid-template-columns:1fr}.goal-intro{grid-template-columns:1fr}.goal-intro .symbol{display:none}.goal-card{padding:20px}.welcome{flex-direction:column}.welcome .page-actions{align-self:flex-end}.panel{padding:18px}.date-fields{grid-template-columns:1fr;gap:0}.detail-body>.cover{width:95px;flex-shrink:0}.detail-body{gap:15px}.detail-info h3{font-size:18px}.book-details-grid{grid-template-columns:1fr}.toolbar input{width:100%}.metrics-row{gap:16px;flex-wrap:wrap}.metrics-row strong{font-size:23px}.goal-intro h2{font-size:20px}.cover-stack .mini-cover{width:57px}.stack-more{font-size:10px;margin-left:10px}.demo-banner{font-size:9px}.goal-card h3{font-size:17px}dialog{padding:20px}.editor-footer{gap:10px}.book-row{gap:9px}.book-row-text b{font-size:11px}} +.compact-value{font-family:Georgia,'PingFang SC',sans-serif;font-size:25px;line-height:1.5;letter-spacing:-.5px}.stat-foot{line-height:1.7}.insight-detail .insight-grid{margin-top:0}.sidebar .nav button[aria-current=page]{color:var(--accent)} +@media(max-width:600px){.compact-value{font-size:20px}.list-art .mini-cover{width:56px}.full-books .cover{width:105px;height:159px}.goal-card .section-head{gap:10px}.book-row .mini-cover{display:none}.detail-tabs{gap:16px}.date-fields input{min-height:40px}.detail-info .primary{font-size:11px;padding:9px}} +.mini-cover.c2,.mini-cover.c3{color:#fff5df} +.export-preview{width:100%;height:320px;margin-top:20px;border:1px solid var(--line);border-radius:8px;padding:18px;background:var(--bg);color:var(--text);font:12px/1.9 'PingFang SC',sans-serif;resize:vertical} From e3856ccdcf4a38489c5e8c534d88bb066f53acd5 Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 11 Sep 2026 18:21:06 +0800 Subject: [PATCH 05/16] =?UTF-8?q?chore:=20=E5=BF=BD=E7=95=A5=20.workbuddy?= =?UTF-8?q?=20=E5=B7=A5=E4=BD=9C=E5=8C=BA=E8=AE=B0=E5=BF=86=E7=9B=AE?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 7363bf8..0e2e76c 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,6 @@ Thumbs.db # Env .env .server.pid + +# WorkBuddy workspace memory +.workbuddy/ From a114f3f40755f395974645e4972ea5bd6264f8e7 Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 11 Sep 2026 18:21:06 +0800 Subject: [PATCH 06/16] =?UTF-8?q?feat(api):=20=E6=96=B0=E5=A2=9E=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E8=AF=BB=E4=B9=A6=20v2=20=E6=95=B0=E6=8D=AE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新建 api_v2.py,以独立 Flask Blueprint 挂载 /api/v2/*,与既有 /api/* 完全隔离,不影响 v1 接口。 - 提供 status / dashboard / shelf / notebooks / notes / book / reviews / highlights / underline-thoughts / thought / archives / recommend / search 等接口 - 进程内 TTL 缓存降低接口调用频次;MySQL 不可用时返回 degraded 降级标记 - 阅读状态按 finish_reading / progress / 近 30 天阅读记录综合判定 - 周月维度缺少偏好画像时回退 overall 口径补齐,并标注 preference_source - app.py 注册 Blueprint;__main__ 端口改为读取 PORT 环境变量 --- api_v2.py | 1677 +++++++++++++++++++++++++++++++++++++++++++++++++++++ app.py | 11 +- 2 files changed, 1686 insertions(+), 2 deletions(-) create mode 100644 api_v2.py diff --git a/api_v2.py b/api_v2.py new file mode 100644 index 0000000..3d938e3 --- /dev/null +++ b/api_v2.py @@ -0,0 +1,1677 @@ +#!/usr/bin/env python3 +""" +阅间 · 微信读书看板 v2 数据接口层 +================================== +为 v2 前端(阅间设计版)提供数据聚合接口。 + +设计原则: + 1. 不修改 v1 的任何接口,v2 全部挂在 /api/v2/* 下 + 2. 以微信读书 Agent Gateway 实时数据为主、本地 MySQL 为缓存与聚合补充 + 3. MySQL 不可用时降级运行(实时接口仍可用),只在响应里标注 degraded + 4. 热点接口带进程内 TTL 缓存,避免频繁打微信读书接口 + +作者:WorkBuddy +创建时间:2026-09-11 +""" + +import hashlib +import json +import os +import time +import urllib.error +import urllib.request +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime, timedelta, timezone +from functools import wraps + +import pymysql +from flask import Blueprint, jsonify, request + +v2_bp = Blueprint("v2", __name__) + +# ====================================================================== +# 配置 +# ====================================================================== + +WEREAD_API_URL = os.environ.get("WEREAD_API_URL", "https://i.weread.qq.com/api/agent/gateway") +WEREAD_API_KEY = os.environ.get("WEREAD_API_KEY", "") +WEREAD_SKILL_VERSION = os.environ.get("WEREAD_SKILL_VERSION", "1.0.4") + +MYSQL_CONFIG = { + "host": os.environ.get("WEREAD_DB_HOST", "127.0.0.1"), + "port": int(os.environ.get("WEREAD_DB_PORT", 3306)), + "user": os.environ.get("WEREAD_DB_USER", "root"), + "password": os.environ.get("WEREAD_DB_PASSWORD", "258963"), + "database": os.environ.get("WEREAD_DB_NAME", "weread_dashboard"), + "charset": "utf8mb4", + "cursorclass": pymysql.cursors.DictCursor, + "connect_timeout": 5, +} + +CST = timezone(timedelta(hours=8)) + +# 进程内缓存 {key: (expire_ts, value)} +_CACHE = {} +_CACHE_LOCK = None + + +def cached(key, ttl, producer): + """带 TTL 的进程内缓存;producer 抛异常时不写缓存。""" + now = time.time() + hit = _CACHE.get(key) + if hit and hit[0] > now: + return hit[1] + value = producer() + _CACHE[key] = (now + ttl, value) + return value + + +# ====================================================================== +# 微信读书接口调用 +# ====================================================================== + + +class WeReadError(RuntimeError): + """微信读书接口调用异常。""" + + +def weapi(api_name, ttl=0, **kwargs): + """ + 调用微信读书 Agent Gateway。 + + Args: + api_name: 接口名,如 "/readdata/detail" + ttl: 进程内缓存秒数,0 表示不缓存 + **kwargs: 业务参数(平铺在 body 顶层) + """ + if not WEREAD_API_KEY: + raise WeReadError("WEREAD_API_KEY 未设置") + + cache_key = f"api:{api_name}:{json.dumps(kwargs, sort_keys=True, ensure_ascii=False)}" + + def _produce(): + body = {"api_name": api_name, "skill_version": WEREAD_SKILL_VERSION} + body.update(kwargs) + req = urllib.request.Request( + WEREAD_API_URL, + data=json.dumps(body).encode("utf-8"), + headers={ + "Authorization": f"Bearer {WEREAD_API_KEY}", + "Content-Type": "application/json", + }, + method="POST", + ) + try: + with urllib.request.urlopen(req, timeout=25) as resp: + data = json.loads(resp.read().decode("utf-8")) + except urllib.error.HTTPError as e: + raise WeReadError(f"{api_name} 调用失败: HTTP {e.code}") + except Exception as e: # noqa: BLE001 + raise WeReadError(f"{api_name} 调用失败: {e}") + + errcode = data.get("errcode") + if errcode: + raise WeReadError(f"{api_name} 返回错误 {errcode}: {data.get('errmsg', '')}") + return data + + if ttl: + return cached(cache_key, ttl, _produce) + return _produce() + + +def weapi_safe(api_name, ttl=0, default=None, **kwargs): + """调用失败时返回 default,不抛异常(用于可降级的数据项)。""" + try: + return weapi(api_name, ttl=ttl, **kwargs) + except Exception: # noqa: BLE001 + return default + + +# ====================================================================== +# 数据库(可降级) +# ====================================================================== + + +def db_or_none(): + """返回 MySQL 连接;不可用时返回 None(接口降级运行)。""" + try: + return pymysql.connect(**MYSQL_CONFIG) + except Exception: # noqa: BLE001 + return None + + +def with_db(f): + """ + 装饰器:注入关键字参数 conn(可能为 None)与 degraded 标记。 + 请求结束后关闭连接。 + """ + + @wraps(f) + def wrapper(*args, **kwargs): + conn = db_or_none() + try: + result = f(conn=conn, *args, **kwargs) + return result + finally: + if conn: + conn.close() + + return wrapper + + +def query_all(conn, sql, params=None): + if not conn: + return [] + with conn.cursor() as cur: + cur.execute(sql, params or ()) + return list(cur.fetchall()) + + +def query_one(conn, sql, params=None): + rows = query_all(conn, sql, params) + return rows[0] if rows else None + + +# ====================================================================== +# 格式化与展示辅助 +# ====================================================================== + + +def ts_to_date(ts): + """时间戳 → YYYY-MM-DD。""" + try: + ts = int(ts) + except (TypeError, ValueError): + return "" + if ts <= 0: + return "" + return datetime.fromtimestamp(ts, tz=CST).strftime("%Y-%m-%d") + + +def duration_str(seconds): + """秒 → X小时Y分钟 / Y分钟。""" + seconds = int(seconds or 0) + hours, minutes = seconds // 3600, (seconds % 3600) // 60 + if hours > 0: + return f"{hours}小时{minutes}分钟" + return f"{minutes}分钟" + + +def cover_class(book_id): + """按 book_id 稳定映射到设计稿的 4 种封面底色(c1~c4)。""" + digest = hashlib.md5(str(book_id).encode("utf-8")).hexdigest() + return f"c{int(digest[:8], 16) % 4 + 1}" + + +def short_title(title): + """把书名切成封面上的短行(最多 3 行)。""" + text = (title or "").strip() + for ch in "《》": + text = text.replace(ch, "") + # 去掉括号里的副标题,封面只留主书名 + for left, right in (("(", ")"), ("(", ")"), ("【", "】"), ("[", "]")): + while left in text and right in text: + start = text.index(left) + end = text.index(right, start) + text = text[:start] + text[end + 1 :] + text = text.split("·")[0].strip() + if not text: + text = (title or "未命名").strip() + if len(text) <= 5: + return text + # 按标点优先断行,其次按长度均分 + for sep in (":", ":", ",", ",", " "): + if sep in text: + head = text.split(sep)[0] + if 2 <= len(head) <= 8: + return head + line_count = 3 if len(text) > 10 else 2 + size = (len(text) + line_count - 1) // line_count + return "\n".join(text[i : i + size] for i in range(0, len(text), size)) + + +def norm_progress(value): + """进度统一到 0~100 的整数。""" + try: + value = float(value or 0) + except (TypeError, ValueError): + return 0 + if value <= 0: + return 0 + if value > 100: # 有的字段是万分比 + value = value / 100 + return max(0, min(100, int(round(value)))) + + +RECENT_DAYS = 30 # 「在读」判定窗口:有进度,或最近 30 天内有阅读记录 + + +def book_status(finish, progress, read_update_time, recent_days=RECENT_DAYS): + """ + 书籍状态口径: + done —— 已读完(接口 finish_reading=1) + reading—— 有阅读进度(0= cutoff: + return "reading" + return "wish" + + +def make_book( + book_id, + title, + author=None, + category=None, + finish=0, + read_update_time=0, + cover_url=None, + deep_link=None, + progress=None, + rating=None, + read_time=None, + intro=None, +): + """ + 组装成 v2 前端使用的书籍结构(字段名与设计稿一致)。 + """ + finish = int(finish or 0) + read_update_time = int(read_update_time or 0) + if progress is None: + progress = 100 if finish else 0 + if rating: + score = round(float(rating) / 100, 1) # 771 → 7.7 → 前端展示 77/100 + else: + score = None + return { + "id": str(book_id), + "bookId": str(book_id), + "title": title or "未命名", + "short": short_title(title), + "author": author or "佚名", + "en": "", + "cover": cover_class(book_id), + "cover_url": cover_url or "", + "progress": norm_progress(progress), + "status": book_status(finish, progress, read_update_time), + "score": score, + "desc": intro or (f"书架中「{category}」分类的藏书。" if category else "书架中的藏书。"), + "category": category or "", + "read_time": read_time or 0, + "read_time_str": duration_str(read_time) if read_time else "", + "read_update_time": ts_to_date(read_update_time), + "finish_reading": finish, + "deep_link": deep_link or "", + } + + +# ====================================================================== +# 书架:实时数据 + 本地进度/评分缓存合并 +# ====================================================================== + + +def shelf_counts(payload): + """按接口规范统计书架条目:电子书 + 专辑 + 文章收藏入口。""" + books = payload.get("books") or [] + albums = payload.get("albums") or [] + has_mp = 1 if payload.get("mp") else 0 + return { + "ebooks": len(books), + "albums": len(albums), + "mp": has_mp, + "total": len(books) + len(albums) + has_mp, + "archives": len(payload.get("archive") or []), + } + + +def shelf_payload(): + """书架原始数据(缓存 10 分钟)。""" + return weapi("/shelf/sync", ttl=600) + + +def progress_map(conn): + """从本地缓存表收集阅读进度:notebooks.reading_progress 优先,其次 book_progress。""" + result = {} + for row in query_all( + conn, + "SELECT book_id, reading_progress AS p FROM notebooks WHERE reading_progress > 0", + ): + result[str(row["book_id"])] = row["p"] + for row in query_all( + conn, "SELECT book_id, progress AS p FROM book_progress WHERE progress > 0" + ): + result.setdefault(str(row["book_id"]), row["p"]) + return result + + +def rating_map(conn): + """从本地缓存表收集评分(0~1000)。""" + rows = query_all(conn, "SELECT book_id, new_rating AS r FROM book_details WHERE new_rating > 0") + return {str(row["book_id"]): row["r"] for row in rows} + + +def intro_map(conn): + rows = query_all(conn, "SELECT book_id, intro, word_count FROM book_details") + return {str(row["book_id"]): row for row in rows} + + +def persist_detail(conn, bid, info): + """把书籍基本信息写入缓存表(供后续快速读取评分/简介)。""" + if not conn or not info: + return + rating_detail = info.get("newRatingDetail") + try: + with conn.cursor() as cur: + cur.execute( + "REPLACE INTO book_details " + "(book_id, title, author, translator, cover, intro, category, publisher, " + "publish_time, isbn, word_count, new_rating, new_rating_count, new_rating_detail, deep_link) " + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", + ( + str(bid), + info.get("title", ""), + info.get("author", ""), + info.get("translator", ""), + info.get("cover", ""), + info.get("intro", ""), + info.get("category", ""), + info.get("publisher", ""), + info.get("publishTime", ""), + info.get("isbn", ""), + info.get("wordCount") or 0, + info.get("newRating") or 0, + info.get("newRatingCount") or 0, + json.dumps(rating_detail, ensure_ascii=False) if isinstance(rating_detail, dict) else None, + info.get("deepLink", ""), + ), + ) + conn.commit() + except Exception: # noqa: BLE001 + pass + + +def persist_progress(conn, bid, info): + """把阅读进度写入缓存表。""" + if not conn or not info: + return + try: + with conn.cursor() as cur: + cur.execute( + "REPLACE INTO book_progress " + "(book_id, progress, chapter_uid, chapter_offset, update_time, update_time_dt, " + "record_reading_time, finish_time, finish_time_dt, is_start_reading) " + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", + ( + str(bid), + int(info.get("progress") or 0), + info.get("chapter_uid") or 0, + info.get("chapter_offset") or 0, + info.get("update_time") or 0, + ts_to_datetime(info.get("update_time") or 0), + int(info.get("record_reading_time") or 0), + info.get("finish_time") or 0, + ts_to_datetime(info.get("finish_time") or 0), + info.get("is_start_reading") or 0, + ), + ) + conn.commit() + except Exception: # noqa: BLE001 + pass + + +def ts_to_datetime(ts): + try: + ts = int(ts) + except (TypeError, ValueError): + return None + if ts <= 0: + return None + return datetime.fromtimestamp(ts, tz=CST).strftime("%Y-%m-%d %H:%M:%S") + + +def enrich_books(conn, book_ids, with_rating=True, workers=6): + """ + 首屏富化:并发补齐阅读进度(并可同时补评分),结果写入本地缓存表, + 下次访问直接命中缓存。返回 {book_id: {progress, rating, ...}}。 + """ + book_ids = [str(b) for b in book_ids if b] + if not book_ids: + return {} + + def one(bid): + result = {"progress": None, "rating": None} + prog = weapi_safe("/book/getprogress", ttl=600, bookId=bid) + if prog: + book = prog.get("book") or {} + result["progress"] = { + "progress": norm_progress(book.get("progress")), + "record_reading_time": book.get("recordReadingTime") or 0, + "finish_time": book.get("finishTime") or 0, + "update_time": book.get("updateTime") or 0, + "is_start_reading": book.get("isStartReading") or 0, + "chapter_uid": book.get("chapterUid") or 0, + "chapter_offset": book.get("chapterOffset") or 0, + } + persist_progress(conn, bid, result["progress"]) + if with_rating: + info = weapi_safe("/book/info", ttl=1800, bookId=bid) + if info and info.get("newRating"): + result["rating"] = info.get("newRating") + persist_detail(conn, bid, info) + return bid, result + + with ThreadPoolExecutor(max_workers=workers) as pool: + return {bid: info for bid, info in pool.map(one, book_ids)} + + +def shelf_books(conn, with_progress=False, progress_limit=30): + """ + 书架书籍列表(设计稿字段结构)。 + + Args: + with_progress: 是否富化首屏书籍(实时补拉进度与评分,并写入本地缓存) + progress_limit: 单次富化的最大本数 + """ + payload = shelf_payload() + known_progress = progress_map(conn) + known_rating = rating_map(conn) + + rows = payload.get("books") or [] + books = [] + for row in rows: + bid = str(row.get("bookId") or "") + if not bid: + continue + books.append( + make_book( + bid, + row.get("title"), + row.get("author"), + row.get("category"), + finish=row.get("finishReading"), + read_update_time=row.get("readUpdateTime"), + cover_url=row.get("cover"), + deep_link=row.get("deepLink"), + progress=known_progress.get(bid), + rating=known_rating.get(bid), + ) + ) + + # 首屏富化:进度与评分缺失的书并发补齐(结果落库,下次直接命中缓存) + if with_progress: + missing = [b["id"] for b in books if b["id"] not in known_progress or b["id"] not in known_rating] + enriched = enrich_books(conn, missing[:progress_limit]) + for book in books: + info = enriched.get(book["id"]) + if not info: + continue + prog = info.get("progress") + if prog: + if prog["progress"]: + book["progress"] = prog["progress"] + if prog["record_reading_time"]: + book["read_time"] = prog["record_reading_time"] + book["read_time_str"] = duration_str(prog["record_reading_time"]) + if prog["finish_time"]: + book["status"] = "done" + elif not book["read_update_time"] and prog["update_time"]: + book["read_update_time"] = ts_to_date(prog["update_time"]) + if info.get("rating"): + book["score"] = round(float(info["rating"]) / 100, 1) + if book["status"] != "done": + book["status"] = book_status(book["finish_reading"], book["progress"], int(_ts(book["read_update_time"])), 30) + + return books, payload + + +def _ts(date_text): + """YYYY-MM-DD → 时间戳(无法解析返回 0)。""" + if not date_text: + return 0 + try: + return int(datetime.strptime(date_text, "%Y-%m-%d").replace(tzinfo=CST).timestamp()) + except ValueError: + return 0 + + +# ====================================================================== +# 接口:连接状态 +# ====================================================================== + + +@v2_bp.route("/api/v2/status") +@with_db +def api_v2_status(conn): + """前端顶栏/横幅使用:数据源连接状态与书架规模。""" + db_ok = conn is not None + counts, err = None, None + try: + payload = shelf_payload() + counts = shelf_counts(payload) + except Exception as e: # noqa: BLE001 + err = str(e) + + fetch_time = "" + row = query_one(conn, "SELECT value FROM fetch_meta WHERE `key`='last_fetch_time'") + if row: + fetch_time = row["value"] + + return jsonify( + { + "ok": bool(counts), + "api_key_set": bool(WEREAD_API_KEY), + "database": "connected" if db_ok else "disconnected", + "fetch_time": fetch_time, + "counts": counts, + "error": err, + "degraded": not db_ok, + } + ) + + +# ====================================================================== +# 接口:阅读概览(趋势 + 统计 + 洞察,一次请求返回整页数据) +# ====================================================================== + +PERIOD_MODE = {"week": "weekly", "month": "monthly", "year": "annually", "overall": "overall"} +PERIOD_HINT = {"week": "本周", "month": "本月", "year": "本年", "overall": "总计"} + + +def natural_days(period, regist_time=0): + """周期自然天数(未满周期按已过天数计)。""" + now = datetime.now(tz=CST) + if period == "week": + return 7 + if period == "month": + return now.day + if period == "year": + return now.timetuple().tm_yday + if regist_time: + try: + start = datetime.fromtimestamp(int(regist_time), tz=CST) + return max(1, (now - start).days + 1) + except (ValueError, OSError): + return 365 + return 365 + + +def build_trend(period, read_times): + """把 readTimes 字典转成设计稿柱状图数据。""" + items = sorted(((int(k), int(v or 0)) for k, v in (read_times or {}).items()), key=lambda x: x[0]) + + is_hour_unit = period in ("year", "overall") + + def shown(duration): + return round(duration / 3600, 1) if is_hour_unit else int(round(duration / 60)) + + # 去掉首尾「折算后为 0」的空桶(未到的月份 / 注册初期的年份) + while len(items) > 1 and shown(items[-1][1]) == 0: + items.pop() + while len(items) > 1 and shown(items[0][1]) == 0: + items.pop(0) + + labels, values, seconds = [], [], [] + for ts, duration in items: + dt = datetime.fromtimestamp(ts, tz=CST) + if period == "week": + labels.append("一二三四五六日"[dt.weekday()]) + elif period == "month": + labels.append(f"{dt.day}日") + elif period == "year": + labels.append(f"{dt.month}月") + else: + labels.append(str(dt.year)) + values.append(shown(duration)) + seconds.append(duration) + + total_seconds = sum(seconds) + return { + "labels": labels, + "values": values, + "unit": "时" if is_hour_unit else "分", + "minutes": round(total_seconds / 60, 1), + "total_seconds": total_seconds, + } + + +def dedupe_by_book(items, key="bookId", limit=None): + """按书籍去重(接口返回里同一本书可能出现多条)。""" + seen, out = set(), [] + for item in items or []: + k = item.get(key) or item.get("book_id") or item.get("title") + if k in seen: + continue + seen.add(k) + out.append(item) + return out[:limit] if limit else out + + +@v2_bp.route("/api/v2/dashboard") +@with_db +def api_v2_dashboard(conn): + """ + 阅读概览整页数据:周期趋势、统计卡、读得最多、偏好方向、时段分布、阅读画像。 + Query: period=week|month|year|overall(默认 week) + """ + period = request.args.get("period", "week") + if period not in PERIOD_MODE: + period = "week" + mode = PERIOD_MODE[period] + + data = weapi_safe("/readdata/detail", ttl=300, mode=mode, **({"baseTime": 0} if mode != "overall" else {})) + if not data: + return jsonify({"error": "阅读统计获取失败,请稍后重试"}), 502 + + # 周/月维度接口不回偏好画像字段,缺失项用「总计」口径补齐并标注来源 + pref_source = "period" + pref_data = data + if mode != "overall" and not (data.get("preferCategory") and data.get("preferTime")): + fallback = weapi_safe("/readdata/detail", ttl=600, mode="overall") or {} + if fallback: + pref_source = "overall" + merged = dict(fallback) + for k in ("preferCategory", "preferTime", "preferAuthor", "preferCp", "preferPublisher", "medals", "preferCategoryWord", "preferTimeWord", "preferBooks"): + if data.get(k): + merged[k] = data[k] + pref_data = merged + + trend = build_trend(period, data.get("readTimes") or {}) + total_seconds = int(data.get("totalReadTime") or trend["total_seconds"] or 0) + total_minutes = total_seconds / 60 + read_days = int(data.get("readDays") or 0) + days = natural_days(period, data.get("registTime")) + + # 笔记口径:本地笔记本合计(全量);周期口径见 readStat + note_row = query_one( + conn, + "SELECT COALESCE(SUM(review_count),0) AS review, COALESCE(SUM(note_count),0) AS note, " + "COALESCE(SUM(bookmark_count),0) AS bookmark, COUNT(*) AS books FROM notebooks", + ) or {} + note_review = int(note_row.get("review") or 0) + note_note = int(note_row.get("note") or 0) + note_bookmark = int(note_row.get("bookmark") or 0) + note_total = note_review + note_note + note_bookmark + note_books = int(note_row.get("books") or 0) + + stats = [ + { + "label": "阅读 / 收听时长", + "value": duration_str(total_seconds), + "hint": f"{PERIOD_HINT[period]}合计", + "icon": "clock", + }, + { + "label": "有效阅读天数", + "value": f"{read_days}天", + "hint": "单日满 1 分钟计一天", + "icon": "flag", + }, + { + "label": "自然日均阅读", + "value": f"{round(total_minutes / days)}分钟" if days else "0分钟", + "hint": f"按 {days} 个自然日折算", + "icon": "chart", + }, + { + "label": "笔记总数", + "value": f"{note_total}条", + "hint": f"划线 {note_note} · 想法 {note_review} · 书签 {note_bookmark}", + "icon": "note", + }, + ] + + # 读得最多(周期内) + top_books = [] + for item in dedupe_by_book(data.get("readLongest") or [], limit=3): + book = item.get("book") or {} + album = item.get("albumInfo") or {} + top_books.append( + { + "id": str(book.get("bookId") or album.get("albumId") or ""), + "title": book.get("title") or album.get("name") or "", + "author": book.get("author") or album.get("authorName") or "", + "read_time": int(item.get("readTime") or 0), + "read_time_str": duration_str(item.get("readTime") or 0), + } + ) + + # 偏爱的阅读方向(按分类合并同年份重复条目,权重归一化到 100) + cat_agg = {} + for cat in pref_data.get("preferCategory") or []: + title = cat.get("categoryTitle") or "" + if not title: + continue + entry = cat_agg.setdefault( + title, + {"title": title, "parent": cat.get("parentCategoryTitle") or "", "seconds": 0, "count": 0}, + ) + entry["seconds"] += int(cat.get("readingTime") or 0) + entry["count"] += int(cat.get("readingCount") or 0) + ranked = sorted(cat_agg.values(), key=lambda c: c["seconds"], reverse=True)[:3] + max_seconds = max([c["seconds"] for c in ranked] or [0]) or 1 + cats = [ + { + "title": c["title"], + "parent": c["parent"], + "val": max(1, round(c["seconds"] / max_seconds * 100)), + "reading_time_str": duration_str(c["seconds"]), + "reading_count": c["count"], + } + for c in ranked + ] + max_val = max([c["val"] for c in cats] or [0]) or 1 + + # 留给自己的时段(接口按 06:00 起 24 个桶返回) + prefer_time = list(pref_data.get("preferTime") or []) + hours = [(6 + i) % 24 for i in range(len(prefer_time))] + max_hour = max(prefer_time) if prefer_time else 0 + peak_hour = hours[prefer_time.index(max_hour)] if max_hour else None + + # 阅读画像 + authors = [] + for a in dedupe_by_book(pref_data.get("preferAuthor") or [], key="name", limit=3): + authors.append({"name": a.get("name") or "", "count": a.get("count") or 0, "read_time": a.get("readTime") or ""}) + publishers = [ + {"name": p.get("name") or "", "count": p.get("count") or 0} + for p in dedupe_by_book(pref_data.get("preferPublisher") or [], key="name", limit=3) + ] + cps = [ + {"name": (cp.get("copyrightInfo") or {}).get("name") or "", "count": cp.get("count") or 0} + for cp in dedupe_by_book(pref_data.get("preferCp") or [], key="name", limit=3) + ] + medals = [] + for m in dedupe_by_book(pref_data.get("medals") or [], key="name", limit=8): + medals.append( + { + "name": m.get("name") or m.get("title") or "", + "detail": m.get("rankText") or m.get("hint") or "", + "date": ts_to_date(m.get("ctime") or 0), + } + ) + rank = data.get("rank") or pref_data.get("rank") or {} + + read_stat = {s.get("stat"): s.get("counts") for s in (pref_data.get("readStat") or [])} + regists = ts_to_date(pref_data.get("registTime") or data.get("registTime") or 0) + + # 年度小结(真实数据,用于“年度回顾”弹窗) + year_data = data if mode == "annually" else weapi_safe("/readdata/detail", ttl=300, mode="annually", baseTime=0) + year_summary = {} + if year_data: + year_stat = {s.get("stat"): s.get("counts") for s in (year_data.get("readStat") or [])} + year_top = dedupe_by_book(year_data.get("readLongest") or [], limit=3) + year_summary = { + "year": datetime.now(tz=CST).year, + "total_seconds": int(year_data.get("totalReadTime") or 0), + "duration_str": duration_str(year_data.get("totalReadTime") or 0), + "read_days": int(year_data.get("readDays") or 0), + "prefer_category": year_data.get("preferCategoryWord") or "", + "prefer_time": year_data.get("preferTimeWord") or "", + "read_count": year_stat.get("读过") or "", + "finish_count": year_stat.get("读完") or "", + "note_count": year_stat.get("笔记") or "", + "top_books": [ + { + "title": (t.get("book") or {}).get("title") or (t.get("albumInfo") or {}).get("name") or "", + "read_time_str": duration_str(t.get("readTime") or 0), + } + for t in year_top + ], + } + + return jsonify( + { + "period": period, + "mode": mode, + "trend": trend, + "stats": stats, + "top_books": top_books, + "categories": { + "items": cats, + "max_val": max_val, + "word": pref_data.get("preferCategoryWord") or "", + }, + "time_distribution": { + "values": prefer_time, + "hours": hours, + "max": max_hour, + "peak_hour": peak_hour, + "word": pref_data.get("preferTimeWord") or "", + }, + "authors": authors, + "publishers": publishers, + "cps": cps, + "medals": medals, + "rank": rank, + "read_stat": read_stat, + "prefer_words": { + "category": pref_data.get("preferCategoryWord") or "", + "time": pref_data.get("preferTimeWord") or "", + "records": pref_data.get("readRecordsWord") or "", + "distribution": pref_data.get("readDistributionWord") or "", + }, + "preference_source": pref_source, + "notes": { + "total": note_total, + "review": note_review, + "note": note_note, + "bookmark": note_bookmark, + "books": note_books, + }, + "regist_time": regists, + "year_summary": year_summary, + "degraded": conn is None, + } + ) + + +# ====================================================================== +# 接口:书架 +# ====================================================================== + +SHELF_TABS = ("all", "reading", "done", "wish", "lists", "audio", "articles") + + +@v2_bp.route("/api/v2/shelf") +@with_db +def api_v2_shelf(conn): + """ + 书架数据。 + Query: + tab: all|reading|done|wish|lists|audio|articles + keyword: 书名/作者筛选 + limit/offset: 分页(默认全部返回,前端做本地筛选时传 tab=all) + progress: 1 时为首屏书籍实时补拉进度 + """ + tab = request.args.get("tab", "all") + keyword = (request.args.get("keyword") or "").strip().lower() + limit = request.args.get("limit", type=int) + offset = request.args.get("offset", type=int, default=0) + with_progress = request.args.get("progress", "0") == "1" + + try: + books, payload = shelf_books(conn, with_progress=with_progress) + except WeReadError as e: + return jsonify({"error": str(e)}), 502 + + counts = shelf_counts(payload) + counts.update( + { + "reading": sum(1 for b in books if b["status"] == "reading"), + "done": sum(1 for b in books if b["status"] == "done"), + "wish": sum(1 for b in books if b["status"] == "wish"), + } + ) + + if keyword: + books = [b for b in books if keyword in (b["title"] + b["author"] + b["category"]).lower()] + if tab in ("reading", "done", "wish"): + books = [b for b in books if b["status"] == tab] + elif tab == "all": + pass + + total = len(books) + page_books = books[offset : offset + limit] if limit else books[offset:] + + archives = [] + for arc in payload.get("archive") or []: + ids = [str(i) for i in (arc.get("bookIds") or [])] + archives.append( + { + "id": arc.get("name") or "", + "name": arc.get("name") or "", + "source": "我的书单", + "description": f"书架书单 · 收录 {len(ids)} 本", + "ids": ids, + "book_count": len(ids), + "album_ids": arc.get("albumIds") or [], + } + ) + + albums = [ + { + "id": str(a.get("albumId") or ""), + "title": a.get("name") or "", + "author": a.get("authorName") or "", + "cover": a.get("cover") or "", + "count": a.get("trackCount") or 0, + "finish": a.get("finish") or 0, + "intro": a.get("intro") or "", + } + for a in (payload.get("albums") or []) + ] + + mp = payload.get("mp") or {} + + return jsonify( + { + "tab": tab, + "counts": counts, + "total": total, + "books": page_books, + "lists": archives, + "albums": albums, + "mp": {"title": (mp.get("book") or {}).get("title") or "", "show": mp.get("show") or 0}, + "degraded": conn is None, + } + ) + + +# ====================================================================== +# 接口:笔记本与笔记 +# ====================================================================== + + +@v2_bp.route("/api/v2/notebooks") +@with_db +def api_v2_notebooks(conn): + """笔记本概览(有笔记的书 + 各自数量),本地库数据。""" + rows = query_all( + conn, + "SELECT book_id, title, author, cover, review_count, note_count, bookmark_count, " + "reading_progress, marked_status FROM notebooks " + "ORDER BY (review_count + note_count + bookmark_count) DESC", + ) + items = [] + for row in rows: + total = int(row["review_count"] or 0) + int(row["note_count"] or 0) + int(row["bookmark_count"] or 0) + items.append( + { + "id": str(row["book_id"]), + "bookId": str(row["book_id"]), + "title": row["title"], + "author": row["author"], + "cover": cover_class(row["book_id"]), + "cover_url": row["cover"], + "review_count": int(row["review_count"] or 0), + "note_count": int(row["note_count"] or 0), + "bookmark_count": int(row["bookmark_count"] or 0), + "total_notes": total, + "progress": norm_progress(row["reading_progress"]), + } + ) + totals = { + "books": len(items), + "notes": sum(i["total_notes"] for i in items), + "highlights": sum(i["note_count"] for i in items), + "thoughts": sum(i["review_count"] for i in items), + "bookmarks": sum(i["bookmark_count"] for i in items), + } + return jsonify({"items": items, "totals": totals, "degraded": conn is None}) + + +@v2_bp.route("/api/v2/notes") +@with_db +def api_v2_notes(conn): + """ + 某本书的划线与想法(实时接口)。 + Query: book_id(必填);book_id=all 时聚合笔记最多的前 N 本(limit 默认 4) + """ + book_id = (request.args.get("book_id") or "").strip() + if not book_id: + return jsonify({"error": "book_id is required"}), 400 + + if book_id == "all": + limit = request.args.get("limit", type=int, default=4) + rows = query_all( + conn, + "SELECT book_id FROM notebooks ORDER BY (review_count + note_count + bookmark_count) DESC LIMIT %s", + (limit,), + ) + collected, counts = [], {"highlights": 0, "thoughts": 0, "bookmarks": 0} + books_meta = [] + for row in rows: + bid = str(row["book_id"]) + detail = collect_notes(bid) + if not detail: + continue + meta = notes_book_meta(conn, bid) + books_meta.append(meta) + for h in detail["highlights"]: + collected.append({**h, "bookId": bid, "book_title": meta["title"], "type": "highlight"}) + for t in detail["thoughts"]: + collected.append({**t, "bookId": bid, "book_title": meta["title"], "type": "thought"}) + counts["highlights"] += len(detail["highlights"]) + counts["thoughts"] += len(detail["thoughts"]) + counts["bookmarks"] += detail["bookmark_count"] + collected.sort(key=lambda n: n.get("date") or "", reverse=True) + return jsonify( + { + "scope": "all", + "books": books_meta, + "notes": collected, + "counts": counts, + "aggregated_books": len(books_meta), + "degraded": conn is None, + } + ) + + detail = collect_notes(book_id) + if detail is None: + return jsonify({"error": "获取笔记失败,请稍后重试"}), 502 + meta = notes_book_meta(conn, book_id) + notes = [ + {**h, "bookId": book_id, "book_title": meta["title"], "type": "highlight"} for h in detail["highlights"] + ] + [ + {**t, "bookId": book_id, "book_title": meta["title"], "type": "thought"} for t in detail["thoughts"] + ] + notes.sort(key=lambda n: n.get("date") or "", reverse=True) + return jsonify( + { + "scope": "book", + "book": meta, + "notes": notes, + "counts": { + "highlights": len(detail["highlights"]), + "thoughts": len(detail["thoughts"]), + "bookmarks": detail["bookmark_count"], + }, + "degraded": conn is None, + } + ) + + +def notes_book_meta(conn, book_id): + """笔记页需要的书籍信息(本地库优先,回落实时书架)。""" + row = query_one(conn, "SELECT title, author, cover, reading_progress FROM notebooks WHERE book_id=%s", (book_id,)) + if row: + return { + "id": str(book_id), + "bookId": str(book_id), + "title": row["title"], + "author": row["author"], + "cover": cover_class(book_id), + "cover_url": row["cover"], + "progress": norm_progress(row["reading_progress"]), + } + data = weapi_safe("/book/info", ttl=1800, bookId=book_id) or {} + return { + "id": str(book_id), + "bookId": str(book_id), + "title": data.get("title") or "未知书籍", + "author": data.get("author") or "", + "cover": cover_class(book_id), + "cover_url": data.get("cover") or "", + "progress": 0, + } + + +def collect_notes(book_id): + """ + 拉取一本书的划线 + 想法,归一成前端使用的结构。 + 返回 None 表示接口不可用;返回空结构表示确实没有笔记。 + """ + marks = weapi_safe("/book/bookmarklist", ttl=300, bookId=book_id) + thoughts = weapi_safe("/review/list/mine", ttl=300, bookid=book_id, count=100) + if marks is None and thoughts is None: + return None + + chapters = {} + for ch in (marks or {}).get("chapters") or []: + chapters[ch.get("chapterUid")] = ch.get("title") or "" + + highlights = [] + for bm in (marks or {}).get("updated") or []: + text = (bm.get("markText") or "").strip() + if not text: + continue + highlights.append( + { + "id": str(bm.get("bookmarkId") or ""), + "text": text, + "chapter": chapters.get(bm.get("chapterUid"), ""), + "range": bm.get("range") or "", + "date": ts_to_date(bm.get("createTime")), + "url": bookmark_url(book_id, bm), + } + ) + + items, bookmark_count = [], 0 + for item in (thoughts or {}).get("reviews") or []: + rev = item.get("review") or {} + content = rev.get("content") or "" + # 纯书签记录没有正文,只计入数量 + if rev.get("type") == 4 or (not content.strip()): + bookmark_count += 1 + continue + items.append( + { + "id": str(rev.get("reviewId") or ""), + "text": content.strip(), + "abstract": (rev.get("abstract") or "").strip(), + "chapter": rev.get("chapterName") or (chapters.get(rev.get("chapterUid")) or ""), + "range": rev.get("range") or "", + "star": rev.get("star"), + "date": ts_to_date(rev.get("createTime")), + "url": bookmark_url(book_id, rev), + } + ) + + return {"highlights": highlights, "thoughts": items, "bookmark_count": bookmark_count} + + +def bookmark_url(book_id, mark): + """拼微信读书深度链接(划线定位)。""" + rng = (mark.get("range") or "").split("-") + chapter_uid = mark.get("chapterUid") or 0 + if len(rng) == 2 and rng[0].isdigit() and rng[1].isdigit(): + return ( + f"weread://bestbookmark?bookId={book_id}&chapterUid={chapter_uid}" + f"&rangeStart={rng[0]}&rangeEnd={rng[1]}" + ) + return f"weread://reading?bId={book_id}" + + +# ====================================================================== +# 接口:书籍详情(简介 / 目录 / 我的笔记 / 热门划线 / 公开点评 / 相似推荐) +# ====================================================================== + + +@v2_bp.route("/api/v2/book/") +@with_db +def api_v2_book(conn, book_id): + """书籍详情聚合接口(全部走实时接口,逐项降级)。""" + info = weapi_safe("/book/info", ttl=1800, bookId=book_id) + if not info: + return jsonify({"error": "获取书籍信息失败,请稍后重试"}), 502 + + progress = weapi_safe("/book/getprogress", ttl=300, bookId=book_id) or {} + prog_book = progress.get("book") or {} + persist_detail(conn, book_id, info) + persist_progress( + conn, + book_id, + { + "progress": norm_progress(prog_book.get("progress")), + "record_reading_time": prog_book.get("recordReadingTime") or 0, + "finish_time": prog_book.get("finishTime") or 0, + "update_time": prog_book.get("updateTime") or 0, + "is_start_reading": prog_book.get("isStartReading") or 0, + "chapter_uid": prog_book.get("chapterUid") or 0, + "chapter_offset": prog_book.get("chapterOffset") or 0, + }, + ) + chapters_raw = weapi_safe("/book/chapterinfo", ttl=1800, bookId=book_id) or {} + best = weapi_safe("/book/bestbookmarks", ttl=600, bookId=book_id) or {} + reviews_raw = weapi_safe("/review/list", ttl=600, bookId=book_id, count=10) or {} + similar_raw = weapi_safe("/book/similar", ttl=1800, bookId=book_id, count=8, maxIdx=0) or {} + notes = collect_notes(book_id) or {"highlights": [], "thoughts": [], "bookmark_count": 0} + + rating = float(info.get("newRating") or 0) + + chapters = [] + for ch in (chapters_raw.get("chapters") or []): + if (ch.get("level") or 1) > 1: # 只保留一级章节,避免目录过长 + continue + chapters.append( + { + "uid": ch.get("chapterUid"), + "idx": ch.get("chapterIdx"), + "title": ch.get("title") or "", + "words": ch.get("wordCount") or 0, + "paid": ch.get("paid") or 0, + } + ) + + chapters_map = {c["uid"]: c["title"] for c in chapters} + for c in (chapters_raw.get("chapters") or []): + chapters_map.setdefault(c.get("chapterUid"), c.get("title") or "") + + best_marks = [] + for item in (best.get("items") or [])[:10]: + best_marks.append( + { + "text": (item.get("markText") or "").strip(), + "count": int(item.get("totalCount") or 0), + "chapter": chapters_map.get(item.get("chapterUid"), ""), + "range": item.get("range") or "", + "url": bookmark_url(book_id, item), + } + ) + + reviews = [] + for item in ((reviews_raw.get("reviews") or []))[:10]: + rev = item.get("review") or {} + author = rev.get("author") or {} + star = rev.get("star") or 0 + reviews.append( + { + "id": str(rev.get("reviewId") or ""), + "name": author.get("name") or "书友", + "avatar": author.get("avatar") or "", + "rating": max(1, min(5, int(round(star / 20)))) if star else 0, + "star": star, + "text": (rev.get("content") or "").strip(), + "date": ts_to_date(rev.get("createTime")), + "chapter": rev.get("chapterName") or "", + "is_finish": rev.get("isFinish") or 0, + } + ) + + similar = [] + for item in ((similar_raw.get("booksimilar") or {}).get("books") or [])[:8]: + bi = (item.get("book") or {}).get("bookInfo") or {} + if not bi.get("bookId"): + continue + similar.append( + make_book( + bi.get("bookId"), + bi.get("title"), + bi.get("author"), + bi.get("category"), + cover_url=bi.get("cover"), + deep_link=bi.get("deepLink"), + rating=bi.get("newRating"), + intro=bi.get("intro"), + ) + ) + + return jsonify( + { + "book": { + "id": str(book_id), + "bookId": str(book_id), + "title": info.get("title") or "", + "author": info.get("author") or "", + "translator": info.get("translator") or "", + "cover": cover_class(book_id), + "cover_url": info.get("cover") or "", + "short": short_title(info.get("title")), + "intro": info.get("intro") or "", + "category": info.get("category") or "", + "publisher": info.get("publisher") or "", + "publish_time": info.get("publishTime") or "", + "isbn": info.get("isbn") or "", + "word_count": info.get("wordCount") or 0, + "rating": round(rating / 10, 1) if rating else None, + "rating_count": info.get("newRatingCount") or 0, + "deep_link": info.get("deepLink") or f"weread://reading?bId={book_id}", + }, + "progress": { + "progress": norm_progress(prog_book.get("progress")), + "record_reading_time": prog_book.get("recordReadingTime") or 0, + "record_reading_time_str": duration_str(prog_book.get("recordReadingTime") or 0), + "update_time": ts_to_date(prog_book.get("updateTime")), + "finish_time": ts_to_date(prog_book.get("finishTime")), + "is_start_reading": prog_book.get("isStartReading") or 0, + }, + "chapters": chapters, + "chapter_total": len(chapters_raw.get("chapters") or []), + "best_bookmarks": {"items": best_marks, "total": int(best.get("totalCount") or 0)}, + "reviews": { + "items": reviews, + "count": int(reviews_raw.get("reviewsCnt") or len(reviews)), + "deep_v": reviews_raw.get("deepVRecommendInfo") or {}, + }, + "notes": { + "items": [ + {**h, "bookId": str(book_id), "type": "highlight"} for h in notes["highlights"] + ] + + [{**t, "bookId": str(book_id), "type": "thought"} for t in notes["thoughts"]], + "counts": { + "highlights": len(notes["highlights"]), + "thoughts": len(notes["thoughts"]), + "bookmarks": notes["bookmark_count"], + }, + }, + "similar": similar, + } + ) + + +# ====================================================================== +# 接口:书单 / 推荐 / 搜索 +# ====================================================================== + + +@v2_bp.route("/api/v2/archives") +@with_db +def api_v2_archives(conn): + """书单(书架 archive)+ 成员书籍。""" + try: + payload = shelf_payload() + except WeReadError as e: + return jsonify({"error": str(e)}), 502 + + books, _ = shelf_books(conn) + by_id = {b["id"]: b for b in books} + lists = [] + for arc in payload.get("archive") or []: + ids = [str(i) for i in (arc.get("bookIds") or [])] + members = [by_id[i] for i in ids if i in by_id] + lists.append( + { + "id": arc.get("name") or "", + "name": arc.get("name") or "", + "source": "我的书单", + "description": f"书架书单 · 收录 {len(ids)} 本", + "ids": ids, + "members": members, + "book_count": len(ids), + } + ) + return jsonify({"lists": lists, "count": len(lists), "degraded": conn is None}) + + +@v2_bp.route("/api/v2/recommend") +@with_db +def api_v2_recommend(conn): + """为你推荐(实时)。Query: maxIdx""" + max_idx = request.args.get("maxIdx", type=int, default=0) + try: + data = weapi("/book/recommend", ttl=600, count=12, maxIdx=max_idx) + except WeReadError as e: + return jsonify({"error": str(e)}), 502 + + books = [] + for book in data.get("books") or []: + rating_detail = book.get("newRatingDetail") or {} + books.append( + { + "id": str(book.get("bookId") or ""), + "bookId": str(book.get("bookId") or ""), + "title": book.get("title") or "", + "author": book.get("author") or "", + "cover": cover_class(book.get("bookId") or ""), + "cover_url": book.get("cover") or "", + "short": short_title(book.get("title")), + "desc": book.get("intro") or "", + "reason": book.get("reason") or "", + "category": book.get("category") or "", + "score": round(float(book.get("newRating") or 0) / 100, 1) if book.get("newRating") else None, + "rating_title": (rating_detail or {}).get("title") or "", + "reading_count": book.get("readingCount") or 0, + "deep_link": book.get("deepLink") or "", + "status": "wish", + "progress": 0, + } + ) + return jsonify({"books": books, "has_more": data.get("hasMore") or 0}) + + +SEARCH_SCOPES = { + "all": 0, + "books": 10, + "author": 6, + "lists": 13, + "audio": 14, + "fulltext": 12, + "novel": 11, + "account": 2, + "article": 4, +} + + +@v2_bp.route("/api/v2/search") +@with_db +def api_v2_search(conn): + """ + 搜索(实时)。Query: keyword(必填), scope=all|books|author|lists|audio|fulltext|novel|account|article + 返回按分组归一后的书籍 / 作者 / 书单结果。 + """ + keyword = (request.args.get("keyword") or "").strip() + scope_name = request.args.get("scope", "books") + # Flask 对中文查询参数的编码兜底 + try: + keyword = keyword.encode("latin-1").decode("utf-8") + except (UnicodeDecodeError, UnicodeEncodeError): + pass + if not keyword: + return jsonify({"error": "keyword is required"}), 400 + + scope = SEARCH_SCOPES.get(scope_name, 10) + try: + data = weapi("/store/search", ttl=300, keyword=keyword, scope=scope, maxIdx=0, count=15) + except WeReadError as e: + return jsonify({"error": str(e), "keyword": keyword, "scope": scope_name}), 502 + + books, authors, lists, groups = [], [], [], [] + seen_books, seen_authors, seen_groups = set(), set(), set() + for group in data.get("results") or []: + title = group.get("title") or "" + gkey = (title, group.get("scope"), group.get("currentCount")) + if gkey in seen_groups: + continue + seen_groups.add(gkey) + items = group.get("books") or [] + if title: + groups.append({"title": title, "scope": group.get("scope"), "count": group.get("scopeCount") or 0}) + for item in items: + bi = item.get("bookInfo") or item.get("book") or {} + bid = str(bi.get("bookId") or "") + if bid and title == "作者": + name = bi.get("author") or bi.get("title") or "" + if name and name not in seen_authors: + seen_authors.add(name) + authors.append({"name": name, "count": bi.get("bookCount") or 0}) + continue + if not bid or bid in seen_books: + continue + seen_books.add(bid) + entry = { + "id": bid, + "bookId": bid, + "title": bi.get("title") or "", + "author": bi.get("author") or (bi.get("authorInfo") or {}).get("name") or "", + "cover": cover_class(bid), + "cover_url": bi.get("cover") or "", + "short": short_title(bi.get("title")), + "desc": bi.get("intro") or "", + "category": bi.get("category") or "", + "score": round(float(item.get("newRating") or 0) / 100, 1) if item.get("newRating") else None, + "reading_count": item.get("readingCount") or 0, + "deep_link": bi.get("deepLink") or "", + "group": title, + "status": "wish", + "progress": 0, + } + if title in ("书单", "书单合集"): + lists.append({**entry, "name": entry["title"], "source": title, "ids": []}) + else: + books.append(entry) + + return jsonify( + { + "keyword": keyword, + "scope": scope_name, + "scope_id": scope, + "groups": groups, + "books": books, + "authors": authors, + "lists": lists, + "has_more": data.get("hasMore") or 0, + } + ) + + +# ====================================================================== +# 接口:单条想法详情(想法 / 点赞 / 评论) +# ====================================================================== + + +@v2_bp.route("/api/v2/thought/") +@with_db +def api_v2_thought(conn, review_id): + """单条想法详情:正文 + 点赞数 + 评论列表。""" + data = weapi_safe("/review/single", ttl=300, reviewId=review_id, commentsCount=10, likesCount=10) + if not data: + return jsonify({"error": "获取想法详情失败"}), 502 + + review = data.get("review") or {} + author = review.get("author") or {} + comments = [] + for c in (data.get("comments") or []): + inner = c.get("comment") or c + c_author = inner.get("author") or {} + comments.append( + { + "name": c_author.get("name") or "书友", + "text": (inner.get("content") or "").strip(), + "date": ts_to_date(inner.get("createTime")), + "likes": inner.get("likesCount") or 0, + } + ) + likes = data.get("likes") or [] + return jsonify( + { + "id": review_id, + "text": (review.get("content") or "").strip(), + "abstract": (review.get("abstract") or "").strip(), + "author": author.get("name") or "我", + "date": ts_to_date(review.get("createTime")), + "chapter": review.get("chapterName") or "", + "star": review.get("star"), + "book_review_count": data.get("bookReviewCount") or 0, + "like_count": len(likes), + "likes": [ + {"name": ((l.get("like") or {}).get("author") or {}).get("name") or "书友"} for l in likes[:10] + ], + "comments": comments, + "comment_count": len(comments), + } + ) + + +# ====================================================================== +# 接口:公开点评(可按类型筛选) +# ====================================================================== + + +@v2_bp.route("/api/v2/book//reviews") +@with_db +def api_v2_book_reviews(conn, book_id): + """ + 书籍公开点评。Query: type=0|1|2|3|4(全部/推荐/不行/最新/一般), count + """ + review_type = request.args.get("type", type=int, default=0) + count = request.args.get("count", type=int, default=10) + data = weapi_safe("/review/list", ttl=600, bookId=book_id, reviewListType=review_type, count=count) + if data is None: + return jsonify({"error": "获取点评失败"}), 502 + + items = [] + for item in (data.get("reviews") or [])[:count]: + rev = item.get("review") or {} + author = rev.get("author") or {} + star = rev.get("star") or 0 + items.append( + { + "id": str(rev.get("reviewId") or ""), + "name": author.get("name") or "书友", + "avatar": author.get("avatar") or "", + "rating": max(1, min(5, int(round(star / 20)))) if star else 0, + "star": star, + "text": (rev.get("content") or "").strip(), + "date": ts_to_date(rev.get("createTime")), + "chapter": rev.get("chapterName") or "", + "is_finish": rev.get("isFinish") or 0, + } + ) + + return jsonify( + { + "book_id": str(book_id), + "type": review_type, + "items": items, + "count": int(data.get("reviewsCnt") or len(items)), + "has_more": data.get("reviewsHasMore") or 0, + "friend_count": data.get("friendCommentCount") or 0, + "deep_v": data.get("deepVRecommendInfo") or {}, + "value": data.get("deepVRecommendValue") or 0, + } + ) + + +# ====================================================================== +# 接口:章节划线下想法(供热门划线弹层使用) +# ====================================================================== + + +@v2_bp.route("/api/v2/book//highlights") +@with_db +def api_v2_book_highlights(conn, book_id): + """ + 热门划线 / 章节划线热度。 + Query: chapter_uid(可选,0=全书) + """ + chapter_uid = request.args.get("chapter_uid", type=int, default=0) + best = weapi_safe("/book/bestbookmarks", ttl=600, bookId=book_id, chapterUid=chapter_uid) + if best is None: + return jsonify({"error": "获取热门划线失败"}), 502 + + chapters_raw = weapi_safe("/book/chapterinfo", ttl=1800, bookId=book_id) or {} + chapters_map = {c.get("chapterUid"): c.get("title") or "" for c in (chapters_raw.get("chapters") or [])} + + items = [] + for item in (best.get("items") or [])[:20]: + rng = (item.get("range") or "").split("-") + items.append( + { + "text": (item.get("markText") or "").strip(), + "count": int(item.get("totalCount") or 0), + "chapter": chapters_map.get(item.get("chapterUid"), ""), + "chapter_uid": item.get("chapterUid"), + "range": item.get("range") or "", + "range_start": int(rng[0]) if len(rng) == 2 and rng[0].isdigit() else None, + "range_end": int(rng[1]) if len(rng) == 2 and rng[1].isdigit() else None, + "url": bookmark_url(book_id, item), + } + ) + return jsonify( + { + "book_id": str(book_id), + "chapter_uid": chapter_uid, + "total": int(best.get("totalCount") or 0), + "items": items, + } + ) + + +# ====================================================================== +# 接口:划线下想法列表 +# ====================================================================== + + +@v2_bp.route("/api/v2/book//underline-thoughts") +@with_db +def api_v2_underline_thoughts(conn, book_id): + """某条划线下他人的想法(每屏最多 20 条)。Query: chapter_uid, range""" + chapter_uid = request.args.get("chapter_uid", type=int, default=0) + rng = (request.args.get("range") or "").strip() + if not chapter_uid or not rng: + return jsonify({"error": "chapter_uid 与 range 必填"}), 400 + + payload = {"bookId": book_id, "chapterUid": chapter_uid, "reviews": [{"range": rng, "maxIdx": 0, "count": 10}]} + data = weapi_safe("/book/readreviews", ttl=300, **payload) + if data is None: + return jsonify({"error": "获取划线下想法失败"}), 502 + + items = [] + for group in data.get("reviews") or []: + for item in group.get("reviews") or []: + rev = item.get("review") or item + inner = rev.get("review") or rev + author = inner.get("author") or {} + text = (inner.get("content") or "").strip() + if not text: + continue + items.append( + { + "id": str(inner.get("reviewId") or ""), + "name": author.get("name") or "书友", + "text": text, + "date": ts_to_date(inner.get("createTime")), + "likes": inner.get("likesCount") or 0, + } + ) + return jsonify({"book_id": str(book_id), "chapter_uid": chapter_uid, "range": rng, "items": items[:20]}) diff --git a/app.py b/app.py index d780e04..474c0bf 100644 --- a/app.py +++ b/app.py @@ -27,11 +27,16 @@ from functools import wraps import pymysql from flask import Flask, jsonify, render_template, request +from api_v2 import v2_bp + # ====================================================================== # Flask 应用实例 # ====================================================================== app = Flask(__name__, static_folder="static", template_folder="templates") +# 注册 v2 数据接口(/api/v2/*,为「阅间」新版前端提供聚合数据) +app.register_blueprint(v2_bp) + # ====================================================================== # 数据库连接配置 # ====================================================================== @@ -1270,5 +1275,7 @@ if __name__ == "__main__": else: print(f"[信息] {msg}") - # 启动 Flask 服务,监听 8080 端口 - app.run(host="0.0.0.0", port=8080, debug=False) + # 监听端口:默认 8080,可用环境变量 PORT 覆盖(v2 前端与 v1 并存时可换端口) + port = int(os.environ.get("PORT", 8080)) + print(f"[信息] 打开 http://127.0.0.1:{port} 查看「阅间」看板") + app.run(host="0.0.0.0", port=port, debug=False) From 8af75454a4c5aa5f35cd97eb4817f1307a47e2a4 Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 11 Sep 2026 18:21:06 +0800 Subject: [PATCH 07/16] =?UTF-8?q?feat(web):=20v2=20=E7=9C=8B=E6=9D=BF?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=8E=A5=E5=85=A5=E7=9C=9F=E5=AE=9E=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前端样式完全沿用 2.0 设计稿,仅替换数据来源。 - templates/index.html 改用设计稿 DOM 结构与类名,引用 styles.css + weapi.js + app.js - static/css/styles.css 引入 2.0 设计稿样式 - static/js/weapi.js 新增,封装 /api/v2/* 调用为全局 WeApi - static/js/app.js 重写:保留设计稿全部渲染函数与 CSS 类名, 数据源由 demo-data.js 静态假数据改为真实接口, 补充异步加载器、加载/错误状态机与重试按钮 - static/js/demo-data.js 保留为设计稿原始假数据对照 --- static/css/styles.css | 11 + static/js/app.js | 1863 ++++++++++++++-------------------------- static/js/demo-data.js | 25 + static/js/weapi.js | 125 +++ templates/index.html | 221 +---- 5 files changed, 804 insertions(+), 1441 deletions(-) create mode 100644 static/css/styles.css create mode 100644 static/js/demo-data.js create mode 100644 static/js/weapi.js diff --git a/static/css/styles.css b/static/css/styles.css new file mode 100644 index 0000000..c40ae2d --- /dev/null +++ b/static/css/styles.css @@ -0,0 +1,11 @@ + +:root{--bg:#f7f8fa;--panel:#fff;--text:#242a34;--muted:#9298a4;--line:#edf0f3;--accent:#356ce5;--soft:#edf3ff;--sidebar:#fff;--shadow:0 8px 32px #24355005;--quote:#f8f6f1;--green:#449682} +[data-theme=dark]{--bg:#14171e;--panel:#1d222c;--text:#e7eaf0;--muted:#8892a4;--line:#2c323f;--accent:#80a5ff;--soft:#26344e;--sidebar:#191d26;--shadow:0 8px 32px #0001;--quote:#292820;--green:#75c6ac;color-scheme:dark} +*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font-family:"PingFang SC","Microsoft YaHei",sans-serif;font-size:14px;transition:background .25s,color .25s}button,input{font:inherit}button{cursor:pointer;color:inherit}button:focus-visible,a:focus-visible,input:focus-visible{outline:3px solid var(--accent);outline-offset:4px}button{border:0;background:none}svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;vertical-align:middle}.sidebar{position:fixed;inset:0 auto 0 0;width:218px;padding:39px 23px 24px;background:var(--sidebar);border-right:1px solid var(--line);display:flex;flex-direction:column;z-index:5}.logo{display:flex;align-items:center;gap:11px;font-size:24px;font-weight:650;letter-spacing:2px}.logo-mark{background:#356ce5;color:white;width:37px;height:37px;display:grid;place-items:center;border-radius:12px}.logo-mark svg{width:25px;height:25px}.logo small{display:block;letter-spacing:2px;font-size:9px;color:var(--muted);margin-top:3px;font-weight:500}.navlabel{font-size:10px;color:var(--muted);letter-spacing:1.7px;margin:53px 14px 15px}.nav{display:flex;flex-direction:column;gap:9px}.nav button{text-align:left;padding:14px 17px;border-radius:9px;display:flex;align-items:center;gap:13px;color:#818997}.nav button.active{color:var(--accent);background:var(--soft);font-weight:600}.nav button:hover{background:var(--soft)}.nav em{margin-left:auto;font-size:10px;font-style:normal;background:var(--line);padding:2px 6px;border-radius:4px}.sidebar-bottom{margin-top:auto}.connection{padding:16px 12px;border:1px solid var(--line);border-radius:10px;font-size:12px;line-height:1.9}.dot{display:inline-block;background:var(--green);width:6px;height:6px;border-radius:50%;margin-right:7px}.connection small{display:block;font-size:10px;color:var(--muted)}.profile{display:flex;align-items:center;gap:10px;margin-top:24px;padding:0 8px}.avatar{width:33px;height:33px;border-radius:50%;display:grid;place-items:center;background:#e4eadf;color:#5e7252;font-family:Georgia;font-size:18px}.profile small{display:block;font-size:10px;color:var(--muted);margin-top:4px}.main{margin-left:218px;padding:0 40px 32px;max-width:1800px}.topbar{height:91px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line)}.breadcrumb{font-size:12px;color:var(--muted)}.breadcrumb span{color:var(--text);margin-left:12px}.top-actions{display:flex;align-items:center;gap:20px}.searchbox{display:flex;align-items:center;gap:10px;color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:9px 12px}.searchbox input{background:none;border:0;outline:none;width:180px;color:var(--text);font-size:11px}.key{font-size:10px;border:1px solid var(--line);border-radius:4px;padding:2px 4px}.iconbtn{padding:7px;border:1px solid var(--line);border-radius:8px;background:var(--panel)}.welcome{display:flex;justify-content:space-between;align-items:center;margin:33px 0 27px}.eyebrow{font-size:10px;letter-spacing:2px;color:var(--muted);margin-bottom:10px}h1{font-size:27px;letter-spacing:.5px;margin:0 0 10px;font-weight:600}h1 span{font-family:Georgia;font-size:25px;color:#c3a977}p{margin:0;color:var(--muted);font-size:12px;line-height:1.8}.welcome-right{display:flex;gap:12px;align-items:center}.demo-tag{font-size:10px;padding:6px 9px;background:var(--quote);border:1px solid var(--line);border-radius:5px;color:var(--muted)}.primary{background:#356ce5;color:white;padding:11px 16px;border-radius:7px;font-size:12px}.primary svg{width:15px;height:15px;margin-right:6px}.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-bottom:23px}.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow)}.stat{padding:21px 23px}.stat-label{display:flex;justify-content:space-between;align-items:center;color:var(--muted);font-size:12px}.stat-label svg{width:17px;height:17px;color:#9aa8bf}.stat-value{font-family:Georgia,serif;font-size:34px;letter-spacing:-1px;margin:14px 0 12px}.stat-value small{font-family:"PingFang SC",sans-serif;font-size:11px;color:var(--muted);letter-spacing:0;margin-left:5px}.stat-foot{font-size:10px;color:var(--muted)}.stat-foot b{color:var(--green);font-weight:500;margin-right:7px}.columns{display:grid;grid-template-columns:minmax(0,1fr) 296px;gap:23px}.section-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px}.section-head h2{font-size:15px;font-weight:600;margin:0}.section-head h2 small{font-weight:400;color:var(--muted);font-size:10px;margin-left:10px}.text-button{font-size:11px;color:var(--muted);padding:3px}.text-button:hover{color:var(--accent)}.trend{padding:24px 25px;margin-bottom:23px}.segmented{background:var(--bg);padding:3px;display:flex;border-radius:6px}.segmented button{font-size:10px;padding:5px 12px;color:var(--muted);border-radius:4px}.segmented button.active{background:var(--panel);color:var(--accent);box-shadow:0 1px 5px #0001}.trend-total{font-family:Georgia;font-size:25px;margin-bottom:10px}.trend-total small{font-family:"PingFang SC";font-size:10px;color:var(--muted);margin-left:9px}.chart{height:130px;position:relative;padding-left:30px}.gridlines{position:absolute;inset:0 0 15px 30px;display:flex;flex-direction:column;justify-content:space-between}.gridlines i{border-top:1px dashed var(--line);position:relative}.gridlines i:before{content:attr(data-label);position:absolute;left:-29px;top:-6px;color:var(--muted);font-size:9px;font-style:normal}.bars{display:flex;align-items:end;justify-content:space-around;height:100%;gap:14px;position:relative;padding-bottom:15px}.bar{height:var(--h);max-width:33px;flex:1;background:#dbe6fc;border-radius:4px 4px 0 0;position:relative;transition:height .35s}.bar:nth-child(5){background:#4d7ce7}.bar span{position:absolute;top:calc(100% + 9px);left:50%;transform:translateX(-50%);font-size:9px;color:var(--muted);white-space:nowrap}.bar:hover{background:#7199ef}.bar:hover:before{content:attr(data-tip);position:absolute;bottom:calc(100% + 6px);left:50%;transform:translateX(-50%);white-space:nowrap;background:var(--text);color:var(--panel);padding:5px 7px;font-size:10px;border-radius:4px}.shelf{padding:24px 25px}.tabs{display:flex;gap:25px;border-bottom:1px solid var(--line);margin-top:-4px;margin-bottom:24px}.tabs button{padding:0 0 12px;font-size:11px;color:var(--muted);border-bottom:2px solid transparent}.tabs button.active{color:var(--accent);border-bottom-color:var(--accent)}.books{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:23px}.book{text-align:left;padding:0;min-width:0;transition:transform .2s}.book:hover{transform:translateY(-5px)}.cover{height:160px;width:112px;max-width:100%;border-radius:2px 5px 5px 2px;position:relative;padding:15px 12px;overflow:hidden;box-shadow:5px 8px 13px #17212c20,inset 4px 0 3px #ffffff25;display:flex;flex-direction:column;color:#fff}.cover:after{content:"";position:absolute;inset:0;border-left:4px solid #0002;pointer-events:none}.cover .tiny{font-size:6px;letter-spacing:1px;opacity:.8}.cover .title{font-family:"Songti SC","STSong",serif;line-height:1.3;font-size:22px;margin-top:15px;font-weight:700}.cover .author{font-size:7px;margin-top:10px}.cover .publisher{font-size:6px;margin-top:auto;letter-spacing:1px}.c1{background:#efe9d8;color:#374432}.c1 .title{font-size:19px;letter-spacing:1px;margin-top:15px;z-index:1}.c1:before{content:"";position:absolute;width:130px;height:110px;border:1px solid #73876a66;border-radius:50%;left:-29px;bottom:-24px;box-shadow:0 0 0 8px #72826313,0 0 0 18px #72826313,0 0 0 30px #72826313}.c2{background:#182b3b}.c2 .title{font-size:37px;letter-spacing:6px}.c2:before{content:"";position:absolute;left:20px;bottom:-42px;width:115px;height:115px;border:1px solid #b8855144;border-radius:50%;box-shadow:0 0 0 8px #b8855122,0 0 0 17px #b8855111}.c3{background:#db502e}.c3 .title{font-size:19px;color:#fff3d7}.c3:before{content:"";position:absolute;width:60px;height:60px;background:#f4c66a;bottom:13px;right:-8px;border-radius:50%}.c4{background:#f0eee2;color:#282722}.c4 .title{font-size:24px}.c4:before{content:"";position:absolute;width:90px;height:90px;bottom:-24px;right:-25px;background:repeating-linear-gradient(45deg,#3d6274 0 5px,transparent 5px 10px);transform:rotate(-15deg)}.book h3{font-size:12px;font-weight:500;margin:14px 0 5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.book p{font-size:10px}.progress{height:3px;background:var(--line);border-radius:3px;margin-top:13px}.progress i{display:block;height:100%;background:#8aa7d8;width:var(--progress)}.book-meta{font-size:9px;color:var(--muted);display:flex;justify-content:space-between;margin-top:7px}.rightcol{display:flex;flex-direction:column;gap:23px}.goal{padding:24px}.goal-ring{margin:12px auto 16px;width:142px;height:142px;border-radius:50%;background:conic-gradient(#679483 0 216deg,var(--line) 216deg);padding:9px;transform:rotate(-90deg)}.ring-inner{width:100%;height:100%;border-radius:50%;background:var(--panel);display:flex;flex-direction:column;align-items:center;justify-content:center;transform:rotate(90deg)}.ring-inner strong{font-family:Georgia;font-size:36px;font-weight:400}.ring-inner small{color:var(--muted);font-size:10px;margin-top:5px}.goal-caption{text-align:center;font-size:11px;margin-bottom:18px}.goal-caption span{color:var(--green)}.goal-footer{padding-top:15px;border-top:1px solid var(--line);display:flex;justify-content:space-between;font-size:10px;color:var(--muted)}.goal-footer b{color:var(--text);font-weight:500}.notes{padding:24px}.note{border-left:2px solid #d7bd7e;padding-left:13px;margin:0 0 19px}.note blockquote{font-family:"Songti SC","STSong",serif;font-size:13px;line-height:1.9;margin:0 0 11px}.note small{font-size:9px;color:var(--muted)}.note:last-child{margin-bottom:0}.quote{padding:20px 24px;background:var(--quote);border-radius:12px;position:relative}.quote .eyebrow{font-size:9px;letter-spacing:1.5px}.quote p{font-family:"Songti SC",serif;color:var(--text);font-size:13px;line-height:1.9}.quote small{display:block;text-align:right;margin-top:12px;color:var(--muted);font-size:9px}.footer{display:flex;justify-content:space-between;margin-top:24px;font-size:9px;color:var(--muted)}.empty{padding:40px;text-align:center;color:var(--muted);grid-column:1/-1}.notes-page{display:grid;gap:20px}.notes-page .note{padding:20px;margin:0}.hidden{display:none!important}dialog{border:1px solid var(--line);background:var(--panel);color:var(--text);border-radius:18px;padding:32px;width:520px;max-width:90vw;box-shadow:0 30px 100px #0003}dialog::backdrop{background:#10182877;backdrop-filter:blur(5px)}.dialog-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.dialog-top h2{margin:0;font-size:18px}.detail-body{display:flex;gap:26px;margin-bottom:22px}.detail-info{flex:1}.detail-info h3{font-size:22px;margin:8px 0}.detail-info p{margin:8px 0}.detail-desc{font-size:13px;line-height:2;color:var(--muted)}#toast{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:var(--text);color:var(--panel);padding:13px 23px;border-radius:10px;z-index:30;font-size:12px}.fade{animation:fade .5s ease both}@keyframes fade{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:translateY(0)}}@media(min-width:1500px){.main{padding-left:55px;padding-right:55px}.columns{grid-template-columns:minmax(0,1fr) 330px}.cover{height:185px;width:130px}.chart{height:160px}}@media(max-width:1150px){.sidebar{width:180px;padding-left:16px;padding-right:16px}.main{margin-left:180px;padding:0 24px 24px}.columns{grid-template-columns:minmax(0,1fr) 250px;gap:16px}.books{gap:12px}.cover{height:140px}.stats{gap:12px}.stat{padding:18px 15px}.shelf,.trend{padding:20px}.searchbox input{width:130px}.welcome-right .demo-tag{display:none}}@media(max-width:900px){.stats{grid-template-columns:repeat(2,1fr)}.sidebar{width:76px;padding:28px 12px}.logo{justify-content:center}.logo>div:last-child,.navlabel,.nav button span,.nav em,.sidebar-bottom{display:none}.nav{margin-top:45px}.nav button{padding:14px;justify-content:center}.main{margin-left:76px;padding:0 22px 24px}.columns{grid-template-columns:1fr}.rightcol{display:grid;grid-template-columns:1fr 1fr}.quote{grid-column:1/-1}.cover{height:165px}.welcome-right .primary{font-size:0}.welcome-right .primary svg{margin:0}.stat-value{font-size:28px}.topbar{height:75px}}@media(max-width:600px){.main{padding:0 16px 20px;margin-left:60px}.sidebar{width:60px;padding:25px 6px}.logo-mark{width:33px;height:33px}.nav button{padding:12px}.searchbox{padding:8px}.searchbox input{width:112px}.key,.breadcrumb,.top-actions>.avatar{display:none}.top-actions{width:100%;justify-content:space-between;gap:8px}.welcome{margin-top:25px}h1{font-size:21px}.welcome p{font-size:10px}.eyebrow{font-size:8px}.stats{grid-template-columns:repeat(2,1fr)}.stat{padding:16px}.stat-value{margin:10px 0}.rightcol{display:flex}.books{grid-template-columns:repeat(2,1fr);gap:24px 15px}.cover{height:160px;width:112px}.section-head h2 small{display:none}.tabs{gap:18px}.footer{font-size:8px}.footer span:last-child{display:none}.detail-body{gap:16px}.detail-info h3{font-size:18px}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}} +/* 阅读目标与内容页:与既有主题变量共用色彩。 */ +:root{--muted:#717b8b}[data-theme=dark]{--muted:#a2adbf}h3{font-size:14px;margin:0}button:disabled{opacity:.45;cursor:not-allowed}.demo-banner{display:flex;justify-content:space-between;color:var(--muted);font-size:10px;margin-top:18px}.welcome{margin-top:26px}.page-actions{display:flex;align-items:center;gap:10px}.secondary{padding:10px 15px;border:1px solid var(--line);background:var(--panel);border-radius:7px;font-size:12px}.pill{display:inline-block;padding:5px 8px;font-size:10px;border-radius:5px;background:var(--soft);color:var(--accent);white-space:nowrap}.pill.green{background:#6a9a8219;color:var(--green)}.pill.amber{background:#c3923919;color:#b78a3f}.hint{font-size:11px;color:var(--muted);line-height:1.8}.panel{padding:24px}.panel+.panel{margin-top:20px}.toolbar{display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap;margin:0 0 22px}.toolbar .tabs{margin:0;flex-wrap:wrap}.toolbar input,.toolbar select,.field input,select{border:1px solid var(--line);border-radius:7px;padding:10px 12px;background:var(--panel);color:var(--text);font:inherit;font-size:12px}.toolbar select{max-width:100%}.field{display:flex;flex-direction:column;gap:8px;font-size:12px;margin-bottom:18px}.field input{width:100%;background:var(--bg)}.date-fields{display:grid;grid-template-columns:1fr 1fr;gap:16px}.metrics-row{display:flex;gap:24px;padding:18px 0;margin-bottom:10px;color:var(--muted);font-size:11px}.metrics-row strong{font-family:Georgia;font-size:28px;color:var(--text);margin-right:6px;font-weight:400}.goals-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.goal-card{padding:25px;position:relative;overflow:hidden}.goal-card:before{content:'';position:absolute;inset:0 auto 0 0;width:3px;background:var(--green)}.goal-card h3{font-size:19px;margin:17px 0 8px;word-break:break-word}.goal-card .section-head{margin-bottom:0}.goal-date{font-size:11px;color:var(--muted)}.cover-stack{display:flex;gap:0;margin:24px 0 20px;height:92px;padding-left:4px}.mini-cover{width:66px;height:92px;padding:10px 8px;border-radius:2px 4px 4px 2px;box-shadow:4px 5px 10px #0002;display:flex;flex-direction:column;flex-shrink:0;position:relative;overflow:hidden;border-left:3px solid #0002}.cover-stack .mini-cover{margin-left:-4px;transform:rotate(-3deg);transform-origin:bottom}.cover-stack .mini-cover:nth-child(2n){transform:rotate(4deg)}.mini-cover b{font-family:'Songti SC',serif;font-size:12px;position:relative;z-index:1;line-height:1.5}.mini-cover small{font-size:6px;position:relative;margin-top:auto}.stack-more{align-self:center;margin-left:18px;color:var(--muted);font-size:12px}.goal-progress{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--muted);margin:12px 0 9px}.goal-progress strong{font-size:22px;color:var(--text);font-family:Georgia;font-weight:400}.goal-card .progress{height:5px;margin:0 0 19px}.goal-card .progress i{background:var(--green)}.goal-card-footer{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--line);padding-top:16px}.goal-card-footer small{font-size:10px;color:var(--muted)}.goal-card-footer button{font-size:11px;color:var(--accent)}.goal-intro{display:grid;grid-template-columns:1fr auto;gap:28px;background:var(--quote);padding:26px 30px;margin-bottom:24px;border:1px solid var(--line);border-radius:12px}.goal-intro h2{font-family:'Songti SC',serif;font-size:23px;font-weight:500;margin:0 0 10px}.goal-intro p{max-width:500px}.goal-intro .symbol{font-family:Georgia;font-size:65px;align-self:center;color:#819583}.goal-summary-row{display:block;text-align:left;width:100%;padding:16px 0;border-top:1px solid var(--line)}.goal-summary-row strong{font-size:12px;font-weight:500}.goal-summary-row small{display:block;margin-top:7px;color:var(--muted);font-size:10px}.goal-summary-row .progress{margin-top:10px}.list-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}.list-card{padding:21px;display:block;text-align:left;transition:transform .2s}.list-card:hover{transform:translateY(-3px)}.list-art{height:117px;display:flex;align-items:center;justify-content:center;background:var(--quote);border-radius:7px;margin-bottom:18px}.list-art .mini-cover:nth-child(2){transform:translateY(-5px);margin:0 -4px;z-index:1}.list-card h3{font-size:15px;margin-bottom:8px}.list-card p{font-size:11px}.list-card>small{display:block;color:var(--muted);font-size:10px;margin-top:15px}.full-books{grid-template-columns:repeat(5,minmax(0,1fr));gap:26px}.full-books .cover{height:168px;width:118px}.row-list{display:flex;flex-direction:column}.book-row{display:flex;align-items:center;gap:15px;padding:14px 0;border-bottom:1px solid var(--line)}.book-row:last-child{border:0}.book-row .mini-cover{width:42px;height:58px;padding:5px}.book-row .mini-cover b{font-size:8px}.book-row .mini-cover small{display:none}.book-row-text{flex:1;min-width:0}.book-row-text b{font-size:12px;font-weight:500}.book-row-text p{font-size:10px;margin-top:4px}.book-row .text-button{color:var(--accent)}.book-row-status{font-size:11px;color:var(--green)}.book-row .progress{max-width:200px}.notebook-grid{display:grid;grid-template-columns:230px minmax(0,1fr);gap:24px}.notebook-menu button{display:block;width:100%;text-align:left;border-radius:8px;padding:16px;margin-bottom:7px;border:1px solid transparent}.notebook-menu button.active{background:var(--soft);border-color:var(--line)}.notebook-menu button b{font-size:12px;font-weight:500}.notebook-menu button small{display:block;font-size:10px;margin-top:6px;color:var(--muted)}.note-content{padding:22px;margin:0 0 15px;background:var(--panel);border:1px solid var(--line);border-radius:10px}.note-content blockquote{margin:15px 0;font-family:'Songti SC',serif;font-size:16px;line-height:1.9}.note-content small{color:var(--muted);font-size:10px}.note-original{background:var(--quote);border-left:2px solid #b6a475;padding:12px;font-size:12px;line-height:1.9;margin-top:12px}.detail-tabs{display:flex;gap:19px;border-bottom:1px solid var(--line);margin:25px 0 18px;overflow:auto}.detail-tabs button{white-space:nowrap;font-size:12px;color:var(--muted);padding:0 0 12px;border-bottom:2px solid transparent}.detail-tabs button.active{color:var(--accent);border-color:var(--accent)}#detail{width:760px;max-height:90vh}#goal-editor{width:700px;max-height:90vh}.picker-head{margin:22px 0 10px}.picker-list{max-height:280px;overflow:auto;border:1px solid var(--line);border-radius:8px;margin-top:12px}.pick-row{display:flex;align-items:center;gap:12px;padding:12px 15px;border-bottom:1px solid var(--line);cursor:pointer}.pick-row:last-child{border:0}.pick-row input{accent-color:#356ce5;width:16px;height:16px}.pick-row b{font-size:12px;font-weight:500}.pick-row small{display:block;color:var(--muted);font-size:10px;margin-top:4px}.pick-row .pill{margin-left:auto}.picker-lists{display:flex;gap:7px;flex-wrap:wrap;margin:12px 0}.picker-lists button{border:1px solid var(--line);border-radius:6px;font-size:11px;padding:8px;background:var(--bg)}.picker-lists button.active{background:var(--soft);color:var(--accent)}.editor-footer{display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--line);padding-top:20px;margin-top:12px}.editor-footer>span{font-size:10px;color:var(--muted)}.form-error{color:#bd5151;font-size:12px;margin:12px 0}.insight-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;margin-top:22px}.insight h3{margin-bottom:20px}.insight-line{display:flex;justify-content:space-between;gap:12px;padding:10px 0;color:var(--muted);font-size:11px}.insight-line b{color:var(--text);font-weight:500}.insight .progress{margin-top:5px}.section-space{margin-top:24px}.discovery-hero{padding:27px;background:var(--quote);border-radius:10px;margin-bottom:24px}.discovery-hero h2{font-family:'Songti SC',serif;font-size:22px;font-weight:500;margin:0 0 8px}.status-box{text-align:center;padding:65px 20px}.status-box h3{margin:12px}.status-box button{margin-top:18px}.type-chips{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:20px}.type-chips button{padding:8px 11px;font-size:11px;border-radius:7px;border:1px solid var(--line)}.type-chips button.active{background:var(--soft);color:var(--accent);border-color:transparent}.review-row{border-bottom:1px solid var(--line);padding:18px 0}.review-row p{font-size:13px;color:var(--text);margin-top:12px}.review-row .meta{display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--muted)}.detail-subtitle{margin:15px 0}.book-details-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;font-size:12px}.book-details-grid span{color:var(--muted)}.chapter-row{padding:14px 0;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;font-size:12px}.media-card{display:flex;gap:18px;align-items:center;padding:24px}.media-icon{width:65px;height:65px;flex-shrink:0;background:var(--soft);color:var(--accent);border-radius:14px;display:grid;place-items:center;font-size:27px}.hour-bars{height:58px;display:flex;align-items:end;gap:3px}.hour-bars i{height:var(--height);flex:1;background:#84a4d8;border-radius:2px 2px 0 0}.insight-detail{margin-top:20px}.insight-detail summary{cursor:pointer;font-size:12px;color:var(--accent);padding:15px 0}.source-tag{font-size:10px;color:var(--muted);margin:8px 0}.goal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:22px}.detail-empty{padding:35px;color:var(--muted);font-size:12px;text-align:center}.cover .title{flex-shrink:0}.cover .tiny{font-size:5px}.c1 .title,.c3 .title{font-size:17px}.cover .author{font-size:6px}.cover .publisher{font-size:5px}.trend-total small{display:inline-block;font-size:11px}.trend{margin-bottom:0}.shelf{margin-top:22px}.list-index{color:var(--muted);font-size:10px;margin-right:5px}.summary-goals{margin-bottom:0} +@media(max-width:1200px){.full-books{grid-template-columns:repeat(4,minmax(0,1fr))}.list-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.insight-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:900px){.goals-grid{grid-template-columns:1fr}.columns>.rightcol{display:flex}.notebook-grid{grid-template-columns:1fr}.notebook-menu{display:flex;overflow:auto}.notebook-menu button{min-width:160px}.full-books{grid-template-columns:repeat(3,minmax(0,1fr))}.insight-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.sidebar .nav{gap:9px}.welcome{align-items:flex-start;gap:15px}.welcome h1{line-height:1.4}.welcome .primary{white-space:nowrap}.goal-intro{padding:22px}.demo-banner span:last-child{display:none}}@media(max-width:600px){.full-books{grid-template-columns:repeat(2,minmax(0,1fr))}.list-grid,.insight-grid{grid-template-columns:1fr}.goal-intro{grid-template-columns:1fr}.goal-intro .symbol{display:none}.goal-card{padding:20px}.welcome{flex-direction:column}.welcome .page-actions{align-self:flex-end}.panel{padding:18px}.date-fields{grid-template-columns:1fr;gap:0}.detail-body>.cover{width:95px;flex-shrink:0}.detail-body{gap:15px}.detail-info h3{font-size:18px}.book-details-grid{grid-template-columns:1fr}.toolbar input{width:100%}.metrics-row{gap:16px;flex-wrap:wrap}.metrics-row strong{font-size:23px}.goal-intro h2{font-size:20px}.cover-stack .mini-cover{width:57px}.stack-more{font-size:10px;margin-left:10px}.demo-banner{font-size:9px}.goal-card h3{font-size:17px}dialog{padding:20px}.editor-footer{gap:10px}.book-row{gap:9px}.book-row-text b{font-size:11px}} +.compact-value{font-family:Georgia,'PingFang SC',sans-serif;font-size:25px;line-height:1.5;letter-spacing:-.5px}.stat-foot{line-height:1.7}.insight-detail .insight-grid{margin-top:0}.sidebar .nav button[aria-current=page]{color:var(--accent)} +@media(max-width:600px){.compact-value{font-size:20px}.list-art .mini-cover{width:56px}.full-books .cover{width:105px;height:159px}.goal-card .section-head{gap:10px}.book-row .mini-cover{display:none}.detail-tabs{gap:16px}.date-fields input{min-height:40px}.detail-info .primary{font-size:11px;padding:9px}} +.mini-cover.c2,.mini-cover.c3{color:#fff5df} +.export-preview{width:100%;height:320px;margin-top:20px;border:1px solid var(--line);border-radius:8px;padding:18px;background:var(--bg);color:var(--text);font:12px/1.9 'PingFang SC',sans-serif;resize:vertical} diff --git a/static/js/app.js b/static/js/app.js index daf6e68..9a27f00 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -1,1267 +1,664 @@ -/* ===== 微信读书数据展示 - 前端逻辑 ===== */ +/* ========================================================================== + 阅间 · 微信读书看板 v2 —— 交互逻辑 + -------------------------------------------------------------------------- + 视觉结构、类名、交互控件完全沿用「阅间」设计稿(web-demo)。 + 差异只在于数据来源:设计稿读取 demo-data.js 的静态示例, + 这里改为调用 /api/v2/* 实时接口。 + ========================================================================== */ -const API_BASE = ""; +const $ = selector => document.querySelector(selector); +const esc = value => + String(value == null ? '' : value).replace(/[&<>"']/g, char => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[char])); +const findBook = id => books.find(book => book.id === id); +const uniqueIds = ids => [...new Set(ids)].filter(id => findBook(id)); +const today = () => new Date().toLocaleDateString('sv-SE'); +const storageKey = 'weread-goals-v2'; +const PICKER_LIMIT = 60; +const SHELF_PAGE = 48; -// ===== 主题管理 ===== +/* ------------------------------- 运行时状态 ------------------------------ */ -function getCurrentTheme() { - return document.documentElement.getAttribute("data-theme") === "dark" ? "dark" : "light"; +let page = 'overview', shelfTab = 'all', discoverTab = 'books', searchQuery = '', period = 'week'; +let noteBook = 'all', noteType = 'all', goalFilter = 'all'; +let detailBook = null, bookTab = 'info', reviewFilter = 0, selectedChapter = 0; +let shelfLimit = SHELF_PAGE, chapterLimit = 30, searchScope = 'store', notesLimit = 30; +let editingGoalId = null, draftIds = new Set(), draftSources = [], pendingBooks = [], pendingSources = []; +let toastTimer, storageWarning = ''; + +/* 接口数据缓存 */ +let books = []; +let booklists = []; +let shelfData = null; +let notebooksData = null; +let statusData = null; +let dashboardData = {}; +let notesData = {}; +let bookData = {}; +let discoverData = {}; +let numberData = {}; /* 书籍详情里按条件二次拉取的小接口缓存 */ + +/* 加载状态:idle | loading | ready | error */ +const loadState = { shelf: 'idle', dashboard: {}, notes: {}, discover: {}, book: {} }; +const loadError = { shelf: '', dashboard: {}, notes: {}, discover: {}, book: {} }; + +let goals = []; +try { + const saved = localStorage.getItem(storageKey); + if (saved) { + const parsed = JSON.parse(saved); + if (!Array.isArray(parsed) || !parsed.every(goal => typeof goal.id === 'string' && typeof goal.name === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(goal.start) && /^\d{4}-\d{2}-\d{2}$/.test(goal.end) && goal.start <= goal.end && Array.isArray(goal.ids) && Array.isArray(goal.sources))) throw new Error('invalid'); + goals = parsed; + } +} catch { storageWarning = '本地目标暂时无法读取,已重置为空白;原存储未修改。'; } + +/* ------------------------------- 通用组件 ------------------------------- */ + +function toast(message) { + clearTimeout(toastTimer); $('#toast').textContent = message; $('#toast').classList.remove('hidden'); + toastTimer = setTimeout(() => $('#toast').classList.add('hidden'), 3500); +} +function persistGoals(next) { + try { localStorage.setItem(storageKey, JSON.stringify(next)); } + catch { $('#goal-error').textContent = '浏览器无法保存数据,请允许本地存储后重试。'; return false; } + goals = next; return true; +} +function statusBox(kind, title, text, action) { + const eyebrow = { loading: 'LOADING', error: 'TRY AGAIN', empty: 'NOT FOUND' }[kind] || 'INFO'; + const button = action ? `` : ''; + return `
${eyebrow}

${esc(title)}

${esc(text || '')}

${button}
`; +} +function setTheme(theme) { + document.documentElement.dataset.theme = theme; + $('#theme').innerHTML = ``; + $('#theme').setAttribute('aria-label', `切换至${theme === 'dark' ? '亮' : '暗'}色主题`); +} +try { setTheme(localStorage.getItem('weread-theme') === 'dark' ? 'dark' : 'light'); } catch { setTheme('light'); } +$('#theme').onclick = () => { + const theme = document.documentElement.dataset.theme === 'dark' ? 'light' : 'dark'; setTheme(theme); + try { localStorage.setItem('weread-theme', theme); } catch { toast('主题已切换,本次浏览有效。'); } +}; + +/* 封面:沿用设计稿的示意封面(4 种底色 + 书名短行) */ +function cover(book, mini = false) { + const short = book.short || book.title || ''; + if (mini) return ``; + return `
${esc(book.en || '')}${esc(short).replaceAll('\n', '
')}
${esc(book.author)}READING SPACE · 藏书
`; +} +function scoreText(book) { + return book.score ? `评分 ${Math.round(Number(book.score) * 10)}/100` : '暂无评分'; +} +function stateText(book) { + if (book.status === 'done') return '已读完'; + if (book.status === 'wish') return '想读'; + return book.progress > 0 ? `已读 ${book.progress}%` : '在读'; +} +function bookCard(book) { + return ``; +} +function bookRow(book, source = '') { + return `
${cover(book, true)}
${esc(book.title)}

${esc(book.author)}${source ? ' · ' + esc(source) : ''}

${esc(stateText(book))}
`; +} +function welcome(title, subtitle, action = '') { + return `
A LITTLE READING, EVERY DAY

${esc(title)}

${esc(subtitle)}

${action}
`; +} +const pageNames = { overview: '阅读概览', shelf: '我的书架', goals: '阅读目标', notes: '笔记与划线', discover: '发现好书' }; +function navigate(next) { + page = next; $('#crumb').textContent = pageNames[page]; + document.querySelectorAll('[data-page]').forEach(button => { button.classList.toggle('active', button.dataset.page === page); button.setAttribute('aria-current', button.dataset.page === page ? 'page' : 'false'); }); + renderPage(); +} +function renderPage() { + const views = { overview: renderOverview, shelf: renderShelf, goals: renderGoals, notes: renderNotes, discover: renderDiscover }; + $('#page-content').innerHTML = views[page](); +} +function tabs(items, selected, action) { + return `
${items.map(([id, label]) => ``).join('')}
`; } -function toggleTheme() { - const newTheme = getCurrentTheme() === "dark" ? "light" : "dark"; - document.documentElement.setAttribute("data-theme", newTheme); - localStorage.setItem("theme", newTheme); - refreshChartsForTheme(); +/* ------------------------------- 数据加载 ------------------------------- */ + +async function ensureStatus() { + try { + statusData = await WeApi.status(); + const counts = statusData.counts || {}; + const shelfNav = document.querySelector('[data-page="shelf"] em'); + if (shelfNav && counts.ebooks) shelfNav.textContent = counts.ebooks; + const conn = $('#conn-state'); + if (conn) conn.textContent = statusData.ok ? '已连接微信读书 · 数据实时同步' : '微信读书接口暂不可用'; + const foot = $('#footer-state'); + if (foot) foot.textContent = statusData.fetch_time ? `数据快照 ${statusData.fetch_time}` : '数据来自微信读书个人账号'; + } catch (error) { + const conn = $('#conn-state'); + if (conn) conn.textContent = '接口连接失败:' + error.message; + } } -function getChartColors() { - const cs = getComputedStyle(document.documentElement); - return { - axis: cs.getPropertyValue("--chart-axis").trim(), - axisLine: cs.getPropertyValue("--chart-axis-line").trim(), - splitLine: cs.getPropertyValue("--chart-split-line").trim(), - label: cs.getPropertyValue("--chart-label").trim(), - borderColor: cs.getPropertyValue("--chart-border-color").trim(), - tooltipBg: cs.getPropertyValue("--chart-tooltip-bg").trim(), - tooltipBorder: cs.getPropertyValue("--chart-tooltip-border").trim(), - tooltipText: cs.getPropertyValue("--chart-tooltip-text").trim(), - accent: cs.getPropertyValue("--accent").trim(), - accentLight: cs.getPropertyValue("--accent-light").trim(), - accentDark: cs.getPropertyValue("--accent-dark").trim(), - }; +async function ensureShelf(force = false) { + if (loadState.shelf === 'loading') return; + if (shelfData && !force) return; + loadState.shelf = 'loading'; loadError.shelf = ''; + if (['shelf', 'overview', 'goals'].includes(page)) renderPage(); + try { + const data = await WeApi.shelf('all', { progress: true }); + shelfData = data; + books = data.books || []; + booklists = (data.lists || []).map(list => ({ ...list, description: list.description || `我的书单 · ${list.book_count} 本` })); + loadState.shelf = 'ready'; + } catch (error) { + loadError.shelf = error.message; loadState.shelf = 'error'; + } + if (['shelf', 'overview', 'goals'].includes(page)) renderPage(); } -// ===== 工具函数 ===== - -/** - * 升级微信读书封面图 URL 到高清晰度版本。 - * 微信读书 CDN 的封面图通过文件名前缀区分分辨率: - * t6_ = 低清缩略图(~150px,Retina 屏模糊) - * s_ = 超低清缩略图(~90px,搜索结果常用,更模糊) - * t8_ = 高清版(~500px,适合 2x/3x 屏幕) - * 将 t6_ 和 s_ 前缀统一升级为 t8_ 高清版。 - */ -function hdCover(url) { - if (!url) return ""; - return url.replace(/\/(t6_|s_)/, "/t8_"); +async function ensureDashboard(target = period, force = false) { + if (loadState.dashboard[target] === 'loading') return; + if (dashboardData[target] && !force) return; + loadState.dashboard[target] = 'loading'; loadError.dashboard[target] = ''; + if (page === 'overview' && period === target) renderPage(); + try { + dashboardData[target] = await WeApi.dashboard(target); + loadState.dashboard[target] = 'ready'; + } catch (error) { + loadError.dashboard[target] = error.message; loadState.dashboard[target] = 'error'; + } + if (page === 'overview' && period === target) renderPage(); } -async function fetchAPI(path) { - const resp = await fetch(API_BASE + path); - if (!resp.ok) throw new Error(`API error: ${resp.status}`); - return resp.json(); +async function ensureNotebooks(force = false) { + if (loadState.notes.__list === 'loading') return; + if (notebooksData && !force) return; + loadState.notes.__list = 'loading'; + try { notebooksData = await WeApi.notebooks(); loadState.notes.__list = 'ready'; } + catch (error) { loadError.notes.__list = error.message; loadState.notes.__list = 'error'; } + if (page === 'notes') renderPage(); } -function formatHours(seconds) { - if (!seconds) return "0"; - return (seconds / 3600).toFixed(1); +async function ensureNotes(bookId, force = false) { + if (loadState.notes[bookId] === 'loading') return; + if (notesData[bookId] && !force) return; + loadState.notes[bookId] = 'loading'; loadError.notes[bookId] = ''; + if (page === 'notes' && noteBook === bookId) renderPage(); + try { + notesData[bookId] = await WeApi.notes(bookId, 4); + loadState.notes[bookId] = 'ready'; + } catch (error) { loadError.notes[bookId] = error.message; loadState.notes[bookId] = 'error'; } + if (page === 'notes' && noteBook === bookId) renderPage(); } -function escapeHtml(text) { - if (!text) return ""; - const div = document.createElement("div"); - div.textContent = text; - return div.innerHTML; +async function ensureBook(bookId, force = false) { + if (!bookId) return; + if (loadState.book[bookId] === 'loading') return; + if (bookData[bookId] && !force) return; + loadState.book[bookId] = 'loading'; loadError.book[bookId] = ''; + renderBookDetail(); + try { bookData[bookId] = await WeApi.book(bookId); loadState.book[bookId] = 'ready'; } + catch (error) { loadError.book[bookId] = error.message; loadState.book[bookId] = 'error'; } + renderBookDetail(); } -// ===== 数据库健康检查 ===== - -const chartInstances = {}; -let chartsLoaded = false; -let currentThoughtsData = null; -let currentThoughtsCategory = "all"; -let currentThoughtsSort = "time_desc"; -let currentThoughtsSearch = ""; - -function refreshChartsForTheme() { - if (!chartsLoaded) return; - Object.values(chartInstances).forEach((chart) => { - if (chart && !chart.isDisposed()) chart.dispose(); - }); - loadYearlyTrend(); - loadTimeDistribution(); - loadCategories(); - loadAuthors(); +function discoverKey() { + if (discoverTab === 'recommend') return 'recommend'; + if (discoverTab === 'lists') return `${searchScope}:lists`; + return `${searchScope}:${discoverTab}:${searchQuery}`; } - -async function checkDBHealth() { - try { - const resp = await fetch(API_BASE + "/api/health"); - const data = await resp.json(); - if (resp.ok && data.database === "connected") { - document.getElementById("dbAlertBanner").style.display = "none"; - return true; - } else { - showDBAlert(data.message || "数据库连接失败"); - return false; - } - } catch (error) { - showDBAlert("无法连接到服务器,请检查后端服务是否运行。"); - return false; - } -} - -function showDBAlert(message) { - const banner = document.getElementById("dbAlertBanner"); - const detail = document.getElementById("dbAlertDetail"); - if (banner) banner.style.display = "flex"; - if (detail) detail.textContent = message; -} - -// ===== 标签页切换 ===== - -function switchTab(tabName) { - // 如果想法详情页正在显示,先关闭它回到主视图 - const thoughtsPage = document.getElementById("thoughtsPage"); - if (thoughtsPage && thoughtsPage.style.display !== "none") { - thoughtsPage.style.display = "none"; - document.getElementById("mainView").style.display = ""; - currentThoughtsData = null; - } - - // 关闭可能打开的弹窗 - closeModal("bookDetailModal"); - - document.querySelectorAll(".tab-panel").forEach((panel) => { - panel.classList.remove("active"); - }); - document.querySelectorAll(".nav-link").forEach((link) => { - link.classList.toggle("active", link.dataset.tab === tabName); - }); - - const target = document.getElementById(`tab-${tabName}`); - if (target) { - target.classList.add("active"); - } - - window.scrollTo({ top: 0, behavior: "smooth" }); - - // 懒加载图表 - if (tabName === "charts" && !chartsLoaded) { - chartsLoaded = true; - loadYearlyTrend(); - loadTimeDistribution(); - loadCategories(); - loadAuthors(); - } - - // 切换到图表时重绘尺寸 - if (tabName === "charts" && chartsLoaded) { - setTimeout(() => { - Object.values(chartInstances).forEach((chart) => { - if (chart && !chart.isDisposed()) chart.resize(); - }); - }, 100); - } -} - -// ===== 回到顶部按钮 ===== - -function initBackToTop() { - const btn = document.getElementById("backToTop"); - window.addEventListener("scroll", () => { - btn.classList.toggle("visible", window.scrollY > 400); - }); -} - -function scrollToTop() { - window.scrollTo({ top: 0, behavior: "smooth" }); -} - -/** - * 在微信读书中打开书籍。 - * 优先使用 API 返回的 deep_link(https://weread.qq.com/... 网页链接), - * 没有则用 book_id 构造网页链接。先尝试 weread:// 深链接唤起 App, - * 1.5 秒后无响应则回退到网页版。 - */ -function openInWeRead(bookId, deepLink) { - const webUrl = deepLink || `https://weread.qq.com/#book/${bookId}`; - const schemeUrl = `weread://reading?bId=${bookId}`; - - // 尝试唤起 App(移动端),同时设置定时器回退到网页版 - let triggered = false; - const fallbackTimer = setTimeout(() => { - if (!triggered) window.open(webUrl, "_blank"); - }, 1500); - - // 监听页面可见性变化(App 唤起成功会切到后台) - const onVisChange = () => { - if (document.hidden) { - triggered = true; - clearTimeout(fallbackTimer); - } - }; - document.addEventListener("visibilitychange", onVisChange); - - // 尝试打开深链接 - const iframe = document.createElement("iframe"); - iframe.style.display = "none"; - iframe.src = schemeUrl; - document.body.appendChild(iframe); - setTimeout(() => document.body.removeChild(iframe), 2000); - - // 桌面端不会有 visibilitychange,确保 fallback 一定执行 - setTimeout(() => { - document.removeEventListener("visibilitychange", onVisChange); - }, 3000); -} - -// ===== 全局搜索(顶部常驻搜索框) ===== - -function globalSearch() { - const keyword = document.getElementById("globalSearchInput").value.trim(); - if (!keyword) return; - - // 切换到推荐标签页 - switchTab("discover"); - // 切换到搜索子标签 - switchDiscoverTab("search"); - // 填入搜索词并执行搜索 - document.getElementById("searchInput").value = keyword; - doSearch(); -} - -// ===== 书架分类标签(可折叠层级结构) ===== - -let shelfCategoryTree = {}; // { "历史": {count:114, subs:{"世界史":5,...}}, ... } -let shelfActiveCategory = ""; // 完整分类名,如 "历史-中国古代" -let shelfActiveParent = ""; // 父分类名,如 "历史";空表示"全部" -let shelfExpandedParents = new Set(); // 当前展开的父分类 -let shelfSortMode = "category"; // 始终按分类排序,前端不显示切换按钮 - -async function loadShelfCategories() { - try { - const data = await fetchAPI("/api/shelf?page=1&per_page=1"); - shelfCategoryTree = data.category_tree || {}; - renderShelfCategories(); - } catch (e) { - console.error("加载分类失败:", e); - } -} - -function renderShelfCategories() { - const container = document.getElementById("shelfCategories"); - if (!container) return; - - let html = ""; - - // "全部" 按钮 - const allActive = !shelfActiveParent && !shelfActiveCategory; - html += ``; - - // 父分类按钮(按书籍数量降序) - const parents = Object.entries(shelfCategoryTree) - .sort((a, b) => b[1].count - a[1].count); - - for (const [parent, info] of parents) { - const isActive = shelfActiveParent === parent && !shelfActiveCategory; - const isExpanded = shelfExpandedParents.has(parent); - const arrow = Object.keys(info.subs).length > 0 - ? `${isExpanded ? "▼" : "▶"}` - : ""; - - html += ``; - - // 展开的子分类 - if (isExpanded && Object.keys(info.subs).length > 0) { - html += `
`; - for (const [sub, count] of Object.entries(info.subs).sort((a, b) => b[1] - a[1])) { - const fullCat = `${parent}-${sub}`; - const subActive = shelfActiveCategory === fullCat; - html += ``; - } - html += `
`; - } - } - - container.innerHTML = html; -} - -function filterByParent(parent) { - if (parent) { - // 点击父分类:展开/折叠子分类,同时筛选该父分类下的所有书 - if (shelfExpandedParents.has(parent) && shelfActiveParent === parent && !shelfActiveCategory) { - // 已展开且已选中 → 折叠 - shelfExpandedParents.delete(parent); - shelfActiveParent = ""; - shelfActiveCategory = ""; - } else { - // 展开 + 筛选 - shelfExpandedParents.add(parent); - shelfActiveParent = parent; - shelfActiveCategory = ""; - } +async function ensureDiscover(force = false) { + const key = discoverKey(); + if (loadState.discover[key] === 'loading') return; + if (discoverData[key] && !force) return; + loadState.discover[key] = 'loading'; loadError.discover[key] = ''; + if (page === 'discover') renderPage(); + try { + if (searchScope === 'shelf' || (!searchQuery && (discoverTab === 'books' || discoverTab === 'all'))) { + discoverData[key] = { local: true, books: books, authors: [], lists: [] }; + } else if (discoverTab === 'recommend') { + discoverData[key] = await WeApi.recommend(0); } else { - // 点击"全部" - shelfExpandedParents.clear(); - shelfActiveParent = ""; - shelfActiveCategory = ""; + discoverData[key] = await WeApi.search(searchQuery || '文学', discoverTab); } - renderShelfCategories(); - loadShelf(1); + loadState.discover[key] = 'ready'; + } catch (error) { loadError.discover[key] = error.message; loadState.discover[key] = 'error'; } + if (page === 'discover') renderPage(); } -function filterByCategory(fullCategory) { - shelfActiveCategory = fullCategory; - // 确保父分类已展开 - const parent = fullCategory.split("-")[0]; - shelfExpandedParents.add(parent); - shelfActiveParent = parent; - renderShelfCategories(); - loadShelf(1); +/* ------------------------------- 阅读概览 ------------------------------- */ + +function periodHint(p) { + const now = new Date(); + if (p === 'week') return '本周 · 周一至今'; + if (p === 'month') return `${now.getFullYear()} 年 ${now.getMonth() + 1} 月`; + if (p === 'year') return `${now.getFullYear()} 年 · 按月`; + return '全部年份 · 按年'; } -// ===== 书架刷新 ===== +function renderTrend(data) { + const values = data.trend.values || []; + const labels = data.trend.labels || []; + const unit = data.trend.unit; + const max = Math.max(10, Math.ceil(Math.max(...values, 1) / 10) * 10); + const gridlines = [max, Math.round((max * 2) / 3), Math.round(max / 3), 0] + .map(n => ``).join(''); + const bars = values.map((v, i) => ``).join(''); + const axis = period === 'year' ? '按月' : period === 'overall' ? '按年' : '按日'; + return `

阅读的日常 每一天,都算数

${axis}
${esc(data.stats[0].value)}阅读与收听合计
${gridlines}
${bars || '该周期暂无阅读记录'}
`; +} -async function refreshShelf() { - const btn = document.getElementById("shelfRefreshBtn"); - const textEl = btn.querySelector(".btn-text"); - btn.disabled = true; - btn.classList.add("loading"); - textEl.textContent = "同步中..."; +function summaryGoals() { + return `

我的阅读目标

${goals.slice(0, 3).map(goal => { const m = goalMetrics(goal); return ``; }).join('') || '

还没有阅读目标,创建一份属于你的清单。

'}
`; +} - try { - // Step 1: 从微信读书 API 同步数据到 MySQL - const resp = await fetch(API_BASE + "/api/sync", { method: "POST" }); - const syncResult = await resp.json(); - if (!syncResult.ok) { - throw new Error(syncResult.error || "同步失败"); - } +function renderOverview() { + const data = dashboardData[period]; + if (!data && loadError.dashboard[period]) return statusBox('error', '暂时无法获取阅读统计', loadError.dashboard[period], 'retry-overview'); + if (!data) { ensureDashboard(period); return statusBox('loading', '正在读取阅读统计…', '数据来自你的微信读书账号。'); } - // Step 2: 重新加载分类和书架 - textEl.textContent = "加载中..."; - await loadShelfCategories(); - await loadShelf(1); - } catch (e) { - console.error("刷新失败:", e); - alert("刷新失败: " + (e.message || "未知错误")); - } finally { - btn.disabled = false; - btn.classList.remove("loading"); - textEl.textContent = "刷新"; + const reading = books.filter(book => book.status === 'reading').slice(0, 6); + const stats = data.stats.map(s => `
${esc(s.label)}
${s.value}
${esc(s.hint)}
`).join(''); + + const topBooks = data.top_books.length + ? data.top_books.map((b, i) => `
${i + 1}. ${esc(b.title)}${esc(b.read_time_str)}
`).join('') + : '

该周期还没有阅读时长记录。

'; + + const cats = data.categories.items.length + ? data.categories.items.map(c => `
${esc(c.title)}相对偏好 ${c.val}
`).join('') + : '

接口未返回该周期的偏好分类。

'; + + const hours = data.time_distribution.values || []; + const hourMax = data.time_distribution.max || 1; + const hourBars = hours.length + ? hours.map(v => ``).join('') + : '接口未返回时段分布'; + const peak = data.time_distribution.peak_hour; + + const authorLines = data.authors.length + ? data.authors.map(a => `
${esc(a.name)}${a.count} 本${a.read_time ? ' · ' + esc(a.read_time) : ''}
`).join('') + : '

接口未返回该周期的偏好作者。

'; + const publisherLines = data.publishers.length + ? data.publishers.map(p => `
${esc(p.name)}${p.count} 本
`).join('') + : '

接口未返回偏好出版社。

'; + const cpLines = data.cps.length + ? data.cps.map(c => `
${esc(c.name)}${c.count} 本
`).join('') + : ''; + const medalLines = data.medals.length + ? data.medals.map(m => `
${esc(m.name)}${esc(m.detail || m.date || '')}
`).join('') + : '
勋章接口未返回
'; + + return welcome('在字里行间,遇见自己', '阅读、目标与灵感,在这里慢慢积累。', '') + + `
${tabs([['week', '本周'], ['month', '本月'], ['year', '本年'], ['overall', '总计']], period, 'period')}${esc(periodHint(period))} · 微信读书统计接口
` + + `
${stats}
` + + `
${renderTrend(data)}

继续阅读

${reading.length ? reading.map(bookCard).join('') : '
书架里还没有在读的书。
'}
` + + `

读得最多

${topBooks}${data.top_books.length ? `

按${esc(periodHint(period))}的阅读时长排序

` : ''}

偏爱的阅读方向

${cats}

相对偏好权重,不是阅读占比

留给自己的时段

${hourBars}
06:0018:00次日 05:00

${esc(data.time_distribution.word || '时段分布')}${peak != null ? ` · 峰值 ${String(peak).padStart(2, '0')}:00` : ''}

` + + `
更多阅读画像 · 作者、出版社、勋章与年度回顾

偏好作者与出版方

${authorLines}${publisherLines}${cpLines}

阅读与收听

微信读书统计接口未返回「文字阅读 / 收听」时长拆分,接入该字段后可直接展示。

阅读总时长${esc(data.stats[0].value)}
有效阅读天数${esc(String(data.stats[1].value).replace(/<[^>]+>/g, ''))}

阅读足迹

好友排行${esc(data.rank.text || '本周暂无排行')}
${medalLines}
`; +} + +/* ------------------------------- 我的书架 ------------------------------- */ + +function listCard(list, index) { + const members = (list.ids || []).map(findBook).filter(Boolean); + return ``; +} +function renderLists(lists) { + return `
${lists.map(listCard).join('') || '
没有匹配的书单。
'}
`; +} + +function renderShelf() { + if (loadError.shelf) return statusBox('error', '暂时无法读取书架', loadError.shelf, 'retry-shelf'); + if (!shelfData) { ensureShelf(); return statusBox('loading', '正在同步书架…', '读取微信读书书架与阅读进度。'); } + + const counts = shelfData.counts || {}; + const filtered = books.filter(book => shelfTab === 'all' || book.status === shelfTab); + let content; + if (shelfTab === 'lists') content = renderLists(booklists); + else if (shelfTab === 'audio') { + const albums = shelfData.albums || []; + content = albums.length + ? albums.map(album => `
♫

${esc(album.title)}

${esc(album.author || '有声专辑')} · ${album.count} 集

${esc(album.intro || '内容完结不代表已听完;当前不纳入按本阅读目标。')}

`).join('') + : '
书架接口当前没有返回有声书 / 专辑条目。
'; + } else if (shelfTab === 'articles') { + content = `
▤

${esc((shelfData.mp && shelfData.mp.title) || '文章收藏')}

这是书架中的收藏入口,共 ${counts.mp ? 1 : 0} 个。

书架接口不提供入口内文章列表;可在发现页按「文章 / 公众号」检索。

`; + } else { + const shown = filtered.slice(0, shelfLimit); + content = `
${shown.map(bookCard).join('') || '
这里还没有对应的书。
'}
${filtered.length > shown.length ? `` : ''}
`; + } + + const sub = `${counts.ebooks || 0} 本电子书 · ${counts.albums || 0} 个有声专辑 · ${counts.mp ? 1 : 0} 个文章收藏入口,共 ${counts.total || 0} 个书架条目。`; + return welcome('我的书架', sub) + + tabs([['all', `全部电子书 ${counts.ebooks || 0}`], ['reading', `在读 ${counts.reading || 0}`], ['done', `已读完 ${counts.done || 0}`], ['wish', `想读 ${counts.wish || 0}`], ['lists', `我的书单 ${counts.archives || 0}`], ['audio', `有声书 ${counts.albums || 0}`], ['articles', '文章收藏']], shelfTab, 'shelf-tab') + content; +} + +function openList(id) { + const list = booklists.find(l => l.id === id); + if (!list) return; + const members = (list.ids || []).map(findBook).filter(Boolean); + showDetail('书单详情', `
A COLLECTION OF GOOD BOOKS

${esc(list.name)}

${esc(list.description || '')}

${esc(list.source || '我的书单')} · ${list.book_count || members.length} 本

${members.map(book => bookRow(book)).join('') || '
书单中的书籍当前不在书架上。
'}
`); +} + +/* ------------------------------- 阅读目标 ------------------------------- */ + +function goalMetrics(goal, date = today()) { + const ids = uniqueIds(goal.ids), done = ids.filter(id => findBook(id).status === 'done').length; + const status = ids.length && done === ids.length ? '已完成' : date < goal.start ? '未开始' : date > goal.end ? '已到期' : '进行中'; + return { total: ids.length, done, percent: ids.length ? Math.round((done / ids.length) * 100) : 0, status }; +} +function goalCard(goal) { + const result = goalMetrics(goal); + return `
${result.status}

${esc(goal.name)}

${esc(goal.start)} — ${esc(goal.end)}
${goal.ids.slice(0, 4).map(id => cover(findBook(id), true)).join('')}${result.total > 4 ? `+ ${result.total - 4} 本` : ''}
${result.done} / ${result.total} 本已读完${result.percent}%
`; +} +function renderGoals() { + if (!shelfData) ensureShelf(); + const list = goals.filter(goal => goalFilter === 'all' || (goalFilter === 'complete' ? goalMetrics(goal).status === '已完成' : goalMetrics(goal).status !== '已完成')); + return welcome('把想读,变成读过', '几本书、一份书单,或一段想留给阅读的时间。', '') + + `
YOUR NEXT CHAPTER

目标不必宏大,开始就很好。

每份清单都有自己的节奏。已经读完的书,也会成为你完成目标的一部分。

${goals.length}个目标${goals.filter(goal => goalMetrics(goal).status === '已完成').length}个已完成${uniqueIds(goals.flatMap(goal => goal.ids)).length}本不同的书
❧
` + + tabs([['all', '全部目标'], ['active', '未完成'], ['complete', '已完成']], goalFilter, 'goal-filter') + + `
${list.map(goalCard).join('') || '
这里还没有目标,创建一份属于你的阅读清单。
'}
`; +} +function openGoalDetail(id) { + const goal = goals.find(g => g.id === id), m = goalMetrics(goal); + showDetail('阅读目标', `
${m.status}${esc(goal.start)} — ${esc(goal.end)}

${esc(goal.name)}

${m.done} / ${m.total}本已读完${m.percent}%已完成

已读完直接计入完成,不受目标日期影响。

${goal.sources.length ? `

加入过的书单:${goal.sources.map(esc).join('、')} · 保存时的书目

` : ''}
${goal.ids.map(id => bookRow(findBook(id))).join('')}
`); +} +function openGoalEditor(id = null, prefill = [], sources = []) { + $('#detail').close(); editingGoalId = id; + const goal = id ? goals.find(g => g.id === id) : null; + draftIds = new Set(goal ? goal.ids : prefill); draftSources = [...(goal ? goal.sources : sources)]; + $('#editor-title').textContent = goal ? '编辑阅读目标' : '新建阅读目标'; $('#goal-name').value = goal ? goal.name : ''; + $('#goal-start').value = goal ? goal.start : today(); $('#goal-end').value = goal ? goal.end : `${today().slice(0, 4)}-12-31`; + $('#goal-end').min = $('#goal-start').value; $('#goal-end').setCustomValidity(''); $('#goal-name').setCustomValidity(''); + $('#picker-search').value = ''; $('#goal-error').textContent = ''; renderPicker(); $('#goal-editor').showModal(); +} +function selectedGoalBooks() { return uniqueIds([...draftIds]); } +function renderPicker() { + const query = $('#picker-search').value.trim().toLowerCase(); + if (!shelfData) { $('#goal-picker').innerHTML = '

正在同步书架…

'; ensureShelf(); return; } + const matched = books.filter(book => `${book.title}${book.author}${book.category}`.toLowerCase().includes(query)); + const list = matched.slice(0, PICKER_LIMIT); + $('#selection-count').textContent = `已选 ${draftIds.size} 本 · ${[...draftIds].filter(id => findBook(id).status === 'done').length} 本已读完`; + $('#goal-picker').innerHTML = `

快捷加入书单当前书目

${booklists.filter(l => !query || l.name.includes(query) || l.ids.some(id => list.some(book => book.id === id))).map(l => ``).join('')}
${list.map(book => ``).join('') || '
没有匹配的书籍
'}
${matched.length > list.length ? `

共匹配 ${matched.length} 本,已显示前 ${list.length} 本,可用关键词继续筛选。

` : ''}`; +} +function saveGoal(event) { + event.preventDefault(); + const name = $('#goal-name').value.trim(), start = $('#goal-start').value, end = $('#goal-end').value, ids = selectedGoalBooks(); + if (!name) { $('#goal-name').setCustomValidity('请输入目标名称'); $('#goal-name').reportValidity(); return; } + if (end < start) { $('#goal-error').textContent = '结束日期不能早于开始日期。'; return; } + if (!ids.length) { $('#goal-error').textContent = '请至少选择一本书,或加入一个书单。'; return; } + const goal = { id: editingGoalId || (crypto.randomUUID ? crypto.randomUUID() : String(Date.now())), name, start, end, ids, sources: [...new Set(draftSources)] }; + const next = editingGoalId ? goals.map(g => (g.id === editingGoalId ? goal : g)) : [goal, ...goals]; + if (!persistGoals(next)) return; + $('#goal-editor').close(); navigate('goals'); toast('阅读目标已保存,已读完的书已计入完成。'); +} +function chooseTarget(ids, sources = []) { + showDetail('加入阅读目标', `

选择已有目标,或为这些书新建目标。重复书籍只加入一次。

${goals.map(g => `
${esc(g.name)}

${esc(g.start)} — ${esc(g.end)} · ${g.ids.length} 本

`).join('') || '
还没有目标,先新建一个。
'}
`); + pendingBooks = ids; pendingSources = sources; +} +function appendGoal(id) { + const next = goals.map(g => (g.id === id ? { ...g, ids: uniqueIds([...g.ids, ...pendingBooks]), sources: [...new Set([...g.sources, ...pendingSources])] } : g)); + if (!persistGoals(next)) { toast('无法保存到浏览器,请允许本地存储后重试。'); return; } + renderPage(); openGoalDetail(id); toast('已加入目标,重复书籍已自动去重。'); +} + +/* ------------------------------- 笔记与划线 ------------------------------- */ + +function renderNotes() { + if (!notebooksData && loadState.notes.__list !== 'error') { ensureNotebooks(); return statusBox('loading', '正在读取笔记本…', '来自微信读书的笔记本概览。'); } + if (!notebooksData) return statusBox('error', '暂时无法读取笔记本', loadError.notes.__list || '', 'retry-notes'); + + if (!notesData[noteBook] && loadState.notes[noteBook] !== 'loading' && loadState.notes[noteBook] !== 'ready' && loadState.notes[noteBook] !== 'error') ensureNotes(noteBook); + const payload = notesData[noteBook]; + const items = notebooksData.items || []; + const menuBooks = items.slice(0, 10); + const counts = (payload && payload.counts) || { highlights: 0, thoughts: 0, bookmarks: 0 }; + const notes = (payload && payload.notes) || []; + + const shownNotes = filteredNotes(notes); + const noteSlice = shownNotes.slice(0, notesLimit); + + const body = !payload + ? (loadState.notes[noteBook] === 'error' + ? statusBox('error', '暂时无法读取笔记', loadError.notes[noteBook] || '', 'retry-notes') + : statusBox('loading', '正在读取笔记内容…', '划线、想法与书签数量。')) + : `
${counts.highlights + counts.thoughts + counts.bookmarks}条笔记划线 ${counts.highlights}想法 ${counts.thoughts}书签 ${counts.bookmarks}
` + + tabs([['all', '全部内容'], ['highlight', '划线'], ['thought', '想法 / 个人点评'], ['bookmark', '书签数量']], noteType, 'note-type') + + (noteType === 'bookmark' + ? `
${counts.bookmarks} 个书签 · 微信读书接口只提供书签数量,不提供书签内容。
` + : (noteSlice.map(noteCard).join('') || '
当前筛选没有笔记。
')) + + (noteType !== 'bookmark' && shownNotes.length > noteSlice.length ? `` : '') + + `

${noteBook === 'all' ? `「全部笔记本」聚合了笔记最多的 ${payload.aggregated_books || 0} 本,切换左侧笔记本可查看单本全部内容。` : '内容来自微信读书划线与个人想法。'}总笔记数包含书签;导出包含划线和想法,不含公开点评及书签内容。

`; + + return welcome('把读过的,留在心里', `${notebooksData.totals.books} 本书留下过笔记,共 ${notebooksData.totals.notes} 条。`, '') + + `
${body}
`; +} +function filteredNotes(notes) { + if (noteType === 'all') return notes; + if (noteType === 'highlight') return notes.filter(n => n.type === 'highlight'); + if (noteType === 'thought') return notes.filter(n => n.type === 'thought'); + return []; +} +function noteCard(note) { + return `
${note.type === 'thought' ? '我的想法' : '划线'}
${esc(note.text)}
《${esc(note.book_title || '')}》 · ${esc(note.date || '')}

${esc(note.chapter || '未记录章节')}

${note.id ? `` : ''}
`; +} +function exportNotes() { + const payload = notesData[noteBook] || { notes: [] }; + const all = filteredNotes(payload.notes || []); + const notes = all.slice(0, 300); + const scopeName = noteBook === 'all' ? '全部笔记本(聚合)' : (notebooksData.items.find(item => item.id === noteBook) || {}).title || noteBook; + const header = `# 阅间笔记 · ${scopeName}\n\n导出时间:${today()} 来源:微信读书个人账号\n书签仅提供数量,不导出内容。${all.length > notes.length ? `\n本次导出前 ${notes.length} 条(共 ${all.length} 条),可切换单本笔记本分批导出。` : ''}\n\n`; + const text = header + notes.map(n => `## ${n.book_title || ''}\n\n${n.type === 'thought' ? '想法' : '划线'} · ${n.date || ''}${n.chapter ? ' · ' + n.chapter : ''}\n\n${n.text}`).join('\n\n'); + const url = URL.createObjectURL(new Blob([text], { type: 'text/markdown;charset=utf-8' })); + showDetail('导出笔记', `

已生成${esc(scopeName)}的划线与想法,共 ${notes.length} 条。可下载 Markdown,或直接选中下方内容复制;不含书签内容。

`); + $('#detail').addEventListener('close', () => URL.revokeObjectURL(url), { once: true }); +} + +/* ------------------------------- 发现好书 ------------------------------- */ + +function renderDiscover() { + const options = [['books', '书籍'], ['lists', '书单'], ['recommend', '为你推荐'], ['all', '综合'], ['author', '作者'], ['novel', '网文'], ['audio', '听书'], ['fulltext', '全文'], ['account', '公众号'], ['article', '文章']]; + if (!shelfData) ensureShelf(); + const key = discoverKey(); + const payload = discoverData[key]; + let content = ''; + if (loadError.discover[key]) content = statusBox('error', '暂时无法获取数据', loadError.discover[key], 'retry-discover'); + else if (!payload) { ensureDiscover(); content = statusBox('loading', '正在寻找好书…', searchScope === 'shelf' ? '在你的书架中检索。' : '实时检索微信读书书城。'); } + else if (discoverTab === 'recommend') { + const list = payload.books || []; + const prefer = (dashboardData[period] && dashboardData[period].prefer_words.category) || '你的阅读偏好'; + content = `
PICKED FOR YOUR NEXT CHAPTER

读过的书,会带你遇见下一本。

${esc(prefer)} · 微信读书实时推荐

${list.map(recommendCard).join('') || '
接口暂时没有返回推荐书籍。
'}
`; + } else if (discoverTab === 'lists') { + const lists = (payload.lists && payload.lists.length) ? payload.lists : booklists; + content = renderLists(lists.map(list => ({ ...list, description: list.description || `收录 ${list.book_count || (list.ids || []).length} 本`, source: list.source || '我的书单' }))) + (payload.lists && payload.lists.length ? '' : '

书城书单搜索接口暂未返回结果,以上为你的书架书单。

'); + } else if (discoverTab === 'author') { + const authors = payload.authors || []; + content = `
${authors.map(author => `
${esc(author.name.slice(0, 1))}
${esc(author.name)}

作者 · 书城检索

`).join('') || '
没有匹配的作者,换个关键词试试。
'}
`; + } else if (['novel', 'audio', 'fulltext', 'account', 'article'].includes(discoverTab)) { + const list = payload.books || []; + const names = { novel: '网文', audio: '听书', fulltext: '全文', account: '公众号', article: '文章' }; + content = list.length + ? `
${list.map(searchCard).join('')}
` + : `
「${esc(names[discoverTab])}」搜索:接口当前没有返回条目,可切换其他类型或关键词。
`; + } else if (discoverTab === 'all') { + const list = payload.books || []; + content = `

书籍

${list.slice(0, 8).map(searchCard).join('') || '
没有匹配的书籍。
'}

书单

${renderLists(booklists.slice(0, 3))}`; + } else { + const list = payload.books || []; + const local = list.filter(book => !searchQuery || `${book.title}${book.author}${book.category}`.toLowerCase().includes(searchQuery.toLowerCase())); + content = `
${(payload.local ? local.slice(0, shelfLimit) : list).map(searchCard).join('') || '
没有找到相关书籍,试试其他书名或作者。
'}
`; + } + + return welcome('下一本,遇见什么?', '寻找一本书,也发现一份恰好适合你的书单。') + + `
` + + tabs(options, discoverTab, 'discover-tab') + `
${content}

${(payload && payload.local) || searchScope === 'shelf' ? '书架检索' : '书城检索'} · 结果实时来自微信读书接口;推荐理由与书单成员以接口返回为准。

`; +} +function searchCard(book) { + const reason = book.reason ? `

${esc(book.reason)}

` : ''; + return ``; +} +function recommendCard(book) { + return ``; +} + +/* ------------------------------- 详情弹窗 ------------------------------- */ + +function showDetail(title, html) { $('#detail-title').textContent = title; $('#detail-content').innerHTML = html; if (!$('#detail').open) $('#detail').showModal(); } + +function openBook(id) { detailBook = id; bookTab = 'info'; selectedChapter = 0; reviewFilter = 0; chapterLimit = 30; renderBookDetail(); } +function renderBookDetail() { + const id = detailBook; + if (!id) return; + if (loadError.book[id]) { showDetail('书籍详情', statusBox('error', '暂时无法读取书籍详情', loadError.book[id], 'retry-book')); return; } + const data = bookData[id]; + if (!data) { ensureBook(id); showDetail('书籍详情', statusBox('loading', '正在读取书籍详情…', '简介、目录、笔记、热门划线与点评。')); return; } + const info = data.book; + const progress = data.progress.progress; + const state = progress >= 100 ? '已读完' : progress > 0 ? `已读 ${progress}%` : '尚未开始阅读'; + const readTimeText = data.progress.record_reading_time ? ` · 累计 ${esc(data.progress.record_reading_time_str)}` : ''; + showDetail('书籍详情', `
${cover(info)}
READING SPACE / BOOK

${esc(info.title)}

${esc(info.author)}${info.translator ? ' · 译者 ' + esc(info.translator) : ''}

${info.rating ? `评分 ${Math.round(info.rating)}/100 · ${info.rating_count} 人评价` : '暂无评分'}

${state}${readTimeText}

${info.deep_link ? ` 在微信读书中打开 ↗` : ''}
${[['info', '简介'], ['chapters', '目录'], ['notes', '我的笔记'], ['popular', '热门划线'], ['reviews', '读者点评'], ['similar', '相似推荐']].map(([tab, label]) => ``).join('')}
${renderBookTab(data)}
`); +} +function renderBookTab(data) { + const info = data.book; + if (bookTab === 'info') return `

${esc(info.intro || '接口未返回简介。')}

分类:${esc(info.category || '未分类')}
最近阅读:${esc(data.progress.update_time || '暂无记录')}
出版社:${esc(info.publisher || '未提供')}
出版日期:${esc(info.publish_time || '未提供')}
字数:${info.word_count ? `${Math.round(info.word_count / 10000)} 万字` : '未提供'}
ISBN:${esc(info.isbn || '未提供')}
`; + if (bookTab === 'chapters') { + const chapters = data.chapters.slice(0, chapterLimit); + return `

共 ${data.chapter_total} 章,当前显示 ${chapters.length} 章;点击可查看该章热门划线。

${chapters.map(chapter => `
${String(chapter.idx).padStart(2, '0')}   ${esc(chapter.title)}${chapter.words ? ` · ${Math.max(1, Math.round(chapter.words / 1000))} 千字` : ''}
`).join('') || '
接口未返回目录。
'}${data.chapters.length > chapters.length ? `` : ''}`; + } + if (bookTab === 'notes') { + const notes = data.notes.items || []; + const counts = data.notes.counts; + return `
${counts.highlights}条划线${counts.thoughts}条想法${counts.bookmarks}个书签
${notes.map(note => `
${note.type === 'thought' ? '个人想法' : '划线'}
${esc(note.text)}
${esc(note.date || '')}${note.chapter ? ' · ' + esc(note.chapter) : ''}${note.url ? `` : ''}
`).join('') || '
这本书暂无个人笔记。
'}`; + } + if (bookTab === 'popular') { + const marks = numberData[`hl:${info.id}:${selectedChapter}`] || data.best_bookmarks; + const items = (marks.items || []).slice(0, 20); + const chapterOptions = [['0', '全部章节']].concat(data.chapters.slice(0, 40).map(chapter => [String(chapter.uid), chapter.title])); + return `
${selectedChapter ? esc((data.chapters.find(chapter => String(chapter.uid) === String(selectedChapter)) || {}).title || '所选章节') : '全书'} · 热门划线最多展示 20 条
${items.map(item => `
${item.count} 人划线
${esc(item.text)}
${esc(item.chapter || '')}${marks.total ? ` · 全书共 ${marks.total} 条热门划线` : ''}
`).join('') || '
接口未返回热门划线。
'}

章节热度提供人数与位置;原文来自热门划线接口。

`; + } + if (bookTab === 'reviews') { + const payload = numberData[`rv:${info.id}:${reviewFilter}`] || { items: data.reviews.items, count: data.reviews.count }; + const list = payload.items || []; + return tabs([[0, '全部'], [1, '推荐'], [4, '一般'], [2, '不行'], [3, '最新']], reviewFilter, 'review-filter') + + `

共 ${payload.count || list.length} 条公开点评

` + + (list.map(review => `
${esc(review.name)}${review.is_finish ? ' · 已读完' : ''}${'★'.repeat(review.rating)}${'☆'.repeat(5 - review.rating)}

${esc(review.text)}

${esc(review.date || '')}${review.chapter ? ' · ' + esc(review.chapter) : ''}
`).join('') || '
该筛选下接口没有返回点评。
'); + } + const similar = data.similar || []; + return `

相似推荐 · 实时来自微信读书「相似书籍」接口

${similar.map(bookCard).join('') || '
接口未返回相似推荐。
'}
`; +} +function openThought(text, subtitle) { showDetail('想法详情', `
内容
${esc(text)}
${esc(subtitle)}
`); } +async function openThoughtDetail(reviewId, bookId) { + showDetail('想法详情', statusBox('loading', '正在读取想法详情…', '正文、点赞与评论。')); + try { + const data = await WeApi.thought(reviewId); + showDetail('想法详情', `
我的想法
${esc(data.text)}
${data.abstract ? `
划线原文:${esc(data.abstract)}
` : ''}${esc(data.date || '')}${data.chapter ? ' · ' + esc(data.chapter) : ''}
${data.like_count}个赞${data.comment_count}条评论
${(data.comments || []).map(comment => `
${esc(comment.name)}${esc(comment.date || '')}

${esc(comment.text)}

`).join('') || '

这条想法还没有评论。

'}
${bookId ? `` : ''}
`); + } catch (error) { + showDetail('想法详情', statusBox('error', '暂时无法读取想法详情', error.message, '')); + } +} +async function openHighlightThoughts(bookId, chapterUid, range) { + showDetail('划线下的想法', statusBox('loading', '正在读取他人的想法…', '来自划线定位接口。')); + try { + const data = await WeApi.underlineThoughts(bookId, chapterUid, range); + const items = data.items || []; + showDetail('划线下的想法', `

该划线范围内取到 ${items.length} 条想法

` + (items.map(item => `
${esc(item.name)}${esc(item.date || '')}

${esc(item.text)}

`).join('') || '
这条划线下暂无他人想法。
')); + } catch (error) { + showDetail('划线下的想法', statusBox('error', '暂时无法读取划线下想法', error.message, '')); + } +} + +/* ------------------------------- 行为分发 ------------------------------- */ + +function handleAction(button) { + const action = button.dataset.action, id = button.dataset.id; + switch (action) { + case 'page': navigate(id); break; + case 'new-goal': ensureShelf(); openGoalEditor(); break; + case 'edit-goal': openGoalEditor(id); break; + case 'goal-detail': openGoalDetail(id); break; + case 'goal-filter': goalFilter = id; renderPage(); break; + case 'close-detail': $('#detail').close(); break; + case 'close-editor': $('#goal-editor').close(); break; + case 'pick-list': { + const list = booklists.find(l => l.id === id); + if (list) { list.ids.forEach(bookId => draftIds.add(bookId)); if (!draftSources.includes(list.name)) draftSources.push(list.name); } + renderPicker(); break; } + case 'book': openBook(id); break; + case 'list': openList(id); break; + case 'add-book': chooseTarget([id]); break; + case 'add-list': { const list = booklists.find(l => l.id === id); if (list) chooseTarget(list.ids, [list.name]); break; } + case 'append-goal': appendGoal(id); break; + case 'new-with-selection': openGoalEditor(null, pendingBooks, pendingSources); break; + case 'shelf-tab': shelfTab = id; shelfLimit = SHELF_PAGE; renderPage(); break; + case 'shelf-more': shelfLimit += SHELF_PAGE; renderPage(); break; + case 'period': period = id; renderPage(); break; + case 'discover-tab': discoverTab = id; renderPage(); break; + case 'retry-overview': ensureDashboard(period, true); break; + case 'retry-shelf': ensureShelf(true); break; + case 'retry-notes': if (!notebooksData) ensureNotebooks(true); else ensureNotes(noteBook, true); break; + case 'retry-discover': ensureDiscover(true); break; + case 'retry-book': ensureBook(detailBook, true); break; + case 'notebook': noteBook = id; noteType = 'all'; notesLimit = 30; renderPage(); break; + case 'note-type': noteType = id; notesLimit = 30; renderPage(); break; + case 'notes-more': notesLimit += 30; renderPage(); break; + case 'export-notes': exportNotes(); break; + case 'personal-note': { + const note = ((notesData[noteBook] || {}).notes || []).find(n => n.id === id); + if (!note) break; + if (note.type === 'thought') openThoughtDetail(note.id, note.bookId); + else openThought(note.text, `${note.book_title || ''} · ${note.chapter || ''} · ${note.date || ''}`); + break; + } + case 'book-tab': bookTab = id; renderBookDetail(); break; + case 'chapter': selectedChapter = id; bookTab = 'popular'; renderBookDetail(); if (bookData[detailBook] && !numberData[`hl:${detailBook}:${id}`]) WeApi.highlights(detailBook, id).then(res => { numberData[`hl:${detailBook}:${id}`] = res; renderBookDetail(); }).catch(error => toast(error.message)); break; + case 'chapter-more': chapterLimit += 30; renderBookDetail(); break; + case 'review-filter': reviewFilter = Number(id); renderBookDetail(); WeApi.reviews(detailBook, reviewFilter, 10).then(res => { numberData[`rv:${detailBook}:${reviewFilter}`] = res; renderBookDetail(); }).catch(error => toast(error.message)); break; + case 'review-detail': openThought(button.dataset.text, `${button.dataset.name} · 公开点评`); break; + case 'highlight-thoughts': openHighlightThoughts(button.dataset.id, button.dataset.chapter, button.dataset.range); break; + case 'author-books': searchQuery = button.dataset.name; discoverTab = 'books'; searchScope = 'store'; $('#global-search').value = searchQuery; navigate('discover'); break; + case 'article-search': searchQuery = ''; discoverTab = 'article'; navigate('discover'); break; + case 'year-report': { + const year = dashboardData[period] && dashboardData[period].year_summary; + if (!year || !year.duration_str) { toast('年度数据暂时不可用'); break; } + showDetail('年度回顾', `
${year.year} / A YEAR IN BOOKS

翻过的每一页,都算数。

${esc(year.duration_str)} · ${year.read_days} 个阅读日${year.read_count ? ' · 读过 ' + esc(year.read_count) : ''}${year.finish_count ? ' · 读完 ' + esc(year.finish_count) : ''}

${esc(year.prefer_category || '')}${year.prefer_time ? ',' + esc(year.prefer_time) : ''}。以上来自微信读书阅读统计接口。

${(year.top_books || []).map(book => `
${esc(book.title)}${esc(book.read_time_str)}
`).join('')}`); + break; + } + } } - -// ===== 初始化 ===== - -document.addEventListener("DOMContentLoaded", async () => { - const isHealthy = await checkDBHealth(); - if (!isHealthy) return; - - loadOverview(); - loadTopBooks(); - loadShelfCategories(); - loadShelf(1); - loadNotebooks(); - loadRecommend(0); - initBackToTop(); - - // 搜索和筛选事件 - document.getElementById("shelfSearch").addEventListener("input", debounce(() => loadShelf(1), 300)); - document.getElementById("finishedOnly").addEventListener("change", () => loadShelf(1)); +document.addEventListener('click', event => { + const action = event.target.closest('[data-action]'); + if (action) { handleAction(action); return; } + const nav = event.target.closest('[data-page]'); + if (nav) { searchQuery = ''; $('#global-search').value = ''; navigate(nav.dataset.page); } }); - -// ===== 总览数据 ===== -async function loadOverview() { - try { - const data = await fetchAPI("/api/overview"); - - const heroStats = document.getElementById("heroStats"); - heroStats.innerHTML = ` -
-
${formatHours(data.total_read_time)}
-
累计阅读 (小时)
-
-
-
${data.read_days}
-
阅读天数
-
-
-
${data.shelf_count}
-
书架藏书
-
-
-
${data.total_notes}
-
读书笔记
-
- `; - - document.getElementById("heroSubtitle").textContent = - `自 ${data.regist_time} 加入微信读书,已陪伴你 ${data.read_days} 个阅读的日子`; - - const statsGrid = document.getElementById("statsGrid"); - statsGrid.innerHTML = ` -
-
⏱️
-
${data.total_read_time_str}
-
累计阅读时长
-
今年: ${data.year_read_time_str}
-
-
-
📅
-
${data.read_days}
-
累计阅读天数
-
今年: ${data.year_read_days} 天
-
-
-
📚
-
${data.shelf_count}
-
书架书籍
-
已读完: ${data.finished_count} 本
-
-
-
✍️
-
${data.total_notes}
-
读书笔记
-
来自 ${data.notebook_count} 本书
-
- `; - - const timeStr = `数据更新: ${data.fetch_time}`; - document.getElementById("fetchTime").textContent = timeStr; - document.getElementById("footerTime").textContent = data.fetch_time; - } catch (e) { - console.error("加载总览失败:", e); - } -} - -// ===== 年度趋势图 ===== -async function loadYearlyTrend() { - try { - const data = await fetchAPI("/api/yearly-trend"); - const el = document.getElementById("chart-yearly"); - if (chartInstances.yearly) chartInstances.yearly.dispose(); - const chart = echarts.init(el); - chartInstances.yearly = chart; - - const c = getChartColors(); - const years = data.map((d) => d.year); - const hours = data.map((d) => d.hours); - - chart.setOption({ - tooltip: { - trigger: "axis", - backgroundColor: c.tooltipBg, - borderColor: c.tooltipBorder, - textStyle: { color: c.tooltipText }, - formatter: (params) => { - const p = params[0]; - return `${p.name}年
阅读: ${p.value} 小时`; - }, - }, - grid: { left: 50, right: 30, top: 30, bottom: 40 }, - xAxis: { - type: "category", - data: years, - axisLabel: { color: c.axis }, - axisLine: { lineStyle: { color: c.axisLine } }, - }, - yAxis: { - type: "value", - name: "小时", - nameTextStyle: { color: c.axis }, - axisLabel: { color: c.axis }, - splitLine: { lineStyle: { color: c.splitLine } }, - }, - series: [{ - data: hours, - type: "bar", - barWidth: "50%", - itemStyle: { - borderRadius: [8, 8, 0, 0], - color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, - colorStops: [ - { offset: 0, color: c.accentLight }, - { offset: 1, color: c.accent }, - ] }, - }, - label: { show: true, position: "top", color: c.label, fontSize: 12, formatter: "{c}h" }, - }], - }); - window.addEventListener("resize", () => chart.resize()); - } catch (e) { - console.error("加载年度趋势失败:", e); - } -} - -// ===== 24小时时段分布 ===== -async function loadTimeDistribution() { - try { - const data = await fetchAPI("/api/time-distribution"); - const el = document.getElementById("chart-hours"); - if (chartInstances.hours) chartInstances.hours.dispose(); - const chart = echarts.init(el); - chartInstances.hours = chart; - - const c = getChartColors(); - const hours = data.map((d) => `${d.hour}时`); - const minutes = data.map((d) => d.duration_min); - - chart.setOption({ - tooltip: { - trigger: "axis", - backgroundColor: c.tooltipBg, - borderColor: c.tooltipBorder, - textStyle: { color: c.tooltipText }, - formatter: (params) => { - const p = params[0]; - return `${p.name}
阅读: ${p.value} 分钟`; - }, - }, - grid: { left: 50, right: 20, top: 20, bottom: 40 }, - xAxis: { - type: "category", - data: hours, - axisLabel: { color: c.axis, fontSize: 10, interval: 2 }, - axisLine: { lineStyle: { color: c.axisLine } }, - }, - yAxis: { - type: "value", - name: "分钟", - nameTextStyle: { color: c.axis }, - axisLabel: { color: c.axis }, - splitLine: { lineStyle: { color: c.splitLine } }, - }, - series: [{ - data: minutes, - type: "line", - smooth: true, - symbol: "circle", - symbolSize: 4, - lineStyle: { width: 2, color: c.accent }, - itemStyle: { color: c.accent }, - areaStyle: { - color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, - colorStops: [ - { offset: 0, color: c.accent + "4D" }, - { offset: 1, color: c.accent + "05" }, - ] }, - }, - }], - }); - window.addEventListener("resize", () => chart.resize()); - } catch (e) { - console.error("加载时段分布失败:", e); - } -} - -// ===== 偏好分类 ===== -async function loadCategories() { - try { - const data = await fetchAPI("/api/categories"); - const el = document.getElementById("chart-categories"); - if (chartInstances.categories) chartInstances.categories.dispose(); - const chart = echarts.init(el); - chartInstances.categories = chart; - - const c = getChartColors(); - const items = data.slice(0, 8).map((d) => ({ - name: d.category_title, - value: d.reading_time, - })); - - chart.setOption({ - tooltip: { - trigger: "item", - backgroundColor: c.tooltipBg, - borderColor: c.tooltipBorder, - textStyle: { color: c.tooltipText }, - formatter: (p) => { - const hours = (p.value / 3600).toFixed(1); - return `${p.name}
阅读: ${hours} 小时 (${p.percent}%)`; - }, - }, - legend: { - type: "scroll", - orient: "vertical", - right: 10, - top: 20, - bottom: 20, - textStyle: { color: c.label, fontSize: 11 }, - }, - series: [{ - type: "pie", - radius: ["40%", "70%"], - center: ["35%", "50%"], - avoidLabelOverlap: false, - itemStyle: { borderRadius: 6, borderColor: c.borderColor, borderWidth: 2 }, - label: { show: false }, - emphasis: { - label: { show: true, fontSize: 14, fontWeight: "bold", color: c.tooltipText }, - }, - data: items, - color: ["#c17b4a", "#e8a87c", "#d4a574", "#b8860b", "#cd853f", "#daa520", "#bc8f8f", "#bdb76b"], - }], - }); - window.addEventListener("resize", () => chart.resize()); - } catch (e) { - console.error("加载分类失败:", e); - } -} - -// ===== 偏好作者 ===== -async function loadAuthors() { - try { - const data = await fetchAPI("/api/authors"); - const el = document.getElementById("chart-authors"); - if (chartInstances.authors) chartInstances.authors.dispose(); - const chart = echarts.init(el); - chartInstances.authors = chart; - - const c = getChartColors(); - const top10 = data.slice(0, 10); - const names = top10.map((d) => d.name); - const counts = top10.map((d) => d.count); - - chart.setOption({ - tooltip: { - trigger: "axis", - axisPointer: { type: "shadow" }, - backgroundColor: c.tooltipBg, - borderColor: c.tooltipBorder, - textStyle: { color: c.tooltipText }, - formatter: (params) => { - const p = params[0]; - return `${p.name}
阅读: ${p.value} 本`; - }, - }, - grid: { left: 100, right: 40, top: 20, bottom: 20 }, - xAxis: { - type: "value", - axisLabel: { color: c.axis }, - splitLine: { lineStyle: { color: c.splitLine } }, - }, - yAxis: { - type: "category", - data: names.reverse(), - axisLabel: { color: c.axis, fontSize: 12 }, - axisLine: { lineStyle: { color: c.axisLine } }, - }, - series: [{ - type: "bar", - data: counts.reverse(), - barWidth: "50%", - itemStyle: { - borderRadius: [0, 6, 6, 0], - color: { type: "linear", x: 0, y: 0, x2: 1, y2: 0, - colorStops: [ - { offset: 0, color: c.accentLight }, - { offset: 1, color: c.accent }, - ] }, - }, - label: { show: true, position: "right", color: c.label, fontSize: 12, formatter: "{c}本" }, - }], - }); - window.addEventListener("resize", () => chart.resize()); - } catch (e) { - console.error("加载作者失败:", e); - } -} - -// ===== 读书排行(竖向列表) ===== -async function loadTopBooks() { - try { - const data = await fetchAPI("/api/top-books"); - const list = document.getElementById("topBooksGrid"); - - list.innerHTML = data - .map((book, i) => { - const tagsHtml = book.tags - .map((t) => `${t}`) - .join(""); - return ` -
- ${i + 1} - ${book.title} -
-
${book.title}
-
- ${book.author} - ${tagsHtml ? `
${tagsHtml}
` : ""} -
-
-
⏱ ${book.read_time_str}
-
`; - }) - .join(""); - } catch (e) { - console.error("加载排行失败:", e); - } -} - -// ===== 书架 ===== -let shelfCurrentPage = 1; - -async function loadShelf(page) { - shelfCurrentPage = page; - const keyword = document.getElementById("shelfSearch").value.trim(); - const finished = document.getElementById("finishedOnly").checked ? "1" : "0"; - const params = new URLSearchParams({ page: page, per_page: 60, finished: finished }); - if (keyword) params.set("keyword", keyword); - if (shelfActiveCategory) { - params.set("category", shelfActiveCategory); - } else if (shelfActiveParent) { - params.set("parent_category", shelfActiveParent); - } - if (shelfSortMode === "category") params.set("sort", "category"); - - try { - const data = await fetchAPI(`/api/shelf?${params}`); - const grid = document.getElementById("bookGrid"); - - document.getElementById("shelfInfo").textContent = - `共 ${data.total} 本 · 第 ${page}/${data.total_pages} 页`; - - grid.innerHTML = data.books.map((book) => renderBookCard(book)).join(""); - - renderPagination(page, data.total_pages); - } catch (e) { - console.error("加载书架失败:", e); - } -} - -function renderBookCard(book) { - const badges = []; - if (book.is_top) badges.push(`置顶`); - if (book.finish_reading) badges.push(`已读完`); - return ` -
-
- ${book.title} - ${badges.join("")} -
-
${book.title}
-
${book.author}
-
`; -} - -function renderPagination(current, total) { - const pag = document.getElementById("pagination"); - if (total <= 1) { pag.innerHTML = ""; return; } - - let html = ``; - const maxButtons = 7; - let start = Math.max(1, current - 3); - let end = Math.min(total, start + maxButtons - 1); - start = Math.max(1, end - maxButtons + 1); - - if (start > 1) { - html += ``; - if (start > 2) html += `...`; - } - for (let i = start; i <= end; i++) { - html += ``; - } - if (end < total) { - if (end < total - 1) html += `...`; - html += ``; - } - html += ``; - pag.innerHTML = html; -} - -function debounce(fn, delay) { - let timer; - return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); }; -} - -// ===== 笔记概览 ===== -async function loadNotebooks() { - try { - const data = await fetchAPI("/api/notebooks"); - const summary = document.getElementById("notesSummary"); - - const totalHighlights = data.reduce((s, d) => s + d.note_count, 0); - const totalReviews = data.reduce((s, d) => s + d.review_count, 0); - const totalBookmarks = data.reduce((s, d) => s + d.bookmark_count, 0); - - summary.innerHTML = ` -
-
${data.length}
-
有笔记的书
-
-
-
${totalHighlights}
-
划线
-
-
-
${totalReviews}
-
想法/点评
-
-
-
${totalBookmarks}
-
书签
-
- `; - - const grid = document.getElementById("notebooksGrid"); - grid.innerHTML = data - .map((nb) => { - const progress = nb.reading_progress || 0; - return ` -
- ${nb.title} -
-
${nb.title}
-
${nb.author}
-
- 划线 ${nb.note_count} - 想法 ${nb.review_count} - 书签 ${nb.bookmark_count} -
-
-
-
-
-
`; - }) - .join(""); - } catch (e) { - console.error("加载笔记失败:", e); - } -} - -// ===== 书籍详情弹窗 ===== -function openBook(bookId) { - if (!bookId) return; - showModal("bookDetailModal"); - const body = document.getElementById("bookDetailBody"); - body.innerHTML = `
`; - - fetchAPI(`/api/book/detail?book_id=${bookId}`) - .then((data) => { - const p = data.progress || {}; - const progress = p.progress || 0; - const rating = data.new_rating > 0 ? (data.new_rating / 10).toFixed(1) : null; - const tags = []; - if (data.category) tags.push(data.category); - if (rating) tags.push(`${rating}分`); - if (data.new_rating_count) tags.push(`${data.new_rating_count}人评分`); - - body.innerHTML = ` -
- ${data.title} -
-
${data.title}
-
${data.author || ''}${data.translator ? ' / 译: ' + data.translator : ''}
-
${tags.map(t => `${t}`).join('')}
- ${p.is_start_reading ? ` -
-
- 阅读进度: ${p.progress}% - ${p.record_reading_time_str ? ' · 累计 ' + p.record_reading_time_str : ''} - ${p.finish_time ? ' · 读完于 ' + p.finish_time : ''} -
-
-
-
-
` : '
尚未开始阅读
'} -
-
- ${data.intro ? `
${data.intro}
` : ''} -
- ${data.publisher ? `
出版社: ${data.publisher}
` : ''} - ${data.publish_time ? `
出版时间: ${data.publish_time}
` : ''} - ${data.isbn ? `
ISBN: ${data.isbn}
` : ''} - ${data.word_count ? `
字数: ${(data.word_count / 10000).toFixed(1)}万字
` : ''} -
-
- - -
- `; - }) - .catch((e) => { - body.innerHTML = `
加载失败: ${e.message}
`; - }); -} - -// ===== 想法详情独立页面 ===== - -function openThoughtsPage(bookId, title, author, cover) { - if (!bookId) return; - - // 隐藏主视图,显示想法页面 - document.getElementById("mainView").style.display = "none"; - document.getElementById("thoughtsPage").style.display = "block"; - window.scrollTo({ top: 0, behavior: "auto" }); - - // 渲染头部 - const header = document.getElementById("thoughtsBookHeader"); - header.innerHTML = ` - ${title} -
-
${title}
-
${author || ''}
-
加载中...
-
- `; - - const content = document.getElementById("thoughtsContent"); - content.innerHTML = `
`; - - fetchAPI(`/api/book/notes?book_id=${bookId}`) - .then((data) => { - currentThoughtsData = data; - renderThoughtsPage(data); - }) - .catch((e) => { - content.innerHTML = `
加载失败: ${e.message}
`; - }); -} - -function closeThoughtsPage() { - document.getElementById("thoughtsPage").style.display = "none"; - document.getElementById("mainView").style.display = ""; - currentThoughtsData = null; -} - -function renderThoughtsPage(data) { - // 更新统计 - const stats = document.getElementById("thoughtsBookStats"); - - // 分类:划线 / 书评 / 想法 - const highlights = data.highlights || []; - const bookReviews = (data.reviews || []).filter((r) => r.is_finish); - const thoughts = (data.reviews || []).filter((r) => !r.is_finish); - - stats.innerHTML = ` - 划线 ${highlights.length} - 书评 ${bookReviews.length} - 想法 ${thoughts.length} - `; - - const content = document.getElementById("thoughtsContent"); - - if (highlights.length === 0 && bookReviews.length === 0 && thoughts.length === 0) { - content.innerHTML = `
暂无笔记数据
`; - return; - } - - let html = ` -
-
- - - - -
-
- - -
-
-
- `; - - content.innerHTML = html; - currentThoughtsCategory = "all"; - currentThoughtsSort = "time_desc"; - currentThoughtsSearch = ""; - renderThoughtsList("all"); -} - -function filterThoughts(category) { - document.querySelectorAll(".thought-filter-btn").forEach((btn) => { - btn.classList.remove("active"); - }); - event.target.closest(".thought-filter-btn").classList.add("active"); - currentThoughtsCategory = category; - renderThoughtsList(category); -} - -function onThoughtsSearch(val) { - currentThoughtsSearch = val.trim().toLowerCase(); - renderThoughtsList(currentThoughtsCategory); -} - -function onThoughtsSort(val) { - currentThoughtsSort = val; - renderThoughtsList(currentThoughtsCategory); -} - -/** 解析日期字符串为时间戳,无效则返回 0 */ -function parseDate(str) { - if (!str) return 0; - const d = new Date(str.replace(/-/g, "/")); - return isNaN(d.getTime()) ? 0 : d.getTime(); -} - -/** 对数组按排序模式排序,返回新数组 */ -function sortByMode(arr) { - const sorted = [...arr]; - if (currentThoughtsSort === "time_desc") { - sorted.sort((a, b) => parseDate(b.create_time) - parseDate(a.create_time)); - } else if (currentThoughtsSort === "time_asc") { - sorted.sort((a, b) => parseDate(a.create_time) - parseDate(b.create_time)); - } else if (currentThoughtsSort === "chapter") { - sorted.sort((a, b) => { - const ua = parseInt(a.chapter_uid) || 0; - const ub = parseInt(b.chapter_uid) || 0; - if (ua !== ub) return ua - ub; - // 同章节内按 range 起始位置排序 - const ra = a.range ? parseInt(a.range.split("-")[0]) : 0; - const rb = b.range ? parseInt(b.range.split("-")[0]) : 0; - return ra - rb; - }); - } - return sorted; -} - -/** 过滤搜索关键词 */ -function matchSearch(text) { - if (!currentThoughtsSearch) return true; - return (text || "").toLowerCase().includes(currentThoughtsSearch); -} - -function renderThoughtsList(category) { - const data = currentThoughtsData; - if (!data) return; - - // 原始分类 - let highlights = data.highlights || []; - let bookReviews = (data.reviews || []).filter((r) => r.is_finish); - let thoughts = (data.reviews || []).filter((r) => !r.is_finish); - - // 搜索过滤 - highlights = highlights.filter((h) => matchSearch(h.mark_text)); - bookReviews = bookReviews.filter((r) => matchSearch(r.content) || matchSearch(r.abstract)); - thoughts = thoughts.filter((r) => matchSearch(r.content) || matchSearch(r.abstract)); - - // 排序 - highlights = sortByMode(highlights); - bookReviews = sortByMode(bookReviews); - thoughts = sortByMode(thoughts); - - const list = document.getElementById("thoughtsList"); - let html = ""; - - // 划线区 - if (category === "all" || category === "highlight") { - if (highlights.length > 0) { - html += `
📌 划线 ${highlights.length}
`; - if (currentThoughtsSort === "chapter") { - // 按章节分组展示 - const grouped = {}; - highlights.forEach((h) => { - const ch = h.chapter_title || "未知章节"; - if (!grouped[ch]) grouped[ch] = []; - grouped[ch].push(h); - }); - for (const [chTitle, items] of Object.entries(grouped)) { - html += `
`; - html += `
${chTitle}
`; - items.forEach((h) => { - html += ` -
- ${escapeHtml(h.mark_text)} -
- ${h.chapter_title ? `${h.chapter_title}` : ""} - ${h.create_time ? `${h.create_time}` : ""} -
-
- `; - }); - html += `
`; - } - } else { - // 按时间排序,平铺展示(标注章节) - highlights.forEach((h) => { - html += ` -
- ${escapeHtml(h.mark_text)} -
- ${h.chapter_title ? `${h.chapter_title}` : ""} - ${h.create_time ? `${h.create_time}` : ""} -
-
- `; - }); - } - } - } - - // 书评区 - if (category === "all" || category === "review") { - if (bookReviews.length > 0) { - html += `
⭐ 书评 ${bookReviews.length}
`; - bookReviews.forEach((r) => { - const starVal = Math.max(0, Math.min(5, parseInt(r.star) || 0)); - const stars = starVal > 0 ? `
${"★".repeat(starVal)}${"☆".repeat(5 - starVal)}
` : ""; - html += ` -
- ${stars} - ${escapeHtml(r.content)} -
- ${r.chapter_name ? `${r.chapter_name}` : ""} - ${r.create_time || ""} -
-
- `; - }); - } - } - - // 想法区 - if (category === "all" || category === "thought") { - if (thoughts.length > 0) { - html += `
💭 想法 ${thoughts.length}
`; - thoughts.forEach((r) => { - const abstract = r.abstract ? `
${escapeHtml(r.abstract)}
` : ""; - html += ` -
- ${abstract} -
${escapeHtml(r.content)}
-
- ${r.chapter_name ? `${r.chapter_name}` : ""} - ${r.create_time || ""} -
-
- `; - }); - } - } - - if (!html) { - if (currentThoughtsSearch) { - html = `
未找到包含"${escapeHtml(currentThoughtsSearch)}"的内容
`; - } else { - html = `
该分类暂无内容
`; - } - } - - list.innerHTML = html; -} - -// ===== 弹窗控制 ===== -function showModal(id) { - document.getElementById(id).classList.add("active"); - document.body.style.overflow = "hidden"; -} - -function closeModal(id) { - document.getElementById(id).classList.remove("active"); - document.body.style.overflow = ""; -} - -document.addEventListener("keydown", (e) => { - if (e.key === "Escape") { - closeModal("bookDetailModal"); - if (document.getElementById("thoughtsPage").style.display !== "none") { - closeThoughtsPage(); - } - } +document.addEventListener('change', event => { + if (event.target.matches('[data-pick-book]')) { const id = event.target.dataset.pickBook; event.target.checked ? draftIds.add(id) : draftIds.delete(id); renderPicker(); } + if (event.target.id === 'chapter-filter') { + selectedChapter = event.target.value; bookTab = 'popular'; renderBookDetail(); + if (!numberData[`hl:${detailBook}:${selectedChapter}`]) WeApi.highlights(detailBook, selectedChapter).then(res => { numberData[`hl:${detailBook}:${selectedChapter}`] = res; renderBookDetail(); }).catch(error => toast(error.message)); + } + if (event.target.id === 'search-scope') { searchScope = event.target.value; renderPage(); } }); +$('#goal-start').onchange = () => { $('#goal-end').min = $('#goal-start').value; }; +$('#goal-name').oninput = () => $('#goal-name').setCustomValidity(''); +$('#goal-form').onsubmit = saveGoal; +$('#picker-search').oninput = renderPicker; +$('#global-search').oninput = event => { + searchQuery = event.target.value.trim(); + if (!['books', 'all', 'author', 'novel', 'audio', 'fulltext', 'account', 'article'].includes(discoverTab)) discoverTab = 'books'; + navigate('discover'); +}; +document.addEventListener('input', event => { + if (event.target.id === 'discover-search') { + const position = event.target.selectionStart; searchQuery = event.target.value; $('#global-search').value = searchQuery; renderPage(); + $('#discover-search').focus(); $('#discover-search').setSelectionRange(position, position); + } +}); +document.addEventListener('keydown', event => { if ((event.metaKey || event.ctrlKey) && event.key === 'k') { event.preventDefault(); $('#global-search').focus(); } }); +document.querySelectorAll('dialog').forEach(dialog => dialog.addEventListener('click', event => { + const rect = dialog.getBoundingClientRect(); + if (event.target === dialog && (event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom)) dialog.close(); +})); -// ===== 推荐发现 ===== -let recommendMaxIdx = 0; +/* ------------------------------- 启动 ------------------------------- */ -function switchDiscoverTab(tab) { - const recPanel = document.getElementById("recommendPanel"); - const searchPanel = document.getElementById("searchPanel"); - const tabRec = document.getElementById("tabRecommend"); - const tabSearch = document.getElementById("tabSearch"); - - if (tab === "recommend") { - recPanel.style.display = ""; - searchPanel.style.display = "none"; - tabRec.classList.add("active"); - tabSearch.classList.remove("active"); - } else { - recPanel.style.display = "none"; - searchPanel.style.display = ""; - tabRec.classList.remove("active"); - tabSearch.classList.add("active"); - } -} - -async function loadRecommend(maxIdx) { - const grid = document.getElementById("recommendGrid"); - grid.innerHTML = `
`; - - try { - const data = await fetchAPI(`/api/recommend?maxIdx=${maxIdx}`); - recommendMaxIdx = data.last_search_idx || 0; - renderDiscoverGrid(grid, data.books, true); - } catch (e) { - grid.innerHTML = `
加载推荐失败: ${e.message}
`; - } -} - -async function loadMoreRecommend() { - loadRecommend(recommendMaxIdx); -} - -async function doSearch() { - const keyword = document.getElementById("searchInput").value.trim(); - if (!keyword) return; - - const grid = document.getElementById("searchGrid"); - grid.innerHTML = `
`; - - try { - const data = await fetchAPI(`/api/search?keyword=${encodeURIComponent(keyword)}`); - if (data.books.length === 0) { - grid.innerHTML = `
未找到相关书籍
`; - return; - } - renderDiscoverGrid(grid, data.books, false); - } catch (e) { - grid.innerHTML = `
搜索失败: ${e.message}
`; - } -} - -function renderDiscoverGrid(grid, books, showReason) { - grid.innerHTML = books - .map((book) => { - const rating = book.new_rating > 0 ? (book.new_rating / 10).toFixed(1) : null; - const ratingLabel = book.rating_title ? `${book.rating_title}` : ""; - const ratingHtml = rating ? `${rating}` : ""; - const readingHtml = book.reading_count ? `${book.reading_count}人在读` : ""; - const reasonHtml = (showReason && book.reason) ? `
${book.reason}
` : ""; - const categoryHtml = book.category ? `
${book.category}
` : ""; - - return ` -
- ${book.title} -
-
${book.title}
-
${book.author || ''}
-
${ratingHtml}${ratingLabel}${readingHtml}
- ${categoryHtml} - ${reasonHtml} -
-
- `; - }) - .join(""); +async function boot() { + renderPage(); + await Promise.all([ensureStatus(), ensureShelf()]); + ensureDashboard(period); + if (page !== 'overview') renderPage(); } +boot(); diff --git a/static/js/demo-data.js b/static/js/demo-data.js new file mode 100644 index 0000000..ea9740a --- /dev/null +++ b/static/js/demo-data.js @@ -0,0 +1,25 @@ +// 所有数据均为设计示例,不来自真实账号。 +const books = [{title:'也许你该找个人聊聊',short:'也许你该\n找个人\n聊聊',author:'洛莉·戈特利布',en:'MAYBE YOU SHOULD TALK TO SOMEONE',cover:'c1',progress:68,status:'reading',score:'9.1',desc:'一位心理治疗师的回忆录。跟随几个普通人的故事,理解关系、失去与成长,也重新认识自己。'},{title:'三体',short:'三体',author:'刘慈欣',en:'THE THREE-BODY PROBLEM',cover:'c2',progress:42,status:'reading',score:'9.4',desc:'从一段隐秘的往事出发,走进人类与宇宙文明的宏大故事。科学、想象与命运交织,打开另一种观看世界的尺度。'},{title:'蛤蟆先生去看心理医生',short:'蛤蟆先生\n去看\n心理医生',author:'罗伯特·戴博德',en:'COUNSELLING FOR TOADS',cover:'c3',progress:85,status:'reading',score:'8.8',desc:'借由蛤蟆先生与心理咨询师的对话,探索情绪与行为背后的原因。这是一次关于理解自己、为自己负责的旅程。'},{title:'人生海海',short:'人生\n海海',author:'麦家',en:'LIFE IS A VAST SEA',cover:'c4',progress:26,status:'reading',score:'9.0',desc:'在复杂的时代与人情之中,讲述一个人的秘密与命运。人生如海,有暗流,也有让人继续前行的力量。'},{title:'活着',short:'活着',author:'余华',en:'TO LIVE',cover:'c3',progress:100,status:'done',score:'9.5',desc:'一个人与时代相遇的故事,关于生命的韧性与日常的重量。'},{title:'被讨厌的勇气',short:'被讨厌\n的勇气',author:'岸见一郎 / 古贺史健',en:'THE COURAGE TO BE DISLIKED',cover:'c1',progress:100,status:'done',score:'8.6',desc:'以对话的方式讨论人际关系、自我接纳与选择的自由。'},{title:'悉达多',short:'悉达多',author:'赫尔曼·黑塞',en:'SIDDHARTHA',cover:'c4',progress:0,status:'wish',score:'9.2',desc:'一个寻找自我的人,穿过不同的人生经验,在河流边学会倾听。'},{title:'置身事内',short:'置身\n事内',author:'兰小欢',en:'INSIDE THE SYSTEM',cover:'c2',progress:0,status:'wish',score:'9.3',desc:'从具体的经济生活出发,理解政府与经济发展的关系。'}]; +books.forEach((book, index) => { book.id = `b${index}`; }); +const booklists = [ + {id:'l1',name:'在故事里,读懂人生',source:'我的书单',description:'从别人的故事里,找到自己生活的回声。',ids:['b3','b4','b6']}, + {id:'l2',name:'心理学,向内走一程',source:'我的书单',description:'理解情绪与关系,也练习温柔地对待自己。',ids:['b0','b2','b5']}, + {id:'l3',name:'重新认识这个世界',source:'公开书单 · 示例',description:'从宇宙到日常,拓宽理解世界的尺度。',ids:['b1','b7','b6']}, + {id:'l4',name:'适合慢慢读的夜晚',source:'公开书单 · 示例',description:'把时间留给文学,让心绪落在书页之间。',ids:['b4','b6','b0']} +]; +const initialGoals = [ + {id:'g1',name:'秋季文学计划',start:'2026-09-01',end:'2026-11-30',ids:['b3','b4','b6','b1'],sources:['在故事里,读懂人生']}, + {id:'g2',name:'给内心一点生长的空间',start:'2026-09-01',end:'2026-10-31',ids:['b0','b2','b5'],sources:['心理学,向内走一程']}, + {id:'g3',name:'读完的书,成为自己的底气',start:'2026-08-01',end:'2026-08-31',ids:['b4','b5'],sources:[]} +]; +const personalNotes = [ + {id:'n1',bookId:'b0',type:'thought',text:'把注意力还给生活本身,让平凡的日子有迹可循。',date:'2026-09-11'}, + {id:'n2',bookId:'b1',type:'highlight',text:'在辽阔的未知面前,每一个问题都值得被认真对待。',date:'2026-09-10'}, + {id:'n3',bookId:'b2',type:'thought',text:'允许情绪出现,也给自己一些理解它的时间。',date:'2026-09-08'}, + {id:'n4',bookId:'b3',type:'highlight',text:'人生的答案,或许藏在继续向前的日子里。',date:'2026-09-06'} +]; +const publicReviews = [ + {id:'r1',name:'山间来信',rating:5,type:'推荐',text:'适合放慢速度去读。最打动我的,是读完之后还会不断回想的那些问题。',date:'2026-09-10'}, + {id:'r2',name:'晚风书屋',rating:3,type:'一般',text:'有一些有趣的视角,也有需要耐心消化的地方。每个人会读出不同的感受。',date:'2026-09-09'}, + {id:'r3',name:'一页一页',rating:1,type:'不行',text:'这次阅读没有找到共鸣,可能还不是适合我当下阅读的书。',date:'2026-09-08'} +]; diff --git a/static/js/weapi.js b/static/js/weapi.js new file mode 100644 index 0000000..3f7a98d --- /dev/null +++ b/static/js/weapi.js @@ -0,0 +1,125 @@ +/* ========================================================================== + 阅间 · 数据层(v2) + -------------------------------------------------------------------------- + 把后端 /api/v2/* 接口封装成前端可直接使用的数据结构。 + 设计稿(Design Demo)原本使用 demo-data.js 里的静态示例数据, + 这里替换为真实接口调用,字段名与设计稿保持一致。 + ========================================================================== */ +(function (global) { + 'use strict'; + + const BASE = '/api/v2'; + + async function request(path, params) { + const url = new URL(BASE + path, global.location.origin); + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined && value !== null && value !== '') url.searchParams.set(key, value); + }); + const response = await fetch(url.toString(), { headers: { Accept: 'application/json' } }); + let payload = null; + try { + payload = await response.json(); + } catch (error) { + payload = null; + } + if (!response.ok) { + const message = (payload && (payload.error || payload.detail)) || `请求失败(${response.status})`; + const err = new Error(message); + err.status = response.status; + err.payload = payload; + throw err; + } + return payload; + } + + /* ------------------------------ 工具函数 ------------------------------ */ + + function durationText(seconds) { + const total = Math.max(0, Math.round(Number(seconds) || 0)); + const hours = Math.floor(total / 3600); + const minutes = Math.round((total % 3600) / 60); + return hours ? `${hours}小时${minutes}分钟` : `${minutes}分钟`; + } + + function percentText(value) { + const num = Number(value) || 0; + return `${num}%`; + } + + /* ------------------------------ 接口封装 ------------------------------ */ + + const WeApi = { + durationText, + percentText, + + status() { + return request('/status'); + }, + + /** + * 书架数据 + * @param {string} tab all|reading|done|wish + * @param {{keyword?:string, limit?:number, offset?:number, progress?:boolean}} options + */ + shelf(tab, options) { + const opts = options || {}; + return request('/shelf', { + tab: tab || 'all', + keyword: opts.keyword || '', + limit: opts.limit, + offset: opts.offset, + progress: opts.progress ? 1 : 0, + }); + }, + + dashboard(period) { + return request('/dashboard', { period: period || 'week' }); + }, + + notebooks() { + return request('/notebooks'); + }, + + /** bookId 传 'all' 时聚合笔记最多的前 limit 本 */ + notes(bookId, limit) { + return request('/notes', { book_id: bookId, limit: limit }); + }, + + book(bookId) { + return request('/book/' + encodeURIComponent(bookId)); + }, + + reviews(bookId, type, count) { + return request(`/book/${encodeURIComponent(bookId)}/reviews`, { type: type || 0, count: count || 10 }); + }, + + highlights(bookId, chapterUid) { + return request(`/book/${encodeURIComponent(bookId)}/highlights`, { chapter_uid: chapterUid || 0 }); + }, + + underlineThoughts(bookId, chapterUid, range) { + return request(`/book/${encodeURIComponent(bookId)}/underline-thoughts`, { + chapter_uid: chapterUid, + range: range, + }); + }, + + thought(reviewId) { + return request('/thought/' + encodeURIComponent(reviewId)); + }, + + archives() { + return request('/archives'); + }, + + recommend(maxIdx) { + return request('/recommend', { maxIdx: maxIdx || 0 }); + }, + + search(keyword, scope) { + return request('/search', { keyword: keyword, scope: scope || 'books' }); + }, + }; + + global.WeApi = WeApi; +})(window); diff --git a/templates/index.html b/templates/index.html index 803e317..b7e4462 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,211 +1,16 @@ - - + + - - - 我的读书数据 - - - - + +阅间 · 微信读书看板 + - - - - - - - - - - -
- - -
-
-
-
-

阅读,是一场漫长的旅行

-

正在加载数据...

-
-
-
-
-
-
-
-
-
- - -
-
-

📊 阅读数据可视化

-
-
-

年度阅读时长趋势

-
-
-
-

24小时阅读时段分布

-
-
-
-

偏好阅读分类

-
-
-
-

偏好作者 TOP 10

-
-
-
-
-
- - -
-
-

🏆 阅读时长排行

-
-
-
- - -
-
-

📚 我的书架

-
-
- - - -
-
-
-
-
- -
-
- - -
-
-

✍️ 笔记概览

-
-
-
-
- - -
-
-

🔍 推荐发现

-
- - -
-
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - -
-
-

数据来源:微信读书 · 数据存储:本地 MySQL · 更新时间:

- -
-
- - - - + + +
L
正在连接微信读书…阅读目标保存在当前浏览器
阅间 · 与好书相伴,与自己相遇数据来自微信读书个人账号
+

书籍详情

+
MAKE ROOM FOR READING

新建阅读目标

想读些什么?

选择书籍或加入书单当前书目,重复书籍只算一本,已读完直接计入完成。

+ \ No newline at end of file From 25293a1d50b06ca815027d24c64ca43f1cdfacfd Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 11 Sep 2026 18:21:13 +0800 Subject: [PATCH 08/16] =?UTF-8?q?chore(legacy):=20=E5=BD=92=E6=A1=A3=20v1?= =?UTF-8?q?=20=E5=89=8D=E7=AB=AF=E8=87=B3=20legacy/v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v2 成为默认前端后,把 v1 的模板与静态资源原样归档保留, 便于对照回滚。v1 后端接口 /api/* 未做改动。 --- legacy/v1/static/css/style.css | 2056 ++++++++++++++++++++++++++++++++ legacy/v1/static/js/app.js | 1267 ++++++++++++++++++++ legacy/v1/templates/index.html | 211 ++++ 3 files changed, 3534 insertions(+) create mode 100644 legacy/v1/static/css/style.css create mode 100644 legacy/v1/static/js/app.js create mode 100644 legacy/v1/templates/index.html diff --git a/legacy/v1/static/css/style.css b/legacy/v1/static/css/style.css new file mode 100644 index 0000000..92e4e86 --- /dev/null +++ b/legacy/v1/static/css/style.css @@ -0,0 +1,2056 @@ +/* ===== 主题变量 ===== */ +:root { + /* 明亮模式 - 暖纸色文学风 */ + --bg-primary: #f8f5f0; + --bg-card: #ffffff; + --bg-secondary: #f0ebe3; + --bg-hero: linear-gradient(135deg, #8B6914 0%, #c17b4a 50%, #a05c2c 100%); + --bg-hero-overlay: rgba(255, 255, 255, 0.04); + + --text-primary: #2c2416; + --text-secondary: #6b5d4f; + --text-light: #9b8e80; + + --accent: #c17b4a; + --accent-light: #e8a87c; + --accent-dark: #a05c2c; + --accent-bg: rgba(193, 123, 74, 0.08); + --accent-bg-hover: rgba(193, 123, 74, 0.12); + + --border: #e8e0d4; + --border-light: #f0ebe3; + + --shadow: 0 2px 12px rgba(44, 36, 22, 0.08); + --shadow-hover: 0 8px 24px rgba(44, 36, 22, 0.15); + --shadow-modal: 0 20px 60px rgba(0, 0, 0, 0.3); + + --radius: 12px; + --radius-sm: 8px; + --radius-xs: 4px; + + --alert-bg: #fff3cd; + --alert-border: #ffc107; + --alert-text: #856404; + + /* ECharts 专用 */ + --chart-axis: #6b5d4f; + --chart-axis-line: #e8e0d4; + --chart-split-line: #f0ebe3; + --chart-label: #6b5d4f; + --chart-border-color: #fff; + --chart-tooltip-bg: rgba(255, 255, 255, 0.95); + --chart-tooltip-border: #e8e0d4; + --chart-tooltip-text: #2c2416; + --chart-review-bg: #fff8e1; + --chart-review-border: #ffc107; + --chart-highlight-bg: #f8f5f0; + + /* 导航栏 */ + --nav-bg: rgba(255, 255, 255, 0.92); + --nav-shadow: 0 1px 4px rgba(0, 0, 0, 0.04); + + /* 模态遮罩 */ + --modal-overlay: rgba(0, 0, 0, 0.5); + + /* 主题切换按钮 */ + --toggle-bg: #f0ebe3; + --toggle-icon-sun: #f59e0b; + --toggle-icon-moon: #6b5d4f; + + /* 评分标签 */ + --rating-color: #e65100; + --rating-bg: #fff3e0; + --rating-star: #ff9800; + + /* 徽章 */ + --badge-finished-bg: #4caf50; + --badge-top-bg: rgba(255, 215, 0, 0.9); + --badge-top-text: #5d4037; + --rank-bg: rgba(0, 0, 0, 0.7); + --rank-text: #ffd700; +} + +[data-theme="dark"] { + /* 黑暗模式 - 暖色深调,保持文学质感 */ + --bg-primary: #1a1612; + --bg-card: #252019; + --bg-secondary: #2d2820; + --bg-hero: linear-gradient(135deg, #3d2e1a 0%, #5c3f1e 50%, #4a3015 100%); + --bg-hero-overlay: rgba(255, 255, 255, 0.03); + + --text-primary: #e8e0d4; + --text-secondary: #b0a698; + --text-light: #8a7f70; + + --accent: #d4925a; + --accent-light: #e8a87c; + --accent-dark: #b87436; + --accent-bg: rgba(212, 146, 90, 0.12); + --accent-bg-hover: rgba(212, 146, 90, 0.18); + + --border: #3a342c; + --border-light: #2d2820; + + --shadow: 0 2px 12px rgba(0, 0, 0, 0.3); + --shadow-hover: 0 8px 24px rgba(0, 0, 0, 0.4); + --shadow-modal: 0 20px 60px rgba(0, 0, 0, 0.6); + + --alert-bg: #3d2f15; + --alert-border: #8a6d1e; + --alert-text: #f0d77a; + + /* ECharts 专用 */ + --chart-axis: #b0a698; + --chart-axis-line: #3a342c; + --chart-split-line: #2d2820; + --chart-label: #b0a698; + --chart-border-color: #252019; + --chart-tooltip-bg: rgba(37, 32, 25, 0.95); + --chart-tooltip-border: #3a342c; + --chart-tooltip-text: #e8e0d4; + --chart-review-bg: #2d2515; + --chart-review-border: #66521e; + --chart-highlight-bg: #2d2820; + + /* 导航栏 */ + --nav-bg: rgba(26, 22, 18, 0.92); + --nav-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + + /* 模态遮罩 */ + --modal-overlay: rgba(0, 0, 0, 0.7); + + /* 主题切换按钮 */ + --toggle-bg: #2d2820; + --toggle-icon-sun: #f59e0b; + --toggle-icon-moon: #d4925a; + + /* 评分标签 */ + --rating-color: #ff9800; + --rating-bg: #3d2e15; + --rating-star: #ffa726; + + /* 徽章 */ + --badge-finished-bg: #2e7d32; + --badge-top-bg: rgba(255, 215, 0, 0.85); + --badge-top-text: #3d2e15; + --rank-bg: rgba(0, 0, 0, 0.8); + --rank-text: #ffd700; +} + +/* ===== 全局过渡 ===== */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", + "Hiragino Sans GB", "Microsoft YaHei", sans-serif; + background: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; + transition: background-color 0.3s ease, color 0.3s ease; +} + +/* 所有主题相关元素平滑过渡 */ +.navbar, .nav-link, .stat-card, .chart-card, .top-book-card, .book-card, +.book-cover-wrapper, .notebook-card, .note-stat, .discover-card, .discover-tab, +.modal-content, .modal-overlay, .footer, .db-alert-banner, .page-btn, +.btn-primary, .btn-secondary, .search-input, .shelf-search, .highlight-item, +.review-item, .detail-progress-info, .top-book-cover-wrapper, +.theme-toggle, .loading-spinner { + transition: background-color 0.3s ease, border-color 0.3s ease, + color 0.3s ease, box-shadow 0.3s ease, transform 0.2s ease; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 24px; +} + +/* ===== 导航栏 ===== */ +.navbar { + position: sticky; + top: 0; + z-index: 100; + background: var(--nav-bg); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + border-bottom: 1px solid var(--border); + box-shadow: var(--nav-shadow); +} + +.nav-container { + max-width: 1200px; + margin: 0 auto; + padding: 0 24px; + height: 60px; + display: flex; + align-items: center; + justify-content: space-between; +} + +.nav-logo { + display: flex; + align-items: center; + gap: 8px; + font-size: 18px; + font-weight: 700; + color: var(--text-primary); +} + +.logo-icon { + font-size: 24px; +} + +.nav-links { + display: flex; + gap: 24px; + align-items: center; +} + +.nav-link { + text-decoration: none; + color: var(--text-secondary); + font-size: 14px; + font-weight: 500; + padding: 6px 12px; + border-radius: var(--radius-sm); + transition: all 0.2s; +} + +.nav-link:hover { + color: var(--accent); + background: var(--accent-bg); +} + +.nav-link.active { + color: var(--accent); + background: var(--accent-bg-hover); +} + +.nav-right { + display: flex; + align-items: center; + gap: 16px; +} + +.nav-update { + font-size: 12px; + color: var(--text-light); +} + +/* ===== 主题切换按钮 ===== */ +.theme-toggle { + width: 40px; + height: 40px; + border: 1px solid var(--border); + border-radius: 50%; + background: var(--toggle-bg); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + line-height: 1; + color: var(--toggle-icon-moon); + flex-shrink: 0; +} + +.theme-toggle:hover { + border-color: var(--accent); + transform: scale(1.08); +} + +.theme-toggle .icon-sun { display: none; } +.theme-toggle .icon-moon { display: block; } + +[data-theme="dark"] .theme-toggle .icon-sun { display: block; } +[data-theme="dark"] .theme-toggle .icon-moon { display: none; } +[data-theme="dark"] .theme-toggle { color: var(--toggle-icon-sun); } + +/* ===== 顶部常驻搜索框 ===== */ +.global-search-bar { + position: sticky; + top: 60px; + z-index: 90; + background: var(--nav-bg); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + border-bottom: 1px solid var(--border); + padding: 10px 0; + transition: background-color 0.3s ease, border-color 0.3s ease; +} + +.global-search-wrapper { + display: flex; + align-items: center; + gap: 0; + max-width: 600px; + margin: 0 auto; + position: relative; +} + +.global-search-icon { + position: absolute; + left: 14px; + font-size: 15px; + opacity: 0.5; + pointer-events: none; +} + +.global-search-input { + flex: 1; + padding: 9px 16px 9px 40px; + border: 1px solid var(--border); + border-right: none; + border-radius: var(--radius-sm) 0 0 var(--radius-sm); + font-size: 14px; + background: var(--bg-card); + color: var(--text-primary); + transition: border-color 0.2s, box-shadow 0.2s; +} + +.global-search-input:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-bg); +} + +.global-search-btn { + padding: 9px 20px; + border: 1px solid var(--accent); + border-radius: 0 var(--radius-sm) var(--radius-sm) 0; + background: var(--accent); + color: #fff; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: background 0.2s; +} + +.global-search-btn:hover { + background: var(--accent-dark); +} + +/* ===== 书架分类标签 ===== */ +/* 层级折叠分类标签 */ +.shelf-categories { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 20px; + align-items: center; +} + +.shelf-cat-parent { + padding: 5px 14px; + border: 1px solid var(--border); + border-radius: 20px; + font-size: 13px; + color: var(--text-secondary); + background: var(--bg-card); + cursor: pointer; + transition: all 0.2s; + white-space: nowrap; + display: inline-flex; + align-items: center; + gap: 5px; +} + +.shelf-cat-parent:hover { + border-color: var(--accent); + color: var(--accent); + background: var(--accent-bg); +} + +.shelf-cat-parent.active { + border-color: var(--accent); + color: #fff; + background: var(--accent); + font-weight: 500; +} + +.shelf-cat-count { + font-size: 11px; + padding: 1px 7px; + border-radius: 10px; + background: var(--accent-bg); + color: var(--accent-dark); +} + +.shelf-cat-parent.active .shelf-cat-count { + background: rgba(255,255,255,0.25); + color: #fff; +} + +.shelf-cat-arrow { + font-size: 9px; + margin-left: 2px; + transition: transform 0.2s; +} + +.shelf-cat-subs { + display: flex; + flex-wrap: wrap; + gap: 6px; + width: 100%; + padding: 4px 0 4px 20px; + margin-bottom: 4px; + animation: fadeIn 0.2s ease; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(-4px); } + to { opacity: 1; transform: translateY(0); } +} + +.shelf-cat-sub { + padding: 3px 12px; + border: 1px solid var(--border); + border-radius: 16px; + font-size: 12px; + color: var(--text-light); + background: var(--bg-primary); + cursor: pointer; + transition: all 0.2s; + white-space: nowrap; + display: inline-flex; + align-items: center; + gap: 4px; +} + +.shelf-cat-sub:hover { + border-color: var(--accent); + color: var(--accent); +} + +.shelf-cat-sub.active { + border-color: var(--accent); + color: #fff; + background: var(--accent); + font-weight: 500; +} + +.shelf-cat-count-sm { + font-size: 10px; + padding: 0 5px; + border-radius: 8px; + background: var(--accent-bg); + color: var(--accent-dark); +} + +.shelf-cat-sub.active .shelf-cat-count-sm { + background: rgba(255,255,255,0.25); + color: #fff; +} + +/* ===== Hero 区 ===== */ +.hero-section { + position: relative; + padding: 80px 0 60px; + overflow: hidden; + background: var(--bg-hero); + transition: background 0.5s ease; +} + +.hero-bg { + position: absolute; + inset: 0; + background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3Cg fill='%23ffffff' fill-opacity='0.05'%3E%3Cpath d='M50 25 L55 40 L70 40 L58 50 L63 65 L50 55 L37 65 L42 50 L30 40 L45 40 Z'/%3E%3C/g%3E%3C/svg%3E"); + opacity: 0.6; +} + +.hero-content { + position: relative; + text-align: center; + color: #fff; + max-width: 800px; + margin: 0 auto; + padding: 0 24px; +} + +.hero-title { + font-size: 36px; + font-weight: 700; + margin-bottom: 12px; + letter-spacing: 2px; + text-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); +} + +.hero-subtitle { + font-size: 16px; + opacity: 0.9; + margin-bottom: 40px; +} + +.hero-stats { + display: flex; + justify-content: center; + gap: 48px; + flex-wrap: wrap; +} + +.hero-stat { + text-align: center; +} + +.hero-stat-value { + font-size: 42px; + font-weight: 800; + line-height: 1.2; + text-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); +} + +.hero-stat-label { + font-size: 14px; + opacity: 0.85; + margin-top: 4px; +} + +/* ===== 统计卡片 ===== */ +.stats-cards-section { + padding: 40px 0 20px; + margin-top: -40px; + position: relative; + z-index: 10; +} + +.stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 20px; +} + +.stat-card { + background: var(--bg-card); + border-radius: var(--radius); + padding: 24px; + box-shadow: var(--shadow); + transition: transform 0.2s, box-shadow 0.3s, background-color 0.3s, border-color 0.3s; + text-align: center; + border: 1px solid var(--border); +} + +.stat-card:hover { + transform: translateY(-4px); + box-shadow: var(--shadow-hover); +} + +.stat-card-icon { + font-size: 32px; + margin-bottom: 12px; +} + +.stat-card-value { + font-size: 28px; + font-weight: 800; + color: var(--accent-dark); + margin-bottom: 4px; +} + +.stat-card-label { + font-size: 13px; + color: var(--text-secondary); +} + +.stat-card-sub { + font-size: 12px; + color: var(--text-light); + margin-top: 4px; +} + +/* ===== Section 标题 ===== */ +.section-title { + font-size: 24px; + font-weight: 700; + margin-bottom: 32px; + color: var(--text-primary); + text-align: center; +} + +/* ===== 图表区 ===== */ +.charts-section { + padding: 60px 0; +} + +.charts-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 24px; +} + +.chart-card { + background: var(--bg-card); + border-radius: var(--radius); + padding: 24px; + box-shadow: var(--shadow); + border: 1px solid var(--border); +} + +.chart-card.large { + grid-column: 1 / -1; +} + +.chart-title { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 16px; +} + +.chart-container { + width: 100%; + height: 320px; +} + +/* ===== 标签页切换 ===== */ +.tab-panel { + display: none; + animation: fadeInTab 0.3s ease; +} + +.tab-panel.active { + display: block; +} + +@keyframes fadeInTab { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ===== 读书排行(竖向列表) ===== */ +.top-books-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.top-book-row { + display: flex; + align-items: center; + gap: 16px; + background: var(--bg-card); + border-radius: var(--radius); + padding: 12px 16px; + box-shadow: var(--shadow); + border: 1px solid var(--border); + cursor: pointer; + transition: transform 0.2s, box-shadow 0.3s, background-color 0.3s, border-color 0.3s; +} + +.top-book-row:hover { + transform: translateX(4px); + box-shadow: var(--shadow-hover); + border-color: var(--accent); +} + +.top-book-rank-num { + flex-shrink: 0; + width: 36px; + height: 36px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + font-weight: 800; + background: var(--accent-bg); + color: var(--accent-dark); +} + +.top-book-row:nth-child(1) .top-book-rank-num { + background: linear-gradient(135deg, #ffd700, #ffa500); + color: #fff; +} + +.top-book-row:nth-child(2) .top-book-rank-num { + background: linear-gradient(135deg, #c0c0c0, #a8a8a8); + color: #fff; +} + +.top-book-row:nth-child(3) .top-book-rank-num { + background: linear-gradient(135deg, #cd7f32, #b87333); + color: #fff; +} + +.top-book-mini-cover { + flex-shrink: 0; + width: 48px; + height: 64px; + border-radius: 6px; + object-fit: cover; + box-shadow: var(--shadow); + background: var(--bg-primary); +} + +.top-book-row-info { + flex: 1; + min-width: 0; +} + +.top-book-row-title { + font-size: 15px; + font-weight: 600; + color: var(--text-primary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.top-book-row-meta { + display: flex; + align-items: center; + gap: 12px; + margin-top: 4px; + font-size: 12px; + color: var(--text-light); +} + +.top-book-row-time { + font-size: 13px; + color: var(--accent); + font-weight: 600; + flex-shrink: 0; +} + +.top-book-row-tags { + display: flex; + gap: 4px; + flex-wrap: wrap; +} + +.top-book-tag { + font-size: 11px; + padding: 2px 8px; + border-radius: 10px; + background: var(--accent-bg-hover); + color: var(--accent-dark); +} + +/* ===== 书架 ===== */ +.shelf-section { + padding: 60px 0; +} + +.shelf-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 24px; + flex-wrap: wrap; + gap: 12px; +} + +.shelf-filters { + display: flex; + align-items: center; + gap: 16px; +} + +.shelf-search { + padding: 8px 16px; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + font-size: 14px; + width: 200px; + background: var(--bg-card); + color: var(--text-primary); +} + +.shelf-search:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-bg); +} + +.shelf-refresh-btn { + padding: 0 16px; + height: 36px; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + font-size: 13px; + color: var(--text-secondary); + background: var(--bg-card); + cursor: pointer; + transition: color 0.2s, border-color 0.2s, opacity 0.2s; + box-sizing: border-box; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 4px; + flex-shrink: 0; + white-space: nowrap; +} + +.shelf-refresh-btn .btn-icon { + display: inline-block; + font-size: 14px; + line-height: 1; +} + +.shelf-refresh-btn:hover:not(:disabled) { + border-color: var(--accent); + color: var(--accent); +} + +.shelf-refresh-btn:disabled { + opacity: 0.6; + cursor: wait; +} + +.shelf-refresh-btn.loading { + border-color: var(--accent); + color: var(--accent); +} + +.filter-checkbox { + display: flex; + align-items: center; + gap: 6px; + font-size: 14px; + color: var(--text-secondary); + cursor: pointer; +} + +.shelf-info { + font-size: 13px; + color: var(--text-light); +} + +.book-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 20px; + margin-bottom: 32px; +} + +.book-card { + cursor: pointer; + transition: transform 0.2s; +} + +.book-card:hover { + transform: translateY(-4px); +} + +.book-cover-wrapper { + position: relative; + width: 100%; + aspect-ratio: 3 / 4; + border-radius: var(--radius-sm); + overflow: hidden; + box-shadow: var(--shadow); + background: var(--bg-primary); +} + +.book-cover-img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.3s; +} + +.book-card:hover .book-cover-img { + transform: scale(1.05); +} + +.book-finished-badge { + position: absolute; + top: 6px; + right: 6px; + background: var(--badge-finished-bg); + color: white; + font-size: 10px; + padding: 2px 6px; + border-radius: var(--radius-xs); + font-weight: 600; +} + +.book-top-badge { + position: absolute; + top: 6px; + left: 6px; + background: var(--badge-top-bg); + color: var(--badge-top-text); + font-size: 10px; + padding: 2px 6px; + border-radius: var(--radius-xs); + font-weight: 600; +} + +.book-title { + font-size: 13px; + font-weight: 500; + margin-top: 8px; + color: var(--text-primary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.book-author { + font-size: 11px; + color: var(--text-light); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* ===== 分页 ===== */ +.pagination { + display: flex; + justify-content: center; + align-items: center; + gap: 8px; + margin-top: 32px; +} + +.page-btn { + padding: 8px 14px; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--bg-card); + color: var(--text-secondary); + cursor: pointer; + font-size: 14px; + transition: all 0.2s; +} + +.page-btn:hover:not(:disabled) { + border-color: var(--accent); + color: var(--accent); +} + +.page-btn:disabled { + opacity: 0.4; + cursor: not-allowed; +} + +.page-btn.active { + background: var(--accent); + color: #fff; + border-color: var(--accent); +} + +.page-info { + font-size: 13px; + color: var(--text-light); + margin: 0 8px; +} + +/* ===== 笔记区 ===== */ +.notes-section { + padding: 60px 0; + background: var(--accent-bg); + transition: background-color 0.3s ease; +} + +.notes-summary { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 16px; + margin-bottom: 32px; +} + +.note-stat { + background: var(--bg-card); + border-radius: var(--radius); + padding: 20px; + text-align: center; + box-shadow: var(--shadow); + border: 1px solid var(--border); +} + +.note-stat-value { + font-size: 28px; + font-weight: 800; + color: var(--accent-dark); +} + +.note-stat-label { + font-size: 13px; + color: var(--text-secondary); + margin-top: 4px; +} + +.notebooks-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 20px; +} + +.notebook-card { + background: var(--bg-card); + border-radius: var(--radius); + padding: 16px; + display: flex; + gap: 14px; + box-shadow: var(--shadow); + border: 1px solid var(--border); + transition: transform 0.2s, box-shadow 0.3s, background-color 0.3s, border-color 0.3s; +} + +.notebook-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-hover); +} + +.notebook-cover { + width: 60px; + height: 80px; + border-radius: 6px; + object-fit: cover; + flex-shrink: 0; + box-shadow: var(--shadow); +} + +.notebook-info { + flex: 1; + min-width: 0; +} + +.notebook-title { + font-size: 14px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 4px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.notebook-author { + font-size: 12px; + color: var(--text-light); + margin-bottom: 8px; +} + +.notebook-stats { + display: flex; + gap: 12px; + flex-wrap: wrap; +} + +.notebook-stat-item { + font-size: 12px; + color: var(--text-secondary); +} + +.notebook-stat-item strong { + color: var(--accent-dark); +} + +.notebook-progress { + margin-top: 8px; + height: 4px; + background: var(--border); + border-radius: 2px; + overflow: hidden; +} + +.notebook-progress-bar { + height: 100%; + background: var(--accent); + border-radius: 2px; + transition: width 0.3s; +} + +/* ===== 页脚 ===== */ +.footer { + padding: 40px 0; + text-align: center; + color: var(--text-light); + font-size: 13px; + border-top: 1px solid var(--border); + background: var(--bg-card); +} + +.footer-hint { + margin-top: 8px; + font-size: 12px; + opacity: 0.7; +} + +/* ===== 数据库连接告警横幅 ===== */ +.db-alert-banner { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 9999; + display: flex; + align-items: center; + gap: 10px; + padding: 12px 24px; + background: var(--alert-bg); + border-bottom: 2px solid var(--alert-border); + color: var(--alert-text); + font-size: 14px; + font-weight: 500; + box-shadow: 0 2px 8px rgba(0,0,0,0.1); + animation: slideDown 0.3s ease-out; +} + +.db-alert-icon { + font-size: 20px; +} + +.db-alert-text { + flex-shrink: 0; +} + +.db-alert-detail { + font-size: 12px; + opacity: 0.8; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@keyframes slideDown { + from { transform: translateY(-100%); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} + +/* ===== 加载动画 ===== */ +.loading { + display: flex; + justify-content: center; + align-items: center; + padding: 60px 0; +} + +.loading-spinner { + width: 40px; + height: 40px; + border: 3px solid var(--border); + border-top-color: var(--accent); + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* ===== 推荐发现区 ===== */ +.discover-section { + padding: 60px 0; +} + +.discover-tabs { + display: flex; + justify-content: center; + gap: 12px; + margin-bottom: 24px; +} + +.discover-tab { + padding: 8px 24px; + border: 1px solid var(--border); + border-radius: 20px; + background: var(--bg-card); + color: var(--text-secondary); + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: all 0.2s; +} + +.discover-tab.active { + background: var(--accent); + color: #fff; + border-color: var(--accent); +} + +.discover-controls { + display: flex; + justify-content: center; + gap: 12px; + margin-bottom: 24px; +} + +.btn-primary { + padding: 8px 20px; + border: none; + border-radius: var(--radius-sm); + background: var(--accent); + color: #fff; + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: background 0.2s; +} + +.btn-primary:hover { + background: var(--accent-dark); +} + +.btn-secondary { + padding: 8px 20px; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--bg-card); + color: var(--text-secondary); + cursor: pointer; + font-size: 14px; + transition: all 0.2s; +} + +.btn-secondary:hover { + border-color: var(--accent); + color: var(--accent); +} + +.search-box { + display: flex; + gap: 12px; + max-width: 500px; + margin: 0 auto 24px; +} + +.search-input { + flex: 1; + padding: 10px 16px; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + font-size: 14px; + background: var(--bg-card); + color: var(--text-primary); +} + +.search-input:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-bg); +} + +.discover-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + gap: 20px; +} + +.discover-card { + background: var(--bg-card); + border-radius: var(--radius); + overflow: hidden; + box-shadow: var(--shadow); + border: 1px solid var(--border); + transition: transform 0.2s, box-shadow 0.3s, background-color 0.3s, border-color 0.3s; + cursor: pointer; +} + +.discover-card:hover { + transform: translateY(-4px); + box-shadow: var(--shadow-hover); +} + +.discover-cover { + width: 100%; + aspect-ratio: 3 / 4; + object-fit: cover; + background: var(--bg-primary); +} + +.discover-info { + padding: 14px 16px; +} + +.discover-title { + font-size: 14px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 4px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.discover-author { + font-size: 12px; + color: var(--text-light); + margin-bottom: 6px; +} + +.discover-meta { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} + +.discover-rating { + font-size: 13px; + color: var(--rating-color); + font-weight: 600; +} + +.discover-rating-label { + font-size: 11px; + padding: 2px 6px; + border-radius: var(--radius-xs); + background: var(--rating-bg); + color: var(--rating-color); +} + +.discover-reading-count { + font-size: 11px; + color: var(--text-light); +} + +.discover-reason { + margin-top: 6px; + font-size: 12px; + color: var(--accent); + background: var(--accent-bg); + padding: 4px 8px; + border-radius: var(--radius-xs); +} + +.discover-category { + font-size: 11px; + color: var(--text-light); + margin-top: 4px; +} + +/* ===== 弹窗通用 ===== */ +.modal-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: var(--modal-overlay); + z-index: 1000; + justify-content: center; + align-items: flex-start; + padding: 40px 20px; + overflow-y: auto; +} + +.modal-overlay.active { + display: flex; +} + +.modal-content { + background: var(--bg-card); + border-radius: var(--radius); + max-width: 700px; + width: 100%; + position: relative; + box-shadow: var(--shadow-modal); + margin-bottom: 40px; + border: 1px solid var(--border); +} + +.modal-close { + position: absolute; + top: 12px; + right: 16px; + font-size: 28px; + color: var(--text-light); + cursor: pointer; + z-index: 10; + line-height: 1; +} + +.modal-close:hover { + color: var(--text-primary); +} + +.modal-body { + padding: 32px; +} + +/* ===== 书籍详情弹窗 ===== */ +.book-detail-modal .detail-header { + display: flex; + gap: 20px; + margin-bottom: 24px; +} + +.book-detail-modal .detail-cover { + width: 120px; + height: 160px; + border-radius: 8px; + object-fit: cover; + box-shadow: var(--shadow); + flex-shrink: 0; +} + +.book-detail-modal .detail-meta { + flex: 1; +} + +.book-detail-modal .detail-title { + font-size: 20px; + font-weight: 700; + color: var(--text-primary); + margin-bottom: 8px; + line-height: 1.4; +} + +.book-detail-modal .detail-author { + font-size: 14px; + color: var(--text-secondary); + margin-bottom: 8px; +} + +.book-detail-modal .detail-tags { + display: flex; + gap: 8px; + flex-wrap: wrap; + margin-bottom: 8px; +} + +.book-detail-modal .detail-tag { + font-size: 12px; + padding: 2px 10px; + border-radius: 10px; + background: var(--accent-bg); + color: var(--accent-dark); +} + +.book-detail-modal .detail-progress-info { + margin-top: 12px; + padding: 12px; + background: var(--bg-primary); + border-radius: var(--radius-sm); +} + +.book-detail-modal .detail-progress-bar { + height: 8px; + background: var(--border); + border-radius: 4px; + overflow: hidden; + margin-top: 8px; +} + +.book-detail-modal .detail-progress-fill { + height: 100%; + background: var(--accent); + border-radius: 4px; + transition: width 0.3s; +} + +.book-detail-modal .detail-intro { + font-size: 14px; + color: var(--text-secondary); + line-height: 1.8; + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid var(--border); +} + +.book-detail-modal .detail-info-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px 16px; + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid var(--border); +} + +.book-detail-modal .detail-info-item { + font-size: 13px; + color: var(--text-secondary); +} + +.book-detail-modal .detail-info-item strong { + color: var(--text-primary); +} + +.book-detail-modal .detail-actions { + margin-top: 20px; + display: flex; + gap: 12px; +} + +/* ===== 笔记详情弹窗 ===== */ +.notes-detail-modal { + max-width: 800px; +} + +.notes-detail-modal .notes-header { + display: flex; + gap: 16px; + margin-bottom: 20px; + padding-bottom: 16px; + border-bottom: 1px solid var(--border); +} + +.notes-detail-modal .notes-cover { + width: 60px; + height: 80px; + border-radius: 6px; + object-fit: cover; + flex-shrink: 0; + box-shadow: var(--shadow); +} + +.notes-detail-modal .notes-title { + font-size: 18px; + font-weight: 700; + color: var(--text-primary); +} + +.notes-detail-modal .notes-author { + font-size: 13px; + color: var(--text-light); + margin-top: 4px; +} + +.notes-detail-modal .notes-counts { + display: flex; + gap: 16px; + margin-top: 8px; + font-size: 13px; + color: var(--text-secondary); +} + +.notes-detail-modal .notes-counts strong { + color: var(--accent-dark); +} + +.notes-detail-modal .notes-section-title { + font-size: 15px; + font-weight: 600; + color: var(--text-primary); + margin: 20px 0 12px; + padding-bottom: 8px; + border-bottom: 1px solid var(--border); +} + +.notes-detail-modal .chapter-group { + margin-bottom: 20px; +} + +.notes-detail-modal .chapter-title { + font-size: 13px; + font-weight: 600; + color: var(--accent-dark); + margin-bottom: 8px; + padding: 4px 0; + border-left: 3px solid var(--accent); + padding-left: 10px; +} + +.notes-detail-modal .highlight-item { + padding: 10px 14px; + background: var(--chart-highlight-bg); + border-radius: var(--radius-sm); + margin-bottom: 8px; + font-size: 14px; + color: var(--text-primary); + line-height: 1.7; + border-left: 3px solid var(--accent-light); +} + +.notes-detail-modal .highlight-date { + font-size: 11px; + color: var(--text-light); + margin-top: 4px; +} + +.notes-detail-modal .review-item { + padding: 10px 14px; + background: var(--chart-review-bg); + border-radius: var(--radius-sm); + margin-bottom: 8px; + font-size: 14px; + color: var(--text-primary); + line-height: 1.7; + border-left: 3px solid var(--chart-review-border); +} + +.notes-detail-modal .review-meta { + font-size: 11px; + color: var(--text-light); + margin-top: 4px; +} + +.notes-detail-modal .review-star { + color: var(--rating-star); +} + +.notes-detail-modal .empty-state { + text-align: center; + padding: 40px; + color: var(--text-light); + font-size: 14px; +} + +/* ===== 想法详情独立页面 ===== */ +.thoughts-page { + min-height: 100vh; + background: var(--bg-primary); +} + +.thoughts-page-header { + background: var(--bg-card); + border-bottom: 1px solid var(--border); + box-shadow: var(--shadow); + padding: 16px 0 20px; + position: sticky; + top: 60px; + z-index: 50; +} + +.back-btn { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 6px 16px; + border: 1px solid var(--border); + border-radius: 20px; + background: var(--bg-card); + color: var(--text-secondary); + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: all 0.2s; + margin-bottom: 16px; +} + +.back-btn:hover { + border-color: var(--accent); + color: var(--accent); + background: var(--accent-bg); +} + +.thoughts-book-header { + display: flex; + gap: 16px; + align-items: center; +} + +.thoughts-book-cover { + width: 64px; + height: 85px; + border-radius: 8px; + object-fit: cover; + flex-shrink: 0; + box-shadow: var(--shadow); +} + +.thoughts-book-title { + font-size: 20px; + font-weight: 700; + color: var(--text-primary); +} + +.thoughts-book-author { + font-size: 13px; + color: var(--text-light); + margin-top: 4px; +} + +.thoughts-book-stats { + display: flex; + gap: 16px; + margin-top: 8px; + font-size: 13px; + color: var(--text-secondary); +} + +.thoughts-book-stats strong { + color: var(--accent-dark); +} + +/* 想法页面工具栏 */ +.thoughts-toolbar { + display: flex; + justify-content: space-between; + align-items: center; + gap: 12px; + margin: 24px 0 20px; + flex-wrap: wrap; +} + +.thoughts-filters { + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +.thoughts-controls { + display: flex; + gap: 10px; + align-items: center; +} + +.thoughts-search-input { + padding: 7px 14px; + border: 1px solid var(--border); + border-radius: 20px; + background: var(--bg-card); + color: var(--text-primary); + font-size: 14px; + width: 240px; + transition: border-color 0.2s, box-shadow 0.2s; + outline: none; +} + +.thoughts-search-input:focus { + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-bg); +} + +.thoughts-search-input::placeholder { + color: var(--text-light); +} + +.thoughts-sort-select { + padding: 7px 14px; + border: 1px solid var(--border); + border-radius: 20px; + background: var(--bg-card); + color: var(--text-primary); + font-size: 14px; + cursor: pointer; + outline: none; + transition: border-color 0.2s; +} + +.thoughts-sort-select:hover { + border-color: var(--accent); +} + +.thoughts-sort-select:focus { + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-bg); +} + +.thought-filter-btn { + padding: 6px 18px; + border: 1px solid var(--border); + border-radius: 20px; + background: var(--bg-card); + color: var(--text-secondary); + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: all 0.2s; + display: flex; + align-items: center; + gap: 6px; +} + +.thought-filter-btn .filter-count { + font-size: 12px; + background: var(--accent-bg); + color: var(--accent-dark); + padding: 1px 8px; + border-radius: 10px; +} + +.thought-filter-btn.active { + background: var(--accent); + color: #fff; + border-color: var(--accent); +} + +.thought-filter-btn.active .filter-count { + background: rgba(255,255,255,0.25); + color: #fff; +} + +.thought-filter-btn:hover:not(.active) { + border-color: var(--accent); + color: var(--accent); +} + +/* 分类区块标题 */ +.thoughts-section-title { + font-size: 16px; + font-weight: 700; + color: var(--text-primary); + margin: 28px 0 16px; + padding-bottom: 10px; + border-bottom: 2px solid var(--border); + display: flex; + align-items: center; + gap: 8px; +} + +.thoughts-section-title .section-badge { + font-size: 12px; + font-weight: 600; + padding: 2px 10px; + border-radius: 10px; +} + +.badge-highlight { + background: var(--accent-bg-hover); + color: var(--accent-dark); +} + +.badge-review { + background: var(--rating-bg); + color: var(--rating-color); +} + +.badge-thought { + background: rgba(76, 175, 80, 0.12); + color: #4caf50; +} + +[data-theme="dark"] .badge-thought { + background: rgba(76, 175, 80, 0.15); + color: #66bb6a; +} + +/* 划线条目 */ +.thought-highlight-item { + padding: 14px 18px; + background: var(--chart-highlight-bg); + border-radius: var(--radius-sm); + margin-bottom: 10px; + font-size: 15px; + color: var(--text-primary); + line-height: 1.8; + border-left: 4px solid var(--accent-light); + transition: background-color 0.3s; +} + +.thought-highlight-meta { + font-size: 12px; + color: var(--text-light); + margin-top: 8px; + display: flex; + gap: 12px; +} + +/* 书评条目 */ +.thought-review-item { + padding: 16px 20px; + background: var(--chart-review-bg); + border-radius: var(--radius-sm); + margin-bottom: 10px; + font-size: 15px; + color: var(--text-primary); + line-height: 1.8; + border-left: 4px solid var(--rating-star); + transition: background-color 0.3s; +} + +.thought-review-stars { + color: var(--rating-star); + font-size: 14px; + margin-bottom: 6px; +} + +.thought-review-meta { + font-size: 12px; + color: var(--text-light); + margin-top: 8px; + display: flex; + gap: 12px; + flex-wrap: wrap; +} + +/* 想法条目 */ +.thought-thought-item { + padding: 16px 20px; + background: var(--bg-card); + border-radius: var(--radius-sm); + margin-bottom: 10px; + border-left: 4px solid #4caf50; + transition: background-color 0.3s, border-color 0.3s; +} + +[data-theme="dark"] .thought-thought-item { + border-left-color: #66bb6a; +} + +.thought-thought-abstract { + font-size: 13px; + color: var(--text-light); + background: var(--bg-secondary); + padding: 8px 12px; + border-radius: 6px; + margin-bottom: 10px; + line-height: 1.6; + border-left: 3px solid var(--border); +} + +.thought-thought-content { + font-size: 15px; + color: var(--text-primary); + line-height: 1.8; +} + +.thought-thought-meta { + font-size: 12px; + color: var(--text-light); + margin-top: 8px; + display: flex; + gap: 12px; + flex-wrap: wrap; +} + +.thoughts-empty { + text-align: center; + padding: 60px 0; + color: var(--text-light); + font-size: 15px; +} + +/* 章节分组 */ +.thoughts-chapter-group { + margin-bottom: 24px; +} + +.thoughts-chapter-title { + font-size: 14px; + font-weight: 600; + color: var(--accent-dark); + margin-bottom: 10px; + padding: 6px 0 6px 12px; + border-left: 4px solid var(--accent); +} + +/* ===== 回到顶部按钮 ===== */ +.back-to-top { + position: fixed; + bottom: 32px; + right: 32px; + width: 48px; + height: 48px; + border-radius: 50%; + background: var(--accent); + color: #fff; + border: none; + cursor: pointer; + font-size: 22px; + line-height: 1; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); + z-index: 90; + opacity: 0; + visibility: hidden; + transform: translateY(20px); + transition: opacity 0.3s, visibility 0.3s, transform 0.3s, background-color 0.3s; +} + +.back-to-top.visible { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +.back-to-top:hover { + background: var(--accent-dark); + transform: translateY(-2px); +} + +/* 书籍详情弹窗 - 查看想法按钮 */ +.detail-action-thoughts { + background: var(--bg-card); + border: 1px solid var(--accent); + color: var(--accent); +} + +.detail-action-thoughts:hover { + background: var(--accent-bg); +} + +/* ===== 响应式 ===== */ +@media (max-width: 768px) { + .nav-links { + display: none; + } + .hero-title { + font-size: 24px; + } + .hero-stats { + gap: 24px; + } + .hero-stat-value { + font-size: 32px; + } + .charts-grid { + grid-template-columns: 1fr; + } + .chart-card.large { + grid-column: auto; + } + .book-grid { + grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); + gap: 12px; + } + .top-books-list { + gap: 8px; + } + .top-book-row { + padding: 8px 12px; + gap: 10px; + } + .top-book-mini-cover { + width: 36px; + height: 48px; + } + .top-book-rank-num { + width: 28px; + height: 28px; + font-size: 13px; + } + .nav-update { + display: none; + } + .global-search-wrapper { + max-width: 100%; + } + .thoughts-toolbar { + flex-direction: column; + align-items: stretch; + } + .thoughts-controls { + flex-direction: column; + gap: 8px; + } + .thoughts-search-input { + width: 100%; + } + .thoughts-sort-select { + width: 100%; + } + .shelf-search { + width: 140px; + } + .shelf-categories { + gap: 6px; + } + .shelf-cat-parent { + font-size: 12px; + padding: 4px 10px; + } + .shelf-cat-sub { + font-size: 11px; + padding: 3px 9px; + } + .shelf-cat-subs { + padding-left: 10px; + } + .back-to-top { + bottom: 20px; + right: 20px; + width: 40px; + height: 40px; + font-size: 18px; + } + .thoughts-page-header { + top: 0; + } + .thoughts-book-cover { + width: 48px; + height: 64px; + } + .thoughts-book-title { + font-size: 16px; + } +} diff --git a/legacy/v1/static/js/app.js b/legacy/v1/static/js/app.js new file mode 100644 index 0000000..daf6e68 --- /dev/null +++ b/legacy/v1/static/js/app.js @@ -0,0 +1,1267 @@ +/* ===== 微信读书数据展示 - 前端逻辑 ===== */ + +const API_BASE = ""; + +// ===== 主题管理 ===== + +function getCurrentTheme() { + return document.documentElement.getAttribute("data-theme") === "dark" ? "dark" : "light"; +} + +function toggleTheme() { + const newTheme = getCurrentTheme() === "dark" ? "light" : "dark"; + document.documentElement.setAttribute("data-theme", newTheme); + localStorage.setItem("theme", newTheme); + refreshChartsForTheme(); +} + +function getChartColors() { + const cs = getComputedStyle(document.documentElement); + return { + axis: cs.getPropertyValue("--chart-axis").trim(), + axisLine: cs.getPropertyValue("--chart-axis-line").trim(), + splitLine: cs.getPropertyValue("--chart-split-line").trim(), + label: cs.getPropertyValue("--chart-label").trim(), + borderColor: cs.getPropertyValue("--chart-border-color").trim(), + tooltipBg: cs.getPropertyValue("--chart-tooltip-bg").trim(), + tooltipBorder: cs.getPropertyValue("--chart-tooltip-border").trim(), + tooltipText: cs.getPropertyValue("--chart-tooltip-text").trim(), + accent: cs.getPropertyValue("--accent").trim(), + accentLight: cs.getPropertyValue("--accent-light").trim(), + accentDark: cs.getPropertyValue("--accent-dark").trim(), + }; +} + +// ===== 工具函数 ===== + +/** + * 升级微信读书封面图 URL 到高清晰度版本。 + * 微信读书 CDN 的封面图通过文件名前缀区分分辨率: + * t6_ = 低清缩略图(~150px,Retina 屏模糊) + * s_ = 超低清缩略图(~90px,搜索结果常用,更模糊) + * t8_ = 高清版(~500px,适合 2x/3x 屏幕) + * 将 t6_ 和 s_ 前缀统一升级为 t8_ 高清版。 + */ +function hdCover(url) { + if (!url) return ""; + return url.replace(/\/(t6_|s_)/, "/t8_"); +} + +async function fetchAPI(path) { + const resp = await fetch(API_BASE + path); + if (!resp.ok) throw new Error(`API error: ${resp.status}`); + return resp.json(); +} + +function formatHours(seconds) { + if (!seconds) return "0"; + return (seconds / 3600).toFixed(1); +} + +function escapeHtml(text) { + if (!text) return ""; + const div = document.createElement("div"); + div.textContent = text; + return div.innerHTML; +} + +// ===== 数据库健康检查 ===== + +const chartInstances = {}; +let chartsLoaded = false; +let currentThoughtsData = null; +let currentThoughtsCategory = "all"; +let currentThoughtsSort = "time_desc"; +let currentThoughtsSearch = ""; + +function refreshChartsForTheme() { + if (!chartsLoaded) return; + Object.values(chartInstances).forEach((chart) => { + if (chart && !chart.isDisposed()) chart.dispose(); + }); + loadYearlyTrend(); + loadTimeDistribution(); + loadCategories(); + loadAuthors(); +} + +async function checkDBHealth() { + try { + const resp = await fetch(API_BASE + "/api/health"); + const data = await resp.json(); + if (resp.ok && data.database === "connected") { + document.getElementById("dbAlertBanner").style.display = "none"; + return true; + } else { + showDBAlert(data.message || "数据库连接失败"); + return false; + } + } catch (error) { + showDBAlert("无法连接到服务器,请检查后端服务是否运行。"); + return false; + } +} + +function showDBAlert(message) { + const banner = document.getElementById("dbAlertBanner"); + const detail = document.getElementById("dbAlertDetail"); + if (banner) banner.style.display = "flex"; + if (detail) detail.textContent = message; +} + +// ===== 标签页切换 ===== + +function switchTab(tabName) { + // 如果想法详情页正在显示,先关闭它回到主视图 + const thoughtsPage = document.getElementById("thoughtsPage"); + if (thoughtsPage && thoughtsPage.style.display !== "none") { + thoughtsPage.style.display = "none"; + document.getElementById("mainView").style.display = ""; + currentThoughtsData = null; + } + + // 关闭可能打开的弹窗 + closeModal("bookDetailModal"); + + document.querySelectorAll(".tab-panel").forEach((panel) => { + panel.classList.remove("active"); + }); + document.querySelectorAll(".nav-link").forEach((link) => { + link.classList.toggle("active", link.dataset.tab === tabName); + }); + + const target = document.getElementById(`tab-${tabName}`); + if (target) { + target.classList.add("active"); + } + + window.scrollTo({ top: 0, behavior: "smooth" }); + + // 懒加载图表 + if (tabName === "charts" && !chartsLoaded) { + chartsLoaded = true; + loadYearlyTrend(); + loadTimeDistribution(); + loadCategories(); + loadAuthors(); + } + + // 切换到图表时重绘尺寸 + if (tabName === "charts" && chartsLoaded) { + setTimeout(() => { + Object.values(chartInstances).forEach((chart) => { + if (chart && !chart.isDisposed()) chart.resize(); + }); + }, 100); + } +} + +// ===== 回到顶部按钮 ===== + +function initBackToTop() { + const btn = document.getElementById("backToTop"); + window.addEventListener("scroll", () => { + btn.classList.toggle("visible", window.scrollY > 400); + }); +} + +function scrollToTop() { + window.scrollTo({ top: 0, behavior: "smooth" }); +} + +/** + * 在微信读书中打开书籍。 + * 优先使用 API 返回的 deep_link(https://weread.qq.com/... 网页链接), + * 没有则用 book_id 构造网页链接。先尝试 weread:// 深链接唤起 App, + * 1.5 秒后无响应则回退到网页版。 + */ +function openInWeRead(bookId, deepLink) { + const webUrl = deepLink || `https://weread.qq.com/#book/${bookId}`; + const schemeUrl = `weread://reading?bId=${bookId}`; + + // 尝试唤起 App(移动端),同时设置定时器回退到网页版 + let triggered = false; + const fallbackTimer = setTimeout(() => { + if (!triggered) window.open(webUrl, "_blank"); + }, 1500); + + // 监听页面可见性变化(App 唤起成功会切到后台) + const onVisChange = () => { + if (document.hidden) { + triggered = true; + clearTimeout(fallbackTimer); + } + }; + document.addEventListener("visibilitychange", onVisChange); + + // 尝试打开深链接 + const iframe = document.createElement("iframe"); + iframe.style.display = "none"; + iframe.src = schemeUrl; + document.body.appendChild(iframe); + setTimeout(() => document.body.removeChild(iframe), 2000); + + // 桌面端不会有 visibilitychange,确保 fallback 一定执行 + setTimeout(() => { + document.removeEventListener("visibilitychange", onVisChange); + }, 3000); +} + +// ===== 全局搜索(顶部常驻搜索框) ===== + +function globalSearch() { + const keyword = document.getElementById("globalSearchInput").value.trim(); + if (!keyword) return; + + // 切换到推荐标签页 + switchTab("discover"); + // 切换到搜索子标签 + switchDiscoverTab("search"); + // 填入搜索词并执行搜索 + document.getElementById("searchInput").value = keyword; + doSearch(); +} + +// ===== 书架分类标签(可折叠层级结构) ===== + +let shelfCategoryTree = {}; // { "历史": {count:114, subs:{"世界史":5,...}}, ... } +let shelfActiveCategory = ""; // 完整分类名,如 "历史-中国古代" +let shelfActiveParent = ""; // 父分类名,如 "历史";空表示"全部" +let shelfExpandedParents = new Set(); // 当前展开的父分类 +let shelfSortMode = "category"; // 始终按分类排序,前端不显示切换按钮 + +async function loadShelfCategories() { + try { + const data = await fetchAPI("/api/shelf?page=1&per_page=1"); + shelfCategoryTree = data.category_tree || {}; + renderShelfCategories(); + } catch (e) { + console.error("加载分类失败:", e); + } +} + +function renderShelfCategories() { + const container = document.getElementById("shelfCategories"); + if (!container) return; + + let html = ""; + + // "全部" 按钮 + const allActive = !shelfActiveParent && !shelfActiveCategory; + html += ``; + + // 父分类按钮(按书籍数量降序) + const parents = Object.entries(shelfCategoryTree) + .sort((a, b) => b[1].count - a[1].count); + + for (const [parent, info] of parents) { + const isActive = shelfActiveParent === parent && !shelfActiveCategory; + const isExpanded = shelfExpandedParents.has(parent); + const arrow = Object.keys(info.subs).length > 0 + ? `${isExpanded ? "▼" : "▶"}` + : ""; + + html += ``; + + // 展开的子分类 + if (isExpanded && Object.keys(info.subs).length > 0) { + html += `
`; + for (const [sub, count] of Object.entries(info.subs).sort((a, b) => b[1] - a[1])) { + const fullCat = `${parent}-${sub}`; + const subActive = shelfActiveCategory === fullCat; + html += ``; + } + html += `
`; + } + } + + container.innerHTML = html; +} + +function filterByParent(parent) { + if (parent) { + // 点击父分类:展开/折叠子分类,同时筛选该父分类下的所有书 + if (shelfExpandedParents.has(parent) && shelfActiveParent === parent && !shelfActiveCategory) { + // 已展开且已选中 → 折叠 + shelfExpandedParents.delete(parent); + shelfActiveParent = ""; + shelfActiveCategory = ""; + } else { + // 展开 + 筛选 + shelfExpandedParents.add(parent); + shelfActiveParent = parent; + shelfActiveCategory = ""; + } + } else { + // 点击"全部" + shelfExpandedParents.clear(); + shelfActiveParent = ""; + shelfActiveCategory = ""; + } + renderShelfCategories(); + loadShelf(1); +} + +function filterByCategory(fullCategory) { + shelfActiveCategory = fullCategory; + // 确保父分类已展开 + const parent = fullCategory.split("-")[0]; + shelfExpandedParents.add(parent); + shelfActiveParent = parent; + renderShelfCategories(); + loadShelf(1); +} + +// ===== 书架刷新 ===== + +async function refreshShelf() { + const btn = document.getElementById("shelfRefreshBtn"); + const textEl = btn.querySelector(".btn-text"); + btn.disabled = true; + btn.classList.add("loading"); + textEl.textContent = "同步中..."; + + try { + // Step 1: 从微信读书 API 同步数据到 MySQL + const resp = await fetch(API_BASE + "/api/sync", { method: "POST" }); + const syncResult = await resp.json(); + if (!syncResult.ok) { + throw new Error(syncResult.error || "同步失败"); + } + + // Step 2: 重新加载分类和书架 + textEl.textContent = "加载中..."; + await loadShelfCategories(); + await loadShelf(1); + } catch (e) { + console.error("刷新失败:", e); + alert("刷新失败: " + (e.message || "未知错误")); + } finally { + btn.disabled = false; + btn.classList.remove("loading"); + textEl.textContent = "刷新"; + } +} + +// ===== 初始化 ===== + +document.addEventListener("DOMContentLoaded", async () => { + const isHealthy = await checkDBHealth(); + if (!isHealthy) return; + + loadOverview(); + loadTopBooks(); + loadShelfCategories(); + loadShelf(1); + loadNotebooks(); + loadRecommend(0); + initBackToTop(); + + // 搜索和筛选事件 + document.getElementById("shelfSearch").addEventListener("input", debounce(() => loadShelf(1), 300)); + document.getElementById("finishedOnly").addEventListener("change", () => loadShelf(1)); +}); + +// ===== 总览数据 ===== +async function loadOverview() { + try { + const data = await fetchAPI("/api/overview"); + + const heroStats = document.getElementById("heroStats"); + heroStats.innerHTML = ` +
+
${formatHours(data.total_read_time)}
+
累计阅读 (小时)
+
+
+
${data.read_days}
+
阅读天数
+
+
+
${data.shelf_count}
+
书架藏书
+
+
+
${data.total_notes}
+
读书笔记
+
+ `; + + document.getElementById("heroSubtitle").textContent = + `自 ${data.regist_time} 加入微信读书,已陪伴你 ${data.read_days} 个阅读的日子`; + + const statsGrid = document.getElementById("statsGrid"); + statsGrid.innerHTML = ` +
+
⏱️
+
${data.total_read_time_str}
+
累计阅读时长
+
今年: ${data.year_read_time_str}
+
+
+
📅
+
${data.read_days}
+
累计阅读天数
+
今年: ${data.year_read_days} 天
+
+
+
📚
+
${data.shelf_count}
+
书架书籍
+
已读完: ${data.finished_count} 本
+
+
+
✍️
+
${data.total_notes}
+
读书笔记
+
来自 ${data.notebook_count} 本书
+
+ `; + + const timeStr = `数据更新: ${data.fetch_time}`; + document.getElementById("fetchTime").textContent = timeStr; + document.getElementById("footerTime").textContent = data.fetch_time; + } catch (e) { + console.error("加载总览失败:", e); + } +} + +// ===== 年度趋势图 ===== +async function loadYearlyTrend() { + try { + const data = await fetchAPI("/api/yearly-trend"); + const el = document.getElementById("chart-yearly"); + if (chartInstances.yearly) chartInstances.yearly.dispose(); + const chart = echarts.init(el); + chartInstances.yearly = chart; + + const c = getChartColors(); + const years = data.map((d) => d.year); + const hours = data.map((d) => d.hours); + + chart.setOption({ + tooltip: { + trigger: "axis", + backgroundColor: c.tooltipBg, + borderColor: c.tooltipBorder, + textStyle: { color: c.tooltipText }, + formatter: (params) => { + const p = params[0]; + return `${p.name}年
阅读: ${p.value} 小时`; + }, + }, + grid: { left: 50, right: 30, top: 30, bottom: 40 }, + xAxis: { + type: "category", + data: years, + axisLabel: { color: c.axis }, + axisLine: { lineStyle: { color: c.axisLine } }, + }, + yAxis: { + type: "value", + name: "小时", + nameTextStyle: { color: c.axis }, + axisLabel: { color: c.axis }, + splitLine: { lineStyle: { color: c.splitLine } }, + }, + series: [{ + data: hours, + type: "bar", + barWidth: "50%", + itemStyle: { + borderRadius: [8, 8, 0, 0], + color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, + colorStops: [ + { offset: 0, color: c.accentLight }, + { offset: 1, color: c.accent }, + ] }, + }, + label: { show: true, position: "top", color: c.label, fontSize: 12, formatter: "{c}h" }, + }], + }); + window.addEventListener("resize", () => chart.resize()); + } catch (e) { + console.error("加载年度趋势失败:", e); + } +} + +// ===== 24小时时段分布 ===== +async function loadTimeDistribution() { + try { + const data = await fetchAPI("/api/time-distribution"); + const el = document.getElementById("chart-hours"); + if (chartInstances.hours) chartInstances.hours.dispose(); + const chart = echarts.init(el); + chartInstances.hours = chart; + + const c = getChartColors(); + const hours = data.map((d) => `${d.hour}时`); + const minutes = data.map((d) => d.duration_min); + + chart.setOption({ + tooltip: { + trigger: "axis", + backgroundColor: c.tooltipBg, + borderColor: c.tooltipBorder, + textStyle: { color: c.tooltipText }, + formatter: (params) => { + const p = params[0]; + return `${p.name}
阅读: ${p.value} 分钟`; + }, + }, + grid: { left: 50, right: 20, top: 20, bottom: 40 }, + xAxis: { + type: "category", + data: hours, + axisLabel: { color: c.axis, fontSize: 10, interval: 2 }, + axisLine: { lineStyle: { color: c.axisLine } }, + }, + yAxis: { + type: "value", + name: "分钟", + nameTextStyle: { color: c.axis }, + axisLabel: { color: c.axis }, + splitLine: { lineStyle: { color: c.splitLine } }, + }, + series: [{ + data: minutes, + type: "line", + smooth: true, + symbol: "circle", + symbolSize: 4, + lineStyle: { width: 2, color: c.accent }, + itemStyle: { color: c.accent }, + areaStyle: { + color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, + colorStops: [ + { offset: 0, color: c.accent + "4D" }, + { offset: 1, color: c.accent + "05" }, + ] }, + }, + }], + }); + window.addEventListener("resize", () => chart.resize()); + } catch (e) { + console.error("加载时段分布失败:", e); + } +} + +// ===== 偏好分类 ===== +async function loadCategories() { + try { + const data = await fetchAPI("/api/categories"); + const el = document.getElementById("chart-categories"); + if (chartInstances.categories) chartInstances.categories.dispose(); + const chart = echarts.init(el); + chartInstances.categories = chart; + + const c = getChartColors(); + const items = data.slice(0, 8).map((d) => ({ + name: d.category_title, + value: d.reading_time, + })); + + chart.setOption({ + tooltip: { + trigger: "item", + backgroundColor: c.tooltipBg, + borderColor: c.tooltipBorder, + textStyle: { color: c.tooltipText }, + formatter: (p) => { + const hours = (p.value / 3600).toFixed(1); + return `${p.name}
阅读: ${hours} 小时 (${p.percent}%)`; + }, + }, + legend: { + type: "scroll", + orient: "vertical", + right: 10, + top: 20, + bottom: 20, + textStyle: { color: c.label, fontSize: 11 }, + }, + series: [{ + type: "pie", + radius: ["40%", "70%"], + center: ["35%", "50%"], + avoidLabelOverlap: false, + itemStyle: { borderRadius: 6, borderColor: c.borderColor, borderWidth: 2 }, + label: { show: false }, + emphasis: { + label: { show: true, fontSize: 14, fontWeight: "bold", color: c.tooltipText }, + }, + data: items, + color: ["#c17b4a", "#e8a87c", "#d4a574", "#b8860b", "#cd853f", "#daa520", "#bc8f8f", "#bdb76b"], + }], + }); + window.addEventListener("resize", () => chart.resize()); + } catch (e) { + console.error("加载分类失败:", e); + } +} + +// ===== 偏好作者 ===== +async function loadAuthors() { + try { + const data = await fetchAPI("/api/authors"); + const el = document.getElementById("chart-authors"); + if (chartInstances.authors) chartInstances.authors.dispose(); + const chart = echarts.init(el); + chartInstances.authors = chart; + + const c = getChartColors(); + const top10 = data.slice(0, 10); + const names = top10.map((d) => d.name); + const counts = top10.map((d) => d.count); + + chart.setOption({ + tooltip: { + trigger: "axis", + axisPointer: { type: "shadow" }, + backgroundColor: c.tooltipBg, + borderColor: c.tooltipBorder, + textStyle: { color: c.tooltipText }, + formatter: (params) => { + const p = params[0]; + return `${p.name}
阅读: ${p.value} 本`; + }, + }, + grid: { left: 100, right: 40, top: 20, bottom: 20 }, + xAxis: { + type: "value", + axisLabel: { color: c.axis }, + splitLine: { lineStyle: { color: c.splitLine } }, + }, + yAxis: { + type: "category", + data: names.reverse(), + axisLabel: { color: c.axis, fontSize: 12 }, + axisLine: { lineStyle: { color: c.axisLine } }, + }, + series: [{ + type: "bar", + data: counts.reverse(), + barWidth: "50%", + itemStyle: { + borderRadius: [0, 6, 6, 0], + color: { type: "linear", x: 0, y: 0, x2: 1, y2: 0, + colorStops: [ + { offset: 0, color: c.accentLight }, + { offset: 1, color: c.accent }, + ] }, + }, + label: { show: true, position: "right", color: c.label, fontSize: 12, formatter: "{c}本" }, + }], + }); + window.addEventListener("resize", () => chart.resize()); + } catch (e) { + console.error("加载作者失败:", e); + } +} + +// ===== 读书排行(竖向列表) ===== +async function loadTopBooks() { + try { + const data = await fetchAPI("/api/top-books"); + const list = document.getElementById("topBooksGrid"); + + list.innerHTML = data + .map((book, i) => { + const tagsHtml = book.tags + .map((t) => `${t}`) + .join(""); + return ` +
+ ${i + 1} + ${book.title} +
+
${book.title}
+
+ ${book.author} + ${tagsHtml ? `
${tagsHtml}
` : ""} +
+
+
⏱ ${book.read_time_str}
+
`; + }) + .join(""); + } catch (e) { + console.error("加载排行失败:", e); + } +} + +// ===== 书架 ===== +let shelfCurrentPage = 1; + +async function loadShelf(page) { + shelfCurrentPage = page; + const keyword = document.getElementById("shelfSearch").value.trim(); + const finished = document.getElementById("finishedOnly").checked ? "1" : "0"; + const params = new URLSearchParams({ page: page, per_page: 60, finished: finished }); + if (keyword) params.set("keyword", keyword); + if (shelfActiveCategory) { + params.set("category", shelfActiveCategory); + } else if (shelfActiveParent) { + params.set("parent_category", shelfActiveParent); + } + if (shelfSortMode === "category") params.set("sort", "category"); + + try { + const data = await fetchAPI(`/api/shelf?${params}`); + const grid = document.getElementById("bookGrid"); + + document.getElementById("shelfInfo").textContent = + `共 ${data.total} 本 · 第 ${page}/${data.total_pages} 页`; + + grid.innerHTML = data.books.map((book) => renderBookCard(book)).join(""); + + renderPagination(page, data.total_pages); + } catch (e) { + console.error("加载书架失败:", e); + } +} + +function renderBookCard(book) { + const badges = []; + if (book.is_top) badges.push(`置顶`); + if (book.finish_reading) badges.push(`已读完`); + return ` +
+
+ ${book.title} + ${badges.join("")} +
+
${book.title}
+
${book.author}
+
`; +} + +function renderPagination(current, total) { + const pag = document.getElementById("pagination"); + if (total <= 1) { pag.innerHTML = ""; return; } + + let html = ``; + const maxButtons = 7; + let start = Math.max(1, current - 3); + let end = Math.min(total, start + maxButtons - 1); + start = Math.max(1, end - maxButtons + 1); + + if (start > 1) { + html += ``; + if (start > 2) html += `...`; + } + for (let i = start; i <= end; i++) { + html += ``; + } + if (end < total) { + if (end < total - 1) html += `...`; + html += ``; + } + html += ``; + pag.innerHTML = html; +} + +function debounce(fn, delay) { + let timer; + return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); }; +} + +// ===== 笔记概览 ===== +async function loadNotebooks() { + try { + const data = await fetchAPI("/api/notebooks"); + const summary = document.getElementById("notesSummary"); + + const totalHighlights = data.reduce((s, d) => s + d.note_count, 0); + const totalReviews = data.reduce((s, d) => s + d.review_count, 0); + const totalBookmarks = data.reduce((s, d) => s + d.bookmark_count, 0); + + summary.innerHTML = ` +
+
${data.length}
+
有笔记的书
+
+
+
${totalHighlights}
+
划线
+
+
+
${totalReviews}
+
想法/点评
+
+
+
${totalBookmarks}
+
书签
+
+ `; + + const grid = document.getElementById("notebooksGrid"); + grid.innerHTML = data + .map((nb) => { + const progress = nb.reading_progress || 0; + return ` +
+ ${nb.title} +
+
${nb.title}
+
${nb.author}
+
+ 划线 ${nb.note_count} + 想法 ${nb.review_count} + 书签 ${nb.bookmark_count} +
+
+
+
+
+
`; + }) + .join(""); + } catch (e) { + console.error("加载笔记失败:", e); + } +} + +// ===== 书籍详情弹窗 ===== +function openBook(bookId) { + if (!bookId) return; + showModal("bookDetailModal"); + const body = document.getElementById("bookDetailBody"); + body.innerHTML = `
`; + + fetchAPI(`/api/book/detail?book_id=${bookId}`) + .then((data) => { + const p = data.progress || {}; + const progress = p.progress || 0; + const rating = data.new_rating > 0 ? (data.new_rating / 10).toFixed(1) : null; + const tags = []; + if (data.category) tags.push(data.category); + if (rating) tags.push(`${rating}分`); + if (data.new_rating_count) tags.push(`${data.new_rating_count}人评分`); + + body.innerHTML = ` +
+ ${data.title} +
+
${data.title}
+
${data.author || ''}${data.translator ? ' / 译: ' + data.translator : ''}
+
${tags.map(t => `${t}`).join('')}
+ ${p.is_start_reading ? ` +
+
+ 阅读进度: ${p.progress}% + ${p.record_reading_time_str ? ' · 累计 ' + p.record_reading_time_str : ''} + ${p.finish_time ? ' · 读完于 ' + p.finish_time : ''} +
+
+
+
+
` : '
尚未开始阅读
'} +
+
+ ${data.intro ? `
${data.intro}
` : ''} +
+ ${data.publisher ? `
出版社: ${data.publisher}
` : ''} + ${data.publish_time ? `
出版时间: ${data.publish_time}
` : ''} + ${data.isbn ? `
ISBN: ${data.isbn}
` : ''} + ${data.word_count ? `
字数: ${(data.word_count / 10000).toFixed(1)}万字
` : ''} +
+
+ + +
+ `; + }) + .catch((e) => { + body.innerHTML = `
加载失败: ${e.message}
`; + }); +} + +// ===== 想法详情独立页面 ===== + +function openThoughtsPage(bookId, title, author, cover) { + if (!bookId) return; + + // 隐藏主视图,显示想法页面 + document.getElementById("mainView").style.display = "none"; + document.getElementById("thoughtsPage").style.display = "block"; + window.scrollTo({ top: 0, behavior: "auto" }); + + // 渲染头部 + const header = document.getElementById("thoughtsBookHeader"); + header.innerHTML = ` + ${title} +
+
${title}
+
${author || ''}
+
加载中...
+
+ `; + + const content = document.getElementById("thoughtsContent"); + content.innerHTML = `
`; + + fetchAPI(`/api/book/notes?book_id=${bookId}`) + .then((data) => { + currentThoughtsData = data; + renderThoughtsPage(data); + }) + .catch((e) => { + content.innerHTML = `
加载失败: ${e.message}
`; + }); +} + +function closeThoughtsPage() { + document.getElementById("thoughtsPage").style.display = "none"; + document.getElementById("mainView").style.display = ""; + currentThoughtsData = null; +} + +function renderThoughtsPage(data) { + // 更新统计 + const stats = document.getElementById("thoughtsBookStats"); + + // 分类:划线 / 书评 / 想法 + const highlights = data.highlights || []; + const bookReviews = (data.reviews || []).filter((r) => r.is_finish); + const thoughts = (data.reviews || []).filter((r) => !r.is_finish); + + stats.innerHTML = ` + 划线 ${highlights.length} + 书评 ${bookReviews.length} + 想法 ${thoughts.length} + `; + + const content = document.getElementById("thoughtsContent"); + + if (highlights.length === 0 && bookReviews.length === 0 && thoughts.length === 0) { + content.innerHTML = `
暂无笔记数据
`; + return; + } + + let html = ` +
+
+ + + + +
+
+ + +
+
+
+ `; + + content.innerHTML = html; + currentThoughtsCategory = "all"; + currentThoughtsSort = "time_desc"; + currentThoughtsSearch = ""; + renderThoughtsList("all"); +} + +function filterThoughts(category) { + document.querySelectorAll(".thought-filter-btn").forEach((btn) => { + btn.classList.remove("active"); + }); + event.target.closest(".thought-filter-btn").classList.add("active"); + currentThoughtsCategory = category; + renderThoughtsList(category); +} + +function onThoughtsSearch(val) { + currentThoughtsSearch = val.trim().toLowerCase(); + renderThoughtsList(currentThoughtsCategory); +} + +function onThoughtsSort(val) { + currentThoughtsSort = val; + renderThoughtsList(currentThoughtsCategory); +} + +/** 解析日期字符串为时间戳,无效则返回 0 */ +function parseDate(str) { + if (!str) return 0; + const d = new Date(str.replace(/-/g, "/")); + return isNaN(d.getTime()) ? 0 : d.getTime(); +} + +/** 对数组按排序模式排序,返回新数组 */ +function sortByMode(arr) { + const sorted = [...arr]; + if (currentThoughtsSort === "time_desc") { + sorted.sort((a, b) => parseDate(b.create_time) - parseDate(a.create_time)); + } else if (currentThoughtsSort === "time_asc") { + sorted.sort((a, b) => parseDate(a.create_time) - parseDate(b.create_time)); + } else if (currentThoughtsSort === "chapter") { + sorted.sort((a, b) => { + const ua = parseInt(a.chapter_uid) || 0; + const ub = parseInt(b.chapter_uid) || 0; + if (ua !== ub) return ua - ub; + // 同章节内按 range 起始位置排序 + const ra = a.range ? parseInt(a.range.split("-")[0]) : 0; + const rb = b.range ? parseInt(b.range.split("-")[0]) : 0; + return ra - rb; + }); + } + return sorted; +} + +/** 过滤搜索关键词 */ +function matchSearch(text) { + if (!currentThoughtsSearch) return true; + return (text || "").toLowerCase().includes(currentThoughtsSearch); +} + +function renderThoughtsList(category) { + const data = currentThoughtsData; + if (!data) return; + + // 原始分类 + let highlights = data.highlights || []; + let bookReviews = (data.reviews || []).filter((r) => r.is_finish); + let thoughts = (data.reviews || []).filter((r) => !r.is_finish); + + // 搜索过滤 + highlights = highlights.filter((h) => matchSearch(h.mark_text)); + bookReviews = bookReviews.filter((r) => matchSearch(r.content) || matchSearch(r.abstract)); + thoughts = thoughts.filter((r) => matchSearch(r.content) || matchSearch(r.abstract)); + + // 排序 + highlights = sortByMode(highlights); + bookReviews = sortByMode(bookReviews); + thoughts = sortByMode(thoughts); + + const list = document.getElementById("thoughtsList"); + let html = ""; + + // 划线区 + if (category === "all" || category === "highlight") { + if (highlights.length > 0) { + html += `
📌 划线 ${highlights.length}
`; + if (currentThoughtsSort === "chapter") { + // 按章节分组展示 + const grouped = {}; + highlights.forEach((h) => { + const ch = h.chapter_title || "未知章节"; + if (!grouped[ch]) grouped[ch] = []; + grouped[ch].push(h); + }); + for (const [chTitle, items] of Object.entries(grouped)) { + html += `
`; + html += `
${chTitle}
`; + items.forEach((h) => { + html += ` +
+ ${escapeHtml(h.mark_text)} +
+ ${h.chapter_title ? `${h.chapter_title}` : ""} + ${h.create_time ? `${h.create_time}` : ""} +
+
+ `; + }); + html += `
`; + } + } else { + // 按时间排序,平铺展示(标注章节) + highlights.forEach((h) => { + html += ` +
+ ${escapeHtml(h.mark_text)} +
+ ${h.chapter_title ? `${h.chapter_title}` : ""} + ${h.create_time ? `${h.create_time}` : ""} +
+
+ `; + }); + } + } + } + + // 书评区 + if (category === "all" || category === "review") { + if (bookReviews.length > 0) { + html += `
⭐ 书评 ${bookReviews.length}
`; + bookReviews.forEach((r) => { + const starVal = Math.max(0, Math.min(5, parseInt(r.star) || 0)); + const stars = starVal > 0 ? `
${"★".repeat(starVal)}${"☆".repeat(5 - starVal)}
` : ""; + html += ` +
+ ${stars} + ${escapeHtml(r.content)} +
+ ${r.chapter_name ? `${r.chapter_name}` : ""} + ${r.create_time || ""} +
+
+ `; + }); + } + } + + // 想法区 + if (category === "all" || category === "thought") { + if (thoughts.length > 0) { + html += `
💭 想法 ${thoughts.length}
`; + thoughts.forEach((r) => { + const abstract = r.abstract ? `
${escapeHtml(r.abstract)}
` : ""; + html += ` +
+ ${abstract} +
${escapeHtml(r.content)}
+
+ ${r.chapter_name ? `${r.chapter_name}` : ""} + ${r.create_time || ""} +
+
+ `; + }); + } + } + + if (!html) { + if (currentThoughtsSearch) { + html = `
未找到包含"${escapeHtml(currentThoughtsSearch)}"的内容
`; + } else { + html = `
该分类暂无内容
`; + } + } + + list.innerHTML = html; +} + +// ===== 弹窗控制 ===== +function showModal(id) { + document.getElementById(id).classList.add("active"); + document.body.style.overflow = "hidden"; +} + +function closeModal(id) { + document.getElementById(id).classList.remove("active"); + document.body.style.overflow = ""; +} + +document.addEventListener("keydown", (e) => { + if (e.key === "Escape") { + closeModal("bookDetailModal"); + if (document.getElementById("thoughtsPage").style.display !== "none") { + closeThoughtsPage(); + } + } +}); + +// ===== 推荐发现 ===== +let recommendMaxIdx = 0; + +function switchDiscoverTab(tab) { + const recPanel = document.getElementById("recommendPanel"); + const searchPanel = document.getElementById("searchPanel"); + const tabRec = document.getElementById("tabRecommend"); + const tabSearch = document.getElementById("tabSearch"); + + if (tab === "recommend") { + recPanel.style.display = ""; + searchPanel.style.display = "none"; + tabRec.classList.add("active"); + tabSearch.classList.remove("active"); + } else { + recPanel.style.display = "none"; + searchPanel.style.display = ""; + tabRec.classList.remove("active"); + tabSearch.classList.add("active"); + } +} + +async function loadRecommend(maxIdx) { + const grid = document.getElementById("recommendGrid"); + grid.innerHTML = `
`; + + try { + const data = await fetchAPI(`/api/recommend?maxIdx=${maxIdx}`); + recommendMaxIdx = data.last_search_idx || 0; + renderDiscoverGrid(grid, data.books, true); + } catch (e) { + grid.innerHTML = `
加载推荐失败: ${e.message}
`; + } +} + +async function loadMoreRecommend() { + loadRecommend(recommendMaxIdx); +} + +async function doSearch() { + const keyword = document.getElementById("searchInput").value.trim(); + if (!keyword) return; + + const grid = document.getElementById("searchGrid"); + grid.innerHTML = `
`; + + try { + const data = await fetchAPI(`/api/search?keyword=${encodeURIComponent(keyword)}`); + if (data.books.length === 0) { + grid.innerHTML = `
未找到相关书籍
`; + return; + } + renderDiscoverGrid(grid, data.books, false); + } catch (e) { + grid.innerHTML = `
搜索失败: ${e.message}
`; + } +} + +function renderDiscoverGrid(grid, books, showReason) { + grid.innerHTML = books + .map((book) => { + const rating = book.new_rating > 0 ? (book.new_rating / 10).toFixed(1) : null; + const ratingLabel = book.rating_title ? `${book.rating_title}` : ""; + const ratingHtml = rating ? `${rating}` : ""; + const readingHtml = book.reading_count ? `${book.reading_count}人在读` : ""; + const reasonHtml = (showReason && book.reason) ? `
${book.reason}
` : ""; + const categoryHtml = book.category ? `
${book.category}
` : ""; + + return ` +
+ ${book.title} +
+
${book.title}
+
${book.author || ''}
+
${ratingHtml}${ratingLabel}${readingHtml}
+ ${categoryHtml} + ${reasonHtml} +
+
+ `; + }) + .join(""); +} diff --git a/legacy/v1/templates/index.html b/legacy/v1/templates/index.html new file mode 100644 index 0000000..803e317 --- /dev/null +++ b/legacy/v1/templates/index.html @@ -0,0 +1,211 @@ + + + + + + 我的读书数据 + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+

阅读,是一场漫长的旅行

+

正在加载数据...

+
+
+
+
+
+
+
+
+
+ + +
+
+

📊 阅读数据可视化

+
+
+

年度阅读时长趋势

+
+
+
+

24小时阅读时段分布

+
+
+
+

偏好阅读分类

+
+
+
+

偏好作者 TOP 10

+
+
+
+
+
+ + +
+
+

🏆 阅读时长排行

+
+
+
+ + +
+
+

📚 我的书架

+
+
+ + + +
+
+
+
+
+ +
+
+ + +
+
+

✍️ 笔记概览

+
+
+
+
+ + +
+
+

🔍 推荐发现

+
+ + +
+
+
+ + +
+
+
+ +
+
+ +
+ + + + + + + + + + + +
+
+

数据来源:微信读书 · 数据存储:本地 MySQL · 更新时间:

+ +
+
+ + + + From 4cbaabd42cea1720406780241dded398115e49c0 Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 11 Sep 2026 18:21:13 +0800 Subject: [PATCH 09/16] =?UTF-8?q?chore:=20=E6=96=B0=E5=A2=9E=20v2=20?= =?UTF-8?q?=E7=9C=8B=E6=9D=BF=E5=90=AF=E5=8A=A8=E8=84=9A=E6=9C=AC=20start?= =?UTF-8?q?=5Fdashboard.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 封装启动流程,支持 PORT / WEREAD_API_KEY / PYTHON_BIN 环境变量。 默认使用托管 Python 环境,避免系统解释器缺少 flask 依赖。 --- start_dashboard.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 start_dashboard.sh diff --git a/start_dashboard.sh b/start_dashboard.sh new file mode 100755 index 0000000..e06b743 --- /dev/null +++ b/start_dashboard.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# ========================================================================== +# 阅间 · 微信读书看板 v2 —— 启动脚本 +# -------------------------------------------------------------------------- +# 用法: +# ./start_dashboard.sh # 默认 8770 端口 +# PORT=8080 ./start_dashboard.sh # 指定端口(注意 8080 可能被旧实例占用) +# +# 需要设置 WEREAD_API_KEY;MySQL 不可用时服务仍会启动(部分功能降级)。 +# ========================================================================== +set -euo pipefail + +cd "$(dirname "$0")" + +PYTHON_BIN="${PYTHON_BIN:-$HOME/.workbuddy/binaries/python/envs/default/bin/python}" +if [ ! -x "$PYTHON_BIN" ]; then + PYTHON_BIN="$(command -v python3)" +fi + +export WEREAD_API_KEY="${WEREAD_API_KEY:-}" +export PORT="${PORT:-8770}" + +if [ -z "$WEREAD_API_KEY" ]; then + echo "[警告] WEREAD_API_KEY 未设置,书籍详情 / 笔记 / 推荐 / 搜索等实时接口将不可用" + echo " export WEREAD_API_KEY=wrk-xxxxxxxx" +fi + +echo "[信息] Python: $PYTHON_BIN" +echo "[信息] 启动端口: $PORT" +exec "$PYTHON_BIN" app.py From d91793604913d21df82cc328a0a07d881997644a Mon Sep 17 00:00:00 2001 From: kinghwj Date: Fri, 11 Sep 2026 18:21:13 +0800 Subject: [PATCH 10/16] =?UTF-8?q?docs:=20=E8=A1=A5=E5=85=85=20v2=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=96=87=E6=A1=A3=E4=B8=8E=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E6=88=AA=E5=9B=BE=EF=BC=8C=E6=9B=B4=E6=96=B0=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docs/V2_API.md 说明 /api/v2/* 各接口参数与回包结构 - docs/screenshots/ 归档概览/书架/笔记/详情/发现/暗色主题验证截图 - README 说明 v2 为默认前端、启动方式与 v1 归档位置 --- README.md | 28 ++++++++++++---- docs/V2_API.md | 45 ++++++++++++++++++++++++++ docs/screenshots/v2-book-detail.png | Bin 0 -> 252246 bytes docs/screenshots/v2-discover.png | Bin 0 -> 253908 bytes docs/screenshots/v2-goal-editor.png | Bin 0 -> 175531 bytes docs/screenshots/v2-notes.png | Bin 0 -> 158901 bytes docs/screenshots/v2-overview-dark.png | Bin 0 -> 146856 bytes docs/screenshots/v2-overview.png | Bin 0 -> 166949 bytes docs/screenshots/v2-shelf.png | Bin 0 -> 222082 bytes 9 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 docs/V2_API.md create mode 100644 docs/screenshots/v2-book-detail.png create mode 100644 docs/screenshots/v2-discover.png create mode 100644 docs/screenshots/v2-goal-editor.png create mode 100644 docs/screenshots/v2-notes.png create mode 100644 docs/screenshots/v2-overview-dark.png create mode 100644 docs/screenshots/v2-overview.png create mode 100644 docs/screenshots/v2-shelf.png diff --git a/README.md b/README.md index ce09b81..189040c 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,29 @@ # 微信读书数据展示网站 -基于微信读书 API 的个人读书数据展示网站,数据存储在本地 SQLite 数据库中。 +基于微信读书 API 的个人读书数据展示网站。 + +- **v2「阅间」看板(当前默认前端)**:沿用设计稿的视觉与交互,数据来自 `/api/v2/*` 实时聚合接口,见 `docs/V2_API.md`。 +- **v1 仪表盘(已归档)**:原 ECharts 单页仪表盘,完整备份在 `legacy/v1/`。 ## 项目结构 ``` . ├── fetch_data.py # 数据采集脚本(从微信读书 API 拉取数据到 SQLite) -├── app.py # Flask 后端服务 +├── app.py # Flask 后端服务(v1 接口 + 注册 v2 Blueprint) +├── api_v2.py # v2 数据接口层(/api/v2/*,供「阅间」前端使用) +├── start_dashboard.sh # 启动脚本(端口可用 PORT 覆盖) +├── legacy/v1/ # v1 前端备份(index.html / style.css / app.js) ├── weread.db # SQLite 数据库(运行 fetch_data.py 后生成) ├── requirements.txt # Python 依赖 ├── templates/ -│ └── index.html # 前端页面 +│ └── index.html # 「阅间」前端页面(v2 设计稿) └── static/ - ├── css/style.css # 样式文件 - └── js/app.js # 前端逻辑 + ├── css/styles.css # v2 样式(设计稿原样) + ├── css/style.css # v1 样式(保留) + └── js/ + ├── weapi.js # v2 数据层(封装 /api/v2/*) + └── app.js # v2 交互逻辑 ``` ## 快速开始 @@ -42,10 +51,15 @@ python fetch_data.py ### 4. 启动网站 ```bash -python app.py +./start_dashboard.sh # 默认 8770 端口 +PORT=8080 ./start_dashboard.sh # 或指定端口 ``` -访问 http://127.0.0.1:8080 即可查看读书数据展示。 +也可以直接 `python app.py`(默认 8080,可用环境变量 `PORT` 覆盖), +然后访问 http://127.0.0.1:8770 查看「阅间」看板。 + +> v2 的书架、统计、推荐、搜索等数据实时来自微信读书接口; +> 未运行 `fetch_data.py` 时也能使用,只有进度/笔记等局部数据会缺少缓存加速。 ## 功能模块 diff --git a/docs/V2_API.md b/docs/V2_API.md new file mode 100644 index 0000000..6be952d --- /dev/null +++ b/docs/V2_API.md @@ -0,0 +1,45 @@ +# v2 数据接口(/api/v2/*) + +「阅间」新版前端的数据来源。实现在 `api_v2.py`(Flask Blueprint,注册于 `app.py`), +v1 的 `/api/*` 接口保持不变,两套接口可同时使用。 + +## 数据来源与优先级 + +| 数据 | 来源 | 说明 | +|------|------|------| +| 书架、书目 | 微信读书 `/shelf/sync`(实时,进程内缓存 10 分钟) | 字段含书名、作者、分类、封面、读完标记、最近阅读时间 | +| 阅读统计(周/月/年/总) | 微信读书 `/readdata/detail`(实时,缓存 5 分钟) | 时长趋势、阅读天数、读得最多、偏好分类/作者/出版社/时段/勋章/好友排行 | +| 阅读进度 | 本地 `notebooks` / `book_progress` 缓存优先,缺失时并发调用 `/book/getprogress` 补齐(缓存 10 分钟) | 用于书架卡片与详情页进度 | +| 笔记本与笔记 | 本地 `notebooks` 表 + 实时 `/book/bookmarklist`、`/review/list/mine` | 划线与想法正文实时获取 | +| 书籍详情 | 实时 `/book/info`、`/book/getprogress`、`/book/chapterinfo`、`/book/bestbookmarks`、`/review/list`、`/book/similar` | 逐项降级,单项失败不影响整页 | +| 搜索 / 推荐 | 实时 `/store/search`(按 scope 切换类型)、`/book/recommend` | | +| 阅读目标 | 浏览器 localStorage(key `weread-goals-v2`) | 与设计稿一致,不落库 | + +MySQL 不可用时接口仍可用(返回 `degraded: true`),依赖本地缓存的字段会退化为实时接口结果。 + +## 接口清单 + +| 方法 | 路径 | 参数 | 说明 | +|------|------|------|------| +| GET | `/api/v2/status` | — | 连接状态、书架规模、数据快照时间 | +| GET | `/api/v2/shelf` | `tab=all\|reading\|done\|wish`、`keyword`、`limit`、`offset`、`progress=1` | 书架列表 + 书单 + 有声书 + 文章收藏入口(`progress=1` 为首屏书籍实时补拉进度) | +| GET | `/api/v2/dashboard` | `period=week\|month\|year\|overall` | 整页概览:趋势柱状图、四张统计卡、读得最多、偏好方向、时段分布、阅读画像、年度小结 | +| GET | `/api/v2/notebooks` | — | 笔记本概览(有笔记的书 + 划线/想法/书签数量) | +| GET | `/api/v2/notes` | `book_id`(`all` 表示聚合笔记最多的前 N 本)、`limit` | 划线与想法正文,按时间倒序 | +| GET | `/api/v2/book/` | — | 书籍详情聚合:简介 + 进度 + 目录 + 我的笔记 + 热门划线 + 点评 + 相似推荐 | +| GET | `/api/v2/book//reviews` | `type=0\|1\|2\|3\|4`(全部/推荐/不行/最新/一般)、`count` | 公开点评(按类型筛选) | +| GET | `/api/v2/book//highlights` | `chapter_uid`(0=全书) | 热门划线(人数、章节、位置、跳转链接) | +| GET | `/api/v2/book//underline-thoughts` | `chapter_uid`、`range` | 某条划线下的他人想法 | +| GET | `/api/v2/thought/` | — | 单条想法详情:正文、划线原文、点赞、评论 | +| GET | `/api/v2/archives` | — | 书架书单及成员书籍 | +| GET | `/api/v2/recommend` | `maxIdx` | 个性化推荐 | +| GET | `/api/v2/search` | `keyword`、`scope=all\|books\|author\|lists\|audio\|fulltext\|novel\|account\|article` | 书城检索(按分组归一为书籍/作者/书单) | +| POST | `/api/sync` | — | v1 已有:重新采集数据并迁移到 MySQL | + +## 与微信读书接口的字段口径 + +- 评分:接口 `newRating` 为 0~1000,接口层换算成 `score = newRating / 100`(前端按设计稿公式展示为 `评分 XX/100`),详情页展示 `rating = newRating / 10`。 +- 封面:设计稿使用 4 种示意底色(`c1`~`c4`),由 `book_id` 哈希稳定映射;真实封面 URL 保留在 `cover_url`。 +- 进度:统一到 0~100 整数;`status` 口径为「读完=done、有最近阅读=reading、从未读过=wish」。 +- 周/月维度的统计接口不回偏好画像字段,接口层用「总计」口径补齐,并在 `preference_source` 中标注来源。 +- 「文章收藏」按接口规范计为 1 个书架条目(`books + albums + mp`)。 diff --git a/docs/screenshots/v2-book-detail.png b/docs/screenshots/v2-book-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..ad12d5eb27d57c56731ce9d4a158e272fcc2dc5a GIT binary patch literal 252246 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%0D*b1LPA@4@}lY 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

`;jXtlyQEw`QLDnEFg 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�Jxj~1Th2H5xG!yb0Lqw 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%0AV8v|we!VoDg9}e6*Qst3_F{V>vwc2(J_vqp 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 Hu0mjf24!A@ literal 0 HcmV?d00001 diff --git a/docs/screenshots/v2-discover.png b/docs/screenshots/v2-discover.png new file mode 100644 index 0000000000000000000000000000000000000000..9450fa4af47199d78e0312fc20870b3cc66171e9 GIT binary patch literal 253908 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
P=>fe?HT8Ns{gCFE@-Ea{kok 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

EG#-m&jySDA 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

2AtStSYF9 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

2?fVvrzv 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

0B1f%QF%$nsfgi(U(&?qu7BGt1_p+`4{sK< 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

wo6} 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