php+mongodb+vue实现注册登录多用户笔记系统代码

代码语言:php

所属分类:其他

代码描述:php+mongodb+vue实现注册登录多用户笔记系统代码

代码标签: php mongodb vue 注册 登录 多用户 笔记 系统 代码

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

<?php
// ##################################################################
// # 错误与异常日志记录器(保存到单独文件)
// ##################################################################
function log_fatal_error() {
    $error = error_get_last();
    if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR])) {
        $message = "[" . date('c') . "] [FATAL] {$error['message']} in {$error['file']} on line {$error['line']}\n";
        $logFile = __DIR__ . '/mongo_ui_errors.log';
        error_log($message, 3, $logFile);
    }
}

function log_uncaught_exception($exception) {
    $message = "[" . date('c') . "] [EXCEPTION] " . $exception->getMessage() . " in " . $exception->getFile() . " on line " . $exception->getLine() . "\nStack trace:\n" . $exception->getTraceAsString() . "\n";
    $logFile = __DIR__ . '/mongo_ui_errors.log';
    error_log($message, 3, $logFile);
    // 在API请求中,返回JSON错误;否则显示HTML错误
    if (!empty($_REQUEST['action'])) {
        json_response(['success' => false, 'message' => '系统发生内部错误,请联系管理员'], 500);
    } else {
        http_response_code(500);
        echo "<h2>系统发生内部错误,请查看日志。</h2>";
    }
    exit;
}

// **修复 1:激活错误与异常处理器**
register_shutdown_function('log_fatal_error');
set_exception_handler('log_uncaught_exception');

// **修复 2:更安全的 Session 启动**
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// --- 安全设置 ---
define('DB_USER', ''); // 数据库账号
define('DB_PWD', ''); // 数据库密码
define('DB_NAME', ''); //

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

function handle_api() {
    $action = $_REQUEST['action'];
    // **修复 3:将 'me' 添加到需要认证的操作列表**
    $authActions = ['list', 'get', 'save', 'delete', 'search', 'me', 'change_password'];
    $userActions = ['register', 'login', 'logout'];

    if (in_array($action, $userActions)) {
        try {
            call_user_func("api_$action");
        } catch (Exception $e) {
            json_response(['success' => false, 'message' => $e->getMessage()], 400); // 通常是客户端输入错误
        }
        return;
    }

    // 需要登录的操作
    if (!isset($_SESSION['user_id'])) {
        json_response(['success' => false, 'message' => '未登录或会话已过期'], 401);
    }

    if (!in_array($action, $authActions)) {
        json_response(['success' => false, 'message' => '无效操作'], 400);
    }

    try {
        call_user_func("api_$action");
    } catch (Exception $e) {
        json_response(['success' => false, 'message' => $e->getMessage()], 500); // 通常是服务器端错误
    }
}

function get_manager() {
    $dsn = "mongodb://";
    if (DB_USER && DB_PWD) {
        $dsn .= DB_USER . ':' . DB_PWD . '@';
    }
    $dsn .= "127.0.0.1:27017/" . DB_NAME;
    try {
        return new MongoDB\Driver\Manager($dsn);
    } catch (MongoDB\Driver\Exception\Exception $e) {
        throw new Exception("数据库连接失败: " . $e->getMessage());
    }
}

function json_response($data, $code = 200) {
    http_response_code($code);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit;
}

function format_note_document($doc) {
    if (!$doc) return null;

    $arr = json_decode(json_encode($doc), true);

    $arr['id'] = (string)($doc->_id ?? '');
    if (isset($doc->createdAt)) {
        $arr['createdAt'] = date('c', $doc->createdAt->toDateTime()->getTimestamp());
    }
    if (isset($doc->updatedAt)) {
        $arr['updatedAt'] = date('c', $doc->updatedAt->toDateTime()->getTimestamp());
    }
    unset($arr['_id'], $arr['userId']);
    return $arr;
}



// ================== 用户系统 ==================

// **修复 3:新增 api_me 函数**
function api_me() {
    if (isset($_SESSION['user_id'])) {
        json_response([
            'success' => true,
            'data' => [
                'id' => $_SESSION['user_id'],
                'username' => $_SESSION['username']
            ]
        ]);
    } else {
        json_response(['success' => false, 'message' => '未登录'], 401);
    }
}

function api_register() {
    $input = json_decode(file_get_contents('php://input'), true);
    $username = trim($input['username'] ?? '');
    $password = $input['password'] ?? '';

    if (!$username || !$password) {
        throw new Exception('用户名和密码不能为空');
    }
    if (strlen($password) < 6) {
        throw new Exception('密码至少6位');
    }

    $manager = get_manager();
    $query = new MongoDB\Driver\Query(['username' => $username]);
    $cursor = $manager->executeQuery(DB_NAME . '.users', $query);
    if (count($cursor->toArray()) > 0) {
        throw new Exception('用户名已存在');
    }

    $bulk = new MongoDB\Driver\BulkWrite();
    $bulk->insert([
        'username' => $username,
        'password' => password_has.........完整代码请登录后点击上方下载按钮下载查看

网友评论0