毕业设计(论文)-springboot欢欢宠物医院管理系统设计_第1页
毕业设计(论文)-springboot欢欢宠物医院管理系统设计_第2页
毕业设计(论文)-springboot欢欢宠物医院管理系统设计_第3页
毕业设计(论文)-springboot欢欢宠物医院管理系统设计_第4页
毕业设计(论文)-springboot欢欢宠物医院管理系统设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绪论研究背景目前,很多国内宠物医院信息管理一般采用纯手工管理。这种方法的弊端在于参与管理的人员文化水平不一,字迹不一,互相之间会导致信息传达不便,而.且纸质信息传载媒体有着一个很大的弱点就是容易损坏,造成信息丢失。在当前的信息化时代中,任何宠物医院,都需要一个实用的宠物医院信息管理系统来规范宠物医院信息的管理,这将会大大提高宠物医院的管理水平,优化资源,实现效益的最大化。现在国内也有一些宠物医院信息管理管理的软件,采用的技术也是多种多样,但大多数宠物医院信息管理系统主要用于大型宠物医院的关键部门。至于小型宠物医院,利用宠物医院信息管理系统管理日常业务的并不多。针对国内对宠物医院信息管理软件的巨大需要和基本需要,一个好的宠物医院信息管理软件,必须功能齐全,操作简便,向用户展示简单明了的操作界面。在完善功能的同时又必须兼顾系统的灵活性,安全性。宠物医院管理系统的优势主要表现在三个方面:(1)宠物医院信息管理无纸化,环保又方便。传统的宠物医院信息管理方式,都是经由员工手工记录存档。这种传统的纸质宠物医院信息管理管理,-是会有很大的体力消耗,二是在精力上也是不小的付出。而无纸化宠物医院信息管理,只需在电脑前点点鼠标,在体力上几乎没有多大的消耗,而且在环保、效率、针对性日常业务方面做得要比传统的宠物医院信息管理管理科学得多。(2)科学管理,安全可靠。传统的宠物医院信息管理管理方式,经常会由于各种原因,产生信息的丢失或是污损,给宠物医院信息管理和日常业务带来很大的不便。而对于宠物医院信息管理系统,只需做好系统数据库的保护,以上问题可以迎刃而解了。(3)简化工作,促进其他方面的综合发展。由于宠物医院信息管理系统的介入运行,可以使医生腾出更多的时间,做更多针对性的个性化医疗服务,从而使每个病人都有机会享受更多的服务。研究现状随着人们的生活水平的不断提高、物质生活不断丰富、精神追求不断提升,人们也越来亲睐于饲养宠物。近年来宠物市场的急剧发展,也让更多的人们关注饲养宠物的益处,特别是年轻人工作愈发繁重的背景下,留守家中的老年人变得越来越孤独,饲养宠物不失为排解孤独的一种有效途径。近几年计算机网络技术的飞速发展,网络已经成了人们日常生活中重要且必不可少的一部分,很多人想要购买宠物却不知道哪种宠物适合自己;想要了解哪些宠物的饲养习性却无处咨询;想弄清楚哪些宠物适合各年龄段的人却因实体宠物医院路途遥远等原因而作罢。于是,欢欢宠物医院管理系统应运而生。由于其方便性、快捷性、可靠性,已成为众多宠物爱好者经常光顾的地方。国内外的欢欢宠物医院管理系统众多,虽然这些系统运用的技术有所不同,但是他们实现的功能和目的都有一个共同点,对社会的影响、给人们带来的方便是一样的。他们都能满足绝大多数人的需求,使得分散于各地的宠物饲养者们能找到这样一个虚拟的宠物医院,使得大家不用再为如何领养、挂号、爱护自己的爱宠而发愁。现在国内外也有很多宠物医院信息管理的软件,采用的技术也是多种多样,如基于MySQL和Springboot模式,但大多数宠物医院信息管理系统主要用于大型宠物医院的关键部门。至于小型宠物医院,利用宠物医院信息管理系统组织管理的并不多。针对国内外对宠物医院信息管理的巨大需要和基本需要,一个好的宠物医院信息管理系统,必须功能齐全,操作简便,向用户展示友善的操作界面。在完善功能的同时又必须兼顾系统的灵活性,安全性,健壮性。各个欢欢宠物医院管理系统在功能上会存在差异,但都在不断完善,静态网站的宠物医院也在向动态网站的宠物医院过渡。随着Internet的不断快速发展,静态Web站点的开发与维护越来越困难,一方面是信息不断更新和增加,不得不让站点维护人员经常修改页面内容;另一方面静态网页不能及时的与浏览者进行有效交互,使浏览者感觉到乏味。所以开发动态网页是很有必要的。动态网页具有交互性,它能根据用户的要求和选择而动态改变和响应。动态数据访问就是动态网页的特征,当浏览器访问服务器网页时,其Web应用程序才访问数据库,实时检索数据库,响应客户要求。本文的组织结构六个章节共同组成了本文研究及设计内容,包括:第一章:绪论。本文章的开头部分,对本题目的研究背景和研究意义等一些做文字性的描述。第二章:相关技术介绍。主要介绍Springboot框架、Java嵌入式脚本语言、B/S模式等。第三章:系统分析。包括系统总体需求描述、功能性角度分析系统需求、非功能性等各个方面分析系统是否可以实现。第四章:系统设计。本文章的重要部分,提供了系统架构的详细设计和一些主要功能模块的设计说明。第五章:系统实现。将本系统分为前提的开发工具介绍和后期的功能代码实现。第六章:系统测试。系统完成后,根据各个模块的测试用例才对各个模块进行功能测试。相关技术介绍开发技术说明本系统前端部分基于MVVM模式进行开发,采用B/S模式,后端部分基于Java的springboot框架进行开发。前端部分:前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router和Vuex实现动态路由和全局状态管理,Ajax实现前后端通信,ElementUI组件库使页面快速成型,项目前端通过栅格布局实现响应式,可适应PC端、平板端、手机端等不同屏幕大小尺寸的完美布局展示。后端部分:采用springboot作为开发框架,同时集成MyBatis、Redis等相关技术。B/S体系工作原理B/S架构采取浏览器请求,服务器响应的工作模式。用户可以通过浏览器去访问Internet上由Web服务器产生的文本、数据、图片、动画、视频点播和声音等信息;而每一个Web服务器又可以通过各种方式与数据库服务器连接,大量的数据实际存放在数据库服务器中;从Web服务器上下载程序到本地来执行,在下载过程中若遇到与数据库有关的指令,由Web服务器交给数据库服务器来解释执行,并返回给Web服务器,Web服务器又返回给用户。在这种结构中,将许许多多的网连接到一块,形成一个巨大的网,即全球网。而各个企业可以在此结构的基础上建立自己的Internet。在B/S模式中,用户是通过浏览器针对许多分布于网络上的服务器进行请求访问的,浏览器的请求通过服务器进行处理,并将处理结果以及相应的信息返回给浏览器,其他的数据加工、请求全部都是由WebServer完成的。通过该框架结构以及植入于操作系统内部的浏览器,该结构已经成为了当今软件应用的主流结构模式。springboot框架介绍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。MySQL简介MySQL是一个开放的、快速的、多线程的SQL关系型数据库服务器。由于其体积小、免费、运行速度快以及可以通过相关免费的软件来对MySql数据库中的相关数据结构信息等等优点。受广大中等、小型企业所喜爱并占据了很大地位。本系统在数据库方面选用MySQL,并通过Nacivat来进行MySql数据库的管理。在Mysql的安装过程中,最需要注意的就是数据库的编码问题,所以在安装数据库时需要设置数据库的编码为Utf-8,与前台页面和服务器的编码相一致。JavaScript运行模式JavaScript是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。1.8.1是一种解释性脚本语言(代码不进行预编译)。1.8.2主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。1.8.3可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。1.8.4跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。1.8.5JavaScript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。JavaScript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。

系统分析可行性分析法律可行性分析开发软件有没有触犯法律,这涉及到软件或者系统能不能发布的问题。如果触犯了法律,就必将会受到法律的制裁。常见法律问题就是软件抄袭问题,若是抄袭别人软件,将会受到严厉惩罚。技术可行性分析软件产业经过多年的发展,现在已经达到了很大的规模,从事软件开发的专业人员不计其数,软件产业的重要性已经上升到了影响和推动国民经济发展的核心地位。本系统基于的架构,目前技术已经非常的成熟,是不存在技术上面难以实现的麻烦。经济可行性分析开发软件所需的时间、人力和物力成本,开发完成后的收益如何,从投资回报的角度软件所需功能在现有经济条件能不能实现等进行深入的考虑,都符合实际的要求。所以欢欢宠物医院管理系统具有经济可行性和实用性,可以节约管理成本功能需求分析欢欢宠物医院管理系统主要是为了更加地完善宠物医疗的服务情况,对用户的信息、宠物信息和用户管理、宠物热点管理、会员留言管理、疫苗药物管理、订单列表管理、遗弃宠物管理、宠物饲料情况、招聘员工、志愿者申请等提供了方便的机制。本系统有多类使用者,分别是管理员和用户注册。以下是从这两种用户的角度分别介绍本系统所要实现的功能。用户:注册:首先检查用户名和邮箱是否存在,如不存在即可进行注册,并将用户输入的密码进行MD5加密,注册成功后提示注册成功,并将用户信息保存到数据库中。登录:使用欢欢宠物医院管理系统前是需要用户登录个人账号。医生介绍:用户登录宠物医院管理系统首页时,可以浏览医生介绍信息,根据不同地医生可以查看每个不同医生介绍信息等。宠物百科:用户可以浏览宠物百科可以自行搜索某样宠物列表相关评论详情。遗弃预约挂号:用户可以查看预约信息表的挂号状态,可以根据预约状态发起挂号申请:包括填写订单号、医生工号、医生姓名、科室、挂号费、用户名。管理员:用户管理:对用户进行管理,用户的注册,包括用户昵称、用户名、用户的宠物信息(宠物类别、宠物性别、年龄等)用户的账号信息:医生介绍信息管理:对医生介绍信息进行维护,添加、删除、修改信息。预约挂号信息管理:对预约挂号信息进行维护,添加、删除、修改信息。病历记录信息管理:对病历记录信息进行维护,添加、删除、修改信息。医疗器械信息管理:对医疗器械信息进行维护,添加、删除、修改信息。维修上报信息管理:对维修上报信息进行维护,添加、删除、修改信息。非功能需求分析系统非功能需求有非常多,比如性能需求、可承载最大用户数、稳定性、易用性需求等。本系统分析时考虑到易用性需求,因为系统是给人使用的,所以必须充分从用户的角度出发,考虑用户体验,使系统易理解易上手易操作。用例分析1.普通用户主要使用系统的宠物热点和欢欢宠物医院管理系统,下图所示为普通用户的用例图3-1普通用户用例图2.管理员主要负责用户管理、宠物医疗管理、商品管理、商品订单管理、宠物领养,下图所示描述管理员的用例图。图3-2管理员用例图业务流程分析系统业务流程图如下所示。图3-3系统业务流程图业务流程图(TFD)通过一些特定的符号描述业务的处理过程,它重点强调业务过程中每一项处理活动和具体业务部门的关系,选择部分模块进行具体描述。重点对本系统整体业务中最为主要的宠物交易及订单业务进行描述,用户进入欢欢宠物医院管理系统后进行各种模块信息的浏览,选择想要预约挂号,对医生介绍,另外,管理人员进入后端管理,以执行该订单信息控制模块的相关管理方法,并在解决后向客户提供反馈机制。数据流程分析如下为系统的顶层数据流图,外部实体有用户和管理员,分别对系统输入数据,从而得到要输出的数据。图3-4系统顶层数据流图如下图所示为系统底层数据流图。图3-5系统底层数据流图欢欢宠物医院管理系统底层数据流图主要描述系统底层模块的数据流、数据载体、数据处理、外部实体的具体交互。本系统就是管理员和普通用户在用户管理、预约挂号、病历记录、医疗器械、维修上报等模块上的数据交互。系统设计系统架构设计本系统架构设计主要分为可以3层,主要有Web层,业务层,Model层。其中web层还包括View层和Controller层,Model层包括元数据扩展层和数据访问层。图4-1系统架构图系统功能结构为了将系统从“做什么”落实到“怎么做”,基于系统设计原则,对系统功能进行更适合编码实现的功能划分。根据上图的系统架构设计,整理出规范的系统功能结构图,为系统的实现编码做好准备。如下图所示为系统功能结构图。图4-2系统功能结构图功能模块设计用户管理针对所有用户和管理员。未注册用户点击注册,进入注册页面填写新用户信息,得到自定义生成账号后,注册完成。未注册用户注册的活动图如下图所示。图4-3未注册用户注册活动图用户可进行登录使用更多功能,首先进入用户登录界面,输入用户账号和密码,后台对账号和密码信息进行核对验证,验证成功则页面直接显示登录用户昵称代表登录成功,否则返回用户登录界面。用户登录活动图如下图。图4-4用户登录活动图用户登录后,进入功能页面,可对自己的信息进行管理,包括个人信息,预约挂号、病历记录、在线咨询。用户使用功能活动图如下图所示。图4-5用户使用功能活动图用户功能界面可对自己的密码进行修改。进入修改密码界面后核对当前密码,核对成功后填写新密码。修改密码活动图如下图所示。图4-6修改密码活动图数据库设计欢欢宠物医院管理系统采用的数据库是MySQL,该部分将根据系统需求和设计,设计合理的数据库。本系统考虑到之后系统的扩展集群,数据库将不使用外键。此外,不用外键时数据管理也较为简单,操作更加方便,性能更高。E-R图E-R图,更加直观的告诉开发人员系统的各个数据的属性,各个数据之间的联系,各个数据的类型。能通过该模型更直观地了解数据库的设计,并根据对其逐渐改善。本系统图设计,如下图所示。图4-7系统E-R图表结构设计本系统根据第三范式的思想设计数据库,减少最大程度的冗余,总共建立有多个表,用户注册表、管理员表、招聘员工表、宠物信息表、遗弃宠物表、活动中心表、会员信息表、疫苗药物表、志愿者申请表等。表结构如下所示。registered_user表:名称类型长度不是null主键注释registered_user_idint11是是注册用户IDuser_namevarchar64是否用户名examine_statevarchar16是否审核状态recommendint11是否智能推荐user_idint11是否用户IDcreate_timedatetime0是否创建时间update_timetimestamp0是否更新时间online_consultation表:名称类型长度不是null主键注释online_consultation_idint11是是在线咨询IDdoctor_job_numberint11否否医生工号name_of_doctorvarchar64否否医生姓名departmentvarchar64否否科室user_nameint11否否用户名pet_varietyvarchar64否否宠物品种consulting_questionstext0否否咨询问题doctor_replytext0否否医生回复recommendint11是否智能推荐create_timedatetime0是否创建时间update_timetimestamp0是否更新时间medical_record表:名称类型长度不是null主键注释medical_record__idint11是是病历记录IDorder_numbervarchar64否否订单号doctor_job_numberint11否否医生工号name_of_doctorvarchar64否否医生姓名departmentvarchar64否否科室user_nameint11否否用户名pet_varietyvarchar64否否宠物品种pet_agevarchar64否否宠物年龄symptom_descriptiontext0否否症状描述clinical_diagnosistext0否否临床诊断drug_prescriptiontext0否否药物处方recommendint11是否智能推荐create_timedatetime0是否创建时间update_timetimestamp0是否更新时间medical_apparatus_and_instruments表:名称类型长度不是null主键注释medical_apparatus_and_instruments_idint11是是医疗器械IDdevice_numbervarchar64否否器械编号device_namevarchar64否否器械名称purchase_datedate0否否购入日期manufactorvarchar64否否厂家statevarchar64否否状态maintenance_recordtext0否否维修记录recommendint11是否智能推荐create_timedatetime0是否创建时间update_timetimestamp0是否更新时间maintenance_report表:名称类型长度不是null主键注释maintenance_report_idint11是是维修上报IDdevice_numbervarchar64否否器械编号device_namevarchar64否否器械名称related_picturesvarchar255否否相关图片doctor_job_numberint11否否医生工号fault_descriptiontext0否否故障描述examine_statevarchar16是否审核状态examine_replyvarchar255否否审核回复recommendint11是否智能推荐create_timedatetime0是否创建时间update_timetimestamp0是否更新时间abandoned_pets表:名称类型长度不是null主键注释have_an_appointment_with_a_doctor_idint11是是预约挂号IDorder_numbervarchar64否否订单号doctor_job_numberint11否否医生工号name_of_doctorvarchar64否否医生姓名departmentvarchar64否否科室registration_feevarchar64否否挂号费user_nameint11否否用户名pet_varietyvarchar64否否宠物品种pet_agevarchar64否否宠物年龄pet_sexvarchar64否否宠物性别contact_numbervarchar64否否联系电话pay_statevarchar16是否支付状态pay_typevarchar16否否支付类型recommendint11是否智能推荐create_timedatetime0是否创建时间update_timetimestamp0是否更新时间doctor_introduction表:名称类型长度不是null主键注释doctor_introduction_idint11是是医生介绍IDdoctor_job_numberint11否否医生工号name_of_doctorvarchar64否否医生姓名gendervarchar64否否性别agevarchar64否否年龄photovarchar255否否照片departmentvarchar64否否科室registration_feeint11否否挂号费areas_of_expertisetext0否否擅长领域scheduling_timetext0否否排班时间doctor_introductionlongtext0否否医生介绍hitsint11是否点击数praise_lenint11是否点赞数recommendint11是否智能推荐create_timedatetime0是否创建时间update_timetimestamp0是否更新时间doctor表:名称类型长度不是null主键注释doctor_idint11是是医生IDdoctor_job_numbervarchar64是否医生工号name_of_doctorvarchar64否否医生姓名examine_statevarchar16是否审核状态recommendint11是否智能推荐user_idint11是否用户IDcreate_timedatetime0是否创建时间update_timetimestamp0是否更新时间系统实现开发工具系统中应用的开发工具总结如下表所示。表5-1开发工具名称工具版本操作系统IDE(IntegratedDevelopmentEnvironment)WindowsEclipse7/8/102017服务器Tomcat9.10.7JDK(JavaDevelopmentKit)JDKJavaSE8.0(1.8.0)数据库浏览器界面工具MySQL谷歌Photoshop5.76.02016注册模块未注册用户在用户注册界面uerRegister.jsp,输入新用户信息,点击注册后,新用户信息由界面传入控制层userAction,调用addUser(user)方法,通过userDAOImp向数据库用户表插入用户信息,由于用户账号是自动生成的,若成功则反馈注册成功,并提示新用户的用户账号;若失败则回到登录界面,并显示登录失败。注册界面如下所示。图5-1注册界面用户注册关键代码如下所示。/***注册*@paramuser*@return*/@PostMapping("register")publicMap<String,Object>signUp(@RequestBodyUseruser){//查询用户Map<String,String>query=newHashMap<>();query.put("username",user.getUsername());Listlist=service.select(query,newHashMap<>()).getResultList();if(list.size()>0){returnerror(30000,"用户已存在");}user.setUserId(null);user.setPassword(service.encryption(user.getPassword()));service.save(user);returnsuccess(1);}/***用户ID:[0,8388607]用户获取其他与用户相关的数据*/@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="user_id")privateIntegeruserId;/***账户状态:[0,10](1可用|2异常|3已冻结|4已注销)*/@Basic@Column(name="state")privateIntegerstate;/***所在用户组:[0,32767]决定用户身份和权限*/@Basic@Column(name="user_group")privateStringuserGroup;/***上次登录时间:*/@Basic@Column(name="login_time")privateTimestamploginTime;/***手机号码:[0,11]用户的手机号码,用于找回密码时或登录时*/@Basic@Column(name="phone")privateStringphone;/***手机认证:[0,1](0未认证|1审核中|2已认证)*/@Basic@Column(name="phone_state")privateIntegerphoneState;/***用户名:[0,16]用户登录时所用的账户名称*/@Basic@Column(name="username")privateStringusername;/***昵称:[0,16]*/@Basic@Column(name="nickname")privateStringnickname;/***密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成*/@Basic@Column(name="password")privateStringpassword;/***邮箱:[0,64]用户的邮箱,用于找回密码时或登录时*/@Basic@Column(name="email")privateStringemail;/***邮箱认证:[0,1](0未认证|1审核中|2已认证)*/@Basic@Column(name="email_state")privateIntegeremailState;/***头像地址:[0,255]*/@Basic@Column(name="avatar")privateStringavatar;/***创建时间:*/@Basic@Column(name="create_time")@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss")privateTimestampcreateTime;@Basic@TransientprivateStringcode;}登录/注销模块用户在首页点击登录,进入用户登录界面uerLogin.jsp,输入用户账号和密码,点击登录,用户账号和密码信息由界面传入控制层userAction,调用userLogin(user)方法,通过userDAOImp向数据库用户表搜索该用户账号与密码,将最终结果反馈到前端。若成功则回到首页;用户成功登录,若失败则回到登录界面,并显示登录失败。用户点击注销,清空浏览器session值,然后返回登录页或者首页。登录界面如下所示。图5-2登录界面登录界面关键代码如下所示。/***登录*@paramdata*@paramhttpServletRequest*@return*/@PostMapping("login")publicMap<String,Object>login(@RequestBodyMap<String,String>data,HttpServletRequesthttpServletRequest){("[执行登录接口]");Stringusername=data.get("username");Stringemail=data.get("email");Stringphone=data.get("phone");Stringpassword=data.get("password");ListresultList=null;Map<String,String>map=newHashMap<>();if(username!=null&&"".equals(username)==false){map.put("username",username);resultList=service.select(map,newHashMap<>()).getResultList();}elseif(email!=null&&"".equals(email)==false){map.put("email",email);resultList=service.select(map,newHashMap<>()).getResultList();}elseif(phone!=null&&"".equals(phone)==false){map.put("phone",phone);resultList=service.select(map,newHashMap<>()).getResultList();}else{returnerror(30000,"账号或密码不能为空");}if(resultList==null||password==null){returnerror(30000,"账号或密码不能为空");}//判断是否有这个用户if(resultList.size()<=0){returnerror(30000,"用户不存在");}UserbyUsername=(User)resultList.get(0);Map<String,String>groupMap=newHashMap<>();groupMap.put("name",byUsername.getUserGroup());ListgroupList=userGroupService.select(groupMap,newHashMap<>()).getResultList();if(groupList.size()<1){returnerror(30000,"用户组不存在");}UserGroupuserGroup=(UserGroup)groupList.get(0);//查询用户审核状态if(!StringUtils.isEmpty(userGroup.getSourceTable())){Stringsql="selectexamine_statefrom"+userGroup.getSourceTable()+"WHEREuser_id="+byUsername.getUserId();Stringres=String.valueOf(service.runCountSql(sql).getSingleResult());if(res==null){returnerror(30000,"用户不存在");}if(!res.equals("已通过")){returnerror(30000,"该用户审核未通过");}}//查询用户状态if(byUsername.getState()!=1){returnerror(30000,"用户非可用状态,不能登录");}Stringmd5password=service.encryption(password);if(byUsername.getPassword().equals(md5password)){//存储Token到数据库AccessTokenaccessToken=newAccessToken();accessToken.setToken(UUID.randomUUID().toString().replaceAll("-",""));accessToken.setUser_id(byUsername.getUserId());tokenService.save(accessToken);//返回用户信息JSONObjectuser=JSONObject.parseObject(JSONObject.toJSONString(byUsername));user.put("token",accessToken.getToken());JSONObjectret=newJSONObject();ret.put("obj",user);returnsuccess(ret);}else{returnerror(30000,"账号或密码不正确");}}用户模块个人资料模块登录用户在首页点击进入用户中心userCenter.jsp,再点击修改个人信息按钮进入userChangeInfo.jsp界面,系统根据session中存储的目前登录的用户的账号,向控制层userAction发送请求,搜索当前用户信息,userAction向userDAOImp调用queryByUserId(user),向数据库的用户表搜索当前用户信息并将用户信息以对象的形式层层返回到userChangeInfo.jsp界面,显示出当前用户的个人信息。若用户要对个人信息进行修改,则通过修改当前信息之后点击确认,向控制层userAction发送更改后的用户信息,调用changeUser(user)方法,通过userDAOImp向数据库用户表更新用户信息,若成功则反馈注册成功,则返回的userChangeInfo.jsp界面被更改成功;若失败则显示修改失败。宠物百科模块用户在登录状态下浏览宠物百科时可将该宠物百科加入宠物百科,从session中取出该用户的信息,点击加入宠物百科后前台发起请求,将对应的宠物shuliang、id参数信息从前台传递GoumaiController类里,匹配到add()方法,add()方法调用GoumaiServiceImpl类的add()方法。宠物百科界面如下所示。图5-4宠物百科界面医生介绍模块用户在登录状态下浏览医生介绍信息时可将该医生介绍信息加入收藏记录,从session中取出该用户的信息,点击加入医生介绍信息收藏前台发起请求,将对应的医生介绍信息shichang、id参数信息从前台传递XiadanController类里,匹配到add()方法,add()方法调用XiadanServiceImpl类的add()方法。医生介绍信息界面如下所示。图5-5医生介绍界面管理员模块密码修改模块管理员选择个人中心的修改本人密码。通过密码框输入现密码和2次新密码,如果现密码错误,则提示修改失败。如果2次新密码不一致,则提示修改失败。都没问题的话,系统提示修改成功,并返回登录界面。个人信息界面图如下所示。图5-5个人信息界面密码修改界面如下所示。图5-6密码修改界面密码修改关键代码如下所示。/***修改密码*@paramdata*@paramrequest*@return*/@PostMapping("change_password")publicMap<String,Object>change_password(@RequestBodyMap<String,String>data,HttpServletRequestrequest){//根据Token获取UserIdStringtoken=request.getHeader("x-auth-token");IntegeruserId=tokenGetUserId(token);//根据UserId和旧密码获取用户Map<String,String>query=newHashMap<>();Stringo_password=data.get("o_password");query.put("user_id",String.valueOf(userId));query.put("password",service.encryption(o_password));Queryret=service.count(query,service.readConfig(request));Listlist=ret.getResultList();Objects=list.get(0);intcount=Integer.parseInt(list.get(0).toString());if(count>0){//修改密码Map<String,Object>form=newHashMap<>();form.put("password",service.encryption(data.get("password")));service.update(query,service.readConfig(request),form);returnsuccess(1);}returnerror(10000,"密码修改失败!");}医生管理模块根据需求,需要对医生进行添加、删除或修改详情信息。删除或修改医生时,系统根据医生的状态判定为可删除状态下,才会给出删除和修改链接,点击删除链接按钮时,请求到达后台,还会先查询医生状态再次做出判定能否删除。点击修改链接按钮时,会跳转到修改信息的页面,重新填写好数据后,数据提交到后台会对数据库中相应的记录做出修改。添加医生时,会给出数据填写的页面,该页面根据填写好的医生编号同样会事先发送Ajax请求查询编号是否已存在,数据填写好之后提交到后台,会调用相关服务在数据库中插入记录。医生页面设计效果如下图所示。图5-7医生管理界面预约挂号管理模块预约挂号功能需要考虑高并发,防止出现疫苗重复预约、挂号状态显示出错等情况,特对挂号这一共享数据增加锁机制。在乐观锁、悲观锁以及线程锁中,综合考虑性能效率和错误的可接受性选择了乐观锁机制。乐观锁的实现方式是使用版本标识来确定读到的数据与提交时的数据是否一致,提交后修改版本标识,不一致时可以采取丢弃和再次尝试的策略。在数据库疫苗表(对应疫苗实体)设计中增加了version字段,每次数据提交时(更改疫苗状态)会判断version是否匹配,若不匹配停止本次提交,若匹配则提交成功并增加version的值。预约挂号功能整体流程:用户浏览预约挂号信息时,同时会显示挂号的状态,系统会在其显示详细信息的页面时便会判断挂号的状态,若疫苗状态为可预约,则会显示预约的链接按钮。在用户点击预约按钮时,会先通过拦截器判断用户是否登录,若未登录,会跳转至登录页面,提示用户先登录,若为登录用户就会跳转至填写预约信息的页面,填写好预约信息之后,点击提交按钮,预约成功之后返回提示信息,告知用户预约成功。预约挂号流程图如下图所示。图5-8预约挂号流程图预约挂号界面如下图所示。图5-9预约挂号管理界面病历记录管理模块根据需求,需要对病历记录进行添加、删除或修改详情信息。删除或修改订单时,系统根据病历记录的状态判定为可删除状态下,才会给出删除和修改链接,点击删除链接按钮时,请求到达后台,还会先查询病历状态再次做出判定能否删除。点击修改链接按钮时,会跳转到修改信息的页面,重新填写好数据后,数据提交到后台会对数据库中相应的记录做出修改。添加病历记录时,会给出数据填写的页面,该页面根据填写好的病历同样会事先发送Ajax请求查询病历编号是否已存在,数据填写好之后提交到后台,会调用相关服务在数据库中插入记录。病历记录页面设计效果如下图所示。图5-10病历记录界面图病历记录管理的关键代码如下。@PostMapping("/add")@TransactionalpublicMap<String,Object>add(HttpServletRequestrequest)throwsIOException{service.insert(service.readBody(request.getReader()));returnsuccess(1);}@TransactionalpublicMap<String,Object>addMap(Map<String,Object>map){service.insert(map);returnsuccess(1);}publicMap<String,Object>readBody(BufferedReaderreader){BufferedReaderbr=null;StringBuildersb=newStringBuilder("");try{br=reader;Stringstr;while((str=br.readLine())!=null){sb.append(str);}br.close();Stringjson=sb.toString();returnJSONObject.parseObject(json,Map.class);}catch(IOExceptione){e.printStackTrace();}finally{if(null!=br){try{br.close();}catch(IOExceptione){e.printStackTrace();}}}returnnull;}publicvoidinsert(Map<String,Object>body){StringBuffersql=newStringBuffer("INSERTINTO");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()){Objectvalue=entry.getValue();if(valueinstanceofString){sql.append("'").append(entry.getValue()).append("'").append(",");}else{sql.append(entry.getValue()).append(",");}}sql.deleteCharAt(sql.length()-1);sql.append(")");("[{}]-插入操作:{}",table,sql);Queryquery=runCountSql(sql.toString());query.executeUpdate();}系统测试测试概述软件测试是软件开发完成后必须经过的一道程序,它在软件开发过程中地位十分重要,需要由专业的测试工程师来对软件进行各方面的测试,大到功能模块测试,小到代码的单元测试,这对测试工程师来说需要有足够的耐心和专业的测试方案,软件测试归根结底就是对软件的结构和功能的综合测评,需要做到结构稳定和功能正确,二者兼顾。软件测试也叫寻找系统bug的过程,世界上没有完美无缺、不存在bug的软件,只能将软件的bug降到最低最小,来追求极致。测试过程登录测试登录测试是系统最开始就要进行,测试用户能否登录,才能完成后续的功能操作。登录测试用例表如下所示。表6-1登录测试用例编号YL001程序版本1.00功能名称使用者登录测试编制人李铁蛋功能描述根据用户的登录情况测试用例目的测试用户登录情况是否正确测试项测试数据测试结果预期结果用户名为空请输入用户名请输入用户名密码为空请输入密码请输入密码用户密码组合用户名:klouse密码klouses用户与密码不匹配用户与密码不匹配用户密码组合用户名:klouse密码klouse进入系统正确的用户名和密码登录系统信息录入测试管理员在发布信息页面,通过按照预先格式发布信息,如果因为输入时候缺少相关内容,就不能发布成功,且有相应错误提示信息录入发布测试用例表如下所示。表6-1信息录入发布测试用例编号YL002程序版本1.00功能名称信息发布测试编制人李铁蛋功能描述对使用者发布或者录入信息进行测试,判断其功能是否达到预期的要求用例目的对系统使用者录入发布信息进行原型测试。测试项测试数据测试结果预期结果属性1为空请输入属性1对应的数据请输入属性1对应的数据属性2为空请输入属性2对应的数据请输入属性2对应的数据属性3为空请输入属性3对应的数据请输入属性3对应的数据全部输入数据均填入录入发布成功录入发布成功信息更新测试管理员在更新信息页面,通过按照预先格式更新信息,如果因为输入时候缺少相关内容或者更新的数据不符合当前规范的话,就不能更新成功,且有相应错误提示信息更新测试用例表如下所示。表6-1信息更新测试用例编号YL003程序版本1.00功能名称信息更新测试编制人李铁蛋功能描述对使用者更新信息进行测试,判断其功能是否达到预期的要求用例目的对系统使用者更新信息进行原型测试。测试项测试数据测试结果预期结果属性1编号:321编号更新成功编号更新成功属性2名称:名称1名称更新成功名称更新成功属性3内容:内容1234内容内容更新成功内容更新成功全部输入数据均未更改更新成功更新成功信息删除测试管理员在信息页面,通过点击数据删除按钮来删除该条数据,如果该数据和其他数据有关联,则提示是否确定删除。信息删除测试用例表如下所示。表6-1信息删除测试用例编号YL004程序版本1.00功能名称信息删除测试编制人李铁蛋功能描述对使用者删除信息进行测试,判断其功能是否达到预期的要求用例目的对系统使用者删除信息进行原型测试。测试项测试数据测试结果预期结果数据1无任何关联的数据1数据删除成功数据删除成功数据2和其他数据有关联的数据2请确认是否删除请确认是否删除测试结果在经过之前的所有的工作之后,通过对软件的测试方法、测试原则还有典型的测试用例进行全面的、深入的介绍。经过对系统的全面测试,系统目前所具有的所有功能均成功的实现并且通过了测试,整个系统实现了基于

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论