java程序处理三张表要进行怎么样的操作

news2024/11/25 10:47:38
  1. 首先第一步梳理思路,id没有存在说明是新添加的,如果id存在那就是对现有文章的修改。
  2. /**
         * 发布文章或保存草稿
         *
         * @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);
            }
    
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CKA 真题练习(十六)备份还原etcd

题目&#xff1a; 首先&#xff0c;为运行在 https://11.0.1.111:2379 上的现有 etcd 实例创建快照并将快照保存到 /var/lib/backup/etcd-snapshot.db (注意&#xff0c;真实考试中&#xff0c;这里写的是 https://127.0.0.1:2379) 为给定实例创建快照预计能在几秒钟内完成。 …

Java 时间范围

前端使用Element-ui 时间范围组件 后端注意在Vo里面时间设置String类型不要设置Date类型 XMl组件字段映射成功性

【基于Cocos Creator实现的赛车游戏】9.实现汽车节点的控制逻辑

转载知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具 项目地址&#xff1a;赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码&#xff0c;基于Cocos Creator 3.5版本实现 在上一节的课程中&#xff0c;您已经实现了通过触控给刚体施…

LIO-SAM论文与代码总结

看了一些注释版的代码和博客&#xff0c;很多都很详细&#xff0c;但是有的看起来比较绕&#xff0c;或者对一些名词和定义的解释有歧义&#xff0c;不一定就说错了&#xff0c;但是仍然不方便自己理解&#xff0c;所以自己梳理一下&#xff0c;顺便记录。 目录 原文附带架构…

js 小数相乘后,精度缺失问题,记录四舍五入,向下取整

在做项目的时候&#xff0c;有一个计算金额的&#xff0c;结果发现计算的金额总是缺失0.01&#xff0c;发现相乘的时候&#xff0c;会失去精度&#xff0c;如图所示。被这整的吐血&#xff0c;由于计算逻辑由前端计算&#xff0c;所以传值后端总出错(尽量后端计算)。 还发现to…

React Native 环境配置(mac)

React Native 环境配置&#xff08;mac&#xff09; 1.Homebrew2.Node.js、WatchMan3.Yarn4.Android环境配置1.安装JDK2.下载AndroidStudio1.国内配置 Http Proxy2.安装SDK1.首先配置sdk的路径2.SDK 下载 3.创建模拟器4.配置 ANDROID_HOME 环境变量 5.IOS环境1.升级ruby&#x…

SQL8 查找某个年龄段的用户信息

描述 题目&#xff1a;现在运营想要针对20岁及以上且23岁及以下的用户开展分析&#xff0c;请你取出满足条件的设备ID、性别、年龄。 用户信息表&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543…

神经网络 06(优化方法)

一、优化方法 网络搭建好&#xff0c;损失函数设计好之后&#xff0c; 根据损失函数更新参数(权重&#xff0c;偏移)。参数更新过程就是一个神经网络优化过程。 二、梯度下降方法 梯度下降法简单来说就是一种寻找使损失函数最小化的方法。从数学上的角度来看&#xff0c;梯度…

仿东郊到家app系统及功能介绍

类似东郊到家app系统开发&#xff0c;预约sap东郊到家软件定制开发&#xff0c;东郊到家小程序APP开发&#xff0c;东郊到家模式系统定制开发 一、东郊到家软件介绍 1、东郊到家app是一家以推拿为主项&#xff0c;个人定制型的o2o平台&#xff0c;东郊到家app平台提供、正规、安…

计算即时订单比例-首单使用开窗函数row_number()

1 需求 即时订单和计划订单 订单配送中&#xff0c;如果期望配送日期和下单日期相同&#xff0c;称为即时订单&#xff0c;如果期望配送日期和下单日期不同&#xff0c;称为计划订单。 请从配送信息表&#xff08;delivery_info&#xff09;中求出每个用户的首单&#xff08;用…

langchain主要模块(一):模型输入输出

langchain2之模型输入输出 langchain1.概念2.主要模块模型输入/输出 (Model I/O)数据连接 (Data connection)链式组装 (Chains)代理 (Agents)内存 (Memory)回调 (Callbacks) 3.模型输入/输出 (Model I/O)提示提示模板示例选择器 模型LLMsChatModels 输出解释器 langchain 1.概…

计算机竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

opencv(python)视频按帧切片/cv2.VideoCapture()用法

一、介绍 cv2.VideoCapture是OpenCV中一个用于捕捉视频的类。它可以访问计算机的摄像头&#xff0c;或从视频文件中读取图像。通过cv2.VideoCapture&#xff0c;用户可以轻松地捕捉、保存、编辑和传输视频流数据。 使用cv2.VideoCapture可以实现以下功能&#xff1a; 1. 打开…

基于微信小程序的自习室系统设计与实现,可作为毕业设计

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

linux————ansible

一、认识自动化运维 自动化运维: 将日常IT运维中大量的重复性工作&#xff0c;小到简单的日常检查、配置变更和软件安装&#xff0c;大到整个变更流程的组织调度&#xff0c;由过去的手工执行转为自动化操作&#xff0c;从而减少乃至消除运维中的延迟&#xff0c;实现“零延时”…

Could not find artifact com.mysql:mysql-connector-j:pom:unknown

在 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope> </dependency> 添加版本号 这里用的是8.0.33版本&#xff0c;输入5.0的版本依然会报错 我自身用的是5.0…

做期权卖方有资金限制吗?

做期权卖方一般是有经济实力的自然人或机构做的&#xff0c;而且必须开立保证金账户&#xff0c;万一买方要行权就会有较高的风险&#xff0c;当然&#xff0c;做期权卖方在交易方面对经验和行情的预判是有一定要求的&#xff0c;下文介绍做期权卖方有资金限制吗&#xff1f; 一…

TCP服务器使用多路复用

启用复用的作用&#xff1f; 解决linux系统中的io阻塞问题&#xff0c;让多个阻塞io接口可以一起执行。无需开启线程&#xff0c;节省系统资源。 linux系统中的阻塞io有哪些&#xff1f; scanf、read管道、eadTcp套接字、acppet接收连接请求 有以下两种方式实现多路复用&am…

广州xx策划公司MongoDB恢复-2023.09.09

2023.09.08用户的MongoDB数据库被勒索病毒攻击&#xff0c;数据全部被清空。 提示&#xff1a; mongoDB的默认端口为27017&#xff0c;黑客通常通过全网段扫描27017是否开放判断是否是MongoDB服务器。一旦发现27017开放&#xff0c;黑客就会用空密码、弱密码尝试连接数据库。黑…

总结987

考研倒计时102天 时间记录&#xff1a; 6:20起床 7:00~7:40早读&#xff0c;13年tex2 7:50~8:20实验室 8:30~8:34列日计划 8:40~11:18进步本回顾&#xff0c;记录 11&#xff1a;20~12:20计算机网络网课 2:10~3:05计网20道选择题 3:07~4:42政治1000题25道选择题纠错 …