黑马头条Day03-自媒体文章发布作业

一、素材管理

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));
    }

⑧重启以下服务进行测试

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值