Initial commit: 心理咨询预约系统

PHP 前后端一体:首页咨询师列表、预约表单、管理后台、二维码准入与邮件通知;敏感配置与提交数据通过 .gitignore 排除。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
litianming
2026-06-04 10:17:09 +08:00
commit 08ce60344d
49 changed files with 3490 additions and 0 deletions

129
api/diagnostics.php Normal file
View File

@@ -0,0 +1,129 @@
<?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('未知操作');