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 a8a52f5fd0 refactor: 提取公共工具函数到 shared/utils.js,消除 DRY 重复
- escapeHtml 8 处定义合并为 shared/utils.js 1 处:删除 shortcode.js、posts/show.html、settings/index.html、comments.js、energy.js、common.js 中的重复定义
- formatTime 6 处定义合并为 1 处:统一 ISO 时间格式化逻辑
- api() 5 处定义收敛:前台页面使用 shared/utils.js 统一 api(method,url,data),admin 使用 common.js 的 api 对象
- showToast 3 处定义合并为 1 处:自包含内联样式,前后台通用
- admin/posts.js api 调用迁移为 api.post()
2026-06-02 19:50:52 +08:00

115 lines
4.8 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 / api 由 shared/utils.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) 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';
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;
if (!confirm('确认删除此评论?')) return;
fetch('/api/admin/comments/' + id, {
method: 'DELETE',
headers: { 'X-CSRF-Token': csrfToken }
}).then(function(r) { return r.json(); })
.then(function(d) {
if (d.success) {
loadComments(currentPage);
} else {
alert(d.message || '删除失败');
}
}).catch(function() { alert('请求失败'); });
});
}
}
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);
})();