From 608d05cf5e3f51273ea649d6eaa5918ceb419cd3 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Sat, 14 Feb 2026 00:04:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E7=BD=91=E9=A1=B5=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 功能: - 用户登录/退出 - 文档列表展示(支持子目录) - 关键词搜索 - Markdown 文档在线查看 - 管理员添加用户脚本 --- README.md | 138 ++++++++++++++++ add_user.php | 63 ++++++++ config.php | 57 +++++++ dashboard.php | 153 ++++++++++++++++++ demo/示例文档.md | 20 +++ index.php | 64 ++++++++ init.sql | 33 ++++ logout.php | 9 ++ style.css | 402 +++++++++++++++++++++++++++++++++++++++++++++++ view.php | 103 ++++++++++++ 10 files changed, 1042 insertions(+) create mode 100644 README.md create mode 100644 add_user.php create mode 100644 config.php create mode 100644 dashboard.php create mode 100644 demo/示例文档.md create mode 100644 index.php create mode 100644 init.sql create mode 100644 logout.php create mode 100644 style.css create mode 100644 view.php diff --git a/README.md b/README.md new file mode 100644 index 0000000..5b35fd2 --- /dev/null +++ b/README.md @@ -0,0 +1,138 @@ +# 知识库网页系统 + +一个简单的知识库文档管理系统,支持多用户登录、文档列表和搜索。 + +## 功能 + +- ✅ 账号密码登录 +- ✅ 每个用户有独立的知识库目录 +- ✅ 文档列表展示 +- ✅ 关键词搜索(标题+内容) +- ✅ 在线查看文档(支持 Markdown) +- ✅ 管理员添加用户 + +## 目录结构 + +``` +kb-web/ +├── index.php # 登录页 +├── dashboard.php # 文档列表 + 搜索 +├── view.php # 查看文档内容 +├── logout.php # 退出登录 +├── config.php # 数据库配置 +├── add_user.php # 添加用户脚本 +├── style.css # 样式 +├── init.sql # 数据库初始化 +├── README.md # 说明文档 +└── {username}/ # 用户文档目录 + ├── 文档1.md + └── 文档2.md +``` + +## 部署步骤 + +### 1. 上传文件 + +将整个 `kb-web` 目录上传到服务器的网站目录中。 + +### 2. 创建数据库 + +```bash +# 登录 MySQL +mysql -u root -p + +# 执行初始化脚本 +source init.sql +``` + +或者直接在 MySQL 中执行: + +```sql +CREATE DATABASE IF NOT EXISTS kb_web DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +``` + +### 3. 修改配置 + +编辑 `config.php`,修改数据库连接信息: + +```php +define('DB_HOST', 'localhost'); +define('DB_NAME', 'kb_web'); +define('DB_USER', 'your_db_user'); +define('DB_PASS', 'your_db_password'); +``` + +### 4. 添加用户 + +在服务器上执行: + +```bash +cd /path/to/kb-web +php add_user.php 用户名 密码 +``` + +示例: +```bash +php add_user.php zhangqing mypassword123 +``` + +### 5. 添加文档 + +将用户的文档(.md 或 .txt 格式)放入对应用户目录: + +```bash +cp ~/knowledge-base/analyzed/*.md /path/to/kb-web/zhangqing/ +``` + +### 6. 访问 + +打开浏览器访问:`http://your-domain.com/kb-web/` + +## 管理员操作 + +### 添加新用户 + +```bash +php add_user.php newuser newpassword +``` + +### 重置密码 + +```bash +# 删除旧用户 +mysql -u root -p -e "DELETE FROM kb_web.users WHERE username='olduser';" + +# 重新添加 +php add_user.php olduser newpassword +``` + +### 批量导入文档 + +```bash +# 将分析好的文档复制到用户目录 +cp ~/work/knowledge-base/analyzed/*.md /path/to/kb-web/zhangqing/ +``` + +## 注意事项 + +1. **安全性** + - 修改 `config.php` 中的数据库密码 + - 确保 `config.php` 不可被外部访问(LNMP 默认已处理) + - 定期备份数据库 + +2. **文件权限** + ```bash + chown -R www-data:www-data /path/to/kb-web + chmod -R 755 /path/to/kb-web + ``` + +3. **支持的文档格式** + - .md (Markdown) + - .txt (纯文本) + - .markdown + +## 技术栈 + +- PHP 7.4+ +- MySQL 5.7+ +- 纯前端(HTML + CSS + JS) diff --git a/add_user.php b/add_user.php new file mode 100644 index 0000000..9f349de --- /dev/null +++ b/add_user.php @@ -0,0 +1,63 @@ + + * 示例: php add_user.php zhangqing mypassword123 + */ + +if ($argc < 3) { + echo "使用方法: php add_user.php \n"; + echo "示例: php add_user.php zhangqing mypassword123\n"; + exit(1); +} + +$username = $argv[1]; +$password = $argv[2]; + +// 验证用户名格式 +if (!preg_match('/^[a-zA-Z0-9_]{3,50}$/', $username)) { + echo "错误: 用户名只能是字母、数字、下划线,长度3-50\n"; + exit(1); +} + +// 验证密码长度 +if (strlen($password) < 6) { + echo "错误: 密码长度至少6位\n"; + exit(1); +} + +require_once 'config.php'; + +try { + $db = getDB(); + + // 检查用户是否已存在 + $stmt = $db->prepare("SELECT id FROM users WHERE username = ?"); + $stmt->execute([$username]); + if ($stmt->fetch()) { + echo "错误: 用户 '$username' 已存在\n"; + exit(1); + } + + // 创建密码哈希 + $passwordHash = password_hash($password, PASSWORD_DEFAULT); + + // 插入用户 + $stmt = $db->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)"); + $stmt->execute([$username, $passwordHash]); + + // 创建用户文档目录 + $docDir = __DIR__ . '/' . $username; + if (!is_dir($docDir)) { + mkdir($docDir, 0755, true); + echo "✅ 用户目录已创建: $docDir\n"; + } + + echo "✅ 用户 '$username' 添加成功!\n"; + echo " 用户名: $username\n"; + echo " 密码: $password\n"; + +} catch (PDOException $e) { + echo "数据库错误: " . $e->getMessage() . "\n"; + exit(1); +} diff --git a/config.php b/config.php new file mode 100644 index 0000000..60b4a3b --- /dev/null +++ b/config.php @@ -0,0 +1,57 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC + ] + ); + } catch (PDOException $e) { + die("数据库连接失败: " . $e->getMessage()); + } + } + return $pdo; +} + +// 检查登录状态 +function checkLogin() { + if (!isset($_SESSION['user_id'])) { + header('Location: index.php'); + exit; + } +} + +// 获取当前用户信息 +function getCurrentUser() { + if (!isset($_SESSION['user_id'])) { + return null; + } + $db = getDB(); + $stmt = $db->prepare("SELECT * FROM users WHERE id = ?"); + $stmt->execute([$_SESSION['user_id']]); + return $stmt->fetch(); +} + +// 获取用户文档目录 +function getUserDocDir($username) { + return __DIR__ . '/' . $username; +} diff --git a/dashboard.php b/dashboard.php new file mode 100644 index 0000000..ff67740 --- /dev/null +++ b/dashboard.php @@ -0,0 +1,153 @@ + $item, + 'path' => $relativePath, + 'folder' => dirname($relativePath) === '.' ? '' : dirname($relativePath), + 'size' => filesize($fullPath), + 'mtime' => filemtime($fullPath), + 'preview' => mb_substr(strip_tags($content), 0, 200) + ]; + } + } + return $docs; +} + +$documents = scanDirectory($docDir, $docDir, $search); + +// 按文件夹分组,然后按修改时间排序 +usort($documents, function($a, $b) { + // 先按文件夹排序 + if ($a['folder'] !== $b['folder']) { + return strcmp($a['folder'], $b['folder']); + } + // 同一文件夹按修改时间排序(新文件在前) + return $b['mtime'] - $a['mtime']; +}); +?> + + + + + + 知识库 - <?php echo htmlspecialchars($username); ?> + + + +
+
+

📚 我的知识库

+ +
+ + + +
+ 共 个文档 + + (搜索: "") + +
+ +
+ +
+ + 没有找到匹配的文档 + + 暂无文档 + +
+ + +
+ 📁 +
+ + +
📄
+
+
+
+ KB · + + + · 📁 + +
+
...
+
+
+ + +
+
+ + diff --git a/demo/示例文档.md b/demo/示例文档.md new file mode 100644 index 0000000..1549356 --- /dev/null +++ b/demo/示例文档.md @@ -0,0 +1,20 @@ +# 这是一个示例文档 + +这是您的知识库示例文档。 + +## 主要内容 + +- 支持搜索功能 +- 支持 Markdown 格式 +- 可以查看文档预览 + +## 代码示例 + +```python +def hello(): + print("Hello, Knowledge Base!") +``` + +## 链接 + +这是一个 [示例链接](https://example.com)。 diff --git a/index.php b/index.php new file mode 100644 index 0000000..effd874 --- /dev/null +++ b/index.php @@ -0,0 +1,64 @@ +prepare("SELECT * FROM users WHERE username = ?"); + $stmt->execute([$username]); + $user = $stmt->fetch(); + + if ($user && password_verify($password, $user['password_hash'])) { + $_SESSION['user_id'] = $user['id']; + $_SESSION['username'] = $user['username']; + header('Location: dashboard.php'); + exit; + } else { + $error = '用户名或密码错误'; + } + } +} +?> + + + + + + 知识库 - 登录 + + + + + + diff --git a/init.sql b/init.sql new file mode 100644 index 0000000..b65753f --- /dev/null +++ b/init.sql @@ -0,0 +1,33 @@ +-- 知识库网页系统 - 数据库初始化脚本 +-- 运行方式: mysql -u root -p kb_web < init.sql + +-- 创建数据库(如果不存在) +CREATE DATABASE IF NOT EXISTS kb_web DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +USE kb_web; + +-- 用户表 +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + INDEX idx_username (username) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- ============================================ +-- 添加用户示例 +-- ============================================ +-- 密码使用 PHP password_hash() 生成 +-- PHP 生成密码: echo password_hash('your_password', PASSWORD_DEFAULT); +-- ============================================ + +-- 示例:添加用户 demo,密码为 demo123 +-- 密码哈希值需要用 PHP 生成,以下是示例格式: +-- INSERT INTO users (username, password_hash) VALUES +-- ('demo', '$2y$10$...'); + +-- ============================================ +-- 管理员添加用户的 PHP 脚本 (add_user.php) +-- 可以单独部署在管理目录中 +-- ============================================ diff --git a/logout.php b/logout.php new file mode 100644 index 0000000..6c08709 --- /dev/null +++ b/logout.php @@ -0,0 +1,9 @@ +$1', $text); + $text = preg_replace('/^## (.*$)/m', '

$1

', $text); + $text = preg_replace('/^# (.*$)/m', '

$1

', $text); + + // 粗体和斜体 + $text = preg_replace('/\*\*(.+?)\*\*/', '$1', $text); + $text = preg_replace('/\*(.+?)\*/', '$1', $text); + + // 代码块 + $text = preg_replace('/```(\w*)\n(.*?)```/s', '
$2
', $text); + $text = preg_replace('/`(.+?)`/', '$1', $text); + + // 链接 + $text = preg_replace('/\[(.+?)\]\((.+?)\)/', '$1', $text); + + // 列表 + $text = preg_replace('/^- (.*$)/m', '
  • $1
  • ', $text); + $text = preg_replace('/(
  • .*<\/li>\n?)+/', '
      $0
    ', $text); + + // 段落 + $text = preg_replace('/\n\n/', '

    ', $text); + $text = '

    ' . $text . '

    '; + + return $text; +} + +// 高亮搜索词 +function highlightSearch($text, $search) { + if (empty($search)) return $text; + return preg_replace('/(' . preg_quote($search, '/') . ')/i', + '$1', $text); +} + +$htmlContent = markdownToHtml(htmlspecialchars($content)); +if ($search) { + $htmlContent = highlightSearch($htmlContent, $search); +} + +// 获取文件名(不含路径) +$displayName = basename($file); +$folder = dirname($file) !== '.' ? dirname($file) : ''; +?> + + + + + + <?php echo htmlspecialchars($displayName); ?> - 知识库 + + + +
    +
    + + ← 返回列表 + +

    + +
    📁
    + +
    + +
    + +
    +
    + +