2026.08.24 — LAB — 2 MIN

个人博客项目概述

大一暑假从零到上线的个人博客,Obsidian + GitHub + Spring Boot,完整拉通了一条从需求到部署的链路。


个人博客项目概述

这是我做的第一个完整上线的个人项目。

从想做一个东西的念头开始,到现在 https://vansye.asia 能访问了。第一次完整拉通了一个项目的全流程——从需求分析、设计、编码到部署上线。


项目背景

大一下学了 JavaWeb,跟着教程做过几个 CRUD 项目,但总觉得差点什么。面试的时候被问到「你做过什么项目」,能说都是教程里的东西,没有自己的东西。

所以决定:做一个真正属于自己的 JavaWeb 项目。

三个动机:面试加分项、学真正从零开始的东西、有一个地方持续记录学习历程。


功能特性

博客的核心功能:

  • 文章发布:写完 push 上去,博客自动更新
  • Markdown 渲染:代码块、图片、表格正常显示
  • 归档页:按时间浏览历史文章
  • About 页:介绍自己
  • 移动端适配:手机上也能正常阅读

架构上三条铁律:

  • vault 是唯一内容源,数据库只是派生读模型
  • 发布闸门 fail-closed,三重判定
  • GitHub 是传输层,不另造同步通道

技术要点

  • JGit:在 Java 里操作 git,fetch + diff 拿到变更文件清单
  • Redis SETNX:webhook 防重复投递锁
  • 内容哈希:幂等同步,同一 commit 多次同步结果一致
  • 纯静态前端:HTML + CSS,约 800 行,没有构建工具

项目结构

后端(Spring Boot)
├── PublicationGate   # 发布闸门(含单元测试)
├── MarkdownRenderer  # Markdown 渲染
├── SyncService       # Webhook + 轮询兜底
└── VaultPoller       # 定时全量同步

遇到的坑

SnakeYAML 布尔词表

publish: yes 会被解析为 Boolean.TRUE,不是 null。

图片路径

Obsidian 默认把附件放到 _assets/,但这个目录不在 git 白名单里——文章引用了图片,但图片没跟着 push,博客上全部裂开。

浅克隆

用 --depth 1 时,文章日期全是今天,部分图 404。


时间线

8/15「准备开始做个人网站博客」 → 8/24 上线,13 天完成全流程。


心得

做完这个项目最大的收获是:

从一个想法变成一个实际的东西——不是 demo,是实打实上线的项目。

技术上可能感觉没什么高深的,也就是做了一个简单的流程。但这个过程里学到的东西,比教程里的多得多。

以后再面对一个新项目,不会再是从零开始的迷茫,而是知道该从哪一步开始。


技术栈

  • Java, Spring Boot, JGit, SnakeYAML
  • MySQL, Redis
  • Docker Compose, nginx
  • HTML + CSS(纯静态,约 800 行)
End of plate