当前位置: 首页 > 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…...

Delft3D建模、水动力模拟方法及在地表水环境影响评价中的实践技术应用

一&#xff1a;Delft3D软件介绍及建模原理和步骤对常见的地表水数值模型进行介绍&#xff0c;学习Delft3D软件的构成、界面内容&#xff0c;了解地表水数值模型的建模步骤&#xff1a;1.1地表水数值模拟常用软件介绍EFDC_Explorer&#xff08;商业&#xff09; Delft3D&#xf…...

为什么我强烈推荐大学生打CTF!看完你就懂了!

前言 写这个文章是因为我很多粉丝都是学生&#xff0c;经常有人问&#xff1a; 感觉大一第一个学期忙忙碌碌的过去了&#xff0c;啥都会一点&#xff0c;但是自己很难系统的学习到整个知识体系&#xff0c;很迷茫&#xff0c;想知道要如何高效学习。 这篇文章我主要就围绕两点…...

Windows和Office激活终极指南:KMS_VL_ALL_AIO一键解决方案

Windows和Office激活终极指南&#xff1a;KMS_VL_ALL_AIO一键解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows和Office的激活问题烦恼吗&#xff1f;每次重装系统都要重新…...

如何在Java中极速处理百万级Excel数据?FastExcel高性能读写实战指南

如何在Java中极速处理百万级Excel数据&#xff1f;FastExcel高性能读写实战指南 【免费下载链接】fastexcel Generate and read big Excel files quickly 项目地址: https://gitcode.com/gh_mirrors/fas/fastexcel 面对海量Excel数据处理时&#xff0c;你是否曾因内存溢…...

终极免费跨平台方案:draw.io桌面版完美编辑Visio文件

终极免费跨平台方案&#xff1a;draw.io桌面版完美编辑Visio文件 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 还在为不同操作系统间的Visio文件兼容性而烦恼吗&#xff1f;当…...

从一次‘迷路’说起:手把手调试LTE终端TAU失败问题(附Wireshark抓包分析)

从一次‘迷路’说起&#xff1a;手把手调试LTE终端TAU失败问题&#xff08;附Wireshark抓包分析&#xff09; 清晨的地铁站里&#xff0c;一位工程师盯着手机屏幕上反复跳出的"无服务"提示皱起眉头——这已经是本周第三次收到用户投诉在A区到B区的通勤路上出现信号中…...

ETS2LA自动驾驶插件:为《欧洲卡车模拟2》带来智能车道保持与模块化AI驾驶体验

ETS2LA自动驾驶插件&#xff1a;为《欧洲卡车模拟2》带来智能车道保持与模块化AI驾驶体验 【免费下载链接】Euro-Truck-Simulator-2-Lane-Assist Plugin based interface program for ETS2/ATS. 项目地址: https://gitcode.com/gh_mirrors/eur/Euro-Truck-Simulator-2-Lane-A…...

终于有人说清楚经营分析会怎么开了!一篇看懂经营分析会全流程

各位老板有没有想过&#xff0c;为什么你的经营分析会越开越多&#xff1f;有的企业月月开、周周开&#xff0c;甚至恨不得天天开。会一多&#xff0c;人就麻木了&#xff0c;翻来覆去讲同样的数据、追同样的问题&#xff0c;真正该花时间去解决的业务卡点&#xff0c;反而没人…...

收藏!程序员转AI工程师的3条死路+3条真路(内含2026年最新就业方向)

本文揭示了2026年程序员转AI工程师的3条死路和3条真路。死路包括从零学ML训练想做研究员、靠Prompt工程当主修、装AI App做评测自媒体&#xff0c;这些路径因入门方向被误导而难以成功。真路则包括用现有领域跳板转AI应用工程、AI Infra/MLOps方向、AI Agent工程师方向&#xf…...

区块链前端技术栈介绍

这是一份完整区块链前端的学习路径&#xff0c;基于当前市场需求和技术趋势。 &#x1f5fa;️ 技术路线总览 阶段 1&#xff1a;基础入门 (1-2个月) 阶段 2&#xff1a;核心 Web3 技能 (2-3个月) 阶段 3&#xff1a;高级应用开发 (3-4个月) 阶段 4&#xff1a;架构与优化 (2-…...