php实现可视化管理Mongodb数据库管理ui代码

代码语言:php

所属分类:其他

代码描述:php实现可视化管理Mongo数据库管理ui代码,可浏览Mongodb数据库集合,增删改查。

代码标签: php 可视化 管理 Mongo 数据库 管理 ui 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<?php
// ##################################################################
// # 单文件 MongoDB 可视化 UI 管理器

// # 版本: 1.0.0
// # 依赖: PHP >= 7.2, PHP MongoDB 驱动 (mongodb.so)
// ##################################################################

// --- 安全设置 ---
// 建议设置一个复杂的密码,或者留空以在每次访问时输入连接信息。
// 如果设置了密码,访问时需要 ?password=你的密码
define('LOGIN_PASSWORD', ''); // 例如: 'MySuperSecretPassword123'

// --- PHP 后端 API ---
@session_start();

// API 路由
if (isset($_REQUEST['action'])) {
    handle_api_request();
}

function handle_api_request() {
    // 检查登录密码(如果已设置)
    if (LOGIN_PASSWORD && (!isset($_GET['password']) || $_GET['password'] !== LOGIN_PASSWORD)) {
        if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
             json_response(['success' => false, 'message' => '身份验证失败: 密码错误'], 403);
        }
    } else {
        $_SESSION['logged_in'] = true;
    }
    
    // 如果是通过密码登录,后续请求无需密码
    if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) {
        // pass
    } else {
        json_response(['success' => false, 'message' => '需要身份验证'], 401);
    }


    $action = $_REQUEST['action'];
    $allowed_actions = [
        'connect', 'disconnect', 'check_status', 'get_server_stats', 
        'get_databases', 'get_collections', 'get_documents', 'get_document',
        'save_document', 'delete_document'
    ];

    if (!in_array($action, $allowed_actions)) {
        json_response(['success' => false, 'message' => '无效的操作'], 400);
    }
    
    try {
        call_user_func("api_{$action}");
    } catch (Exception $e) {
        json_response(['success' => false, 'message' => get_class($e) . ': ' . $e->getMessage()], 500);
    }
}

function json_response($data, $status_code = 200) {
    http_response_code($status_code);
    header('Content-Type: application/json; charset=utf-8');
    // 将 MongoDB 特殊类型转换为可读字符串
    $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    $json = preg_replace_callback('/{\s*"\$oid":\s*"([a-f0-9]{24})"\s*}/', function($m) {
        return '{"$oid": "' . $m[1] . '"}'; // 保持oid格式
    }, $json);
    echo $json;
    exit;
}

function get_manager() {
    if (!isset($_SESSION['mongo_config'])) {
        throw new Exception("未连接到 MongoDB. 请先在主页连接.");
    }
    
    $dbConfig = $_SESSION['mongo_config'];
    
    $dsn = 'mongodb://';
    if (!empty($dbConfig['user'])) {
        $user = urlencode($dbConfig['user']);
        $pass = urlencode($dbConfig['password']);
        $dsn .= "{$user}:{$pass}@";
    }
    $dsn .= "{$dbConfig['host']}:" . $dbConfig['port']."/".$dbConfig['user'];

    $options = [];
  

    // 增加连接超时设置
    return new MongoDB\Driver\Manager($dsn, $options);
}

function to_php_value($value) {
    if ($value instanceof MongoDB\BSON\ObjectId) {
        return (string) $value;
    }
    if ($value instanceof MongoDB\BSON\UTCDateTime) {
        return $value->toDateTime()->format('Y-m-d H:i:s.u');
    }
    if (is_array($value)) {
        foreach ($value as $k => $v) {
            $value[$k] = to_php_value($v);
        }
    }
    if (is_object($value)) {
        $props = get_object_vars($value);
        foreach ($props as $k => $v) {
            $props[$k] = to_php_value($v);
        }
        return $props;
    }
    return $value;
}

function bson_to_array($bson) {
    $arr = MongoDB\BSON\toJSON($bson);
    return json_decode($arr, true);
}


function string_to_bson_value($val) {
    if (is_string($val)) {
        if (preg_match('/^ObjectId\("([a-f0-9]{24})"\)$/i', trim($val), $matches)) {
            return new MongoDB\BSON\ObjectId($matches[1]);
        }
        // 可扩展支持其他BSON类型,如日期
    }
    return $val;
}

function prepare_document_for_save($doc) {
    array_walk_recursive($doc, function (&$value, $key) {
        $value = string_to_bson_value($value);
    });
    if (isset($doc['_id']) && is_string($doc['_id']) && strlen($doc['_id']) === 24 && ctype_xdigit($doc['_id'])) {
        $doc['_id'] = new MongoDB\BSON\ObjectId($doc['_id']);
    }
    return $doc;
}

// --- API 函数实现 ---

function api_connect() {
    $config = json_decode(file_get_contents('php://input'), true);
    $_SESSION['mongo_config'] = $config;
    try {
        $manager = get_manager();
        $command = new MongoDB\Driver\Command(['ping' => 1]);
        $manager->executeCommand('admin', $command);
        
        
        $_SESSION['connected'] = true;
        json_response(['success' => true, 'message' => '连接成功!']);
    } catch (Exception $e) {
        unset($_SESSION['mongo_config']);
        unset($_SESSION['connected']);
        throw new Exception("连接失败: " . $e->getMessage());
    }
}

function api_disconnect() {
    unset($_SESSION['mongo_config']);
    unset($_SESSION['connected']);
    session_destroy();
    json_response(['success' => true, 'message' => '已断开连接']);
}

function api_check_status() {
    if (isset($_SESSION['connected']) && $_SESSION['connected']) {
        json_response(['success' => true, 'connected' => true, 'config' => $_SESSION['mongo_config']]);
    } else {
        json_response(['success' => true, 'connected' => false]);
    }
}
function api_get_server_stats() {
    $manager = get_manager();
    try {
        $command = new MongoDB\Driver\Command(['serverStatus' => 1]);
        $cursor = $manager->executeCommand('admin', $command);
        $stats = $cursor->toArray()[0];
        json_response(['success' => true, 'data' => [
            'host' => $stats->host ?? 'N/A',
            'version' => $stats->version ?? 'N/A',
            'process' => $stats->process ?? 'N/A',
            'pid' => $stats->pid ?? 0,
            'uptime' => $stats->uptime ?? 0,
            'connections' => $stats->connections ?? (object)['current' => 0, 'available' => 0],
        ]]);
    } catch (Exception $e) {
        // 权限不足时返回空数据,避免 UI 崩溃
        json_response(['success' => true, 'data' => [
            'host' => 'N/A',
            'version' => 'N/A',
            'process' => 'N/A',
            'pid' => 0,
            'uptime' => 0,
            'connections' => (object)['current' => 0, 'available' => 0],
        ]]);
    }
}

function api_get_databases() {
    $manager = get_manager();
    $command = new MongoDB\Driver\Command(['listDatabases' => 1]);
    $cursor = $manager->executeCommand('admin', $command);
    $databases = $cursor->toArray()[0]->databases;
    json_response(['success' => true, 'data' => $databases]);
}

function api_get_collections() {
    $dbName = $_GET['db'];
    $manager = get_manager();
    $command = new MongoDB\Driver\Command(['listCollections' => 1]);
    $cursor = $manager->executeCommand($dbName, $command);
    $collections = $cursor->toArray();
    json_response(['success' => true, .........完整代码请登录后点击上方下载按钮下载查看

网友评论0