commit 608d05cf5e3f51273ea649d6eaa5918ceb419cd3
Author: starmen1265
Date: Sat Feb 14 00:04:12 2026 +0800
初始化知识库网页系统
功能:
- 用户登录/退出
- 文档列表展示(支持子目录)
- 关键词搜索
- Markdown 文档在线查看
- 管理员添加用户脚本
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'];
+});
+?>
+
+
+
+
+
+ 知识库 -
+
+
+
+
+
+
+
+
+
+ 共 个文档
+
+ (搜索: "")
+
+
+
+
+
+
+
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?)+/', '', $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) : '';
+?>
+
+
+
+
+
+ - 知识库
+
+
+
+
+
+