【黑马头条】中文章发布逻辑一处不理解的地方

项目场景:

在做黑马头条day3的内容,做到文章发布模块的时候感觉这里的逻辑有点问题。
原逻辑如下:
//0.条件判断
//1.保存或修改文章,保存则直接保存,如果为修改文章删除文章图片与素材的关系
//2.判断是否为草稿 如果为草稿结束当前方法
//3.不是草稿,保存文章内容图片与素材的关系,如果当前布局是自动,需要匹配封面图片

问题描述

根据原来的逻辑草稿是不保存文章内容和素材之间的多对多关系:
①那么删除素材时有可能删除已经被草稿使用的素材。
②修改草稿时不需要删除文章与素材的对应关系。
③目前从前端页面来看已上架的文章没有修改的按钮,那么修改文章为这里的删除已关联素材关系就很令人费解,似乎没有用到的地方。

解决方案:

//0.条件判断
//1.删除旧的关联关系,再保存新的关联关系。
//2.判断是否为草稿 如果为草稿结束当前方法
//3.如果当前布局是自动,需要匹配封面图片
草稿和发布似乎只有status的区别,个人感觉不是很有必要取分情况。
目前从前端判断是这样,如果后边已上架的也能修改当我没说。

附上自己理解修改后的代码,供学习交流。

  /**
     * 发布修改文章或保存为草稿
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult submitNews(WmNewsDto dto) {
        //1.参数检验
        if (dto == null || dto.getContent() == null)
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        //2.装载news
        WmNews news = new WmNews();
        BeanUtils.copyProperties(dto, news);
        //2.1图片转为string
        String iamges = StringUtils.join(dto.getImages(), ',');
        news.setImages(iamges);
        //2.2如果当前封面类型为自动:-1
        if (dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO))
            news.setType(null);
        //2.3如果有id,删除旧的关联关系
        if (news.getId() != null)
            removeRelation(dto.getId());
        List<String> materialUrlList = extractMaterialUrl(dto.getContent());
        //2.4 userid
        news.setUserId(WmThreadLocalUtil.getUser().getId());
        //3.保存关联关系
        //如果当前布局是自动则匹配封面图片
        saveRelativeInfoForCover(dto, news, materialUrlList);
        //保存文章内容图片与素材关系
        saveNewRelations(materialUrlList ,dto.getId(), WemediaConstants.WM_CONTENT_REFERENCE);
        saveOrUpdate(news);
        return PageResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }

    /**
     * 第一个功能:如果当前封面类型为自动,则设置封面类型的数据
     * 匹配规则:
     * 1,如果内容图片大于等于1,小于3  单图  type 1
     * 2,如果内容图片大于等于3  多图  type 3
     * 3,如果内容没有图片,无图  type 0
     * <p>
     * 第二个功能:保存封面图片与素材的关系
     *
     * @param dto
     * @param news
     * @param materials
     */
    private void saveRelativeInfoForCover(WmNewsDto dto, WmNews news, List<String> materials) {
        List<String> images = dto.getImages();
        //如果当前封面类型为自动,设置封面类型的数据
        if (dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)) {
            //多图
            if (materials.size() >= 3) {
                news.setType(WemediaConstants.WM_NEWS_MANY_IMAGE);
                images = materials.stream().limit(3).collect(Collectors.toList());
                //单图
            } else if (materials.size() >= 1) {
                news.setType(WemediaConstants.WM_NEWS_SINGLE_IMAGE);
                images = materials.stream().limit(1).collect(Collectors.toList());
                //无图
            }else {
                news.setType(WemediaConstants.WM_NEWS_NONE_IMAGE);
            }
            //修改文章
            if(images != null && images.size()>0)
                news.setImages(StringUtils.join(images,','));
            updateById(news);
        }
        if(images != null && images.size()>0)
            saveNewRelations(images,news.getId(),WemediaConstants.WM_COVER_REFERENCE);
    }

    /**
     * 从content中获取素材的url
     *
     * @param content
     * @return
     */
    private List<String> extractMaterialUrl(String content) {
        List<String> materialUrl = new ArrayList<>();
        //content转化为json
        List<Map> maps = JSON.parseArray(content, Map.class);
        for (Map map : maps) {
            if (map.get("type").equals("image")) {
                String MaterialUrl = (String) map.get("value");
                materialUrl.add(MaterialUrl);
            }
        }
        return materialUrl;
    }

    /**
     * 保存文章与图片的对应关系
     *
     * @param materialUrlList
     * @param newsid
     * @param type
     */
    private void saveNewRelations(List<String> materialUrlList, Integer newsid, Short type) {
        //通过url获取material
        if (materialUrlList != null && !materialUrlList.isEmpty()) {
            LambdaQueryWrapper<WmMaterial> wrapper = new LambdaQueryWrapper<>();
            wrapper.in(WmMaterial::getUrl, materialUrlList);
            List<WmMaterial> materialList = materialService.list(wrapper);
            //判断素材有效性
            if (materialList == null || materialList.isEmpty() || materialList.size() != materialUrlList.size())
                throw new CustomException(AppHttpCodeEnum.DATA_NOT_EXIST);
            List<Integer> materialIds = materialList.stream().map(WmMaterial::getId).collect(Collectors.toList());
            newsMaterialMapper.saveRelations(materialIds, newsid, type);
        }
    }


    /**
     * 删除文章与素材对应关系
     *
     * @param id
     */
    private void removeRelation(Integer id) {
        LambdaQueryWrapper<WmNewsMaterial> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(WmNewsMaterial::getNewsId, id);
        newsMaterialMapper.delete(wrapper);
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值