xBlog 是一款基于 PHP + SQLite / PostgreSQL 构建的轻量、高性能多用户博客系统。
不依赖任何框架,代码透明,路由直接映射文件路径。快速部署、易于管理、专注写作。
一、核心特性
👥 多用户体系
支持完整的用户注册、登录、个人空间功能。每个用户拥有独立头像(支持上传/恢复默认),个人主页(user.php)展示该用户发布的全部文章、评论等。后台用户管理支持角色分配(管理员/普通用户)、封禁/解封、用户名检索等操作。
多作者可同时在站点上发布内容,适合团队博客、技术社区或开放式写作平台。站内消息面板(admin/message_panel.php)支持用户相互发送私信。
🗄️ 双数据库支持
同时兼容 PostgreSQL 和 SQLite,并提供双向迁移脚本。个人站点可直接使用 SQLite,无需安装配置数据库服务;需要更高并发或生产级可靠性时可一键切换到 PostgreSQL。
migrate_pg_to_sqlite.php— PostgreSQL → SQLitemigrate_sqlite_to_pg.php— SQLite → PostgreSQL
⚡ 静态页面缓存
文章详情页自动生成 HTML 静态缓存文件(cache/article/*.html),降低数据库查询压力。缓存跟随文章增删改自动失效,无需人工介入维护。
🎛️ 完整后台管理
| 模块 | 功能 |
|---|---|
| 📊 仪表盘 | 博客统计 · 快捷操作 · 主机状态 · 附件概览 |
| ✉️ 消息面板 | 发送消息 · 管理消息 · 搜索消息 |
| 📝 文章管理 | 管理文章 · 撰写文章 · 搜索文章 |
| 👥 用户管理 | 管理用户 · 分配用户组 |
| 💬 评论管理 | 管理评论 · 搜索评论 |
| 🏷️ 分类标签 | 管理分类标签 |
| ⚙️ 系统配置 | 基础设置 · 用户组管理 · 权限管理 · X币设置 |
| 📁 附件管理 | 管理附件 |
🔌 插件扩展机制
预留 plugin/ 插件目录,功能模块独立开发,不影响核心代码。目前内置三个插件:密码块、访问统计、天气信息。
🌓 深色/浅色主题
前台内置浅色(style-light.css)和深色(style-dark.css)两套主题,跟随系统偏好自动切换,用户也可手动切换,偏好记忆在本地。
📡 SEO 就绪
- 自动生成 RSS 订阅源(
rss.xml) - 自动生成站点地图(
sitemap.xml) - 支持
robots.txt协议
🛡️ 安全机制
- PDO 预处理,防止 SQL 注入
- 密码哈希存储(
password_hash) - 登录态 Session 管理
- 敏感配置独立存放
二、目录结构
xBlog - PHP + PostgreSQL / PHP + SQLITE 博客架构目录:
***/
├── 404.html # 404 页面
├── ajax_comment.php # AJAX 评论处理
├── ajax_like.php # AJAX 点赞处理
├── ajax_login.php # AJAX 登录处理
├── ajax_register.php # AJAX 注册处理
├── ajax_user_status.php # AJAX 文章互动状态处理
├── ajax_view.php # AJAX 文章浏览量统计处理
├── article.php # 文章详情页
├── blog.db # SQLite 数据库文件
├── captcha.php # 验证码生成
├── favicon.ico # 网站 ICO
├── generate_rss.php # RSS 订阅生成脚本
├── generate_sitemap.php # 网站地图生成脚本
├── index.php # 主页
├── inst.php # 部署脚本(SQLite / PostgreSQL)
├── login.php # 登录页
├── logout.php # 登出
├── migrate_pg_to_sqlite.php # 迁移脚本(PostgreSQL → SQLite)
├── migrate_sqlite_to_pg.php # 迁移脚本(SQLite → PostgreSQL)
├── README.txt # 读我
├── register.php # 注册页
├── robots.txt # 协议
├── rss.xml # RSS 订阅
├── search.php # 搜索页
├── sitemap.xml # 网站地图
├── user.php # 个人空间
├── user_tab.php # 个人空间 Tab 内容 AJAX 接口
│
├── admin/ # 后台目录
│ ├── add_article.php # 添加文章
│ ├── ajax_decrypt_secret.php # 解密密码块
│ ├── api_server_stats.php # 服务器指标 API
│ ├── api_summary.php # AI 摘要 API
│ ├── articles.php # 文章管理
│ ├── attachments.php # 附件管理
│ ├── avatar_delete.php # 头像恢复 API
│ ├── avatar_upload.php # 头像上传 API
│ ├── categories_tags.php # 分类标签管理
│ ├── check_username.php # 站内消息用户名验证接口
│ ├── comments.php # 评论管理
│ ├── config.php # 配置管理
│ ├── dbms.php # 数据库工具
│ ├── download_db.php # 下载数据库
│ ├── edit_article.php # 编辑文章
│ ├── edit_comment.php # 编辑评论处理
│ ├── index.php # 后台主页
│ ├── message_panel.php # 消息面板
│ ├── search_articles.php # 文章搜索 API
│ ├── search_comments.php # 评论搜索 API
│ ├── search_users.php # 用户搜索 API
│ ├── upload.php # 上传文件
│ └── users.php # 用户管理
│
├── assets/ # 静态资源目录
│ ├── tippy/ # 提示框
│ │ ├── popper.min.js # Popper.js 库压缩版
│ │ ├── scale.css # 缩放动画样式
│ │ └── tippy-bundle.umd.min.js # 核心功能及常用插件
│ ├── admin_articles_search.js # 后台文章搜索脚本 JavaScript
│ ├── admin_comments_search.js # 后台评论搜索脚本 JavaScript
│ ├── admin_icons.svg # 后台 SVG Sprite
│ ├── admin_script.js # 后台主体脚本 JavaScript
│ ├── admin_style.css # 后台样式表
│ ├── admin_users_search.js # 后台用户搜索脚本 JavaScript
│ ├── favicon.svg # icon
│ ├── icons.svg # 前台 SVG Sprite
│ ├── script.js # 前台主体脚本 JavaScript
│ ├── style-dark.css # 前台深色主题样式
│ ├── style-light.css # 前台浅色主题样式
│ ├── toastui-editor.min.css # Toast UI Editor 相关样式
│ ├── toastui-editor-all.min.js # Toast UI Editor 相关JS函数
│ ├── webgl-bg.js # 动态背景 主线程
│ └── webgl-bg-worker.js # 动态背景 独立线程
│
├── cache/ # 缓存目录
│ └── article/ # 文章片段缓存目录
│ └── *.html # 文章片段缓存文件
│
├── config/ # 存放敏感/环境相关配置
│ ├── cacert.pem # curl 使用的 CA 根证书,本地 Windows 环境需要
│ └── secrets.php # PostgreSQL 连接信息/存放 API Key 等密钥
│
├── fonts/ # 字体目录
│ └── Nunito-VariableFont_wght.woff2 # 字体文件
│
├── includes/ # 公共函数 配置 模板目录
│ ├── default/ # 默认文件目录
│ │ ├── admin_footer.php # 后台公共页脚
│ │ ├── admin_header.php # 后台公共头部
│ │ ├── footer.php # 前台公共页脚
│ │ └── header.php # 前台公共头部
│ ├── db_connect.php # 数据库连接
│ └── functions.php # 通用函数
│
├── plugin/ # 插件目录
│ ├── secret_block/ # 密码块
│ │ ├── ajax_secret.php # AJAX 密码验证接口
│ │ ├── secret.key # KEY
│ │ ├── secret_block.php # 密码块核心文件
│ │ ├── secret_block_script.js # 密码块 JavaScript
│ │ └── secret_block_style.css # 密码块样式
│ ├── statistics/ # 统计
│ │ ├── data/ # 数据目录
│ │ │ ├── .htaccess # 分布式配置
│ │ │ └── stats.db # 统计数据库
│ │ ├── core.php # 核心配置
│ │ ├── stats_online.php # 统计当前在线人数
│ │ ├── stats_page.php # 统计单篇文章/页面的浏览量
│ │ ├── stats_today.php # 统计今日访问量
│ │ ├── stats_total.php # 统计全站累计访问总量
│ │ └── tracker.php # 前端埋点接收器
│ └── weather/ # 天气
│ ├── api.php # 异步加载接口
│ ├── weather_functions.php # 天气插件函数
│ ├── weather_styles.css # 天气插件样式
│ ├── weather_widget.php # 固定地区版
│ ├── weather_widget_geolocation.php # 浏览器地理定位版
│ ├── weather_widget_ip.php # IP 定位版
│ ├── weather_widget_ip_with_days.php # IP 定位未来天气版
│ ├── weather_*.json # 固定地区版 缓存文件
│ └── weather_ip_*.json # IP 定位版 缓存文件
│
├── uploads/ # 上传目录
│ ├── images/ # 文章附件目录
│ └── avatars/ # 头像附件目录
│ ├── default/ # 默认头像附件目录
│ │ ├── male.svg # 默认男头像
│ │ └── female.svg # 默认女头像
│ └── user_*.jpg # 用户上传头像文件
│
├── vendor/ # league/commonmark 2.8.0 依赖目录
├── composer.json # 临时:项目依赖声明文件:列出需要哪些第三方库
├── composer.lock # 临时:依赖版本文件:记录当前安装的所有库的版本
└── composer.phar # 临时:Composer 工具本身:用于安装/更新依赖的可执行文件
三、安装部署
环境要求
| 组件 | 版本要求 |
|---|---|
| PHP | 7.4+ |
| PDO 扩展 | pgsql 或 sqlite |
| PostgreSQL | 12+(可选) |
| SQLite | 3(可选) |
部署步骤
inst.php有详细的指引步骤
# 1. 上传代码至 Web 目录
# 2. 设置目录权限(SQLite 模式)
chmod 755 cache/ uploads/ blog.db
# 3. 浏览器访问安装脚本
https://你的域名/inst.php
# 4. 选择数据库类型,填写连接信息和管理员账号
# 5. 部署完成后自动删除 inst.php
目录权限说明
| 路径 | 权限要求 |
|---|---|
cache/ |
可读写(生成静态缓存) |
uploads/ |
可读写(上传图片/头像) |
blog.db |
可读写(SQLite 数据库文件) |
plugin/statistics/data/ |
可读写(统计数据) |
四、数据库迁移
提供双向迁移脚本,支持在 PostgreSQL 和 SQLite 之间无缝切换:
# PostgreSQL → SQLite
php 这里替换为你目前目录路径 migrate_pg_to_sqlite.php
# SQLite → PostgreSQL
php 这里替换为你目前目录路径 migrate_sqlite_to_pg.php
⚠️ 执行迁移前请务必备份数据。脚本会以交互方式提示确认每一步操作。
五、插件详情
🔐 密码块(secret_block)
在文章内容中插入需要密码才能查看的隐藏片段。
- AJAX 无刷新验证
- 独立密钥管理
- 自定义提示文案
- 数据文件:
plugin/secret_block/secret.key
📊 访问统计(statistics)
独立的轻量级统计模块,数据存储于单独的 SQLite 数据库中,不影响主库性能:
- 全站累计访问量
- 今日访问量
- 当前在线人数
- 单篇文章浏览量
- 数据文件:
plugin/statistics/data/stats.db
🌤️ 天气信息(weather)
支持三种定位模式,自动缓存减少 API 调用:
| 模式 | 说明 |
|---|---|
| 固定地区版 | 手动指定城市 |
| IP 定位版 | 根据访客 IP 自动识别 |
| 浏览器定位版 | 使用 Geolocation API |