项目名称:班级留言板(Message Board)
项目定位:前后端分离的全栈 Web 应用,涵盖容器化、Docker Compose 编排、Kubernetes 部署的完整 DevOps 流程。
核心功能:班级师生在线交流平台,支持发布留言、表情反应、回复讨论、搜索、排行榜等社交功能。
| 指标 | 数据 |
|---|---|
| 注册用户 | 19人(含学生/老师/管理员) |
| 总留言数 | 38条 |
| 总反应数 | 52次 |
| 总回复数 | 21条 |
| 页面访问 | 3次 |
┌─────────────────────────────────────────────────────────┐
│ 用户浏览器 │
│ http://localhost:3001 │
└─────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 前端 Nginx (Docker 容器) │
│ - 静态资源托管 (HTML/JS/CSS) │
│ - API 反向代理 → /api/ /messages/ /socket.io/ │
│ - WebSocket 代理 (Socket.IO) │
└─────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 后端 Node.js + Express (Docker 容器) │
│ - RESTful API (Express) │
│ - JWT 身份认证 (jsonwebtoken) │
│ - 密码加密 (bcryptjs) │
│ - 实时通信 (Socket.IO) │
│ - 敏感词过滤 │
│ - 频率限制中间件 │
└─────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 数据库 MySQL 5.7 (Docker 容器) │
│ - 7张表:users, messages, replies, reactions, │
│ op_logs, visits, reports │
│ - 字符集:utf8mb4 │
│ - 数据持久化:Docker Volume │
└─────────────────────────────────────────────────────────┘
| 层级 | 技术 | 说明 |
|---|---|---|
| 前端 | Nginx 1.25 + 原生 JS (SPA) | 单页应用,ConfigMap 注入配置 |
| 后端 | Node.js 20 + Express 4.18 | REST API,Socket.IO 实时通信 |
| 数据库 | MySQL 5.7 | 关系型存储,字符集 utf8mb4 |
| 认证 | JWT (jsonwebtoken) | 24小时过期,Bearer Token |
| 加密 | bcryptjs | 密码哈希存储(cost=10) |
| 容器化 | Docker + Docker Compose | 三服务编排 |
| 编排 | Kubernetes (K8s) | Deployment/StatefulSet/Service/ConfigMap/Secret |
- 三种角色:管理员(🛡️ 红)、老师(👨🏫 紫)、学生(🎓 绿)
- 注册/登录(JWT Token 认证)
- 个人中心:头像、成就徽章、统计信息、我的留言列表
- 修改密码、草稿自动保存
- 发布留言(支持 Markdown + 粘贴图片 + @提及)
- 留言分类:学习心得、问题反馈、实训总结
- 编辑/删除(本人或管理员)
- 置顶/批量操作(管理员)
- 无限滚动加载
- 5种表情反应:👍❤️😄😢🔥
- 回复楼层讨论(支持 @提及高亮)
- 热门标记(反应≥5 显示 🔥 徽章)
- 实时推送(WebSocket):新消息、新回复、在线人数
- 总览卡片:用户数/留言数/今日留言/反应数/访问量/在线人数
- 反应分布柱状图、分类分布标签云
- 活跃用户排行榜(金银铜奖牌)
- 关键词搜索(同时匹配内容+用户名)
- 分类标签筛选
- 收藏功能(本地存储)
- 最新/最热/最早排序
- 独立归档页面,大列表浏览
- 搜索+排序支持
┌──────────────────────────────────────────────────────┐
│ Namespace: message-board │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │
│ │ Frontend │ │ API │ │ MySQL │ │
│ │ Deployment │ │ Deployment │ │ StatefulSet │ │
│ │ replicas:1 │ │ replicas:1 │ │ replicas:1 │ │
│ │ image:v2 │ │ image:v3 │ │ mysql:5.7 │ │
│ └──────┬──────┘ └──────┬───────┘ └──────┬──────┘ │
│ │ │ │ │
│ ┌──────▼──────┐ ┌──────▼───────┐ ┌──────▼──────┐ │
│ │ Service │ │ Service │ │ Service │ │
│ │ NodePort │ │ NodePort │ │ ClusterIP │ │
│ │ :30001 │ │ :30080 │ │ :3306 │ │
│ └─────────────┘ └──────────────┘ └─────────────┘ │
│ │
│ ConfigMap: Secret: │
│ - frontend-config - db-secret (MYSQL_ROOT_PW, │
│ - db-init-sql DB_PASSWORD, JWT_SECRET) │
│ - mysql-config │
│ - db-migrate-sql │
│ │
│ PVC: mysql-pvc (1Gi) │
└──────────────────────────────────────────────────────┘
① 编写代码
├── 后端:server.js / db.js / auth.js
├── 前端:index.html / app.js / config.js
└── Nginx 配置:default.conf
│
② Docker 容器化
├── 后端 Dockerfile(node:20-alpine 多阶段)
├── 前端 Dockerfile(nginx:1.25-alpine)
└── docker-compose.yml(三服务 + 网络 + 数据卷)
│
③ 构建镜像 & 本地测试
├── docker compose build
├── docker compose up -d
└── 验证 http://localhost:3001
│
④ K8s 部署
├── kubectl apply -f k8s/namespace.yaml
├── kubectl apply -f k8s/db-secret.yaml
├── kubectl apply -f k8s/*-configmap.yaml
├── kubectl apply -f k8s/mysql-pvc.yaml
├── kubectl apply -f k8s/db-statefulset.yaml
├── kubectl apply -f k8s/db-service.yaml
├── kubectl apply -f k8s/api-deployment.yaml
├── kubectl apply -f k8s/api-service.yaml
├── kubectl apply -f k8s/frontend-deployment.yaml
└── kubectl apply -f k8s/frontend-service.yaml
│
⑤ 访问验证
└── http://<NodeIP>:30001 (前端 NodePort)
答:实训重点是云原生部署全流程(容器化→编排→K8s),不是前端框架。原生 JS 零依赖、构建简单、镜像体积小,更能体现"从代码到容器到集群"的完整链路。实际项目中可根据需求选用框架。
答:
users1:Nmessages(一个用户发多条留言)users1:Nreplies(一个用户回多条回复)users1:Nreactions(一个用户给多个反应)messages1:Nreplies(一条留言有多条回复)messages1:Nreactions(一条留言有多个反应)users1:Nreports(举报关系)op_logs、visits是独立辅助表
答:当前单副本(replicas:1)。如果扩展多副本,需要用 Redis Adapter 或使用
sessionAffinity将同一客户端固定到同一 Pod。对于实训场景,单副本足够。
答:不会。ConfigMap 挂载到 Pod 后不会自动热更新。需要
kubectl rollout restart deployment重启 Pod。我们在前端使用独立的config.js文件通过 ConfigMap 注入,修改配置只需更新 ConfigMap + 重启 Deployment。
答:
- 密码 bcrypt 加盐哈希存储(cost=10)
- JWT Token 认证 + 过期机制(24h)
- 敏感词过滤(可配置词库)
- 频率限制(3秒/用户)
- 角色权限控制(管理员/老师/学生)
- 敏感信息用 K8s Secret 管理(base64编码)
答:StatefulSet 保证 Pod 的有序部署和稳定的网络标识(
message-db-0.message-db-service),配合 PVC 实现数据持久化。Deployment 的 Pod 是"无状态"的,Pod 重建后数据丢失。
答:Docker Compose 用于本地开发测试(单机、简单),K8s 用于生产部署(集群、高可用)。两者的 YAML 配置结构不同,但核心概念对应:Compose Service ↔ K8s Deployment,Compose Volume ↔ K8s PVC,Compose Network ↔ K8s Service。
| 亮点 | 说明 |
|---|---|
| 🔄 全流程 | 从编码 → 容器化 → 编排 → K8s 部署,一条龙 |
| 🎨 UI/UX | 暗黑模式、Markdown、表情包、响应式布局 |
| 🔐 安全 | JWT + bcrypt + RBAC + 敏感词 + 限流 |
| ⚡ 实时 | WebSocket 推送:在线人数、新消息、新回复 |
| 🏆 成就系统 | 根据活跃度自动解锁徽章 |
| 📱 响应式 | 桌面端+移动端自适应 |
| 🌍 全中文 | 完整的本地化界面 |
message-board/
├── backend/
│ ├── server.js # Express API + Socket.IO
│ ├── db.js # MySQL 连接池
│ ├── auth.js # JWT 中间件
│ ├── Dockerfile # Node.js 镜像
│ └── package.json
├── frontend/
│ ├── index.html # SPA 页面 + CSS
│ ├── app.js # 核心逻辑 (222行)
│ ├── config.js # 动态配置
│ ├── default.conf # Nginx 反向代理
│ └── Dockerfile # Nginx 镜像
├── k8s/
│ ├── namespace.yaml
│ ├── db-secret.yaml
│ ├── db-init-configmap.yaml
│ ├── mysql-configmap.yaml
│ ├── mysql-pvc.yaml
│ ├── db-statefulset.yaml
│ ├── db-service.yaml
│ ├── api-deployment.yaml
│ ├── api-service.yaml
│ ├── frontend-configmap.yaml
│ ├── frontend-deployment.yaml
│ └── frontend-service.yaml
├── init.sql # 数据库初始化脚本
├── my.cnf # MySQL 配置
└── compose.yaml # Docker Compose 编排