目录
前言:
本项目非原创,我也只是作为一名初学者跟着成熟的up主一起敲代码而已。视频来源于:
在哔哩哔哩闲逛看到这个项目,感觉还不错,于是想要学习一下这个项目怎么写。项目日记也会同步更新。(本人不分享本项目源码,支持项目付费)
本项目大量采用了先前项目中已经写好的代码,而且UP主讲的也很快。因此不适合新手作为自己的第一个项目。
今日完结任务:
1.完成用户找回密码,退出登录接口
用户找回密码Controller层:
逻辑为:先对参数进行校验。之后先判断传入的图片验证码是否正确,如果正确的话就进入server层来执行更新密码的逻辑。
另外无论验证码是否正确,都要删除本次验证码,避免被重复使用。
server层的逻辑也很简单:先判断用户的邮箱是否存在 ,如果不存在就抛出异常,如果存在就校验邮箱验证码,如果邮箱验证码校验正确,就更新数据库中的用户密码,实现用户忘记密码后的重置密码。
此外由于修改密码属于敏感操作,因此我们要把它封装成为一个事务,避免多线程之间的被打断情况,所以我们使用了@Transactional注解来封装当前方法为一个事务。
2.修改密码:
先对用户输入的密码进行MD5加密,然后调用userInfoService的updateUserInfoByUserId方法来对用户密码进行修改。
3.获取用户头像:
这里我们没有使用阿里云OSS来进行存储,这次换了一种方式:存储到本地。
这段代码的逻辑为:构造存储用户头像的文件地址,如果不存在,先构造文件夹,如果存在,就读取当中头像。如果读取不到,就调用printNoDefaultImage方法来向头像问价存储地址中写入默认头像。
最终调用response.setContentType方法来告知响应内容为jpg格式的图片,同时调用readFile方法把当前头像写入响应相应输入流。因为这个方法可以可以复用,所以我在这里贴一下对应的代码:
readFile方法:
protected void readFile(HttpServletResponse response, String filePath) {
if (!StringTools.pathIsOk(filePath)) {
return;
}
OutputStream out = null;
FileInputStream in = null;
try {
File file = new File(filePath);
if (!file.exists()) {
return;
}
in = new FileInputStream(file);
byte[] byteData = new byte[1024];
out = response.getOutputStream();
int len = 0;
while ((len = in.read(byteData)) != -1) {
out.write(byteData, 0, len);
}
out.flush();
} catch (Exception e) {
logger.error("读取文件异常", e);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
logger.error("IO异常", e);
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
logger.error("IO异常", e);
}
}
}
}
printNoDefaultImage()方法:
private void printNoDefaultImage(HttpServletResponse response) {
response.setHeader(CONTENT_TYPE, CONTENT_TYPE_VALUE);
response.setStatus(HttpStatus.OK.value());
PrintWriter writer = null;
try {
writer = response.getWriter();
writer.print("请在头像目录下放置默认头像default_avatar.jpg");
writer.close();
} catch (Exception e) {
logger.error("输出无默认图失败", e);
} finally {
writer.close();
}
}
4.获取用户使用内存大小:、
从Redis中去读用户使用内存大小。
根据用户ID来查询用户在redis中的空间对象。如果没有查询到,就从数据库中去获取用户已经使用的空间大小。构建出一个新的spaceDTO来存储到Redis中。设置键的生存日期为1天。
5.更新用户头像:
先从session中获取用户信息,然后构造文件夹地址。之后尝试把头像写入文件夹地址当中。如果写失败就打日志:“上传头像失败”。
最后清空一下之前的会话旧数据,把新数据先写入数据库中,再更新会话。
6.登录拦截
整体的逻辑很简单,主要就是判断当前会话中的有没有User信息。如果没有就进行拦截。
之后,我们设置拦截所有被GlobalInterceptor注释的方法, 在执行requestInterceptor方法之前,使用前置通知,执行interceptor方法,而在这个方法中,我们就做了登录校验。
今日总结:
写重复的代码比较多,没有啥意思。但是获取用户头像和更新用户头像不会写,跟着视频写完的,学到了很多。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!