当前位置: 首页 > news >正文

西南交通大学智能监测 培训课程练习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&#xff08;基础核心层&#xff09; 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.…...

设备树的引入及简明教程

首先说明&#xff0c;设备树不可能用来写驱动。 设备树只是用来给内核里的驱动程序&#xff0c;指定硬件的信息。比如LED驱动&#xff0c;在内核的驱动程序里去操作寄存器&#xff0c;但是操作哪一个引脚&#xff1f;这由设备树指定。 需要编写设备树文件(dts: device tree s…...

MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件

MM32F3273G8P火龙果开发板MindSDK开发教程12 -获取msa311加速器的敲击事件 1、功能描述 msa311可以识别单击、双击事件&#xff0c;类似手机上的点击返回&#xff0c;双击截屏功能。 单击&#xff0c;双击都能产生中断事件。 中断事件产生后&#xff0c;从对应的状态寄存器读…...

Maven聚合

在实际的开发过程中&#xff0c;我们所接触的项目一般都由多个模块组成。在构建项目时&#xff0c;如果每次都按模块一个一个地进行构建会十分得麻烦&#xff0c;Maven 的聚合功能很好的解决了这个问题。 聚合 使用 Maven 聚合功能对项目进行构建时&#xff0c;需要在该项目中…...

[架构之路-211]- 需求- 软架构前的需求理解:ADMEMS标准化、有序化、结构化、层次化需求矩阵 =》需求框架

目录 前言&#xff1a; 一、什么是ADMES: 首先&#xff0c;需求是分层次的&#xff1a; 其次&#xff0c;需求是有结构的&#xff0c;有维度的 再次&#xff0c;不同层次需求、不同维度需求之间可以相互转化&#xff08;难点、经验积累&#xff09; 最终&#xff0c;标准…...

基于前推回代法的连续潮流计算研究【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【双向链表】

双向链表 带头双向循环链表的实现1. 函数的声明2. 函数的实现3. 主函数测试 带头双向循环链表的实现 今天我们来实现一下带头双向循环链表&#xff0c;顾名思义&#xff0c;带头就是有哨兵位&#xff0c;哨兵位不是链表的头&#xff0c;它是连接头节点的一个节点&#xff0c;方…...

POSTGRESQL NEON - Serverless 式的POSTGRESQL 数据库的独特技能 分支数据

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…...

数据分布——长尾分布的处理

前言 长尾分布在分类任务中会提到这个名,这是因为长尾分布这个现象问题会导致在训练过程中会出现出错率高的问题&#xff0c;影响了实验结果。 这里要说的是&#xff0c;长尾分布是一种现象&#xff0c;有的地方说是一种理论或定律&#xff0c;我感觉这样说不太确切&#xff0…...

集合导题、刷题、考试全套完整流程,专业强大的功能,提高刷题学习效率和企业的培训效率

土著刷题微信小程序v1.15&#xff0c;主要是迭代了考试模块的进阶功能&#xff0c;对考试模块进行了一次升级改造。 由于在v1.15开发期间&#xff0c;收到了违规内容整改的通告&#xff0c;为了遵守相关法律法规&#xff0c;让小程序能够平稳安全地运营下去&#xff0c;我们特此…...

【机器学习】采样方法

文章目录 采样方法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 简介 什么是采样 从一个分布中生成一批服从该分布的样本&#xff0c…...

Seata TCC 模式理论学习、生产级使用示例搭建及注意事项 | Spring Cloud55

一、前言 通过以下系列章节&#xff1a; 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开发—远程控制 一&#xff0c;准备二&#xff0c;安装版本控制工具1&#xff0c;安装gitforwindows2&#xff0c;安装乌龟git1&#xff0c;安装乌龟git应用2&#xff0c;安装乌龟git对应的语言包 3&#xff0c;设置Visual Studio的git插件4&#xff0c;创建git项目 三&#x…...

【Python基础】Python数据容器(集合)

文章目录 数据容器&#xff1a;set&#xff08;集合&#xff09;集合的定义集合的常用操作-修改(1)添加新元素(2)移除元素(3)从集合中随机取出元素(4)清空集合(5)取出 两个集合的差集(6)消除 两个集合的差集(7)两个集合 合并(8)统计集合元素数量len()(9)集合的遍历 集合的特点 …...

高通 Camera HAL3:集成camxoverridesettings.txt到整机版本

camxoverridesettings.txt 是高通提供给开发者临时进行CAMX、CHI-CDK功能调试的一种方式&#xff0c;通过配置各种变量值然后写入到该文件&#xff0c;能控制Log打印、参数配置、数据dump等多种功能 这个文件需要集成在设备目录的vendor/etc/camera/里 因为camxoverridesetti…...

PHP面试题大全

一 、PHP基础部分 1、PHP语言的一大优势是跨平台&#xff0c;什么是跨平台&#xff1f; PHP的运行环境最优搭配为ApacheMySQLPHP&#xff0c;此运行环境可以在不同操作系统&#xff08;例如windows、Linux等&#xff09;上配置&#xff0c;不受操作系统的限制&#xff0c;所以…...

Linux发送接收邮件

目录 一、实验 1.linux用户发送给linux中的其它用户 2.linux用户发送给外网用户 一、实验 1.linux用户发送给linux中的其它用户 &#xff08;1&#xff09;使用命令 yum install -y sendmail 安装sendmail软件 &#xff08;2&#xff09;使用yum install -y mailx 安装 mail…...

SpringBoot-【回顾】

第一个SpringBoot程序 自动装配原理 Springboot的自动装配实际上就是为了从Spring.factories文件中获取到对应的需要进行自动装配的类&#xff0c;并生成相应的Bean对象&#xff0c;然后将它们交给Spring容器来帮我们进行管理 启动器&#xff1a;以starter为标记 EnableAuto…...

Python模拟试卷2023(1)

模拟试卷(1) 一、简答题 &#xff08;共8题&#xff0c;100分&#xff09; 1、已知有列表lst[54,36,75,28,50]&#xff0c;请完成一下操作&#xff1a; 1、在列表尾部插入元素42 2、在元素28前面插入66 3、删除并输出28 4、将列表按降序排序 5、清空整个列表 lst[54,3…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...