Преглед изворни кода

feat: add database initialization script (db_init.php)

Creates the BCJD navigation database and `links` table, imports seed data, and warns about security.
caesar пре 2 месеци
родитељ
комит
b6d3889c5d
1 измењених фајлова са 77 додато и 0 уклоњено
  1. 77 0
      public/db_init.php

+ 77 - 0
public/db_init.php

@@ -0,0 +1,77 @@
+<?php
+/**
+ * BCJD 导航 - 数据库初始化脚本
+ *
+ * 使用 OOP 类库重构。
+ * 访问此文件一次即可自动建库建表并导入现有数据。
+ * ⚠️ 执行完毕后建议删除或限制访问此文件!
+ */
+
+require_once __DIR__ . '/../init.php';
+
+use BCJD\Database;
+
+header('Content-Type: text/html; charset=utf-8');
+
+try {
+    // 1. 先创建数据库
+    $pdo = Database::rawConnection();
+    $pdo->exec(sprintf(
+        'CREATE DATABASE IF NOT EXISTS `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci',
+        DB_NAME
+    ));
+    $pdo->exec(sprintf('USE `%s`', DB_NAME));
+    echo "✅ 数据库创建/确认成功<br>\n";
+
+    // 2. 创建 links 表
+    $pdo->exec("
+        CREATE TABLE IF NOT EXISTS `links` (
+            `id`          INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
+            `title`       VARCHAR(100)  NOT NULL COMMENT '链接标题',
+            `url`         VARCHAR(500)  NOT NULL COMMENT '链接地址',
+            `description` VARCHAR(255)  NOT NULL DEFAULT '' COMMENT '描述',
+            `icon_svg`    TEXT          NOT NULL COMMENT 'SVG 图标代码',
+            `group_name`  VARCHAR(50)   NOT NULL DEFAULT 'default' COMMENT '分组名称',
+            `group_label` VARCHAR(50)   NOT NULL DEFAULT '' COMMENT '分组显示标签',
+            `group_hint`  VARCHAR(100)  NOT NULL DEFAULT '' COMMENT '分组提示文字',
+            `keywords`    VARCHAR(255)  NOT NULL DEFAULT '' COMMENT '搜索关键词',
+            `tag_label`   VARCHAR(30)   NOT NULL DEFAULT '' COMMENT '标签文字',
+            `tag_class`   VARCHAR(30)   NOT NULL DEFAULT '' COMMENT '标签样式类',
+            `meta_domain` VARCHAR(100)  NOT NULL DEFAULT '' COMMENT '域名/元信息',
+            `sort_order`  INT UNSIGNED  NOT NULL DEFAULT 0 COMMENT '排序',
+            `is_private`  TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '1=需登录,0=公开',
+            `created_at`  DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
+            INDEX `idx_group` (`group_name`),
+            INDEX `idx_private` (`is_private`),
+            INDEX `idx_sort` (`sort_order`)
+        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
+    ");
+    echo "✅ links 表创建/确认成功<br>\n";
+
+    // 3. 导入初始数据(如果表为空)
+    $count = $pdo->query("SELECT COUNT(*) FROM links")->fetchColumn();
+    if ($count > 0) {
+        echo "⚠️ links 表已有 {$count} 条记录,跳过数据导入<br>\n";
+    } else {
+        require_once __DIR__ . '/../db_seed.php';
+
+        $links = get_seed_links();
+
+        $stmt = $pdo->prepare("
+            INSERT INTO `links` (`title`, `url`, `description`, `icon_svg`, `group_name`, `group_label`, `group_hint`, `keywords`, `tag_label`, `tag_class`, `meta_domain`, `sort_order`, `is_private`)
+            VALUES (:title, :url, :description, :icon_svg, :group_name, :group_label, :group_hint, :keywords, :tag_label, :tag_class, :meta_domain, :sort_order, :is_private)
+        ");
+
+        foreach ($links as $link) {
+            $stmt->execute($link);
+        }
+        echo '✅ 已导入 ' . count($links) . ' 条链接数据<br>';
+    }
+
+    echo '<hr><p style="color:green;font-weight:bold">🎉 数据库初始化完成!</p>';
+    echo '<p>👉 <a href="index.php">访问首页</a> | 👉 <a href="admin.php">管理面板</a></p>';
+    echo '<p style="color:red;font-weight:bold">⚠️ 出于安全考虑,建议你现在删除或重命名本文件(db_init.php)!</p>';
+
+} catch (\PDOException $e) {
+    echo '<p style="color:red">❌ 数据库错误:' . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . '</p>';
+}