Reyadh418/Blog-Hub-Project
GitHub: Reyadh418/Blog-Hub-Project
面向生产环境的全栈博客平台,具备完善的用户系统、内容审核和安全加固机制。
Stars: 0 | Forks: 0
# 动态 Blogs
Dynamic Blogs 是一个面向生产环境的全栈博客平台,采用 Express、PostgreSQL 以及原生 HTML/CSS/JS 前端构建。它展示了跨产品设计、后端架构、安全加固、角色管理和部署就绪等端到端的软件工程能力。
## 执行摘要
- 产品定位:具备用户/社区功能和管理治理的内容发布 Web 应用。
- 价值所在:在工程深度(身份验证、内容审核、安全、数据模型)与实用商业价值(可部署的博客/SaaS 基础架构)之间取得平衡。
- 部署目标:Render + PostgreSQL,支持基于环境的配置。
## 致招生委员会
本项目证明了超越 CRUD 实现的应用软件工程技能:
- 全栈负责:设计并实现了前端 UX、后端 API 层和持久层。
- 安全工程:CSRF 防护、会话安全、密码哈希、速率限制和加固的 HTTP 头。
- 数据建模:规范化的关系型 schema(用户/文章/评论/反应/书签/通知/管理员审计日志)及索引策略。
- 访问控制设计:分层授权(普通用户、晋升管理员、超级管理员)及明确的策略执行。
- 可靠性思维:健康检查端点、启动时的 schema 初始化、环境驱动的行为以及面向反向代理的部署加固。
## 致客户/产品买家
Dynamic Blogs 可作为内容业务 MVP 的稳健基础,可直接出售或使用:
- 支持发布工作流:用户发帖、审核工具、社区互动功能。
- 缩短上市时间:架构可部署,服务器入口清晰,静态前端开箱即用。
- 可扩展基础:易于添加付费功能(支付、付费内容、分析、Newsletter、媒体上传)。
- 运维友好:基于环境的配置、健康检查,在 Render 上托管简单直接。
- 成本意识开发:SMTP 可选的回退模式,允许在购买服务商套餐前测试邮件流程。
## 核心功能
- 账户体系:注册、登录、登出、会话身份验证。
- 文章管理:创建、编辑、删除、标记/取消标记(管理员)、分类/标签支持。
- 讨论层:带回复的嵌套评论、编辑/删除权限。
- 互动:有用/无用反应及文章书签。
- 通知:提及、审核操作、反应/评论以及晋升事件。
- 个人资料:用户资料页、编辑资料、头像预设、密码修改。
- 搜索:支持标题/正文/标签/作者的搜索端点,用于 Feed 过滤。
## 管理系统
- 单一超级管理员模型,支持晋升管理员。
- 管理员工具包括用户列表、作者认证控制、管理员晋升/降级以及超级管理员权限转移。
- 为重要管理操作提供审计追踪支持。
- 管理员凭证可通过 API 端点安全更新。
## 邮箱验证状态
- 邮箱验证的 UI 和 API 已实现。
- SMTP 为可选项;当未配置 SMTP 时,验证码将输出到服务器日志。
- 可通过 `REQUIRE_EMAIL_VERIFICATION` 配置验证的强制程度:
- `0`(默认):仅登录流程,受保护的写入操作不强制要求验证。
- `1`:指定的写入操作需要已验证的邮箱。
## 安全态势
- 密码使用 bcrypt(旧的 SHA-256 哈希在成功登录时自动迁移)。
- 会话 Cookie 在生产环境中为 `httpOnly`、`sameSite=strict`、`secure`。
- 通过 Token 头对变更请求进行 CSRF 防护。
- 针对身份验证、验证、重发和写入操作的内存速率限制器。
- 安全头:CSP、HSTS(生产环境)、X-Frame-Options、nosniff 以及 referrer 策略。
## 架构概览
- 后端入口:`server.js`(Express 应用、中间件、API 路由、启动流程)。
- 数据层:`db.js`(PostgreSQL 连接池、schema 引导、封装辅助函数)。
- 邮件集成:`email.js`(SMTP 传输器 + 回退行为)。
- 前端交付:`public/` 下的静态页面/脚本。
## 技术栈
- 后端:Node.js 18+、Express 5、express-session、pg。
- 数据库:PostgreSQL。
- 前端:`public/` 下的静态 HTML 页面 + 原生 JS + CSS。
## 前置条件
- Node.js 18+
- npm
- PostgreSQL 数据库连接 URL
## 快速开始
```
npm install
```
从 `.env.example` 创建 `.env`:
Windows PowerShell:
```
Copy-Item .env.example .env
```
macOS/Linux:
```
cp .env.example .env
```
启动服务器:
```
npm start
```
应用默认 URL:`http://localhost:3000`
## 环境配置
部署必需:
- `DATABASE_URL`
- `SESSION_SECRET`(生产环境需 16+ 字符)
常用运行时变量:
- `NODE_ENV`(在 Render 上设为 `production`)
- `PORT`(Render 自动注入)
- `TRUST_PROXY=1`(在 Render 代理后推荐设置)
- `SESSION_NAME`(可选;默认 `sid`)
- `BCRYPT_ROUNDS`(默认 `12`,范围 `8-14`)
- `REQUIRE_EMAIL_VERIFICATION`(`0` 或 `1`)
管理员引导变量:
- `ADMIN_USERNAME`
- `ADMIN_PASSWORD`
- `ADMIN_EMAIL`
- `ADMIN_RESET_ON_BOOT=1`(一次性恢复/重置模式)
SMTP 变量(可选):
- `SMTP_HOST`
- `SMTP_PORT`
- `SMTP_USER`
- `SMTP_PASS`
- `SMTP_FROM`
## 数据库行为
- Schema 在启动时自动初始化。
- 主要表包括 users、posts、comments、reactions、bookmarks、notifications 以及 admin audit logs。
- 为常见查询路径自动创建索引。
## 部署到 Render
构建命令:
```
npm install
```
启动命令:
```
npm start
```
在 Render 控制台设置环境变量:
- `NODE_ENV=production`
- `DATABASE_URL`
- `SESSION_SECRET`
- `TRUST_PROXY=1`
- 管理员引导变量(`ADMIN_USERNAME`、`ADMIN_PASSWORD`、`ADMIN_EMAIL`)
健康检查端点:
- `/api/health`
## 商业就绪用例
- 个人品牌或编辑团队的数字出版平台。
- 带审核控制的内部知识库或社区门户。
- 以用户生成内容为核心的创作者平台 SaaS 启动项目。
- 用于自由职业/客户获取的作品级演示。
## 已知限制
- 速率限制基于内存(单实例行为)。
- 尚无密码重置流程。
- 无文件上传/媒体存储。
- 无 OAuth/SSO。
## 故障排查
- 启动失败:检查 `DATABASE_URL`、PostgreSQL 网络访问权限以及 Node 版本。
- 生产环境登录/会话问题:验证 `SESSION_SECRET` 和 `TRUST_PROXY=1`。
- CSRF 错误:确保前端包含 `public/csrf.js` 并在写入时发送 Token。
- 验证邮件未发送:设置 SMTP 变量或使用控制台回退日志。
- 管理员被锁定:使用 `ADMIN_RESET_ON_BOOT=1` 并设置新的 `ADMIN_PASSWORD`,部署一次后禁用。
## 项目说明
- 主服务器入口:`server.js`
- 静态客户端文件:`public/`
- 数据库层 + schema 初始化:`db.js`
- 邮件辅助:`email.js`
## 界面展示
**主页**
**未登录状态**
**以普通用户身份登录**
**以晋升管理员身份登录**
**以超级管理员身份登录**
**搜索文章/故事**
**文章/故事排序**
**文章/故事列表**
**注册新账户**
**登录现有账户**
**邮箱验证**
**个人资料按钮(无未读通知)**
**个人资料按钮(有未读通知)**
**通知内部**
**用户/作者资料**
**晋升管理员资料**
**超级管理员资料**
**创建文章/故事**
**单篇文章/故事(未被标记)**
**单篇文章/故事(已被标记)**
**更多菜单(单篇文章/故事)**
**单篇文章/故事页面(文章/故事末尾)**
**阅读模式**
**评论(单层)**
**评论(嵌套)**
**书签(无收藏)**
**书签(已收藏文章/故事)**
**管理员管理(仅晋升管理员和超级管理员)**
**用户列表(仅超级管理员)**
**用户资料信息(仅超级管理员)**
**编辑资料(普通用户 + 晋升管理员)**
**编辑资料(超级管理员)**
**管理员验证作者**

**未登录状态**
**以普通用户身份登录**
**以晋升管理员身份登录**
**以超级管理员身份登录**
**搜索文章/故事**
**文章/故事排序**
**文章/故事列表**
**注册新账户**
**登录现有账户**
**邮箱验证**
**个人资料按钮(无未读通知)**
**个人资料按钮(有未读通知)**
**通知内部**
**用户/作者资料**
**晋升管理员资料**
**超级管理员资料**
**创建文章/故事**
**单篇文章/故事(未被标记)**
**单篇文章/故事(已被标记)**
**更多菜单(单篇文章/故事)**
**单篇文章/故事页面(文章/故事末尾)**
**阅读模式**
**评论(单层)**
**评论(嵌套)**
**书签(无收藏)**
**书签(已收藏文章/故事)**
**管理员管理(仅晋升管理员和超级管理员)**
**用户列表(仅超级管理员)**
**用户资料信息(仅超级管理员)**
**编辑资料(普通用户 + 晋升管理员)**
**编辑资料(超级管理员)**
**管理员验证作者**

标签:CISA项目, CMS, CSRF防护, Express, MITM代理, MVP, Node.js开发, PostgreSQL, RBAC, REST API, SaaS基础架构, SQL数据库, Web安全, 全栈博客平台, 内容审核, 内容管理系统, 后端开发, 响应式设计, 多模态安全, 审计日志, 数据可视化, 权限管理, 模型越狱, 测试用例, 用户认证, 社区互动, 蓝队分析, 评论系统, 通知系统, 项目部署