目的:前端
避免反覆coding ,將此做爲一個 component ,任何項目只需複製起表結構和後臺代碼便可使用,前端樣式可根據項目需求作改動,只需調用後臺提供的接口便可。java
語言:javamysql
數據庫:mysql算法
數據庫設計: 一共 5 張表 ,分別是用戶表(t_sec_user),角色表(t_sec_role),菜單表(t_sec_menu),用戶角色關係表(t_sec_re_user_role) , 角色菜單關係表(t_sec_re_role_menu)。sql
這裏的邏輯主要是 :一個用戶可以操做哪些菜單 做爲一個‘組' ,'組'在這裏的定義是 對菜單而言的 。對用戶而言,假設 n個的用戶都是很奇怪的 ,他們都想擁有不一樣的操做菜單。做爲開發人員的咱們,對於這種想法徹底能夠不用管。在咱們心中 無論用戶數量再多,咱們都能用一個規則去劃分用戶類別,在同一個類別的用戶 所操做的菜單是同樣的 。簡單理解 就是 菜單是小兵,角色是軍隊的頭銜 ,用戶 就是能夠賦予這些頭銜的人類。用戶可以控制哪些小兵,是要看他是怎樣的頭銜(角色)。數據庫
建表sql 以下:數組
1 /* 2 Navicat MySQL Data Transfer 3 4 Source Server : 127.0.0.1mysql 5 Source Server Version : 50519 6 Source Host : localhost:3306 7 Source Database : pms 8 9 Target Server Type : MYSQL 10 Target Server Version : 50519 11 File Encoding : 65001 12 13 Date: 2017-08-13 00:23:56 14 */ 15 16 SET FOREIGN_KEY_CHECKS=0; 17 18 -- ---------------------------- 19 -- Table structure for t_sec_menu 20 -- ---------------------------- 21 DROP TABLE IF EXISTS `t_sec_menu`; 22 CREATE TABLE `t_sec_menu` ( 23 `id` varchar(128) NOT NULL, 24 `name` varchar(128) DEFAULT NULL COMMENT '菜單名', 25 `display_name` varchar(128) DEFAULT NULL COMMENT '菜單展現名', 26 `router` varchar(1024) DEFAULT NULL COMMENT '前端跳轉路由', 27 `params` varchar(4096) DEFAULT NULL COMMENT '參數', 28 `active` decimal(1,0) DEFAULT NULL COMMENT '是否啓用', 29 `read_only` decimal(1,0) DEFAULT NULL COMMENT '是否只讀 1 只讀 ', 30 `parent` varchar(128) DEFAULT NULL COMMENT '父級id', 31 `sence` varchar(128) DEFAULT NULL COMMENT '場景', 32 `m_icon` varchar(128) DEFAULT NULL COMMENT '圖標樣式', 33 `note` varchar(1024) DEFAULT NULL COMMENT '備註', 34 `seq` int(38) DEFAULT NULL COMMENT '序號', 35 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '建立時間', 36 `create_user` varchar(128) DEFAULT NULL COMMENT '建立用戶', 37 `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時間', 38 `update_user` varchar(128) DEFAULT NULL COMMENT '修改用戶', 39 `delete_flag` decimal(1,0) DEFAULT NULL COMMENT '刪除標誌', 40 PRIMARY KEY (`id`) 41 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜單項'; 42 43 -- ---------------------------- 44 -- Records of t_sec_menu 45 -- ---------------------------- 46 47 -- ---------------------------- 48 -- Table structure for t_sec_re_role_menu 49 -- ---------------------------- 50 DROP TABLE IF EXISTS `t_sec_re_role_menu`; 51 CREATE TABLE `t_sec_re_role_menu` ( 52 `id` varchar(128) NOT NULL, 53 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '建立時間', 54 `create_user` varchar(128) DEFAULT NULL COMMENT '建立用戶', 55 `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時間', 56 `update_user` varchar(128) DEFAULT NULL COMMENT '修改用戶', 57 `delete_flag` decimal(1,0) DEFAULT NULL COMMENT '刪除標誌', 58 `role_id` varchar(128) DEFAULT NULL COMMENT '角色id', 59 `menu_id` varchar(128) DEFAULT NULL COMMENT '菜單id', 60 PRIMARY KEY (`id`) 61 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色菜單關係表'; 62 63 -- ---------------------------- 64 -- Records of t_sec_re_role_menu 65 -- ---------------------------- 66 67 -- ---------------------------- 68 -- Table structure for t_sec_re_user_role 69 -- ---------------------------- 70 DROP TABLE IF EXISTS `t_sec_re_user_role`; 71 CREATE TABLE `t_sec_re_user_role` ( 72 `id` varchar(128) NOT NULL, 73 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '建立時間', 74 `create_user` varchar(128) DEFAULT NULL COMMENT '建立用戶', 75 `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時間', 76 `update_user` varchar(128) DEFAULT NULL COMMENT '修改用戶', 77 `delete_flag` decimal(1,0) DEFAULT NULL COMMENT '刪除標誌', 78 `role_id` varchar(128) DEFAULT NULL COMMENT '角色 id', 79 `user_id` varchar(128) DEFAULT NULL COMMENT '用戶id', 80 PRIMARY KEY (`id`) 81 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶角色關聯表'; 82 83 -- ---------------------------- 84 -- Records of t_sec_re_user_role 85 -- ---------------------------- 86 87 -- ---------------------------- 88 -- Table structure for t_sec_role 89 -- ---------------------------- 90 DROP TABLE IF EXISTS `t_sec_role`; 91 CREATE TABLE `t_sec_role` ( 92 `id` varchar(128) NOT NULL, 93 `name` varchar(128) DEFAULT NULL COMMENT '角色名', 94 `note` varchar(2048) DEFAULT NULL COMMENT '備註信息', 95 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '建立時間', 96 `create_user` varchar(128) DEFAULT NULL COMMENT '建立用戶', 97 `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時間', 98 `update_user` varchar(128) DEFAULT NULL COMMENT '修改用戶', 99 `delete_flag` decimal(1,0) DEFAULT NULL COMMENT '刪除標誌', 100 PRIMARY KEY (`id`) 101 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色'; 102 103 -- ---------------------------- 104 -- Records of t_sec_role 105 -- ---------------------------- 106 107 -- ---------------------------- 108 -- Table structure for t_sec_user 109 -- ---------------------------- 110 DROP TABLE IF EXISTS `t_sec_user`; 111 CREATE TABLE `t_sec_user` ( 112 `id` varchar(128) NOT NULL, 113 `name` varchar(128) DEFAULT NULL COMMENT '登錄用戶名', 114 `password` varchar(1024) DEFAULT NULL COMMENT '密碼', 115 `display_name` varchar(128) DEFAULT NULL COMMENT '前臺展現名', 116 `telephone` varchar(64) DEFAULT NULL COMMENT '辦公電話', 117 `mobile` varchar(64) DEFAULT NULL COMMENT '移動電話', 118 `fax` varchar(64) DEFAULT NULL COMMENT '傳真', 119 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', 120 `create_user` varchar(128) DEFAULT NULL COMMENT '建立用戶', 121 `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時間', 122 `pwd_update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最近密碼更改時間', 123 `update_user` varchar(128) DEFAULT NULL COMMENT '修改用戶', 124 `delete_flag` decimal(1,0) DEFAULT NULL COMMENT '刪除標誌', 125 PRIMARY KEY (`id`) 126 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表'; 127 128 -- ---------------------------- 129 -- Records of t_sec_user 130 -- ----------------------------
後臺結構 這裏 我使用腳手架自動生成,詳細代碼就不展示了,無非是數據的增刪改查,主要結構以下,session
在用戶登錄時,將用戶信息放入session 中,登錄成功後,發出獲取菜單請求,後臺取出session 中的用戶信息(用到的是 用戶id),根據用戶的id 關聯查詢出,該用戶能操做的全部菜單項 。這時候須要整合下 菜單項,由於若是是一次性查出全部菜單,結果是一個List ,並非一個樹狀菜單 ,由於菜單有一個parent 字段表示該菜單的父級菜單, 若是parent爲null 那麼這就是一個頂級菜單,不爲空則爲子菜單, 這裏的整合無非就是 將一個數組,整合成一個樹,這個算法很簡單,架構
@Override public List<Menu> getAllMenuByUser(String id) { String allMenuSql = getAllMenuSql(); StringBuffer sql = new StringBuffer() ; sql.append(allMenuSql) ; List params = new ArrayList(); params.add(id); //查詢到該用戶能操做的菜單項數組 List<Menu> allMenus = getDataBase().query4Model(sql.toString(),Menu.class ,params.toArray()); List<Menu> tmpMenus = new ArrayList(); //存放菜單樹 if (allMenus != null) { for (int i = 0,length = allMenus.size(); i <length; i++) { Menu menu = allMenus.get(i) ; if (StringUtils.isEmpty(menu.getParent())){ //若是沒有父親 那本身就是 最上層父級菜單 List<Menu> childMenus = findChildren(menu,allMenus); if (childMenus!=null && childMenus.size() >0){ menu.setChildren(childMenus); } tmpMenus.add(menu); } } } return tmpMenus ; }
/** * 遞歸找孩子 * @param menu * @param allMenus * @return */ private List<Menu> findChildren(Menu menu, List<Menu> allMenus) { if (menu.getChildren() == null) { menu.setChildren(new ArrayList<Menu>()); } for (int i = 0,length = allMenus.size(); i < length; i++) { Menu child = allMenus.get(i) ; if (!StringUtils.isEmpty(child.getParent())){ if (child.getParent().equals(menu.getId())){ List<Menu> childrenMenu = findChildren(child,allMenus); if (childrenMenu!=null && childrenMenu.size() >0){ child.setChildren(childrenMenu); } menu.getChildren().add(child); } } } return menu.getChildren(); }
黃色部分,根據本身後臺架構作更改,主要是查詢到該用戶能操做的菜單項數組。app