有了一些MIS的開發經驗,也用笨方法實現了根據不同使用者、不同角色、不同許可權分配不同菜單的功能,但總覺得那還不是自己想要的。因為那時有進度約束著的,為了趕工而投機取巧了罷了。
實現方法是這樣的:
1、資料庫中設計了使用者表、使用者角色表、角色許可權表、角色基本表和菜單結構表,不同的使用者可分配不同的角色,不同的角色指派不同的許可權。
2、在主程式中加好菜單並建立了兩個數組,一個字元型的(儲存菜單名),一個布爾型的(儲存菜單狀態),二者等長。第一個數組的元素跟菜單結構表中的菜單名一一對應,第二個數組的元素全是false。
在主程式的Load事件裡面加入代碼:
int i = 0;
menuItem1.Visible = menuStates[i];//menuStates就是第二個數組
menuItem1.Enabled = menuStates[i++];//如果只設定功能表項目不可見,菜單的快速鍵還是能響應的
……
注意:此處menuItem一定要和實際的菜單一一對應。
3、在使用權限設定模組實現給使用者指派角色,給角色指派許可權既菜單。在給角色指派許可權時其實是把菜單結構表中菜單名分配給角色,加到角色許可權表中。角色的許可權是一串字元,就是菜單結構表中的菜單名累加起來(中間加上特定的分隔字元,相同要進行約減)。
4、使用者登入的時候就直接在主程式中取使用者的角色,再根據角色取許可權,再把許可權串加到一起,就得到這個使用者的所有許可權。然後將許可權串按照分割符分開成數組,再將分割後的數組與2中第一個數組中元素一一進行比較,如果相同就將對應位置的菜單狀態數組元素設為true。這要在2中代碼之前處理。
這樣,菜單的動態顯示就能實現了
最近又看了一些關於動態菜單的文章,其中大多是講用XML實現的,也有提到反射的,恍然發現我之前的方法確是微不足道的,所以還想做些這方面的研究。經過一個晚上的努力,終於實現了一個“XML+反射”的動態菜單,把菜單的功能單獨做到一個dll,然後動態添加到主程式,增加新的功能只需要重建一個dll,然後再XML檔案中配置,不需要重新安裝主程式。但是許可權還是沒有去做,因為我開始感到迷茫,這樣做是否合理、是否高效?動態產生菜單有沒有更好的解決方案呢?