# jyg 上傳集中化 — 部署 + 測試檢查清單

涵蓋：集中化(resolver/遷移)、cover/albums/banner 上傳、TinyMCE 換編輯器、R2 scaffold。
原則：jyg 用 **PHP71 + admin71 + 新 DB**，其它站台不受影響。每步都**驗證過再下一步**。

---

## 0. 部署前備份（重要：非 git 環境，不可逆）
- [ ] 備份 jyg 現有 DB（`micro_jygesg`）
- [ ] 備份 jyg 站台目錄（含 `apps/conf`、`apps/resources`）
- [ ] 確認 `micro_jygesg.sql` 原檔還在（md5 未變，當回滾基準）

---

## 1. 要部署的東西（清單）

### A. 共用框架新版 `PHP71/`（與 PHP7 同層）
新增：`Media/Resolver.php`、`Media/Upload.php`、`Media/R2.php`
改動：`Articles/Article.php`、`Articles/Dal/Article.php`、`Articles/Dal/Category.php`、`Pages/Dal/Page.php`、`Uploader/Files.php`
> 最省：伺服器上 `cp -a PHP7 PHP71`，再套上述 6 檔改動 + Media/ 資料夾。

### B. 共用後台新版 `admin71/`（與 admin 同層）
新增：`Media/API/UploadController.php`、`conf.route.media.php`、`plugins/tinymce/`(自架)
改動：`conf.route.app.php`(清單加 media)、`com/design/cover.html`、`@libs/neko/neko.ckeditor.js`

### C. jyg 站台
改動：`apps/conf/conf.weber.php`(指 PHP71)、`apps/resources/admin/index.php`(指 admin71)、
`apps/conf/setting/conf.media.php`(resolve 設定 + R2 範本)、
`apps/resources/assets/views/web/com/banner.html`、`banners/layout_1.html`、`banners/layout_2.html`
新增實體檔：`apps/resources/assets/upload/20260609/`（226 檔）

### D. 資料庫（新 DB）
`micro_jygesg_migrated.sql` + `docs/ai-agents/project-init/migrate-banner-desc.sql`

---

## 2. 部署順序（照順序做）

1. [ ] **開新 DB**，匯入 `micro_jygesg_migrated.sql`
   - 驗證：`SELECT COUNT(*) FROM uploaded_files;` → 應為 **226**
2. [ ] 在新 DB 跑 `migrate-banner-desc.sql`
   - 驗證：`SELECT content FROM uploaded_files WHERE file_id='2032076977195712512';` → 應有橫幅描述 JSON
3. [ ] 上傳 `PHP71/`、`admin71/`、`upload/20260609/` 到伺服器
4. [ ] 部署 jyg 改動的設定/模板（conf.weber、admin/index、conf.media、banner 模板）
5. [ ] **`conf.database.php` 指向新 DB**（nwd 連線的 dbname）
6. [ ] 確認 `/api/media/upload` 路由生效（admin71 載入）

> ⚠️ 「新 DB(內文已 data-file-id)」必須配「PHP71(有 resolver)」。若伺服器仍跑 PHP7 → 圖會變 `/assets/<file_id>` 裸 id。症狀出現先查 conf.weber 是否真的指 PHP71。

---

## 3. 功能測試（前台 + 後台）

### 前台（PHP71 + 新 DB）
- [ ] 文章**內頁**：cover、內文圖正常顯示
- [ ] 文章**列表頁**：每篇 cover 都出來（驗 resolve_list 修正 = 不只剩第一篇）
- [ ] **分類列表**（側欄）：多個分類都在（不只剩第一個）
- [ ] **頁面 banner**：圖 + 標題/副標/按鈕都正常（驗 banner 物件模式 + content）
- [ ] 多語言頁 banner：各語言都正常
- [ ] 舊的未遷移內容（若有）：仍正常（格式安全放行）

### 後台（admin71 + PHP71）
- [ ] 文章/FAQ 編輯頁：編輯器是 **TinyMCE**（非 CKEditor）、無「瀏覽伺服器」鈕、無安全警告
- [ ] 編輯內文 → **提交 → 內容有存進去**（最關鍵，靠 textarea 同步 + CKEDITOR shim）
- [ ] 編輯器內**上傳圖** → 成功 + 圖出現 + 進 `uploaded_files` + `upload/<今日>/`
- [ ] **封面 cover** 上傳（com/uploader）→ 進 uploaded_files、既有封面有 preload
- [ ] **頁面 banner** 上傳 + 橫幅描述編輯 → 正常（fileuploader 保留）

### 後端端點（curl，可先單獨驗）
- [ ] `curl -F "file=@x.jpg" .../admin/api/media/upload -b "<cookie>"` → 回 `{ok:true,file_id,url}` + uploaded_files 多一筆

---

## 4. 其它站台沒被影響（必驗）
- [ ] 任一**未遷移站台**的前台 + 後台正常（它們仍用 PHP7 + admin + 舊 DB）
- [ ] `diff -rq PHP7 PHP71` / `diff -rq admin admin71` 的差異都在預期內

---

## 5. R2（選用，jyg 驗證 OK 後再做）
- [ ] Cloudflare 建 R2 bucket + 綁自訂網域（公開讀取）
- [ ] 填 jyg `conf.media.php` 的 r2 區塊（取消註解）
- [ ] 用一張小圖測 `Media\R2->put()` 通（驗 SigV4 簽章）
- [ ] 回填：`Media\R2->putDir(<assets>/upload,'assets/upload')` + `UPDATE uploaded_files SET host='<R2網域>'`
- [ ] 驗證圖片從 R2 網域載入；新上傳自動進 R2
- [ ] 中國站台**不啟用** R2

---

## 6. 回滾（出事時）
- 前台壞 → jyg `conf.weber.php` 改回 `/PHP7/`、`conf.database` 改回舊 DB
- 後台壞 → jyg `admin/index.php` 改回 `/admin`
- 都是站台層一行切換，不需動共用碼

---

## 7. 還沒做（之後）
- 新上傳內文用 `data-file-id`（目前用含 file_id 的 URL，GC/resolver 都 OK）— 需客製 TinyMCE upload adapter
- attached/slideshow/album/photos/download：jyg 沒用，未轉（其它站台用到再轉）
- R2 回填的一次性觸發點（admin route/CLI）
- GC（孤兒清理）排程：`clean-orphan-uploaded-files.py`，全站一條 cron
