This repository has been archived on 2026-06-21. You can view files and clone it, but cannot push or open issues or pull requests.
Files
MetaLab/templates/admin/static/js/comments.js
Victor_Jay 983f539268 fix: 修复管理后台 JS api 变量冲突导致页面加载失败
- common.js 中 const api 改为 var api,避免与 utils.js 的 function api() 重复声明冲突,导致 roleLabel/statusLabel 等未定义
- common.js 新增 api.del() 方法
- comments.js 升级为对象式 api.get/api.del,修复 api('GET') 函数调用失败
- comments.js 修复 csrfToken 未定义导致删除请求 403
- users.js/audit.js catch 块改为输出真实错误信息
2026-06-02 21:13:58 +08:00

116 lines
5.0 KiB
JavaScript

(function() {
'use strict';
var currentPage = 1;
var currentKeyword = '';
var totalPages = 1;
var searchInput = document.getElementById('commentSearch');
var searchBtn = document.getElementById('commentSearchBtn');
var clearBtn = document.getElementById('commentClearBtn');
var tbody = document.getElementById('commentTableBody');
var pagination = document.getElementById('commentPagination');
var loading = document.getElementById('commentLoading');
// escapeHtml / formatTime / showToast / showConfirm / getCSRFToken 由 shared/utils.js 提供
// api (对象式) 由 admin/static/js/common.js 提供
function loadComments(page) {
loading.style.display = 'block';
var url = '/api/admin/comments?page=' + page + '&page_size=20';
if (currentKeyword) url += '&keyword=' + encodeURIComponent(currentKeyword);
api.get(url).then(function(d) {
loading.style.display = 'none';
if (!d.success) { showToast(d.message || '加载失败', 'error'); return; }
totalPages = d.data.total_pages || 1;
tbody.innerHTML = '';
var items = d.data.items || [];
if (items.length === 0) {
tbody.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:40px;color:#9ca3af">暂无评论</td></tr>';
pagination.innerHTML = '';
return;
}
for (var i = 0; i < items.length; i++) {
var c = items[i];
var row = document.createElement('tr');
var body = escapeHtml(c.body).substring(0, 80) + (c.body && c.body.length > 80 ? '...' : '');
row.innerHTML =
'<td>' + c.id + '</td>' +
'<td>' + escapeHtml(c.author_name) + '</td>' +
'<td class="comment-body-cell">' + body + '</td>' +
'<td><a href="/posts/' + c.post_id + '" target="_blank">' + escapeHtml(c.post_title || '文章#' + c.post_id) + '</a></td>' +
'<td>' + formatTime(c.created_at) + '</td>' +
'<td><button class="btn btn-danger btn-sm comment-delete-btn" data-id="' + c.id + '">删除</button></td>';
tbody.appendChild(row);
}
renderPagination(page);
bindDeleteBtns();
}).catch(function() {
loading.style.display = 'none';
showToast('加载失败', 'error');
tbody.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:40px;color:#dc2626">加载失败</td></tr>';
});
}
function bindDeleteBtns() {
var btns = tbody.querySelectorAll('.comment-delete-btn');
for (var i = 0; i < btns.length; i++) {
if (btns[i]._bound) continue;
btns[i]._bound = true;
btns[i].addEventListener('click', function() {
var id = this.dataset.id;
showConfirm('确认', '确认删除此评论?').then(function(ok) {
if (!ok) return;
api.del('/api/admin/comments/' + id).then(function(d) {
if (d.success) {
showToast(d.message, 'success');
loadComments(currentPage);
} else {
showToast(d.message || '删除失败', 'error');
}
}).catch(function() { showToast('请求失败', 'error'); });
});
});
}
}
function renderPagination(page) {
if (totalPages <= 1) { pagination.innerHTML = ''; return; }
var html = '';
if (page > 1) html += '<a href="javascript:void(0)" class="admin-page-link" data-page="' + (page-1) + '">上一页</a>';
html += '<span class="admin-page-info">' + page + ' / ' + totalPages + '</span>';
if (page < totalPages) html += '<a href="javascript:void(0)" class="admin-page-link" data-page="' + (page+1) + '">下一页</a>';
pagination.innerHTML = html;
var links = pagination.querySelectorAll('.admin-page-link');
for (var j = 0; j < links.length; j++) {
links[j].addEventListener('click', function() {
currentPage = parseInt(this.dataset.page);
loadComments(currentPage);
});
}
}
searchBtn.addEventListener('click', function() {
currentKeyword = searchInput.value.trim();
currentPage = 1;
if (currentKeyword) { clearBtn.style.display = 'inline-block'; }
else { clearBtn.style.display = 'none'; }
loadComments(currentPage);
});
clearBtn.addEventListener('click', function() {
currentKeyword = '';
currentPage = 1;
searchInput.value = '';
clearBtn.style.display = 'none';
loadComments(currentPage);
});
searchInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') searchBtn.click();
});
loadComments(currentPage);
})();