首页 > 其他分享 >自媒体文章-发布、修改、保存草稿

自媒体文章-发布、修改、保存草稿

时间:2023-06-29 17:02:13浏览次数:38  
标签:dto 草稿 保存 materials 修改 素材 wmNews 文章 图片

文章素材关系表:关联文章内容和素材的关系,关联封面中的图片与素材的关系。

若为草稿,则保存wm_news文章,不保存其中的图片信息。

若不是草稿,则保存wm_news文章进入数据库,此外保存该文章与数据库material素材图片的关系:

      1、保存文章内容图片与素材的关系

      2、保存文章封面与素材的关系:若为auto:要从文章内容中的图片选为封面图片,再保存封面与图片的关系

      3、保存内容与文章和保存封面与文章的关系抽取为保存图片与文章的关系方法。唯一不同的是字段type:0表示内容引用,1表示封面引用。

      4、保存文章还是修改文章通过news是否有id判断,有则是修改update并要删除原来文章和素材图片之间的所有关系,下面会重新保存关系。没有则是保存save。

  /**
     * 文章:发布、修改、保存为草稿
     * @param dto
     * @return
     */
    @Override
    public ResponseResult submitNews(WmNewsDto dto) {

        //0、条件判断
        if(dto == null || dto.getContent() == null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //1、保存或修改文章
        WmNews wmNews = new WmNews();
        //属性拷贝:属性名称和类型相同才能拷贝
        BeanUtils.copyProperties(dto, wmNews);
        //封面图片
        if(dto.getImages() != null && dto.getImages().size() > 0){
            //将list集合以, 分隔开如: a.jpg,b.jpg
            String join = StringUtils.join(dto.getImages(), ",");
            wmNews.setImages(join);
        }
        //当前封面类型为自动 -1
        if(dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){
            //要从内容中获取图片才能确定wmNews是 type = 无图0、单图1、多图3哪一种
            wmNews.setType(null);
        }

        saveOrUpdateWmNews(wmNews);

        //2、判断是否为草稿
        if(dto.getStatus().equals(WmNews.Status.NORMAL.getCode())){
            //3、如果为草稿,结束
            return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
        }

        //4、不是草稿,保存文章内容图片与素材关系
        //获取文章内容图片信息
        List<String> materials = ectratcUrlInfo(dto.getContent());
        //保存文章内容图片与素材的关系
        saveRelativeInfoForContent(materials, wmNews.getId());

        //5、不是草稿,保存文章封面图片与素材关系,如果当前布局是自动,需要匹配封面图片
        saveRelativeInfoForCover(dto, wmNews, materials);

        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }



    @Autowired
    private WmNewsMaterialMapper wmNewsMaterialMapper;

    @Autowired
    private WmMaterialMapper wmMaterialMapper;

    /**
     * 1、如果当前封面类型为自动,则设置封面类型的数据
     * 匹配规则:
     *      如果内容图片大于等于1,小于3,单图 type = 1
     *      如果内容图片大于等于3,多图 type = 3
     *      如果内容没有图片,无图 type = 0
     * 2、保存封面图片与素材的关系
     * @param dto
     * @param wmNews
     * @param materials
     */
    private void saveRelativeInfoForCover(WmNewsDto dto, WmNews wmNews, List<String> materials) {
        //封面图片
        List<String> images = dto.getImages();

        //1、如果当前封面类型为自动,则设置封面类型的数据
        if(dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){
            //materials从文章内容获取的图片
            //多图
            if(materials.size() >= 3){
                wmNews.setType(WemediaConstants.WM_NEWS_MANY_IMAGE);
                images = materials.stream().limit(3).collect(Collectors.toList());
            }else if(materials.size() >=1 && materials.size() < 3){
               //单图
                wmNews.setType(WemediaConstants.WM_NEWS_SINGLE_IMAGE);
                images = materials.stream().limit(1).collect(Collectors.toList());
            }else{
                //无图
                wmNews.setType(WemediaConstants.WM_NEWS_NONE_IMAGE);
            }

            //修改更新数据库中的news属性
            if(images != null && images.size() > 0){
                wmNews.setImages(StringUtils.join(images, ","));
            }
            updateById(wmNews);

            //保存封面与news的关系
            if(images != null && images.size() > 0){
                //代表主图引用,material用作news的封面
                saveRelativeInfo(images, wmNews.getId(), WemediaConstants.WM_COVER_REFERENCE);
            }



        }
    }

    /**
     * 保存文章图片与素材的关系到数据库中
     * @param materials
     * @param newsId
     * @param type
     */
    private void saveRelativeInfo(List<String> materials, Integer newsId, Short type) {
        if(materials != null && !materials.isEmpty()){
            //通过素材materials的图片路径url查询素材id
            List<WmMaterial> dbMaterials = wmMaterialMapper.selectList(Wrappers.<WmMaterial>lambdaQuery().in(WmMaterial::getUrl, materials));
            //前端传来的图片个数与数据库中查询的不等
            if(materials.size() != dbMaterials.size()){
                throw new CustomException(AppHttpCodeEnum.MATERIAL_REFERENCE_FAIL);
            }
            //判断素材是否有效
            if(dbMaterials == null || dbMaterials.size() == 0){
                //手动抛出异常:能够提示要用的素材失效了、数据回滚
                throw new CustomException(AppHttpCodeEnum.MATERIAL_REFERENCE_FAIL);

            }
            List<Integer> idList = dbMaterials.stream().map(WmMaterial::getId).collect(Collectors.toList());
            //批量保存
            wmNewsMaterialMapper.saveRelations(idList, newsId, type);
        }

    }



    /**
     * 保存文章内容图片与素材的关系
     * @param materials
     * @param newsId
     */
    private void saveRelativeInfoForContent(List<String> materials, Integer newsId) {
        //表示这些material被news引用为内容图片
        saveRelativeInfo(materials, newsId, WemediaConstants.WM_CONTENT_REFERENCE);
    }


    /**
     * 提取文章内容图片信息
     * @param content
     * @return
     */
    public List<String> ectratcUrlInfo(String content){
        List<Map> maps = JSON.parseArray(content, Map.class);
        List<String>  materials = new ArrayList<>();
        for (Map map : maps) {
            if(map.get("type").equals("image")){
                String imgUrl = (String)map.get("value");
                materials.add(imgUrl);
            }
        }
        return materials;
    }


    /**
     * 保存或修改文章
     */
    private void saveOrUpdateWmNews(WmNews wmNews){
        //补全属性
        wmNews.setUserId(WmThreadLocalUtil.getUser().getId());
        wmNews.setCreatedTime(new Date());
        wmNews.setSubmitedTime(new Date());
        wmNews.setEnable((short)1); // 默认上架
        if(wmNews.getId() == null){
            //保存
            save(wmNews);
        }else{
            //修改
            //删除文章图片与素材的关系
            wmNewsMaterialMapper.delete(Wrappers.<WmNewsMaterial>lambdaQuery().eq(WmNewsMaterial::getNewsId, wmNews.getId()));
            updateById(wmNews);
        }
    }

 

标签:dto,草稿,保存,materials,修改,素材,wmNews,文章,图片
From: https://www.cnblogs.com/fxzm/p/17512672.html

相关文章

  • git修改本地分支及远程分支名
    1.修改本地分支名gitbranch-mold_branchnew_branch#本地分支重命名2.修改远程分支名方法一、gitpushorigin:old_branch#删除远程仓库中的旧分支//或gitpush--deleteoriginoldNamegitpush--set-upstreamoriginnew_branch#修改远程仓库中的分支为新名称,......
  • Docker容器 如何修改容器时间,时区问题修改
    1.以root身份进入容器dockerexec-it-urootb3465e6bbc5b/bin/sh可以使用date查看时间2.在容器中创建文件mkdir-p /usr/share/zoneinfo/Asia3.回到宿主机,复制宿主机里的文件到容器中docker cp /usr/share/zoneinfo/Asia/Shanghai容器ID或容器名:/usr/share/zonei......
  • 修改UEFI WIN10 WIN11 启动菜单名称 操作系统启动菜单名称
    修改UEFIWIN10WIN11启动菜单名称,操作系统启动菜单名称。 下载BOOTICE1.3.4:http://www.winwin7.com/soft/44267.html打开 BOOTICE,你系统是64位的就打开:BOOTICEx64_2016.06.17_v1.3.4.0.exe转到UEFI选项卡,点击“修改启动序列(B)”,修改“菜单标题”中的名称,保存即可。-......
  • 登陆页修改
    1.先改个登陆页标题~ 2.后续修改将英文替换为了中文,消除了用户名和密码提示。3.修改背景图片及登录页面位置3.1  找一个有趣的图片放到src/assets下 发现背景的css是.login-container 那么我们在此插入图片(箭头表示的是目录层级,以此来解释为什么是../../)进......
  • inotifywait 监控文件修改实时格式化文件
    我们在学习laravel过程中,从文档网页复制代码,会有一些比较麻烦的问题。以《Laravel10中文文档》|LaravelChina社区(learnku.com)为例 直接点复制按钮会带后,想测试的代码的话,还有处理use语句选中复制时,网站会向剪贴板追加来源信息,还得手动处理。 这些手动处理......
  • vscode 自动修改C代码格式
    1.插件clang-format安装 clang-format默认安装路径为c:\Users\wqr57\.vscode\extensions\ms-vscode.cpptools-0.18.1/bin/../LLVM/bin/clang-format.exe 2.C格式客制化配置---Language:Cpp#BasedOnStyle: LLVMAccessModifierOffset:-4AlignAfterOpenBracket:A......
  • 查询文章列表
    packagecom.heima.wemedia.service.impl;importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.core.toolkit.StringUtils;importcom.baomidou.mybatisp......
  • 自媒体文章管理——频道列表查询
    packagecom.heima.wemedia.service.impl;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importcom.heima.model.common.dtos.ResponseResult;importcom.heima.model.wemedia.pojos.WmChannel;importcom.heima.wemedia.mapper.WmChannelMapper......
  • Linux-修改IP地址-ifconfig-nmcli
    ifconfigifconfigens33192.168.1.64netmask255.255.255.0重启网卡servicenetworkrestart#centos6systemctlrestartnetwork#centos7NeworkManager查看NetworkManager的状态:systemctlstatusNetworkManager无线网络nmcli......
  • 修改xampp中的mysql的密码报错,ERROR 1348 (HY000): Column 'Password' is not updatab
    xampp中的mysql(MariaDB)默认密码为空,进入mysql的bin目录,输入mysql-uroot-p,回车,无密码登录:查看所有数据库,选择mysql数据库:showdatabases;usemysql;使用update语句修改密码报错:ERROR1348(HY000):Column‘Password’isnotupdatable使用如下命令修改密码,并没有效果:使......