航空后端部署4

用户注册实现:

1.创建对应数据库的实体类

航空后端部署4

航空后端部署4

2.建立mapper层调用basemapper中的方法(mybatis puls中的用法),可以实现简单的增删改查,但如果要复杂服务则要在service层中进行添加航空后端部署4

3.添加注册dto层用来接受前端传来的值(dto层是与前端发送值相对应,而entity层是与数据库值相对应)

注:这些值必须与前端相对应,才能收到数据

航空后端部署4

4.添加service,因为basemapper没有注册的接口,只有简单的增删改查方法所以要添加service层

里面写入方法

航空后端部署4

该方法接受了前端放送过来的dto值,返回一个user对象

航空后端部署4

对该方法进行实体化,代码解释的非常清楚了!!!!

大致就是接受到前端传过来的值,判断email值是否能在当前数据库中查到相同email的记录,如果有则表示用户已经用该邮箱注册了一个账户,则返回用户注册失败,如果没有则,把前端传过来的email值和加密后的密码写入数据库,(这边采用了builder写入数据库比传统写法,更加方便,易懂)

航空后端部署4

 public UserinFormationTable executeRegister(RegisterDTO dto) {

        //查询是否有相同用户名的用户
        LambdaQueryWrapper<UserinFormationTable> wrapper = new LambdaQueryWrapper<>();//设置查找条件
        wrapper.eq(UserinFormationTable::getMailbox, dto.getEmail());//判断是否数据库中有相同邮箱账号
        UserinFormationTable userinFormationTable= baseMapper.selectOne(wrapper);//查找一条记录(由mabatis plus提供)
        // userinFormationTable不为空时,则判断已存在
        if (!ObjectUtils.isEmpty(userinFormationTable)) {
             ApiAsserts.fail("邮箱已存在!");
    }
        //没有则创建一个数据库对象,相当于注册新用户写入数据库
            UserinFormationTable addUser = UserinFormationTable.builder()
                    .mailbox(dto.getEmail())
                    .password(MD5Utils.getPwd(dto.getPass())) //用md5进行对密码的加密
                    .build();
            baseMapper.insert(addUser);

            return addUser;
    }

 

加密方法:

航空后端部署4

public static String getPwd(String pwd) {
        try {
            // 创建加密对象
            MessageDigest digest = MessageDigest.getInstance("md5");

            // 调用加密对象的方法,加密的动作已经完成
            byte[] bs = digest.digest(pwd.getBytes());
            // 接下来,我们要对加密后的结果,进行优化,按照mysql的优化思路走
            // mysql的优化思路:
            // 第一步,将数据全部转换成正数:
            String hexString = "";
            for (byte b : bs) {
                // 第一步,将数据全部转换成正数:
                // 解释:为什么采用b&255
                /*
                 * b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节)
                 * byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据)
                 * 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
                 * 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000
                 * 0000 0000 1001 1100 此时的temp是一个int类型的整数
                 */
                int temp = b & 255;
                // 第二步,将所有的数据转换成16进制的形式
                // 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数
                // 因此,需要对temp进行判断
                if (temp < 16 && temp >= 0) {
                    // 手动补上一个“0”
                    hexString = hexString + "0" + Integer.toHexString(temp);
                } else {
                    hexString = hexString + Integer.toHexString(temp);
                }
            }
            return hexString;
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "";
    }

5.control层的实现

这边这样写就表示最后后端的返回数据存放在

http://xxx//ums/user/register

详细代码注释非常清楚了

简单的说就是自动接受前端发送过来的post请求,通过dto建立的联系.读取dto email的值,放入刚刚的service层里面的注册方法中,因为如果没有重复的注册,executeRegister()方法会返回值,但如果有重复则不会返回值,通过判断user对象是否被赋值,就可以判断是否注册成功!!并返回给前端对应的反馈。

航空后端部署4

@Resource
    private UserinFormationtableService userinFormationtableService;//引入service层

    @RequestMapping( value = "/register",method = RequestMethod.POST) //当发register请求的时候
    //ApiResult<Map<String, Object>>
    //自动接收到客户端发给我们的字段,dto里面的字段需要和前端的一模一样
    public ApiResult<Map<String, Object>> register(@Valid @RequestBody RegisterDTO dto) {
        UserinFormationTable user = userinFormationtableService.executeRegister(dto);//接到了提交过来的数据,执行service层里面的方法
        //如果user对象为空则返回失败
        if (ObjectUtils.isEmpty(user)) {
            //return "账号注册失败";
            return ApiResult.failed("flase");
        }
        Map<String, Object> map = new HashMap<>(16);//返回一个map容量为16
        map.put("user", user);
        //return "账号注册成功";
        return ApiResult.success(map);
    }

 

上一篇:企业数字化转型的终极目标:DTO


下一篇:P36 排序(上)