为什么这个站点没有把文章写进前端文件
CTY Log 同时需要公开阅读、搜索、管理编辑和长期迁移。如果文章与项目硬编码在 React 组件里,发布一次内容就要重新改页面,后台编辑也失去意义。当前公开仓库采用 React/Vinext 页面层、FastAPI 接口层、SQLAlchemy 数据访问和 PostgreSQL 持久化,前端的 data 目录只保留非敏感个人展示文案。
本文描述这个仓库当前采用的边界,不主张所有个人站点都必须前后端分离。内容很少、没有后台和搜索需求时,纯静态 Markdown 更简单。
请求路径
公开页面不直接连接数据库。FastAPI 统一执行发布状态、时间、软删除和保密检查条件,并只返回前台需要的字段。React 服务端生成正文、Canonical、Open Graph 和结构化数据,浏览器首次访问不依赖客户端再请求一遍正文。
公开读取与管理写入分开
公开 API 只允许读取已发布文章、公开项目、分类、标签和时间线。管理 API 依赖管理员会话与 CSRF 校验,负责草稿、发布、恢复、媒体和设置等写操作。即使前端误把草稿链接渲染出来,公开接口仍会返回不存在,安全边界不依赖按钮是否隐藏。
写入模型使用明确字段、长度和格式约束。文章发布前必须确认保密检查;项目设为公开时数据库约束也要求完成检查。编辑带版本号,两个页面同时修改同一内容时,后提交者会收到冲突而不是静默覆盖。
数据库与仓储层
路由负责参数和权限,仓储层负责查询、分页、关联与事务。文章、标签和项目之间使用关联表,修改 slug 时记录永久重定向。软删除让后台可以恢复内容,但所有公开查询都必须显式排除已删除记录。
搜索目前使用 PostgreSQL 条件查询覆盖标题、摘要、分类和标签,适合当前内容规模。中文内容增多后再评估分词扩展或独立搜索服务,而不是提前增加新的数据源。
失败边界与验证
API 使用统一错误结构,页面把 404 与永久重定向映射为对应导航行为。跨栈测试启动隔离数据库和短时 API 服务,验证真实接口数据可以进入服务端渲染;API 测试覆盖草稿隐藏、保密检查、版本冲突、软删除与关联内容。
架构测试还应验证公开设置只返回白名单键,日志不记录正文、邮箱或凭据,生产环境的 API 与数据库端口不暴露到公网。
结论
这个架构的核心不是“用了哪些框架”,而是只有一套正式内容数据源:PostgreSQL 保存状态,FastAPI执行规则,React负责可访问的服务端呈现。边界清楚后,后台、搜索、RSS 和站点地图都能围绕同一份内容工作。