使用断言Assert封装一些判断&一般登录流程开发,业务单元化,异常在控制层处理
断言工具
public class AssertUtil {
public static void isTrue(Boolean flag, String msg){
if(flag){
throw new RuntimeException(msg);
}
}
}
登录流程
/**
*
⽤户登录
*
1.
验证参数
*
姓名 ⾮空判断
*
密码 ⾮空判断
*
2.
根据⽤户名,查询⽤户对象
*
3.
判断⽤户是否存在
*
⽤户对象为空,记录不存在,⽅法结束
*
4.
⽤户对象不为空
*
⽤户存在,校验密码
*
密码不正确,⽅法结束
*
5.
密码正确
*
⽤户登录成功,返回⽤户的相关信息 (定义
UserModel
类,返回⽤户某些信息)
*/
登录实现,各步骤模块化
/**
* ⽤户登录
* @param userName
* @param userPwd
* @return
*/
public UserModel userLogin(String userName, String userPwd) {
// 1. 验证参数
checkLoginParams(userName, userPwd);
// 2. 根据⽤户名,查询⽤户对象
User user = userMapper.queryUserByUserName(userName);
// 3. 判断⽤户是否存在 (⽤户对象为空,记录不存在,⽅法结束)
AssertUtil.isTrue(null == user, "⽤户不存在或已注销!");
// 4. ⽤户对象不为空(⽤户存在,校验密码。密码不正确,⽅法结束)
checkLoginPwd(userPwd, user.getUserPwd());
// 5. 密码正确(⽤户登录成功,返回⽤户的相关信息)
return buildUserInfo(user);
}
/**
* 构建返回的⽤户信息
* @param user
* @return
*/
private UserModel buildUserInfo(User user) { UserModel userModel = new UserModel();
// 设置⽤户信息
userModel.setUserId(user.getId());
userModel.setUserName(user.getUserName());
userModel.setTrueName(user.getTrueName());
return userModel;
}
/**
* 验证登录密码
* @param userPwd 前台传递的密码
* @param upwd 数据库中查询到的密码
* @return
*/
private void checkLoginPwd(String userPwd, String upwd) {
// 数据库中的密码是经过加密的,将前台传递的密码先加密,再与数据库中的密码作⽐较
userPwd = Md5Util.encode(userPwd);
// ⽐较密码
AssertUtil.isTrue(!userPwd.equals(upwd), "⽤户密码不正确!");
}
/**
* 验证⽤户登录参数
* @param userName
* @param userPwd
*/
private void checkLoginParams(String userName, String userPwd) {
// 判断姓名
AssertUtil.isTrue(StringUtils.isBlank(userName), "⽤户姓名不能为空!");
// 判断密码
AssertUtil.isTrue(StringUtils.isBlank(userPwd), "⽤户密码不能为空!");
}
service层直接将异常抛出,由controller进行进一步的处理
/**
* ⽤户登录
* @param userName
* @param userPwd
* @return
*/
@PostMapping("user/login")
@ResponseBody
public ResultInfo userLogin (String userName, String userPwd) {
ResultInfo resultInfo = new ResultInfo();
// 通过 try catch 捕获 Service 层抛出的异常
try {
// 调⽤Service层的登录⽅法,得到返回的⽤户对象
UserModel userModel = userService.userLogin(userName, userPwd);
/**
* 登录成功后,有两种处理:
* 1. 将⽤户的登录信息存⼊ Session ( 问题:重启服务器,Session 失效,客户
端需要重复登录 )
* 2. 将⽤户信息返回给客户端,由客户端(Cookie)保存
*/
// 将返回的UserModel对象设置到 ResultInfo 对象中
resultInfo.setResult(userModel);
} catch (ParamsException e) {
// ⾃定义异常
e.printStackTrace();
// 设置状态码和提示信息
resultInfo.setCode(e.getCode());
resultInfo.setMsg(e.getMsg());
} catch (Exception e) {
e.printStackTrace();
resultInfo.setCode(500);
resultInfo.setMsg("操作失败!");
}
return resultInfo;
}
}