实验室安全巡检项目的收获
首先简单介绍一下该项目:通过该系统学校的实验室人员、二级单位管理员和分管安全领导以及学校管理人员可以对实验室日查、单位检查和月报、学校巡查和专项检查发现的隐患问题实行排查、登记、报告、整改和验收的闭环管理,是学校实现实验室安全管理的基础平台。
由于这个项目是独立自主接手的项目,所以在很多细节和难点的处理上只能靠自己去解决了,这里就记录一下自己的一些收获和解决问题的思路和办法以便自己以后查看,同时通过对代码和解决思路的review以达到提升自己的目的。
-
实验室安全自查模块
在这个模块里主要是遇到了几个问题:
1.运用Date生成时间,前后端可能都会向对方传输一个时间,但是这两个时间的展示却总是不如人意,这个时候就需要借助两个注解:
注解@JsonFormat主要是后台到前台的时间格式的转换
注解@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)主要是将把需要往数据库里写入的Date类型的数据格式化一下,这里有一个奇怪的地方我先记录一下,那就是SpringBoot+Mybatis的项目好像可以直接把Date类型的数据直接以varchar类型存储,但是与以Datetime类型存储相比较来说,varchar类型存储会出现以下的效果:(会多出来一段数据,以DateTime类型的数据存储好像格式化的注解才会其效果)
2021-01-07 21:57:14.109
2021-01-08 15:44:03
2.存储到数据库的时间与自己电脑的时间总是差了接近8h
其实这个错误一出现,就很容易想到出错的地方,首先数据能够存储到数据库中说明代码的实现应该是没有太大的问题的,那么我们在哪里的设置能够影响时间喃?时区!!我们其实设置过几个时区,首先就是@JsonFormat 默认的时区是Greenwich Time, 默认的是格林威治时间,这与我们的北京时间不一样, @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”),这样就行,其次是我们项目与数据库设置连接的资源文件里可能设置过这个serverTimezone=Asia/Shanghai,只要保持一致,时间上基本不会出现差几个小时的情况
3.在实验室日查的模块里,如果实验室存在安全隐患,那么就需要不同权限级别的人都填写和审阅同一条记录的不同字段,那么如何确定现在这些字段,该哪一个权限级别的人填写,或者说这条记录的填写进入到哪一个阶段了?那么就需要我们在已经提供的基础表格的字段上加上一些字段了,这里需要加上一个Stage阶段,确定填写到哪一个阶段了,这个字段方便了我们对填写相应字段的人的权限的确定和限定。简单来说就是这个记录现在该谁(权限级别)填写就能确定了。
4.复杂业务根据实际使用的合理分解
在需求说明里只是说明有隐患的记录需要一层层的审核和填写相应的信息,那么这个填写的业务似乎过于庞杂,例如基本的填写的实现,根据使用者的权限和所属部门的不同可以查看不同的隐患信息,需要检验和实现的功能如果写在一方法里似乎太“乱”了,根据实际的使用经验我们可以将其分解为两个具体的方法实现:待审核和编辑填写两部分,在待审核里可以将原来与用户信息相关的检验全部进行检验,而在填写编辑里面只管填写的数据是否有效的检验,和实现填写的基本功能就行。将用户提出的一个复杂的小的功能需求进行相应的合理的拆分往往会使实现更加简单,同时会使得代码更加简洁明了,逻辑更加清晰可读性更强。
5.list的add方法的使用,dayChecks.addAll(list),可以将两个存储相同类型的对象数据的list列表合并成一个。 -
信息传递模块
在这个模块里其实最难处理的不是这个模块本身,而是在将有安全隐患的记录向上一权限的相应的人员传递的实现上,我们开始想的是能不能将整个记录传递个下一个人,其实就是将这样一个对象数据直接传递,但是我们知道这样的想法直接映射到信息传递模块上来相当于就是就一个对象数据直接变成信息传递这个pojo里的一个字段并且将这个对象直接存储到数据库的一个字段里。那么这样简单粗暴的想法之后就有一个最大的底层问题无法解决,那就是在Mysql里一个对象类型的数据无法存到一条记录的某一个字段里去,因为数据库里每个字段可选的类型是固定有限的而且没有对象这种类型,那么怎么解决?首先当然是去Github上去看看,但是遗憾的是可能是由于我的搜索能力还不行,并没有找到让我满意的结果。那就只能自己想办法解决了,首先信息传递模块自然是不能改,里面的信心内容字段还是采用String类型,因为大多数的信息传递还是一两句话的事儿。我最后想到了一个办法(当然我不知道大佬们是怎么实现的,如果能够留言告诉我就好了),就是将所有的需要传递对象信息的模块一个特殊字符统一分开(比如A,B等),然后再加上相应需要传递的对象的信息在数据库里存储的ID构成一个特殊的字段将它加入到信息传递的pojo里面去。我们从前端页面来一次捋一捋这个实现过程,我的设想是如果需要传递对象信息那么也还是需要发送一条文字信息只不过点击这条文字信息能够进行相应的跳转到相应对象信息,在点击的时候将这个信息pojo的特意设置的字段作为参数响应给我专门添加的一个信息分发的Controller,拿到参数后以事先设计好的分割方式将这个字符串分割开来,根据不同的特殊字符将ID传参给不同的通过ID查询对象信息的服务,然后返回我们理论上想传送的对象。这样也间接的实现了传递的信息是一个对象的信息的目的