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()
This commit is contained in:
2026-06-02 19:50:52 +08:00
parent 746deca754
commit a8a52f5fd0
8 changed files with 96 additions and 164 deletions

View File

@ -999,11 +999,11 @@
var sign = item.amount > 0 ? '+' : '';
html += '<div class="energy-log-item ' + cls + '">'
+ '<div class="energy-log-meta">'
+ '<span class="energy-log-type">' + escapeHTML(item.type_name) + '</span>'
+ '<span class="energy-log-type">' + escapeHtml(item.type_name) + '</span>'
+ '<span class="energy-log-time">' + formatTime(item.created_at) + '</span>'
+ '</div>'
+ '<div class="energy-log-info">'
+ '<span class="energy-log-desc">' + escapeHTML(item.description) + '</span>'
+ '<span class="energy-log-desc">' + escapeHtml(item.description) + '</span>'
+ '<span class="energy-log-amount">' + sign + item.amount_display + ' 域能</span>'
+ '</div>'
+ '</div>';
@ -1014,16 +1014,7 @@
logListEl.innerHTML = '<div class="energy-log-empty">加载失败</div>';
});
function escapeHTML(str) {
var div = document.createElement('div');
div.appendChild(document.createTextNode(str));
return div.innerHTML;
}
function formatTime(isoStr) {
if (!isoStr) return '';
return isoStr.replace('T', ' ').replace(/\+.*/, '');
}
// escapeHtml / formatTime 由 shared/utils.js 统一提供
})();
// ===== 收藏夹 Tab =====
@ -1032,26 +1023,14 @@
var createBtn = document.getElementById('createFolderBtn');
if (!listEl) return;
function esc(s) {
var d = document.createElement('div');
d.textContent = s || '';
return d.innerHTML;
}
function api(method, url, data) {
var opts = { method: method, headers: { 'Content-Type': 'application/json' } };
var token = getCSRFToken();
if (token) opts.headers['X-CSRF-Token'] = token;
if (data) opts.body = JSON.stringify(data);
return fetch(url, opts).then(function (r) { return r.json(); });
}
// escapeHtml / api 由 shared/utils.js 统一提供
function loadFolders() {
listEl.innerHTML = '<div class="energy-log-empty">加载中...</div>';
api('GET', '/api/folders')
.then(function (d) {
if (!d.success) {
listEl.innerHTML = '<div class="energy-log-empty">' + esc(d.message || '加载失败') + '</div>';
listEl.innerHTML = '<div class="energy-log-empty">' + escapeHtml(d.message || '加载失败') + '</div>';
return;
}
if (!d.data || !d.data.folders || d.data.folders.length === 0) {
@ -1064,7 +1043,7 @@
var pub = f.is_public ? '公开' : '私密';
html += '<div class="fav-folder-card">'
+ '<div class="fav-folder-info">'
+ '<span class="fav-folder-name">' + esc(f.name) + isDefault + '</span>'
+ '<span class="fav-folder-name">' + escapeHtml(f.name) + isDefault + '</span>'
+ '<span class="fav-folder-meta">' + (f.item_count || 0) + ' 篇文章 · ' + pub + '</span>'
+ '</div>'
+ '<div class="fav-folder-actions">'