SpringBoot後臺權限管理系統(三)—權限模塊

SpringBoot 後臺權限框架搭建(一)—後臺框架搭建
SpringBoot後臺權限管理系統(二)—前端工程搭建
SpringBoot後臺權限管理系統(三)—權限模塊
SpringBoot後臺權限管理系統(四)—部署javascript

權限模塊主要包括用戶管理、部門管理、角色管理、菜單管理模塊。如下主要從數據庫表建立、頁面、
接口主要實現點的講述。
複製代碼

數據庫設計

數據庫關係圖

數據庫表說明

  • 用戶表:主要記錄用戶信息,登陸帳號、密碼等
  • 部門表:主要記錄部門相關信息
  • 角色表:主要記錄角色關係信息
  • 菜單表:主要記錄菜單相關信息
  • 用戶角色關係表:用戶和角色是多對多的關係
  • 角色部門關係表:部門和角色是多對多的關係
  • 角色菜單關係表:菜單和角色是多對多的關係

注意點

  • 部門表和菜單表都是樹形結構,在項目初始化時,在這兩張表中初始化一個根節點,方便以後查詢樹形結構(我是這麼解決的,也能夠用其餘方法解決),例如:前端

    insert into  sys_dept(dept_id,name) values(-1,'一級部門');
    insert into  sys_menu(menu_id,name) values(-1,'一級菜單');
    複製代碼
  • 關聯表中是有外鍵關聯的,以便於後期修改和刪除主表時,自動更新。java

用戶管理

前端頁面

  • 列表頁面

  • 新增頁面

  • 編輯頁面

  • 前端代碼路徑node

    ─views
        ├─sys
        │  ├─dept
        │  ├─dict
        │  ├─job
        │  ├─menu
        │  ├─role
        │  ├─task
        │  ├─test
        │  └─user
        
    複製代碼

接口設計

  • 列表查詢:後端接口訪問地址/sysuser/list
  • 新增用戶:/sysuser/adduser
  • 編輯用戶:/sysuser/edit
  • 刪除用戶:/sysuser/delete

注意點

  • 接口訪問方式:前端訪問接口使用axios方式,後端controller中使用@RequestBody標籤對象接收數據ios

    @RequestMapping(value = "adduser", method = RequestMethod.POST)
    public void addUser(@RequestBody SysUser sysUser, HttpServletRequest request, HttpServletResponse response){...}
    複製代碼
  • 權限管理:在接口上添加@RequiresPermissions註解,使接口擁有指定權限的人才能使用,在改系統中用戶權限配置在數據表中,權限註解代碼以下:git

    @RequiresPermissions("userInfo:view")//擁有userInfo:view權限才能查詢
    @RequestMapping(value = "list", method = RequestMethod.POST)
    @ResponseBody
    public JSONObject findList(@RequestBody SysUser sysUser, HttpServletRequest request, HttpServletResponse response) {
        List list = sysUserService.findList(sysUser);
        JSONObject obj = new JSONObject();
        obj.put("data", list);
        obj.put("code", 20000);
        obj.put("message", "success");
        return obj;
    }
    複製代碼

角色管理

前端頁面

  • 列表

  • 新增

  • 編輯

接口設計

  • 角色列表:/sysrole/listgithub

  • 角色新增:/sysrole/addgolang

  • 角色編輯:/sysrole/editspring

  • 部門查詢:/sysdept/getTreesql

  • 菜單查詢:/sysmenu/getTree

注意點

  • 菜單受權:在編輯頁面中的菜單受權默認勾選項,是在前端JS中根據後端查詢回來的數據處理的,代碼以下:

    getMenuTreeCheckedKeys: function(arr, node) {
        var that = this
        if (node.children.length === 0) {
            arr.push(node.menuId)
            return node.menuId
        }
        for (var index in node.children) {
        	that.getMenuTreeCheckedKeys(arr, node.children[index])
        }
        arr.push(node.menuId)
    }
    複製代碼
  • 數據受權:在前端JS中處理,代碼以下:

    getDeptTreeCheckedKeys: function(arr, node) {
        var that = this
        if (node.children.length === 0) {
        	arr.push(node.deptId)
        	return node.deptId
        }
        for (var index in node.children) {
        	that.getDeptTreeCheckedKeys(arr, node.children[index])
        }
        arr.push(node.deptId)
    }
    複製代碼

部門管理

前端頁面

  • 列表

  • 新增

  • 編輯

接口設計

  • 部門列表:/sysdept/getTree
  • 部門新增:/sysdept/add
  • 部門編輯:/sysdept/edit
  • 部門刪除:/sysdept/delete

注意點

  • 部門列表:由於列表是樹形結構,在查詢時傳遞樹的根節點deptId,前端請求以下:

    getTree({ deptId: '-1' }).then(response => {
    	that.depts = response.data.children
    })
    複製代碼

    後端代碼:

    @RequestMapping("getTree")
    @ResponseBody
    public JSONObject getTree(@RequestBody SysDept sysDept, HttpServletRequest request, HttpServletResponse response) {
        JSONObject jsonObject = new JSONObject();
        SysDept tree = new SysDept();
        tree = sysDeptService.getMenuTree(sysDept.getDeptId());
        jsonObject.put("code", 20000);
        jsonObject.put("data", tree);
        return jsonObject;
    }
    複製代碼
  • 部門刪除:因爲部門數據是樹形結構的,若是刪除的節點有孩子節點,不刪除,提示信息,主要代碼以下:

    @RequestMapping(value = "delete", method = RequestMethod.POST)
    public void delete(@RequestBody SysDept sysDeptParam, HttpServletRequest request, HttpServletResponse response) {
        int flag = 0;
        JSONObject jsonObject = new JSONObject();
        BigInteger deptId = sysDeptParam.getDeptId();
        SysDept tree = new SysDept();
        tree = sysDeptService.getMenuTree(deptId);
        if (tree.getChildren().size() == 0) {
            SysDept sysDept = new SysDept();
            sysDept.setDeptId(deptId);
            sysDept.setDelFlag(-1);
            flag = sysDeptService.delete(sysDept);
            if (flag > 0) {
                jsonObject.put("status", 200);
            } else {
                jsonObject.put("status", 500);
            }
        } else {
            jsonObject.put("status", 201);
        }
        jsonObject.put("code", 20000);
        try {
            response.getWriter().print(jsonObject.toJSONString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    複製代碼

菜單管理

前端頁面

  • 列表:

  • 新增

  • 編輯

接口設計

  • 列表查詢:/sysmenu/getTree
  • 菜單新增:/sysmenu/add
  • 菜單編輯:/sysmenu/edit
  • 菜單刪除:/sysmenu/delete

注意點

  • 菜單新增:能夠按照類型新增,目錄、菜單、按鈕
    • 目錄:在頁面左側顯示第一級別的目錄欄
    • 菜單:在左側目錄下包含的菜單
    • 按鈕:在頁面上顯示的按鈕(暫時未實現該功能)
  • 菜單受權:在添加菜單或修改菜單是,必定注意菜單路由受權標識 ,而且均可以配置多個,中間用英文;間隔。
    • 菜單路由:是前端點擊該菜單瀏覽器跳轉的路由
    • 受權標識:是後端shiro校驗的標識,須要和controller方法中的註解@RequiresPermissions一致

填坑

  • MyBatis如何獲取插入記錄的自增加字段值

    在插入方法中添加useGeneratedKeyskeyProperty屬性,useGeneratedKeys當設置爲 true 時,表示若是插入的表以自增列爲主鍵,則容許 JDBC 支持自動生成主鍵,並可將自動生成的主鍵返回。

    <insert id="insert" useGeneratedKeys="true" keyProperty="userId" parameterType="com.site.mountain.entity.SysUser">
            INSERT INTO sys_user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userId!=null">`user_id`,</if>
            <if test="username!=null">`username`,</if>
            <if test="password!=null">`password`,</if>
            <if test="email!=null">`email`,</if>
            <if test="mobile!=null">`mobile`,</if>
            <if test="status!=null">`status`,</if>
            <if test="deptId!=null">`dept_id`,</if>
            <if test="createTime!=null">`create_time`,</if>
    
        </trim>
        VALUES
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userId!=null">#{userId},</if>
            <if test="username!=null">#{username},</if>
            <if test="password!=null">#{password},</if>
            <if test="email!=null">#{email},</if>
            <if test="mobile!=null">#{mobile},</if>
            <if test="status!=null">#{status},</if>
            <if test="deptId!=null">#{deptId},</if>
            <if test="createTime!=null">#{createTime},</if>
    
        </trim>
    </insert>
    複製代碼
  • MySQL根據外鍵級聯刪除:表存儲引擎必須使用InnoDB引擎

  • 事務失效問題:springboot和shiro框架集成時,先加載shiro,這時sysUserService尚未實例化,致使事務失效, 在sysUserService 上加載 @Lazy ,主要代碼以下:

    public class MyShiroRealm extends AuthorizingRealm {
        @Autowired
        @Lazy
        private SysUserService sysUserService;
        
        ......
    }
    複製代碼

其餘

該項目我先是設計數據庫表的關係,而後用本身寫的小工具把數據庫錶轉成JavaBean、xml、mapper代碼,小工具請看個人 《golang 實現的mybatis代碼生成器》

生成小工具下載地址

待續...

  • 集成Swagger2
  • 集成quartz框架
  • 集成docker
相關文章
相關標籤/搜索