本课程开发软件与项目初始代码可以通过云盘下载,答疑服务可以关注视频片头的二维码获取。
https://www.123912.com/s/A75eVv-27mod,提取码:yton
教学视频
上节课我们实现了修改用户信息,其中并不包括用户头像的修改。想要修改用户头像,则需要先选择上传图片,然后对图片剪裁,最后上传给后端项目保存到Minio存储桶中,还要把图片的URL地址更新到数据表里面。这节课我们就来编写后端代码实现这个功能。
视频中有代码讲解,大家认真观看视频,不要快进。有些操作只在视频中演示,只对着手册操作并不能完成案例,切记!
一、编写hxoa-oms
子系统
1. 编写持久层
在UserMapper.xml
文件中,定义SQL语句更新用户头像URL地址。
<update id="resetPhoto" parameterType="Map">
UPDATE tb_user
SET photo = #{photo}
WHERE id = #{id}
</update>
在com.example.hxoa.cloud.oms.db.dao
包UserMapper.java
接口中,声明DAO方法。
public interface UserMapper {
……
public int resetPhoto(Map param);
}
2. 编写Dubbo层
在com.example.hxoa.cloud.dubbo
包UserApi.java
接口中,声明抽象方法。
public interface UserApi {
……
public R resetPhoto(Map param);
}
在com.example.hxoa.cloud.oms.api
包UserApiHandler.java
类中,实现抽象方法。
@DubboService
@Slf4j
public class UserApiHandler implements UserApi {
……
@Override
@Transactional
@SentinelResource("UserApiHandler.resetPhoto")
public R resetPhoto(Map param) {
int rows = userMapper.resetPhoto(param);
if (rows == 1) {
return R.ok().setAttribute("status", "SUCCESS");
}
else {
throw new HxoaException("头像修改失败");
}
}
}
二、编写hxoa-mis
子系统
1. 编写Dubbo层
在com.example.hxoa.cloud.dubbo
包UserApi.java
接口中,声明抽象方法。
public interface UserApi {
……
public R resetPhoto(Map param);
}
2. 编写业务层
在com.example.hxoa.cloud.mis.service
包UserService.java
接口中,声明抽象方法。
public interface UserService {
……
public Map resetPhoto(Map param);
}
在com.example.hxoa.cloud.mis.service.impl
包UserServiceImpl.java
类中,实现抽象方法。
@Service
public class UserServiceImpl implements UserService {
@Resource
private MyMinioUtil myMinioUtil;
……
@Override
@GlobalTransactional
public Map resetPhoto(Map param) {
long userId = MapUtil.getLong(param, "userId");
MultipartFile photo = MapUtil.get(param, "photo", MultipartFile.class);
//上传图片到minio
String path = "/mis/user/photo/" + userId + ".jpg";
myMinioUtil.uploadImage(path, photo);
// 调用dubbo接口, 更新用户照片
R r = userApi.resetPhoto(new HashMap() {{
put("id", userId);
put("photo", path);
}});
Map result = r.getAttributeAll();
return result;
}
}
3. 编写Web层
在com.example.hxoa.cloud.mis.controller
包UserController.java
类中,声明Web方法。
@RestController
@RequestMapping("/user")
public class UserController {
……
@PostMapping("/reset-photo")
@SaCheckLogin
@SentinelResource("UserController.resetPhoto")
public R resetPhoto(@RequestParam("photo") MultipartFile photo) {
long userId = StpUtil.getLoginIdAsLong();
Map param = new HashMap() {{
put("userId", userId);
put("photo", photo);
}};
Map result = userService.resetPhoto(param);
return R.ok().setAttributeAll(result);
}
}