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` ## 界面展示 **主页** 主页截图 2026-03-04 010652 Screenshot 2026-03-04 010721 Screenshot 2026-03-04 010735 **未登录状态** 主页截图 2026-03-04 013201 **以普通用户身份登录** 主页截图 2026-03-04 010758 **以晋升管理员身份登录** 主页截图 2026-03-04 012025 **以超级管理员身份登录** 主页截图 2026-03-04 021123 **搜索文章/故事** 主页截图 2026-03-04 013201 Screenshot 2026-03-04 012457 Screenshot 2026-03-04 012533 **文章/故事排序** 主页截图 2026-03-04 012025 Screenshot 2026-03-04 012601 Screenshot 2026-03-04 012610 **文章/故事列表** 主页截图 2026-03-04 021327 Screenshot 2026-03-04 010812 **注册新账户** 主页截图 2026-03-04 013230 **登录现有账户** 主页截图 2026-03-04 013250 **邮箱验证** image **个人资料按钮(无未读通知)** 主页截图 2026-03-04 010843 **个人资料按钮(有未读通知)** 主页截图 2026-03-04 012601 Screenshot 2026-03-04 011653 **通知内部** 主页截图 2026-03-04 011702 **用户/作者资料** image Screenshot 2026-03-04 010926 Screenshot 2026-03-04 010939 **晋升管理员资料** image Screenshot 2026-03-04 011733 Screenshot 2026-03-04 011747 image Screenshot 2026-03-04 011820 **超级管理员资料** 主页截图 2026-03-04 012710 image Screenshot 2026-03-04 012923 Screenshot 2026-03-04 013037 Screenshot 2026-03-04 013131 **创建文章/故事** 主页截图 2026-03-04 011207 Screenshot 2026-03-04 011232 **单篇文章/故事(未被标记)** 主页截图 2026-03-04 022019 **单篇文章/故事(已被标记)** 主页截图 2026-03-04 011304 **更多菜单(单篇文章/故事)** 主页截图 2026-03-04 011520 **单篇文章/故事页面(文章/故事末尾)** 主页截图 2026-03-04 011545 **阅读模式** 主页截图 2026-03-04 011559 Screenshot 2026-03-04 011608 Screenshot 2026-03-04 011617 **评论(单层)** 主页截图 2026-03-04 011327 **评论(嵌套)** 主页截图 2026-03-04 011444 **书签(无收藏)** 主页截图 2026-03-04 011932 **书签(已收藏文章/故事)** 主页截图 2026-03-04 012006 **管理员管理(仅晋升管理员和超级管理员)** 主页截图 2026-03-04 011838 image Screenshot 2026-03-04 011859 **用户列表(仅超级管理员)** image **用户资料信息(仅超级管理员)** image Screenshot 2026-03-04 013006 **编辑资料(普通用户 + 晋升管理员)** image Screenshot 2026-03-04 011031 Screenshot 2026-03-04 011143 **编辑资料(超级管理员)** 主页截图 2026-03-04 012739 Screenshot 2026-03-04 012755 **管理员验证作者** image
标签:CISA项目, CMS, CSRF防护, Express, MITM代理, MVP, Node.js开发, PostgreSQL, RBAC, REST API, SaaS基础架构, SQL数据库, Web安全, 全栈博客平台, 内容审核, 内容管理系统, 后端开发, 响应式设计, 多模态安全, 审计日志, 数据可视化, 权限管理, 模型越狱, 测试用例, 用户认证, 社区互动, 蓝队分析, 评论系统, 通知系统, 项目部署