輕量級Web框架應用_第七週

回顧

上週內容比較簡單, 只有兩個接口:

  1. 添加用戶
  2. 刪除用戶

接口: 重置密碼

用戶修改自己的密碼, 是一個很常見的需求; 除此, 用戶有可能忘記自己的密碼, 需要讓管理員爲其重置密碼. 接下來我們就來編寫這兩個接口吧.

接口: 管理員重置密碼

需求分析:
管理員重置用戶密碼只需要知道用戶名即可,不需要從前端接收新的密碼, 我們可以在後端直接爲用戶生成一個固定的密碼,如:123456

用戶名
MD5+鹽值加密
前端
後端
密文
數據庫

首先我們在mapper層編寫重置密碼的方法和對應的sql語句
1.打開UserInfoMapper.java 新增一個更新密碼的方法

int updateUserPasswordByUserID(@Param("userID")int userID,@Param("password")String password, String salt);

2.打開UserInfoMapper.xml 編寫更新密碼的sql語句

  <update id="updateUserPasswordByUserID">
   UPDATE user_info
   SET `password` = #{password},
   salt = #{salt}
   WHERE user_id= #{userID}
 </update>

3.打開UserService 編寫業務方法

void resetPassword(String userName) throws Exception;

4.打開UserServiceImpl去實現3方法的具體操作

@Override
public void resetPassword(String userName) throws Exception {
   //首先我們通過用戶名取到用戶ID
   int userID = userInfoMapper.findFirstByUserName(userName).getUserId();
   //初始化密碼爲123456
   String password = "123456";
   //利用UUID生成隨機的鹽值
   String salt = UUID.randomUUID().toString().replace("-","");
   //使用MD5算法和鹽值生成密文
   SimpleHash simpleHash = new SimpleHash(Md5Hash.ALGORITHM_NAME,password,salt,512);
   //修改數據庫中對應用戶的鹽值和密文
   userInfoMapper.updateUserPasswordByUserID(userID,simpleHash.toString(),salt);
}

5.最後在UserController中調用service的方法

   @PutMapping("/resetPassword")
   @RequiresRoles(value = {"admin"},logical = Logical.OR)
   @ApiImplicitParams({
           @ApiImplicitParam(name = "token", value = "鑑權用戶",required = true,paramType = "header"),
           @ApiImplicitParam(name = "userName")
   })
   public ResultJson resetPassword(String userName){
       try {
           userService.resetPassword(userName);
           return new ResultJson("200","密碼成功重置爲123456","");
       }catch (Exception e){
           return new ResultJson("400","failed","");
       }
   }

接口: 用戶重置密碼

需求分析:

  • 用戶必須是登錄狀態
  • 要求用戶輸入舊密碼進行驗證
  • 輸入新密碼
用戶名,舊密碼,新密碼
舊密碼不匹配
MD5+鹽值加密
前端
後端
修改失敗
密文
數據庫

由於對數據庫的操作是一模一樣的, 所以我們mapper層就不用再寫一次了, 複用剛纔寫好的就行啦! 直接從service層開始就好
1.打開UserService編寫用戶修改的業務方法

void resetSelfPassword(String userName, String password) throws Exception;

2.在UserServiceImpl中實現它

@Override
public void resetSelfPassword(String userName, String password) throws Exception {
	//這裏業務邏輯和管理員重置密碼幾乎一樣
	//唯一的差別就是用戶重置的密碼的通過前端傳來的, 而不是一個固定的值
	//注意考慮考慮代碼複用的問題, 這就留給你們自己思考啦!
	//通過用戶名取得用戶ID
    int userID = userInfoMapper.findFirstByUserName(userName).getUserId();
    //使用UUID生成隨機的鹽值
    String salt = UUID.randomUUID().toString().replace("-","");
    //通過MD5算法和鹽值共同生成密文
    SimpleHash simpleHash = new SimpleHash(Md5Hash.ALGORITHM_NAME,password,salt,512);
	//修改數據庫中對應用戶的鹽值和密文
    userInfoMapper.updateUserPasswordByUserID(userID,simpleHash.toString(),salt);
}

3.最後在UserController中編寫接口

@ApiImplicitParams({
        @ApiImplicitParam(name = "token", value = "鑑權用戶", required = true, paramType = "header"),
        @ApiImplicitParam(name = "oldPassword", value = "舊密碼", required = true),
        @ApiImplicitParam(name = "newPassword", value = "新密碼", required = true)
})
@PutMapping("/resetSelfPassword")
public ResultJson resetSelfPassword(String oldPassword, String newPassword){
    //由於用戶已經是登錄的, 這裏可以直接取出用戶的信息
    Subject subject = SecurityUtils.getSubject();
    UserInfo userInfo = (UserInfo) subject.getPrincipals().getPrimaryPrincipal();
    String userName = userInfo.getUserName();
    String salt = userInfo.getSalt();
    //將用戶傳入的舊密碼和數據庫中的密碼進行匹配
    //注意我們數據庫中存儲的密碼是密文, 且MD5加密算法不可逆
    //所以我們要將用戶傳入的舊密碼進行加密,用密文和數據庫中的密碼進行匹配
    SimpleHash simpleHash = new SimpleHash(Md5Hash.ALGORITHM_NAME,oldPassword,salt,512);
    if(!simpleHash.toString().equals(userInfo.getPassword())){
        return new ResultJson("400","修改密碼失敗, 原密碼不匹配!",null);
    }else {
        try {
            userService.resetSelfPassword(userName,newPassword);
            return new ResultJson("200","密碼修改成功!",null);
        }catch (Exception e){
            e.printStackTrace();
            return new ResultJson("400","密碼修改失敗",null);
        }
    }
}

這樣我們的兩個簡單的重置密碼接口就寫好啦.

常用的用戶接口

  1. 獲取所有用戶信息
  2. 根據用戶名獲取單個用戶信息
  3. 管理員修改用戶當前狀態
  4. 修改用戶所屬角色

接口: 根據用戶名獲取用戶信息

分析: 在實際應用中, 哪些數據是應該返回給前端的, 哪些數據是不應該的; 首先密碼, 鹽值這顯然不需要返回給用戶, 一般來說前端還會需要知道這個用戶所屬的角色, 甚至是用戶具有的權限等…
由於我們返回的數據類型比較複雜, 所以通常我們會用對象(JSON)的方式來展示數據, 一般來說會有個VO層, 有興趣的同學可以瞭解一下

1.編寫用來展示用戶數據的vo
在這裏插入圖片描述
2.在UserService層中編寫方法, 並在UserServiceImpl中實現它
在這裏插入圖片描述
在這裏插入圖片描述
3.在UserController中調用service
在這裏插入圖片描述
4.結果: 最終我們拿到的數據格式就是這樣的啦
在這裏插入圖片描述

接口: 獲取所有用戶信息

能獲取一個, 獲取所有就很簡單啦, 這裏就不細寫了, 提示: 將前面我們寫的獲取單個用戶的service改造一下, 把返回值VoUserInfo改爲List< VoUserInfo>
給你們個結果參考吧:
在這裏插入圖片描述

接口: 管理員修改用戶狀態

用戶狀態我們在Shrio中有配置過, 如果其狀態2的時候, 禁用該用戶
在這裏插入圖片描述
那我們就來寫一個禁用用戶的接口吧
1.mapper中編寫sql和對應方法
在這裏插入圖片描述
2.service中編寫業務方法並在Impl層中實現它
在這裏插入圖片描述
3.controller中調用service
在這裏插入圖片描述
4.結果
在這裏插入圖片描述
嘗試使用剛纔禁用的用戶登錄:
在這裏插入圖片描述
接口啓用用戶同理, 這裏就不寫啦 !

接口: 修改用戶所屬角色

注意一個細節, 用戶和角色之間的關係是多對多,
前端在接收參數的時候應該是接收一個用戶名 和 角色名稱的數組
也就是說, 在數據庫中, 如果用戶ID爲1的用戶擁有多個角色, 在更新該用戶信息的時候的SQL就不應該使用update table set field=value的方式! ! !
而應該將其所擁有的角色delete再執行insert
1.mapper層編寫對應的sql
在這裏插入圖片描述
在這裏插入圖片描述
2.service層編寫對應的業務邏輯並在impl層實現它
在這裏插入圖片描述
3.controller層中調用service
在這裏插入圖片描述
4.結果:
我們先來看看用戶admin的角色信息
在這裏插入圖片描述
我們試着將其的manager角色刪除, 只保留admin角色
在這裏插入圖片描述
再試試將admin, manager, staff三個角色都賦給用戶admin
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章