- 首先第一步梳理思路,id没有存在说明是新添加的,如果id存在那就是对现有文章的修改。
-
/** * 发布文章或保存草稿 * * @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); //封面图片这个属性就不一样所以不能用上面的方法进行拷贝 // list ---> string if(dto.getImages()!=null && dto.getImages().size()>0){ String imageStr = StringUtils.join(dto.getImages(), ","); wmNews.setImages(imageStr); } //如果当前封面类型为自动 -1 if(dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){ wmNews.setType(null);//wmNews中的Type属性不能为负值。 } saveOrUpdateWmNews(wmNews); //2.判断是否为草稿 如果为草稿结束当前方法 if(dto.getStatus().equals(WmNews.Status.NORMAL.getCode())){ return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } //3.不是草稿,保存文章内容图片与素材的关系 //获取到文章内容中的图片信息 List<String> material = ectractUrlInfo(dto.getContent()); saveRelativeInfoForContent(material,wmNews.getId()); //4.不是草稿,保存文章封面图片与素材的关系 saveRelativeInfoForCover(dto,wmNews,material); return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); } /** * 第一个功能:如果当前封面类型为自动,则设置封面类型的数据 * 匹配规则: * 1,如果内容图片大于等于1,小于3 单图 type 1 * 2,如果内容图片大于等于3 多图 type 3 * 3,如果内容没有图片,无图 type 0 * * 第二个功能:保存封面图片与素材的关系 * @param dto * @param wmNews * @param materials */ private void saveRelativeInfoForCover(WmNewsDto dto, WmNews wmNews, List<String> materials) { List<String> images = dto.getImages(); //如果当前封面类型为自动,则设置封面类型的数据 if(dto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){ //多图 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); } //修改文章 if(images != null && images.size() > 0){ wmNews.setImages(StringUtils.join(images,",")); } updateById(wmNews); } if(images != null && images.size() > 0){ saveRelativeInfo(images,wmNews.getId(),WemediaConstants.WM_COVER_REFERENCE); } } /** * 处理文章内容图片与素材的关系 * @param materials * @param newsId */ private void saveRelativeInfoForContent(List<String> materials, Integer newsId) { saveRelativeInfo(materials,newsId,WemediaConstants.WM_CONTENT_REFERENCE); } @Autowired private WmMaterialMapper wmMaterialMapper; /** * 保存文章图片与素材的关系到数据库中,这里就是封面和内容共同调用的方法, * 当该方法第三个参数是0时,就是内容引用,1时就是封面引用。 * @param materials * @param newsId * @param type */ private void saveRelativeInfo(List<String> materials, Integer newsId, Short type) { if(materials!=null && !materials.isEmpty()){ //通过图片的url查询素材的id List<WmMaterial> dbMaterials = wmMaterialMapper.selectList(Wrappers.<WmMaterial>lambdaQuery().in(WmMaterial::getUrl, materials)); //判断素材是否有效 if(dbMaterials==null || dbMaterials.size() == 0){ //手动抛出异常 第一个功能:能够提示调用者素材失效了,第二个功能,进行数据的回滚 throw new CustomException(AppHttpCodeEnum.MATERIASL_REFERENCE_FAIL); } if(materials.size() != dbMaterials.size()){ throw new CustomException(AppHttpCodeEnum.MATERIASL_REFERENCE_FAIL); } List<Integer> idList = dbMaterials.stream().map(WmMaterial::getId).collect(Collectors.toList()); //批量保存 wmNewsMaterialMapper.saveRelations(idList,newsId,type);//需要三个参数上面就是为了第一个参数而设计的。 } } /** * 提取文章内容中的图片信息 * @param content * @return */ private List<String> ectractUrlInfo(String content) { List<String> materials = new ArrayList<>(); //JSON.parseArray(content, Map.class) 将 content 字符串解析为一个 List<Map> 对象。 // 其中,Map.class 指定了解析后集合中元素的类型为 Map。 List<Map> maps = JSON.parseArray(content,Map.class); for (Map map : maps) { if(map.get("type").equals("image")){//只查找type=image的 String imgUrl = (String) map.get("value"); materials.add(imgUrl); } } return materials; } @Autowired private WmNewsMaterialMapper wmNewsMaterialMapper; /** * 保存或修改文章 * @param wmNews */ private void saveOrUpdateWmNews(WmNews wmNews) { //补全属性,索然将dto中的属性进行了复制,但有的还没有值,所以进行set。 wmNews.setUserId(WmThreadLocalUtil.getUser().getId()); wmNews.setCreatedTime(new Date()); wmNews.setPublishTime(new Date()); wmNews.setEnable((short)1);//默认上架 //这里如果id为空说明wmNews中没有这个数据,是新增的一个数据。就没有修改 //这个操作了直接保存就ok了。 if(wmNews.getId() == null){ //保存 save(wmNews); }else{ //修改 //删除文章图片与素材的关系 //Wrappers.<WmNewsMaterial>lambdaQuery()创建了一个 lambdaQuery 的查询条件构造器,用于构建查询条件 //eq(WmNewsMaterial::getNewsId,wmNews.getId())表示在查询条件中添加了一个等于(eq)的限制条件, // 即根据 WmNewsMaterial 对象的 newsId 属性与 wmNews 对象的 id 属性相等来筛选数据 wmNewsMaterialMapper.delete(Wrappers.<WmNewsMaterial>lambdaQuery().eq(WmNewsMaterial::getNewsId,wmNews.getId())); updateById(wmNews); } }
java程序处理三张表要进行怎么样的操作
最新推荐文章于 2024-07-14 22:18:32 发布