修复PHP改主校验流程:Java失败时PHP自动回退+前端不立即刷新

1. PHP handleUpdateLandOwner: 不再直接更新web_area_lands,写入pending队列,返回pending=true
2. PHP handleOwnerChangeCallback失败时:回退owner为旧值,记录日志
3. PHP admin.php adminTransferLand: 收到pending=true时不立即刷新列表,改为5秒后轮询
4. 按钮禁用防重复提交,等待回调后恢复
This commit is contained in:
ypsdf1
2026-06-29 16:38:31 +08:00
parent e9bd63a1e4
commit 5403479a2c
2 changed files with 24 additions and 4 deletions
+16 -1
View File
@@ -2439,20 +2439,35 @@ async function adminTransferLand(name, currentOwner) {
}
if (!await glassConfirm('确定将领地 [' + name + '] 改主为 [' + trimmed + '] ?\n(将写入待验证队列,等Java端确认后生效)')) return;
try {
const btn = event.target;
btn.disabled = true;
btn.textContent = '验证中...';
const res = await fetch('api/land_api.php?action=update_land_owner', {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: 'name=' + encodeURIComponent(name) + '&owner=' + encodeURIComponent(trimmed) + '&admin_token=' + (admToken||'')
});
const d = await res.json();
if (d.success) {
if (d.success && d.pending) {
glassAlert(d.message || '已提交改主请求,等待Java端验证');
btn.textContent = '改主';
btn.disabled = false;
// 不立即刷新列表,改为5秒后轮询检查更新
setTimeout(() => loadLands(document.getElementById('C')), 5000);
} else if (d.success) {
glassAlert(d.message || '改主成功');
btn.textContent = '改主';
btn.disabled = false;
loadLands(document.getElementById('C'));
} else {
glassAlert('失败: ' + (d.error || ''));
btn.textContent = '改主';
btn.disabled = false;
}
} catch(e) {
glassAlert('请求失败: ' + e.message);
const btn = event.target;
if (btn) { btn.textContent = '改主'; btn.disabled = false; }
}
}
+8 -3
View File
@@ -2203,10 +2203,15 @@ function handleOwnerChangeCallback($db, $post) {
debugLog("handleOwnerChangeCallback: 改主 {$targetName} {$oldOwner}→{$newOwner} Java验证通过,已更新PHP副本");
echo json_encode(['success' => true, 'message' => '改主验证通过,已更新']);
} else {
// ★ Java验证失败
// ★ Java验证失败:更新PHP副本为原始所有者(回退)+ 标记失败
$stmtRb = $db->prepare("UPDATE web_area_lands SET owner = :old_owner WHERE name = :name");
$stmtRb->bindValue(':old_owner', $oldOwner, SQLITE3_TEXT);
$stmtRb->bindValue(':name', $targetName, SQLITE3_TEXT);
$stmtRb->execute();
$db->query("UPDATE web_admin_changes SET status = 'failed', acknowledged = 1, acked_at = " . time() . " WHERE id = " . $changeId);
debugLog("handleOwnerChangeCallback: 改主 {$targetName} {$oldOwner}→{$newOwner} Java验证失败: {$reason}");
echo json_encode(['success' => true, 'message' => "改主验证失败: {$reason}"]);
debugLog("handleOwnerChangeCallback: 改主 {$targetName} {$oldOwner}→{$newOwner} Java验证失败: {$reason},已回退为{$oldOwner}");
echo json_encode(['success' => true, 'message' => "改主验证失败: {$reason},已回退"]);
}
}