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/list
github
角色新增:/sysrole/add
golang
角色編輯:/sysrole/edit
spring
部門查詢:/sysdept/getTree
sql
菜單查詢:/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如何獲取插入記錄的自增加字段值
在插入方法中添加useGeneratedKeys
和keyProperty
屬性,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代碼生成器》
生成小工具下載地址