黑馬頭條項目[修改版]-第五天


0.黑馬頭條-學習目標

  • 完成自媒體文章列表查詢功能
  • 完成自媒體文章的發布功能
  • 完成自媒體文章的查詢
  • 完成自媒體文章的刪除功能
  • 完成自媒體文章的上下架功能功能

1.自媒體文章列表查詢

1.1.需求分析

1604150560484

1.2.表結構和實體類

leadnews_wemedia數據庫:自媒體文章表:wm_news

1604150801492

在heima-leadnews-model中創建WmNews實體類

/**
 * <p>
 * 自媒體圖文內容信息表
 * </p>
 *
 * @author itheima
 */
@Data
@TableName("wm_news")
public class WmNews implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主鍵
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 自媒體用戶ID
     */
    @TableField("user_id")
    private Integer userId;

    /**
     * 標題
     */
    @TableField("title")
    private String title;

    /**
     * 圖文內容
     */
    @TableField("content")
    private String content;

    /**
     * 文章布局
            0 無圖文章
            1 單圖文章
            3 多圖文章
     */
    @TableField("type")
    private Short type;

    /**
     * 圖文頻道ID
     */
    @TableField("channel_id")
    private Integer channelId;

    @TableField("labels")
    private String labels;

    /**
     * 創建時間
     */
    @TableField("created_time")
    private Date createdTime;

    /**
     * 提交時間
     */
    @TableField("submited_time")
    private Date submitedTime;

    /**
     * 當前狀態
            0 草稿
            1 提交(待審核)
            2 審核失敗
            3 人工審核
            4 人工審核通過
            8 審核通過(待發布)
            9 已發布
     */
    @TableField("status")
    private Short status;

    /**
     * 定時發布時間,不定時則為空
     */
    @TableField("publish_time")
    private Date publishTime;

    /**
     * 拒絕理由
     */
    @TableField("reason")
    private String reason;

    /**
     * 發布庫文章ID
     */
    @TableField("article_id")
    private Integer articleId;

    /**
     * //圖片用逗號分隔
     */
    @TableField("images")
    private String images;

    @TableField("enable")
    private Short enable;
    
     //狀態枚舉類
    @Alias("WmNewsStatus")
    public enum Status{
        NORMAL((short)0),SUBMIT((short)1),FAIL((short)2),ADMIN_AUTH((short)3),ADMIN_SUCCESS((short)4),SUCCESS((short)8),PUBLISHED((short)9);
        short code;
        Status(short code){
            this.code = code;
        }
        public short getCode(){
            return this.code;
        }
    }

}

1.3.接口定義

1.在heima-leadnews-apis中創建接口:com.heima.api.wemedia.WmNewsControllerApi

public interface WmNewsControllerApi {

    /**
     * 分頁帶條件查詢自媒體文章列表
     * @param dto
     * @return
     */
    public ResponseResult findAll(WmNewsPageReqDto dto);
}

2.在heima-leadnews-model中創建:com.heima.model.wemedia.dtos.WmNewsPageReqDto

@Data
public class WmNewsPageReqDto extends PageRequestDto {

    /**
     * 狀態
     */
    private Short status;
    /**
     * 關鍵字
     */
    private String keyword;

    /**
     * 頻道
     */
    private Integer channelId;

    /**
     * 開始時間
     */
    private Date beginPubDate;

    /**
     * 結束時間
     */
    private Date endPubDate;
}

1.4.功能實現

1.在heima-leadnews-wemedia中創建mapper接口:com.heima.wemedia.mapper.WmNewsMapper

@Mapper
public interface WmNewsMapper extends BaseMapper<WmNews> {
}

2.在heima-leadnews-wemedia中創建service接口:com.heima.wemedia.service.WmNewsService

public interface WmNewsService extends IService<WmNews> {

    /**
     * 分頁帶條件查詢自媒體文章列表
     * @param dto
     * @return
     */
    public ResponseResult findAll(WmNewsPageReqDto dto);
}

3.在heima-leadnews-wemedia中創建service接口實現類:com.heima.wemedia.service.impl.WmNewsServiceImpl

@Service
public class WmNewsServiceImpl extends ServiceImpl<WmNewsMapper, WmNews> implements WmNewsService {

    @Value("${fdfs.url}")
    private String fileServerUrl;

    @Override
    public ResponseResult findAll(WmNewsPageReqDto dto) {
        //1.參數檢查
        if (dto == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //分頁參數檢查
        dto.checkParam();
        //2.分頁條件查詢
        IPage pageParam = new Page(dto.getPage(), dto.getSize());
        LambdaQueryWrapper<WmNews> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //狀態精確查詢
        if (dto.getStatus() != null) {
            lambdaQueryWrapper.eq(WmNews::getStatus, dto.getStatus());
        }
        //頻道精確查詢
        if (dto.getChannelId() != null) {
            lambdaQueryWrapper.eq(WmNews::getChannelId, dto.getChannelId());
        }
        //關鍵字模糊查詢
        if (StringUtils.isNotBlank(dto.getKeyword())) {
            lambdaQueryWrapper.like(WmNews::getTitle, dto.getKeyword());
        }

        //時間范圍查詢
        if (dto.getBeginPubDate() != null && dto.getEndPubDate() != null) {
            lambdaQueryWrapper.between(WmNews::getPublishTime, dto.getBeginPubDate(), dto.getEndPubDate());
        }

        //根據自媒人精確查詢
        WmUser user = WmThreadLocalUtils.getUser();
        if (user == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
        }
        lambdaQueryWrapper.eq(WmNews::getUserId, user.getId());

        //按照發布時間倒序查詢
        lambdaQueryWrapper.orderByDesc(WmNews::getPublishTime);
        IPage pageResult = page(pageParam, lambdaQueryWrapper);

        //3.結果封裝返回
        PageResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) pageResult.getTotal());
        responseResult.setData(pageResult.getRecords());
        responseResult.setHost(fileServerUrl);
        return responseResult;
    }
}

4.在heima-leadnews-wemedia中創建controller:com.heima.wemedia.controller.v1.WmNewsController

@RestController
@RequestMapping("/api/v1/news")
public class WmNewsController implements WmNewsControllerApi {

    @Autowired
    private WmNewsService wmNewsService;

    @PostMapping("/list")
    @Override
    public ResponseResult findAll(@RequestBody WmNewsPageReqDto dto) {
        return wmNewsService.findAll(dto);
    }
}

1.5.測試

導入資料中的前端項目project-heima-leadnews-wemedia-vue-master,並啟動

啟動后端項目

  • heima-leadnews-wemedia-gateway
  • heima-leadnews-wemedia
  • heima-leadnews-admin-gateway
  • heima-leadnews-admin
  • nacos
  • seata

之后瀏覽器輸入地址:localhost:8080,訪問測試。

2.頻道列表加載

2.1.需求分析

1604154393010

文章展示列表頁面打開的時候,默認自動加載頻道列表數據進行展示,就是查詢所有頻道數據

2.2.接口定義

1.在heima-leadnews-apis中的AdChannelControllerApi新增方法

/**
     * 查詢所有頻道
     * @return
     */
    public ResponseResult findAll();

2.在heima-leadnews-admin中的AdChannelController中實現方法

@GetMapping("/channels")
@Override
public ResponseResult findAll() {
        List<AdChannel> list = adChannelService.list();
        return ResponseResult.okResult(list);
}

3.在heima-leadnews-wemedia-gateway的application.yml中增加配置

spring:
  application:
    name: leadnews-wemedia-gateway
  cloud:
    nacos:
    
     ......
     
    gateway:
      globalcors:
      
        ......
        
      routes:
      
      .....

      - id: admin
        uri: lb://leadnews-admin
        predicates:
        - Path=/admin/**
        filters:
        - StripPrefix= 1

4.重新啟動項目,重新測試

3.自媒體文章-發布修改保存草稿

3.1.需求分析

1604238970500

leadnews_wemedia數據庫

自媒體文章表:wm_news

1604150801492

素材表:wm_material

1604239355856

文章素材關系表:wm_news_material

1604239365731

3.2.接口定義

思路分析

  • 該功能為保存、修改(是否有id)、保存草稿的共有方法
  • 如果有id修改文章,先刪除所有素材關聯關系
  • 如果沒有id,保存文章
  • 關聯內容中的圖片與素材的關系
  • 關聯封面中的圖片與素材的關系
  • 封面圖片如果選擇是自動需要從內容中截圖圖片做為封面圖片
    • 截取規則為:內容圖片的個數小於等於2 則為單圖截圖一張圖,內容圖片大於等於3,則為多圖,截圖三張圖,內容中沒有圖片,則為無圖

前端傳遞給后端的參數

{
    "title":"黑馬頭條項目背景",
    "type":"1",//這個 0 是無圖  1 是單圖  3 是多圖  -1 是自動
    "labels":"黑馬頭條",
    "publishTime":"2020-03-14T11:35:49.000Z",
    "channelId":1,
    "images":[
        "http://192.168.200.130/group1/M00/00/00/wKjIgl5swbGATaSAAAEPfZfx6Iw790.png"
    ],
    "status":1,
    "content":"[
    {
        "type":"text",
        "value":"隨着智能手機的普及,人們更加習慣於通過手機來看新聞。由於生活節奏的加快,很多人只能利用碎片時間來獲取信息,因此,對於移動資訊客戶端的需求也越來越高。黑馬頭條項目正是在這樣背景下開發出來。黑馬頭條項目采用當下火熱的微服務+大數據技術架構實現。本項目主要着手於獲取最新最熱新聞資訊,通過大數據分析用戶喜好精確推送咨詢新聞"
    },
    {
        "type":"image",
        "value":"http://192.168.200.130/group1/M00/00/00/wKjIgl5swbGATaSAAAEPfZfx6Iw790.png"
    }
  ]"
}

接口定義

1.在heima-leadnews-apis中的WmNewsControllerApi中新增接口方法

public interface WmNewsControllerApi {

    ....

    /**
     * 保存、修改文章,保存草稿
     * @return
     */
    public ResponseResult submitNews(WmNewsDto dto);
}

2.在heima-leadnews-model中創建WmNewsDto

@Data
public class WmNewsDto {

    private Integer id;
    /**
     * 標題
     */
    private String title;
    /**
     * 頻道id
     */
    private Integer channelId;
    /**
     * 標簽
     */
    private String labels;
    /**
     * 發布時間
     */
    private Date publishTime;
    /**
     * 文章內容
     */
    private String content;
    /**
     * 文章封面類型  0 無圖 1 單圖 3 多圖 -1 自動
     */
    private Short type;
    /**
     * 是否上架  0 下架  1 上架
     */
    private Short enable;
    /**
     * 提交時間
     */
    private Date submitedTime;
    /**
     * 狀態 提交為1  草稿為0
     */
    private Short status;
    /**
     * 拒絕理由
     */
    private String reason;
    /**
     * 封面圖片列表 多張圖以逗號隔開
     */
    private List<String> images;

}

3.3.業務層實現1

1.在heima-leadnews-wemedia中的WmNewsController實現方法

@RestController
@RequestMapping("/api/v1/news")
public class WmNewsController implements WmNewsControllerApi {

    @Autowired
    private WmNewsService wmNewsService;

    .......

    
    @Override
    public ResponseResult submitNews(@RequestBody WmNewsDto dto) {
       return null;
    } 
}

2.在heima-leadnews-wemedia中的WmNewsService新增接口方法

public interface WmNewsService extends IService<WmNews> {

    ........

    /**
     * 自媒體文章發布
     * @param dto
     * @param isSubmit 是否為提交  1 提交  0 草稿
     * @return
     */
    public ResponseResult saveNews(WmNewsDto dto,Short isSubmit);
    
}

3.在heima-leadnews-wemedia中的WmNewsServiceImpl實現方法

/**
 * 自媒體文章發布
 * @param dto
 * @param isSubmit 是否為提交  1 提交  0 草稿
 * @return
 */
@Override
public ResponseResult saveNews(WmNewsDto dto, Short isSubmit) {
        //1.檢查參數
        if (dto == null || StringUtils.isBlank(dto.getContent())) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }

        //2.保存或修改文章
        WmNews wmNews = new WmNews();
        BeanUtils.copyProperties(dto, wmNews);
        if (WemediaContans.WM_NEWS_AUTO_TYPE.equals(dto.getType())) {
            wmNews.setType(null);
        }
        if (dto.getImages() != null && dto.getImages().size() > 0) {
            //[dfjksdjfdfj.jpg,sdlkjfskld.jpg]
            wmNews.setImages(dto.getImages().toString().replace("[", "")
                    .replace("]", "").replace(fileServerUrl, "")
                    .replace(" ", ""));
        }
        //保存或修改文章
        saveWmNews(wmNews, isSubmit);


        return null;
}


@Autowired
private WmNewsMaterialMapper wmNewsMaterialMapper;

/**
 * 保存或修改文章
 *
 * @param wmNews
 * @param isSubmit
*/
private void saveWmNews(WmNews wmNews, Short isSubmit) {
        wmNews.setStatus(isSubmit);
        wmNews.setUserId(WmThreadLocalUtils.getUser().getId());
        wmNews.setCreatedTime(new Date());
        wmNews.setSubmitedTime(new Date());
        wmNews.setEnable((short) 1);
        if (wmNews.getId() == null) {
            save(wmNews);
        } else {
            //如果是修改,則先刪除素材與文章的關系
            LambdaQueryWrapper<WmNewsMaterial> queryWrapper = new LambdaQueryWrapper();
            queryWrapper.eq(WmNewsMaterial::getNewsId, wmNews.getId());
            wmNewsMaterialMapper.delete(queryWrapper);
            updateById(wmNews);
        }
}


4.在heima-leadnews-common中的WemediaContans中增加常量

public class WemediaContans {

    public static final Short COLLECT_MATERIAL = 1;//收藏

    public static final Short CANCEL_COLLECT_MATERIAL = 0;//收藏

    public static final Short WM_NEWS_SINGLE_TYPE = 1;
    public static final Short WM_NEWS_NONE_TYPE = 0;
    public static final Short WM_NEWS_MANY_TYPE = 3;
    public static final Short WM_NEWS_AUTO_TYPE = -1;

    public static final String WM_NEWS_TYPE_IMAGE = "image";

    public static final Short WM_NEWS_CONTENT_REFERENCE =0;
    public static final Short WM_NEWS_COVER_REFERENCE =1;

    public static final Short WM_NEWS_ENABLE_UP =1;


}

3.4.業務層實現2

 /**
     * 自媒體文章發布
     * @param dto
     * @param isSubmit 是否為提交  1 提交  0 草稿
     * @return
     */
    @Override
    public ResponseResult saveNews(WmNewsDto dto, Short isSubmit) {
       
       .....


        //3.關聯文章與素材的關系
        String content = dto.getContent();
        List<Map> list = JSON.parseArray(content, Map.class);
        List<String> materials = ectractUrlInfo(list);

        .......


        return null;
    }



/**
     * 提取圖片信息
     *
     * @param list
     * @return
     */
    private List<String> ectractUrlInfo(List<Map> list) {
        List<String> materials = new ArrayList<>();
        for (Map map : list) {
            if (map.get("type").equals(WemediaContans.WM_NEWS_TYPE_IMAGE)) {
                String imgUrl = (String) map.get("value");
                imgUrl = imgUrl.replace(fileServerUrl, "");
                materials.add(imgUrl);
            }
        }
        return materials;
    }

3.5.業務層實現3

/**
     * 自媒體文章發布
     * @param dto
     * @param isSubmit 是否為提交  1 提交  0 草稿
     * @return
     */
    @Override
    public ResponseResult saveNews(WmNewsDto dto, Short isSubmit) {
        
        
        ......

        //3.1 關聯內容中的圖片與素材的關系
        if (isSubmit == WmNews.Status.SUBMIT.getCode() && materials.size() != 0) {
            ResponseResult responseResult = saveRelativeInfoForContent(materials, wmNews.getId());
            if (responseResult != null) {
                return responseResult;
            }
        }

        
        ......


        return null;
    }





/**
     * 保存素材與文章內容的關系
     *
     * @param materials
     * @param newsId
     * @return
     */
    private ResponseResult saveRelativeInfoForContent(List<String> materials, Integer newsId) {
        return saveRelativeInfo(materials, newsId, WemediaContans.WM_NEWS_CONTENT_REFERENCE);
    }




@Autowired
    private WmMaterialMapper wmMaterialMapper;

    /**
     * 保存關系
     *
     * @param materials
     * @param newsId
     * @param type
     * @return
     */
    private ResponseResult saveRelativeInfo(List<String> materials, Integer newsId, Short type) {
        //1.獲取數據庫中的素材信息
        LambdaQueryWrapper<WmMaterial> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.in(WmMaterial::getUrl, materials);
        lambdaQueryWrapper.eq(WmMaterial::getUserId, WmThreadLocalUtils.getUser().getId());
        List<WmMaterial> dbMaterials = wmMaterialMapper.selectList(lambdaQueryWrapper);
        //2.通過圖片的路徑獲取素材的id
        List<String> materialsIds = new ArrayList<>();
        if (dbMaterials != null && dbMaterials.size() > 0) {
            //<kdjfksdjkfljdsf.jps,2>
            Map<String, Integer> uriIdMap = dbMaterials.stream().collect(Collectors.toMap(WmMaterial::getUrl, WmMaterial::getId));
            for (String val : materials) {
                String materialId = String.valueOf(uriIdMap.get(val));
                //沒找到
                if ("null".equals(materialId)) {
                    return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "應用圖片失效");
                }
                //找到了
                materialsIds.add(materialId);
            }
        }

        //3.批量保存數據
        wmNewsMaterialMapper.saveRelations(materialsIds, newsId, type);
        return null;
}

在WmNewsMaterialMapper中自定義方法

@Mapper
public interface WmNewsMaterialMapper extends BaseMapper<WmNewsMaterial> {

    void saveRelations(@Param("materials") List<String> materialsIds, @Param("newsId")Integer newsId, @Param("type")Short type);
}

創建WmNewsMaterialMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.heima.wemedia.mapper.WmNewsMaterialMapper">
    <insert id="saveRelations">
        insert into wm_news_material (material_id, news_id, type, ord)
        values
        <foreach item="mid" index="ord" collection="materials"  separator="," >
            (#{mid}, #{newsId}, #{type}, #{ord})
        </foreach>
    </insert>
</mapper>

3.6.業務實現4

/**
 * 自媒體文章發布
 * @param dto
 * @param isSubmit 是否為提交  1 提交  0 草稿
 * @return
 */
@Override
public ResponseResult saveNews(WmNewsDto dto, Short isSubmit) {
    
    .......

    //3.2 關聯封面中的圖片與素材的關系,設置wm_news的type,自動
    if (isSubmit == WmNews.Status.SUBMIT.getCode()) {
        ResponseResult responseResult = saveRelativeInfoForCover(dto, materials, wmNews);
        if (responseResult != null) {
            return responseResult;
        }
    }


    return null;
}




/**
     * 設置封面圖片與素材的關系
     *
     * @param dto
     * @param materials
     * @param wmNews
     * @return
     */
    private ResponseResult saveRelativeInfoForCover(WmNewsDto dto, List<String> materials, WmNews wmNews) {
        List<String> images = dto.getImages();
        //自動匹配封面
        if (dto.getType().equals(WemediaContans.WM_NEWS_AUTO_TYPE)) {
            //內容中的圖片數量小於等於2  設置為單圖
            if (materials.size() > 0 && materials.size() <= 2) {
                wmNews.setType(WemediaContans.WM_NEWS_SINGLE_TYPE);
                images = materials.stream().limit(1).collect(Collectors.toList());
            } else if (materials.size() > 2) {
                //如果內容中的圖片大於2 則設置為多圖
                wmNews.setType(WemediaContans.WM_NEWS_MANY_TYPE);
                images = materials.stream().limit(3).collect(Collectors.toList());
            } else {
                //內容中沒有圖片,則是無圖
                wmNews.setType(WemediaContans.WM_NEWS_NONE_TYPE);
            }
            //修改文章信息
            if (images != null && images.size() > 0) {
                wmNews.setImages(images.toString().replace("[", "")
                        .replace("]", "").replace(fileServerUrl, "")
                        .replace(" ", ""));

            }
            updateById(wmNews);
        }
        //保存封面圖片與素材的關系
        if (images != null && images.size() > 0) {
            ResponseResult responseResult = saveRelativeInfoForImage(images, wmNews.getId());
            if (responseResult != null) {
                return responseResult;
            }
        }
        return null;
}




/**
     * @param images
     * @param newsId
     * @return
     */
 private ResponseResult saveRelativeInfoForImage(List<String> images, Integer newsId) {
        List<String> materials = new ArrayList<>();
        for (String image : images) {
            materials.add(image.replace(fileServerUrl,""));
        }

        return saveRelativeInfo(materials,newsId,WemediaContans.WM_NEWS_COVER_REFERENCE);
}


3.7.控制器編寫及測試

1.在heima-leadnews-wemedia中的WmNewsController中完善方法

@RestController
@RequestMapping("/api/v1/news")
public class WmNewsController implements WmNewsControllerApi {

    @Autowired
    private WmNewsService wmNewsService;

    ......
    
    @PostMapping("/submit")
    @Override
    public ResponseResult submitNews(@RequestBody WmNewsDto dto) {
        if(dto.getStatus() == WmNews.Status.SUBMIT.getCode()){
            return wmNewsService.saveNews(dto,WmNews.Status.SUBMIT.getCode());
        }else{
            return wmNewsService.saveNews(dto,WmNews.Status.NORMAL.getCode());
        }
    }
}

2.啟動測試

需要啟動的組件

  • heima-leadnews-wemedia-gateway
  • heima-leadnews-wemedia
  • heima-leadnews-admin-gateway
  • heima-leadnews-admin
  • nacos
  • seata
  • 前端項目

瀏覽器輸入地址:localhost:8080,訪問前端項目進行測試

4.自媒體文章-詳情查詢

4.1.需求分析

1604283242795

點擊修改的時候,就是根據文章id查詢,跳轉至編輯頁面進行展示

1604283268167

4.2.功能實現

1.在heima-leadnews-apis中的WmNewsControllerApi新增接口

public interface WmNewsControllerApi {

    .......

    /**
     * 根據id獲取文章信息
     * @param id
     * @return
     */
    public ResponseResult findWmNewsById(Integer id);

    
}

2.在heima-leadnews-wemedia的WmNewsService新增接口

public interface WmNewsService extends IService<WmNews> {

    ......

    /**
     * 根據id獲取文章信息
     * @param id
     * @return
     */
    public ResponseResult findWmNewsById(Integer id);
}

3.在heima-leadnews-wemedia的WmNewsServiceImpl中實現方法

/**
 * 根據id獲取文章信息
 * @param id
 * @return
 */
@Override
public ResponseResult findWmNewsById(Integer id) {
    //1.參數檢查
    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.結果返回
    ResponseResult responseResult = ResponseResult.okResult(wmNews);
    responseResult.setHost(fileServerUrl);
    return responseResult;
}

4.在heima-leadnews-wemedia的WmNewsController中實現接口方法

@RestController
@RequestMapping("/api/v1/news")
public class WmNewsController implements WmNewsControllerApi {

    @Autowired
    private WmNewsService wmNewsService;

    ......

    @GetMapping("/one/{id}")
    @Override
    public ResponseResult findWmNewsById(@PathVariable("id") Integer id) {
        return wmNewsService.findWmNewsById(id);
    }
}

5.啟動測試

5.自媒體文章-刪除

5.1.需求分析

1604284123474

注意

  • 當文章狀態為9(已發布)且已上架則不能刪除文章,下架狀態可以刪除,如果是其他狀態可以刪除
  • 刪除文章之前需要先把素材與文章的關系刪除掉

5.2.功能實現

1.在heima-leadnews-apis中的WmNewsControllerApi新增接口

public interface WmNewsControllerApi {

   .......

    /**
     * 刪除文章
     * @param id
     * @return
     */
    public ResponseResult delNews(Integer id);
}

2.在heima-leadnews-wemedia的WmNewsService新增接口

public interface WmNewsService extends IService<WmNews> {

    ......

    /**
     * 刪除文章
     * @param id
     * @return
     */
    public ResponseResult delNews(Integer id);
    
}

3.在heima-leadnews-wemedia的WmNewsServiceImpl中實現方法

/**
 * 刪除文章
 * @param id
 * @return
 */
@Override
public ResponseResult delNews(Integer id) {
    //1.檢查參數
    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.判斷當前文章的狀態  status==9  enable == 1
    if(wmNews.getStatus().equals(WmNews.Status.PUBLISHED.getCode()) && wmNews.getEnable().equals(WemediaContans.WM_NEWS_ENABLE_UP)){
        return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"文章已發布,不能刪除");
    }

    //4.去除素材與文章的關系
    wmNewsMaterialMapper.delete(Wrappers.<WmNewsMaterial>lambdaQuery().eq(WmNewsMaterial::getNewsId,wmNews.getId()));

    //5.刪除文章
    removeById(wmNews.getId());
    return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}

4.在heima-leadnews-wemedia的WmNewsController中實現接口方法

@RestController
@RequestMapping("/api/v1/news")
public class WmNewsController implements WmNewsControllerApi {

    @Autowired
    private WmNewsService wmNewsService;

    ........

    @GetMapping("/del_news/{id}")
    @Override
    public ResponseResult delNews(@PathVariable("id") Integer id) {
        return wmNewsService.delNews(id);
    }
}

5.啟動測試

6.自媒體文章-上架和下架

6.1.需求分析

下架

1604284831071

上架

1604284853373

注意

  • 當前已經發布(狀態為9)的文章可以上架(enable = 1),也可以下架(enable = 0)
  • 在上架和下架操作的同時,需要同步app端的文章配置信息,暫時不做,后期講到審核文章的時候再優化

6.2.功能實現

1.在heima-leadnews-apis中的WmNewsControllerApi新增接口

public interface WmNewsControllerApi {

    ........

    /**
     * 文章上下架
     * @param dto
     * @return
     */
    public ResponseResult downOrUp(WmNewsDto dto);

}

2.在heima-leadnews-wemedia的WmNewsService新增接口

public interface WmNewsService extends IService<WmNews> {

    .....

    /**
     * 文章上下架
     * @param dto
     * @return
     */
    public ResponseResult downOrUp(WmNewsDto dto);

}

3.在heima-leadnews-wemedia的WmNewsServiceImpl中實現方法

/**
 * 文章上下架
 * @param dto
 * @return
 */
@Override
public ResponseResult downOrUp(WmNewsDto dto) {
    //1.檢查參數
    if(dto == null || dto.getId() == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }

    //2.查詢文章
    WmNews wmNews = getById(dto.getId());
    if(wmNews == null){
        return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"文章不存在");
    }

    //3.判斷文章是否發布
    if(!wmNews.getStatus().equals(WmNews.Status.PUBLISHED.getCode())){
        return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"當前文章不是發布狀態,不能上下架");
    }

    //4.修改文章狀態,同步到app端(后期做)TODO
    if(dto.getEnable() != null && dto.getEnable() > -1 && dto.getEnable() < 2){
        update(Wrappers.<WmNews>lambdaUpdate().eq(WmNews::getId,dto.getId()).set(WmNews::getEnable,dto.getEnable()));
    }
    return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}

4.在heima-leadnews-wemedia的WmNewsController中實現接口方法

@RestController
@RequestMapping("/api/v1/news")
public class WmNewsController implements WmNewsControllerApi {

    @Autowired
    private WmNewsService wmNewsService;

    .........

    @PostMapping("/down_or_up")
    @Override
    public ResponseResult downOrUp(@RequestBody WmNewsDto dto) {
        return wmNewsService.downOrUp(dto);
    }
}

5.啟動測試


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM