一、素材管理
1. 图片删除
(1)接口描述
说明 | |
接口路径 | /api/v1/material/del_picture/{id} |
请求方式 | GET |
参数 | Integer id |
响应结果 | ResponseResult |
(2)实现
步骤①:WmMaterialController
@GetMapping("/del_picture/{id}")
public ResponseResult delPicture(@PathVariable Integer id) {
return wmMaterialService.delPicture(id);
}
②WmMaterialService
/**
* 删除图片
* @param id
* @return
*/
ResponseResult delPicture(Integer id);
③WmMaterialServiceImpl
@Autowired
private WmNewsMaterialMapper wmNewsMaterialMapper;
/**
* 删除图片
* @param id
* @return
*/
@Override
public ResponseResult delPicture(Integer id) {
// 1. 校验参数
if(id == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
}
// 2. 校验素材是否存在
WmMaterial wmMaterial = getById(id);
if(wmMaterial == null) {
// 数据不存在
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
// 3. 要删除的素材的user_id与当前用户id是否一致
// 用户仅可删除自己的素材
Integer userId = WmThreadLocalUtil.getUser().getId();
if(!userId.equals(wmMaterial.getUserId())) {
return ResponseResult.errorResult(501, "文件删除失败1");
}
// 4.判断素材与文章之间是否存在引用关系
LambdaQueryWrapper<WmNewsMaterial> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(WmNewsMaterial::getMaterialId, id);
int count = wmNewsMaterialMapper.selectCount(lambdaQueryWrapper);
if(count > 0) {
return ResponseResult.errorResult(501, "文件删除失败");
}
// 5. 删除图片
// 删除minIO里的数据
fileStorageService.delete(wmMaterial.getUrl());
// 删除数据库里的数据
boolean b = removeById(id);
if(b) {
// 删除成功
System.out.println("图片素材删除成功!");
return ResponseResult.okResult(wmMaterial);
} else {
// 删除失败
return ResponseResult.errorResult(501, "文件删除失败");
}
}
④单元测试
package com.heima.wemedia.service.impl;
import com.heima.wemedia.service.WmMaterialService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class WmMaterialServiceImplTest {
@Autowired
private WmMaterialService wmMaterialService;
@Test
void delPicture() {
wmMaterialService.delPicture(68);
}
}
2. 收藏与取消
(1)接口描述
取消收藏
说明 | |
接口路径 | /api/v1/material/cancel_collect/{id} |
请求方式 | GET |
参数 | Integer id |
响应结果 | ResponseResult |
收藏
说明 | |
接口路径 | /api/v1/material/collect/{id} |
请求方式 | GET |
参数 | Integer id |
响应结果 | ResponseResult |
返回结果示例:
(2)实现
步骤①:WmMaterialController
@GetMapping("/collect/{id}")
public ResponseResult collect(@PathVariable Integer id) {
return wmMaterialService.collect(id);
}
②WmMaterialService
/**
* 取消收藏素材
* @param id
* @return
*/
ResponseResult cancelCollect(Integer id);
/**
* 收藏素材
* @param id
* @return
*/
ResponseResult collect(Integer id);
③WmMaterialServiceImpl
两个方法的代码挺相似的,可以抽取代码
/**
* 取消收藏图片素材
* @param id
* @return
*/
@Override
public ResponseResult cancelCollect(Integer id) {
// 1. 检查参数
if(id == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 2. 校验素材是否存在
WmMaterial wmMaterial = getById(id);
if(wmMaterial == null) {
// 数据不存在
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 3. 要取消的素材的user_id与当前用户id是否一致
// 用户仅可取消收藏自己的素材?
Integer userId = WmThreadLocalUtil.getUser().getId();
if(!userId.equals(wmMaterial.getUserId())) {
return ResponseResult.errorResult(501, "文件删除失败1");
}
// 4. 取消收藏
wmMaterial.setIsCollection((short) 0);
updateById(wmMaterial);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
/**
* 收藏图片素材
* @param id
* @return
*/
@Override
public ResponseResult collect(Integer id) {
// 1. 检查参数
if(id == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 2. 校验素材是否存在
WmMaterial wmMaterial = getById(id);
if(wmMaterial == null) {
// 数据不存在
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
// 3. 要取消的素材的user_id与当前用户id是否一致
// 用户仅可收藏自己的素材?
Integer userId = WmThreadLocalUtil.getUser().getId();
if(!userId.equals(wmMaterial.getUserId())) {
return ResponseResult.errorResult(501, "文件删除失败1");
}
// 4. 收藏素材
wmMaterial.setIsCollection((short) 1);
updateById(wmMaterial);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
二、文章管理
1. 查看文章详情(编辑回显)
(1)接口描述
说明 | |
接口路径 | /api/v1/news/one/{id} |
请求方式 | GET |
参数 | 文章id |
响应结果 | ResponseResult |
返回结果示例:
(2)实现
①WmNewsController
/**
* 查询文章详情
* @param id
* @return
*/
@GetMapping("/one/{id}")
public ResponseResult detail(@PathVariable Integer id) {
return wmNewsService.detail(id);
}
②WmNewsService
/**
* 获取文章详情
* @param id
* @return
*/
public ResponseResult detail(Integer id);
③WmNewsServiceImpl
/**
* 查询文章详情
* @param id
* @return
*/
@Override
public ResponseResult detail(Integer id) {
// 1. 检查参数
if(id == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
// 2. 根据id查询文章
WmNews wmNews = getById(id);
if(wmNews == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "文章不存在");
}
// 3. 只可以编辑自己的文章
if(!wmNews.getUserId().equals(WmThreadLocalUtil.getUser().getId())) {
return ResponseResult.errorResult(AppHttpCodeEnum.NO_OPERATOR_AUTH);
}
// 4. 在前端界面注意到已上架的文章没有编辑功能
if(wmNews.getStatus().equals((short)9)) {
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST, "文章已上架,不可修改,请先下架");
}
return ResponseResult.okResult(wmNews);
}
④启动相关的微服务进行测试
2. 文章删除
(1)接口描述
说明 | |
接口路径 | /api/v1/news/del_news/{id} |
请求方式 | GET |
参数 | 文章id |
响应结果 | ResponseResult |
返回结果实例:
(2)实现
①WmNewsController
/**
* 删除文章
* @param id
* @return
*/
@GetMapping("/del_news/{id}")
public ResponseResult delNews(@PathVariable Integer id) {
return wmNewsService.delNews(id);
}
②WmNewsService
/**
* 删除文章
* @param id
* @return
*/
ResponseResult delNews(Integer id);
③WmNewsServiceImpl
(不太清楚要不要清除minIO里的数据)
/**
* 删除文章
* @param id
* @return
*/
@Override
public ResponseResult delNews(Integer id) {
// 1. 检查文章id
if(id == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "文章id不可缺少");
}
// 2. 查询文章
WmNews wmNews = getById(id);
if(wmNews == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "文章不存在");
}
// 3. 查询文章是否已发布
if(wmNews.getStatus().equals((short)9) && wmNews.getEnable().equals((short) 1)) {
// 审核通过,且article端该文章为已上架
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "文章已发布,不能删除");
}
// 4. 删除文章
// 4.1 删除wm_news表的相关数据
removeById(id);
// 4.2 删除wm_news_material表的相关数据
wmNewsMaterialMapper.delete(Wrappers.<WmNewsMaterial>lambdaQuery().eq(WmNewsMaterial::getNewsId, id));
// 4.3 发送消息,通知article端修改文章配置的delete字段
if(wmNews.getArticleId() != null) {
Map<String, Object> map = new HashMap<>();
map.put("articleId", wmNews.getArticleId());
kafkaTemplate.send(WmNewsMessageConstants.WM_NEWS_DELETE_TOPIC, JSON.toJSONString(map));
}
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
④在WmNewsMessageConstants类中添加常量
public static final String WM_NEWS_DELETE_TOPIC="wm.news.delete.topic";
⑤添加监听 - ArticleDeleteListener
package com.heima.article.listener;
import com.alibaba.fastjson.JSON;
import com.heima.article.service.ApArticleConfigService;
import com.heima.common.constants.WmNewsMessageConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@Slf4j
public class ArticleDeleteListener {
@Autowired
private ApArticleConfigService apArticleConfigService;
@KafkaListener(topics = WmNewsMessageConstants.WM_NEWS_DELETE_TOPIC)
public void onMessage(String message) {
if(StringUtils.isNotBlank(message)) {
Map map = JSON.parseObject(message, Map.class);
apArticleConfigService.updateByMap2(map);
log.info("article端文章配置修改delete字段,articleId={}", map.get("articleId"));
}
}
}
⑥ApArticleConfigService
/**
* 修改文章配置的delete字段
* @param map
*/
public void updateByMap2(Map map);
⑦ApArticleConfigServiceImpl
/**
* 修改文章配置的delete字段
* @param map
*/
@Override
public void updateByMap2(Map map) {
boolean isDetele = true;
// 修改文章配置
update(Wrappers.<ApArticleConfig>lambdaUpdate().eq(ApArticleConfig::getArticleId, map.get("articleId")).set(ApArticleConfig::getIsDelete, isDetele));
}
⑧重启以下服务进行测试