本卡屬 FR-114 資安修正(母卡 CM-2019),是第 1 批與第 5 批三輪驗收攢出來的 FE 連帶,合回主線前要做完。三件事互不相干,同一張卡是因為都只動 FE、都小。首腦第 2 棒開卡(2026-09-22)。
問題是什麼(白話)
- ①(錯誤碼文案)後端這三輪新增了七個錯誤碼,FE 的 error-code 翻譯檔沒有對應:畫面會把後端的中文訊息直接顯示(語系不跟隨),或顯示原始代碼。
- ②(設備選單安靜變空)CM-2029 給設備/資訊系統七支讀取端點補了權限檢查。五處吃這些端點的下拉選單把後端錯誤接住、只印進主控台、然後把清單設成空的——沒權限的角色打開頁面會以為「公司沒建過設備資料」,不會知道是權限問題。CM-2032 首腦裁定客戶庫不自動補權限,所以這條提示是必要的。
- ③(意見回饋查看範圍)CM-2030 給意見回饋清單端點加了「查看範圍」參數(scope=mine/all),後端在沒帶時依能力點推定。FE「我的意見回饋」與「管理頁」目前都打同一支 API、靠前端旗標分辨畫面,應改成管理頁明確送 scope=all、我的頁明確送 scope=mine,不再靠推定。
首腦核對(2026-09-22 在 FE 工作區 git grep 實查):
- validator 三條(node_count_exceeded/branch_depth_exceeded/self_loop_detected)CM-2059 已順手補進 flow-engine-banner.json,本卡不必再補。
- 七個錯誤碼在 src/config/locales 全部零命中:GRC_403066(此設定為全公司共用,僅總部管理員可修改)、AI_BOT_400001(訊息過長)、AI_BOT_429001(AI 聊天請求過於頻繁,請稍後再試)、AI_DASHBOARD_429001(儀表板生成請求過於頻繁,請稍後再試)、DETECTION_TOOLS_400019(單次測試連線主機數超過上限)、DETECTION_TOOLS_400020、DETECTION_TOOLS_409018(此版本規則包正在解析中)、DETECTION_TOOLS_409019。後兩個 400020/409019 的中文訊息去套件 jedi-detection/jedi_detection/common/ 下的 error code 檔抄。
- menuStore.js:53-60 fetchDeviceMenu 的 try/catch 吞錯只 console.error;ModuleFrameSspDevicesPanel.vue:83/:104 與 ModuleFrameSspInfoSystemsPanel.vue 各自的 catch 也是同樣形狀。403 時後端回的 error code 固定 GRC_403022。
- 意見回饋 FE 唯一打清單 API 的地方是 SystemFeedbackManage.vue:73(baseService.post(API.FEEDBACKS, payload));FeedbackManageTabView.vue:20 用 route.path 分辨管理頁/檢視頁。
工作區
FE 卡:/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-fe/.claude/worktrees/wt-fix-security(branch fix/security-b1,已存在)。node_modules 是 symlink 到主 checkout 的,跑 build 直接用。絕不碰主 checkout。
在哪裡
src/config/locales/i18n/zh-tw/error-code.json 七個錯誤碼補中文
src/config/locales/i18n/en/error-code.json 七個錯誤碼補英文
src/stores/menuStore.js:53-60 fetchDeviceMenu 的 catch:403 時記一個「無權限」旗標,不只 console.error
src/components/grc/ModuleFrameSspDevicesPanel.vue:83,104 同上形狀
src/components/grc/ModuleFrameSspInfoSystemsPanel.vue 同上形狀(catch 行號自己 grep)
src/views/project/ProjectPlanningView.vue:1997 吃 deviceMenu 的畫面:無權限時顯示提示
src/components/grc/ssp-excel-import/EntityPickerDialog.vue:58,69 同上
src/views/feedback/system/SystemFeedbackManage.vue:73 payload 加 scope
src/views/feedback/FeedbackManageTabView.vue:20 分辨管理頁/檢視頁的邏輯,決定 scope 值從哪來
怎麼修
- ① 七個錯誤碼各補一行 zh-tw/en,key 格式照檔內既有(先看 GRC_403065、GRC_403022 怎麼寫)。中文抄後端 error code 檔的訊息,英文自己翻。
- ② 選單 403:在 menuStore 加一個 deviceMenuForbidden(或既有慣例的名字)旗標,catch 裡判 e 的 error_code === 'GRC_403022' 就設 true;四處消費 deviceMenu 的畫面在旗標為 true 時顯示一行「您沒有查看設備/資訊系統的權限,請聯絡管理員」(i18n key 自己補、兩語系),清單仍為空但有字。兩個 ModuleFrameSsp 分頁 catch 同樣處理。非 403 的錯誤維持現狀。先查有沒有既有的「無權限提示」元件或慣例(grep 403、forbidden、no_permission),有就沿用。
- ③ SystemFeedbackManage.vue:73 的 payload 加 scope:管理頁送 'all'、檢視頁(我的)送 'mine',判斷用 FeedbackManageTabView.vue:20 那套 route.path 邏輯(抽成共用或直接傳 prop,先看兩支怎麼連的)。不要動後端。
手測
- DEV:用沒有 device.read 的角色(DEV 上先用 SQL 暫時拔掉一個測試角色的那兩顆,測完加回去)開專案規劃頁 → 看到「沒有權限」提示,不是空選單;開合規文件的設備分頁、資訊系統分頁 → 同樣。