更新紀錄

目前版本 202609030017,以下依日期由新到舊列出系統功能異動。

2026-09-03 202609030017
  • docs: 文件集中到 docs/(開發計畫、系統規格書、功能清單、部署、安全、測試計畫、操作手冊);程式碼推送至 GitLab(gitlab.ksi.com.tw/ksi/ksivenuebooking)
2026-09-03 202609030016
  • fix(ui): 行事曆已預約格子點不開明細——空格「+」的 stretched-link 覆蓋層因 td 未設 position 而撐滿整列,點到已預約格會被導向新增預約;td 加 position: relative
2026-09-03 202609030015
  • fix(captcha): Linux 容器的圖形驗證碼只有干擾線、沒有文字(SkiaSharp NoDependencies 建置無 fontconfig,依家族名稱取到的字型沒有字形),導致無人能註冊;改為從字型檔載入並驗證字形存在,加回歸測試
2026-09-03 202609030014
  • docs: Phase 7 選配全部完成(與會人員、附件、MCP、稽核串鏈、後台預約記錄與匯出、瀏覽器推播);開發計畫、功能清單、測試計畫更新狀態
2026-09-03 202609030013
  • feat(push): 瀏覽器推播(選配、預設關閉)——個人資料頁可在每台裝置各自啟用、設定偏好(預約成立/修改/取消通知、預約前提醒)與送測試;提醒時點沿用提醒信設定,推播與寄信各自獨立
  • security(push): VAPID 私鑰只從環境變數讀(--generate-vapid 產生);訂閱只接受 https endpoint、每個動作只動本人的訂閱;推播服務回 404/410 自動移除失效訂閱;狀態三態(未啟用/已啟用但缺金鑰/可用)在個人資料頁明說
2026-09-03 202609030012
  • feat(admin): 後台「預約記錄」——日期區間/場地/預約人/狀態(有效、已取消、全部)篩選、分頁;管理員可取消任何預約(理由必填、寄信通知預約人與與會者);匯出 CSV 與 Excel(前 10,000 筆)
  • feat(admin): 使用者管理新增「匯出 Excel」;.xlsx 由內建零相依產生器輸出(標題列凍結、以 = + - @ 開頭的文字前置單引號防公式注入)
2026-09-03 202609030011
  • security(audit): 操作日誌改為防竄改串鏈——每筆帶前一筆雜湊(HMAC-SHA256,長度前綴 payload、格式版本 1),金鑰由環境變數 Audit__HmacKey 提供、未設定網站不啟動;後台「操作日誌」新增「驗證串鏈」,另有 --verify-audit 命令列模式供排程與鏈頭外送
  • fix(audit): 快照存 jsonb、時間存 timestamptz 會被資料庫正規化(鍵序、跳脫、微秒),雜湊改以正規形計算並在寫入前截到微秒,否則首次驗章即全部失敗
2026-09-03 202609030010
  • feat(mcp): MCP 端點 /mcp(選配、預設關閉)——供 AI Agent 使用的 5 個工具:列出場地、查空閒時段、查預約、建立預約、取消預約;後台「系統設定」Mcp.Enabled 開關即時生效
  • security(mcp): 金鑰由環境變數 Mcp__ApiKeys 提供並綁定本站服務帳號,所有工具以該帳號身分執行、呼叫端不能指定使用者;未啟用時 404、金鑰缺/錯/帳號停用時 401、依 IP 限流;稽核來源 Mcp、操作者 Mcp:<金鑰名>
2026-09-03 202609030009
  • feat(booking): 預約附件——建立預約時可一併上傳,之後在「我的預約」的附件頁補傳、下載、刪除;單檔上限、每筆預約件數與允許副檔名由後台系統設定調整;與會者可下載但不可上傳或刪除
  • security(booking): 附件副檔名白名單 + 永久禁止清單(exe/bat/html…);zip 只讀中央目錄檢查項目名稱(禁止類型、巢狀壓縮、絕對路徑、隱藏排版字元),解析失敗即拒絕;檔案以隨機名落地在網站根目錄之外,下載時 Content-Type 由副檔名決定並強制 attachment + nosniff
2026-09-03 202609030008
  • feat(booking): 與會人員——建立/修改預約時可搜尋本站使用者加入(只列已驗證且已核准的帳號,Email 遮罩顯示);與會者可在排程頁看到明細、有「我與會的預約」頁、可匯出行事曆、會收到成立/修改/取消通知信,但不能修改或取消別人的預約
  • security(booking): 與會人員收件人一律由後端從使用者表取得,不採信前端;與會紀錄的查詢過濾器與預約軟刪除對齊,取消後名單不再出現
  • fix(deploy): 修正發佈輸出驗收腳本 verify-publish.ps1 使用了 PowerShell 唯讀變數 $home 而中止;已以發佈輸出實際起站驗證通過(/health 200、版本相符、首頁 200)
  • feat(admin): 後台「操作日誌」與「活動記錄」——多條件篩選、明細前後快照並排、同一請求的關聯記錄、CSV 匯出(Excel 直接開不亂碼、防公式注入);所有非查詢請求自動寫入稽核(密碼/驗證碼等參數一律遮罩)、所有頁面瀏覽寫入活動記錄;依保留天數自動清理並顯示心跳
  • feat(admin): 後台「系統設定」——依群組分頁籤、每個設定值型別與範圍驗證(非法值被退回並說明)、更新者與時間、SMTP 密碼加密存放且畫面永不顯示、「寄測試信給我」;郵件狀態橫幅明示「未設定/可寄/密碼無法解密請重輸/由環境變數提供」
  • feat(admin): 後台「備份管理」——以 pg_dump 產生備份並以 pg_restore 驗證後打包(不含任何設定檔)、手動備份、清單下載刪除、保留天數清理、完成通知信;自動排程以「最近一次應執行的時點是否還沒跑過」判定(夜間時段隔天補跑)、每分鐘寫心跳與跳過原因
  • feat(ops): 提供 scripts/backup.ps1 與 backup.sh 供 Windows 工作排程器/cron 呼叫同一套備份(IIS 部署的準時備份必須走作業系統排程器);儀表板顯示備份狀態與排程心跳
  • feat(booking): 場地預約核心上線——首頁週行事曆(上/本/下週切換、點空白時段直接預約)、單日排程、單一場地排程、建立/修改/取消預約、我的預約(即將/歷史、關鍵字查詢、分頁)、匯出 .ics 與 Google 行事曆
  • feat(booking): 預約規則全部可於後台設定——時段粒度、營業時間、最多提前天數、單次最長時數、每人有效筆數上限、同人跨場地不重疊、取消期限、預計人數超過容納人數時忽略/警告/阻擋
  • security(booking): 同場地時段重疊由資料庫層 EXCLUDE 約束封死,兩個人同時搶同一時段只有一個會成功;未登入者在首頁只看得到「已預約/空閒」色塊,看不到任何預約人資訊
  • feat(admin): 後台「場地管理」——新增/編輯、上下移動排序、啟用/停用、智慧刪除(有預約改停用、無預約真刪除)
  • feat(mail): 預約成立/修改/取消寄通知信(可於後台與個人資料分別關閉)
  • feat(admin): 後台管理上線——儀表板(使用者數、待核准、信件待寄/失敗、近 24 小時稽核筆數、bootstrap 變數殘留警示)與使用者管理(搜尋、核准、停用/啟用、指派/移除管理員、強制確認 Email、寄送重設密碼信、解除鎖定)
  • security(admin): 使用者管理的保護規則——不可停用或降級自己、不可拔掉最後一位管理員;停用或變更角色時既有登入立即失效
  • feat(audit): 登入、登入失敗、鎖定、登出、註冊、Email 驗證、變更密碼與所有後台使用者操作都寫入稽核記錄(含變更前後快照、IP、瀏覽器);操作日誌查詢頁於下一階段提供
  • feat(admin): 後台選單與授權條件採單一來源,並以自動化測試確認「一般使用者看得到的項目數 == 進得去的頁面數」
  • feat(account): 自行註冊——填 Email、顯示名稱、密碼與圖形驗證碼,再以信箱收到的 6 碼驗證碼(或信中連結)啟用帳號;驗證碼 15 分鐘有效、錯 5 次作廢、60 秒可重寄一次
  • feat(account): 登入/登出、忘記密碼(重設連結 1 小時內有效、只能用一次,重設後所有裝置需重新登入)、個人資料與變更密碼
  • security(account): 連續登入失敗 5 次鎖定 15 分鐘;登入、註冊、重寄、忘記密碼依來源 IP 限流;帳號不存在與密碼錯誤顯示完全相同的訊息,且帳號不存在時仍消耗同樣的驗證時間,避免以回應差異列舉帳號
  • security(account): 以既有 Email 重複註冊時不會揭露該帳號存在——畫面訊息與新註冊相同,改寄一封提醒信給該信箱的主人
  • security(account): 密碼以 BCrypt 雜湊;至少 10 字元含大小寫與數字,且不可包含自己的 Email 帳號名稱或常見弱密碼
  • feat(mail): 所有信件先進佇列再由背景工作寄出(先標記已寄、再實際寄送,行程重啟不會對同一人重寄);開發環境內建 Mailpit 收信
  • feat(admin): 第一位管理員由環境變數 Bootstrap__AdminEmail/Bootstrap__AdminPassword 建立,只在資料庫尚無管理員時執行、絕不覆寫既有密碼;之後每次啟動若變數仍在會記錄警告提醒移除
  • feat(core): 專案建立——以會議室預約系統為藍本重寫為「國興場地通」,資料庫改用 PostgreSQL,預設以 Docker 執行
  • feat(core): 全站時間改由統一的時鐘服務提供,系統時區可於設定調整(預設 Asia/Taipei)——同一份程式在 Docker(UTC)與 IIS(台北時間)兩種環境算出的「今天」必須一致
  • feat(ops): 新增 /health 健康檢查(資料庫連線、加密金鑰目錄可寫、版本、時區)
  • feat(ui): 前台版面骨架、字級切換(小/中/大,跨頁保留)、頁尾版本號與本更新紀錄頁