feat: 阶段2 Python后端、用户管理、统计、单词收藏与响应式适配
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
import json
|
||||
|
||||
from flask import Blueprint, jsonify, request
|
||||
|
||||
from .auth import login_required
|
||||
from .db import get_db, now_iso
|
||||
from .translate_service import perform_translate
|
||||
|
||||
settings_bp = Blueprint("settings", __name__)
|
||||
|
||||
|
||||
def get_user_settings(user_id):
|
||||
conn = get_db()
|
||||
try:
|
||||
row = conn.execute(
|
||||
"SELECT translator, api_url, api_key, extra_config, updated_at FROM settings WHERE user_id = ?",
|
||||
(user_id,),
|
||||
).fetchone()
|
||||
if row is None:
|
||||
return {
|
||||
"translator": "local",
|
||||
"api_url": "",
|
||||
"api_key": "",
|
||||
"extra_config": {},
|
||||
"updated_at": "",
|
||||
}
|
||||
result = dict(row)
|
||||
try:
|
||||
result["extra_config"] = json.loads(result["extra_config"] or "{}")
|
||||
except Exception:
|
||||
result["extra_config"] = {}
|
||||
return result
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
@settings_bp.get("/api/settings/translation")
|
||||
@login_required
|
||||
def get_translation_settings(user):
|
||||
return jsonify(get_user_settings(user["id"]))
|
||||
|
||||
|
||||
@settings_bp.put("/api/settings/translation")
|
||||
@login_required
|
||||
def update_translation_settings(user):
|
||||
data = request.get_json(silent=True) or {}
|
||||
translator = (data.get("translator") or "local").strip().lower()
|
||||
if translator not in ("local", "mymemory", "custom"):
|
||||
return jsonify({"error": "不支持的翻译方式"}), 400
|
||||
extra_config = data.get("extra_config") or {}
|
||||
if not isinstance(extra_config, dict):
|
||||
return jsonify({"error": "extra_config 必须是对象"}), 400
|
||||
conn = get_db()
|
||||
try:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO settings (user_id, translator, api_url, api_key, extra_config, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
ON CONFLICT(user_id) DO UPDATE SET
|
||||
translator = excluded.translator,
|
||||
api_url = excluded.api_url,
|
||||
api_key = excluded.api_key,
|
||||
extra_config = excluded.extra_config,
|
||||
updated_at = excluded.updated_at
|
||||
""",
|
||||
(
|
||||
user["id"],
|
||||
translator,
|
||||
(data.get("api_url") or "").strip(),
|
||||
(data.get("api_key") or "").strip(),
|
||||
json.dumps(extra_config, ensure_ascii=False),
|
||||
now_iso(),
|
||||
),
|
||||
)
|
||||
conn.commit()
|
||||
return jsonify(get_user_settings(user["id"]))
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
@settings_bp.post("/api/translate")
|
||||
@login_required
|
||||
def translate_text(user):
|
||||
data = request.get_json(silent=True) or {}
|
||||
text = (data.get("text") or "").strip()
|
||||
if not text:
|
||||
return jsonify({"error": "翻译内容不能为空"}), 400
|
||||
source = (data.get("source") or "zh").strip()
|
||||
target = (data.get("target") or "es").strip()
|
||||
settings = get_user_settings(user["id"])
|
||||
result = perform_translate(text, settings, source, target)
|
||||
if not result.get("ok"):
|
||||
return jsonify({"error": result.get("error", "翻译失败")}), 502
|
||||
return jsonify(result)
|
||||
Reference in New Issue
Block a user