1. 持久层
1.1 规划需要执行的sql语句
UPDATE student SET
avatar = #{avatar},
modified_user = #{modifiedUser},
modified_time = #{modifiedTime}
WHERE
sid = #{sid}
1.2 设计接口和抽象方法
/**
* 修改学生头像
* @param sid 学生学号
* @param avatar 学生头像
* @param modifiedUser 修改者
* @param modifiedTime 修改时间
* @return 受影响的行数
*/
Integer changeAvatarBySid(String sid, String avatar,
String modifiedUser, Date modifiedTime);
1.3 sql映射
<update id="changeAvatarBySid">
UPDATE student SET
avatar = #{avatar},
modified_user = #{modifiedUser},
modified_time = #{modifiedTime}
WHERE
sid = #{sid}
</update>
1.4 单元测试
@Test
public void changeAvatarBySid() {
Integer rows = studentMapper.changeAvatarBySid("147", "web/upload/微信头像.png", "管理员", new Date());
System.out.println(rows);
}
2. 服务层
2.1 规划异常
- 更新异常UpdateException
2.2 设计接口和抽象方法
/**
* 学生修改头像接口
* @param sid 学生学号
* @param avatar 学生头像
* @param username 修改者
*/
void changeAvatar(String sid, String avatar, String username);
/**修改头像*/
@Override
public void changeAvatar(String sid, String avatar, String username) {
Student student = studentMapper.findByStudentsid(sid);
if (student == null || student.getIsDelete() == 1) {
throw new SidNotFoundException("用户数据不存在");
}
Integer rows = studentMapper.changeAvatarBySid(sid, avatar, username, new Date());
if (rows != 1) {
throw new UpdateEception("用户头像更新异常");
}
}
2.3 单元功能测试
@Test
public void changeAvatar() {
studentService.changeAvatar("007", "hzuniversity/web/login/微信头像.png", "管理员");
}
3. 控制层
3.1 规划异常
- FileUploadException 泛指文件上传异常(父类)继承RuntimeException
- FileEmptyException 文件为空
- FileSizeException 文件大小异常
- FileTypeException 文件类型异常
- FileUploadIOException 文件读写异常
- FileStateException 上传文件状态异常
3.2 处理异常
在BaseController中进行统一编写处理
else if (e instanceof UpdateEception) {
result.setState(4006);
result.setMessage("更新过程异常");
}
else if (e instanceof FileUploadException) {
result.setState(5000);
result.setMessage("文件上传异常");
}
else if (e instanceof FileSizeException) {
result.setState(5001);
result.setMessage("文件大小异常");
}
else if (e instanceof FileStateExceptioin) {
result.setState(5002);
result.setMessage("文件状态异常");
}
else if (e instanceof FileTypeException) {
result.setState(5003);
result.setMessage("文件类型异常");
}
else if (e instanceof FileEmptyException) {
result.setState(5004);
result.setMessage("文件为空异常");
}
else if (e instanceof FileUploadIOException) {
result.setState(5005);
result.setMessage("文件读写异常");
}
在异常统一处理列表上增加参数
@ExceptionHandler({ServiceException.class, FileUploadException.class})
3.3 设计请求
stu/change_avatar
POST
HttpSession session, MultipartFile file
JsonResult< String >
3.4 实现请求
// 设置上传文件的最大值
public static final int AVATAR_MAX_SIZE = 10*1024*1024;
// 限制上传文件的类型
public static final List<String> AVATAR_TYPE = new ArrayList<>();
static {
AVATAR_TYPE.add("image/jpeg");
AVATAR_TYPE.add("image/png");
AVATAR_TYPE.add("image/bmp");
AVATAR_TYPE.add("image/gif");
}
/**修改头像*/
@RequestMapping("change_avatar")
public JsonResult<String> changeAvatar(HttpSession session,
MultipartFile file) throws IOException{
if (file.isEmpty()) {
throw new FileEmptyException("文件为空");
}
if (file.getSize() > AVATAR_MAX_SIZE) {
throw new FileSizeException("文件大小超出限制");
}
// 文件类型是否符合
String contentType = file.getContentType();
// 如果集合包含某元素则返回ture
if (!AVATAR_TYPE.contains(contentType)) {
throw new FileTypeException("文件类型不支持");
}
// 上传的文件.../upload/文件.png
String parent =
session.getServletContext().
getRealPath("upload");
// File对象指向这个路径,file是否存在
File dir = new File(parent);
if (!dir.exists()) { // 检测目录是否存在
dir.mkdirs(); // 创建当前目录
}
// 获取到这个文件名称 uuid工具来将生成一个新的字符串作为文件名
// 例如:avatar01.png
String originalFilename = file.getOriginalFilename();
System.out.println("Originalfilename" + originalFilename);
// 截取文件后缀
String suffix = "";
int index = originalFilename.lastIndexOf(".");
suffix = originalFilename.substring(index);
// 随机生成前缀名并拼接
String filename = UUID.randomUUID().toString().toUpperCase() + suffix;
File dest = new File(dir, filename); // 是一个空文件
// 参数file中数据写入到这个空文件中
try {
file.transferTo(dest); //将file文件中的数据写入到dest文件中
}
catch (FileStateExceptioin e) {
throw new FileStateExceptioin("文件状态异常");
}
catch (IOException e) {
throw new FileUploadIOException("文件读写异常");
}
String uid = getsidFromSession(session);
String username = getnameFromSession(session);
// 返回头像的路径/upload/test.png
String avatar = "/upload/" + filename;
studentService.changeAvatar(uid, avatar, username);
// 返回用户头像的路径给前端,将来用于头像的展示使用
return new JsonResult<>(OK, avatar);
}