西南交通大学智能监测 培训课程练习4

news2024/11/17 21:33:52

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 {

    @Autowired
    private SensorMapper sensorMapper;

    @Autowired
    private 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模型文件ID
    private 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 {

    @Autowired
    private 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 {


    @Autowired
    private 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;    // 纬度
    //字符串 ---> enum
    private String structureType;   // 结构物类型-根据数据字典:桥梁、隧道、边坡、涵洞...
    //private String structureImage;    // 结构物图片路径
    private String fileId;     // Bimface模型文件ID
    private 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 {

    @Autowired
    private 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;     //监测方案 唯一 id
    private String monitorTypeName;         // 监测类型名
    private String monitorContentName;      // 监测内容名
    private String type;            // 一级分类,结构响应、作用...

    private String location;            // 位置
    private String sensorInstallCode;           // 设备安装代码,一般是按规范指定的传感器id
    private String componentId;             // BIM模型上的组件id

    private 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 {

    @Autowired
    private SensorMapper sensorMapper;

    @Autowired
    private 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 {

    @Autowired
    private StructureReader structureReader;

    @Autowired
    private SensorReader sensorReader;

    @PostConstruct
    private void init(){
        //structureReader.getAll();
        sensorReader.getAllForStructure("1609494584646307840");
    }

}

 3)运行结果

 

2.2.2application层

应用服务层: 编写具体的业务逻辑

        event:领域时间驱动,发布器和处理器

        DTO:Data Transfer Object

        service:具体执行的业务逻辑,不关心数据,只管用

 

@Service
public class SensorService {

    @Autowired
    private SensorReader sensorReader;

    public void getForStructure(String structureNodeCode){
        List<Sensor> records = sensorReader.getAllForStructure(structureNodeCode);
        return;
    }

}

 

2.2.3adapter层

适配器:适配客户、第三方需求

        VO:

        controller:接口开放

        anticorrosive:防腐层 用于保证这个领域application层的纯洁性

 

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

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

相关文章

一文搞懂什么是Docker

一、什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环境不一定一致&#xff0c;会遇…

Java ~ Reference ~ Finalizer【总结】

前言 文章 相关系列&#xff1a;《Java ~ Reference【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Reference ~ Finalizer【源码】》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;相关系列&#xff1a;《Java ~ Reference ~ Final…

基于Python的接口自动化-Requests模块

目录 引言 一、模块说明 二、Requests模块快速入门 1 发送简单的请求 2 发送带参数的请求 3 定制header头和cookie 4 响应内容 5 发送post请求 6 超时和代理 三、Requests实际应用 引言 在使用Python进行接口自动化测试时&#xff0c;实现接口请求…

2023春期末考试选择题R2-9AVL树插入调整详解

题目&#xff1a; 将 8, 9, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的&#xff1f; A. 4 和 6 是兄弟 B. 5 是 8 的父结点 C. 7 是根结点 D. 3 和 8 是兄弟 解题要点&#xff1a; 需要对AVL树的4种旋转方式熟悉。 AVL旋转过程&#xff1a; 根据…

体验ChatGPT使用

ChatGPT是一种基于GPT&#xff08;Generative Pre-train Transformer&#xff09;模型的大型语言模型&#xff0c;由OpenAI公司开发。 交互时&#xff0c;有一定的技巧&#xff0c;可以快速准确的反馈正确答案。 一、开发贪吃蛇游戏 浏览器访问&#xff1a;https://chat.opena…

taro使用小记 —— 持续更新

目录 1、在 taro 中使用 axios2、在 taro 中添加全局组件自动引入和方法自动引入3、在 taro 中使用 pinia 1、在 taro 中使用 axios taro 3.6 版本已经支持了网络请求库。 需安装插件 tarojs/plugin-http 使用和注意事项说明&#xff1a; https://www.npmjs.com/package/taroj…

【笔试强训选择题】Day22.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言 一、…

mac电脑m1搭建java开发环境参考手册

1 背景介绍 开发人员经常会换电脑&#xff0c;或者换新电脑&#xff0c;意味着重新搭建开发环境&#xff0c;很麻烦。但新电脑到手里面了&#xff0c;不换又不好&#xff0c;此篇专门用来记录mac电脑m1搭建java开发环境的步骤。希望对读者有所帮助&#xff0c;一条龙服务。 后…

初探 transformer

大部分QA的问题都可以使用seq2seq来实现。或者说大多数的NLP问题都可以使用seq2seq模型来解决。 但是呢最好的办法还是对具体的问题作出特定的模型训练。 概述 Transformer就是一种seq2seq模型。 我们先看一下seq2seq这个模型的大体框架(其实就是一个编码器和一个解码器)&a…

OpenGL 光照贴图

1.简介 现实世界中的物体通常并不只包含有一种材质&#xff0c;而是由多种材质所组成。想想一辆汽车&#xff1a;它的外壳非常有光泽&#xff0c;车窗会部分反射周围的环境&#xff0c;轮胎不会那么有光泽&#xff0c;所以它没有镜面高光&#xff0c;轮毂非常闪亮。 2.漫反射…

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步(C#)

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和触发同步的技术背景Baumer工业相机使用BGAPISDK进行双相机主从相机触发1.引用合适的类文件2.使用BGAPISDK设置主相机硬件触发从相机…

ReentrantLock 底层原理

目录 一、ReentrantLock入门 二、AQS原理 1、AQS介绍 2、自定义锁 三、ReentrantLock实现原理 1、非公平锁的实现 加锁流程 释放锁流程 2、可重入原理 3、可打断原理 4、公平锁原理 5、条件变量原理 await流程 signal流程 一、ReentrantLock入门 相对于synchron…

对测试外包的一些粗略看法

什么叫外包&#xff0c;外包最直接理解就是让别人做事&#xff1b;外包其中一项目的就是降低企业经营成本。 从外包的含义和目的来看&#xff0c;就是我们帮人做事、听人指挥&#xff0c;当企业经济不好的时候&#xff0c;我们就成为了降低成本的最佳方案。说这些是让大家比较…

高并发编程:线程池

一、概述 线程池首先有几个接口先了解第一个是Executor&#xff0c;第二个是ExecutorService&#xff0c;在后面才是线程池的一个使用ThreadPoolExecutor。 二、Executor Executor看它的名字也能理解&#xff0c;执行者&#xff0c;所以他有一个方法叫执行&#xff0c;那么执…

JVM原理:JVM垃圾回收算法(通俗易懂)

目录 前言正文垃圾标记算法引用类型强引用软引用弱引用虚引用 引用计数法循环引用问题 根可达性分析法虚拟机栈&#xff08;栈帧的局部变量表&#xff09;中的引用方法区中类静态属性引用方法区中常量引用本地方法栈&#xff08;Native方法&#xff09;引用 垃圾回收算法标记清…

Java语法进阶及常用技术(八)--线程池

初识线程池 什么是“池” ---- 软件中的“池”&#xff0c;可以理解为计划经济。 我们的资源是有限的&#xff0c;比如只有十个线程&#xff0c;我们创造十个线程的线程池&#xff0c;可能我们的任务非常多&#xff0c;如1000个任务&#xff0c;我们就把1000个任务放到我们十个…

shell脚本学习记录(流程控制)

前言&#xff1a; 在shell脚本中&#xff0c;()、{}、[]都是用来表示命令或者变量的范围或者属性。它们的具体区别如下&#xff1a; ()&#xff1a;表示命令在子shell中运行。括号中的命令会在一个子shell中运行&#xff0c;并且该子shell拥符有自己的环境变量和文件描述&#…

【youcans动手学模型】DenseNet 模型-CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】DenseNet 模型-CIFAR10图像分类 1. DenseNet 神经网络模型1.1 模型简介1.2 论文介绍1.3 改进方法与后续工作1.4 分析与讨论 2. 在 PyTorch 中定义 DenseNet 模型类2.1 DenseBlo…

性能测试实战——登录接口的性能测试(超详细总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在实际业务场景中…