Files
jinniu-daikuan/app/db.php
T
梁铭洋 97fea48393 Initial commit: 金牛集团贷款档案管理系统
导入现有代码与文档,排除 data/uploads 运行时数据。
2026-08-29 11:52:22 +08:00

111 lines
3.5 KiB
PHP
Executable File

<?php
declare(strict_types=1);
require_once __DIR__ . '/config.php';
function db(): PDO
{
static $pdo = null;
if ($pdo instanceof PDO) {
return $pdo;
}
$pdo = new PDO('sqlite:' . DB_PATH);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->exec('PRAGMA foreign_keys = ON');
initSchema($pdo);
seedAdmin($pdo);
return $pdo;
}
function initSchema(PDO $pdo): void
{
$pdo->exec("
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
role TEXT NOT NULL CHECK(role IN ('admin','user')),
created_at TEXT NOT NULL
);
");
$pdo->exec("
CREATE TABLE IF NOT EXISTS directories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
parent_id INTEGER NULL,
level INTEGER NOT NULL CHECK(level BETWEEN 1 AND 3),
created_at TEXT NOT NULL,
FOREIGN KEY(parent_id) REFERENCES directories(id) ON DELETE CASCADE
);
");
$pdo->exec("
CREATE TABLE IF NOT EXISTS archives (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
directory_id INTEGER NOT NULL,
loan_institution TEXT,
borrower TEXT,
credit_limit REAL,
remaining_limit REAL,
start_date TEXT,
end_date TEXT,
annual_rate REAL,
guarantee_type TEXT,
guarantor TEXT,
archive_kind TEXT NOT NULL DEFAULT 'bank_loan',
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
FOREIGN KEY(directory_id) REFERENCES directories(id) ON DELETE CASCADE
);
");
$hasArchiveKind = false;
foreach ($pdo->query('PRAGMA table_info(archives)')->fetchAll(PDO::FETCH_ASSOC) as $col) {
if (($col['name'] ?? '') === 'archive_kind') {
$hasArchiveKind = true;
break;
}
}
if (!$hasArchiveKind) {
$pdo->exec("ALTER TABLE archives ADD COLUMN archive_kind TEXT NOT NULL DEFAULT 'bank_loan'");
}
$pdo->exec("
CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
archive_id INTEGER NOT NULL,
original_name TEXT NOT NULL,
stored_name TEXT NOT NULL,
file_ext TEXT NOT NULL,
file_size INTEGER NOT NULL,
created_at TEXT NOT NULL,
FOREIGN KEY(archive_id) REFERENCES archives(id) ON DELETE CASCADE
);
");
$pdo->exec("CREATE INDEX IF NOT EXISTS idx_archives_end_date ON archives(end_date)");
$pdo->exec("CREATE INDEX IF NOT EXISTS idx_archives_loan_inst ON archives(loan_institution)");
$pdo->exec("CREATE INDEX IF NOT EXISTS idx_archives_borrower ON archives(borrower)");
}
function seedAdmin(PDO $pdo): void
{
$stmt = $pdo->prepare('SELECT COUNT(*) FROM users WHERE username = :username');
$stmt->execute([':username' => 'admin']);
if ((int)$stmt->fetchColumn() > 0) {
return;
}
$stmt = $pdo->prepare('INSERT INTO users(username,password_hash,role,created_at) VALUES(:u,:p,:r,:c)');
$stmt->execute([
':u' => 'admin',
':p' => password_hash('jinniu123', PASSWORD_DEFAULT),
':r' => 'admin',
':c' => date('Y-m-d H:i:s'),
]);
}