PageDTO<T>,PageQuery,BeanUtils,CollUtils的封装

一、PageDTO<T>

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.tianji.common.utils.BeanUtils;
import com.tianji.common.utils.CollUtils;
import com.tianji.common.utils.Convert;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "分页结果")
public class PageDTO<T> {@ApiModelProperty("总条数")protected Long total;@ApiModelProperty("总页码数")protected Long pages;@ApiModelProperty("当前页数据")protected List<T> list;public static <T> PageDTO<T> empty(Long total, Long pages) {return new PageDTO<>(total, pages, CollUtils.emptyList());}public static <T> PageDTO<T> empty(Page<?> page) {return new PageDTO<>(page.getTotal(), page.getPages(), CollUtils.emptyList());}public static <T> PageDTO<T> of(Page<T> page) {if(page == null){return new PageDTO<>();}if (CollUtils.isEmpty(page.getRecords())) {return empty(page);}return new PageDTO<>(page.getTotal(), page.getPages(), page.getRecords());}public static <T,R> PageDTO<T> of(Page<R> page, Function<R, T> mapper) {if(page == null){return new PageDTO<>();}if (CollUtils.isEmpty(page.getRecords())) {return empty(page);}return new PageDTO<>(page.getTotal(), page.getPages(),page.getRecords().stream().map(mapper).collect(Collectors.toList()));}public static <T> PageDTO<T> of(Page<?> page, List<T> list) {return new PageDTO<>(page.getTotal(), page.getPages(), list);}public static <T, R> PageDTO<T> of(Page<R> page, Class<T> clazz) {return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz));}public static <T, R> PageDTO<T> of(Page<R> page, Class<T> clazz, Convert<R, T> convert) {return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz, convert));}@ApiModelProperty(hidden = true)@JsonIgnorepublic boolean isEmpty(){return list == null || list.size() == 0;}
}

二、 PageQuery

2.1 PageQuery代码

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxx.common.constants.Constant;
import com.xxx.common.utils.StringUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;import javax.validation.constraints.Min;@Data
@ApiModel(description = "分页请求参数")
@Accessors(chain = true)
public class PageQuery {public static final Integer DEFAULT_PAGE_SIZE = 20;public static final Integer DEFAULT_PAGE_NUM = 1;@ApiModelProperty(value = "页码", example = "1")@Min(value = 1, message = "页码不能小于1")private Integer pageNo = DEFAULT_PAGE_NUM;@ApiModelProperty(value = "每页大小", example = "5")@Min(value = 1, message = "每页查询数量不能小于1")private Integer pageSize = DEFAULT_PAGE_SIZE;@ApiModelProperty(value = "是否升序", example = "true")private Boolean isAsc = true;@ApiModelProperty(value = "排序字段", example = "id")private String sortBy;public int from(){return (pageNo - 1) * pageSize;}public <T> Page<T> toMpPage(OrderItem ... orderItems) {Page<T> page = new Page<>(pageNo, pageSize);// 是否手动指定排序方式if (orderItems != null && orderItems.length > 0) {for (OrderItem orderItem : orderItems) {page.addOrder(orderItem);}return page;}// 前端是否有排序字段if (StringUtils.isNotEmpty(sortBy)){OrderItem orderItem = new OrderItem();orderItem.setAsc(isAsc);orderItem.setColumn(sortBy);page.addOrder(orderItem);}return page;}public <T> Page<T> toMpPage(String defaultSortBy, boolean isAsc) {if (StringUtils.isBlank(sortBy)){sortBy = defaultSortBy;this.isAsc = isAsc;}Page<T> page = new Page<>(pageNo, pageSize);OrderItem orderItem = new OrderItem();orderItem.setAsc(this.isAsc);orderItem.setColumn(sortBy);page.addOrder(orderItem);return page;}public <T> Page<T> toMpPageDefaultSortByCreateTimeDesc() {return toMpPage(Constant.DATA_FIELD_NAME_CREATE_TIME, false);}
}

2.2 使用举例

@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(description = "互动问题分页查询条件")
public class QuestionPageQuery extends PageQuery {// 用户端查询条件@ApiModelProperty(value = "课程id")private Long courseId;@ApiModelProperty(value = "小节id", example = "1")private Long sectionId;@ApiModelProperty(value = "是否只查询我的问题", example = "1")private Boolean onlyMine;
}----------------------------------------------------------------//1 获取用户id
Long userId = UserContext.getUser();Boolean onlyMine = query.getOnlyMine(); // 是否只查询自己
Long sectionId = query.getSectionId();
Long courseId = query.getCourseId();
//2 分页查询问题表(question)数据
// selecgt * from question  where user_id=?  and course_id =? and section_id=? and hidden= false;
Page<InteractionQuestion> page = this.lambdaQuery().eq(onlyMine, InteractionQuestion::getUserId, userId) // 只查询自己,才拼接条件.eq(courseId != null, InteractionQuestion::getCourseId, courseId) // 传递了 课程,才拼接课程查询.eq(sectionId != null, InteractionQuestion::getSectionId, sectionId)  // 传递了 小节,才拼接小节查询.eq(InteractionQuestion::getHidden, false) // 被管理员隐藏的不显示.page(query.toMpPageDefaultSortByCreateTimeDesc()); // 按照创建日期倒叙排序
List<InteractionQuestion> records = page.getRecords();
if(CollUtils.isEmpty(records)){ // 如果没有return PageDTO.empty(page);
}
// 1.获取用户id
Long userId = UserContext.getUser();
// 2) 分页查询数据库
// select * from learning_lesson where user_id=?  order by create_time desc  limit 5Page<LearningLesson> page = this.lambdaQuery().eq(LearningLesson::getUserId, userId).page(query.toMpPage("latest_learn_time", false));//  mybatis  会把  查询的数据全部封装到 page 中: 数据, 总条数数据集
List<LearningLesson> records = page.getRecords(); // 获取当前页数据
if(CollUtils.isEmpty(records)){return PageDTO.empty(page); // 如果没有数据返回空对象
}

三、BeanUtils

3.1 BeanUtils代码

import cn.hutool.core.bean.BeanUtil;import java.util.List;
import java.util.stream.Collectors;/*** 继承自 hutool 的BeanUtil,增加了bean转换时自定义转换器的功能*/
public class BeanUtils extends BeanUtil {/*** 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理** @param source  原对象* @param clazz   目标对象的class* @param convert 转换器* @param <R>     原对象类型* @param <T>     目标对象类型* @return 目标对象*/public static <R, T> T copyBean(R source, Class<T> clazz, Convert<R, T> convert) {T target = copyBean(source, clazz);if (convert != null) {convert.convert(source, target);}return target;}/*** 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理** @param source  原对象* @param clazz   目标对象的class* @param <R>     原对象类型* @param <T>     目标对象类型* @return 目标对象*/public static <R, T> T copyBean(R source, Class<T> clazz){if (source == null) {return null;}return toBean(source, clazz);}public static <R, T> List<T> copyList(List<R> list, Class<T> clazz) {if (list == null || list.size() == 0) {return CollUtils.emptyList();}return copyToList(list, clazz);}public static <R, T> List<T> copyList(List<R> list, Class<T> clazz, Convert<R, T> convert) {if (list == null || list.size() == 0) {return CollUtils.emptyList();}return list.stream().map(r -> copyBean(r, clazz, convert)).collect(Collectors.toList());}
}
package com.xxx.common.utils;/*** 对原对象进行计算,设置到目标对象中**/
public interface Convert<R,T>{void convert(R origin, T target);
}

3.2 举例

在这里插入图片描述

在这里插入图片描述

    public void save(CourseTeacherSaveDTO courseTeacherSaveDTO) {//1.数据删除条件LambdaUpdateWrapper<CourseTeacherDraft> updateWrapper =Wrappers.lambdaUpdate(CourseTeacherDraft.class).eq(CourseTeacherDraft::getCourseId, courseTeacherSaveDTO.getId());//1.1.数据删除baseMapper.delete(updateWrapper);//2.组装即将插入的数据// List<TeacherInfo> teachersList<CourseTeacherDraft> courseTeacherDrafts =BeanUtils.copyList(courseTeacherSaveDTO.getTeachers(),CourseTeacherDraft.class,(teacherInfo, teacherDraft) -> {//2.1.设置课程idteacherDraft.setCourseId(courseTeacherSaveDTO.getId());//2.2.设置老师idteacherDraft.setTeacherId(teacherInfo.getId());//2.3.设置课程中老师排序teacherDraft.setCIndex(courseTeacherSaveDTO.getTeachers().indexOf(teacherInfo));});//3.批量插入课程的老师信息saveBatch(courseTeacherDrafts);//4.更新课程填写进度courseDraftService.updateStep(courseTeacherSaveDTO.getId(), CourseConstants.CourseStep.TEACHER);}-----------------------------------------------------
@ApiModel("课程老师关系模型")
public class CourseTeacherSaveDTO {@ApiModelProperty("课程id")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_COURSE_ID_NULL)private Long id;@ApiModelProperty("老师id和用户端是否展示,该列表按照界面上的顺序")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NULL)
//    @Min(value = 1, message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NULL)@Size(min = 1, max = 5, message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NUM_MAX )private List<TeacherInfo> teachers;@Data@ApiModel("老师id和用户端是否显示")public static class TeacherInfo{@ApiModelProperty("老师id")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHER_ID_NULL)private Long id;@ApiModelProperty("用户端是否展示")@NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHER_SHOW)private Boolean isShow;}
}

四、CollUtils

4.1 CollUtils代码

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.IterUtil;
import com.xxx.common.validate.Checker;import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;/*** 继承自 hutool 的集合工具类*/
public class CollUtils extends CollectionUtil {public static <T> List<T> emptyList() {return Collections.emptyList();}public static <T> Set<T> emptySet() {return Collections.emptySet();}public static <K,V> Map<K, V> emptyMap() {return Collections.emptyMap();}public static <T> Set<T> singletonSet(T t) {return Collections.singleton(t);}public static <T> List<T> singletonList(T t) {return Collections.singletonList(t);}public static List<Integer> convertToInteger(List<String> originList){return CollUtils.isNotEmpty(originList) ? originList.stream().map(NumberUtils::parseInt).collect(Collectors.toList()) : null;}public static List<Long> convertToLong(List<String> originLIst){return CollUtils.isNotEmpty(originLIst) ? originLIst.stream().map(NumberUtils::parseLong).collect(Collectors.toList()) : null;}/*** 以 conjunction 为分隔符将集合转换为字符串 如果集合元素为数组、Iterable或Iterator,则递归组合其为字符串* @param collection 集合* @param conjunction 分隔符* @param <T> 集合元素类型* @return 连接后的字符串* See Also: IterUtil.join(Iterator, CharSequence)*/public static <T> String join(Collection<T> collection, CharSequence conjunction) {if (null == collection || collection.isEmpty()) {return null;}return IterUtil.join(collection.iterator(), conjunction);}public static <T> String joinIgnoreNull(Collection<T> collection, CharSequence conjunction) {if (null == collection || collection.isEmpty()) {return null;}StringBuilder sb = new StringBuilder();for (T t : collection) {if(t == null) continue;sb.append(t).append(",");}if(sb.length() <= 0){return null;}return sb.deleteCharAt(sb.length() - 1).toString();}/*** 集合校验逻辑** @param data 要校验的集合* @param checker 校验器* @param <T> 集合元素类型*/public static  <T> void  check(List<T> data, Checker<T> checker){if(data == null){return;}for (T t : data){checker.check(t);}}/*** 集合校验逻辑** @param data 要校验的集合* @param <T> 集合元素类型*/public static  <T extends Checker<T>> void  check(List<T> data){if(data == null){return;}for (T t : data){t.check();}}/*** 将元素加入到集合中,为null的过滤掉** @param list 集合* @param data 要添加的数据* @param <T> 元素类型*/public static <T> void add(Collection<T> list, T... data) {if (list == null || ArrayUtils.isEmpty(data)) {return;}for (T t : data) {if (ObjectUtils.isNotEmpty(t)) {list.add(t);}}}//将两个集合出现次数相加public static Map<Long, Integer> union(Map<Long, Integer> map1, Map<Long, Integer> map2) {if (CollUtils.isEmpty(map1)) {return map2;} else if (CollUtils.isEmpty(map2)) {return map1;}for (Map.Entry<Long, Integer> entry : map1.entrySet()) {Integer num = map2.get(entry.getKey());map2.put(entry.getKey(), NumberUtils.null2Zero(num) + entry.getValue());}return map2;}public static <T,R> R getFiledOfFirst(List<T> list, Function<T, R> function) {if (CollUtils.isEmpty(list)) {return null;}return function.apply(list.get(0));}
}

/*** 实现后在接口访问时如果接口实现了这个接口* 会被自动自行接口check进行校验**/
public interface Checker<T> {/*** 用于实现validation不能校验的数据逻辑*/default void check(){}default void check(T data){}
}

4.2 checker举例

@ApiModel(description = "章节")
public class CataSaveDTO implements Checker {@ApiModelProperty("章、节、练习id")private Long id;@ApiModelProperty("目录类型1:章,2:节,3:测试")@NotNull(message = "")private Integer type;@ApiModelProperty("章节练习名称")private String name;@ApiModelProperty("章排序,章一定要传,小节和练习不需要传")private Integer index;@ApiModelProperty("当前章的小节或练习")@Size(min = 1, message = "不能出现空章")private List<CataSaveDTO> sections;@Overridepublic void check() {//名称为空校验if(type == CourseConstants.CataType.CHAPTER && StringUtils.isEmpty(name)) {throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_NULL);}else if(StringUtils.isEmpty(name)){throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_NULL2);}//名称长度问题if (type == CourseConstants.CataType.CHAPTER && name.length() > 30){throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_SIZE);}else if(name.length() > 30) {throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_SIZE2);}if(CollUtils.isEmpty(sections)){throw new BadRequestException("不能出现空章");}}
}
@ApiModel("题目保存模型")
@Data
public class SubjectSaveDTO implements Checker {@ApiModelProperty("题目id,为空新增,不为空更新")private Long id;@ApiModelProperty("名称")@NotNull(message = "题目为空,请设置题目")@Size(max = 200, min = 5, message = "题目长度为5-200")private String name;@ApiModelProperty("所属题目分类")@NotNull(message = "题目分类为空,请设置题目分类")private List<List<Long>> cates;@ApiModelProperty("题目类型")@NotNull(message = "题目类型为空,请设置题目类型")@EnumValid(enumeration = {1,2,3,4,5}, message = "题目类型只有单选题,多选题,不定向选择题,判断题,您的题目超出题纲")private Integer subjectType;@ApiModelProperty("题目难易度")@NotNull(message = "难度不能为空")@EnumValid(enumeration = {1,2,3},message = "题目难度只有简单,中等,困难")private Integer difficulty;@ApiModelProperty("分值")private Integer score;@ApiModelProperty("课程id")private List<Long> courseIds;@ApiModelProperty("选项,最多10个")private List<String> options;@ApiModelProperty("答案,判断题,数组第一个如果是1,代表正确,其他代表错误")@NotNull(message = "题目答案不能为空")private List<Integer> answers;@ApiModelProperty("解析")private String analysis;@Overridepublic void check() {//选择题 单选,多选,不定向选择if(subjectType == SubjectConstants.Type.SIGNLE_CHOICE.getType() ||subjectType == SubjectConstants.Type.MUtiple_CHOICE.getType() ||subjectType == SubjectConstants.Type.NON_DIRECTIONAL_CHOICE.getType()){Integer answerOptionMax = answers.stream().max(Integer::compare).get();//选项最少1个最多10个if(CollUtils.isEmpty(options) || options.size() > 10){throw new BizIllegalException("最少1个选项,最多10个选项");}//选择题答案 不能超过选项数if(answerOptionMax > options.size()){throw new BizIllegalException("存在正确的答案找不到选项");}if(StringUtils.isNotEmpty(analysis)&& (StringUtils.length(analysis) < 5|| StringUtils.length(analysis) > 300)) {throw new BadRequestException("答案解析长度为5-300");}}}
}

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

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

相关文章

C#中的MD5摘要算法与哈希算法

文章目录 一、哈希算法基础二、MD5 算法原理三、MD5摘要算法四、哈希算法五、C#实现示例MD5算法示例哈希算法示例字符串MD5值对比 六、总结 一、哈希算法基础 哈希算法是一种单向密码体制&#xff0c;它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的&#xff0…

IDEA中配置代理,解决Codearts Snap登陆不了的问题

问题描述&#xff1a;在mac电脑中的idea中安装了华为的codearts snap插件&#xff0c;一直登录不了&#xff0c;账号是没问题的&#xff0c;后来我怀疑是我的代理有问题&#xff0c;找到IDEA中的代理设置先是有这个问题“You have JVM property "https.proxyHost" se…

千呼新零售2.0分销商城视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

C语言 将两个字符串连接起来,不用strcat函数

编一个程序,将两个字符串连接起来,不要用strcat函数。 #include <stdio.h>void my_strcat(char *s1, const char *s2) {while (*s1) {s1;}while (*s2) {*s1 *s2;s1;s2;}*s1 \0; }int main() {char s1[100] "Hello, ";char s2[] "World!";my_str…

Android初学者书籍推荐

书单 1.《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年出版2.《第一行代码Android》第二版3.《第一行代码Android》第三版4.《疯狂Android讲义》第四版5.《Android移动应用基础教程&#xff08;Android Studio 第2版&#xff09;》 从学安卓到用安…

uniapp 打包成安卓APP预览base64pdf实现方法

下载PDF.js 问题描述 在uniapp中预览base64的PDF&#xff0c;可以使用web-view组件嵌入一个PDF.js的实例。以下是一个简单的示例&#xff1a; 解决方案&#xff1a; 1.在页面的.vue文件中添加web-view组件&#xff1a; <template><view style"width: 50%;&qu…

【机器学习】支持向量机与主成分分析在机器学习中的应用

文章目录 一、支持向量机概述什么是支持向量机&#xff1f;超平面和支持向量大边距直觉 二、数据预处理与可视化数据集的基本信息导入必要的库加载数据集数据概况数据可视化特征对的散点图矩阵类别分布条形图平均面积与平均光滑度的散点图变量之间的相关性热图 三、模型训练&am…

JS【详解】类 class ( ES6 新增语法 )

本质上&#xff0c;类只是一种特殊的函数。 console.log(typeof 某类); //"function"声明类 class 方式 1 – 类声明 class Car {constructor(model, year) {this.model model;this.year year;} }方式 2 – 类表达式 匿名式 const Car class {constructor(mod…

在conda的环境中安装Jupyter及其他软件包

Pytorch版本、安装和检验 大多数软件包都是随Anaconda安装的&#xff0c;也可以根据需要手动安装一些其他软件包。 目录 创建虚拟环境 进入虚拟环境 安装Jupyter notebook 安装matplotlib 安装 pandas 创建虚拟环境 基于conda包的环境创建、激活、管理与删除http://t.cs…

podman 替代 docker ? centos Stream 10 已经弃用docker,开始用podman了!

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

浅谈React

forwardRef和useImperativeHandle的联动使用 import React, { useImperativeHandle, useRef } from "react" import { forwardRef } from "react"const CustomInput forwardRef((props, ref) > {const inputRef useRef<HTMLInputElement>(null…

Java中锁的分类、原理、使用场景、注意事项、优缺点等详解

Java开发中&#xff0c;锁是保证多线程安全的重要手段。Java提供了多种类型的锁来满足不同的同步需求。在这篇文章中&#xff0c;我将为您介绍以下几种常见的锁类型&#xff1a; 偏向锁/轻量级锁/重量级锁 偏向锁&#xff1a;当一个线程获取一个对象的锁时&#xff0c;如果发现…

解决MCM功率电源模块EMC的关键

对MCM功率电源而言&#xff0c;由于其工作在几百kHz的高频开关状态&#xff0c;故易成为干扰源。电磁兼容性EMC&#xff08;Electro Magnetic Compatibility&#xff09;&#xff0c;是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的…

react父调用子的方法,子调用父的方法

父调用子的方法 // 子组件 import React, { useRef, useEffect } from react;const ChildComponent ({ childMethodRef }) > {const childMethod useRef(null);useEffect(() > {childMethodRef.current childMethod;}, []);const someMethod () > {console.log(子…

量化交易的实战操作与心得

量化交易&#xff0c;作为一种基于数学模型和算法执行交易的方法&#xff0c;已经在全球金融市场中取得了广泛的应用。对于从事量化交易的投资者而言&#xff0c;了解实战操作的具体细节及相关心得是至关重要的&#xff0c;它可以帮助投资者优化策略&#xff0c;提高交易效率&a…

浪潮天启防火墙TQ2000远程配置方法SSL-xxx、L2xx 配置方法

前言 本次设置只针对配置VXX&#xff0c;其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行Vxx配置。 其他配置可参考&#xff1a;浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…

springboot零食盒子-计算机毕业设计源码50658

目 录 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 微信小程序的零食盒子系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 微信…

力扣-排序算法

排序算法&#xff0c;一般都可以使用std&#xff1a;&#xff1a;sort&#xff08;&#xff09;来快速排序。 这里介绍一些相关的算法&#xff0c;巩固记忆。 快速排序 跟二分查找有一丢丢像。 首先选择一个基准元素&#xff0c;一般就直接选择第一个。然后两个指针&#xff0c…

编程玩具应用前景怎么样:深入剖析四大方面、五大趋势、六大挑战与七大机遇

编程玩具应用前景怎么样&#xff1a;深入剖析四大方面、五大趋势、六大挑战与七大机遇 在科技飞速发展的今天&#xff0c;编程玩具作为一种新兴的教育工具&#xff0c;正逐渐走进人们的视野。那么&#xff0c;编程玩具的应用前景究竟如何呢&#xff1f;本文将从四个方面、五个…

测试类型介绍-安全性测试实战技巧

安全性测试实战技巧 在当今数字化时代&#xff0c;软件安全不再是可选项&#xff0c;而是每一款产品的必备特性。随着网络攻击的复杂性和频率不断上升&#xff0c;安全性测试成为了确保应用程序健壮性和用户数据保护的关键环节。 1. 安全性测试的重要性​ 安全性测试旨在识别…