用户注册实现:
1.创建对应数据库的实体类
2.建立mapper层调用basemapper中的方法(mybatis puls中的用法),可以实现简单的增删改查,但如果要复杂服务则要在service层中进行添加
3.添加注册dto层用来接受前端传来的值(dto层是与前端发送值相对应,而entity层是与数据库值相对应)
注:这些值必须与前端相对应,才能收到数据
4.添加service,因为basemapper没有注册的接口,只有简单的增删改查方法所以要添加service层
里面写入方法
该方法接受了前端放送过来的dto值,返回一个user对象
对该方法进行实体化,代码解释的非常清楚了!!!!
大致就是接受到前端传过来的值,判断email值是否能在当前数据库中查到相同email的记录,如果有则表示用户已经用该邮箱注册了一个账户,则返回用户注册失败,如果没有则,把前端传过来的email值和加密后的密码写入数据库,(这边采用了builder写入数据库比传统写法,更加方便,易懂)
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;
}
加密方法:
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层的实现
这边这样写就表示最后后端的返回数据存放在
详细代码注释非常清楚了
简单的说就是自动接受前端发送过来的post请求,通过dto建立的联系.读取dto email的值,放入刚刚的service层里面的注册方法中,因为如果没有重复的注册,executeRegister()方法会返回值,但如果有重复则不会返回值,通过判断user对象是否被赋值,就可以判断是否注册成功!!并返回给前端对应的反馈。
@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);
}