目  录

第1章 绪论

1.1研究背景与意义

1.2研究内容

1.3论文组成结构

第2章 开发工具及相关技术介绍

2.1 J2EE技术

2.2 MVVM模式

2.3 MySQL数据库

2.4 B/S结构

2.5 JavaScript 运行模式:

2.6 Spring boot框架

第3章 系统分析

3.1可行性分析

3.1.1 经济可行性

3.1.2 技术可行性

3.1.3 操作可行性

3.2性能分析

3.3系统操作流程

3.3.1用户登录流程

3.3.2信息添加流程

第4章 系统设计

4.1系统架构设计

4.2开发流程设计

4.3数据库设计

4.3.2数据表

3.2 表access_application (出入申请)

3.3 表access_token (登陆访问时长)

3.4 表article (文章:用于内容管理系统的文章)

3.5 表article_type (文章分类)

3.6 表auth (用户权限管理)

3.7 表clock_in_every_day (每日打卡)

3.8 表collect (收藏)

3.9 表comment (评论)

3.10 表community_epidemic (社区疫情)

3.11 表community_residents (社区居民)

3.12 表daily_nucleic_acid (每日核酸)

3.13 表hits (用户点击)

3.14 表isolation_application (隔离申请)

3.15 表material_classification (物资分类)

3.16 表material_information (物资信息)

3.17 表material_purchase (物资购买)

3.18 表notice (公告)

3.19 表praise (点赞)

3.20 表slides (轮播图)

3.21 表upload (文件上传)

3.22 表user (用户账户:用于保存用户登录信息)

3.23 表user_group (用户组:用于用户前端身份和鉴权)

第5章 系统实现

5.1用户前台功能模块

5.2管理员功能模块

第6章 系统测试

6.1测试目的

6.2测试方案设计

6.2.1 测试策略

6.3 测试结果

第7章 总结与展望

参考文献

致谢

  1. 绪论

1.1研究背景与意义

随着互联网不断升温,用户的需求也越来越大,为此设计疫情防控平台可以方便用户随时获取到疫情防控管理信息,通过这一软件来满足用户的要求,并且使用疫情防控平台可以更快捷、更高效的提高疫情防控管理的工作效率,是一款必不可少的管理系统。

开发疫情防控平台进行疫情信息的管理,就要运用软件工程的方法来解决这个软件开发中遇到的各个问题。

系统管理也都将通过计算机进行整体智能化操作,对于疫情防控平台所牵扯的信息管理及数据保存都是非常多的,举例像所有的管理员:健康信息上报、行程信息上报、在线举报、在线留言、用户状态信息、上报信息情况、疫情数据、疫情新闻等等,这给管理者的工作带来了巨大的挑战,所以为此开发了本疫情防控平台,为用户提供疫情防控平台,方便管理员及时高效的管理所有的信息,给用户提供简单方便快捷的方式,并且数据准确,用户可以足不出户就可以对疫情防控平台相关信息进行查询各上报信息等操作,而且还能节省用户查询信息的等待时间,所以开发疫情防控平台给工作人员带来很大的方便,可以大大的提高系统人员工作效率。

1.2研究内容

疫情防控平台的开发及实现,所需要的工作内容:

(1)首先是确定选题,确定好所要做的系统,并对系统的背景及现在面临的一些问题等进行系统的初步确认。

(2)系统确认完成后,结合系统开发的需求进行确认系统开发所使用的技术,疫情防控平台的开发使用Springboot框架,MySQL数据库进行平台的搭建开发,确认好使用的技术进行技术分析,所使用的技术是否可以完成系统的实现。

(3)确定好系统使用的技术,进行在线确认系统所划分的用户角色,并且根据用户角色划分确定所要设计的功能模块,对疫情防控平台的设计主要划分别为管理员和用户角色,并所使用的功能模块也相应不同,但是系统的数据库实现的内容是交互的,用户可以随时根据自己的需求进行信息查询,对于系统工作人员可以根据自己的分管内容进行在线信息的处理及操作,管理员获取到所有用户的详细数据信息,并根据需求进行第一时间处理解决。

(4)系统的功能模块确认完成后进行程序及界面的设计,设计完成后,并且通过测试来判断程序是否完善,对于系统测试,需要不同的用户进行不同的内容编辑及提交,及使用不同的测试方式找出程序中存在的漏洞,并对程序出现的漏洞问题进行在线解决处理,如果测试系统没有任何问题时,可以将系统上传进行正式操作使用。

1.3论文组成结构

根据市场调研得到的信息数据,结合发展现状,利用相关系统开发和设计方法,最终设计出疫情防控平台 。

本文共有七章,如下所示。

第一章概述了疫情防控平台的研究背景与意义和研究内容,最后给出了论文的组成结构。

第二章简要概述了本文所用的开发技术和工具。

第三章简要对系统各业务流程进行需求分析、可行性分析。

第四章对疫情防控平台进行设计。

第五章对疫情防控平台进行实现,并贴出相关页面截图,语言描述出具体功能实现的操作方法。

第六章对疫情防控平台采用测试用例的方式来对一些主要功能模块测试,最后得出测试结果。

第七章总结全文并对未来的研究做出展望。

  1. 开发工具及相关技术介绍
    1. J2EE技术

人可以掌握多门外语,而一个计算机科学家精通的大多是编程语言,它不是人类的自然语言,比如C语言、Java、Perl等等。由于不同的公司开发出的“中间件”不够规范,所以Sun公司推出J2EE,用这个标准来解决弊病。它提供了良好的机制,让每个层次允许与之相对的服务器、组件运行,使得系统的搭建稳定可用、开发高效、维护方便。

    1. MVVM模式

MVVM模式是常用的开发模式,主要是在代码实现上将其分为M层、V层和C层。

视图(View)代表用户交互界面,一个 Web 应用就可能有很多的界面,在 MVVM 模式中,视图仅仅处理的只有数据采集、处理,还有用户的请求, 并不包括业务流程的处理,业务流程由模型(Model)来处理。

模型(Model)就是业务流程/状态的处理及业务规则的制定。模型处理业务流程的过程其它层是无法看见了的,它就像黑箱子,在接受视图请求的数据之后,然后返回最终的处理结果。MVVM 最主要的核心就是业务模型的设计,一个典型的应用例子就是目前流行的 EJB 模型,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件,但是它不能作为应用设计模型的框架。

控制器(Controller)可以理解为接收用户的请求,然后视图和模型匹配在一起,一起再完成用户请求。它有非常明显的作用在划分控制层上,可以很清晰地告诉你,它就是一个分发器,选择什么样的模型、视图,可以完成用户的什么样的请求。控制层不做所有的数据处理,比如说:用户点击一个连接,控制层接受到请求之后,并不处理业务信息,它只是向模型传递用户的信息,同时告诉模型做什么,然后选择符合需求的视图返回给用户。

    1. MySQL数据库

用MySQL这个软件,是因为它能接受多个使用者访问,而且里面存在Archive等。它会先把数据进行分类,然后分别保存在表里,这样的特别操作就会提高数据管理系统自身的速度,让数据库能被灵活运用。MySQL的代码是公开的,而且允许别人二次编译升级。这个特点能够降低使用者的成本,再搭配合适的软件后形成一个良好的网站系统。虽然它有缺点,但是综合各方面来说,它是使用者的主流运用的对象。

    1. B/S结构

B/S(Browser/Server)比前身架构更为省事的架构。它借助Web server完成数据的传递交流。只需要下载浏览器作为客户端,那么工作就达到“瘦身”效果, 不需要考虑不停装软件的问题。

    1. JavaScript 运行模式:

JavaScript是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的

2.5.1是一种解释性脚本语言(代码不进行预编译)。

2.5.2主要用来向HTML标准通用标记语言下的一个应用)页面添加交互行为。

2.5.3可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离

2.5.4跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如WindowsLinuxMacAndroidiOS等)。

2.5.5 JavaScript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。JavaScript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。

    1. Spring boot框架

Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。它不仅对Java:JDBC、iBATS/MyBATIs、Hibernate、Java数据对象(JDO)、ApacheOJB和ApacheCayne等所有流行的数据访问框架中提供支持,同时还可以与Spring的事务管理一起使用,为数据访问提供了灵活的抽象。Spring框架最初是没有打算构建一个自己的WebMVC框架,其开发人员在开发过程中认为现有的StrutsWeb框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。

  1. 系统分析

3.1可行性分析

本系统将在经济、技术、操作这三个角度上进行可行性分析。

      1. 经济可行性

整个系统从设计到开发以及测试过程严谨步骤齐全,所有工作任务全部由本人完成,并未获取外部技术支持,节约了一切服务成本开销以及人工成本,在硬件方面,为节约成本使用一台二手移动工作站作为项目部署服务器以及数据库服务器,成本在一万元一下,真个网络部署也是由本人独立完成不涉及到其他人工费用,整个开发过程本着低成本,低消耗的原则。

      1. 技术可行性

技术可行性分析的目的是确认该系统能否利用现有技术实现,并评估开发效率和完成情况。技术的可行性是指在当前的技术条件下,计算机软件和硬件的开发是否能够满足发展的要求。因为该系统的开发基于Springboot语言,所以开发该系统所需的软件和硬件条件可以在普通计算机上满足。因为它占用的内存相对较少,所以用Mysql数据库开发和设计软件理论上没有问题,因为它占用的内存太少。上述技术可以有效地保证系统的成功和高效开发。

      1. 操作可行性

疫情防控平台的使用界面简单易于操作,采用常见的界面窗口来登录界面,通过电脑进行访问操作,用户只要平时使用过电脑都能进行访问操作。此系统的开发采用springboot技术开发,人性化和完善化是B/S结构开发比较显要的特点使得用户操作相比较其他更加简洁方便。易操作、易管理、交互性好在本系统操作上体现得淋漓尽致。

3.2性能分析

对于性能分析,与传统的管理方式相比,传统的管理方式是使用人工通过用纸和笔进行数据信息的统计和管理,并且这种方式对于存储和查找某一数据信息都比较麻烦,随着计算机网络的到来,这种传统的方法很难适应当下社会的发展,不仅降低人们的办事效率,而且还需要很多的人力和物力,对于使用的时间和所要花费的费用都是比较高的,为了降低成本费用,提高用户的工作效率,进行开发一套基于计算机和网络技术的疫情防控平台。

疫情防控平台的开发设计时一个独立的系统,以流行数据库进行数据的存储开发,主要是为了实现疫情防控平台的用户角色及相对应的功能模块,让疫情防控平台的管理不会存在管理差异、低效率,而是跟传统的管理信息恰好相反,疫情防控平台的实现可以节约资源,并且对于业务的处理速度也提高,速度快、效率高,功能性强大。

3.3系统操作流程

3.3.1用户登录流程

对于系统的安全性的第一关,就是用户想要进入系统,必须通过登录窗口,输入自己的登录信息才可以进行登录,用户输入的信息准确无误后才可以进入到操作系统界面,进行功能模块的相对应操作,如果用户输入的信息不正确,则窗口出现提示框,用户登录失败,返回到第一步进行重新输入,如图3-1所示。

                               图3-1登录操作流程图

3.3.2信息添加流程

对于疫情防控平台,需要随时添加所需要的数据信息,对于用户添加信息,需要根据添加界面,根据选框的内容进行填写所要添加的数据信息,信息输入完成后判断数据信息是否符合要求,符合要求则添加完成,用户所添加的信息不符合要求,则需要返回到第一步,重新输入数据信息,再进行判断操作,如图3-2所示。

图3-2 信息添加流程图

3.3.3信息删除流程

不管是哪个用户角色进入到不通的系统操作界面,都可以进行不同的信息内容的操作功能,对用系统数据信息的删除,用户一旦将信息删除,那么该删除的数据信息将无法恢复,所以用户在对数据删除事,一定判断删除的内容是否是确定要删除的,确定无误后选择确定删除操作,如图3-3所示。

图3-3 信息删除流程图


第4章 系统设计

4.1系统架构设计

疫情防控平台的系统项目的概述设计分析,主要内容是进行数据库的是设计,数据采用mysql数据库,并且对于系统的设计采用比较人性化的操作设计,对于系统出现的错误信息可以及时做出处理及反馈。

疫情防控平台的设计基于现有的互联网,可以实现管理员:站点管理、用户管理、内容管理、健康信息上报、行程信息上报、在线举报、在线留言、用户状态信息、上报信息情况、疫情数据、疫情新闻等。根据系统功能需求建立的模块关系图如下图:

图4-1管理员功能模块图

4.2开发流程设计

疫情防控平台的开发对管理模块和系统使用的数据库进行分析,编写代开发,规划和操作是构建信息管理应用程序的必要三步曲,它决定了系统是否能够真正实现预设功能以及是否可以在成功设计后实施。在开发过程中,每个阶段必须严格按照线性顺序进行开发,并且在相应阶段生成的每个工作都可以通过技术进行验证和检查。确保一个阶段完成后是正确的,不会造成下一阶段拖拽现象,使系统完成设计功能后得到保证。

从疫情防控平台的成功开发经验来看,上述方法效果最为明显,最大程度地降低了系统开发的复杂性。如图4-2所示。

图4-2开发系统流程图

4.3数据库设计

数据库是信息系统的基础和核心。数据库设计的好坏直接影响到信息系统开发的成败。创建数据库表首先确定实体的属性和实体之间的关系。根据关系创建一个数据表。4.3.1实体ER图

数据库是整个软件编程中最重要的一个步骤,对于数据库问题主要是判定数据库的数量和结构公式的创建。展示系统使用的是Mysql进行对数据库进行管理,进行保证数据的安全性、稳定性等。

概念模型的设计是为了抽象真实世界的信息,并对信息世界进行建模。它是数据库设计的强大工具。数据库概念模型设计可以通过E-R图描述现实世界的概念模型。系统的E-R图显示了系统中实体之间的链接。而且Mysql数据库是自我保护能力比较强的数据库,下图主要是对数据库实体的E-R图:

(1) 健康信息上报实体图,如图4-3所示:

          图4-3 健康信息上报实体图

 (2)行程信息上报实体图如图4-4所示:

图4-4行程信息上报实体图

(3)疫情数据实体图如图4-5所示:

图4-5疫情数据实体图

这些功能可以充分满足疫情防控平台的需求。此系统功能较为全面如下图系统功能结构如图4-5所示。

                     

                           图4-5系统功能结构图

4.3.2数据表

我们可以根据数据结构的详细分析要求,我们根据输入和输出数据量的要求进行分析,确定什么表表,结构之间的关系,我们可以验证,调整和完善,查询和浏览过程,可以实现数据库,以使用户对数据和功能有更多要求。

基于系统使用的数据库管理系统的特点,对数据库的概念模型进行了转换和构建。但是,这个系统只需要充分考虑疫情防控平台的功能,而且组织比较清晰。

access_token

字段名称

类型

长度

不是null

主键

字段说明

token_id

int unsigned

0

临时访问牌ID

token

varchar

64

临时访问牌

info

text

0

maxage

int

0

最大寿命

create_time

timestamp

0

创建时间

update_time

timestamp

0

更新时间

user_id

int unsigned

0

用户编号

article_type

字段名称

类型

长度

不是null

主键

字段说明

type_id

smallint unsigned

0

分类ID

display

smallint unsigned

0

显示顺序

name

varchar

16

分类名称

father_id

smallint unsigned

0

上级分类ID

description

varchar

255

描述

icon

text

0

分类图标

url

varchar

255

外链地址

create_time

timestamp

0

创建时间

update_time

timestamp

0

更新时间

auth

字段名称

类型

长度

不是null

主键

字段说明

auth_id

int unsigned

0

授权ID

user_group

varchar

64

用户组

mod_name

varchar

64

模块名

table_name

varchar

64

表名

page_title

varchar

255

页面标题

path

varchar

255

路由路径

position

varchar

32

位置

mode

varchar

32

跳转方式

add

tinyint unsigned

0

是否可增加

del

tinyint unsigned

0

是否可删除

set

tinyint unsigned

0

是否可修改

get

tinyint unsigned

0

是否可查看

field_add

varchar

500

添加字段

field_set

varchar

500

修改字段

field_get

varchar

500

查询字段

table_nav_name

varchar

255

跨表导航名称

table_nav

varchar

255

跨表导航

option

text

0

配置

create_time

timestamp

0

创建时间

update_time

timestamp

0

更新时间

comment

字段名称

类型

长度

不是null

主键

字段说明

comment_id

int unsigned

0

评论ID

user_id

int unsigned

0

评论人ID

reply_to_id

int unsigned

0

回复评论ID

content

longtext

0

内容

nickname

varchar

255

昵称

avatar

varchar

255

头像地址

create_time

timestamp

0

创建时间

update_time

timestamp

0

更新时间

source_table

varchar

255

来源表

source_field

varchar

255

来源字段

source_id

int unsigned

0

来源ID

epidemic_data

字段名称

类型

长度

不是null

主键

字段说明

epidemic_data_id

int

0

疫情数据ID

region

varchar

64

地区

number_of_infected_persons

varchar

64

感染人数

number_of_close_contacts

varchar

64

密接人数

statistician

varchar

64

统计人

remarks

varchar

64

备注

date

date

0

日期

recommend

int

0

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

health_information_reporting

字段名称

类型

长度

不是null

主键

字段说明

health_information_reporting_id

int

0

健康信息上报ID

user

int

0

用户

full_name

varchar

64

姓名

id

varchar

255

身份证

temperature

varchar

64

体温

cough

varchar

64

是否咳嗽

is_it_hot

varchar

64

是否发热

is_it_weak

varchar

64

是否乏力

is_it_difficult_to_breathe

varchar

64

是否呼吸困难

date

date

0

日期

physical_symptoms

text

0

身体症状

examine_state

varchar

16

审核状态

examine_reply

varchar

16

审核回复

recommend

int

0

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

information_reporting

字段名称

类型

长度

不是null

主键

字段说明

information_reporting_id

int

0

上报信息情况ID

information_type

varchar

64

信息类型

number

varchar

64

数量

date

date

0

日期

statistician

varchar

64

统计人

remarks

varchar

64

备注

recommend

int

0

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

online_message

字段名称

类型

长度

不是null

主键

字段说明

online_message_id

int

0

在线留言ID

user

int

0

用户

message_type

varchar

64

留言类型

message_date

date

0

留言日期

message_content

text

0

留言内容

recommend

int

0

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

online_reporting

字段名称

类型

长度

不是null

主键

字段说明

online_reporting_id

int

0

在线举报ID

user

int

0

用户

date

date

0

日期

report_content

text

0

举报内容

recommend

int

0

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

ordinary_users

字段名称

类型

长度

不是null

主键

字段说明

ordinary_users_id

int

0

普通用户ID

full_name

varchar

64

姓名

gender

varchar

64

性别

id

varchar

255

身份证

examine_state

varchar

16

审核状态

recommend

int

0

智能推荐

user_id

int

0

用户ID

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

praise

字段名称

类型

长度

不是null

主键

字段说明

praise_id

int unsigned

0

点赞ID

user_id

int unsigned

0

点赞人

create_time

timestamp

0

创建时间

update_time

timestamp

0

更新时间

source_table

varchar

255

来源表

source_field

varchar

255

来源字段

source_id

int unsigned

0

来源ID

status

tinyint

1

点赞状态

travel_information_reporting

字段名称

类型

长度

不是null

主键

字段说明

travel_information_reporting_id

int

0

行程信息上报ID

user

int

0

用户

full_name

varchar

64

姓名

id

varchar

255

身份证

date

date

0

日期

trip

text

0

行程

remarks

text

0

备注

examine_state

varchar

16

审核状态

examine_reply

varchar

16

审核回复

recommend

int

0

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

user_group

字段名称

类型

长度

不是null

主键

字段说明

group_id

mediumint unsigned

0

用户组ID

display

smallint unsigned

0

显示顺序

name

varchar

16

名称

description

varchar

255

描述

source_table

varchar

255

来源表

source_field

varchar

255

来源字段

source_id

int unsigned

0

来源ID

register

smallint unsigned

0

注册位置

create_time

timestamp

0

创建时间

update_time

timestamp

0

更新时间

第5章 系统实现

5.1用户前台功能模块

疫情防控平台,在系统首页公告信息、疫情新闻、行程信息上报、健康信息上报、在线举报、在线留言、我的(我的账户、我的收藏、个人中心)等内容,如图5-1所示。

图5-1首页界面图

登录,在登录页面通过填写账号、密码等信息完成登录,如图5-3所示。

图5-2登录界面

登录系统主要代码如下。

/**

     * 登录

     * @param data

     * @param httpServletRequest

     * @return

     */

    @PostMapping("login")

    public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {

        log.info("[执行登录接口]");

        String username = data.get("username");

        String email = data.get("email");

        String phone = data.get("phone");

        String password = data.get("password");

        List resultList = null;

        Map<String, String> map = new HashMap<>();

        if(username != null && "".equals(username) == false){

            map.put("username", username);

            resultList = service.select(map, new HashMap<>()).getResultList();

        }

        else if(email != null && "".equals(email) == false){

            map.put("email", email);

            resultList = service.select(map, new HashMap<>()).getResultList();

        }

        else if(phone != null && "".equals(phone) == false){

            map.put("phone", phone);

            resultList = service.select(map, new HashMap<>()).getResultList();

        }else{

            return error(30000, "账号或密码不能为空");

        }

        if (resultList == null || password == null) {

            return error(30000, "账号或密码不能为空");

        }

        //判断是否有这个用户

        if (resultList.size()<=0){

            return error(30000,"用户不存在");

        }

        User byUsername = (User) resultList.get(0);

        Map<String, String> groupMap = new HashMap<>();

        groupMap.put("name",byUsername.getUserGroup());

        List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();

        if (groupList.size()<1){

            return error(30000,"用户组不存在");

        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态

        if (!StringUtils.isEmpty(userGroup.getSourceTable())){

            String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();

            String res = String.valueOf(service.runCountSql(sql).getSingleResult());

            if (res==null){

                return error(30000,"用户不存在");

            }

            if (!res.equals("已通过")){

                return error(30000,"该用户审核未通过");

            }

        }

        //查询用户状态

        if (byUsername.getState()!=1){

            return error(30000,"用户非可用状态,不能登录");

        }

        String md5password = service.encryption(password);

        if (byUsername.getPassword().equals(md5password)) {

            // 存储Token到数据库

            AccessToken accessToken = new AccessToken();

            accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

            accessToken.setUser_id(byUsername.getUserId());

            tokenService.save(accessToken);

            // 返回用户信息

            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));

            user.put("token", accessToken.getToken());

            JSONObject ret = new JSONObject();

            ret.put("obj",user);

            return success(ret);

        } else {

            return error(30000, "账号或密码不正确");

        }

}

用户注册,在用户注册页面可以填写账号、密码、昵称、邮箱、手机号、身份、性别等详细内容进行注册,如图5-3所示。

图5-3用户注册界面

用户注册关键代码如下所示。

/**

     * 注册

     * @param user

     * @return

     */

    @PostMapping("register")

    public Map<String, Object> signUp(@RequestBody User user) {

        // 查询用户

        Map<String, String> query = new HashMap<>();

        query.put("username",user.getUsername());

        List list = service.select(query, new HashMap<>()).getResultList();

        if (list.size()>0){

            return error(30000, "用户已存在");

        }

        user.setUserId(null);

        user.setPassword(service.encryption(user.getPassword()));

        service.save(user);

        return success(1);

}

/**

     * 用户ID:[0,8388607]用户获取其他与用户相关的数据

     */

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    @Column(name = "user_id")

    private Integer userId;

    /**

     * 账户状态:[0,10](1可用|2异常|3已冻结|4已注销)

     */

    @Basic

    @Column(name = "state")

    private Integer state;

    /**

     * 所在用户组:[0,32767]决定用户身份和权限

     */

    @Basic

    @Column(name = "user_group")

    private String userGroup;

    /**

     * 上次登录时间:

     */

    @Basic

    @Column(name = "login_time")

    private Timestamp loginTime;

    /**

     * 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时

     */

    @Basic

    @Column(name = "phone")

    private String phone;

    /**

     * 手机认证:[0,1](0未认证|1审核中|2已认证)

     */

    @Basic

    @Column(name = "phone_state")

    private Integer phoneState;

    /**

     * 用户名:[0,16]用户登录时所用的账户名称

     */

    @Basic

    @Column(name = "username")

    private String username;

    /**

     * 昵称:[0,16]

     */

    @Basic

    @Column(name = "nickname")

    private String nickname;

    /**

     * 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成

     */

    @Basic

    @Column(name = "password")

    private String password;

    /**

     * 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时

     */

    @Basic

    @Column(name = "email")

    private String email;

    /**

     * 邮箱认证:[0,1](0未认证|1审核中|2已认证)

     */

    @Basic

    @Column(name = "email_state")

    private Integer emailState;

    /**

     * 头像地址:[0,255]

     */

    @Basic

    @Column(name = "avatar")

    private String avatar;

    /**

     * 创建时间:

     */

    @Basic

    @Column(name = "create_time")

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

    private Timestamp createTime;

    @Basic

    @Transient

    private String code;

}

公告消息页面通过系统进行查看管理员发布的公告信息,如图5-4所示。

图5-4公告消息界面图

疫情新闻,在页面中可以查看最新的疫情新闻信息并可对疫情新闻进行点赞、收藏、发表评论等操作,如图5-5所示。        

图5-5疫情新闻界面图

健康信息上报用户在健康信息上报页面输入体温、用户、姓名、身份证、是否发热、是否咳嗽、是否乏力、是否呼吸困难、日期、身体状态等详细内容进行提交上报操作,如图5-6所示。      

图5-6提交健康信息上报界面图

行程信息上报用户在行程信息上报页面输入日期、身份证、姓名、日期、行程、备注等详细内容进行提交上报操作,如图5-7所示。       

图5-7提交行程信息上报界面图

在线举报用户在在线举报页面输入日期和举报内容进行提交操作,由管理员进行审核回复,如图5-8所示:

图5-8 在线举报界面图

在线留言用户在在线留言页面输入留言日期、留言类型、和留言内容进行提交操作,由管理员进行审核回复,,如图5-9所示:

图5-9 在线留言界面图

我的账户:用户点击右上角“我的”然后进行我的账户,可对个人资料和密码进行修改操作,如图5-10所示:

图5-10 个人资料修改界面图

5.2管理员功能模块

管理员登录,通过填写注册时输入的用户名、密码验证进行登录,如图5-11所示。

图5-11管理员登录界面图

管理员登录进入疫情防控平台后的主要功能是:后台首页、站点管理(轮播图、公告栏)、用户管理(普通用户、管理员)、内容管理(疫情新闻、新闻分类列表)、更多管理(健康信息上报、行程信息上报、在线举报、在线留言、用户状态信息、上报信息情况、疫情数据)个人信息等信息。还可以对疫情防控平台等进行管理操作,如图5-12所示。

图5-12首页界面图

疫情防控平台中的管理人员是可以对前台注册的用户信息进行管理的,也可以对管理员进行管控。界面如下图5-13 5-14所示。

图5-13用户管理界面图

图5-14添加用户信息界面图

用户管理关键代码如下所示。

@RequestMapping(value = "/del")

    @Transactional

    public Map<String, Object> del(HttpServletRequest request) {

        service.delete(service.readQuery(request), service.readConfig(request));

        return success(1);

}

    @Transactional

    public void delete(Map<String,String> query,Map<String,String> config){

        StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");

        sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));

        log.info("[{}] - 删除操作:{}",table,sql);

        Query query1 = runCountSql(sql.toString());

        query1.executeUpdate();

    }

轮播图管理:管理员对轮播图管理进行标题、轮播图以及查看、添加、删除等操作。界面如下图5-15所示。

图5-15轮播图管理界面图

轮播图管理关键代码如下所示。

@PostMapping("/set")

@Transactional

    public Map<String, Object> set(HttpServletRequest request) throws IOException {

        service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));

        return success(1);

}

    public Map<String,String> readConfig(HttpServletRequest request){

        Map<String,String> map = new HashMap<>();

        map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));

        map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));

        map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));

        map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));

        map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));

        map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));

        map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));

        map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));

        return map;

}

    public Map<String,String> readQuery(HttpServletRequest request){

        String queryString = request.getQueryString();

        if (queryString != null && !"".equals(queryString)) {

            String[] querys = queryString.split("&");

            Map<String, String> map = new HashMap<>();

            for (String query : querys) {

                String[] q = query.split("=");

                map.put(q[0], q[1]);

            }

            map.remove(FindConfig.PAGE);

            map.remove(FindConfig.SIZE);

            map.remove(FindConfig.LIKE);

            map.remove(FindConfig.ORDER_BY);

            map.remove(FindConfig.FIELD);

            map.remove(FindConfig.GROUP_BY);

            map.remove(FindConfig.MAX_);

            map.remove(FindConfig.MIN_);

            return map;

        }else {

            return new HashMap<>();

        }

}

    @Transactional

    public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){

        StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");

        for (Map.Entry<String,Object> entry:body.entrySet()){

            Object value = entry.getValue();

            if (value instanceof String){

                sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");

            }else {

                sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");

            }

        }

        sql.deleteCharAt(sql.length()-1);

        sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));

        log.info("[{}] - 更新操作:{}",table,sql);

        Query query1 = runCountSql(sql.toString());

        query1.executeUpdate();

}

    public String toWhereSql(Map<String,String> query, Boolean like) {

        if (query.size() > 0) {

            try {

                StringBuilder sql = new StringBuilder(" WHERE ");

                for (Map.Entry<String, String> entry : query.entrySet()) {

                    if (entry.getKey().contains(FindConfig.MIN_)) {

                        String min = humpToLine(entry.getKey()).replace("_min", "");

                        sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");

                        continue;

                    }

                    if (entry.getKey().contains(FindConfig.MAX_)) {

                        String max = humpToLine(entry.getKey()).replace("_max", "");

                        sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");

                        continue;

                    }

                    if (like == true) {

                        sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");

                    } else {

                        sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");

                    }

                }

                sql.delete(sql.length() - 4, sql.length());

                sql.append(" ");

                return sql.toString();

            } catch (UnsupportedEncodingException e) {

                log.info("拼接sql 失败:{}", e.getMessage());

            }

        }

        return "";

    }

公告栏管理:管理员在公告栏这一菜单可对公告信息进行管理,其管理界面如下图5-16所示。

图5-16公告栏管理界面图

公告栏管理关键代码如下所示。

  @PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

    @Transactional

    public Map<String, Object> addMap(Map<String,Object> map){

        service.insert(map);

        return success(1);

}

    public Map<String,Object> readBody(BufferedReader reader){

        BufferedReader br = null;

        StringBuilder sb = new StringBuilder("");

        try{

            br = reader;

            String str;

            while ((str = br.readLine()) != null){

                sb.append(str);

            }

            br.close();

            String json = sb.toString();

            return JSONObject.parseObject(json, Map.class);

        }catch (IOException e){

            e.printStackTrace();

        }finally{

            if (null != br){

                try{

                    br.close();

                }catch (IOException e){

                    e.printStackTrace();

                }

            }

        }

        return null;

}

    public void insert(Map<String,Object> body){

        StringBuffer sql = new StringBuffer("INSERT INTO ");

        sql.append("`").append(table).append("`").append(" (");

        for (Map.Entry<String,Object> entry:body.entrySet()){

            sql.append("`"+humpToLine(entry.getKey())+"`").append(",");

        }

        sql.deleteCharAt(sql.length()-1);

        sql.append(") VALUES (");

        for (Map.Entry<String,Object> entry:body.entrySet()){

            Object value = entry.getValue();

            if (value instanceof String){

                sql.append("'").append(entry.getValue()).append("'").append(",");

            }else {

                sql.append(entry.getValue()).append(",");

            }

        }

        sql.deleteCharAt(sql.length() - 1);

        sql.append(")");

        log.info("[{}] - 插入操作:{}",table,sql);

        Query query = runCountSql(sql.toString());

        query.executeUpdate();

    }

}

内容管理:管理员对疫情新闻进行标签、标题、文章分类、封面图等信息、可以跟进详情修改以及删除等操作,如下图5-17所示。

图5-17内容管理界面

更多管理:管理员在更多管理这一栏可看到健康信息上报+行程信息上报+在线举报+在线留言+用户状态信息+上报信息情况+疫情数据这七个子菜单,并可根据需要对这七个子菜单进行管理,如下图5-18所示。

图5-18模块管理界面

第6章 系统测试

6.1测试目的

程序设计不能保证没有错误,这是一个开发过程,在错误或错误的过程中难以避免,这是不可避免的,但我们不能使这些错误始终存在于系统中,错误可能会造成无法估量的后果 如系统崩溃,安全信息,系统无法正常启动,导致安装用户手机屏幕等,为了避免这些问题,我们需要测试程序,并发现这些问题,并纠正它们 ,并使系统更长时间稳定成熟,本章的作用是发现这些问题,并对其进行修改,虽然耗时费力,但长期非常重要和必要系统的开发。

软件测试与开发过程是一样的,都必须按照软件工程的正规原理进行,遵守管理学理论。不过,目前国内的软件测试已经积累了大量经验和方法,步骤相对成熟,软件测试的效率也越来越高。

疫情防控平台的实现,对于系统中功能模块的实现及操作都必须通过测试进行来评判系统是否可以准确的实现。在疫情防控平台正式上传使用之前必须做的一步就是系统测试,对于测试发现的错误及时修改处理,保证系统准确无误的供给用户使用。

6.2测试方案设计

6.2.1 测试策略

1、功能测试

从用户的角度来看,测试时不了解新开发软件的内部结构,因此可以将系统与黑匣子进行比较,盲目输入后可以查看系统给出的反馈。这种测试属于黑盒测试,在测试中如果输入错误信息系统会报错。

2、性能测试

测试软件程序的整体状况(称为性能测试)通常使用自动化测试工具来检测系统的整体功能,在负载测试和压力测试之间进行分配,在某些情况下,将这两种情况结合起来。虽然压力测试可以检测到系统可以提供的最高级别的服务,但负载测试可以测试系统如何响应增加的负载。

6.2.2 测试分析

测试评估系统质量的方法不局限于系统编码和过程,应该与软件设计工作和历史需求分析密切相关。

软件测试应遵循以下原则:

(1)软件测试应尽快进行,整个测试部分应在软件开发和设计的整个过程中进行。如发现错误,立即处理,将大大减少软件开发的时间,并提高软件的质量。

(2)在软件的各种测试中,测试过程中使用的计划、报告等应妥善处理和存储。其主要目的是为了便于以后系统的维护。

(3)软件测试整个过程中的聚类现象应优先考虑。

(4)对于软件测试,我们应该尽量不去和自己设计的系统进行参考,而是要测试对方的程序,以确保软件测试结果的客观性和公平性。

(5)整个测试计划严格按照软件测试的具体实施细则进行。

(6)对整个测试结果进行综合检查,尽量避免重复错误。

本疫情防控平台满足用户的要求和需求,本疫情防控平台的使用能够有效的提高用户的使用率。

6.3 测试结果

测试后得到的性能和用例,系统具有足够的正确性、可靠性、稳定性,并且可以对输入数据进行准确的点击操作处理和响应测试用户的体验也得到了很好的反馈和响应时间。合理的范围,可以兼容所有主流浏览器,设计所需的效果。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐