1 用户模块
1.2 登录
-
需求描述
用户在客户端输入用户名密码并向后端提交,后端根据用户名和密码判断登录是否成功,用户有误或者密码有误响应不同的提示信息!
-
接口描述
url地址: user/login
请求方式:POST
请求参数:
{
"username":"zhangsan", //用户名
"userPwd":"123456" //明文密码
}
响应数据:
成功
{
"code":"200", // 成功状态码
"message":"success" // 成功状态描述
"data":{
"token":"... ..." // 根据用户id的token
}
}
失败
{
"code":"501",
"message":"用户名有误"
"data":{}
}
{
"code":"503",
"message":"密码有误"
"data":{}
}
- 实现代码
- controller
@RestController
@RequestMapping("user")
//解决跨域访问问题
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
@PostMapping("login")
public Result login(@RequestBody User user){
Result result = userService.login(user);
System.out.println("result = " + result);
return result;
}
}
- service
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements UserService{
@Autowired
private JwtHelper jwtHelper;
@Autowired
private UserMapper userMapper;
/**
* 登录业务实现
* @param user
* @return result封装'
*
* 大概流程:
* 1. 账号进行数据库查询 返回用户对象
* 2. 对比用户密码(md5加密)
* 3. 成功,根据userId生成token -> map key=token value=token值 - result封装
* 4. 失败,判断账号还是密码错误,封装对应的枚举错误即可
*
* 登录需求
* 地址: /user/login
* 方式: post
* 参数:
* {
* "username":"zhangsan", //用户名
* "userPwd":"123456" //明文密码
* }
* 返回:
* {
* "code":"200", // 成功状态码
* "message":"success" // 成功状态描述
* "data":{
* "token":"... ..." // 用户id的token
* }
* }
*/
@Override
public Result login(User user) {
//根据账号查询
//创建一个条件构造器对象,并将等于条件封装入内(数据库中查找username值与传入user.username值一样的记录)
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername,user.getUsername());
User loginUser = userMapper.selectOne(queryWrapper);
//账号判断
if (loginUser == null) {
//账号错误
return Result.build(null, ResultCodeEnum.USERNAME_ERROR);
}
//判断密码
if (!StringUtils.isEmpty(user.getUserPwd())
&& loginUser.getUserPwd().equals(MD5Util.encrypt(user.getUserPwd())))
{
//账号密码正确
//根据用户唯一标识生成token
String token = jwtHelper.createToken(Long.valueOf(loginUser.getUid()));
Map data = new HashMap();
data.put("token",token);
return Result.ok(data);
}
//密码错误
return Result.build(null,ResultCodeEnum.PASSWORD_ERROR);
}
}
在idea中模拟发送Json数据,可以得到响应 , 返回一个token.
1.3 根据token获取用户信息
-
需求 : 第一次登录以后 , 客户一段时间内都不用再输入账号密码就能登录了 . 实现的原理就是 , 客户端发送请求头中包含token , 后端可以根据token获取登录用户的详细信息. 本次要求后端获取用户信息(密码除外)后返回给前端展示.
-
接口描述
url地址:user/getUserInfo
请求方式:GET
请求头:token: token内容
响应数据:
成功
{
"code": 200,
"message": "success",
"data": {
"loginUser": {
"uid": 1,
"username": "zhangsan",
"userPwd": "",
"nickName": "张三"
}
}
}
失败
{
"code": 504,
"message": "notLogin",
"data": null
}
- 代码编写
userController 新增:
@GetMapping("getUserInfo")
//RequstHeader注解提取请求头
public Result userInfo(@RequestHeader String token){
Result result = userService.getUserInfo(token);
return result;
}
userService新增:
Result getUserInfo(String token);
userServiceImpl新增:
/**
* 大概流程:
* 1.获取token,解析token对应的userId
* 2.根据userId,查询用户数据
* 3.将用户数据的密码置空,并且把用户数据封装到结果中key = loginUser
* 4.失败返回504 (本次先写到当前业务,后期提取到拦截器和全局异常处理器)
*/
@Override
public Result getUserInfo(String token) {
//判断是否过期,
boolean expiration = jwtHelper.isExpiration(token);
//若失效,返回响应码
if (expiration) {
return Result.build(null,ResultCodeEnum.NOTLOGIN);
} else {
int userId = jwtHelper.getUserId(token).intValue();
User user = userMapper.selectById(userId);
user.setUserPwd("");
Map data = new HashMap();
data.put("loginUser",user);
return Result.ok(data);
}
}
1.4 用户注册时检查用户名是否已被占用
-
需求描述 : 用户在注册时输入用户名时,立刻将用户名发送给后端,后端根据用户名查询用户名是否可用(是否被占用)并做出响应
-
接口描述
url地址:user/checkUserName
请求方式:POST
请求参数:param形式
username=zhangsan
响应数据:
成功
{
"code":"200",
"message":"success"
"data":{}
}
失败
{
"code":"505",
"message":"用户名占用"
"data":{}
}
- 代码编写
userController 新增:
/**
* url地址:user/checkUserName
* 请求方式:POST
* 请求参数:param形式
* username=zhangsan
*/
@PostMapping("checkUserName")
public Result checkUserName(@RequestParam(value = "username") String username){
Result result = userService.checkUsername(username);
return result;
}
userService新增:
Result checkUsername(String username);
userServiceImpl新增:
/**
* 实现步骤:
* 1. 根据传入的用户名去数据库中查询是否已有记录
* 2. 只要存在一条就被占用了
* 3. 结果封装
*/
@Override
public Result checkUsername(String username) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername , username);
Long count = userMapper.selectCount(queryWrapper);
if (count == 0){
return Result.ok(null);
} else {
return Result.build(null,ResultCodeEnum.USERNAME_USED);
}
}
1.4 用户注册
-
需求描述
客户端将新欲注册的用户名和密码发送给服务端, 存入之前校验用户名是否被占用, 校验通过响应成功提示并存入数据库, 否则响应失败提示 -
接口描述
url地址:user/regist
请求方式:POST
请求参数:
{
"username":"zhangsan",
"userPwd":"123456",
"nickName":"张三"
}
响应数据:
成功
{
"code":"200",
"message":"success"
"data":{}
}
失败
{
"code":"505",
"message":"用户名占用"
"data":{}
}
- 代码编写
userController 新增:
/**
* url地址:user/regist
* 请求方式:POST
* 请求参数: Json
*/
@PostMapping("regist")
public Result regist(@RequestBody User user){
Result result = userService.regist(user);
return result;
}
userService新增:
Result regist(User user);
userServiceImpl新增:
@Override
public Result regist(User user) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUsername , user.getUsername());
Long count = userMapper.selectCount(queryWrapper);
if (count == 0) {
//获取传入的密码,MD5加密后再存储进数据库
user.setUserPwd(MD5Util.encrypt(user.getUserPwd()));
int rows = userMapper.insert(user);
System.out.println("rows = " + rows);
return Result.ok(null);
} else {
return Result.build(null,ResultCodeEnum.USERNAME_USED);
}
}
返回