基于Struts2 + Hibernate + Spring的在线预约系统
1.引言
1.1编写目的
针对医院在线预约挂号系统,提供详细的设计说明,包括系统的需求、功能模块、界面设计、设计方案等,以辅助开发人员顺利进行系统的开发并让项目相关者可以对这个系统进行分析和评估。
1.2背景
在线预约挂号业务是近年来医疗机构和医疗卫生主管部门借助互联网+的东风而快速发展起来的一项新兴业务,该业务将医院传统的挂号业务与互联网技术相结合,是目前医疗信息化改革的重要内容之一。在线预约挂号能够有效地整合医疗资源,为医患双方都带来极大的好处:
对于患者而言,免去了医院现场挂号排队之苦,节省诊疗时间,能有效避免购买“号贩子”的高价“黄牛号”,节省诊疗费用,并且在就医之前就对医院、医生的基本情况有所了解,给患者带来很大的便利;
对于医院而言,能够减少挂号窗口的设置,减少挂号人员,提高了医院就诊效率,降低了日常运营和管理成本,避免挂号大厅出现人山人海的现象,美化整洁了医院环境,并能有效打击“号贩子”。
1.4术语定义及说明
1.OnlineBooking:医院在线预约挂号系统,本系统的英文名。
2.设计概述
2.1任务和目标
2.1.1需求概述
1.患者注册登陆
患者使用邮箱、密码注册成功后,便可以使用邮箱和密码登陆系统,只有患者成功注册后,才可以使用系统的在线挂号功能。
2.医院管理
能够支持多家医院。用户可以通过地区(省、市)来筛选特定地区的医院。点击某间医院链接后即可进入医院信息界面,该界面将会展示医院的图片,简介,地址,联系电话,营业时间,所开科室等详细信息。
3.科室管理
按医院:用户选好具体的医院后可在医院信息界面里选择特定的科室后即可进入科室信息界面,该界面将展示科室的介绍以及该医院本科室里的所有医生供患者选择;
按科室名:用户可以在系统主界面里通过搜索引擎或者导航搜索相应的科室,搜索结果以列表的形式展示所有包含该科室的医院。用户选好某一项进入医生管理界面选择医生。
4.医生管理、医生排班
用户在选好特定的科室后即可进入医生管理界面,该界面展示本科室中的所有医生的列表。列表的每一项包括医生的头像姓名,级别以及本周的排班情况。在排班情况这一栏中提供预约链接供用户进行在线挂号;点击医生的姓名即可进入医生的个人信息界面,该界面展示医生的姓名,头像,级别,评价,联系方式等详细信息以及医生的本周排班情况。
5.患者在线挂号
患者在医生管理界面或医生个人信息界面(成功登录的患者选择好医院、科室、医生)后通过点击预约链接即可进行在线挂号。患者可以查看挂号情况(有号/无号),选择就诊的时间段,确认账单后进入在线支付流程。
6.患者挂号账单管理
所有支付成功的挂号账单都可以在患者挂号账单管理界面里进行查看。账单分成已过期以及未过期两种。对已过期的账单只提供查看和删除操作,不予退单;而对未过期的账单(还未超过就诊时间段)提供查看和退单操作,只有当用户退单和在线退款完成后才可以删除该账单。
7.患者个人信息设置
患者可以查看个人信息(姓名、身份证号),编辑个人信息(性别、地址、联系方式),绑定支付宝账号(银行卡),为账户充值(该账户的余额可用于支付挂号费,并且用户在线退款的钱将默认转入该账户中)。
2.1.2运行需求
1.用户界面
用户界面简单直观,一目了然,给用户带来极大的便利,让用户能够简单直接的运用本系统
2.硬件接口
不需要特定的硬件或硬件接口进行支撑,一般微机均可运行。
3.软件接口
运行于Win7 或者更高版本的操作系统上。
2.1.3运行环境概述
Windows 7以上系统+Apache2.4+MySQL5.7+Chrome 浏览器
2.1.4条件与限制
基于开发资源和时间的限制,本套系统的用户只有患者这一类,关于医生管理以及医院的信息直接使用现成的数据,即并没有开发特定的界面给医生管理自己的排班等,而是一开始在数据里就为每个医生储存了不同的排班表,若想修改,只能通过后台MySQL操作。关于用户的账户余额的管理,只通过数据库的一个字段进行模拟管理,不涉及到真实的银行卡或支付宝操作。
2.1.5开发运行工具
Ø IDE: Eclipse MAR2.0 + MySQL Workbench
Ø Framework:Struts2.1 + Hibernate3.0 + Spring3.0 + JQuery1.11.3 + Bootstrap3.0 + Ajax
Ø Database:MySQL5.7
Ø Web Server:Apache Tomcat8.0
Ø Eclipse plugins:JBOSS(for Hibernate reverse tools)+XulRunner(for preview jsp files)
3.总体方案确认
3.1系统总体结构确认
系统的总体结构如图所示,整个系统采用SSH框架开发。
以下为对各个模块做简要介绍:
com.action : 各种action类的实现,主要对前台用户的请求进行处理,并且引用了com.service里所封装的服务对数据库进行操作;
com.dao : 数据库访问层,对表中的数据做增删改查(CRUD)的功能实现,需要引用com.model内的数据库模型;
com.model : POJO类,普通Java Bean,包含与数据库表一一对应的数据模型和getter、settter方法以及为了方便业务处理的用户自定义的模型;这一层里还包括Spring框架里使用的模型与Hibernate之间的映射文件(.hbm.xml)
com.service : 引用dao层,封装具体业务逻辑;
com.util : 工具类;
struts.xml : struts2配置文件,配置action的控制处理;
applicationContext.xml : spring配置文件,注入bean;
web.xml : web配置文件,配置struts2过滤器、监听器、欢迎界面、错误页面等;
index.jsp : 主页面jsp文件;
LICENSE : 项目使用协议;
README.md : 项目说明文档;
WebContent 目录下还将包含用于请求服务器和处理、展示服务器请求的各种.jsp文件,以及控制页面展示效果的CSS、JS文件和web应用所需要的图片资源等。
3.2系统详细界面划分
3.2.1应用系统与支撑系统的详细界面划分
l 支撑系统界面划分:SMTP邮件发送系统
在邮箱设置中开启SMTP服务器界面:
l 网络对应用系统的支撑方式:
1. cdn加载jquery js文件以及bootstrap等样式文件;
2. 发送用户注册激活邮件;
3. 更新spring schema。
l 数据库对应用系统的支撑方式:
用数据库驱动连接数据库,进行CRUD(增删改查操作)
l 全局数据的管理与存取方式:
在jsp页面session中存取
3.2.2系统内部详细界面划分
详细界面文件 |
功能说明 |
index.jsp |
主页:引用top-navigation.jsp和footer.jsp;展示巨幕、找医院、找科室等div界面区域 |
top-navigation.jsp |
顶部导航栏:含有主页、找医院、搜索、登录等按钮控件 |
footer.jsp |
页脚:底部版权、友链等信息 |
404.html |
页面无法找到:提供返回主页链接 |
error.jsp |
Struts Action错误界面:提供返回主页链接 |
exception.jsp |
Struts全局异常界面:提供返回主页链接 |
login.jsp |
用户登陆:提供登陆表单填写;注册链接;忘记密码链接。 |
success.jsp |
用户登陆成功:三秒自动跳转回主页 |
resetPassword.jsp |
重置密码界面:有四个输入文本框:邮箱,旧密码,新密码,确认密码。 |
search_hospital.jsp |
找医院界面:展示医院列表(每个医院只显示医院名称,地址,电话);底部有翻页按钮 |
hospital.jsp |
某个医院界面:展示某医院详细信息(概览图片,地址,电话,简介,服务);门诊科室(预约规则,科室列表) |
department.jsp |
某个医院的某个科室界面:展示该科室名称;该科室所有医生排班信息表格(科室专家,擅长,医生服务,一周班情况);对于有医生排班的时间段(上午/下午),提供预约按钮链接,点击弹出“选择预约时间段”对话框。 |
“选择预约时间段”对话框 |
展示医生姓名;预约日期(格式:2016/06/15 周三);挂号费;时间(上午/下午);时间段单选按钮组: l 若为上午,显示: 09:00-10:00 剩余票数,10:00-11:00 剩余票数,11:00-12:00 剩余票数; l 若为下午,显示: 14:00-15:00 剩余票数,15:00-16:00 剩余票数。 预约成功后跳转到“个人信息“页面。 |
userinfo.jsp |
个人信息页面:左侧含有四个栏目,自上而下是:未过期预约,已过期预约,账户设置,我的钱包;右侧是展示某个特定栏目具体内容的区域,刚进入个人信息界面时默认加载未过期预约栏目信息。 |
not_expired_order.jsp |
未过期预约界面:展示未过期预约表格:流水号,用户名,医院地址,科室,医生名,预约时间,是否过期,操作(退订)。 |
expired_order.jsp |
已过期预约界面:展示已过期预约表格:流水号,用户名,医院地址,科室,医生名,预约时间,是否过期,操作(删除)。 |
account.jsp |
账户设置界面:顶部分为三栏: l 帐号信息: 允许修改姓名、证件号、性别、出生日期、手机号码、邮箱地址字段 l 修改密码: 输入旧密码,新密码,再次输入新密码 l 修改头像: 上传本地头像图片 |
wallet.jsp |
我的钱包界面:显示当前登录用户的钱包余额,有两个按钮:充值、提现。 |
4.系统详细设计
4.1系统结构设计及子系统划分
本套系统的面向用户为患者,整个系统的结构及子系统如图所示:
4.2系统功能模块详细设计
Ø 登录模块
描述:处理用户登陆逻辑
IPO图:
Ø 注册模块
描述:处理用户注册逻辑
IPO图:
Ø 找医院模块
描述:处理找医院逻辑
功能分析:用户通过点击主页所列举的医院链接跳转到特定的医院界面,医院界面展示医院的详细信息以及医院所具有的科室。主页上所展示的医院均由查找数据库获得,医院界面的信息由界面请求数据库或者直接从界面缓存获得。
Ø 找科室模块
描述:处理找科室逻辑
功能分析:用户通过点击主页所列举的科室链接跳转到特定的科室界面;或者点击医院信息界面所列举的科室链接直接进入科室界面。主页上所展示的科室均由查找数据库获得。科室界面里将展示科室的详细信息以及本科室具有的医生。
Ø 找医生模块
描述:处理找医生逻辑
功能分析:用户只有在确定好医院和科室的前提下才能找医生。用户可以点击科室界面查看该科室的所有医生。医生具有级别,挂号费等重要信息,根据医生的级别不同,挂号费也不同。找医生流程为:用户登陆→找医院→找科室→科室界面选择医生。
Ø 在线预约模块
描述:实现在线预约功能
功能分析:用户可查看医生的可预约的时间段已经剩余放号数,并进行点击预约。用户在线挂号预约流程:用户登陆→用户通过主页链接寻找医院/科室→在医生信息页面选择预约具体时间段进行预约→确认预约→模拟在线支付→预约完成。
输入:用户通过选好医生、预约时间段后点击确认将医生id、用户id、预约时间段提交到后台。
处理:(以下三点为一个事务,只允许全部成功或全部失败)
1.后台通过医生id查询医生的排班表,并根据用户的预约时间段把医生的该时间段放号数减1;
2.使用用户id 查询用户账户余额,若还有余额则扣取相应的挂号费,否则直接预约失败;
3.若第2步成功则往用户账单表新增一条订单记录。
输出:用户预约成功或者预约失败。
Ø 用户订单管理模块
描述:实现用户管理订单的功能
功能分析:用户可在订单管理界面进行订单的管理,包括查看所有订单,退单,删除过期订单。
Ø 删除管理模块
描述:实现用户删除订单的功能
功能分析:用户可在订单管理界面删除订单。注意:只有过期的订单才可以删除。过期的订单是指那些当前的时间已经超过用户所预约的看病时间的订单。
输入:用户选中要删除的订单,点击“删除”按钮把用户id、订单id提交到后台;
处理:后台通过用户id、订单号查到具体的订单,判断订单是否过期,过期则删除,否则提醒用户不可删除。
Ø 退单模块
描述:实现用户退单的功能
功能分析:用户可在订单管理界面进行退单。注意:只有仍未过期的订单才可以退单。未过期的订单是指那些当前的时间还没有超过用户所预约的看病时间的订单。已经过期的订单不可以退单。
输入:用户选中要取消的订单,点击“退订”按钮把用户id、订单id提交到后台;
处理:(以下三点为一个事务,只允许全部成功或全部失败)
1.后台通过用户id、订单号查到指定的订单,判断是否过期,如果过期,直接退单失败,否则进入退单流程。注意:以下三个流程为一个事务,只允许全部成功或全部失败;
2.通过查取订单信息里的医生id并通过医生id查询医生的排班表,并根据用户的预约时间段把医生的该时间段放号数加1;
3.使用用户id 查询用户账户余额,给账户余额加上挂号费;
4.把订单表的这条订单删除。
输出:用户成功取消订单并退费成功。
Ø 用户信息设置模块
描述:实现用户设置个人信息的功能
功能分析:用户在个人信息界面更新或设置邮箱,密码,性别,出生年月等。
输入:含更新内容的用户信息表单;
处理:后台更新用户表相应字段。
Ø 找回密码模块
描述:实现用户找回密码的逻辑
功能分析:用户在登陆界面点击“忘记密码”链接进入找回密码流程:用户点击忘记密码à输入邮箱帐号à系统发送重置密码邮件à用户登陆邮箱à点击链接à输入两次新密码à成功重置密码。
4.3系统界面详细设计
4.3.1外部界面设计
外部接口:
l 数据库连接:http://127.0.0.1:3306/onlinebooking
l SMTP邮件服务器:http://smtp.126.com:25 (说明:需要自行配置)
4.3.2内部界面设计
本系统的基本设计概念:MVC开发模式, Struts进行流程控制,Spring进行业务流转,Hibernate进行数据封装。
l struts.xml : struts2配置文件,配置action的控制处理;
l applicationContext.xml : spring配置文件,注入bean;
l web.xml : web配置文件,配置struts2过滤器、监听器、欢迎界面、错误页面等。
PreView
主页
医院
科室
确认订单
用户信息
更多截图在art文件夹
Dev Tools and Technologies
- IDE: Eclipse MAR2.0 + MySQL Workbench
- Framework:Struts2.1 + Hibernate3.0 + Spring3.0 + JQuery1.11.3 + Bootstrap3.0 + Ajax
- Database:MySQL5.7
- Web Server:Apache Tomcat8.0
- Eclipse plugins:JBOSS(for Hibernate reverse tools)+XulRunner(for preview jsp files)
How to Start
1.导入项目到eclipse IDE.
2.在MySQL新建onlinebooking数据库
导入onlinebooking_final.sql执行,确保数据准备成功
3.配置Apache Tomcat服务器
建议使用Tomcat8.0+版本
4.配置SMTP邮箱服务器
在src/com.util.SendEmail.java文件中配置发送邮件服务,推荐使用163或者126邮箱
public static final String HOST = "smtp.XXXX.com";
...
public static final String FROM = "";//your email
public static final String PWD = "";//your email password
同时,在上述你所填的邮箱中,请自行到设置中开启SMTP。
如果不进行这一步,那么无法进行用户注册激活,只能使用数据库已存在的测试帐号登陆这个在线预约系统,测试账号如下:
帐号名:1234@qq.com
密码:111111
5.配置数据库连接数据库是onlinebooking
在WebContent/WEB-INF/applicationContext.xml
中配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/onlinebooking">
</property>
<property name="username" value="your-account"></property>
<property name="password" value="your-password"></property>
</bean>
6.部署运行
请务必保证联网环境,否则项目无法启动。
正常预约流程:主页
->用户登陆
->找医院
->选择某医院
->在某医院中选择某科室
->在科室列表点击某医生预约按钮
->选择预约时间段
->付费成功
->跳转到个人信息界面
:
- 未过期预约:可以退订
- 已过期预约:可以删除
- 我的信息:可以完善或者修改个人信息
- 我的钱包:查看余额
TODO
- [功能]用户退出登录
- [功能]找科室
- [功能]搜索查找医院、科室
- [功能]用户信息修改
- [完善]将主页->找医院->找科室关于Action部分的前端逻辑重写,使用findHospitalById和 findDepartmentById减少数据请求量
Issue
- #1[隐患]hospistal数据库表使用了describe保留字段,写操作会报错(虽然暂时没有写操作)
- #2[缺陷]医生如果在当天有排班,即使预约时间已过期,仍然可以进行预约
- #3断网情况下该项目无法部署运行,原因是:applicationContext.xml中spring版本http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 与jar包版本spring2.+不对应,必须联网更新schema