Navbar.instructions.md
從 Google Drive .github/instructions/Navbar.instructions.md 匯入
共用指令內容
使用中---
applyTo: '**'
---
開發覺察:選單來自 PMS,不要寫死
> 這是開發時的覺察提醒,不是 SQL 撰寫規範。
> PMS 選單 SQL 的產生方式請呼叫 [pms-cross](../skills/pms-cross/SKILL.md) skill;本檔僅提醒開發過程中應有的判斷。
---
1. 共識:選單一律由 PMS 動態載入
本專案系列的所有網站,導覽列均由共用 UC( UCmain.ascx 等)透過 ChghWebService.SelectNavbar 從 pms_AP 動態取得;不存在「靜態選單」。
因此開發時:
- 禁止在
.master/.ascx/.aspx內寫死選單<a href="...">連結清單。 - 禁止在程式碼或設定檔中以陣列、enum、字串常數方式列出選單項目。
- 禁止在前端 JS 中宣告 navbar 結構陣列(除非該頁完全獨立於 PMS 體系,例如登入頁)。
- 新增功能頁時,必須同步在 PMS(
pms_AP)建立對應節點並完成角色綁定,否則使用者登入後看不到、也無權限存取。
---
2. 開發時應停下來想一想
當你正要做以下動作時,請改為使用 PMS 流程:
| 你想做的事 | 正確的對應動作 |
|---|---|
| 在 Front.master / Admin.master 加一個 <li> 選單 | 改為呼叫 pms-cross skill,產生 pms_AP 的 INSERT SQL |
| 想把選單依角色顯示/隱藏 | 透過 pms_RoleAuthority 控制;UC 已自動依登入者權限過濾 |
| 想加個外開頁籤的捷徑 | 在 pms_AP 新增節點時把 APTarget 設為 _blank |
| 想停用某個選單但保留資料 | UPDATE pms_AP SET APState = 'N',不要刪除節點,以免破壞 pms_RoleAuthority 引用 |
| 想暫時隱藏但保留權限 | UPDATE pms_AP SET DisplayFlag = 0,可被 PMS 取出但不顯示在 navbar |
| 想改選單顯示順序 | UPDATE pms_AP SET APRanking = ...(同層由小到大) |
| 想新增分類選單(無連結,只用於 group 子項) | 該節點 APUrl = NULL,子節點 ParentSID 指向其 APSID |
---
3. 前端渲染契約(修改 UC 時必看)
UCmain.ascx 的 JS 渲染依賴一條核心契約:d.ParentSID === 0 才是根節點(DAL 已用 IsNull(ParentSID, 0) 標準化)。
// ✅ 正確
checkFlag.push(d.ParentSID === 0 ? 0 : 1);
// ❌ 禁止:APSID 永遠不會等於 ParentSID,此式恆為 false,整個選單會渲染失敗
checkFlag.push(d.APSID === d.ParentSID ? 0 : 1);
複製貼上既有 UC 範本作為新專案的基底時,務必檢查此判斷式。
---
4. 新增功能頁的標準流程
1. 寫好 .aspx + .aspx.cs(繼承 BasePage)。
2. 呼叫 pms-cross skill 產生 pms_AP 的 INSERT 與 pms_RoleAuthority 的綁定 SQL。
3. 在 ASE 執行 SQL 後重新登入,確認新節點出現在導覽列且可點擊。
4. 任何選單異動(新增/改名/改 URL/停用)都應透過 PMS skill 而非直接改前端。
---
5. 例外情境
僅以下少數情境允許在頁面內寫靜態連結,且不算違反本規則:
- 登入 / 登出頁(不在 PMS 體系內)
- 錯誤頁(
Error.aspx) - Email 通知中的連結
- 完全公開、不需身分驗證的對外頁面(且該系統
pms_sys_m.full_access = 'Y'或不接 PMS)
除此之外,任何選單與導覽連結都應來自 PMS。