用户功能设置收口与废弃后台链路清理

This commit is contained in:
2026-08-23 22:09:12 +08:00
parent 081eb0870d
commit 86692ff3f9
59 changed files with 506 additions and 1767 deletions
-135
View File
@@ -17,34 +17,6 @@ class ToolsController extends ControllerBase {
}
public function register_routes(): void {
// Email rollback: list users with recent email changes
register_rest_route(self::API_NAMESPACE, '/email-rollback/users', [
'methods' => 'GET',
'callback' => [$this, 'rest_email_rollback_list'],
'permission_callback' => [$this, 'check_permission'],
]);
// Email rollback: execute rollback
register_rest_route(self::API_NAMESPACE, '/email-rollback/users/(?P<id>\d+)/rollback', [
'methods' => 'POST',
'callback' => [$this, 'rest_email_rollback_execute'],
'permission_callback' => [$this, 'check_permission'],
]);
// Tools: system health (compact format for ExtensionTools.vue)
register_rest_route(self::API_NAMESPACE, '/tools/health', [
'methods' => 'GET',
'callback' => [$this, 'get_tools_health'],
'permission_callback' => [$this, 'check_permission'],
]);
// Tools: maintenance actions
register_rest_route(self::API_NAMESPACE, '/tools/maintenance', [
'methods' => 'POST',
'callback' => [$this, 'run_maintenance'],
'permission_callback' => [$this, 'check_permission'],
]);
// Tools: update center
register_rest_route(self::API_NAMESPACE, '/tools/update-info', [
'methods' => 'GET',
@@ -65,85 +37,6 @@ class ToolsController extends ControllerBase {
]);
}
/**
* GET /tools/health — compact health data for the tools page.
*/
public function get_tools_health(): \WP_REST_Response {
global $wpdb;
$upload_dir = wp_upload_dir();
$upload_ok = !empty($upload_dir['error']) === false && is_dir($upload_dir['basedir']);
$db_ok = true;
$db_status = '正常';
$expected_tables = [
$wpdb->prefix . 'aksrt_credit_log',
$wpdb->prefix . 'aksrt_signin_log',
$wpdb->prefix . 'aksrt_dl_token',
$wpdb->prefix . 'aksrt_notification',
];
$missing = [];
foreach ($expected_tables as $table) {
if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $table)) !== $table) {
$missing[] = str_replace($wpdb->prefix, '', $table);
}
}
if (!empty($missing)) {
$db_ok = false;
$db_status = '缺少: ' . implode(', ', $missing);
}
return $this->success([
'data' => [
'php_version' => PHP_VERSION,
'wp_version' => get_bloginfo('version'),
'db_status' => $db_status,
'db_ok' => $db_ok,
'upload_dir' => $upload_dir['basedir'],
'upload_ok' => $upload_ok,
'theme_version' => wp_get_theme()->get('Version') ?? 'unknown',
],
]);
}
/**
* POST /tools/maintenance — run a maintenance action.
*/
public function run_maintenance(\WP_REST_Request $request): \WP_REST_Response {
$params = $this->get_json_params($request);
$action = sanitize_key((string) ($params['action'] ?? ''));
switch ($action) {
case 'flush_cache':
// Flush WordPress object cache
wp_cache_flush();
// Clear transients
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_aksrt_%' OR option_name LIKE '_transient_timeout_aksrt_%'");
return $this->success(['message' => __('缓存已清除', 'aksrt')]);
case 'optimize_db':
global $wpdb;
$tables = [
$wpdb->prefix . 'aksrt_credit_log',
$wpdb->prefix . 'aksrt_signin_log',
$wpdb->prefix . 'aksrt_dl_token',
$wpdb->prefix . 'aksrt_notification',
];
$optimized = 0;
foreach ($tables as $table) {
if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $table)) === $table) {
$wpdb->query("OPTIMIZE TABLE {$table}");
$optimized++;
}
}
return $this->success(['message' => sprintf(__('已优化 %d 个数据表', 'aksrt'), $optimized)]);
default:
return $this->error('未知的维护操作: ' . esc_html($action));
}
}
public function get_update_info(): \WP_REST_Response {
$theme = wp_get_theme();
$info = [
@@ -199,32 +92,4 @@ class ToolsController extends ControllerBase {
]);
}
public function rest_email_rollback_list(\WP_REST_Request $request): \WP_REST_Response {
if (!class_exists('\AKSRT\Auth\EmailRollback')) {
return $this->success(['data' => ['items' => [], 'total' => 0, 'page' => 1, 'per_page' => 20]]);
}
$page = max(1, (int) $request->get_param('page'));
$per_page = min(100, max(1, (int) $request->get_param('per_page')));
$data = \AKSRT\Auth\EmailRollback::list_pending($page, $per_page);
return $this->success(['data' => $data]);
}
public function rest_email_rollback_execute(\WP_REST_Request $request): \WP_REST_Response {
if (!class_exists('\AKSRT\Auth\EmailRollback')) {
return $this->error(__('邮箱回滚功能不可用', 'aksrt'), 500);
}
$user_id = (int) $request->get_param('id');
$result = \AKSRT\Auth\EmailRollback::rollback($user_id, get_current_user_id());
if (empty($result['success'])) {
return $this->error((string) ($result['error'] ?? __('邮箱回滚失败', 'aksrt')), 422);
}
return $this->success([
'message' => (string) ($result['message'] ?? __('邮箱已回滚', 'aksrt')),
'data' => $result,
]);
}
}