PHP 前后端一体:首页咨询师列表、预约表单、管理后台、二维码准入与邮件通知;敏感配置与提交数据通过 .gitignore 排除。 Co-authored-by: Cursor <cursoragent@cursor.com>
130 lines
3.9 KiB
PHP
130 lines
3.9 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
require __DIR__ . '/bootstrap.php';
|
|
require __DIR__ . '/mailer.php';
|
|
|
|
function requireDebugAccess(): void
|
|
{
|
|
$token = trim((string) ($_GET['access'] ?? $_POST['access'] ?? ''));
|
|
$config = loadAppConfig();
|
|
if ($token === '' || $token !== ($config['accessToken'] ?? '')) {
|
|
jsonError('无权访问,请在 URL 中携带 ?access=访问令牌', 403);
|
|
}
|
|
}
|
|
|
|
function checkWritableDir(string $dir): array
|
|
{
|
|
if (!is_dir($dir)) {
|
|
return ['ok' => false, 'message' => '目录不存在'];
|
|
}
|
|
if (!is_writable($dir)) {
|
|
return ['ok' => false, 'message' => '目录不可写,请检查权限'];
|
|
}
|
|
$testFile = $dir . '/.write_test_' . uniqid();
|
|
$written = @file_put_contents($testFile, 'ok');
|
|
if ($written === false) {
|
|
return ['ok' => false, 'message' => '无法写入测试文件'];
|
|
}
|
|
@unlink($testFile);
|
|
return ['ok' => true, 'message' => '可写'];
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
|
requireDebugAccess();
|
|
|
|
$dataDir = checkWritableDir(DATA_DIR);
|
|
$submissions = readSubmissions();
|
|
$mailConfig = loadMailConfig();
|
|
$recipients = getMailRecipients($mailConfig);
|
|
|
|
jsonResponse([
|
|
'ok' => true,
|
|
'time' => date('Y-m-d H:i:s'),
|
|
'phpVersion' => PHP_VERSION,
|
|
'assetVersion' => getAssetVersion(),
|
|
'extensions' => [
|
|
'json' => extension_loaded('json'),
|
|
'openssl' => extension_loaded('openssl'),
|
|
'session' => extension_loaded('session'),
|
|
],
|
|
'paths' => [
|
|
'root' => ROOT_DIR,
|
|
'dataDir' => DATA_DIR,
|
|
'submissionsFile' => SUBMISSIONS_FILE,
|
|
'mailConfig' => MAIL_CONFIG_FILE,
|
|
],
|
|
'dataDir' => $dataDir,
|
|
'submissions' => [
|
|
'count' => count($submissions),
|
|
'fileExists' => is_file(SUBMISSIONS_FILE),
|
|
'last' => $submissions !== [] ? end($submissions) : null,
|
|
],
|
|
'mail' => [
|
|
'enabled' => !empty($mailConfig['enabled']),
|
|
'recipientCount' => count($recipients),
|
|
'recipients' => $recipients,
|
|
'smtpHost' => $mailConfig['smtp']['host'] ?? '',
|
|
],
|
|
'apiUrls' => [
|
|
'config' => 'api/config.php',
|
|
'doctors' => 'api/doctors.php',
|
|
'submit' => 'api/submit.php',
|
|
'diagnostics' => 'api/diagnostics.php',
|
|
],
|
|
]);
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
jsonError('方法不允许', 405);
|
|
}
|
|
|
|
requireDebugAccess();
|
|
|
|
$action = trim((string) ($_GET['action'] ?? 'submit'));
|
|
|
|
if ($action === 'mail') {
|
|
$submissions = readSubmissions();
|
|
if ($submissions === []) {
|
|
jsonError('暂无提交记录,无法测试邮件');
|
|
}
|
|
$sent = sendSubmissionMail($submissions);
|
|
if (!$sent) {
|
|
jsonError('邮件发送失败,请查看服务器 PHP 错误日志', 500);
|
|
}
|
|
jsonResponse(['ok' => true, 'message' => '测试邮件已发送', 'count' => count($submissions)]);
|
|
}
|
|
|
|
if ($action === 'submit') {
|
|
$suffix = date('His');
|
|
$record = [
|
|
'id' => uniqid('debug_', true),
|
|
'createdAt' => date('c'),
|
|
'doctorId' => 'song',
|
|
'doctorName' => '宋崇升',
|
|
'nickname' => '调试用户' . $suffix,
|
|
'gender' => '男',
|
|
'contact' => '1380013' . str_pad((string) random_int(0, 9999), 4, '0', STR_PAD_LEFT),
|
|
'description' => '这是一条调试提交 ' . date('Y-m-d H:i:s'),
|
|
];
|
|
|
|
$submissions = readSubmissions();
|
|
$submissions[] = $record;
|
|
|
|
if (!saveSubmissions($submissions)) {
|
|
jsonError(getSaveSubmissionsError(), 500);
|
|
}
|
|
|
|
$mailSent = sendSubmissionMail($submissions);
|
|
|
|
jsonResponse([
|
|
'ok' => true,
|
|
'message' => '调试提交成功',
|
|
'record' => $record,
|
|
'total' => count($submissions),
|
|
'mailSent' => $mailSent,
|
|
]);
|
|
}
|
|
|
|
jsonError('未知操作');
|