Compare commits

...

2 Commits

Author SHA1 Message Date
4642a278a5 feat: 首页添加导出按钮,一键导出JSON格式 2026-04-13 16:10:27 +08:00
598a86b32d docs: 更新版本历史 2026-04-13 16:01:20 +08:00
2 changed files with 27 additions and 0 deletions

View File

@@ -136,6 +136,7 @@ xian-favor/
## 版本历史
- v1.3.2 (2026-04-13): 编辑和添加模态框改为大尺寸(modal-lg)
- v1.3.1 (2026-04-13): 备注改名为详情,支持换行显示,扩大输入框
- v1.3.0 (2026-04-13): 标签管理功能和输入自动提示
- 侧边栏新增"标签管理"入口

View File

@@ -246,6 +246,9 @@ INDEX_TEMPLATE = '''
<option value="todo">待办</option>
</select>
</div>
<button class="btn btn-outline-success me-2" onclick="exportData()" title="导出JSON">
<i class="bi bi-download"></i> 导出
</button>
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addModal">
<i class="bi bi-plus-lg"></i> 添加
</button>
@@ -948,6 +951,29 @@ async function deleteTagManager(id, name) {
loadItems();
}
// 导出数据
async function exportData() {
const res = await fetch(`${API_BASE}/items?limit=1000`);
const data = await res.json();
if (!data.success) {
alert('导出失败');
return;
}
// 格式化JSON
const jsonStr = JSON.stringify(data.data, null, 2);
// 创建下载
const blob = new Blob([jsonStr], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `xian_favor_export_${new Date().toISOString().slice(0,10)}.json`;
a.click();
URL.revokeObjectURL(url);
}
function debounce(fn, delay) {
let timer;
return function(...args) {