文章目录
前言
之前发布了基于原生jsp,servelt的医院预约挂号系统的文档,这篇是基于spring boot 医院预约挂号系统的版本2,本文主要描述其中部分内容。
一、系统设计(部分)
1.1 方案比选
(1)后端框架:
系统使用了spring boot 框架进行开发,首先和原生的java ,servlet ,等技术相比,方便快捷,节省了很多时间,特别是对于一些包的支持,通过简单的添加依赖就可以自动的导入包,大大提高了开发效率。其次和其它框架相比,比如传统的spring 框架,因为Spring Boot是在Spring的基础上面搭设的框架,目的是为了简化Spring项目的搭设和开发过程,所以spring boot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程,所以非常适合快速开发应用,所以该预约挂号系统采用了spring boot 来开发。
(2)前端框架:
对于前端,采用了jQuery开发,jQuery是一个快速、简洁的JavaScript框架,基本用法和原生javascript相差不大,而且其提供了ajax技术,可以用来更新部分网页,相比之前的原生js,和html,每次提交都要更新整个页面,且处理起来比较繁琐,ajax技术很好的解决了这个问题,所以采用jQuery框架方便前端页面的构造。与另一前端框架爱Vue相比而言,jQuery技术更加符合javascript的语法,能够快速上手,所以前端采用了jQuery框架。
(3)接口设计:
采用了RESTful 风格设计接口,每一个URI代表1种资源,客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作,GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,该风格设计的接口,使前后端分离,能够高效的开发整个应用。
一、改进后的数据库部分(部分)
DROP TABLE managers IF EXISTS;
DROP TABLE doctors IF EXISTS;
DROP TABLE patients IF EXISTS;
DROP TABLE numbers IF EXISTS;
DROP TABLE applications IF EXISTS;
DROP TABLE surgeries IF EXISTS;
DROP TABLE offices IF EXISTS;
DROP TABLE informations IF EXISTS;
DROP TABLE schedules IF EXISTS;
CREATE TABLE managers (
id INTEGER IDENTITY PRIMARY KEY,
username VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL,
enabled BOOLEAN DEFAULT TRUE NOT NULL,
role VARCHAR(20) NOT NULL,
first_name VARCHAR(30),
last_name VARCHAR(30)
);
CREATE TABLE doctors (
id INTEGER IDENTITY PRIMARY KEY,
username VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL,
enabled BOOLEAN DEFAULT TRUE NOT NULL,
role VARCHAR(20) NOT NULL,
first_name VARCHAR(30),
last_name VARCHAR(30),
birth_date DATE,
sex VARCHAR(5),
office_id INTEGER NOT NULL,
);
ALTER TABLE offices ADD CONSTRAINT fk_doctors_offices FOREIGN KEY (office_id) REFERENCES doctors (id);
CREATE TABLE patients (
id INTEGER IDENTITY PRIMARY KEY,
username VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL,
enabled BOOLEAN DEFAULT TRUE NOT NULL,
role VARCHAR(20) NOT NULL,
first_name VARCHAR(30),
last_name VARCHAR(30),
birth_date DATE,
sex VARCHAR(5),
credibility INTEGER NOT NULL
);
CREATE TABLE offices (
id INTEGER IDENTITY PRIMARY KEY,
description varchar(255),
site varchar(255)
);
CREATE TABLE surgeries (
id INTEGER IDENTITY PRIMARY KEY,
office_id INTEGER NOT NULL,
site varchar(255)
);
ALTER TABLE surgeries ADD CONSTRAINT fk_surgeries_offices FOREIGN KEY (office_id) REFERENCES offices (id);
CREATE TABLE schedules (
id INTEGER IDENTITY PRIMARY KEY,
doctor_id INTEGER NOT NULL,
surgery_id INTEGER NOT NULL,
start_date Timestamp,
end_date Timestamp
);
ALTER TABLE schedules ADD CONSTRAINT fk_schedules_doctors FOREIGN KEY (doctor_id) REFERENCES doctors (id);
ALTER TABLE schedules ADD CONSTRAINT fk_schedules_surgeries FOREIGN KEY (surgery_id) REFERENCES surgeries (id);
CREATE TABLE numbers (
id INTEGER IDENTITY PRIMARY KEY,
number INTEGER NOT NULL,
schedule_id INTEGER NOT NULL,
booked BOOLEAN DEFAULT FALSE NOT NULL
);
ALTER TABLE numbers ADD CONSTRAINT fk_numbers_schedules FOREIGN KEY (schedule_id) REFERENCES schedules (id);
CREATE TABLE applications (
id INTEGER IDENTITY PRIMARY KEY,
schedule_id INTEGER NOT NULL,
start_date Timestamp,
end_date Timestamp,
checked BOOLEAN DEFAULT FALSE NOT NULL,
passed BOOLEAN DEFAULT FALSE NOT NULL
);
ALTER TABLE applications ADD CONSTRAINT fk_applications_schedules FOREIGN KEY (schedule_id) REFERENCES schedules (id);
CREATE TABLE informations (
id INTEGER IDENTITY PRIMARY KEY,
number_id INTEGER NOT NULL,
patient_id INTEGER NOT NULL,
checked BOOLEAN DEFAULT FALSE NOT NULL
);
ALTER TABLE informations ADD CONSTRAINT fk_informations_numbers FOREIGN KEY (number_id) REFERENCES numbers (id);
ALTER TABLE informations ADD CONSTRAINT fk_informations_patients FOREIGN KEY (patient_id) REFERENCES patients (id);
二、改进后的页面(部分)
系统界面采用了绿色与黑色作为主题颜色,同时使用了DIV+CSS实现了顶部导航形式的页面布局。系统在前端设计中采用了BootStrap、jQuery框架,并使用ajax技术调用服务器端RESTful API获取数据;系统的Web层基于Spring MVC并采用Thymeleaf视图解析引擎实现,其界面如下:
医生信息查询界面:
增加,修改医生信息界面:
号源信息管理界面:
医生调班申请信息管理界面:
三、后端
3.1 系统基于RESTful架构设计了API访问接口,其API定义如下:
(1)GET /api/v1/doctors?lastName= ,根据医生的lastName模糊查询医生信息
(2)POST /api/v1/doctors,添加新的医生信息
(3)PUT /api/v1/doctors,更新医生信息
(4)DELETE /api/v1/doctors/?id=3,删除医生信息
(5)GET /api/v1/numbers,根据排班日期,时间段和科室,查询医生的号源分配情况
(6)POST /api/v1/numbers,更新号源信息
(7)GET /api/v1/applications,根据科室名称,获取医生调班申请信息
3.2 服务类接口HospitalService:
public interface HospitalService {
//根据医生lastName模糊查询医生信息
public List<Doctor> findDocotrsByLastName(String lastName);
//增加医生
public void addDoctor(Doctor doctor);
//更新医生信息
public void updateDoctor(Doctor doctor);
//删除医生信息
public void deleteDoctor(int id);
//查询所有科室信息
public List<Office> getAllOffices();
//根据日期,时间段,科室名查询排班信息
public List<Schedule> getAllSchedules(String date,String specificTime,String office);
//查询所有号源信息
public List<Number> getAllNumbers();
//更新号源信息
public void updateNumber(List<Schedule> schedules);
//根据科室名获取所有调班申请信息
public List<Application> getAllApplications(String officeName);
//更新调班申请信息
public void updateApplication(Application application);
}
3.3 系统开发环境
编译器:Spring tool suite
数据库:h2数据库,采用内存式数据库
测试环境:导入整个项目,运行,访问https:localhost:8080/即可访问主页
3.4 系统测试
遇到的问题:
(1)初始化错误
解决办法:将@SpringBootTest(classes =Hospital2Application.class) 去掉就可以
测试结果:(成功运行,错误为0)
四、总结
开发中遇到的问题和难点:
(1)后端传到前端的数据,转换成json数据以后,前端页面修改成功该对象的boolean 值,但是传到后端显示没有修改成功,改成true以后,传到后端还是false,调试分析的时候发现,前端修改以后,能够打印出true,但是传到后端以后,还是变成了false,这个问题到现在还是没有解决,所以我用了字符串来代替判断,后台根据字符串的值转换成boolean值解决了该问题。
(2)在号源分配的时候,当前端页面修改号源总数的值的时候,需要判断该号源数量是大于还是小于数据库中已经被预约的最大号源,根据实际情况,当患者预约了该号源,管理员是不能再分配比该号源还小的号源总数的,这是一个难点,所以我在后台将已经被预约的号源最大值也传递到前端,当管理员修改该号源总数的时候,在前端页面校验。
开发中,每遇到一个问题,首先我是自己分析问题的原因,一步一步的排除,如果还是不能解决,则会上网搜索资料,但是网上的资料很多都不是问题的关键,所以还需要自己分辨然后找出根本原因,这样才能解决问题。做完该项目,明白了spring boot 框架的使用,以及RESTful风格的接口设计,能够快速开发应用了,同时也感觉更加贴近真实的开发了。接来就是要继续深入学习框架的学习,了解其中的原理,才能更好的熟练使用。