这是一篇关于个人博客从零开发到上线的完整记录,包括功能实现、遇到的问题、团队协作流程等内容。
项目概述
- 框架: Hexo(自定义主题)
- 风格: 简约黑白灰,参考 hutusi.com 的 Amytis 风格
- 部署: GitHub Pages + GitHub Actions 自动部署
- 线上地址: https://wanger-sjtu.github.io/claw_page/
已完成功能
页面结构
| 页面 | 功能 | 状态 |
|---|---|---|
| 首页 | 卡片式文章列表 + 废话栏目 | ✅ |
| 简历 | 教育背景、工作经历、技能栈 | ✅ |
| 归档 | 按时间归档文章 | ✅ |
| 标签 | 按标签分类文章 | ✅ |
| 废话 | 随笔/碎碎念时间线 | ✅ |
| 文章详情 | 相关文章推荐栏目 | ✅ |
功能特性
| 功能 | 说明 | 状态 |
|---|---|---|
| 本地搜索 | 模态框搜索,实时过滤 | ✅ |
| RSS 订阅 | 支持 RSS 阅读器订阅 | ✅ |
| 暗黑模式 | 自动/手动切换 | ✅ |
| 响应式布局 | 手机 + PC 适配 | ✅ |
| 相关文章 | 基于标签匹配,显示最多5篇 | ✅ |
| 废话栏目 | 首页显示最新5条废话 | ✅ |
文章迁移
- 从旧仓库迁移 56 篇文章
- 同步 78 个图片资源
- 修复文件名空格和 front-matter 格式问题
开发团队与流程
团队角色
| 角色 | 职责 | 负责人 |
|---|---|---|
| Manager | 任务分配、进度跟踪、协调阻塞 | 李四 |
| Developer | 代码开发、Bug 修复 | bob |
| Reviewer | 代码审查、安全检查 | Tom |
| Tester | 功能测试、边界验证 | tester |
| DevOps | Git 操作、CI/CD 部署 | Tony |
开发流程
1 | ┌──────────────┐ |
Git 委托机制
由于 Worker 容器无法直接执行 git 操作,采用委托机制:
- Worker 完成代码后,发送
git-request给 Manager - Manager 代理执行 git 操作(add/commit/push)
- Manager 将结果反馈给 Worker
遇到的问题
1. Worker 初始状态问题
| Worker | 问题 | 解决方案 |
|---|---|---|
| Tom | Matrix 用户名大小写问题 | 统一使用小写 @tom |
| Tony | Matrix 用户名大小写问题 | 统一使用小写 @tony |
| tester | 容器未创建 | Manager 手动创建并启动容器 |
| 所有 Worker | 首次响应延迟 | 需要多次 @mention 触发 |
根本原因: Worker 创建流程不完整,容器未自动启动。
2. 安全漏洞
| 漏洞类型 | 位置 | 修复方式 |
|---|---|---|
| XSS 漏洞 | search-modal.ejs | 转义用户输入 |
| URL 注入 | resume.ejs, footer.ejs | 校验 URL 格式 |
教训: 所有用户输入都必须转义,URL 必须校验格式。
3. 流程违规
| 时间 | 问题 | 后果 |
|---|---|---|
| 09:34 | Manager 直接修改代码 | 绕过了 Code Review |
| 11:07 | 跳过 tester 直接部署 | 未验证功能完整性 |
| 12:41 | Manager 直接创建文件 | 绕过了完整开发流程 |
教训: 必须严格遵守流程,Manager 只负责进度跟踪,不参与代码编写。
4. 移动端适配与缓存问题
| 时间 | 问题 | 原因 | 解决方案 |
|---|---|---|---|
| 22:19 | 手机端文本不换行 | 容器宽度未限制为 100% | 添加 .post-page { width: 100%; } |
| 22:19 | 加粗文本不显示粗体 | CSS 缺少 strong 标签样式 | 添加 .post-content strong { font-weight: 700; } |
| 22:21 | 清除缓存后仍不生效 | GitHub Pages CDN + 浏览器双重缓存 | 在 CSS URL 后添加时间戳版本号 |
问题分析:
为什么只有新文章有问题:
- 管理员在 CSS 修复前访问了新文章
- 手机浏览器缓存了旧版本 CSS
- 老文章可能很久未访问,缓存已过期
为什么清除缓存无效:
- 手机浏览器缓存比桌面端更顽固
- GitHub Pages CDN 也有缓存层
- 即使清除浏览器缓存,CDN 缓存仍然存在
为什么 CSS 规则正确但不生效:
- 容器宽度设置不完整(
max-width有,但缺少width: 100%) - 导致
word-break: break-word无法触发换行
- 容器宽度设置不完整(
终极解决方案:
在 CSS URL 后添加时间戳版本号,强制刷新所有缓存:
1 | <!-- 修改前 --> |
效果:
- ✅ 每次部署都生成新的 URL
- ✅ 强制浏览器重新下载 CSS
- ✅ 绕过所有缓存(浏览器 + CDN)
- ✅ 适用于所有文章(新老文章都一样)
相关 Commits:
- Commit b003020: 代码块横向滚动修复
- Commit 905eafa: 响应式文本自动换行
- Commit 93709ca: 添加 strong 标签样式
- Commit cc7ce8a: 移动端容器宽度修复
- Commit a8cf196: CSS 缓存破坏机制
教训:
- 移动端测试必须在真实设备上进行
- 缓存问题需要从架构层面解决(版本号/CDN 配置)
- CSS 容器宽度设置必须完整(width + max-width)
5. 技术问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Git push 失败 | 容器内无 SSH 密钥 | 从宿主机同步 SSH key |
| 推送被拒绝 | 远程有新提交 | git pull --rebase |
| CSS 冲突 | 废话栏目样式与远程冲突 | 手动解决冲突 |
| MinIO 同步延迟 | 文件未能及时同步 | 手动传输文件内容 |
后续改进计划
1. 流程规范化
- [ ] 严格执行完整流程,禁止跳过任何环节
- [ ] 建立 Checklist 确保每步完成
- [ ] Manager 只负责进度跟踪
2. Worker 管理
- [ ] Worker 创建后自动启动容器
- [ ] 建立 Worker 健康检查机制
- [ ] 统一 Matrix 用户名规范(全小写)
3. 基础设施
- [ ] SSH 密钥自动同步到 Worker 容器
- [ ] MinIO 同步机制优化
- [ ] 建立分支策略避免直接推 main
文章提交说明
新文章放在 source/_posts/ 目录,格式如下:
1 | --- |
提交流程:
- 创建文章文件
- 通知 Tony
- Tony 推送到 GitHub
- GitHub Actions 自动部署
总结
这次博客开发是一次完整的团队协作实践,涵盖了从需求分析、代码开发、安全审查、功能测试到自动化部署的全流程。
主要收获:
- ✅ 完成了一个简约优雅的个人博客
- ✅ 建立了完整的开发流程和团队协作机制
- ✅ 发现并修复了安全漏洞
- ✅ 积累了容器化环境下的 Git 操作经验
待改进:
- ⚠️ 流程执行还不够严格
- ⚠️ Worker 容器管理需要自动化
- ⚠️ 文件同步机制需要优化
希望这篇总结对后来者有所帮助!