按鈕級別權限管理數據庫設計及後臺接口實現

目的:前端

  避免反覆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

相關文章
相關標籤/搜索