二.稻*问答-注册功能

实现效果:

实现用户注册完进行登陆系统,进入博客
在这里插入图片描述

技术栈:

  • 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管理,开发者非常方便,系统又非常安全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值