feat: 编辑器对齐+审核记录+UI调整
- 新增/编辑配方编辑器与配方卡片编辑界面完全一致(含容量与稀释) - 自定义滴数/稀释比例框缩小,应用按钮放在稀释比例同一行 - 管理员可查看所有审核记录(采纳/拒绝历史) - 标签筛选和全选按钮对所有用户可见 - 我的配方/公共配方库均可折叠 - viewer 看配方卡片无编辑按钮 - diary 配方卡片无编辑按钮 - 退出登录跳转首页并刷新 - 新增 /api/recipe-reviews 端点 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1438,23 +1438,38 @@ def get_unmatched_searches(days: int = 7, user=Depends(require_role("admin", "se
|
||||
return [dict(r) for r in rows]
|
||||
|
||||
|
||||
# ── Recipe review history ──────────────────────────────
|
||||
@app.get("/api/recipe-reviews")
|
||||
def list_recipe_reviews(user=Depends(require_role("admin"))):
|
||||
conn = get_db()
|
||||
rows = conn.execute(
|
||||
"SELECT a.id, a.action, a.target_name, a.detail, a.created_at, "
|
||||
"u.display_name, u.username "
|
||||
"FROM audit_log a LEFT JOIN users u ON a.user_id = u.id "
|
||||
"WHERE a.action IN ('adopt_recipe', 'reject_recipe') "
|
||||
"ORDER BY a.id DESC LIMIT 100"
|
||||
).fetchall()
|
||||
conn.close()
|
||||
return [dict(r) for r in rows]
|
||||
|
||||
|
||||
# ── Contribution stats ─────────────────────────────────
|
||||
@app.get("/api/me/contribution")
|
||||
def my_contribution(user=Depends(get_current_user)):
|
||||
if not user.get("id"):
|
||||
return {"shared_count": 0}
|
||||
return {"adopted_count": 0, "shared_count": 0}
|
||||
conn = get_db()
|
||||
# Count recipes adopted from this user (tracked in audit_log)
|
||||
count = conn.execute(
|
||||
# adopted_count: recipes adopted from this user (owner changed to admin)
|
||||
adopted = conn.execute(
|
||||
"SELECT COUNT(*) FROM audit_log WHERE action = 'adopt_recipe' AND detail LIKE ?",
|
||||
(f'%"from_user": "{user.get("display_name") or user.get("username")}"%',)
|
||||
).fetchone()[0]
|
||||
# Also count recipes still owned by user in public library
|
||||
own_count = conn.execute(
|
||||
# pending: recipes still owned by user in public library (not yet adopted)
|
||||
pending = conn.execute(
|
||||
"SELECT COUNT(*) FROM recipes WHERE owner_id = ?", (user["id"],)
|
||||
).fetchone()[0]
|
||||
conn.close()
|
||||
return {"shared_count": count + own_count}
|
||||
return {"adopted_count": adopted, "shared_count": adopted + pending}
|
||||
|
||||
|
||||
# ── Notifications ──────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user