该博客主要针对工程实践项目的软件系统设计方案做一个简要的总结。包括总结软件结构特点(比如设计模式,架构风格),并通过不同视图来描述软件系统的概念原型。
为什么需要软件系统设计?因为随着软件的发展,其复杂度前所未有,同时软件还具有易变性这一特征。众所周知,一个合格的软件项目至少要有稳健性,易用性,可维护性等特点。在着手实现软件之前,对其进行高屋建瓴的设计,更有助于我们开发合格的软件。如果想要描述软件系统的特征,可以通过软件架构风格以及设计模式。 架构和模式应该是一个属于相互涵盖的过程,架构更加注重高层的设计。一个设计模式提供一种提炼子系统或软件系统中的组件的,或者它们之间的关系的纲要设计。
常见的项目的架构风格有以下几种:三层架构、MVC、MVVM、管道-过滤器、客户-服务、P2P、发布-订阅等。
因为本项目中用户是通过浏览器进行一系列操作,所以采取的架构风格为客户——服务类型,更准确的说是Browser/Server类型。B/S架构是在WEB兴起后的一种网络架构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。
另外前后端分离是当前最流行的方案,所以本项目也会采取MVC架构。
由于本项目的使用者为多级用户,在创建不同用户的时候,可以采用工厂模式,定义一个用于创建用户的接口,由子类决定创建什么级别的用户。另外,用户对于设备的操作,可以通过外观模式来简化使用。
由于本项目设计多级用户,因此针对不同级别的用户,其操作各有不同,因此很难使用某种通用方式对其进行操作,有必要进行分类。用户的级别共有6种,第一级别的用户为最高权限用户,是设备生产商,级别2--4的用户虽然级别不同,但其所有的功能和操作几乎一致,可以归为一类。级别5的用户是真正使用设备的用户,需要单独归为一类,其下属(级别为6的值班员)也需要归为一类,专门执行设备监控和向上报告的任务。
执行视图——5级用户(工厂管理员)监视、激活设备
执行视图——上级用户创建下级用户并分配设备+查看下级用户以及属于其的设备
由于采用MVC的架构模式,因此需要前后端分离,以上为后端的控制器(Controller),以及模型(Model)
以下为Controller目录展开:
以下为Model展开:
1.后端:Springboot
2.前端:vue.js、ElementUI、echarts
3.数据库:MySQL;高并发处理:redis
4.服务器:前端:Nginx;后端:docker 、centos、tomcat
理由:因为采用前后端分离的分离的思想,前端和后端的开发可以各自进行。由于Nginx非常适合静态资源的处理,所以前端服务器程序采用Nginx。Spring Boot 的优点快速开发,特别适合构建微服务系统,另外给我们封装了各种经常使用的套件,比如mybatis、hibernate、redis、mongodb等。采用docker是为了保证程序的可移植性,“一次构建,多次部署“。为实现数据持久化,采用MySQL。由于本项目主要用于设备运行状态展示和控制设备,因此不可避免地会遇到诸如高并发的问题,拟采用redis来做缓存。
鉴于实际使用时,数量较多的设备(执行器)会同时向webserver传输自身的状态信息,为了减轻服务器压力,webserver主要的工作是进行redis缓存,同时响应前端对于设备(执行器)状态数据的请求。每隔一段时间,将目前已有的缓存数据存入database服务器中。如果用户需要查看一段时间之前的设备状态信息,webserver可以从database server中读取。
通过以上的分析,可以得出以下几张主要数据表。其中设备分为网关和执行器两种。
实际应用中,每一条用户链,所包含的用户层数可能未必一致。
而数据表中的6种用户角色,实际对应的是6种用户等级(可以把值班员等级看做6),
实际的用户链可能有以下几种:
1.设备生产商->代理商->分销商->大集团->工厂管理->值班员(1->2->3->4->5>6)
2.设备生产商->代理商->分销商->工厂管理->值班员(1->2->4->5->6)
3.设备生产商->大集团->工厂管理->值班员(1->4->5->6)
4.设备生产商->工厂管理->值班员(1->5->6)
字段名 | 类型 | 备注 |
id | int | 数据表id,唯一,主键 |
username | varchar | 用户登录名 |
password | varchar | 用户登录密码 |
type | tinyint | 用户类型 |
nickname | varchar | 用户资料名称 |
address | varchar | 用户所在地址 |
create_time | timestamp | 用户创建时间 |
login_time | timestamp | 用户登录时间 |
parent_id | int | 创建该用户的上级用户的id |
.......... | ........ | .............. |
由于设备在实际使用前,会经过多级用户的手中,因此需要增加相应字段
字段名 | 类型 | 备注 |
id | int | 数据表id |
device_label | varchar | 设备自身标识 |
nickname | varchar | 设备名称,五级用户添加 |
discription | varchar | 对执行器特性的描述 |
add_time | timestamp | 生产商添加设备的时间 |
status | tinyint | 未分配/异常/已分配/在使用 |
ownbyUser2 | bit | 是否分配给了二级用户 |
user2_id | int | 二级用户的id |
ownbyUser3 | bit | 是否分配给了三级用户 |
user3_id | int | 三级用户的id |
ownbyUser4 | bit | 是否分配给了四级用户 |
user4_id | int | 四级用户的id |
ownbyUser5 | bit | 是否分配给了五级用户 |
user5_id | int | 五级用户idw |
switch_id | int | 执行器连接的网关的id |
link_port | int | 执行器连接的网关的端口 |
字段名 | 类型 | 备注 |
id | int | 数据表id |
device_label | varchar | 设备自身标识 |
add_time | timestamp | 生产商添加设备的时间 |
mac_addr | txt | 网关自身的mac地址 |
status | tinyint | 未分配/异常/已分配/在使用 |
ownbyUser2 | bit | 是否分配给了二级用户 |
user2_id | int | 二级用户的id |
ownbyUser3 | bit | 是否分配给了三级用户 |
user3_id | int | 三级用户的id |
ownbyUser4 | bit | 是否分配给了四级用户 |
user4_id | int | 四级用户的id |
ownbyUser5 | bit | 是否分配给了五级用户 |
user5_id | int | 五级用户id |
与执行器绑定的传感器,会将不同类型的执行器状态参数打包,从网关传到云端服务器,云端服务器可以存储执行器状态参数包,也可以通过解析数据包,向五级用户或者值班员展示设备状态。
字段名 | 类型 | 备注 |
id | int | 数据表id |
data | text | 传感器发送的数据 |
device_id | int | 执行器的id |
add_time | timestamp | 数据发送时间 |
本项目主要功能为后台管理功能,涉及多级别用户,因此不同级别的用户对应不同级别的操作。
用户如果想获得登录用的账号密码,只能让上级用户为其创建,其中拥有最高权限的用户为1级用户,也就是设备生产商。
用户使用账号密码登录成功后,就可以执行位于自己权限范围内的操作。对于每一级的用户,主要操作有两方面—————设备管理和下级用户管理(除第6级用户值班员外)。其中只有1级用户有权力往设备数据库中添加或者删除设备,并且可以创建任意级别的用户(但一般只会创建分销商或者总代理)。对于分销商,总代理或者企业大集团,其设备管理主要涉及设备的分配以及销售,并不涉及设备的使用。设备真正投入使用,由5级用户(工厂管理员)执行,5级用户为了方便对设备运行状况的监视,会创建值班员(6级用户)代为监视。值班员登录成功后负责监视每台设备的实时运行状况,如果发现异常状况,则将有问题设备向工厂管理员汇报,工厂管理员对异常情况进行处理。
用户的以上操作,都是基于浏览器界面,因此web服务器的工作主要有以下几项:1.返回前端页面等静态资源;2.设备附带的传感器会每隔一段时间通过连接的网关传输数据,因此服务器需要存储这些数据;3.对于前端想要查看设备实时状态的请求,web服务器需要找到对应时间段的设备状态数据,并对原生数据进行解析,并返回给前端;4.工厂管理员可能会在前端对设备执行某些操作(比如开/关),web服务器需要生成命令,并通过设备连接的网关,向设备下达命令。
以上就是大概的软件设计方案,但未必能覆盖到方方面面,在实际动手实施时仍需要根据实际状况进行改动,谢谢阅读。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删