一个基于 Flask 开发的现代化个人博客系统,支持 Markdown、评论系统、文章分类等功能。
- 文章管理:创建、编辑、删除文章,支持 Markdown 格式
- 评论系统:游客和管理员都可以发表评论和回复
- 文章分类:自定义分类管理,方便文章归类
- 标签系统:为文章添加多个标签,便于检索
- 搜索功能:支持按标题和内容搜索文章
- 管理员登录:安全的用户认证机制
- 个人信息管理:可修改用户名、邮箱、密码和个人简介
- 评论信箱:查看所有评论,带未读消息提醒
- 邮件通知:评论回复自动发送邮件通知(需配置 SMTP)
- 站内通知:未读评论数量实时显示
- Toast 提示:美观的操作反馈提示
- 响应式设计:适配桌面和移动设备
- Markdown 实时预览:写作时即时看到渲染效果
- 渐变主题:优雅的紫色渐变设计风格
- 评论折叠:超过3条回复自动折叠,保持页面整洁
- 首页侧边栏:个人简介和文章分类快速访问
- 锚点定位:点击评论直接跳转到对应位置
- 管理员便捷操作:评论/回复无需重复填写信息
- 灵活的信息编辑:基本信息修改无需密码验证
- Flask 3.0 - Web 框架
- Flask-SQLAlchemy 3.1 - ORM 数据库操作
- Flask-Login 0.6 - 用户会话管理
- Flask-Mail 0.9 - 邮件发送
- Werkzeug - 密码哈希和安全工具
- Jinja2 - 模板引擎
- marked.js - Markdown 实时渲染
- CSS3 - 渐变、动画、响应式布局
- SQLite - 轻量级数据库(可替换为 MySQL/PostgreSQL)
- Python 3.12+
- pip 包管理器
- 克隆项目
git clone <your-repository-url>
cd blog- 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # Linux/Mac
# 或
.venv\Scripts\activate # Windows- 安装依赖
pip install -r requirements.txt- 配置邮件(可选)
编辑 app.py 文件,修改邮件配置:
app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'your_email@qq.com' # 你的邮箱
app.config['MAIL_PASSWORD'] = 'your_smtp_password' # SMTP授权码
app.config['MAIL_DEFAULT_SENDER'] = 'your_email@qq.com'- 运行应用
python app.py- 访问博客
打开浏览器访问:http://127.0.0.1:5000
- 用户名:admin
- 密码:admin123
blog/
├── app.py # 主应用文件(路由、模型、配置)
├── requirements.txt # Python 依赖包
├── instance/
│ └── blog.db # SQLite 数据库文件
├── templates/ # HTML 模板
│ ├── base.html # 基础模板
│ ├── index.html # 首页
│ ├── post.html # 文章详情页
│ ├── login.html # 登录页
│ ├── new_post.html # 新建文章
│ ├── edit_post.html # 编辑文章
│ ├── profile.html # 个人中心
│ ├── edit_profile.html # 编辑个人信息
│ ├── inbox.html # 评论信箱
│ ├── categories.html # 分类管理
│ └── comment_item.html # 评论项模板
└── static/ # 静态资源(可选)
- 登录管理员账户
- 点击导航栏"写文章"
- 填写标题、选择分类、添加标签
- 使用 Markdown 编写内容(支持实时预览)
- 点击"发布文章"
- 点击导航栏"分类管理"
- 创建新分类(名称 + 描述)
- 可以删除空分类(有文章的分类无法删除)
- 写文章时选择已有分类
- 登录后点击"个人中心"
- 点击"📬 评论信箱"查看未读评论
- 点击"👁️ 查看评论"直接跳转到评论位置
- 进入"个人中心"
- 点击"✏️ 编辑个人信息"
- 基本信息:可直接修改,无需密码
- 修改密码:需要验证当前密码
默认使用 SQLite,如需使用其他数据库:
# MySQL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:password@localhost/blog'
# PostgreSQL
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@localhost/blog'修改 app.py 中的 SECRET_KEY:
app.config['SECRET_KEY'] = 'your-secret-key-change-this-in-production'- 使用 Gunicorn 或 uWSGI 作为 WSGI 服务器
- 使用 Nginx 作为反向代理
- 启用 HTTPS
- 使用 PostgreSQL 或 MySQL 替代 SQLite
- 配置环境变量存储敏感信息
gunicorn -w 4 -b 0.0.0.0:8000 app:appGET /- 首页GET /post/<id>- 文章详情GET /category/<id>- 分类文章列表POST /post/<id>/comment- 发表评论
GET /login- 登录GET /logout- 登出GET /admin/new- 新建文章GET /admin/edit/<id>- 编辑文章POST /admin/delete/<id>- 删除文章GET /admin/profile- 个人中心GET /admin/profile/edit- 编辑个人信息POST /admin/profile/update_basic- 更新基本信息POST /admin/profile/change_password- 修改密码GET /admin/inbox- 评论信箱POST /admin/comment/delete/<id>- 删除评论GET /admin/categories- 分类管理POST /admin/category/new- 创建分类POST /admin/category/delete/<id>- 删除分类
如果遇到 no such column 错误,删除 instance/blog.db 后重启应用。
- 检查 SMTP 配置是否正确
- 确认邮箱已开启 SMTP 服务
- 使用邮箱授权码而非登录密码
确保文章内容包含有效的 Markdown 语法。
MIT License
欢迎提交 Issue 和 Pull Request!
如有问题或建议,请通过以下方式联系:
- 提交 GitHub Issue
Made with ❤️ using Flask