這裡主要介紹該系統的總體功能,以及登入功能的實作。
GitHub代碼後端位址:https://github.com/qiuxinfa/springboot-shiro-vue-stu
GitHub代碼前端位址:https://github.com/qiuxinfa/boot-shiro-vue-stu-client
一、總體功能
目前整個系統分為3種角色(可以增加其他角色),包括管理者、老師、學生,各自擁有不同的權限,具體看圖和代碼(資料庫裡面權限的設計,參考第一篇)。
1.管理者:
2.老師:
3.學生:
每個角色都可以檢視使用者清單,因為登入成功之後,預設是進入使用者清單的,簡單說一下老師和學生的功能:
(1)老師擁有:檢視自己負責的課程,選擇該課程的學生,以及可以錄入成績,并可以檢視成績統計分析(在開發中。。。)
(2)學生可以選課,檢視成績
4.後端代碼總體結構:
(1)spect
主要利用AOP功能對請求進行攔截,進入日志記錄和操作記錄,以及權限判斷處理。
(2)config
配置檔案,主要包括mybatis配置,跨域配置,shiro配置
(3)controller
前背景互動的接口
(4)exception
利用@ControllerAdvice注解,實作全局異常處理
(5)ftp
檔案上傳,這裡主要處理頭像的上傳
(6)mapper
dao層接口以及mybatis映射檔案
(7)pojo
實體類
(8)service
業務邏輯層
(9)shiro
自定義shiro身份認證,這裡沒有用到權限,權限的處理,都在aspect進行攔截處理
(10)utils
統一結果傳回形式,以及相關常量的定義
二、登入功能
實作思路:
1.前端采用使用者名+密碼的方式登入
2.後端根據前端傳過來的使用者名和密碼,到資料庫查詢,如果查到了使用者,則根據使用者的角色查找權限,并傳回
3.前端根據傳回的狀态碼進行判斷是否登入成功(狀态為200則成功)
4.後端相關代碼:
(1)controller
@RequestMapping(value = "/login",method = RequestMethod.POST)
public Object login(String name,String pass, HttpSession session, HttpServletRequest request) {
User user = new User();
user.setUsername(name);
user.setPassword(pass);
return userService.login(user, session, request);
}
(2)serviceImpl
@Override
public Object login(User u, HttpSession session, HttpServletRequest request) {
UsernamePasswordToken upToken = new UsernamePasswordToken(u.getUsername(), SecureUtil.md5(u.getPassword()));
Subject subject = SecurityUtils.getSubject();
subject.login(upToken);
User user = (User) subject.getPrincipal();
session.setAttribute("user", user);
// 登入日志
LoginLog loginLog = new LoginLog();
loginLog.setUserId(user.getId());
loginLog.setLoginTime(new Date());
loginLog.setLoginIp(request.getRemoteAddr());
loginLog.setLoginTotal(loginLogService.findMaxLoginTatalByUserId(user.getId())); // 登入總次數
loginLogService.insert(loginLog);
// 根據使用者類型查詢 一級菜單
List<Perms> parentList = rolePermissionService.findRolesPermisByFatherId(null, user.getRoleId());
List<Perms> sonList = null;
List<Perms> sonssonList = null;
for (int i = 0, j = parentList.size(); i < j; i++) {
// 二級 頁面
sonList = rolePermissionService.findRolesPermisByFatherId(parentList.get(i).getId(), user.getRoleId());
for (int k = 0, l = sonList.size(); k < l; k++) {
// 三級 按鈕
sonssonList = rolePermissionService.findRolesPermisByFatherId(sonList.get(k).getId(), user.getRoleId());
sonList.get(k).setChildren(sonssonList);
}
parentList.get(i).setChildren(sonList);
}
user.setUserPerms(parentList);
user.setLastLoginTime(new Date());
super.updateById(user);
return ResultUtil.result(EnumCode.OK.getValue(), "登陸成功", JSON.toJSON(user));
}
3.根據父權限id和角色id查詢菜單的sql
<select id="findRolesPermisByFatherId" resultType="com.qxf.pojo.Perms">
<if test="null == parentId">
SELECT
p.`name`,
p.url,
p.id
FROM
`t_perms` AS p LEFT JOIN t_role_perms AS rp ON p.id = rp.perms_id
WHERE
p.parent_id = '0'
<if test="null != roleId and ''!=roleId">
AND rp.role_id = #{roleId}
</if>
GROUP BY p.sort
</if>
<if test="null != parentId">
SELECT
p.`name`,
p.url,
p.id
FROM t_perms AS p LEFT JOIN t_role_perms AS rp ON p.id = rp.perms_id
WHERE
p.parent_id = #{parentId}
<if test="null != roleId and ''!=roleId">
AND rp.role_id = #{roleId}
</if>
GROUP BY p.sort
</if>
</select>