# 紫微斗數排盤修復版 版本:2026.09.20.6 這一包可以直接上傳 Cloudflare Pages。ZIP 最外層已包含 index.html,不需要安裝套件、填寫環境變數或執行建置。 - 手機版匯出列:同一組「複製命盤/JSON/文字檔」按鈕在 ≤800px 時自動移回頂部工具列;桌機仍置於命盤中央,事件綁定使用同一組 DOM 節點。 ## 上傳方式 1. 在 Cloudflare Pages 開啟既有專案,建立新的直接上傳部署;新專案則選擇直接上傳。 2. 上傳整份 `zwds-cloudflare-pages-fixed.zip`,不要把 ZIP 再放進另一層資料夾。 3. 部署完成後開啟網址。如瀏覽器仍顯示舊版,重新整理一次。 畫面排盤全部在瀏覽器計算,不需要向後端取得命盤。原本的 `/api/calculate` 介面仍保留;只有明確呼叫 `/api/*` 時才使用 Cloudflare Worker。`_routes.json` 已限定範圍。 Cloudflare 官方文件確認,直接上傳支援 ZIP,也支援 `_worker.js`: [Cloudflare Pages 直接上傳](https://developers.cloudflare.com/pages/get-started/direct-upload/)。 ## 採用的排盤規則 這版保留附件原有 iztro 安星表,統一其輸入日期、運限與匯出資料,沒有將不同流派的排法混合。 | 項目 | 規則 | |---|---| | 時間基準 | 台灣標準時間 UTC+08:00,不校正真太陽時 | | 本命年、流年分界 | 農曆正月初一 | | 月分界 | 農曆月份 | | 換日預設 | 子初換日,23:00 起完整採用次日早子時;可切換午夜換日 | | 閏月預設 | 初一至十五按本月,十六起按次月,日序保留;可切換全月按本月 | | 閏月一致性 | 生日、運限日期、流月命宮與流月干支使用相同設定 | | 大限 | 五行局起限;陽男陰女順行,陰男陽女逆行 | | 小限 | 依出生年三合局起宮;男順女逆;四化欄是所在宮的宮干四化 | | 虛歲 | 依排盤採用的農曆年,年差加一 | | 流月、流日、流時 | 斗君起流月;流月宮起初一;流日宮起子時 | | 來因宮 | 與原宮使用同一來源;宮干等於生年干,依原套件排法排除子、丑 | | 自化 | 本宮宮干使本宮星曜四化;完整保留多個自化 | | 四化表 | 庚:陽武陰同;壬:梁紫左武。十干完整表列於畫面及匯出 | | 日期範圍 | 陽曆 1900-01-01 至 2100-12-31;農曆換算後也必須在此範圍 | 畫面與匯出所列「斗數干支」採農曆年、月規則,**不是以立春與交節時刻切換的八字四柱**。目前輸入的是時辰區間,不含精確出生分鐘,因此不另外製造一組看似精確的節氣八字。 早子時是 00:00–01:00,晚子時是 23:00–24:00,畫面和匯出保留兩者的原始輸入。採子初換日時,同時保存實際生日與換日後的排盤採用日。 不同流派對閏月、子時、四化與運限有不同處理;這些規則是本版的明確約定,並非宣稱所有流派都應得到相同結果。 參考:[iztro 設定與插件](https://docs.iztro.com/zh_TW/posts/config-n-plugin)、[星盤輸入規格](https://docs.iztro.com/zh_TW/posts/astrolabe)、[十干四化表](https://docs.iztro.com/zh_TW/learn/mutagen)、[運限資料結構](https://docs.iztro.com/zh_TW/posts/horoscope)、[安星訣](https://docs.iztro.com/zh_TW/learn/setup)。 ## 問題與修復清單 | 原本的問題 | 本版處理 | |---|---| | 晚子時只修正部分日序,農曆月底與除夕可能繼續使用舊月、舊年 | 先統一換算整個日期,再安命身宮、五行局、主輔星與四化 | | 流日、流月、流年未與晚子時完整同步 | 運限使用相同換日函式;跨月與跨年全部重新計算 | | 關閉閏月修正後,部分流月公式仍硬套後半月加一 | 本命及運限統一使用同一閏月規則 | | 農曆生日使用西曆 date 欄位,無法正確表示農曆二月三十等合法日期 | 使用農曆可輸入的文字欄位,再依實際農曆月份天數驗證 | | 不存在的閏月可能被靜默當成普通月份 | 明確拒絕不存在的閏月;不替使用者猜測 | | 日期、時辰與性別缺乏完整驗證 | 驗證輸入型別、日期存在性、月天數、日期範圍與 0–12 時辰 | | 切換陽農曆只是更換解讀方式,可能變成另一個生日 | 切換時實際換算日期並同步閏月標記 | | 同一宮的自化摘要只留第一個 | 改為自化清單,所有自化都保留到畫面與兩種匯出 | | 生年四化、自化、宮干飛化混在單一文字欄位,難以追來源 | 分開標示;每筆飛化有來源宮、目標宮、目標星、化別與是否自化 | | 原宮與來因宮採用兩套查找方式 | 統一取安星引擎的同一個原宮標記 | | 匯出寫死未輸入的經度,普通時辰被稱為真太陽時 | 移除假經度與錯誤真太陽時欄位,明確記錄未校正 | | 農曆年月干支被標為八字,部分運限文字又用另一套干支規則 | 統一為斗數干支;顯示、複製與匯出使用同一個結果 | | 匯出對 AI 預設解盤權重與能量詮釋 | 移除「自化必須優先」等分析指令,只輸出規則與數據 | | 匯出包含隔日過期與拒絕分析指令,歷史或未來日期也被誤套 | 依所選日期與時辰匯出,不設定假到期時間,也不輸出額外的快照/產生時間尾註 | | 時區標為台北,現在時間卻讀取瀏覽器或 Worker 主機的本地時區 | 「台灣現在」與預設運限統一明確使用 Asia/Taipei | | 早子時在部分地方標成 23:00–01:00,和晚子時重疊 | 統一早子、晚子時段標籤 | | 未出生或超過大限範圍時可能留下預設甲子等誤導資料 | 出生前不排運限;童限明示;超出十二組大限時大限留空 | | 畫面、文字、JSON、Worker 各自計算與組裝資料 | 單一 core.mjs 建立完整模型,各輸出直接讀取同一份結果 | | 輸入不完整或錯誤時可能空白、整頁錯誤,或仍匯出舊盤 | 保留上一張畫面並暫停匯出;輸入恢復合法後自動重算,無需套用按鈕 | | Markdown 遺漏部分星曜亮度、雜曜神煞與完整運限資訊 | 補入輔星亮度、各層命宮、宮名對照、四化目標和流曜;兩種匯出遵循相同選項 | | 多國語言名稱被直接用於固定中文判斷 | 計算與匯出固定使用繁體中文,其他語言只影響顯示 | | 手機匯出按鈕不易到達,傳統大盤橫向塞不下 | 匯出按鈕移入命盤中央;固定使用十二宮命盤,手機以盤面容器橫向捲動 | | 剪貼簿備援沒有檢查回傳值,可能複製失敗卻顯示成功 | 檢查實際結果;兩種複製方式都失敗時,提供可全選的文字視窗 | | JSON 下載後過早回收暫存網址 | 延後回收,改善瀏覽器下載相容性 | | 預設 Vite 圖示不存在 | 改為包內圖示 | | API 錯誤日期當成伺服器 500、缺乏完整參數及內容限制 | 改用 400/413/405/404,支援指定運限、閏月與換日規則 | | 更新部署後容易沿用舊 JS | 設定重新驗證快取並更新頁面資源版本參數 | 「來因宮」原本的兩種查找方式在一般資料下未必產生差異;本次將其合併,以避免來源漂移,不將它描述成所有舊盤都算錯。 ## 功能 - 本命、大限/童限、小限、流年、流月、流日、流時切換;六個運限層級直接以標籤顯示在各自命宮落點,點標籤即可切換,中央可返回本命。 - 十二宮、主星、輔星亮度、雜曜、長生/博士/將前/歲前神煞。 - 生年四化、宮干飛化、自化、其他宮位飛入與三方四正。 - 陽農曆互換、閏月驗證、換日及閏月規則設定。 - 台灣現在、前後時辰切換;出生資料與運限日期/時辰修改後立即更新,無套用步驟。 - 複製 Markdown 命盤文字、下載 Markdown 文字檔、匯出 JSON;三個操作集中在十二宮中央,不再占用頁頭。 - 六種星曜/宮名顯示語言。繁體畫面將「僕役」顯示為「交友」;JSON 保留引擎的「僕役」名稱,兩者為同一宮位。 ## 已完成的驗證 - **22 組排盤回歸檢查**:涵蓋跨月跨年晚子時、午夜換日、閏月十五/十六、合法農曆二月三十、輸入錯誤、多重自化、童限、超齡大限、匯出與語言切換。 - **156 張結構檢查**:6 個代表日期 × 13 個時辰 × 2 種性別,檢查十二宮、十四主星唯一性、命身宮及來因宮。 - **69 個日期的獨立曆法對照**:以 Node.js 的 ICU 中國農曆資料核對,包括 1901–2099 年抽樣與 2033 年特殊閏十一月。 - **32 張一般日期相容性比較**:與附件內原始安星引擎核對主星及大限,不為修復時間邊界而任意更動正常日期的安星表。 - **桌機版面目標**:以 1757×864 的實際回報畫面重新收斂高度;頁頭只保留品牌與時區,左側移除非必要說明行,運限層級與匯出操作移入命盤本體,避免額外占用垂直空間。 - **12 項 API 檢查**:GET/POST 與前端完整宮位、運限一致;無效資料、過大內容、錯誤方法及預檢請求。 已在本地 HTTP 環境驗證,並模擬部署使用的內容安全規則;尚未上傳到你的 Cloudflare 帳號,也沒有宣稱已完成線上部署。 範圍限制:檢查針對本版列明的規則與已重現問題,不等同對所有古今日期、流派及第三方安星表逐項完成獨立認證。 ## API 相容性說明 舊有的 `birthday`、`birthTime`、`gender`、`type`、`leap` 參數仍可使用。新增支援 `fixLeap`、`dayDivide`、`horoscopeDate`、`horoscopeHour`。 GET 範例: ```text /api/calculate?birthday=2000-08-16&birthTime=2&gender=女&type=solar&horoscopeDate=2026-09-19&horoscopeHour=10 ``` POST JSON 範例: ```json { "birthday": "2000-08-16", "birthTime": 2, "gender": "女", "type": "solar", "isLeapMonth": false, "fixLeap": true, "dayDivide": "forward", "horoscopeDate": "2026-09-19", "horoscopeHour": 10 } ``` 回傳為 `meta.schemaVersion = 2` 的完整模型。保留原本不會造成誤解的頂層基本資料欄位;以下有刻意調整: - `bazi` 改為 `douShuGanzhi`,避免將斗數農曆干支當作節氣八字。 - 宮位不再只提供混合文字 `mutations`,改為星曜 `transformations`、`selfMutagens`、`fliesTo`、`fliesFrom` 等結構資料。 - 雜曜、神煞、完整大限與運限都在回傳內。若已有外部程式解析舊 JSON,請依這些欄位名稱同步調整。 ## 維護與重新驗證 使用者只需上傳 ZIP。以下供未來維護程式時使用: ```bash python docs/build.py node docs/regression.test.mjs ``` 第一行會將瀏覽器的同一份 `assets/vendor.mjs` 與 `assets/core.mjs` 合併為 `_worker.js`;修改核心後請重跑,避免 API 與前端版本不同。 `assets/vendor.mjs` 由附件現有套件還原,附件沒有來源專案或鎖版檔,因此不虛構原套件精確版本。保留 iztro、lunar-lite、lunar-typescript、dayjs、i18next 授權文字於 `docs/licenses/`。瀏覽器使用既有系統字型,不需連線到外部 CDN。 ## 2026.09.20.6 手機版 RWD - 800px 以下改為真正單欄:出生資料 → 複製/JSON/文字檔 → 顯示與匯出 → 運限時間。 - 匯出按鈕使用同一組 DOM 元件,手機移到出生資料下方;桌機仍置於十二宮中央。 - 運限時間在手機移到較後順位,避免低頻設定佔據首屏。