Dev qing #14

Merged
qing merged 39 commits from dev_qing into main 2026-07-30 19:47:22 +08:00
2 changed files with 26 additions and 3 deletions
Showing only changes of commit b4e1cf462a - Show all commits

No files matched your search

+17
View File
@@ -252,6 +252,23 @@ def get_notes():
result = notes['data'] result = notes['data']
# 解析当前用户(可选):为每个节点附带操作权标记 can_operate,
# 前端据此显隐编辑/删除按钮。口径与 delete_note / update_note 一致:
# 管理员(is_admin)或节点 owner 有权。
# get_notes 保持公开:未携带 Token 或 Token 解析失败时,所有节点一律无权。
info = None
auth: str = request.headers.get('Authorization', '')
if auth.startswith('Bearer '):
try:
info = decode_token(auth[7:])
except Exception:
info = None
for note in result:
note['can_operate'] = bool(
info and (info.get('is_admin') or note.get('owner') == info.get('user'))
)
logs.info('dnfs', f'get_notes 查询 pid={pid} 返回{len(result)}条', extra={'ip': request.remote_addr}) logs.info('dnfs', f'get_notes 查询 pid={pid} 返回{len(result)}条', extra={'ip': request.remote_addr})
return jsonify(result), 200 return jsonify(result), 200
+9 -3
View File
@@ -560,9 +560,12 @@ function load_notes(main_node) {
sts_div.appendChild(makeStatItem(ICON_EYE, item.visit_count)); sts_div.appendChild(makeStatItem(ICON_EYE, item.visit_count));
sts_div.appendChild(makeStatItem(ICON_HEART, item.like_count)); sts_div.appendChild(makeStatItem(ICON_HEART, item.like_count));
sts_div.appendChild(makeStatItem(ICON_SHARE, item.share_count)); sts_div.appendChild(makeStatItem(ICON_SHARE, item.share_count));
// 卡片操作按钮:编辑 / 删除(stopPropagation 防止触发卡片自身的点入跳转) // 卡片操作按钮:编辑 / 移动 / 删除(stopPropagation 防止触发卡片自身的点入跳转)
// 编辑与删除按 can_operate 显隐:操作权由后端 get_notes 按 owner / is_admin 判定,
// 与 delete_note / update_note 鉴权口径一致;未登录或无权时隐藏
let act_div = document.createElement('div'); let act_div = document.createElement('div');
act_div.className = "card-actions"; act_div.className = "card-actions";
if (item.can_operate === true) {
let edit_btn = document.createElement('button'); let edit_btn = document.createElement('button');
edit_btn.className = "act-btn act-edit"; edit_btn.className = "act-btn act-edit";
edit_btn.innerHTML = ICON_EDIT + "编辑"; edit_btn.innerHTML = ICON_EDIT + "编辑";
@@ -570,6 +573,8 @@ function load_notes(main_node) {
event.stopPropagation(); event.stopPropagation();
startEdit(item); startEdit(item);
}); });
act_div.appendChild(edit_btn);
}
let move_btn = document.createElement('button'); let move_btn = document.createElement('button');
move_btn.className = "act-btn act-move"; move_btn.className = "act-btn act-move";
move_btn.innerHTML = ICON_MOVE + "移动"; move_btn.innerHTML = ICON_MOVE + "移动";
@@ -577,6 +582,8 @@ function load_notes(main_node) {
event.stopPropagation(); event.stopPropagation();
startMove(item); startMove(item);
}); });
act_div.appendChild(move_btn);
if (item.can_operate === true) {
let del_btn = document.createElement('button'); let del_btn = document.createElement('button');
del_btn.className = "act-btn act-del"; del_btn.className = "act-btn act-del";
del_btn.innerHTML = ICON_TRASH + "删除"; del_btn.innerHTML = ICON_TRASH + "删除";
@@ -584,9 +591,8 @@ function load_notes(main_node) {
event.stopPropagation(); event.stopPropagation();
deleteChild(item.id); deleteChild(item.id);
}); });
act_div.appendChild(edit_btn);
act_div.appendChild(move_btn);
act_div.appendChild(del_btn); act_div.appendChild(del_btn);
}
ttl.appendChild(wrt_div); ttl.appendChild(wrt_div);
ttl.appendChild(sts_div); ttl.appendChild(sts_div);
let ctt = document.createElement('p'); let ctt = document.createElement('p');