refactor: 拆分 config.php 为 lib/ 模块,消除页面层重复代码
纯结构性重构,不改变任何功能。 - config.php 由 739 行缩减为 42 行,改为纯引导入口;新增 ROOT_DIR 常量 统一拼接绝对路径(lib/ 内模块的 __DIR__ 会指向 lib/,必须替换) - 新增 lib/ 五个模块 db.php / helpers.php / auth.php / movies.php / stats.php, 由 config.php 按 db → helpers → auth → movies → stats 顺序加载 - add.php、edit.php 各自约 80 行重复的 POST 处理改为调用 resolveCinemaId / resolvePersonIds / linkViewers / uploadImageFile / saveBase64Image / uploadMultiplePhotos / deleteStoredFile - cinemas.php、persons.php 中重复 4 次的颜色校验改用 normalizeHexColor() - toggleNewViewer / removeViewerRow / toggleNewCinema 下沉至 js/main.js, add.php 中的 removeViewer 统一更名为 removeViewerRow - 删除死代码:imageUrl()(全项目无调用);cinemas.php 配色数组中本就会被 array_slice 丢弃的 extra 颜色逻辑,简化为单条扁平 50 元素数组 - README 目录结构补充 lib/ 说明 验证方式:以便携 PHP 8.4 搭建 A/B 回归环境,播种固定数据后遍历 47 个 GET/POST 端点录制「状态码 + 响应体」。重构前后 42 个逐字节相同、2 个仅 上传文件名时间戳不同、3 个差异均为内联脚本下沉(已单独校验函数体逐字符 等价,剥离脚本后 HTML 标记完全一致)。24 个 PHP 文件语法检查全部通过。
This commit is contained in:
+126
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
// ============================================
|
||||
// 文件: lib/db.php
|
||||
// 说明: 数据库连接与初始化(建表 / 字段迁移 / 历史数据迁移 / 默认管理员)
|
||||
// ============================================
|
||||
|
||||
// 数据库连接
|
||||
function getDB() {
|
||||
try {
|
||||
$db = new PDO('sqlite:' . DB_PATH);
|
||||
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
|
||||
return $db;
|
||||
} catch (PDOException $e) {
|
||||
die('数据库连接失败: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化数据库
|
||||
function initDB() {
|
||||
$db = getDB();
|
||||
|
||||
// 管理员表
|
||||
$db->exec("
|
||||
CREATE TABLE IF NOT EXISTS admins (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT UNIQUE NOT NULL,
|
||||
password TEXT NOT NULL,
|
||||
avatar TEXT
|
||||
)
|
||||
");
|
||||
|
||||
// 电影院表
|
||||
$db->exec("
|
||||
CREATE TABLE IF NOT EXISTS cinemas (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
place TEXT NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
address TEXT,
|
||||
color TEXT DEFAULT '#888888'
|
||||
)
|
||||
");
|
||||
|
||||
// 电影表
|
||||
$db->exec("
|
||||
CREATE TABLE IF NOT EXISTS movies (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
title TEXT NOT NULL,
|
||||
info TEXT,
|
||||
remark TEXT,
|
||||
poster_path TEXT,
|
||||
ticket_path TEXT,
|
||||
photo_path TEXT,
|
||||
cinema_id INTEGER,
|
||||
watch_date DATE,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (cinema_id) REFERENCES cinemas(id) ON DELETE SET NULL
|
||||
)
|
||||
");
|
||||
|
||||
// 观影人表
|
||||
$db->exec("
|
||||
CREATE TABLE IF NOT EXISTS persons (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
color TEXT DEFAULT '#888888',
|
||||
avatar TEXT
|
||||
)
|
||||
");
|
||||
|
||||
// 观影关联表
|
||||
$db->exec("
|
||||
CREATE TABLE IF NOT EXISTS viewers (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
movie_id INTEGER NOT NULL,
|
||||
name TEXT,
|
||||
person_id INTEGER,
|
||||
FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (person_id) REFERENCES persons(id) ON DELETE SET NULL
|
||||
)
|
||||
");
|
||||
|
||||
// 多照片表
|
||||
$db->exec("
|
||||
CREATE TABLE IF NOT EXISTS movie_photos (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
movie_id INTEGER NOT NULL,
|
||||
photo_path TEXT NOT NULL,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE
|
||||
)
|
||||
");
|
||||
|
||||
// ===== 迁移字段 =====
|
||||
try { $db->exec("ALTER TABLE cinemas ADD COLUMN color TEXT DEFAULT '#888888'"); } catch (PDOException $e) {}
|
||||
try { $db->exec("ALTER TABLE admins ADD COLUMN avatar TEXT"); } catch (PDOException $e) {}
|
||||
try { $db->exec("ALTER TABLE persons ADD COLUMN avatar TEXT"); } catch (PDOException $e) {}
|
||||
try { $db->exec("ALTER TABLE movies ADD COLUMN remark TEXT"); } catch (PDOException $e) {}
|
||||
try { $db->exec("ALTER TABLE viewers ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {}
|
||||
// 新增:管理员关联观影人
|
||||
try { $db->exec("ALTER TABLE admins ADD COLUMN person_id INTEGER REFERENCES persons(id) ON DELETE SET NULL"); } catch (PDOException $e) {}
|
||||
|
||||
// ===== 迁移旧数据 =====
|
||||
// 将 viewers.name 迁移到 persons
|
||||
$stmt = $db->query("SELECT DISTINCT name FROM viewers WHERE name != '' AND name IS NOT NULL");
|
||||
$names = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
||||
foreach ($names as $name) {
|
||||
$chk = $db->prepare("SELECT id FROM persons WHERE name = ?");
|
||||
$chk->execute([$name]);
|
||||
if (!$chk->fetch()) {
|
||||
$ins = $db->prepare("INSERT INTO persons (name) VALUES (?)");
|
||||
$ins->execute([$name]);
|
||||
}
|
||||
}
|
||||
$update = $db->prepare("UPDATE viewers SET person_id = (SELECT id FROM persons WHERE persons.name = viewers.name) WHERE person_id IS NULL AND name IS NOT NULL");
|
||||
$update->execute();
|
||||
|
||||
// 默认管理员
|
||||
$stmt = $db->prepare("SELECT COUNT(*) FROM admins");
|
||||
$stmt->execute();
|
||||
if ($stmt->fetchColumn() == 0) {
|
||||
$hashed = password_hash('123456', PASSWORD_DEFAULT);
|
||||
$stmt = $db->prepare("INSERT INTO admins (username, password) VALUES (?, ?)");
|
||||
$stmt->execute(['admin', $hashed]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user