西南交通大学智能监测 培训课程练习4
2023.056.07和09培训
项目实战
目录
一、infracore(基础核心层)
1.1database
1.2config
1.3util
二、业务领域模块
2.1structure模块
2.1.1domain层
2.1.2application层
2.1.3adapter层
2.2sensor模块
2.2.1domian层
2.2.2application层
2.2.3adapter层
一、infracore(基础核心层)
编写整个项目中全部通用的部分,包括:数据库操作、配置类、工具类(随机数、随机ID生成器、格式校验器)、缓存配置......
1.1database
Mysql包:
具体模块包(一个数据表对应一个模块)
DO数据容器(与数据表一一对应)
Mapper(Mybatis或plus操作数据库的SQL)
MapperEnum(字段枚举类)
MapperHelper(面向数据库层面的缓存服务类)

1.2config

1.3util
![]()
@Slf4j
public class SnowFlakeUtil {/*** 派号器workid:0~31* 机房datacenterid:0~31*/private static Snowflake snowflake = IdUtil.createSnowflake(1, 1);public static Long nextId() {return snowflake.nextId();}
}
二、业务领域模块
2.1structure模块
一个业务领域一个包
structure模块下的结构:
2.1.1domain层
domain领域层:
结构物基础信息 + 系统工程管理结点信息 + 文档信息 + 安全信息 + 统计信息
把零碎的、分散的基础信息,组建成完整的专业领域
reader
做所有的数据库读操作,组织各个数据表的数据结构,封装成专业名词,参数校验、分页、数据封装、无效数据剔除......
专业名词封装
//专业名词
@Data
public class Structure {private String id; // 唯一标识private String code; // 桥梁自定义编码-用于外连接-连接到工程结构树节点中的结构物节点上private String structureCode; // 结构物编码-数据对接专用-TDengine超级表名需要private String structureName; // 结构物名称private double longitude; // 经度private double latitude; // 纬度private String structureType; // 结构物类型-根据数据字典:桥梁、隧道、边坡、涵洞...private String address; // 结构物准确地址描述private long sensorCount;public static Structure generateStructure(StructureDO structureDO,long sensorCount){Structure structure = new Structure();BeanUtils.copyProperties(structureDO, structure);structure.setSensorCount(sensorCount);return structure;}}
reader编写对应方法
/*** @author: yangkx* @Title: SensorReader* @ProjectName: SwjtuPeixun* @Description:* @date: 2023-06-11 10:14*/
@Component
public class SensorReader {@Autowiredprivate SensorMapper sensorMapper;@Autowiredprivate MonitorSchemeMapper monitorSchemeMapper;//获取一座桥下面的所有传感器public List<Sensor> getAllForStructure(String structureNodeCode){LambdaQueryWrapper<SensorDO> lqw = new LambdaQueryWrapper<>();lqw.eq(SensorDO::getCode, structureNodeCode);List<SensorDO> records = sensorMapper.selectList(lqw);List<Sensor> result = new ArrayList<>();for(SensorDO record : records){String monitorSchemeId = record.getMonitorSchemeId();MonitorSchemeDO monitorScheme = monitorSchemeMapper.getById(monitorSchemeId);//专业名词Sensor sensor = Sensor.generateSensor(record, monitorScheme);//System.out.println(" " + sensor);//System.out.println(record);result.add(sensor);}return result;}}
writer
做所有的增删改操作
1)在reader包里,添加StructureCreateEntity类
添加转化为DO类的方法
@Data
public class StructureCreateEntity {private String code; // 桥梁自定义编码-用于外连接-连接到工程结构树节点中的结构物节点上private String structureCode; // 结构物编码-数据对接专用-TDengine超级表名需要private String structureName; // 结构物名称private String type; // 结构物类型-例如大桥,中桥,小桥private String level; // 结构物级别-例如2类,1类private double longitude; // 经度private double latitude; // 纬度private StructureType structureType; // 结构物类型-根据数据字典:桥梁、隧道、边坡、涵洞...//private String structureImage; // 结构物图片路径private String fileId; // Bimface模型文件IDprivate String address; // 结构物准确地址描述private String structureStyle; // 结构形式,如:150m钢筋混凝土箱型肋拱private String beginYear; // 结构物开始服役年份private String endYear; // 结构物结束服役年份(若有预期的,可填,没有则不填)private String structureDescribe; // 结构物描述private double bimLatitude; // BIM三维地图坐标经度private double bimLongitude; // BIM三维地图坐标纬度private double bimRotation; // BIM三维地图坐标旋转角度系数private double bimHigh; // BIM三维地图坐标高度public StructureDO toStructureDO(){StructureDO structureDO = new StructureDO();BeanUtils.copyProperties(this, structureDO);return structureDO;}
}
2) 回到database包里,在structure里新建StructureType类

public enum StructureType {BRIDGE("桥梁"),TUNNEL("隧道"),CULVERT("涵洞");private final String value;StructureType(String value){this.value = value;}public String value(){return value;}public static StructureType parseType(String type) throws Exception{switch (type){case "桥梁":return StructureType.BRIDGE;case "隧道":return StructureType.TUNNEL;case "涵洞":return StructureType.CULVERT;default:throw new Exception("工程结构结点类型解析失败");}}}
3)修改StructureService 添加create方法
public void create(CreateInDTO param) throws Exception{structureWriter.create(param.toEntity());}
4)为writer添加相应方法
@Component
public class StructureWriter {@Autowiredprivate StructureMapper structureMapper;public boolean create(StructureCreateEntity entity) throws Exception {int insertResult = structureMapper.insert(entity.toStructureDO());if(insertResult != 1)throw new Exception("插入失败!");return true;}public boolean uploadImage(String structureNodeCode,String url) throws Exception {int var = structureMapper.uploadImageUrl(structureNodeCode, url);if(var != 1)throw new Exception("插入失败!");return true;}}
5)修改applivation层里的StructureService
添加方法
public boolean create(CreateInDTO param) throws Exception{boolean var = structureWriter.create(param.toEntity());return var;
}public boolean uploadImage(String structureNodeCode, MultipartFile file) throws Exception{//1.判断文件有效if(file == null)throw new Exception("上传的文件异常");//2.先判断这个结构物存不存在if(structureNodeCode == null || "".equals(structureNodeCode))throw new Exception("输入结构物为空");Structure structure = structureReader.getByNodeCode(structureNodeCode);if(structure == null)throw new Exception("结构物不存在");//3.file上传到文件服务器String url = fileToHost(file);if(url == null || "".equals(url))throw new Exception("文件上传失败");boolean flag = structureWriter.uploadImage(structureNodeCode, url);return flag;
}private String fileToHost(MultipartFile file){System.out.println("文件正在上传到服务器");StringBuilder builder = new StringBuilder();builder.append("image").append(Math.random() * 1000000).append(".png");return builder.toString();}
6)转到adapter里 修改controller 进行测试
2.1.2application层
应用服务层: 编写具体的业务逻辑
event:领域时间驱动,发布器和处理器
DTO:Data Transfer Object
service:具体执行的业务逻辑,不关心数据,只管用

StructureService:structure的业务操作
@Service
public class StructureService {@Autowiredprivate StructureReader structureReader;public StructureOutDTO getByNodeCode(QueryParamInDTO param) throws Exception {if(!param.isValid())return null;Structure structure = structureReader.getByNodeCode(param.getStructureNodeCode());System.out.println(" " + structure);System.out.println("原始经纬度:" + structure.getLatitude() + " " + structure.getLongitude());//开始经纬度偏离业务 模拟switch(param.getIdentify()){case "超级管理员":System.out.println("超级管理员 经纬度:" + structure.getLatitude() + " " + structure.getLongitude());break;case "普通管理员":double random = Math.random();double rate = (random - 0.5) / (double)100;structure.setLatitude(structure.getLatitude() * (1D + rate));structure.setLongitude(structure.getLongitude() * (1D + rate));System.out.println("普通管理员 经纬度:" + structure.getLatitude() + " " + structure.getLongitude());break;case "用户":double random2 = Math.random();double rate2 = ((random2 - 0.5) / (double)100) * 2;structure.setLatitude(structure.getLatitude() * (1D + rate2));structure.setLongitude(structure.getLongitude() * (1D + rate2));System.out.println("用户 经纬度:" + structure.getLatitude() + " " + structure.getLongitude());break;default:break;}StructureOutDTO structureOutDTO = StructureOutDTO.generate(structure, param.getIdentify());return structureOutDTO;}}
QueryParamInDTO:封装查询参数
@Data
public class QueryParamInDTO {private String structureNodeCode;private String identify="用户";public QueryParamInDTO(String structureNodeCode, String identify) {this.structureNodeCode = structureNodeCode;this.identify = identify;}public QueryParamInDTO() {}public boolean isValid(){if(structureNodeCode == null || "".equals(structureNodeCode))return false;if(identify == null || "".equals(identify))return false;return true;}}
StructureOutDTO:封装数据 再次添加额外数据
@Data
public class StructureOutDTO {private String id; // 唯一标识private String code; // 桥梁自定义编码-用于外连接-连接到工程结构树节点中的结构物节点上private String structureCode; // 结构物编码-数据对接专用-TDengine超级表名需要private String structureName; // 结构物名称private double longitude; // 经度private double latitude; // 纬度private String structureType; // 结构物类型-根据数据字典:桥梁、隧道、边坡、涵洞...private String address; // 结构物准确地址描述//额外信息private long sensorCount;//再加额外数据private Date queryTime;private String userIdentify;public static StructureOutDTO generate(Structure structure,String identify){StructureOutDTO structureOutDTO = new StructureOutDTO();BeanUtils.copyProperties(structure, structureOutDTO);structureOutDTO.setUserIdentify(identify);structureOutDTO.setQueryTime(new Date(System.currentTimeMillis()));return structureOutDTO;}}
CreateInDTO:获取数据封装转化为Entity
@Data
public class CreateInDTO {private String code; // 桥梁自定义编码-用于外连接-连接到工程结构树节点中的结构物节点上private String structureCode; // 结构物编码-数据对接专用-TDengine超级表名需要private String structureName; // 结构物名称private String type; // 结构物类型-例如大桥,中桥,小桥private String level; // 结构物级别-例如2类,1类private double longitude; // 经度private double latitude; // 纬度//字符串 ---> enumprivate String structureType; // 结构物类型-根据数据字典:桥梁、隧道、边坡、涵洞...//private String structureImage; // 结构物图片路径private String fileId; // Bimface模型文件IDprivate String address; // 结构物准确地址描述private String structureStyle; // 结构形式,如:150m钢筋混凝土箱型肋拱private String beginYear; // 结构物开始服役年份private String endYear; // 结构物结束服役年份(若有预期的,可填,没有则不填)private String structureDescribe; // 结构物描述private double bimLatitude; // BIM三维地图坐标经度private double bimLongitude; // BIM三维地图坐标纬度private double bimRotation; // BIM三维地图坐标旋转角度系数private double bimHigh; // BIM三维地图坐标高度public StructureCreateEntity toEntity() throws Exception{StructureCreateEntity structureCreateEntity = new StructureCreateEntity();BeanUtils.copyProperties(this, structureCreateEntity);StructureType structureType = StructureType.parseType(this.structureType);if(structureType != null)structureCreateEntity.setStructureType(structureType);return structureCreateEntity;}}
2.1.3adapter层
适配器:适配客户、第三方需求
VO:
controller:接口开放
anticorrosive:防腐层 用于保证这个领域application层的纯洁性

test1:
编写Controller 在网页进行测试
@RestController
@RequestMapping("/structure")
public class StructureController {@Autowiredprivate StructureService structureService;@GetMapping("/query/{structureNodeCode}")public StructureOutDTO query(@PathVariable(value = "structureNodeCode") String structureNodeCode) throws Exception {QueryParamInDTO param = new QueryParamInDTO();param.setStructureNodeCode(structureNodeCode);StructureOutDTO outDTO = structureService.getByNodeCode(param);return outDTO;}}
测试结果:

test2:
修改StructureContorller
测试图片插入
@PostMapping("/create")public boolean create(@RequestBody CreateInDTO param) throws Exception{structureService.create(param);return true;
}@GetMapping("/uploadImage/{structureNodeCode}")public boolean uploadImage(@PathVariable("structureNodeCode") String structureNodeCode) throws Exception{boolean b = structureService.uploadImage(structureNodeCode,null);return b;
}
测试结果
2.2sensor模块
模块结构同structure模块,下面的模块结构也一样,就不再细说了
2.2.1domian层
domain领域层:
结构物基础信息 + 系统工程管理结点信息 + 文档信息 + 安全信息 + 统计信息
把零碎的、分散的基础信息,组建成完整的专业领域
task1:返回封装好的sensor
在reader包下新建entity包,新建Sensor类
Sensor类 = sensorDO + monitorSchemeDO
在Sensor类里添加generateSensor静态方法,返回封装好的Sensor对象
/*** @author: yangkx* @Title: Sensor* @ProjectName: SwjtuPeixun* @Description:* @date: 2023-06-11 10:45*/
//专业名词类
@Data
public class Sensor {private String id = SnowFlakeUtil.nextId().toString();private String sensorId; // 内部使用的,数据对接用的 id//private String monitorSchemeId; // 监测方案 id,与数据字典 - 监测方案挂钩private String monitorSchemeId; //监测方案 唯一 idprivate String monitorTypeName; // 监测类型名private String monitorContentName; // 监测内容名private String type; // 一级分类,结构响应、作用...private String location; // 位置private String sensorInstallCode; // 设备安装代码,一般是按规范指定的传感器idprivate String componentId; // BIM模型上的组件idprivate String sensorType; // 传感器类型,如倾角计private String sensorName; // 传感器名字,有需要再使用private String remark; // 备注public static Sensor generateSensor(SensorDO sensorDO, MonitorSchemeDO monitorSchemeDO){//sensorDO的数据Sensor sensor = new Sensor();sensor.setId(sensorDO.getId());sensor.setSensorId(sensorDO.getSensorId());sensor.setLocation(sensorDO.getLocation());sensor.setSensorInstallCode(sensorDO.getSensorInstallCode());sensor.setComponentId(sensorDO.getComponentId());sensor.setSensorType(sensorDO.getSensorType());sensor.setSensorName(sensorDO.getSensorName());sensor.setRemark(sensorDO.getRemark());//monitorSchemeDO的数据sensor.setMonitorSchemeId(monitorSchemeDO.getId());sensor.setMonitorTypeName(monitorSchemeDO.getMonitorTypeName());sensor.setMonitorContentName(monitorSchemeDO.getMonitorContentName());sensor.setType(monitorSchemeDO.getType());//返回封装好的对象return sensor;}
}
测试专业名词
1)Reader里编写对应方法
@Component
public class SensorReader {@Autowiredprivate SensorMapper sensorMapper;@Autowiredprivate MonitorSchemeMapper monitorSchemeMapper;//获取一座桥下面的所有传感器public List<Sensor> getAllForStructure(String structureNodeCode){LambdaQueryWrapper<SensorDO> lqw = new LambdaQueryWrapper<>();lqw.eq(SensorDO::getCode, structureNodeCode);List<SensorDO> records = sensorMapper.selectList(lqw);List<Sensor> result = new ArrayList<>();for(SensorDO record : records){String monitorSchemeId = record.getMonitorSchemeId();MonitorSchemeDO monitorScheme = monitorSchemeMapper.getById(monitorSchemeId);//专业名词Sensor sensor = Sensor.generateSensor(record, monitorScheme);//System.out.println(" " + sensor);//System.out.println(record);result.add(sensor);}return result;}}
2)test类调用reader里的方法
@Component
public class TestClass {@Autowiredprivate StructureReader structureReader;@Autowiredprivate SensorReader sensorReader;@PostConstructprivate void init(){//structureReader.getAll();sensorReader.getAllForStructure("1609494584646307840");}}
3)运行结果

2.2.2application层
应用服务层: 编写具体的业务逻辑
event:领域时间驱动,发布器和处理器
DTO:Data Transfer Object
service:具体执行的业务逻辑,不关心数据,只管用

@Service
public class SensorService {@Autowiredprivate SensorReader sensorReader;public void getForStructure(String structureNodeCode){List<Sensor> records = sensorReader.getAllForStructure(structureNodeCode);return;}}
2.2.3adapter层
适配器:适配客户、第三方需求
VO:
controller:接口开放
anticorrosive:防腐层 用于保证这个领域application层的纯洁性

相关文章:
西南交通大学智能监测 培训课程练习4
2023.056.07和09培训 项目实战 目录 一、infracore(基础核心层) 1.1database 1.2config 1.3util 二、业务领域模块 2.1structure模块 2.1.1domain层 2.1.2application层 2.1.3adapter层 2.2sensor模块 2.2.1domian层 2.2.2application层 2.2.…...
设备树的引入及简明教程
首先说明,设备树不可能用来写驱动。 设备树只是用来给内核里的驱动程序,指定硬件的信息。比如LED驱动,在内核的驱动程序里去操作寄存器,但是操作哪一个引脚?这由设备树指定。 需要编写设备树文件(dts: device tree s…...
MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件
MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件 1、功能描述 msa311可以识别单击、双击事件,类似手机上的点击返回,双击截屏功能。 单击,双击都能产生中断事件。 中断事件产生后,从对应的状态寄存器读…...
Maven聚合
在实际的开发过程中,我们所接触的项目一般都由多个模块组成。在构建项目时,如果每次都按模块一个一个地进行构建会十分得麻烦,Maven 的聚合功能很好的解决了这个问题。 聚合 使用 Maven 聚合功能对项目进行构建时,需要在该项目中…...
[架构之路-211]- 需求- 软架构前的需求理解:ADMEMS标准化、有序化、结构化、层次化需求矩阵 =》需求框架
目录 前言: 一、什么是ADMES: 首先,需求是分层次的: 其次,需求是有结构的,有维度的 再次,不同层次需求、不同维度需求之间可以相互转化(难点、经验积累) 最终,标准…...
基于前推回代法的连续潮流计算研究【IEEE33节点】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
【双向链表】
双向链表 带头双向循环链表的实现1. 函数的声明2. 函数的实现3. 主函数测试 带头双向循环链表的实现 今天我们来实现一下带头双向循环链表,顾名思义,带头就是有哨兵位,哨兵位不是链表的头,它是连接头节点的一个节点,方…...
POSTGRESQL NEON - Serverless 式的POSTGRESQL 数据库的独特技能 分支数据
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…...
数据分布——长尾分布的处理
前言 长尾分布在分类任务中会提到这个名,这是因为长尾分布这个现象问题会导致在训练过程中会出现出错率高的问题,影响了实验结果。 这里要说的是,长尾分布是一种现象,有的地方说是一种理论或定律,我感觉这样说不太确切࿰…...
集合导题、刷题、考试全套完整流程,专业强大的功能,提高刷题学习效率和企业的培训效率
土著刷题微信小程序v1.15,主要是迭代了考试模块的进阶功能,对考试模块进行了一次升级改造。 由于在v1.15开发期间,收到了违规内容整改的通告,为了遵守相关法律法规,让小程序能够平稳安全地运营下去,我们特此…...
【机器学习】采样方法
文章目录 采样方法11.1 简介11.2 常见采样方法11.2.1 均匀分布采样11.2.2 逆变换采样11.2.3 拒绝采样11.2.4 重要采样11.2.5 Metropolis方法11.2.6 Metropolis-Hasting 算法11.2.7 吉布斯采样 采样方法 11.1 简介 什么是采样 从一个分布中生成一批服从该分布的样本,…...
Seata TCC 模式理论学习、生产级使用示例搭建及注意事项 | Spring Cloud55
一、前言 通过以下系列章节: docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…...
一文详解:Vue3中使用Vue Router
目录 安装和配置Vue Router安装Vue Router配置Vue Router Vue Router的基本概念Vue Router 的配置项介绍routes中的配置项介绍 路由跳转使用 router-link组件使用router.push函数 路由传参动态路由嵌套路由命名路由路由守卫全局路由守卫路由独享守卫 路由懒加载使用import()方式…...
C++开发—远程控制
C开发—远程控制 一,准备二,安装版本控制工具1,安装gitforwindows2,安装乌龟git1,安装乌龟git应用2,安装乌龟git对应的语言包 3,设置Visual Studio的git插件4,创建git项目 三&#x…...
【Python基础】Python数据容器(集合)
文章目录 数据容器:set(集合)集合的定义集合的常用操作-修改(1)添加新元素(2)移除元素(3)从集合中随机取出元素(4)清空集合(5)取出 两个集合的差集(6)消除 两个集合的差集(7)两个集合 合并(8)统计集合元素数量len()(9)集合的遍历 集合的特点 …...
高通 Camera HAL3:集成camxoverridesettings.txt到整机版本
camxoverridesettings.txt 是高通提供给开发者临时进行CAMX、CHI-CDK功能调试的一种方式,通过配置各种变量值然后写入到该文件,能控制Log打印、参数配置、数据dump等多种功能 这个文件需要集成在设备目录的vendor/etc/camera/里 因为camxoverridesetti…...
PHP面试题大全
一 、PHP基础部分 1、PHP语言的一大优势是跨平台,什么是跨平台? PHP的运行环境最优搭配为ApacheMySQLPHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以…...
Linux发送接收邮件
目录 一、实验 1.linux用户发送给linux中的其它用户 2.linux用户发送给外网用户 一、实验 1.linux用户发送给linux中的其它用户 (1)使用命令 yum install -y sendmail 安装sendmail软件 (2)使用yum install -y mailx 安装 mail…...
SpringBoot-【回顾】
第一个SpringBoot程序 自动装配原理 Springboot的自动装配实际上就是为了从Spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给Spring容器来帮我们进行管理 启动器:以starter为标记 EnableAuto…...
Python模拟试卷2023(1)
模拟试卷(1) 一、简答题 (共8题,100分) 1、已知有列表lst[54,36,75,28,50],请完成一下操作: 1、在列表尾部插入元素42 2、在元素28前面插入66 3、删除并输出28 4、将列表按降序排序 5、清空整个列表 lst[54,3…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...


