blob: 7c8da41d6ea493c9ffba4a3189920b37a83735d0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
架構
====
分層視圖
--------
.. list-table::
:header-rows: 1
:widths: 22 34 44
* - 層
- 主要檔案
- 職責
* - 展示層
- ``src/app/(main)``、``src/components``
- 呈現公開頁面、路由處理器、共用 UI、富文字和版面。
* - 內容存取層
- ``src/lib/payload-posts.ts``
- 查詢 Payload,並把 CMS 文件正規化為前端可用的資料結構。
* - CMS 後台
- ``payload.config.ts``、``src/payload``
- 定義內容集合並提供後台管理體驗。
* - 認證與留言
- ``src/server/auth``、``src/server/comments``
- 處理 OAuth、Session、留言儲存與留言權限。
* - 資料層
- ``src/server/db``、``src/migrations``
- 管理 Drizzle schema、資料庫連線與應用遷移。
文章讀取流程
------------
1. ``/posts/[slug]`` 頁面接收文章 slug。
2. Server Component 呼叫 ``getPostBySlug``。
3. ``src/lib/payload-posts.ts`` 取得 Payload client 並查詢 ``published`` 狀態的文章。
4. 原始 Payload 文件被轉換為 ``BlogPost``。
5. 頁面呈現富文字,並掛載分享、留言等互動。
資料邊界
--------
Payload 負責編輯內容與媒體中繼資料;應用層負責認證、留言、路由行為、UI 狀態與整合邏輯。新增功能前應先判斷資料歸屬:編輯內容放入 Payload collection;帳號、互動、審核與營運記錄放入 Drizzle schema。
已知風險
--------
* 正式環境不應使用 Payload secret 預設值。
* RSS 路徑應統一為 ``/rss.xml``。
* 標籤統計與搜尋索引目前依賴批次讀取,內容規模變大後應引入快取或資料庫側聚合。
* 留言角色策略需要更明確的服務端規則與測試覆蓋。
|