【管理系统】更改头像

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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值