mirror of
https://github.com/KingHWJ/WeReadBoard.git
synced 2026-11-03 18:24:58 +08:00
刷新按钮支持数据同步:调用 /api/sync 拉取最新数据
- app.py 新增 /api/sync POST 接口:运行 fetch_data.py + migrate_to_mysql.py - refreshShelf() 先调用 /api/sync 同步数据,再重新加载书架 - 按钮文案三阶段:同步中... → 加载中... → 刷新 - CSS 增加 min-width 防止按钮宽度抖动 - launchd plist 和 start_server.sh 均配置 WEREAD_API_KEY 环境变量
This commit is contained in:
1 parent
e8552a9a4c
commit
7bc02075bd
5 files changed
+112
-2
No files matched your search
@@ -18,6 +18,7 @@
|
||||
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
import urllib.request
|
||||
from datetime import datetime
|
||||
@@ -1183,6 +1184,79 @@ def api_search(conn):
|
||||
})
|
||||
|
||||
|
||||
# ======================================================================
|
||||
# 数据同步接口 — 从微信读书 API 拉取最新数据并迁移到 MySQL
|
||||
# ======================================================================
|
||||
|
||||
@app.route("/api/sync", methods=["POST"])
|
||||
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",
|
||||
)
|
||||
env = os.environ.copy()
|
||||
env["WEREAD_API_KEY"] = env.get("WEREAD_API_KEY", "")
|
||||
if not env["WEREAD_API_KEY"]:
|
||||
return jsonify({"ok": False, "error": "WEREAD_API_KEY 未设置"}), 500
|
||||
|
||||
results = {"steps": []}
|
||||
try:
|
||||
# Step 1: 采集数据 → SQLite
|
||||
r1 = subprocess.run(
|
||||
[python_bin, "fetch_data.py"],
|
||||
cwd=project_dir,
|
||||
env=env,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=120,
|
||||
)
|
||||
results["steps"].append({
|
||||
"name": "fetch_data",
|
||||
"ok": r1.returncode == 0,
|
||||
"stdout": r1.stdout[-500:] if r1.stdout else "",
|
||||
"stderr": r1.stderr[-500:] if r1.stderr else "",
|
||||
})
|
||||
if r1.returncode != 0:
|
||||
results["ok"] = False
|
||||
results["error"] = "fetch_data.py 执行失败"
|
||||
return jsonify(results), 500
|
||||
|
||||
# Step 2: SQLite → MySQL
|
||||
r2 = subprocess.run(
|
||||
[python_bin, "migrate_to_mysql.py"],
|
||||
cwd=project_dir,
|
||||
env=env,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=60,
|
||||
)
|
||||
results["steps"].append({
|
||||
"name": "migrate_to_mysql",
|
||||
"ok": r2.returncode == 0,
|
||||
"stdout": r2.stdout[-500:] if r2.stdout else "",
|
||||
"stderr": r2.stderr[-500:] if r2.stderr else "",
|
||||
})
|
||||
if r2.returncode != 0:
|
||||
results["ok"] = False
|
||||
results["error"] = "migrate_to_mysql.py 执行失败"
|
||||
return jsonify(results), 500
|
||||
|
||||
results["ok"] = True
|
||||
results["message"] = "数据同步完成"
|
||||
return jsonify(results)
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
results["ok"] = False
|
||||
results["error"] = "同步超时(超过120秒)"
|
||||
return jsonify(results), 500
|
||||
except Exception as e:
|
||||
results["ok"] = False
|
||||
results["error"] = str(e)
|
||||
return jsonify(results), 500
|
||||
|
||||
|
||||
# ======================================================================
|
||||
# 启动入口
|
||||
# ======================================================================
|
||||
|
||||
Reference in new issue
Block a user