系統(tǒng)設(shè)計(jì)——權(quán)限系統(tǒng)
前言:寫了兩篇關(guān)于DataGridView的文章:Winform系列——好用的DataGridview過濾控件(表格的高級(jí)搜索功能) 和 Winform系列——好看的DataGridView折疊控件。這章來記錄下權(quán)限系統(tǒng)。關(guān)于權(quán)限系統(tǒng),網(wǎng)上版本非常多,大都實(shí)用性不太高,大多數(shù)的系統(tǒng)就是因?yàn)榉值锰?xì)了反而使系統(tǒng)錯(cuò)綜復(fù)雜,甚至有看到有按照角色、部門、地區(qū)、用戶四個(gè)方便分別去做權(quán)限分配的,我的個(gè)神,這樣一來,要取一個(gè)用戶的權(quán)限那個(gè)麻煩,當(dāng)然并非說那些大神們封的東西不好,而是適用性的問題,對(duì)于某些大型公司的系統(tǒng),對(duì)權(quán)限要求確實(shí)有那么高也說不定,但其實(shí)根據(jù)本人工作幾年的經(jīng)驗(yàn)來看,大部分的.Net系統(tǒng)其實(shí)對(duì)權(quán)限的要求并沒有想象中的那么高。在這里記錄下自己從頭到尾設(shè)計(jì)和開發(fā)的一個(gè)權(quán)限系統(tǒng),個(gè)人覺得對(duì)于基本的權(quán)限分配夠用了。
1、系統(tǒng)介紹:說是系統(tǒng),其實(shí)權(quán)限只是系統(tǒng)的一個(gè)模塊,此系統(tǒng)主要就是根據(jù)角色來分配權(quán)限的,通過角色分別控制用戶的菜單權(quán)限和菜單對(duì)應(yīng)頁面的按鈕權(quán)限。
2、數(shù)據(jù)表設(shè)計(jì):
(1)上圖

(2)表的DDL語句:
/*==============================================================*/ /* DBMS name: ORACLE Version 11g */ /* Created on: 2015/6/15 11:55:21 */ /*==============================================================*/ alter table TB_MenuRole drop constraint FK_TB_MENUR_REFERENCE_TB_ROLE; alter table TB_MenuRole drop constraint FK_TB_MENUR_REFERENCE_TB_MENU; alter table TB_UserRole drop constraint FK_TB_USERR_REFERENCE_TB_USERS; alter table TB_UserRole drop constraint FK_TB_USERR_REFERENCE_TB_ROLE; alter table TB_Users drop constraint FK_TB_USERS_REFERENCE_TB_DEPAR; drop table TB_Department cascade constraints; drop table TB_Menu cascade constraints; drop table TB_MenuRole cascade constraints; drop table TB_Role cascade constraints; drop table TB_UserRole cascade constraints; drop table TB_Users cascade constraints; /*==============================================================*/ /* Table: "TB_Department" */ /*==============================================================*/ create table TB_Department ( department_id VARCHAR(50) not null, department_name VARCHAR(50), parent_id VARCHAR(50), department_level VARCHAR(10), status VARCHAR(10), constraint PK_TB_DEPARTMENT primary key (department_id) ); /*==============================================================*/ /* Table: "TB_Menu" */ /*==============================================================*/ create table TB_Menu ( menu_id VARCHAR(50) not null, menu_name VARCHAR(50), menu_url VARCHAR(50), parent_id VARCHAR(50), menu_level VARCHAR(10), sort_order VARCHAR(50), status VARCHAR(10), remark VARCHAR(1000), constraint PK_TB_MENU primary key (menu_id) ); /*==============================================================*/ /* Table: "TB_MenuRole" */ /*==============================================================*/ create table TB_MenuRole ( id VARCHAR(50) not null, role_id VARCHAR(50), menu_id VARCHAR(50), role_type VARCHAR(10), button_id VARCHAR(50), constraint PK_TB_MENUROLE primary key (id) ); /*==============================================================*/ /* Table: "TB_Role" */ /*==============================================================*/ create table TB_Role ( role_id VARCHAR(50) not null, role_name VARCHAR(50), description VARCHAR(500), createtime DATE, modifytime DATE, constraint PK_TB_ROLE primary key (role_id) ); /*==============================================================*/ /* Table: "TB_UserRole" */ /*==============================================================*/ create table TB_UserRole ( id VARCHAR(50) not null, role_id VARCHAR(50), user_id VARCHAR(50), constraint PK_TB_USERROLE primary key (id) ); /*==============================================================*/ /* Table: "TB_Users" */ /*==============================================================*/ create table TB_Users ( user_id VARCHAR(50) not null, user_name VARCHAR(50), user_password VARCHAR(50), fullname VARCHAR(50), department_id VARCHAR(50), status VARCHAR(10), createtime DATE, modifytime DATE, remark VARCHAR(1000), constraint PK_TB_USERS primary key (user_id) ); comment on table TB_Users is '用戶信息表'; alter table TB_MenuRole add constraint FK_TB_MENUR_REFERENCE_TB_ROLE foreign key (role_id) references TB_Role (role_id); alter table TB_MenuRole add constraint FK_TB_MENUR_REFERENCE_TB_MENU foreign key (menu_id) references TB_Menu (menu_id); alter table TB_UserRole add constraint FK_TB_USERR_REFERENCE_TB_USERS foreign key (user_id) references TB_Users (user_id); alter table TB_UserRole add constraint FK_TB_USERR_REFERENCE_TB_ROLE foreign key (role_id) references TB_Role (role_id); alter table TB_Users add constraint FK_TB_USERS_REFERENCE_TB_DEPAR foreign key (department_id) references TB_Department (department_id);
(3) 表說明:權(quán)限模塊總共就6張表,即部門表、用戶表、角色表、用戶角色表、菜單表、菜單角色表(包含按鈕權(quán)限)。用戶表和角色表之間的關(guān)系是通用的多對(duì)多的關(guān)系,沒什么好說的。看看TB_MenuRole表,這個(gè)表用來存儲(chǔ)角色的菜單權(quán)限和按鈕權(quán)限,其中role_type取值為menu和button,如果是menu,則此行記錄用于存儲(chǔ)菜單權(quán)限,button_id為空;如果是button,則此行記錄用于存儲(chǔ)菜單下的某一個(gè)按鈕的權(quán)限,menu_id為按鈕所在的菜單id,button_id為對(duì)應(yīng)的按鈕id。還有一個(gè)問題就是按鈕的id從哪里來?是否還應(yīng)該有一個(gè)儲(chǔ)存按鈕ID的表呢?答案是不需要,后面會(huì)介紹。
3、效果圖:先做的是一個(gè)CS的系統(tǒng),后續(xù)還會(huì)做BS的。
3.1 權(quán)限模塊主要分為4大頁面:用戶管理、角色管理、部門管理和菜單管理

3.2 用戶管理頁面:

“設(shè)置角色”操作:

3.3 角色管理頁面:

“編輯權(quán)限”操作:

在“編輯權(quán)限”彈出框中點(diǎn)擊“設(shè)置按鈕操作”

角色管理頁面的“管理成員”操作:

可以新增當(dāng)前角色的用戶,點(diǎn)擊“新增”

3.4 部門管理頁面:

3.5 菜單管理頁面:

4、后臺(tái)業(yè)務(wù)邏輯都是簡(jiǎn)單的增刪改查,沒什么好說的。前面說的關(guān)于按鈕ID是否需要一張按鈕表的問題,我們系統(tǒng)在處理方式是

在點(diǎn)擊設(shè)置按操作的時(shí)候傳遞一個(gè)菜單url,然后在代碼里面通過反射得到所有的按鈕,然后勾選按鈕后保存到數(shù)據(jù)庫。注意一個(gè)頁面的按鈕的ID不會(huì)重復(fù),所以通過這樣可以取到唯一的按鈕,而在數(shù)據(jù)表TB_MenuRole中保存的如果是按鈕權(quán)限,是有保存Menu_Id的,所以不必?fù)?dān)心不同頁面的問題。這樣設(shè)計(jì)的好處是當(dāng)程序員在頁面上面新增刪除按鈕后不用修改配置,通過反射即可加載頁面的即時(shí)按鈕個(gè)數(shù)。純屬個(gè)人設(shè)計(jì),如果有問題,歡迎大俠們指正。

浙公網(wǎng)安備 33010602011771號(hào)