匯出格式:使用者可以帶走的兩種檔案
本文件是 AquaLog 資料可攜(#1505)的技術說明:App 能交出哪些檔案、檔案裡是什麼、其他軟體怎樣讀。它寫給兩種讀者——想把資料搬到別處的使用者(或幫他搬的人),以及想確認「可攜」不是一句空話的監理機構。
為什麼可攜由 App 完成、而不是由營運方交出,見退款、稅務與資料可攜第三節。
一、完整備份:ZIP
設定 → 備份、還原與資料管理 →「建立完整備份」。 不需連網,不經伺服器;檔案在裝置上產生,經系統分享面板或下載交給使用者。
aqualog-backup-YYYYMMDD-HHmm.zip
├── manifest.json 說明檔:格式、版本、每個檔案的大小與 SHA-256
├── data.json 全部結構化紀錄(UTF-8 JSON)
└── photos/ 全部相片與收據原檔
└── <media-id>.<副檔名>
1.1 manifest.json
| 欄位 | 內容 |
|---|---|
format | 固定為 aqualog-backup |
formatVersion | 備份格式版本,目前為 1 |
createdAt | 建立時間,ISO 8601(UTC) |
timezone | 建立時裝置的 IANA 時區,例如 Asia/Hong_Kong |
appVersion | 建立備份的 App 版本 |
schemaVersion | 資料庫結構版本;同一個 formatVersion 下,表格只增不減 |
dataFile | { path: "data.json", byteSize, sha256 } |
photos | 每張相片一項:mediaId、path、mimeType、extension、byteSize、width、height、sha256 |
counts | 每個表格的紀錄數 |
totals | { fileCount, uncompressedBytes } |
SHA-256 以小寫十六進位表示。任何軟體都可以用它核對檔案在搬運途中沒有損壞。
1.2 data.json
| 欄位 | 內容 |
|---|---|
format | 固定為 aqualog-data |
formatVersion | 與 manifest 相同 |
schemaVersion | 與 manifest 相同 |
exportedAt | 匯出時間,ISO 8601(UTC) |
tables | 物件;每個鍵是一個表格名稱,值是該表格全部紀錄組成的陣列 |
- 每筆紀錄都有字串
id(UUID);跨表的關聯以…Id欄位指向另一筆紀錄的id,例如purchaseItems[].purchaseId。 - 日期與時間是 ISO 8601 字串;金額是數字。
- 表格清單隨 App 功能增加(
schemaVersion遞增),舊表格不會被移除或改名。完整清單以counts的鍵為準,不在本文件重抄——抄一份就會分叉。 - 相片的中繼資料在
tables.media,與photos/內的檔案以id/mediaId對應;紀錄與相片的連結在tables.mediaLinks。
1.3 相片
photos/<media-id>.<副檔名> 是原始檔,未經重新壓縮。副檔名由 MIME 決定(jpg、png、webp、heic 等)。
1.4 讀取方式
任何能解 ZIP、能讀 JSON 的工具都能打開:試算表軟體、Python(zipfile + json)、或直接解壓縮後用文字編輯器看。AquaLog 本身可以從這個檔案完整還原(架構文件§15.3)。
二、表格匯出:CSV
設定 → 備份、還原與資料管理 →「分類 CSV 匯出」。 給試算表用的分類匯出,不含相片。
- 檔名:
AquaLog-<類別>-<日期>.csv - 編碼:UTF-8,開頭帶 BOM(讓 Excel 正確辨認中文),行尾 CRLF
- 欄位名稱與是/否值以「中文 / English」雙語書寫
- 以
=、+、-、@開頭的值前面加一個單引號,避免試算表把它當公式執行
類別:
| 類別 | 內容 |
|---|---|
fish | 魚隻 |
plants | 水草 |
invertebrates | 蝦、螺等無脊椎 |
decorations | 造景與裝飾 |
purchases | 購買紀錄 |
feeding | 餵食紀錄 |
water_changes | 換水紀錄 |
water_quality | 水質測試 |
maintenance | 保養紀錄 |
三、哪一份是「我的全部資料」
ZIP 備份是。 CSV 是方便用的子集。伺服器上的同步副本是密文,營運方打不開,也就交不出它的內容;它不是可攜的來源,見退款、稅務與資料可攜。
本文件的欄位清單由 src/features/backup/exportFormat.doc.test.ts 對照程式碼:manifest 或 data.json 多了、少了一個欄位,或 CSV 多了一個類別,那條測試會先失敗。