Java操作jira工具类

需求:拉取并同步jira数据(项目,版本,缺陷,任务)

实现方式以及注意点:

1.jira中没有接口直接获取所有用户,但是可以获取组内用户,每个jira账户都会对应jira_user这个组,所以可以通过该组编码获取所有用户

2.jira中所有的任务,bug等都可以通过获取issue得到,只是类型不同。

3.需要注意的是如果在jira中有自定义字段,需要拿到返回值后查看,然后再对应去取。

4.jira获取出来的项目,需要在通过调用项目详情接口去拿详细信息

实现代码:



        import com.google.gson.*;
        import com.jiuling.jira.constants.Constants;
        import com.jiuling.jira.entity.JiraDic;
        import com.jiuling.jira.entity.SysOperationLog;
        import com.jiuling.jira.exception.ServiceException;
        import com.jiuling.jira.model.jira.*;
        import com.jiuling.jira.service.mybatis.IJiraDicService;
        import com.jiuling.jira.service.mybatis.ISysOperationLogService;
        import lombok.extern.slf4j.Slf4j;
        import org.apache.commons.lang3.ObjectUtils;
        import org.apache.http.HttpResponse;
        import org.apache.http.client.HttpClient;
        import org.apache.http.client.methods.HttpGet;
        import org.apache.http.impl.client.HttpClients;
        import org.apache.http.util.EntityUtils;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.stereotype.Component;
        
        import java.math.BigDecimal;
        import java.net.URLEncoder;
        import java.util.ArrayList;
        import java.util.Base64;
        import java.util.Date;
        import java.util.List;
        import java.util.stream.Collectors;
        
        import static com.jiuling.jira.model.common.Constant.ERROR_CODE_40001;
        
        /**
         * @author yangqidong
         */
        @Component
        @Slf4j
        public class JiraUtil {
        
            @Value("${jira.baseUrl}")
            private String jiraUrl;
        
            @Value("${jira.userName}")
            private String userName;
        
            @Value("${jira.password}")
            private String password;
        
            @Value("${jira.groupName}")
            private String jiraGroup;
        
            @Autowired
            IJiraDicService jiraDicService;
        
        
            /**
             * 通过组获取jira所有用户
             *
             * @return
             */
            public List<JiraUserVO> getJiraUserByGroup() {
                //构建结果集
                List<JiraUserVO> result = new ArrayList<>();
                //封装http调用获取组内用户
                HttpClient httpClient = HttpClients.createDefault();
        
                String url = jiraUrl + "/rest/api/2/group/member?groupname=" + jiraGroup + "&maxResults=50";
        
                HttpGet request = new HttpGet(url);
                // 将用户名和密码进行 Base64 编码
                String credentials = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());
                request.addHeader("Authorization", "Basic " + credentials);
        
                try {
                    HttpResponse response = httpClient.execute(request);
                    String jsonResponse = EntityUtils.toString(response.getEntity());
                    //转换结果集
                    JsonObject returnData = new JsonParser().parse(jsonResponse).getAsJsonObject();
                    //获取总数
                    Integer total = Integer.valueOf(returnData.get("total").toString());
        
                    //根据总数循环调用获取所有用户
                    for (int i = 0; i <= total / 50 + 1; i++) {
                        String queueUrl = String.format(url + "&startAt=%d", i * 50);
                        HttpGet queueRequest = new HttpGet(queueUrl);
                        queueRequest.addHeader("Authorization", "Basic " + credentials);
                        HttpResponse queueResponse = httpClient.execute(queueRequest);
                        String queueJsonResponse = EntityUtils.toString(queueResponse.getEntity());
                        //转换结果集
                        JsonObject queueReturnData = new JsonParser().parse(queueJsonResponse).getAsJsonObject();
                        JsonArray values = queueReturnData.getAsJsonArray("values");
                        for (JsonElement jsonElement : values) {
                            JsonObject item = jsonElement.getAsJsonObject();
                            String name = item.get("name").getAsString();
                            String key = item.get("key").getAsString();
                            String emailAdreess = item.get("emailAddress").getAsString();
                            JiraUserVO jiraUserVO = new JiraUserVO();
                            jiraUserVO.setUserName(name);
                            jiraUserVO.setKey(key);
                            jiraUserVO.setEmailAddress(emailAdreess);
                            result.add(jiraUserVO);
                        }
                    }
        
                } catch (Exception e) {
                    throw new ServiceException(ERROR_CODE_40001, "jira数据获取异常");
                }
                return result;
            }
        
        
            /**
             * 获取所有项目Id
             */
            public List<String> getJiraProjectsId() {
        
                //构建结果集
                List<String> result = new ArrayList<>();
        
                //封装http调用获取项目
                HttpClient httpClient = HttpClients.createDefault();
        
                //获取所有项目
                String url = jiraUrl + "/rest/api/2/project";
                HttpGet request = new HttpGet(url);
        
                //将用户名和密码进行 Base64 编码
                String credentials = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());
                request.addHeader("Authorization", "Basic " + credentials);
                try {
                    HttpResponse response = httpClient.execute(request);
                    String jsonResponse = EntityUtils.toString(response.getEntity());
                    //转换结果集
                    JsonArray returnData = new JsonParser().parse(jsonResponse).getAsJsonArray();
                    //遍历获取所有项目
                    for (JsonElement jsonElement : returnData) {
                        JsonObject item = jsonElement.getAsJsonObject();
                        String name = item.get("id").getAsString();
                        result.add(name);
                    }
                } catch (Exception e) {
                    log.error("同步项目失败",e);
                }
                return result;
            }
        
        
            /**
             * 获取单个项目对应版本
             * List<String> projectIds
             */
            public List<JiraProjectAO> getJiraProjectVersionsById(List<String> proIds) {
        
                //构建结果集
                List<JiraProjectAO> result = new ArrayList<>();
                //封装http调用获取项目
                HttpClient httpClient = HttpClients.createDefault();
        
                for (String proId : proIds) {
                    //获取所有项目
                    String url = jiraUrl + "/rest/api/2/project/" + proId;
                    HttpGet request = new HttpGet(url);
        
                    //将用户名和密码进行 Base64 编码
                    String credentials = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());
                    request.addHeader("Authorization", "Basic " + credentials);
                    try {
                        HttpResponse response = httpClient.execute(request);
                        String jsonResponse = EntityUtils.toString(response.getEntity());
        
                        //转换结果集
                        JsonObject queueReturnData = new JsonParser().parse(jsonResponse).getAsJsonObject();
                        JsonArray values = queueReturnData.getAsJsonArray("versions");
        
                        //遍历版本
                        for (JsonElement jsonElement : values) {
                            JiraProjectAO jiraProjectAO = new JiraProjectAO();
                            //获取项目相关信息
                            String projectId = queueReturnData.getAsJsonPrimitive("id").getAsString();
                            String projectKey = queueReturnData.getAsJsonPrimitive("key").getAsString();
                            String projectName = queueReturnData.getAsJsonPrimitive("name").getAsString();
        
                            //获取项目负责人相关信息(暂不同步)
        //                    JsonObject lead = queueReturnData.getAsJsonObject("lead");
        //                    String leadKey = "";
        //                    String leadName = "";
        //                    if (ObjectUtils.isNotEmpty(lead)) {
        //                        leadKey = ObjectUtils.isEmpty(lead.getAsJsonPrimitive("key")) ? "" : lead.getAsJsonPrimitive("key").getAsString();
        //                        leadName = ObjectUtils.isEmpty(lead.getAsJsonPrimitive("displayName")) ? "" : lead.getAsJsonPrimitive("displayName").getAsString();
        //                    }
        
                            //获取项目状态相关信息(暂不同步)
        //                    JsonObject proCate = queueReturnData.getAsJsonObject("projectCategory");
        //                    String proCateId = "";
        //                    String proCateName = "";
        //
        //                    if (ObjectUtils.isNotEmpty(proCate)) {
        //                        proCateId = ObjectUtils.isEmpty(proCate.getAsJsonPrimitive("id")) ? "" : proCate.getAsJsonPrimitive("id").getAsString();
        //                        proCateName = ObjectUtils.isEmpty(proCate.getAsJsonPrimitive("name")) ? "" : proCate.getAsJsonPrimitive("name").getAsString();
        //                    }
        
                            //获取版本相关信息
                            JsonObject item = jsonElement.getAsJsonObject();
                            String versionName = ObjectUtils.isEmpty(item.get("name")) ? "" : item.get("name").getAsString();
                            String versionId = ObjectUtils.isEmpty(item.get("id")) ? "" : item.get("id").getAsString();
                            String versionDesc = ObjectUtils.isEmpty(item.get("description")) ? "" : item.get("description").getAsString();
                            String startDate = ObjectUtils.isEmpty(item.get("startDate")) ? "" : item.get("startDate").getAsString();
                            String releaseDate = ObjectUtils.isEmpty(item.get("releaseDate")) ? "" : item.get("releaseDate").getAsString();
                            //获取版本状态
                            Boolean isArchived = ObjectUtils.isEmpty(item.get("archived")) ? false : item.get("archived").getAsBoolean();
                            Boolean isReleased = ObjectUtils.isEmpty(item.get("released")) ? false : item.get("released").getAsBoolean();
                            jiraProjectAO.setStatus("3");
                            if(isReleased){
                                jiraProjectAO.setStatus("2");
                            }
                            if(isArchived){
                                jiraProjectAO.setStatus("1");
                            }
                            jiraProjectAO.setId(projectId);
                            jiraProjectAO.setKey(projectKey);
                            jiraProjectAO.setName(projectName);
                            jiraProjectAO.setVersionDesc(versionDesc);
                            jiraProjectAO.setStartDate(startDate);
                            jiraProjectAO.setReleaseDate(releaseDate);
        //                    jiraProjectAO.setLeadKey(leadKey);
        //                    jiraProjectAO.setLeadName(leadName);
        //                    jiraProjectAO.setProjectCategoryId(proCateId);
        //                    jiraProjectAO.setProjectCategoryName(proCateName);
                            jiraProjectAO.setVersionName(versionName);
                            jiraProjectAO.setVersionId(versionId);
        
                            result.add(jiraProjectAO);
                        }
        
                    } catch (Exception e) {
                        log.error("同步项目失败",e);
                    }
                }
        
                return result;
        
            }
        
        
            /**
             * 获取所有Bug
             */
            public List<JiraIssueAO> getJiraIssues(String startTime) {
                //获取字典表拿到point等jira属性id
                List<JiraDic> jiraDics = jiraDicService.list();
        
                //拿到字典中所有属性
                JiraDic points = getByKey(jiraDics,Constants.POINTS);
                JiraDic storyPoints = getByKey(jiraDics,Constants.STORY_POINTS);
                JiraDic subtask = getByKey(jiraDics, Constants.ISSUE_TYPE_SUBTASK);
                JiraDic story = getByKey(jiraDics, Constants.ISSUE_TYPE_STORY);
                JiraDic storyBase = getByKey(jiraDics, Constants.ISSUE_TYPE_STORY_BASE);
                JiraDic storyIncubate = getByKey(jiraDics, Constants.ISSUE_TYPE_STORY_INCUBATE);
                JiraDic storyIncubateBase = getByKey(jiraDics, Constants.ISSUE_TYPE_STORY_INCUBATE_BASE);
                JiraDic displayStep = getByKey(jiraDics, Constants.DISPLAY_STEP);
                JiraDic defect = getByKey(jiraDics, Constants.ISSUE_TYPE_DEFECT);
                JiraDic responsible = getByKey(jiraDics, Constants.RESPONSIBLE);
        
                //拿到所有类型属性
                List<JiraDic> issueTypeDic = jiraDics.stream().filter(e -> Constants.ISSUE_TYPE_DIC.equals(e.getType())).collect(Collectors.toList());
        
                //构建结果集
                List<JiraIssueAO> result = new ArrayList<>();
                //封装http调用获取项目
                HttpClient httpClient = HttpClients.createDefault();
        
                String url = jiraUrl + "rest/api/2/search?jql=";
        
                try {
                    //定义起止时间
                    String endTime = DateUtils.formatDateToSecond(new Date());
        
                    //url构造
                    String param = "issuetype is not empty and status != Closed AND updatedDate >= \"" + startTime + "\" AND updatedDate <= \"" + endTime + "\"";
                    url = url + URLEncoder.encode(param, "UTF-8");
                    url = url + "&maxResults=50";
        
        
                    HttpGet request = new HttpGet(url);
                    // 将用户名和密码进行 Base64 编码
                    String credentials = Base64.getEncoder().encodeToString((userName + ":" + password).getBytes());
                    request.addHeader("Authorization", "Basic " + credentials);
        
                    HttpResponse response = httpClient.execute(request);
                    String jsonResponse = EntityUtils.toString(response.getEntity());
                    //转换gson
                    Gson gson = new Gson();
                    IssueResponse issueResponse = gson.fromJson(jsonResponse, IssueResponse.class);
        
                    //获取总数量
                    int total = issueResponse.getTotal();
        
                    //根据总数循环调用获取所有用户
                    for (int i = 0; i <= total / 50 + 1; i++) {
                        int startAt = i * 50;
                        String queueUrl = url + "&startAt="+startAt;
                        HttpGet queueRequest = new HttpGet(queueUrl);
                        queueRequest.addHeader("Authorization", "Basic " + credentials);
                        HttpResponse queueResponse = httpClient.execute(queueRequest);
                        String queueJsonResponse = EntityUtils.toString(queueResponse.getEntity());
        
                        //转换结果集
                        IssueResponse queueIssueResponse = gson.fromJson(queueJsonResponse, IssueResponse.class);
                        JsonObject returnData = new JsonParser().parse(queueJsonResponse).getAsJsonObject();
        
                        List<Issue> issues = queueIssueResponse.getIssues();
                        //遍历当前issue
                        int index = 0;
                        for (Issue item : issues) {
        
                            //测试
                            if(item.getKey().equals("DTFCP-790")){
                                String a = "测试";
                            }
        
                            JiraIssueAO jiraIssueAO = new JiraIssueAO();
        
                            Fields fields = item.getFields();
                            if (ObjectUtils.isNotEmpty(fields)) {
                                //获取项目数据
                                Project project = fields.getProject();
                                if (ObjectUtils.isNotEmpty(project)) {
                                    jiraIssueAO.setProjectId(project.getId());
                                    jiraIssueAO.setProjectName(project.getName());
                                }
        
                                //获取类型信息
                                IssueType issueType = fields.getIssuetype();
                                if (ObjectUtils.isNotEmpty(issueType)) {
                                    for (JiraDic unit : issueTypeDic) {
                                        jiraIssueAO.setIssueTypeId(issueType.getId());
                                        if (unit.getJiraId().equals(issueType.getId())) {
                                            jiraIssueAO.setIssueTypeCode(unit.getCode());
                                        }
                                    }
                                }
        
                                //获取issue本身信息
                                jiraIssueAO.setIssueId(item.getId());
                                jiraIssueAO.setIssueName(item.getKey());
        
                                //设置issue父issue
                                IssueParent issueParent = fields.getParent();
                                if (ObjectUtils.isNotEmpty(issueParent)) {
                                    jiraIssueAO.setParentIssueKey(issueParent.getKey());
                                }
        
                                //获取p值(类型为子任务或者故事)
                                String p = "0.0";
                                JsonArray issueJsonArray = returnData.getAsJsonArray("issues");
                                JsonElement issueJsonElement = issueJsonArray.get(index);
                                JsonObject fieldObject = issueJsonElement.getAsJsonObject().getAsJsonObject("fields");
        
                                if (subtask.getJiraId().equals(issueType.getId())) {
                                    JsonElement jsonElement = fieldObject.get(points.getJiraId());
                                    if (!jsonElement.isJsonNull()) {
                                        p = jsonElement.getAsString();
                                    }
                                    jiraIssueAO.setPoints(new BigDecimal(p));
        
                                    //获取任务修复版本信息
                                    List<FixVersion> versions = fields.getFixVersions();
                                    if (ObjectUtils.isNotEmpty(versions)) {
                                        FixVersion fixVersion = versions.get(0);
                                        jiraIssueAO.setProjectVersionName(fixVersion.getName());
                                        jiraIssueAO.setProjectVersionId(fixVersion.getId());
                                    }
                                }
        
                                //如果类型为故事类型
                                if (storyIncubateBase.getJiraId().equals(issueType.getId())||story.getJiraId().equals(issueType.getId())||storyBase.getJiraId().equals(issueType.getId())||storyIncubate.getJiraId().equals(issueType.getId())) {
                                    JsonElement jsonElement = fieldObject.get(storyPoints.getJiraId());
                                    if (ObjectUtils.isNotEmpty(jsonElement)&&!jsonElement.isJsonNull()) {
                                        p = jsonElement.getAsString();
                                    }
                                    jiraIssueAO.setPoints(new BigDecimal(p));
                                    //获取任务修复版本信息
                                    List<FixVersion> versions = fields.getFixVersions();
                                    if (ObjectUtils.isNotEmpty(versions)) {
                                        FixVersion fixVersion = versions.get(0);
                                        jiraIssueAO.setProjectVersionName(fixVersion.getName());
                                        jiraIssueAO.setProjectVersionId(fixVersion.getId());
                                    }
                                }
        
                                //获取缺陷发现阶段和责任人
                                if (defect.getJiraId().equals(issueType.getId())) {
                                    JsonElement jsonElement = fieldObject.get(displayStep.getJiraId());
                                    if (!jsonElement.isJsonNull()) {
                                        JsonObject step = jsonElement.getAsJsonObject();
                                        JsonElement valueJsonElement = step.get("value");
                                        if (!valueJsonElement.isJsonNull()) {
                                            jiraIssueAO.setDisplayStepName(valueJsonElement.getAsString());
                                        }
                                    }
        
                                    //获取责任人
                                    JsonElement responsibleJsonElement = fieldObject.get(responsible.getJiraId());
                                    if(!responsibleJsonElement.isJsonNull()){
                                        JsonArray responsibleJsonArray = responsibleJsonElement.getAsJsonArray();
                                        List<String> responsibleKeys = new ArrayList<>();
                                        for (JsonElement unit : responsibleJsonArray) {
                                            JsonObject responsibleObj = unit.getAsJsonObject();
                                            String responsibleKey = ObjectUtils.isEmpty(responsibleObj.get("key")) ? "" : responsibleObj.get("key").getAsString();
                                            responsibleKeys.add(responsibleKey);
                                        }
                                        jiraIssueAO.setResponsible(responsibleKeys);
                                    }
        
                                    //获取缺陷影响版本信息
                                    List<FixVersion> versions = fields.getVersions();
                                    if (ObjectUtils.isNotEmpty(versions)) {
                                        FixVersion fixVersion = versions.get(0);
                                        jiraIssueAO.setProjectVersionName(fixVersion.getName());
                                        jiraIssueAO.setProjectVersionId(fixVersion.getId());
                                    }
        
                                }
        
                                //设置问题创建人
                                Reporter reporter = fields.getReporter();
                                if (ObjectUtils.isNotEmpty(reporter)) {
                                    jiraIssueAO.setJiraCreateKey(reporter.getKey());
                                }
        
                                Assignee assignee = fields.getAssignee();
                                if (ObjectUtils.isNotEmpty(assignee)) {
                                    jiraIssueAO.setJiraAssigneeKey(assignee.getKey());
                                }
        
                                //设置任务创建时间更新时间
                                jiraIssueAO.setCreated(fields.getCreated());
                                jiraIssueAO.setUpdated(fields.getUpdated());
        
                                //任务状态
                                Status status = fields.getStatus();
                                if (ObjectUtils.isNotEmpty(status)) {
                                    StatusCategory statusCategory = status.getStatusCategory();
                                    if (ObjectUtils.isNotEmpty(statusCategory)) {
                                        jiraIssueAO.setStatusKey(statusCategory.getKey());
                                        jiraIssueAO.setStatusName(statusCategory.getName());
                                    }
                                }
        
                                result.add(jiraIssueAO);
        
                                index++;
                            }
                        }
        
                    }
        
                } catch (Exception e) {
                    log.error("同步失败", e);
                }
        
                return result;
        
            }
        
            private JiraDic getByKey(List<JiraDic> jiraDics,String key) {
                return jiraDics.stream().filter(e -> key.equals(e.getCode())).findFirst().get();
            }
        
        
        }
        

    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【随笔】Git 高级篇 -- 远程与本地不一致导致提交冲突 git push --rebase(三十一)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

「JavaEE」线程

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 线程 &#x1f349;线程&#x1f34c;多线程&#x1f34c;线程与进程的联系&区别&#x1f34c;多线程编程&#x1f34c;创建线程&a…

基于springboot实现英语知识应用网站系统项目【项目源码+论文说明】

基于springboot实现英语知识应用网站系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了英语知识应用网站的开发全过程。通过分析英语知识应用网站管理的不足&#xff0c;创建了一个计算机管理英语知识应…

vue 常用的日历排班,带农历显示组件(2024-04-16)

显示当前月日历组件&#xff0c;里面带农历或节日显示 后面可以丰富一些国家法定节假期的业务需求 代码 js-calendar.js 文件 var lunarInfo [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, //1900-19090x04ae0, 0x0a5b6, 0…

【VIC水文模型】模型输入/输出参数简介

VIC水文模型输入参数简介 输入数据1.1 背景参数1.2 植被分类及属性配置1.3 土壤数据库制作1.4 气象数据库制作1.5 区域控制文件1.6 汇流文件制作 输出数据参考 VIC水文模型是基于空间分布网格化的分布式水文模型。通过将研究区域网格化&#xff0c;分别考虑每个计算网格内裸土和…

ThreadLocal和ThreadLocalHashMap

请直接百度详细介绍 -------------------------------------------------------------------------------------------------------------------------------- 1.ThreadLocalMap是Thread类里的一个局部变量 2.ThreadLocalMap是ThreadLocal类里的一个静态内部类, 3.ThreadL…

Java springboot使用EasyExcel读Excel文件,映射不到属性值,对象属性值都是null

如果你的类上有这个注解&#xff0c;去掉火或注释掉就可以了 Accessors(chain true)解决方法

聊聊最近两星期的学习吧!

今天是4月14号。 自从我3月份回到学校之后&#xff0c;我每天都有记录自己的学习时长。今天晚上&#xff0c;我在复盘我自己学习时长的时候&#xff0c;我发现&#xff0c;在整个四月份&#xff0c;我平均每天的有效学习时长只有6h&#xff0c;而且到今天为止&#xff0c;整个四…

【深度学习实战(5)】使用仿射变换来实现自己的letter_box操作

一、letter_box 深度学习模型输入图片的尺寸为正方形&#xff0c;而数据集中的图片一般为长方形&#xff0c;粗暴的resize会使得图片失真&#xff0c;采用letterbox可以较好的解决这个问题。该方法可以保持图片的长宽比例&#xff0c;剩下的部分采用灰色填充。 二、代码 本例…

美易官方:若FED再不降息,美国经济将硬着陆

有关美股市场可能重演2022年熊市的担忧逐渐升温。阿波罗全球管理公司首席执行官马克罗文在接受采访时发出警告&#xff0c;如果美联储&#xff08;FED&#xff09;不采取降息措施&#xff0c;美国经济将面临硬着陆的风险。这一言论引发了市场对未来经济走势的广泛关注。 在周二…

​面试经典150题——翻转二叉树

1. 题目描述 2. 题目分析与解析 分析题目可以看出&#xff0c;其实就是从下到上的左右节点互换操作&#xff0c;其实上也是可以进行递归操作的&#xff0c;这是因为每一个子操作和父操作都是一样的方式。 解题思路&#xff1a; 空树情况处理&#xff1a; 首先检查根节点是否…

视频批量高效剪辑,支持将视频文件转换为音频文件,轻松掌握视频格式

在数字化时代&#xff0c;视频内容日益丰富&#xff0c;管理和编辑这些视频变得愈发重要。然而&#xff0c;传统的视频剪辑软件往往操作复杂&#xff0c;难以满足高效批量处理的需求。现在&#xff0c;一款全新的视频批量剪辑神器应运而生&#xff0c;它支持将视频文件一键转换…

02_对象树

#include "mypushbutton.h" #include <QDebug>MyPushButton::MyPushButton(QWidget *parent): QPushButton(parent) {qDebug()<<"我的按钮类构造调用"; }MyPushButton::~MyPushButton() {qDebug()<<"我的按钮类析构调用"; }交…

初识数据库与数据库管理系统

实体的概念与数据库 实体(对象): 客观存在的事物都是实体实体数据的存储要求: 必须按照一定的分类和规律存储数据库: 专门用于存储这些实体的信息的数据集合数据库的特点: 海量存储数据&#xff0f;数据检索非常方便保持数据信息的一致&#xff0f;完整&#xff0f;并实现数据…

【计算机毕业设计】家庭食谱管理系统产品功能介绍——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

机器人视觉软件实现目标检测通常借助深度学习技术和计算机视觉算法

机器人视觉软件实现目标检测通常借助深度学习技术和计算机视觉算法。以下是一般而言的目标检测实现步骤&#xff1a; 1、数据收集与标注&#xff1a;首先需要收集包含目标物体的大量图像数据&#xff0c;并对这些图像进行标注&#xff0c;标注出目标物体的位置和类别信息。这些…

第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组(基础题)

试题 C: 好数 时间限制 : 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10 分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &…

模仿SpringSecurity配置文件的写法对mybatisPlus查询方法的改造

使用mybatisPlus查询数据的传统流程是&#xff1a;Autowired mapper对象。new Wrapper 一通乱set Wrapper ,select xxx。但实际开发中&#xff0c;还有很大的改进空间&#xff0c;一是一些脆弱的参数设置有多处&#xff0c;得不到妥善维护&#xff0c;二是代码编写丑陋难看。因…

Fluke ADPT连接器(隔离版)----发布2

代替手工记录、记录后在整理的麻烦&#xff0c;轻点鼠标&#xff08;单次采集、自动时间间隔采集自由选择&#xff09;即可完成&#xff0c;测试数据导出图片、导出数据到EXCEL文件随意选择&#xff1b; 所需设备&#xff1a; 1、Fluke ADPT连接器&#xff1b;内附链接 ● …

ArtCoder——通过风格转换生成多元化艺术风格二维码

简介 ArtCoder能够从原始图像&#xff08;内容&#xff09;、目标图像&#xff08;风格&#xff09;以及想要嵌入的信息中&#xff0c;生成具有艺术风格的二维码。这一过程类似于通常的图像风格转换&#xff0c;但特别针对二维码的特点进行了优化和调整。 通过这种方法&#…