diff --git a/backend/main.py b/backend/main.py index 275bd84..69d872e 100644 --- a/backend/main.py +++ b/backend/main.py @@ -355,6 +355,8 @@ def register(body: dict): "INSERT INTO users (username, token, role, display_name, password) VALUES (?, ?, ?, ?, ?)", (username, token, "viewer", display_name or username, hash_password(password)) ) + uid = conn.execute("SELECT id FROM users WHERE username = ?", (username,)).fetchone() + log_audit(conn, uid["id"] if uid else None, "register", "user", username, display_name or username, None) conn.commit() except Exception: conn.close() @@ -798,7 +800,9 @@ def create_recipe(recipe: RecipeIn, user=Depends(get_current_user)): for tag in recipe.tags: c.execute("INSERT OR IGNORE INTO tags (name) VALUES (?)", (tag,)) c.execute("INSERT OR IGNORE INTO recipe_tags (recipe_id, tag_name) VALUES (?, ?)", (rid, tag)) - log_audit(conn, user["id"], "create_recipe", "recipe", rid, recipe.name) + # Only log for admin/senior_editor direct adds (share); others wait for adopt + if user["role"] in ("admin", "senior_editor"): + log_audit(conn, user["id"], "share_recipe", "recipe", rid, recipe.name) who = user.get("display_name") or user["username"] if user["role"] == "senior_editor": # Senior editor adds directly — just inform admin @@ -866,7 +870,17 @@ def update_recipe(recipe_id: int, update: RecipeUpdate, user=Depends(get_current (recipe_id, tag), ) c.execute("UPDATE recipes SET updated_by = ?, version = COALESCE(version, 1) + 1 WHERE id = ?", (user["id"], recipe_id)) - log_audit(conn, user["id"], "update_recipe", "recipe", recipe_id, update.name) + # Get recipe name for log + rname = c.execute("SELECT name FROM recipes WHERE id = ?", (recipe_id,)).fetchone() + changed = [] + if update.name is not None: changed.append("名称") + if update.ingredients is not None: changed.append("成分") + if update.tags is not None: changed.append("标签") + if update.note is not None: changed.append("备注") + if update.en_name is not None: changed.append("英文名") + log_audit(conn, user["id"], "update_recipe", "recipe", recipe_id, + rname["name"] if rname else update.name, + json.dumps({"changed": "、".join(changed)}, ensure_ascii=False) if changed else None) conn.commit() conn.close() return {"ok": True} @@ -1028,7 +1042,7 @@ def create_tag(body: dict, user=Depends(require_role("admin", "senior_editor", " raise HTTPException(400, "Tag name required") conn = get_db() conn.execute("INSERT OR IGNORE INTO tags (name) VALUES (?)", (name,)) - # Don't log tag creation (too frequent/noisy) + log_audit(conn, user["id"], "create_tag", "tag", name, name, None) conn.commit() conn.close() return {"ok": True} diff --git a/frontend/src/components/RecipeCard.vue b/frontend/src/components/RecipeCard.vue index 5471295..8e33197 100644 --- a/frontend/src/components/RecipeCard.vue +++ b/frontend/src/components/RecipeCard.vue @@ -1,6 +1,6 @@