Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

140 lines
3.9 KiB
JavaScript

/**
* M-PALACE · 存档读档逻辑
* 列出存档、读取存档、删除存档
*/
(function () {
'use strict';
var API_BASE = window.location.origin;
function init() {
loadSaveList();
bindEvents();
}
// ---------- Load Save List ----------
function loadSaveList() {
var container = document.getElementById('save-list');
fetch(API_BASE + '/api/palace/save/list')
.then(function (r) { return r.json(); })
.then(function (data) {
if (data.error) {
container.innerHTML = '<div class="empty-state">获取存档列表失败</div>';
return;
}
renderSaveList(data.saves || []);
})
.catch(function () {
container.innerHTML = '<div class="empty-state">无法连接服务器</div>';
});
}
function renderSaveList(saves) {
var container = document.getElementById('save-list');
if (saves.length === 0) {
container.innerHTML = '<div class="empty-state">暂无存档</div>';
return;
}
container.innerHTML = '';
saves.forEach(function (save) {
var item = document.createElement('div');
item.className = 'save-item fade-in';
var info = document.createElement('div');
info.className = 'save-info';
var idEl = document.createElement('div');
idEl.className = 'save-id';
idEl.textContent = save.save_id;
var detail = document.createElement('div');
detail.className = 'save-detail';
var parts = [];
if (save.dynasty) parts.push(save.dynasty);
if (save.role) parts.push(save.role);
if (save.chapter) parts.push('第' + save.chapter + '章');
if (save.created_at) parts.push(save.created_at.slice(0, 16).replace('T', ' '));
detail.textContent = parts.join(' · ');
info.appendChild(idEl);
info.appendChild(detail);
var actions = document.createElement('div');
actions.className = 'save-actions';
var loadBtn = document.createElement('button');
loadBtn.className = 'btn btn-small';
loadBtn.textContent = '读档';
loadBtn.addEventListener('click', function () {
doLoad(save.save_id);
});
actions.appendChild(loadBtn);
item.appendChild(info);
item.appendChild(actions);
container.appendChild(item);
});
}
// ---------- Load Save ----------
function doLoad(saveId) {
fetch(API_BASE + '/api/palace/save/load', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ save_id: saveId })
})
.then(function (r) { return r.json(); })
.then(function (data) {
if (data.error) {
showToast(data.message || '读档失败');
return;
}
sessionStorage.setItem('palace_save_id', saveId);
sessionStorage.setItem('palace_loaded', JSON.stringify(data));
window.location.href = 'game.html';
})
.catch(function (err) {
showToast('网络错误:' + err.message);
});
}
// ---------- Events ----------
function bindEvents() {
document.getElementById('btn-load').addEventListener('click', function () {
var id = document.getElementById('load-id').value.trim();
if (!id) { showToast('请输入存档编号'); return; }
doLoad(id);
});
document.getElementById('load-id').addEventListener('keydown', function (e) {
if (e.key === 'Enter') {
var id = this.value.trim();
if (id) doLoad(id);
}
});
}
// ---------- Utilities ----------
function showToast(msg) {
var old = document.querySelector('.toast');
if (old) old.remove();
var el = document.createElement('div');
el.className = 'toast';
el.textContent = msg;
document.body.appendChild(el);
setTimeout(function () { if (el.parentNode) el.remove(); }, 3000);
}
// ---------- Boot ----------
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();