{"id":15024376,"url":"https://github.com/liangliangyy/djangoblog","last_synced_at":"2026-01-16T10:32:30.329Z","repository":{"id":37733365,"uuid":"72640835","full_name":"liangliangyy/DjangoBlog","owner":"liangliangyy","description":"🍺基于Django的博客系统","archived":false,"fork":false,"pushed_at":"2025-04-02T12:58:09.000Z","size":4352,"stargazers_count":6920,"open_issues_count":6,"forks_count":2764,"subscribers_count":172,"default_branch":"master","last_synced_at":"2025-04-08T23:11:24.660Z","etag":null,"topics":["blog","django","django-blog","python"],"latest_commit_sha":null,"homepage":"https://www.lylinux.net/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liangliangyy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-02T13:07:55.000Z","updated_at":"2025-04-08T13:21:51.000Z","dependencies_parsed_at":"2024-12-10T03:04:32.661Z","dependency_job_id":"7fefd87a-9c88-480f-ab16-16af20ce3c73","html_url":"https://github.com/liangliangyy/DjangoBlog","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liangliangyy%2FDjangoBlog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liangliangyy%2FDjangoBlog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liangliangyy%2FDjangoBlog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liangliangyy%2FDjangoBlog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liangliangyy","download_url":"https://codeload.github.com/liangliangyy/DjangoBlog/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250512839,"owners_count":21443102,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blog","django","django-blog","python"],"created_at":"2024-09-24T20:00:13.269Z","updated_at":"2026-01-16T10:32:30.263Z","avatar_url":"https://github.com/liangliangyy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DjangoBlog\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/liangliangyy/DjangoBlog/actions/workflows/django.yml\"\u003e\u003cimg src=\"https://github.com/liangliangyy/DjangoBlog/actions/workflows/django.yml/badge.svg\" alt=\"Django CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/liangliangyy/DjangoBlog/actions/workflows/frontend.yml\"\u003e\u003cimg src=\"https://github.com/liangliangyy/DjangoBlog/actions/workflows/frontend.yml/badge.svg\" alt=\"Frontend CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/liangliangyy/DjangoBlog/actions/workflows/codeql-analysis.yml\"\u003e\u003cimg src=\"https://github.com/liangliangyy/DjangoBlog/actions/workflows/codeql-analysis.yml/badge.svg\" alt=\"CodeQL\"\u003e\u003c/a\u003e\n \u003ca href=\"https://codecov.io/gh/liangliangyy/DjangoBlog\" \u003e \n \u003cimg src=\"https://codecov.io/gh/liangliangyy/DjangoBlog/branch/master/graph/badge.svg?token=vmnMtzuFqN\"/\u003e\u003c/a\u003e \u003ca href=\"https://github.com/liangliangyy/DjangoBlog/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/liangliangyy/djangoblog.svg\" alt=\"license\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003e一款功能强大、设计优雅的现代化博客系统\u003c/b\u003e\n  \u003cbr\u003e\n  \u003ca href=\"/docs/README-en.md\"\u003eEnglish\u003c/a\u003e • \u003cb\u003e简体中文\u003c/b\u003e\n\u003c/p\u003e\n\n---\n\nDjangoBlog 是一款基于 Python 3.10+ 和 Django 5.2 构建的高性能博客平台。它不仅提供了传统博客的所有核心功能，还通过一个灵活的插件系统，让您可以轻松扩展和定制您的网站。无论您是个人博主、技术爱好者还是内容创作者，DjangoBlog 都旨在为您提供一个稳定、高效且易于维护的写作和发布环境。\n\n## ✨ 特性亮点\n\n- **强大的内容管理**: 支持文章、独立页面、分类和标签的完整管理。内置强大的 Markdown 编辑器，支持代码语法高亮。\n- **全文搜索**: 集成 Elasticsearch/Whoosh 搜索引擎，提供快速、精准的文章内容搜索，支持关键词高亮显示。\n- **互动评论系统**: 支持回复、邮件提醒等功能，评论内容同样支持 Markdown。现代化评论界面，支持无限嵌套回复。\n- **灵活的侧边栏**: 可自定义展示最新文章、最多阅读、标签云等模块。\n- **社交化登录**: 内置 OAuth 支持，已集成 Google, GitHub, Facebook, 微博, QQ 等主流平台。\n- **黑夜模式**: 支持浅色/深色主题自动切换，可跟随系统设置，提供舒适的阅读体验。\n- **现代化前端**: 基于 Alpine.js + Tailwind CSS + HTMX 构建，提供 SPA 般的无刷新浏览体验，支持 HTML-over-the-wire 架构。\n- **高性能缓存**: 原生支持 Redis 缓存，并提供自动刷新机制，确保网站高速响应。\n- **SEO 友好**: 具备基础 SEO 功能，新内容发布后可自动通知 Google 和百度。\n- **便捷的插件系统**: 通过创建独立的插件来扩展博客功能，代码解耦，易于维护。已内置 9 个实用插件，包括浏览计数、SEO 优化、文章推荐、图片懒加载等功能！\n- **集成图床**: 内置简单的图床功能，方便图片上传和管理。\n- **自动化构建**: 使用 Vite 构建前端资源，支持热更新和自动压缩优化。\n- **健壮的运维**: 内置网站异常邮件提醒和微信公众号管理功能。\n\n## 🛠️ 技术栈\n\n- **后端**: Python 3.10+, Django 5.2\n- **数据库**: MySQL, SQLite (可配置)\n- **缓存**: Redis, LocalMem (可配置)\n- **前端**: Alpine.js 3.13, Tailwind CSS 3.4, HTMX 1.9, Vite 5.4\n- **搜索**: Whoosh, Elasticsearch (可配置)\n- **编辑器**: Markdown (mdeditor)\n\n## 🚀 快速开始\n\n### 1. 环境准备\n\n确保您的系统中已安装 Python 3.10+ 和 MySQL/MariaDB。\n\n### 2. 克隆与安装\n\n```bash\n# 克隆项目到本地\ngit clone https://github.com/liangliangyy/DjangoBlog.git\ncd DjangoBlog\n\n# 安装依赖\npip install -r requirements.txt\n```\n\n### 3. 项目配置\n\n- **数据库**:\n  打开 `djangoblog/settings.py` 文件，找到 `DATABASES` 配置项，修改为您的 MySQL 连接信息。\n\n  ```python\n  DATABASES = {\n      'default': {\n          'ENGINE': 'django.db.backends.mysql',\n          'NAME': 'djangoblog',\n          'USER': 'root',\n          'PASSWORD': 'your_password',\n          'HOST': '127.0.0.1',\n          'PORT': 3306,\n      }\n  }\n  ```\n  在 MySQL 中创建数据库:\n  ```sql\n  CREATE DATABASE `djangoblog` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n  ```\n\n- **更多配置**:\n  关于邮件发送、OAuth 登录、缓存等更多高级配置，请参阅我们的 [详细配置文档](/docs/config.md)。\n\n### 4. 初始化数据库\n\n```bash\npython manage.py makemigrations\npython manage.py migrate\n\n# 创建一个超级管理员账户\npython manage.py createsuperuser\n```\n\n### 5. 构建前端资源\n\n```bash\n# 进入前端目录\ncd frontend\n\n# 安装依赖（首次运行需要）\nnpm install\n\n# 构建生产环境资源\nnpm run build\n\n# 返回项目根目录\ncd ..\n```\n\n### 6. 运行项目\n\n```bash\n# (可选) 生成一些测试数据\npython manage.py create_testdata\n\n# 收集静态文件\npython manage.py collectstatic --noinput\n\n# (可选) 压缩静态文件\npython manage.py compress --force\n\n# 启动开发服务器\npython manage.py runserver\n```\n\n现在，在您的浏览器中访问 `http://127.0.0.1:8000/`，您应该能看到 DjangoBlog 的首页了！\n\n### 开发模式\n\n如果您需要开发前端代码，可以使用 Vite 的热更新功能：\n\n```bash\n# 在 frontend 目录下启动开发服务器\ncd frontend\nnpm run dev\n```\n\n这将启动 Vite 开发服务器，修改前端代码后会自动重新构建。\n\n## 部署\n\n- **传统部署**: 我们为您准备了非常详细的 [服务器部署教程](https://www.lylinux.net/article/2019/8/5/58.html)。\n- **Docker 部署**: 项目已全面支持 Docker。如果您熟悉容器化技术，请参考 [Docker 部署文档](/docs/docker.md) 来快速启动。\n- **Kubernetes 部署**: 我们也提供了完整的 [Kubernetes 部署指南](/docs/k8s.md)，助您轻松上云。\n\n## 🧩 插件系统\n\n插件系统是 DjangoBlog 的核心特色之一。它允许您在不修改核心代码的情况下，通过编写独立的插件来为您的博客添加新功能。\n\n- **工作原理**: 插件通过在预定义的\"钩子\"上注册回调函数来工作。例如，当一篇文章被渲染时，`after_article_body_get` 钩子会被触发，所有注册到此钩子的函数都会被执行。\n\n- **现有插件**: 项目已内置以下实用插件\n  - `view_count` - 文章浏览计数统计\n  - `seo_optimizer` - SEO 优化增强\n  - `article_copyright` - 文章版权声明（现代化样式）\n  - `article_recommendation` - 智能文章推荐（响应式卡片布局）\n  - `external_links` - 外部链接处理（自动添加图标）\n  - `image_lazy_loading` - 图片懒加载优化（淡入动画）\n  - `reading_time` - 文章阅读时间估算\n  - `cloudflare_cache` - Cloudflare 缓存管理\n\n- **开发您自己的插件**: 只需在 `plugins` 目录下创建一个新的文件夹，并编写您的 `plugin.py`。欢迎探索并为 DjangoBlog 社区贡献您的创意！\n\n## 🤝 贡献指南\n\n我们热烈欢迎任何形式的贡献！如果您有好的想法或发现了 Bug，请随时提交 Issue 或 Pull Request。\n\n## 📄 许可证\n\n本项目基于 [MIT License](LICENSE) 开源。\n\n---\n\n## ❤️ 支持与赞助\n\n如果您觉得这个项目对您有帮助，并且希望支持我继续维护和开发新功能，欢迎请我喝杯咖啡！您的每一份支持都是我前进的最大动力。\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"/docs/imgs/alipay.jpg\" width=\"150\" alt=\"支付宝赞助\"\u003e\n  \u003cimg src=\"/docs/imgs/wechat.jpg\" width=\"150\" alt=\"微信赞助\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ci\u003e(左) 支付宝 / (右) 微信\u003c/i\u003e\n\u003c/p\u003e\n\n## 🙏 鸣谢\n\n特别感谢 **JetBrains** 为本项目提供的免费开源许可证。\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.jetbrains.com/?from=DjangoBlog\"\u003e\n    \u003cimg src=\"/docs/imgs/pycharm_logo.png\" width=\"150\" alt=\"JetBrains Logo\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n---\n\u003e 如果本项目帮助到了你，请在[这里](https://github.com/liangliangyy/DjangoBlog/issues/214)留下你的网址，让更多的人看到。您的回复将会是我继续更新维护下去的动力。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliangliangyy%2Fdjangoblog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliangliangyy%2Fdjangoblog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliangliangyy%2Fdjangoblog/lists"}