6.7-6.9-培训

这次的培训将上次的一些抽象概念具化了,实操后看似有些理解了。但是自己闭眼再去回想整个流程,还是有着大大的疑惑,这些疑惑一方面来自与编程语言的不熟练,也来自对项目业务的不了解等等。

1.inforance(基础核心层)

1.1.config

config,配置包。例如web-interceptor

ed45798de85a4ed485cb574270be1771.png

1.2.database

database是面向数据库层面的。其中-DO是数据库容器,与数据库一一对应。

-Mapper是Mybatis或Plus操作数据库的SQL。MapperHelper:面向数据库层面的缓存服务类。MapperEnum字段枚举类:比如说,User表有一个identify字段,他只有三种值(管理员、用户、客服)

81639846a1b44b398354144d1bff7783.png

其中用到了新的注解@Data,@ToString去替代往常的getset和tostring方法。

df505c943d8e4b35aaf5e94b9f927f9e.png

枚举类:一种数据存放方式,针对一些数据类型,枚举类有时候会起到比较重要的作用

 

public enum StructureType {



    BRIDGE("桥梁"), TUNNEL("隧道"), CULVERT("涵洞");

    public final String value;


    StructureType(String value) {
        this.value = value;
    }

    public String getValue() { return value; }

    public static StructureType parseType(String type) throws Exception {
        switch (type){
            case "桥梁":
            case "大桥":
                return StructureType.BRIDGE;
            case "隧道":
                return StructureType.TUNNEL;
            case "涵洞":
                return StructureType.CULVERT;
            default:
                throw new Exception("工程结构节点类型解析失败");
        }
    }
}

1.3.util

util是各种通用工具类的包,这次使用到了SnowFlakeUtil,不重复的随机数生成器。

2.Structure

以structure去描述其他结构

6433383fb3864cd0aafa4d81bfd3bac5.png

2.1.adapter

2.1.1.adapter-anticorrosive

防腐层保证application的功能性。

2.1.2.adapter-controller:接口开放

@RestController
@RequestMapping("/structure")
public class StructureController {

    @Autowired
    private StructureService structureService;

    @GetMapping("/queryStructure/{structureNodeCode}")
    public StructureOutDTO queryStructure(@PathVariable(value = "structureNodeCode") String structureNodeCode){
        QueryParamInDTO queryParamInDTO = new QueryParamInDTO();

        queryParamInDTO.setStructureNodeCode(structureNodeCode);

        StructureOutDTO outDto = structureService.getByNodeCode(queryParamInDTO);

        return outDto;
    }

2.2.application

2.2.1.application-service-dto-InDTO

用来处理用户的输入,同时可以对这些输入参数进行一些方法处理

@Data
//param:参数
public class QueryParamInDTO {
    private String structureNodeCode = "1609494750145155072";
    private String role = "普通管理员";
    private String color = "红色";

    public boolean isValid(){
        if(structureNodeCode == null || structureNodeCode.equals(""))
            return false;
        if(role == null || role.equals(""))
            return false;
        return true;
    }
}

2.2.2.application-service-dto-OutDTO

用于处理一些返回结果集,这些结果集是通过接口发送给前端的结果,可以根据具体需求自由设计。

@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 role;
    private String color;

    public static StructureOutDTO generate(Structure structure,String role,String color){
        StructureOutDTO outDto = new StructureOutDTO();
       
         //这个方法相当于set操作
        BeanUtils.copyProperties(structure,outDto);

        outDto.setQueryTime(new Date(System.currentTimeMillis()));
        outDto.setRole(role);
        outDto.setColor(color);
        return outDto;
    }

public static StructureOutDTO generate(Structure structure,String role,String color){

        *****

}

在Java中,static关键字可以用来修饰类的成员变量、方法和代码块,它的作用是将这些成员标记为静态的,即与类相关而不是与类的实例相关。使用static关键字可以在不创建类的实例的情况下访问类的成员变量和方法。

2.2.3application-service-StructureService

用于处理具体的业务需求,比如根据一些系统用户的身份去赋予相对应的权限。

 public StructureOutDTO getByNodeCode(QueryParamInDTO param){
        if(!param.isValid()){
            throw new Exception("输入的结构物code不能为空");
        }

        Structure structure = structureReader.getByNodeCode(param.getStructureNodeCode());
        System.out.println(" 原始经纬度 - 经度" + structure.getLatitude() + "纬度:" + structure.getLongitude());

2.3.domain

domain领域层,把零碎的、分散的基础信息,组建成完整的专业领域会定义一些本专业的专业名词,最为核心的地方。

2.3.1.domain-reader

做所有的数据库读操作,组织各个数据表的数据结构,封装成专业名词:参数校验、分页、数据封装、无效数据剔除。最终才能输出我们想要的领域专业类。

 //根据输入的NodeCode查询相应的结构物信息
    public Structure getByNodeCode(String structureNodeCode){
        LambdaQueryWrapper<StructureDO> lqw = new LambdaQueryWrapper<>();
        lqw.eq(StructureDO::getCode,structureNodeCode);
        StructureDO record = structureMapper.selectOne(lqw);

        //获取传感器数量
        LambdaQueryWrapper<SensorDO> lqw1 = new LambdaQueryWrapper<>();
        lqw1.eq(SensorDO::getCode,structureNodeCode);
        Long sensorCount = sensorMapper.selectCount(lqw1);

        Structure structure = Structure.generateStructure(record,sensorCount);
        return structure;

    }

2.3.1.domain-reader-entity

根据业务需要,去根据-DO类整合数据项,封装成专业名词

@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;

//返回的是Structure类型
    public static Structure generateStructure(StructureDO structureDO,long sensorCount){
        Structure structure = new Structure();

        //简化了Sensor中的set操作
        BeanUtils.copyProperties(structureDO,structure);
        structure.setSensorCount(sensorCount);
        return structure;
    }

2.3.2.domain-writer

        domain-writer:参考reader,做所有的增删改操作.和reader超级像,但是本质不一样,writer做的是对数据库中数据的变动,而reader是对数据库中数据的的读取。

        此处不粘贴代码,没啥子意义。

小结-1

        在面对一个崭新的项目,有了其数据库结构后。操作流程大抵是,首先处理inforance,去处理相应的DO,Mapper,将数据拿过来。然后处理domain层,做好数据专有名词的设计。接着去application层,做输入输出和业务需求,最后去到adapter层去开放接口。

        在整个实操中,感觉自己并不能很熟练的使用那些已经写好的类或者接口,还有那些数据的处理,一些List或者foreach等等这些编程语法也有些困扰。这些数据集往往都是存放在数组中的,比如下面的通过add去收集数据。

      List<Sensor> result = new ArrayList<>();//收集数据-1
        for (SensorDO record : records) {
            //去获取一条数据的MonitorSchemeId
            String monitorSchemeId = record.getMonitorSchemeId();

            //根据MonitorSchemeId去查询monitorScheme的数据集
            MonitorSchemeDO monitorScheme= monitorSchemeMapper.getById(monitorSchemeId);

            Sensor sensor = Sensor.generateSensor(record, monitorScheme);

//            System.out.println(" 打印结果" + sensor);
            result.add(sensor);//收集数据-2
        }
        return result;//返回收集数据-3
    }

作业(开放了三个接口,新增了输入项color,role用来做接口的识别)

a126543b8b274399a999825994905be9.png

小结-2

        这次的学习相比于上次少了很多疑问,对于各种层级关系有了理解,当自己去实现某种功能时候,大概知道去那个包中读取数据了,也明确了reader,writer,DTO中的一些方法的含义和作用。但是对于一些语法,一些函数运用还是比较生疏,以及一些业务逻辑不是很明确,这一点体现在service层,对于这一层感觉有些不明确。对于整个课程所讲内容,感觉需要不断地去重复,去理解。

作业-2

基于t_zs_monitoring_program_manage表去设计了插入操作,通过-mapper去设计插入sql语言,writer去执行插入操作,CreateEntity去保存writer中的插入数据集。service去执行业务逻辑,DTO设计了用户输入数据,controller去开放接口,通过post请求返回数据实现数据的插入

3c4c86d4085a4538a1f29664e19bb223.png 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值