feat: 领地删除走pending队列 + sync清理PHP残留

- land_api: handleDeleteLand改为写web_admin_changes队列
- land_api: 新增delete_land_callback处理Java回调
- sync.php: syncLands增加删除PHP中不存在的领地
- 修复admin面板过户按钮(同步到plugin目录)
This commit is contained in:
ypsdf1
2026-06-29 20:45:38 +08:00
parent 62798f2a90
commit 3dacc80fe1
2 changed files with 87 additions and 5 deletions
+60 -4
View File
@@ -102,7 +102,7 @@ try {
// ★ 成员独立权限操作action(领地所有者编辑成员权限)
$memberPermActions = ['get_member_perms', 'update_member_perm', 'clear_member_perm'];
// ★ Java端轮询PHP管理员变更 + Java回调过户结果
$syncFromPhpActions = ['poll_admin_changes', 'ack_admin_changes', 'transfer_callback', 'owner_change_callback'];
$syncFromPhpActions = ['poll_admin_changes', 'ack_admin_changes', 'transfer_callback', 'owner_change_callback', 'delete_land_callback'];
if (in_array($action, $syncActions) || in_array($action, $syncFromPhpActions)) {
// 同步类:必须有secret
@@ -361,6 +361,10 @@ try {
handleOwnerChangeCallback($db, $_POST + $_GET);
break;
case 'delete_land_callback':
handleDeleteLandCallback($db, $_GET);
break;
// ===== 用户组管理 =====
case 'list_user_groups':
handleListUserGroups($db);
@@ -785,11 +789,36 @@ function handleDeleteLand($db, $post) {
return;
}
$stmt = $db->prepare("DELETE FROM web_area_lands WHERE name = :name");
// ★ 查询领地信息
$stmt = $db->prepare("SELECT id, owner FROM web_area_lands WHERE name = :name");
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->execute();
$result = $stmt->execute();
$row = $result->fetchArray(SQLITE3_ASSOC);
if (!$row) {
echo json_encode(['success' => false, 'error' => '领地不存在']);
return;
}
$landId = (int)$row['id'];
echo json_encode(['success' => true]);
// ★ 检查是否已有pending的land_delete(防止重复提交)
$stmtCheck = $db->prepare("SELECT id FROM web_admin_changes WHERE change_type = 'land_delete' AND target_name = :name AND status = 'pending'");
$stmtCheck->bindValue(':name', $name, SQLITE3_TEXT);
$checkResult = $stmtCheck->execute();
if ($checkResult->fetchArray(SQLITE3_ASSOC)) {
echo json_encode(['success' => false, 'error' => '该领地已有待验证的删除请求,请等待Java端处理']);
return;
}
// ★ 不再直接删除PHP本地副本!写入web_admin_changes让Java端验证后执行
$stmt4 = $db->prepare("INSERT INTO web_admin_changes (change_type, target_id, target_name, change_data, created_at, status) VALUES ('land_delete', :id, :name, :data, :now, 'pending')");
$stmt4->bindValue(':id', $landId, SQLITE3_INTEGER);
$stmt4->bindValue(':name', $name, SQLITE3_TEXT);
$stmt4->bindValue(':data', json_encode(['source' => 'admin_panel']), SQLITE3_TEXT);
$stmt4->bindValue(':now', time(), SQLITE3_INTEGER);
$stmt4->execute();
debugLog("handleDeleteLand: 管理面板删除领地 {$name} (已写入pending队列,等待Java验证)");
echo json_encode(['success' => true, 'pending' => true, 'message' => "删除请求已提交: [{$name}],等待Java端验证后生效"]);
}
function handleUpdateLandOwner($db, $post) {
@@ -2269,6 +2298,33 @@ function handleOwnerChangeCallback($db, $post) {
}
}
/**
* Java端删除领地回调:删除PHP本地副本 + 标记admin_change完成
*/
function handleDeleteLandCallback($db, $get) {
$name = $get['name'] ?? '';
$success = ($get['success'] ?? '') === 'true';
if (empty($name)) {
echo json_encode(['success' => false, 'error' => '缺少name参数']);
return;
}
// 删除PHP本地副本
$stmt = $db->prepare("DELETE FROM web_area_lands WHERE name = :name");
$stmt->bindValue(':name', $name, SQLITE3_TEXT);
$stmt->execute();
// 标记对应的admin_change为completed
$stmtUpd = $db->prepare("UPDATE web_admin_changes SET status = 'completed', acknowledged = 1, acked_at = :now WHERE change_type = 'land_delete' AND target_name = :name AND status = 'pending'");
$stmtUpd->bindValue(':now', time(), SQLITE3_INTEGER);
$stmtUpd->bindValue(':name', $name, SQLITE3_TEXT);
$stmtUpd->execute();
debugLog("handleDeleteLandCallback: 删除领地 {$name} Java端处理成功,已删除PHP副本");
echo json_encode(['success' => true, 'message' => "领地 [{$name}] 已删除"]);
}
/**
* 查询过户状态
*/