Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

答辩准备.md

班级留言板 — 云平台综合实训答辩


一、项目概述

项目名称:班级留言板(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):新消息、新回复、在线人数

📊 数据统计

  • 总览卡片:用户数/留言数/今日留言/反应数/访问量/在线人数
  • 反应分布柱状图、分类分布标签云
  • 活跃用户排行榜(金银铜奖牌)

🔍 搜索筛选

  • 关键词搜索(同时匹配内容+用户名)
  • 分类标签筛选
  • 收藏功能(本地存储)
  • 最新/最热/最早排序

📂 留言归档

  • 独立归档页面,大列表浏览
  • 搜索+排序支持

四、Kubernetes 部署架构

┌──────────────────────────────────────────────────────┐
│            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)

六、答辩要点

Q1:为什么选原生 JavaScript 而不是 Vue/React?

:实训重点是云原生部署全流程(容器化→编排→K8s),不是前端框架。原生 JS 零依赖、构建简单、镜像体积小,更能体现"从代码到容器到集群"的完整链路。实际项目中可根据需求选用框架。

Q2:数据库有7张表,表间关系是怎样的?

  • users 1:N messages(一个用户发多条留言)
  • users 1:N replies(一个用户回多条回复)
  • users 1:N reactions(一个用户给多个反应)
  • messages 1:N replies(一条留言有多条回复)
  • messages 1:N reactions(一条留言有多个反应)
  • users 1:N reports(举报关系)
  • op_logsvisits 是独立辅助表

Q3:Socket.IO 在 K8s 中如何保证多副本通信?

:当前单副本(replicas:1)。如果扩展多副本,需要用 Redis Adapter 或使用 sessionAffinity 将同一客户端固定到同一 Pod。对于实训场景,单副本足够。

Q4:ConfigMap 更新后前端配置会自动生效吗?

:不会。ConfigMap 挂载到 Pod 后不会自动热更新。需要 kubectl rollout restart deployment 重启 Pod。我们在前端使用独立的 config.js 文件通过 ConfigMap 注入,修改配置只需更新 ConfigMap + 重启 Deployment。

Q5:安全性方面做了哪些考虑?

  • 密码 bcrypt 加盐哈希存储(cost=10)
  • JWT Token 认证 + 过期机制(24h)
  • 敏感词过滤(可配置词库)
  • 频率限制(3秒/用户)
  • 角色权限控制(管理员/老师/学生)
  • 敏感信息用 K8s Secret 管理(base64编码)

Q6:为什么 MySQL 用 StatefulSet 而不是 Deployment?

:StatefulSet 保证 Pod 的有序部署和稳定的网络标识(message-db-0.message-db-service),配合 PVC 实现数据持久化。Deployment 的 Pod 是"无状态"的,Pod 重建后数据丢失。

Q7:Docker Compose 和 K8s 的关系是什么?

: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 编排

About

大三下实训 - 留言板项目

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages