JBake 架构作品集 - 愿景与用例
发布于 15 January 2026
建筑愿景
指导原则
架构基于*关注点分离*的原则:
-
内容 : 结构丰富的 AsciiDoc 文件,带有丰富的元数据
-
Presentation : 可重用的 Thymeleaf 模板
-
数据 : 由 JBake 自动从 AsciiDoc 属性提取的模型
-
样式 : Bootstrap 5 用于视觉一致性
战略选择:AsciiDoc 用于投资组合
为什么 AsciiDoc ?
| 标准 | �优势 |
|---|---|
一致性 |
与博客文章相同的格式 |
元数据 |
结构化和可扩展的属性 ( |
可维护性 |
简单文本编辑,可由 Git 版本控制 |
灵活性 |
可以包含丰富内容 (表格, 代码, 图片) |
模板 |
JBake 自动提取 Thymeleaf 的属性 |
数据模型
每个投资组合项目都是一个 AsciiDoc 文档,包含:
-
表头元数据 : 结构化信息(客户、时长、技术等)
-
文档正文 : 叙事描述, 挑战, 解决方案, 结果
-
自定义属性 : 前缀`project-*`用于自动提取
@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false
class ProjetAsciiDoc {
+titre: String
+jbake-type: "项目"
+jbake-status: published|draft
+jbake-date: Date
+jbake-tags: List<String>
--
+project-category: String
+project-client: String
+project-duration: String
+project-role: String
+project-thumbnail: String
+project-gallery: List<String>
+project-tech-stack: String
+project-highlights: List<String>
+project-demo-url: String
+project-github-url: String
--
+body: HTML (converti)
}
class JBakeEngine {
+parse(asciidoc)
+extractMetadata()
+convertToHTML()
}
class ThymeleafTemplate {
+portfolio.html
+project.html
+partials/project-card.html
}
class PortfolioPage {
+published_projects: List
+filtres: categories
}
ProjetAsciiDoc --> JBakeEngine : 解析
JBakeEngine --> ThymeleafTemplate : 提供数据
ThymeleafTemplate --> PortfolioPage : 生成
@enduml
详细用例
UC1 : 添加一个元素到投资组合
额定通量
@startuml skinparam backgroundColor #FEFEFE actor Développeur as dev participant "编辑器\n文本" as editor participant "文件\nAsciiDoc" as file participant "JBake\n引擎" as jbake participant "站点\n静态" as site dev -> editor : 创建新文件 activate editor editor -> file : portfolio/nouveau-projet.adoc activate file dev -> editor : 编写带元数据的标题\n(titre, type=project, status=published,\nattributs project-*) dev -> editor : 撰写叙事内容\n(背景、挑战、解决方案) dev -> editor : 在 assets/img/portfolio/ 中添加图片 editor -> file : 保存 deactivate editor dev -> jbake : 启动构建 (jbake -b) activate jbake jbake -> file : 读取并解析 jbake -> jbake : 提取元数据 jbake -> jbake : 将 AsciiDoc 转换为 HTML jbake -> jbake : 应用模板 project.html jbake -> jbake : 添加到列表 portfolio.html jbake -> site : 生成静态页面 deactivate jbake dev -> site : 检查结果 activate site site --> dev : 显示项目 deactivate site @enduml
要创建的文件模板
开发者创建`content/portfolio/nom-projet.adoc`具有标准化的结构:
-
包含所有必需属性的标题
-
标准化部分(背景、挑战、解决方案、结果)
-
图像的一致命名
验证点
-
必需的属性已存在 (
jbake-type,jbake-status,project-thumbnail) -
引用的图像存在于`assets/img/portfolio/`
-
JBake 构建成功,无错误
-
项目出现在作品集页面上
-
单个项目页面显示正常
UC2 : 删除投资组合中的一项
标称通量
@startuml skinparam backgroundColor #FEFEFE actor Développeur as dev participant "系统\n文件" as fs participant "JBake\n引擎" as jbake participant "站点\n静态" as site database "缓存\nJBake" as cache dev -> fs : 删除 portfolio/projet-ancien.adoc activate fs fs --> dev : 文件已删除 deactivate fs dev -> fs : (可选) 删除关联的图像\nassets/img/portfolio/projet-ancien-* activate fs fs --> dev : 已删除的图片 deactivate fs dev -> cache : 清除缓存 JBake activate cache cache --> dev : 缓存已清空 deactivate cache dev -> jbake : 完整重建(jbake -b) activate jbake jbake -> jbake : 扫描内容/portfolio/ jbake -> jbake : 项目缺失 → 未生成 jbake -> jbake : 重新生成 portfolio.html\n(不包括已删除的项目) jbake -> site : 部署新构建 deactivate jbake dev -> site : 检查 activate site site --> dev : 项目不在列表中 deactivate site @enduml
替代策略:归档
而不是永久删除,可以创建一个文件夹`content/portfolio/archive/`:
-
移动文件而不是删除它
-
可以轻松恢复
-
保持 Git 历史更清晰
资源清理
-
检查孤立的图像在`assets/img/portfolio/`
-
删除未被其他项目引用的图片
-
清理 JBake 缓存以避免幽灵引用
UC3 : 设置为未发布(草稿)
�额定通量
@startuml skinparam backgroundColor #FEFEFE actor Développeur as dev participant "文件\nAsciiDoc" as file participant "JBake\n引擎" as jbake participant "站点\n静态" as site dev -> file : 打开 portfolio/projet.adoc activate file dev -> file : 修改属性\n:jbake-status: published\n↓\n:jbake-status: draft file --> dev : 已保存 deactivate file dev -> jbake : 重新构建 (jbake -b) activate jbake jbake -> file : 解析文件 jbake -> jbake : 检测 status=draft jbake -> jbake : 从 published_projects 中排除 jbake -> jbake : 不要创建公开页面 note right 该项目仍然存在,但未发布。 end note jbake -> site : 生成站点 (不含此项目) deactivate jbake dev -> site : 检查投资组合 activate site site --> dev : 项目未在公开列表中 deactivate site @enduml
可能的状态
@startuml skinparam backgroundColor #FEFEFE [*] --> Draft : Création initiale Draft --> Published : 验证与发布 Published --> Draft : 临时撤回 Draft --> Archived : 已废弃的项目 Published --> Archived : 过时的项目 Archived --> [*] : 永久删除 Published --> Published : 更新 note right of Draft :jbake-status: draft 公开不可见 有助于进行中的项目 end note note right of Published :jbake-status: 已发布 在作品组中可见 由 JBake 索引 end note note right of Archived 已移至 archive/ 或 jbake-status: 已归档 未发布但保留 end note @enduml
典型用例
-
项目正在起草中 : 创建草稿,准备好后发布
-
临时保密项目:切换到草稿,等待客户确认
-
重大更新:切换到草稿,编辑,重新发布
-
A/B testing : 在草稿中复制,测试,发布最佳版本
模板化架构
可重用模板的策略
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "模板 Thymeleaf" {
component [index.html] as index
component [portfolio.html] as portfolio
component [project.html] as project
package "局部" {
component [header.html] as header
component [footer.html] as footer
component [project-card.html] as card
component [tech-badge.html] as badge
component [gallery.html] as gallery
}
}
package "数据 JBake" {
database "published_projects" as data
database "内容 (项目)" as content
}
index --> header
index --> footer
portfolio --> header
portfolio --> footer
portfolio --> card
data --> portfolio : 迭代
project --> header
project --> footer
project --> badge
project --> gallery
content --> project : 个人项目
note right of card
可复用的片段
用于显示项目卡片:
- 缩略图
- 标题
- 标签
- 亮点
end note
@enduml
数据提取模式
JBake 会自动将 AsciiDoc 属性转换为在 Thymeleaf 中可访问的属性:
@startuml
skinparam backgroundColor #FEFEFE
rectangle "AsciiDoc 文档" {
(":project-client: Acme Corp") as attr1
(":project-duration: 6个月") as attr2
(":项目标签: java, react") as attr3
}
rectangle "JBake 模板" {
(content['project-client']) as prop1
(content['project-duration']) as prop2
(content.tags) as prop3
}
rectangle "Thymeleaf 模板" {
(th:text="${project['project-client']}") as tmpl1
(th:text="${project['project-duration']}") as tmpl2
(th:each="标签:${project.tags}") as tmpl3
}
attr1 --> prop1 : parsing
attr2 --> prop2 : parsing
attr3 --> prop3 : parsing
prop1 --> tmpl1 : binding
prop2 --> tmpl2 : binding
prop3 --> tmpl3 : binding
@enduml
命名约定
-
项目属性 : 前缀`project-*` (ex:
project-client,project-tech-stack) -
文件 : kebab-case (例如:`ecommerce-platform.adoc`)
-
图片 : 前缀 项目名称 (例如:`ecommerce-platform-thumb.jpg`)
-
模板 : 功能名称 (例如:
project-card.html,tech-badge.html)
发布工作流
开发流水线
@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false
class ProjetAsciiDoc {
+titre: String
+jbake-type: "项目"
+jbake-status: published|draft
+jbake-date: Date
+jbake-tags: List<String>
__
+project-category: String
+project-client: String
+project-duration: String
+project-role: String
+project-thumbnail: String
+project-gallery: List<String>
+project-tech-stack: String
+project-highlights: List<String>
+project-demo-url: String
+project-github-url: String
__
+body: HTML (converti)
}
class JBakeEngine {
+parse(asciidoc)
+extractMetadata()
+convertToHTML()
}
class ThymeleafTemplate {
+portfolio.html
+project.html
+partials/project-card.html
}
class PortfolioPage {
+published_projects: List
+filtres: categories
}
ProjetAsciiDoc --> JBakeEngine : 解析
JBakeEngine --> ThymeleafTemplate : 提供数据
ThymeleafTemplate --> PortfolioPage : 生成
@enduml
环境
| 环境 | 用法 | 已接受状态 |
|---|---|---|
本地 |
开发和预览 |
草稿,已发布 |
布置 |
�预生产验证 |
仅发布 |
生产 |
公开网站 |
仅发布 |
可扩展性
添加新属性
为丰富数据模型,只需添加带前缀的新属性`project-*`:
-
`project-awards`奖项与表彰
-
`project-testimonial`客户引用
-
project-team-size: 团队规模 -
project-budget-range�预算范围
这些属性会在模板中自动可用,无需修改JBake引擎。
高级分类
@startuml
skinparam backgroundColor #FEFEFE
object Projet {
project-category = "网页"
project-subcategory = "电子商务"
project-industry = "零售"
project-complexity = "高"
}
object Taxonomie {
categories : [web, mobile, data, devops]
subcategories : Map<category, List>
industries : [retail, finance, healthcare, ...]
complexities : [low, medium, high]
}
Projet --> Taxonomie : 根据...分类
note right of Taxonomie
允许多条件过滤
在模板 portfolio.html 中
通过 JavaScript 或服务器端
end note
@enduml
最佳实践
文件组织
-
一个文件 = 一个项目 : 避免混合多个项目
-
专用文件夹中的图像
assets/img/portfolio/nom-projet/ -
一致的命名 : 便于查找和维护
-
Versioning Git : 完全追踪修改
内容管理
-
默认草稿状态 : 仅在准备好时发布
-
发布前评审 : 质量和保密性验证
-
完整元数据:填写所有相关字段
-
丰富的叙事内容 : 不要仅限于元数据
性能
-
优化图片 : 提交前压缩
-
如需分页 : 如果项目数量超过20
-
Lazy loading : 图库图片按需加载
-
浏览器缓存:适用于资源的适当标头
结论
此架构允许:
-
使用简便 : 添加一个项目 = 创建一个文本文件
-
灵活性 : 可通过新属性扩展
-
可维护性 : 分离 内容/表现
-
可追溯性 : 完整的 Git 版本控制
-
自动化 : 可实现持续构建和部署
选择 AsciiDoc 能够与网站其余部分保持一致,同时提供专业投资组合所需的丰富元数据。
相关文章
31 May 2026
14 May 2026
12 May 2026