基于 XHBlogs 二次开发,使用 Next.js + Python FastAPI 构建的高颜值毛玻璃风格个人博客系统。完全自托管,无需 GitHub/Vercel。
- 文章:Markdown 写作,支持代码高亮(One Dark 主题)、数学公式(KaTeX)、目录导航(TOC)
- 说说:博主说说(Markdown 文件)+ 访客说说(MongoDB)混合展示,按时间排序
- 草稿:后台草稿箱,暂存未发布内容
- 操作暂存区:修改设置 → 暂存到操作队列 → 更新本地 → 同步 Blog
自建评论系统,数据存储在 MongoDB,支持:
- 昵称 + 邮箱评论(自动生成 Cravatar 头像)
- 评论回复(树状嵌套)
- 评论点赞
- 后台管理面板(审核、隐藏、删除)
- 统计数据(总数、已审核、待审核、已隐藏)
访客可以在说说页面发布自己的内容,支持:
- 富文本编辑器(Tiptap:加粗、斜体、高亮、下划线、对齐等)
- 填写昵称、邮箱、内容
- 提交后进入待审核状态,前台不显示
- 博主在后台审核面板中可通过/拒绝/删除
- 审核通过后在前台说说列表中与博主说说混合展示
- 访客说说带有"访客"标识,与博主说说区分
- 日间/夜间模式切换(默认日间模式)
- 主题偏好持久化到 localStorage
- 毛玻璃风格 UI
- 多种背景特效:樱花、萤火虫、弹幕、天气效果、风草等
内置 AI 驱动的猫猫助理,在后台管理器设置中配置 API 密钥即可启用:
- 支持 OpenAI 兼容接口(DeepSeek、Gemini 等)
- 可自定义模型、系统提示词、温度等参数
- 前台与管理端均可使用
- 在后台管理器音乐设置中输入网易云音乐歌曲 ID
- 前台浮动播放器 + 歌词栏
- 支持 APlayer 播放模式
- 内置图床上传功能,支持"去不图床"等标准 API 图床
- 支持本地存储模式
- 支持直接插入图片外链
- 友链展示页面
- 访客可复制申请格式申请友链
- 后台管理友链列表
- 照片墙:图片展示
- 项目展示:个人项目列表
- 时间线:建站历程
- 天气组件:实时天气显示
- 全局工具箱:计算器等小工具
- 搜索功能:文章搜索(防抖优化)
- 点击特效:互动反馈
本项目已实施以下性能优化措施:
| 优化类别 | 具体措施 |
|---|---|
| 代码分割 | 12+ 个重型组件(粒子特效、弹幕、播放器、轮播等)使用 next/dynamic 懒加载 |
| 渲染优化 | React.memo 包裹列表项、requestAnimationFrame 滚动节流、搜索防抖 |
| 请求优化 | 评论 API 30s 缓存 + stale-while-revalidate、天气 API 5 分钟缓存 |
| ISR 增量更新 | 首页/列表页 10 分钟、文章详情/时间线 1 小时自动重新生成 |
| 传输优化 | Gzip 压缩、静态资源 1 年强缓存、DNS 预解析 |
| 图片优化 | 文章卡片和评论头像 loading="lazy" 懒加载 |
NoWin_Blog/
├── NWBlogs/ # 博客前端(Next.js 16)
│ ├── app/ # 页面路由
│ │ ├── about/ # 关于页
│ │ ├── api/ # API 代理层
│ │ │ ├── chat/ # AI 猫猫助理
│ │ │ ├── comments/ # 评论接口
│ │ │ ├── guest-moments/# 访客说说接口
│ │ │ └── weather/ # 天气接口
│ │ ├── friends/ # 友链
│ │ ├── moments/ # 说说(博主 + 访客混合展示)
│ │ ├── music/ # 音乐
│ │ ├── photowall/ # 照片墙
│ │ ├── posts/ # 文章(列表 + 详情)
│ │ ├── projects/ # 项目
│ │ └── timeline/ # 时间线
│ ├── components/ # UI 组件
│ │ ├── DynamicImports.tsx # 全局重型组件懒加载入口
│ │ ├── HomeDynamicImports.tsx # 首页重型组件懒加载入口
│ │ ├── DynamicComments.tsx # 评论组件懒加载入口
│ │ ├── PostsBoard.tsx # 文章列表(memo 优化)
│ │ ├── Comments.tsx # 评论系统(memo 优化)
│ │ ├── ClientTOC.tsx # 目录导航(rAF 节流)
│ │ ├── SearchBar.tsx # 搜索框(防抖优化)
│ │ ├── VisitorMomentEditor.tsx # 访客说说富文本编辑器
│ │ ├── ThemeProvider.tsx # 主题切换(默认日间模式)
│ │ ├── CyberCat.tsx # AI 猫猫助理
│ │ ├── CloudPlayer.tsx # 网易云音乐播放器
│ │ ├── WeatherWidget.tsx # 天气组件
│ │ ├── DanmakuBackground.tsx # 弹幕背景
│ │ └── ... # 其他 UI 组件
│ ├── data/ # 数据文件(友链、图库、项目)
│ ├── posts/ # 文章 Markdown 文件
│ ├── siteConfig.ts # 站点配置
│ ├── deploy.sh # Linux 服务器一键部署脚本
│ └── next.config.ts # Next.js 配置(standalone + 压缩 + 缓存头)
│
├── my-blog-manager/ # 后台管理器(Next.js 16 + Python FastAPI)
│ ├── app/ # 管理页面
│ │ ├── admin/ # 管理面板
│ │ ├── api/ # API 代理层
│ │ │ ├── chat/ # AI 猫猫助理
│ │ │ ├── comments/ # 评论管理接口
│ │ │ └── guest-moments/# 访客说说管理接口
│ │ ├── editor/ # 文章编辑器
│ │ ├── moments/ # 说说管理(博主 + 访客混合展示)
│ │ ├── posts/ # 文章管理
│ │ ├── settings/ # 设置页面
│ │ └── ... # 其他管理页面
│ ├── components/
│ │ ├── editor/ # 富文本编辑器(Tiptap)
│ │ ├── settings/ # 设置模块
│ │ └── ... # 其他组件
│ ├── cms_core/ # Python 后端核心
│ │ ├── api/ # API 路由
│ │ │ ├── comments.py # 评论 API
│ │ │ ├── guest_moments.py # 访客说说 API
│ │ │ ├── config.py # 配置 API
│ │ │ ├── drafts.py # 草稿 API
│ │ │ ├── friends.py # 友链 API
│ │ │ ├── gallery.py # 图库 API
│ │ │ ├── moments.py # 说说 API
│ │ │ ├── music.py # 音乐 API
│ │ │ ├── picbed.py # 图床 API
│ │ │ ├── projects.py # 项目 API
│ │ │ └── sync.py # 同步 API
│ │ ├── database.py # MongoDB 连接模块
│ │ └── main.py # FastAPI 入口
│ ├── posts/ # 文章 Markdown 文件(与前端同步)
│ ├── data/ # 数据存储
│ │ └── deploy_config.json # 部署配置
│ └── siteConfig.ts # 管理端站点配置
│
└── Screenshot/ # 页面截图
├── 1.png
├── 2.png
└── 3.png
| 层级 | 技术 |
|---|---|
| 前端框架 | Next.js 16(App Router + Turbopack) |
| UI | React 19 + Tailwind CSS 4 + Framer Motion |
| 富文本编辑 | Tiptap(StarterKit + Highlight + Underline + TextAlign 等) |
| 后端 | Python FastAPI + Uvicorn |
| 数据库 | MongoDB(评论 + 访客说说数据) |
| 头像 | Cravatar(Gravatar 国内镜像) |
| AI | OpenAI 兼容接口(DeepSeek 等) |
- Node.js v18+(前端运行与构建)
- Python 3.10+(后端 API 服务)
- MongoDB 6.0+(评论与访客说说数据存储)
- npm(包管理器)
# 前端依赖
cd NWBlogs
npm install
# 后端 Python 依赖
cd ../my-blog-manager
pip install fastapi uvicorn python-multipart PyYAML markdown markdownify httpx requests pymongo# Linux
sudo systemctl start mongod
# Windows(安装 MongoDB 后)
net start MongoDB
# macOS
brew services start mongodb-community方式一:Linux 服务器一键部署
cd NWBlogs
# 首次需要构建
npm run build
# 设置环境变量
export MONGO_URI="mongodb://localhost:27017"
export MONGO_DB_NAME="nowin_blog"
export CMS_BACKEND_URL="http://127.0.0.1:8765"
export GEMINI_API_KEY="你的key" # AI 猫猫助理,可选
# 启动
chmod +x deploy.sh
./deploy.sh方式二:本地开发调试
# 终端1:启动 Python 后端
cd my-blog-manager
python -c "from cms_core.main import app; import uvicorn; uvicorn.run(app, host='0.0.0.0', port=8765)"
# 终端2:启动博客前端
cd NWBlogs
npm run dev
# 终端3:启动后台管理器
cd my-blog-manager
npm run dev| 服务 | 地址 |
|---|---|
| 博客前端 | http://localhost:3000 |
| 后台管理 | http://localhost:3001 |
| Python 后端 API | http://localhost:8765/api/status |
| 变量名 | 说明 | 默认值 |
|---|---|---|
MONGO_URI |
MongoDB 连接地址 | mongodb://localhost:27017 |
MONGO_DB_NAME |
MongoDB 数据库名 | nowin_blog |
CMS_BACKEND_URL |
Python 后端地址 | http://127.0.0.1:8765 |
GEMINI_API_KEY |
AI 猫猫助理 API 密钥 | 空 |
PORT |
前端端口号 | 3000 |
| 数据类型 | 存储方式 | 说明 |
|---|---|---|
| 博客文章 | Markdown 文件 | NWBlogs/posts/ 目录 |
| 博主说说 | Markdown 文件 | NWBlogs/moments/ 目录 |
| 评论 | MongoDB | comments 集合 |
| 访客说说 | MongoDB | guest_moments 集合 |
| 友链/图库/项目 | TypeScript 数据文件 | data/ 目录 |
| 站点配置 | TypeScript 配置文件 | siteConfig.ts |
📘 详细部署教程:如果你使用宝塔面板部署,请阅读 如何用服务器的宝塔面板将博客项目部署到你的服务器中.md,里面有从零开始的超详细图文步骤,适合新手。
cd NWBlogs
npm run build构建产物在 .next/standalone 目录下,可直接部署。
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /api/ {
proxy_pass http://127.0.0.1:8765/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}# /etc/systemd/system/nowin-blog-web.service
[Unit]
Description=NoWin_Blog Frontend
After=network.target
[Service]
WorkingDirectory=/path/to/NWBlogs/.next/standalone
ExecStart=/usr/bin/node server.js
Environment=HOSTNAME=0.0.0.0
Environment=CMS_BACKEND_URL=http://127.0.0.1:8765
Restart=always
[Install]
WantedBy=multi-user.target# /etc/systemd/system/nowin-blog-api.service
[Unit]
Description=NoWin_Blog Backend API
After=network.target mongod.service
[Service]
WorkingDirectory=/path/to/my-blog-manager
ExecStart=/usr/bin/python3 -c "from cms_core.main import app; import uvicorn; uvicorn.run(app, host='0.0.0.0', port=8765)"
Environment=MONGO_URI=mongodb://localhost:27017
Environment=MONGO_DB_NAME=nowin_blog
Environment=GEMINI_API_KEY=your_key
Restart=always
[Install]
WantedBy=multi-user.targetsudo systemctl enable nowin-blog-web nowin-blog-api
sudo systemctl start nowin-blog-web nowin-blog-api本项目采用 CC BY-NC 4.0 许可协议。允许免费学习、分享和二次修改后发布(二次开源发布需提及原作者),但严禁用于任何商业用途。


