Springboot系列 3 - 創建簡單的用戶登陸系統

在開始編碼前,先創建幾個Package(能夠按我的習慣命名),如圖java

1.Controllers 用於存放控制器類git

2.Models 用於存放數據實體類數據庫

3.Repositories 用於存放數據庫操做接口api

4. Services 用於存放業務邏輯類數組

5. Tools用於存放工具類app

-----------------------------------------------------------------------------------------------------------------------------ide

1、創建User實體類工具

首先在Models下新建名爲User.java的實體類,post

代碼以下測試

 1 @Entity //實體注入  2 @Table(name = "sys_user") //映射對應代表  3 public class User {  4  @Id //主鍵Id  5     @GeneratedValue(strategy = GenerationType.IDENTITY)  6     private Long id;  7     private String userName;  8     private String hashedPassword;  9 
10     //省略getter和setter 11 
12     //重寫toString方法便於後期調試查看數據
13  @Override 14     public String toString() { 15         return "User{" +
16                 "id=" + id +
17                 ", userName='" + userName + '\'' +
18                 ", hashedPassword='" + hashedPassword + '\'' +
19                 '}'; 20  } 21 }

2、新建CrudRepostory接口

在Repositories下新建一個名爲UserRepository的接口,須要繼承CrudRepository

CrudRepository是包含基礎增刪改查操做的Repository

public interface UserRepository extends CrudRepository<User,Long> { }

其中不須要添加任何自定義方法就能夠實現基礎的數據庫操做

3、新建用戶登陸操做業務類

在Services下新建UserService.java

 1 @Service  2 public class UserService {  3     //Autowire裝配UserRepository數據庫操做類
 4  @Autowired  5  UserRepository userRepository;  6 
 7     /**
 8  * 基礎登陸邏輯  9  * @param userName 用戶名 10  * @param password MD5 hashed密碼 11  * @return
12      */
13     public boolean login(String userName,String password){ 14         Iterable<User> users = userRepository.findAll(); 15         for (User u: 16  users) { 17             if(u.getUserName().equals(userName) && u.getHashedPassword().equals(password)){ 18                 return true; 19  } 20  } 21         return false; 22  } 23 }

很簡單一個操做類,就很少做說明了

@Service註解表示這是一個Service類

4、創建Controller

在Controllers下創建UserController.java

 1 @RestController  2 @RequestMapping(value = "/api/account")  3 public class UserController {  4  @Autowired  5  UserService userService;  6     @RequestMapping(value = "/login/{username}/{password}",method = RequestMethod.GET)  7     public boolean login(@PathVariable("username") String userName,@PathVariable("password") String password){  8         return userService.login(userName,password);  9  } 10 }

@RequestMapping 路由地址

@RestController 註解表示這是一個RESTController

@PathVariable 表示這是一個路由變量

-------------------------------------------------------------------------------------------------------------------------------------------

沒什麼問題保存後,就能夠調試運行了

運行成功後,打開PostMan 經過Get方法訪問咱們的 http://localhost:8080/api/account/login/admin/admin

發送請求,因爲咱們數據庫中沒有任何數據,返回false

 

下邊咱們改造一下咱們的登陸結構,併爲數據庫添加一下基礎數據

首先在UserRepository.java添加一個getByUserName方法

1 public interface UserRepository extends CrudRepository<User,Long> { 2     //根據用戶名查找用戶
3     Optional<User> getByUserName(String userName); 4 }

爲了返回指定格式數據,咱們還要在Models下創建一個Result.java

 

 1 public class Result<T> {  2     private Integer errCode;  3     private String errMessage;  4     private T data;  5 
 6     //省略getter和setter
 7  @Override  8     public String toString() {  9         return "Result{" +
10                 "errCode=" + errCode +
11                 ", errMessage='" + errMessage + '\'' +
12                 ", data=" + data +
13                 '}'; 14  } 15 }

修改UserService.java,修改登陸邏輯,增長添加初始數據

 1 @Service  2 public class UserService {  3     //Autowire裝配UserRepository數據庫操做類
 4  @Autowired  5  UserRepository userRepository;  6 
 7     /**
 8  * 基礎登陸邏輯  9  * @param userName 用戶名 10  * @param password MD5 hashed密碼 11  * @return
12      */
13     public Result<Long> login(String userName, String password){ 14         Result<Long> result = new Result<>(); 15         User u = userRepository.getByUserName(userName).get(); 16         if(u == null){ 17             result.setErrCode(-1); 18             result.setErrMessage("用戶不存在"); 19         }else if(u.getHashedPassword().equals(password)){ 20  System.out.println(u.toString()); 21             result.setErrCode(0); 22  result.setData(u.getId()); 23         }else { 24             result.setErrCode(1); 25             result.setErrMessage("密碼錯誤"); 26  } 27         return result; 28  } 29 
30     public Result<User> add(User user){ 31         Result<User> result = new Result<>(); 32         User u = userRepository.save(user); 33         if(u != null){ 34             result.setErrCode(0); 35  result.setData(u); 36         }else { 37             result.setErrCode(-1); 38             result.setErrMessage("發生錯誤"); 39  } 40         return result; 41  } 42 
43     public void initUserData(){ 44         Iterable<User> users = userRepository.findAll(); 45         int sum = 0; 46         while (users.iterator().hasNext()){ 47  users.iterator().next(); 48             sum++; 49  } 50         if(sum == 0){ 51             for (int i = 0; i < 5; i++){ 52                 User user = new User(); 53                 user.setUserName("Admin" + i); 54                 String hashedPassword = Encrypt.stringMD5("Admin" + i); 55  user.setHashedPassword(hashedPassword); 56  add(user); 57  } 58  } 59 
60     }

其中用到的MD5加密類在Tools路徑中,代碼以下

import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Encrypt { public static String stringMD5(String input) { try { // 拿到一個MD5轉換器(若是想要SHA1參數換成」SHA1」)
            MessageDigest messageDigest =MessageDigest.getInstance("MD5"); // 輸入的字符串轉換成字節數組
            byte[] inputByteArray = input.getBytes(); // inputByteArray是輸入字符串轉換獲得的字節數組
 messageDigest.update(inputByteArray); // 轉換並返回結果,也是字節數組,包含16個元素
            byte[] resultByteArray = messageDigest.digest(); // 字符數組轉換成字符串返回
            return byteArrayToHex(resultByteArray); } catch (NoSuchAlgorithmException e) { return null; } } public static String byteArrayToHex(byte[] byteArray) { // 首先初始化一個字符數組,用來存放每一個16進制字符
        char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' }; // new一個字符數組,這個就是用來組成結果字符串的(解釋一下:一個byte是八位二進制,也就是2位十六進制字符(2的8次方等於16的2次方))
        char[] resultCharArray =new char[byteArray.length * 2]; // 遍歷字節數組,經過位運算(位運算效率高),轉換成字符放到字符數組中去
        int index = 0; for (byte b : byteArray) { resultCharArray[index++] = hexDigits[b>>> 4 & 0xf]; resultCharArray[index++] = hexDigits[b& 0xf]; } // 字符數組組合成字符串返回
        return new String(resultCharArray); } }

在UserController中增長一個初始化數據路由方法

@RequestMapping(value = "/",method = RequestMethod.GET) public void initData(){ userService.initUserData(); }

調試運行項目

PostMan先請求 http://localhost:8080/api/account/

查看數據庫,發現初始數據已經添加進來了

咱們繼續測試一下Login方法吧

(1)請求正確數據  http://localhost:8080/api/account/login/Admin1/2E33A9B0B06AA0A01EDE70995674EE23

返回 

{
"errCode": 0,
"errMessage": null,
"data": 2
}

返回正確

(2)請求錯誤數據 http://localhost:8080/api/account/login/Admin1/2E33A9B0B06A

返回

{
"errCode": 1,
"errMessage": "密碼錯誤",
"data": null
}

返回密碼錯誤,也符合咱們的結果

(3)請求不存在用戶數據 http://localhost:8080/api/account/login/blogn/2E33A9B0B06AA0A01EDE70995674

返回

{
"timestamp": "2018-07-17T13:52:24.082+0000",
"status": 500,
"error": "Internal Server Error",
"message": "No value present",
"path": "/api/account/login/blogn/2E33A9B0B06AA0A01EDE70995674"
}

系統自動返回500狀態碼,不符合預期,但也能夠做參考,影響不大

 

咱們簡單的用戶登陸系統及這樣了,其實咱們還能夠加入用戶註冊方法,你們能夠自行嘗試,我這裏就不下了

之後的代碼可能沒這麼詳細了,只對重點代碼作解釋

但願給你們作一個參考

相關文章
相關標籤/搜索