更新 worker.js

增加一键导出/导入功能
This commit is contained in:
2026-02-24 13:37:07 +08:00
parent a077e29c84
commit dce0c0acf1

View File

@@ -1452,7 +1452,18 @@ async function toggleCategoryState(categoryIndex) {
<span class="iconify" data-icon="mdi:newspaper" data-width="16px" data-height="16px"></span> <span class="iconify" data-icon="mdi:newspaper" data-width="16px" data-height="16px"></span>
新闻 新闻
</button> </button>
<!-- 导出按钮 -->
<button onclick="exportData()" style="background-color: #17a2b8; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; display: flex; align-items: center; gap: 5px; white-space: nowrap;">
<span class="iconify" data-icon="mdi:export" data-width="16px" data-height="16px"></span>
导出
</button>
<!-- 导入按钮(触发隐藏 file input -->
<button onclick="document.getElementById('importFile').click()" style="background-color: #6c757d; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; display: flex; align-items: center; gap: 5px; white-space: nowrap;">
<span class="iconify" data-icon="mdi:import" data-width="16px" data-height="16px"></span>
导入
</button>
<input type="file" id="importFile" accept=".json,application/json" style="display: none;" onchange="importData(this.files[0])">
<button onclick="location.href='/login.html'" style="background-color: #007BFF; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; display: flex; align-items: center; gap: 5px; white-space: nowrap;"> <button onclick="location.href='/login.html'" style="background-color: #007BFF; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; display: flex; align-items: center; gap: 5px; white-space: nowrap;">
<span class="iconify" data-icon="mdi:logout" data-width="16px" data-height="16px"></span> <span class="iconify" data-icon="mdi:logout" data-width="16px" data-height="16px"></span>
退出 退出
@@ -1653,32 +1664,32 @@ async function toggleCategoryState(categoryIndex) {
document.getElementById('editCategoryModal').style.display = "flex"; document.getElementById('editCategoryModal').style.display = "flex";
} }
// 添加编辑分类表单提交事件 // 添加编辑分类表单提交事件
document.getElementById('editCategoryForm')?.addEventListener('submit', async function(event) { document.getElementById('editCategoryForm')?.addEventListener('submit', async function(event) {
event.preventDefault(); event.preventDefault();
const formData = new FormData(event.target); const formData = new FormData(event.target);
const data = { const data = {
categoryIndex: parseInt(formData.get('categoryIndex')), categoryIndex: parseInt(formData.get('categoryIndex')),
newName: formData.get('categoryName') newName: formData.get('categoryName')
}; };
const response = await fetch('/edit-category', { const response = await fetch('/edit-category', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data) body: JSON.stringify(data)
}); });
if (response.ok) { if (response.ok) {
closeModal('editCategoryModal'); closeModal('editCategoryModal');
// 更新分类名称显示 // 更新分类名称显示
const categoryNameElement = document.getElementById(\`category-name-\${data.categoryIndex}\`); const categoryNameElement = document.getElementById(\`category-name-\${data.categoryIndex}\`);
if (categoryNameElement) { if (categoryNameElement) {
categoryNameElement.textContent = data.newName; categoryNameElement.textContent = data.newName;
} }
} else { } else {
const error = await response.json(); const error = await response.json();
alert(error.error || '修改失败'); alert(error.error || '修改失败');
} }
}); });
// 绑定确认对话框按钮事件 // 绑定确认对话框按钮事件
document.getElementById('confirmOk').addEventListener('click', function() { document.getElementById('confirmOk').addEventListener('click', function() {
@@ -2022,7 +2033,32 @@ document.getElementById('editCategoryForm')?.addEventListener('submit', async fu
} }
} }
} }
// 导出数据
async function exportData() {
// 直接跳转到导出接口,浏览器会自动下载
window.location.href = '/export';
}
// 导入数据
async function importData(file) {
if (!file) return;
const formData = new FormData();
formData.append('file', file);
const response = await fetch('/import', {
method: 'POST',
body: formData,
});
const result = await response.json();
if (response.ok) {
alert('导入成功,页面即将刷新');
location.reload();
} else {
alert('导入失败:' + (result.error || '未知错误'));
}
}
// 高亮文本函数 // 高亮文本函数
function highlightText(element, term) { function highlightText(element, term) {
const text = element.textContent; const text = element.textContent;
@@ -2033,9 +2069,9 @@ document.getElementById('editCategoryForm')?.addEventListener('submit', async fu
} }
// 转义正则表达式特殊字符 // 转义正则表达式特殊字符
function escapeRegExp(string) { function escapeRegExp(string) {
return string.replace(/[.*+?^$()|[\]\\]/g, '\\$&'); return string.replace(/[.*+?^$()|[\]\\]/g, '\\$&');
} }
// 初始化 // 初始化
window.addEventListener('load', async function() { window.addEventListener('load', async function() {