本卡屬 FR-169(母卡 CM-3223(https://app.notion.com/p/FR-169-Agent-8-5-408346da4cd081eeb138ef3e49d3240e)),卡 F4,批 6。只改 FE(compliance-manager-fe)。依賴:F1、F2。
🔴 本卡是首腦母卡層總驗(2026-10-29)抓到的缺口補卡,三支套件已發版(jedi-file-protect 0.1.0、jedi-iam 1.10.0、jedi-masking 0.1.1),BE 主資料夾已釘版;不必再走 path dependency。前八張卡的成果在各 repo 的工作區 .worktrees/CM-3223(branch ws-CM-3223),本卡會在同一個工作坊底下開,直接疊上去。
設計 D5 說管理員關掉「檔案下載保護」後有三道提醒:寫稽核、頁頂常駐警示、每筆下載標「未加密」。8 張卡做出來的只有第一道加安全政策頁自己的警示;總覽與全站頂部的常駐橫幅、稽核事件頁每筆下載的「未加密」標記都沒排到卡。這張卡把這兩道補上:橫幅照授權到期橫幅(LicenseExpiryBanner)掛在同一個位置,另開一支小元件;稽核頁對 FILE_DOWNLOADED 與 AGENT_FILE_DOWNLOADED 且 encrypted=false 的列加一顆警示色 Tag。i18n 的 key F1 當時已預留,不必新加。
reuse:securityPolicyStore.protectionOn(F2 已改讀 /system/file-download-protection)、LicenseExpiryBanner 掛在 AppLayout.vue 的位置與寫法(照它新開一支 FileProtectionOffBanner.vue,不塞進 LicenseExpiryBanner)、i18n 已預留 protected_download.unprotected_badge 與 security_policy.file_download_protection_off_warning。extend:UserLogs.vue request/message 欄對 FILE_DOWNLOADED 與 AGENT_FILE_DOWNLOADED 且 encrypted=false 的列加一顆 Tag(severity warning)。誰看得到橫幅:用側欄對「安全政策」頁的同一個能力點判斷,不自己發明角色判斷
repo:~/Projects/Billows/Audit-Manager/compliance-manager-fe
改既有:src/layout/AppLayout.vue(掛一行)
改既有:src/views/action-log/UserLogs.vue
新開:src/components/security/FileProtectionOffBanner.vue
src/components/security/FileProtectionOffBanner.vue:照 src/components/license/LicenseExpiryBanner.vue 的結構(PrimeVue Message/InlineMessage 用它用的那個,severity warn,不可關閉),文字用既有 lang.security_policy.file_download_protection_off_warning;v-if 條件= useSecurityPolicyStore().fileDownloadProtection === false 且使用者有看「安全政策」頁的能力點(判法照側欄選單怎麼判那頁可見,grep security-policy 路由的 capability;不自己發明角色判斷)。進頁時呼叫 store 既有的讀取方法(F2 已改讀 /system/file-download-protection),安全政策頁存檔後 store 會刷新。src/layout/AppLayout.vue:在 <LicenseExpiryBanner/> 旁掛一行 <FileProtectionOffBanner/>,只加這一行。src/views/action-log/UserLogs.vue(219 行,未超標):request/message 欄的 #body 內,當該列 message 含 FILE_DOWNLOADED 或 AGENT_FILE_DOWNLOADED 且含 encrypted=false(Agent 事件 B3 補完才會有這欄;主系統事件 B1 已有),在原文後加 <Tag severity="warning">{{ t('lang.common.protected_download.unprotected_badge') }}</Tag>。判斷抽成一支小函式放同檔 <script>,不要在 template 寫長條件。grep -rn border-left 新檔為 0;icon-only 鈕若有要 tooltip;不自訂字級。既有 vitest 全跑一次不弄壞。安全政策關掉存檔後:總覽與任何頁頂部出現常駐橫幅(系統管理員帳號看得到、一般使用者看不到),開回來橫幅消失;稽核事件頁 FILE_DOWNLOADED/AGENT_FILE_DOWNLOADED 且 encrypted=false 的列有「未加密(保護已關閉)」Tag,encrypted=true 的列沒有;grep -rn border-left 新檔為 0;vitest 既有綠
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-169-2610-download-file-encryption/design.md §3 決策、§5 詳細設計、§6 拆分表本卡那列~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-169-2610-download-file-encryption/prototype/index.html(畫面①對話框、②開關、②b 關閉警示、③Agent、④稽核)~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/analysis/2026-10-29-download-file-encryption-approach.md