背景
长期从事前端开发之后,我希望建立一个真正属于自己的数字空间:既能展示工作经历与项目,也能持续承载新的作品、实验与文章。
因此我没有把它做成一个静态简历页面,而是从产品结构、设计系统、前后端架构、内容管理、媒体管理、身份认证到生产部署,完整构建了一套可以长期运行与持续维护的 Web 产品。
我的角色
独立完成产品设计、前端开发、后端开发、数据库设计与生产部署,并负责上线后的持续维护。
问题
如果把内容写死在页面里,每增加一个项目或一篇文章都需要改代码、重新构建、重新部署。
这样的结构无法长期承载持续增长的内容,也无法在不接触代码的情况下维护站点。
核心工作
- 先确定「内容必须能脱离代码维护」,因此把 Work / Lab / Writing / Experience 设计成内容类型,而不是写在页面里的文案
- 为长期运营补齐内容与媒体能力:CMS、媒体库与图片选择,让新增内容不需要改代码、也不需要重新部署
- 后台只对管理员开放,因此认证与权限校验放在后端完成,而不是靠前端隐藏入口
- 数据层选择关系型建模:内容、翻译与分类标签之间的关系由 PostgreSQL 承载,schema 与迁移由 Prisma 管理
- 前后端统一 TypeScript,并保持接口契约稳定,让 SSR 页面与 API 使用同一套数据结构
- 上线采用容器化 + 反向代理:Docker Compose 保证可重复部署,Caddy 负责证书、反向代理与域名入口,同时建立数据库与媒体备份
- 把 SEO、可访问性、响应式与自动化测试纳入交付范围,而不是上线后再补
解决方案
网站在前端之外增加了完整的后端与内容管理层:内容不再写死在页面里,而是通过 CMS 与后端 API 读取,使内容可以脱离代码独立维护。
内容模型采用翻译表结构,中文与英文分别存储,因此两种语言可以各自维护。
工程实现
网站在前端之外保留独立的接口层:内容、认证与媒体都通过同一套后端 API 提供,页面只负责渲染,因此前端不需要了解数据存储细节。
前后端都使用 TypeScript,目标是让接口契约与数据结构只有一处定义,避免跨端字段定义逐渐不一致。
内容没有写死在页面里,而是建立了内容模型与 CMS:项目、实验、文章与经历由数据库驱动,新增内容不需要改代码或重新部署。
数据层选择关系型方案:内容、翻译、分类与标签之间存在明确的关系,因此把数据放在 PostgreSQL、由 Prisma 管理 schema 与迁移,更适合长期维护。
部署选择容器与反向代理:容器化让生产环境可以重复构建,Caddy 负责自动申请与续期证书、反向代理与域名入口,不需要手工维护证书与端口。
结果
项目已完成生产环境部署,并运行在独立域名下。
同时具备前端、后端、数据库、CMS、认证、媒体管理、SEO、测试与生产部署能力。
项目状态
已上线,持续迭代。
