实现效果:
实现用户注册完进行登陆系统,进入博客
技术栈:
- Lombok(@Data自动生成get和set方法)
- mybatis-plus(生成了多数简单的sql)
- queryWrapper
目录结构
实现(持久层)
无需实现持久层代码,无需写sql
实现(业务层)
1.业务层接口IUserService
public interface IUserService extends IService<User> {
/**
* 注册一个学生
* @param registerVo
*/
void registerStudent(RegisterVo registerVo);
}
2.业务层实现类UserServiceImpl
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
@Autowired
private UserMapper userMapper;
@Autowired
private ClassroomMapper classroomMapper;
@Autowired
private UserRoleMapper userRoleMapper;
private BCryptPasswordEncoder passwordEncoder=new BCryptPasswordEncoder();
/**
* 注册一个学生
* 涉及持久层操作(持久层)
* 1:classroom查询邀请码是否正确
* 2:user表查询(用户名)手机号是否存在
* 3:插入user表
* 4:插入userRole表
* @param registerVo 学生对象
*/
@Override
public void registerStudent(RegisterVo registerVo) {
if(registerVo==null){
throw ServiceException.unprocesableEntiry("表单数据为null");
}
// 查询邀请码对应的班级,验证邀请码
QueryWrapper<Classroom> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("invite_code",registerVo.getInviteCode());
Classroom classroom = classroomMapper.selectOne(queryWrapper);
log.debug("找到邀请码对应的班级 {}", classroom);
if(classroom==null){
throw ServiceException.unprocesableEntiry("邀请码错误!");
}
// 验证手机号是否注册过
User u = userMapper.finUserByUsername(registerVo.getPhone());
if(u!=null){
throw ServiceException.unprocesableEntiry("手机号已经注册过!");
}
User user=new User();
user.setUsername(registerVo.getPhone());
user.setClassroomId(classroom.getId());
user.setCreatetime(LocalDateTime.now());
user.setEnabled(1);
user.setLocked(0);
user.setNickname(registerVo.getNickname());
user.setPassword("{bcrypt}"+passwordEncoder.encode(registerVo.getPassword()));
int rows = userMapper.insert(user);
// 检查数据库返回结果是否为1
if(rows!=1){
// 返回一个友好一下的提示
throw new ServiceException("服务繁忙,注册失败,请稍后再试!");
}
// 添加学生角色
UserRole userRole = new UserRole();
userRole.setUserId(user.getId());
userRole.setRoleId(2);
rows = userRoleMapper.insert(userRole);
if(rows!=1){
throw new ServiceException("服务繁忙,注册失败,请稍后再试!");
}
业务层实现类实现效果:根据username
用户名返回一个UserDetails
对象交给UserDetailsServiceIml
实现类
实现(控制器)
@RestController
@Slf4j
public class SystemController {
@GetMapping("/register.html")
public ModelAndView register(){
return new ModelAndView("register");
}
@PostMapping("/register")
public R registerStudent(@Validated RegisterVo registerVo, BindingResult validaResult){
log.debug("得到登陆表单:{}",registerVo);
if(validaResult.hasErrors()){
String error=validaResult.getFieldError()
.getDefaultMessage();
return R.unproecsableEntity(error);
}
if(!registerVo.getPassword().equals(registerVo.getConfirm())){
return R.unproecsableEntity("确认密码不一致");
}
try{
userService.registerStudent(registerVo);
return R.created("测试成功!");
}catch (ServiceException e){
log.error("注册失败!",e);
return R.failed(e);
}
}
}
此时就已经实现了登陆,几乎都是配置信息,交给Spring-Security管理,开发者非常方便,系统又非常安全