P/PromptTools
Instruction asset / navbar-instructions

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.SelectNavbarpms_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

版本紀錄

1 個不可變版本
v1
從 Google Drive 初次匯入
2026/07/28 02:59:49