目录
接口说明
接口url:/register
请求方式:POST
post传参意味着请求参数是按照json方式传
请求参数:
参数名称 | 参数类型 | 说明 |
---|---|---|
account | string | 账号 |
password | string | 密码 |
nickname | string | 昵称 |
返回数据:
{
"success": true,
"code": 200,
"msg": "success",
"data": "token"
}
编码实现
Controller控制层
RegisterController:
package com.huing.blog.controller;
import com.huing.blog.service.LoginService;
import com.huing.blog.vo.Result;
import com.huing.blog.vo.params.LoginParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author huing
* @Create 2022-07-05 17:16
*/
@RestController
@RequestMapping("register")
public class RegisterController {
@Autowired
private LoginService loginService;
/**
* 注册
* @param loginParam
* @return
*/
@PostMapping
public Result register(@RequestBody LoginParam loginParam){
return loginService.register(loginParam);
}
}
Service业务逻辑层
LoginService接口(加上事务注解):
package com.huing.blog.service;
import com.huing.blog.dao.pojo.SysUser;
import com.huing.blog.vo.Result;
import com.huing.blog.vo.params.LoginParam;
import org.springframework.transaction.annotation.Transactional;
/**
* @author huing
* @create 2022-07-04 15:29
*/
@Transactional
public interface LoginService {
/**
* JWT登录
*
* @param loginParam
*/
Result login(LoginParam loginParam);
/**
* 检验token合法性,拿到redis中的user信息
* @param token
* @return
*/
SysUser checkToken(String token);
/**
* 退出登录
* @param token
* @return
*/
Result logout(String token);
/**
* 注册
* @param loginParam
* @return
*/
Result register(LoginParam loginParam);
}
LoginServiceImpl实现类:
@Override
public Result register(LoginParam loginParam) {
/**
* 1.判断参数是否合法
* 2.判断账户是否存在 存在,返回账户已经被注册
* 3.如果不存在,注册用户
* 4.生成token
* 5.存入redis并返回
* 6.注意,加上事务,中间任何过程出现问题,注册的用户需要回滚
*/
String account = loginParam.getAccount();
String password = loginParam.getPassword();
String nickname = loginParam.getNickname();
if (StringUtils.isBlank(account) || StringUtils.isBlank(password) || StringUtils.isBlank(nickname)){
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMsg());
}
SysUser user = sysUserService.findUserByAccount(account);
if (user != null){
return Result.fail(ErrorCode.ACCOUNT_EXIST.getCode(),ErrorCode.ACCOUNT_EXIST.getMsg());
}
//注册用户
SysUser sysUser = new SysUser();
sysUser.setNickname(nickname);
sysUser.setAccount(account);
sysUser.setPassword(DigestUtils.md5Hex(password+salt));
sysUser.setCreateDate(System.currentTimeMillis());
sysUser.setLastLogin(System.currentTimeMillis());
sysUser.setAvatar("/static/img/logo.9d2457d.png");
sysUser.setAdmin1(1); //1 为true
sysUser.setDeleted(0); // 0 为false
sysUser.setSalt("");
sysUser.setStatus("");
sysUser.setEmail("");
sysUserService.save(sysUser);
//生成token
String token = JWTUtils.createToken(sysUser.getId());
//保存到redis中
redisTemplate.opsForValue().set("TOKEN_" + token,JSON.toJSONString(sysUser),1,TimeUnit.DAYS);
return Result.success(token);
}
sysUserService.findUserByAccount(account)和sysUserService.save(sysUser)接口:
/**
* 根据用户名查找用户信息
* @param account
* @return
*/
SysUser findUserByAccount(String account);
/**
* 保存用户信息
* @param sysUser
*/
void save(SysUser sysUser);
SysUserService实现类:
@Override
public SysUser findUserByAccount(String account) {
LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUser::getAccount,account);
queryWrapper.last("limit 1");
SysUser sysUser = sysUserMapper.selectOne(queryWrapper);
return sysUser;
}
@Override
public void save(SysUser sysUser) {
//保存用户 id自动生成
//这个地方 默认生成的id是 分布式id 雪花算法
//mybatis-plus
sysUserMapper.insert(sysUser);
}
前端测试