博主介绍:专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人下方有源码获取地址
开篇以一个系统实现的功能截图
医院挂号系统的功能主要分为前台用户根据自己的需求进行注册登录,浏览医生信息并对选中的医生进行挂号预约操作。后台系统管理员因职责的不同,分为医生和管理员,医生主要对挂号预约订单进行处理,而管理员主要对注册用户,资讯数据,科室详细信息,医生详细信息,挂号预约,核酸预约、核酸报告进行管理。
管理员用例图如下所示。
图3-1 管理员用例图
用户用例图如下所示。
图3-1 用户用例图
医生用例图如下所示。
图3-1 医生用例图
前台用户可分为未注册用户需求和已注册用户需求。
未注册用户的功能如下:
注册账号:用户填写个人信息,并验证手机号码。
浏览医院资讯数据:用户可以浏览主页面的医院资讯数据来了解系统的最新医院资讯数据。
浏览科室:用户可以根据科室类型浏览科室的信息,并选中某个科室查看详情,例如:科室名称、科室类别、科室图片等。
浏览医生:用户可以根据医生类型浏览医生的信息,并选中某个医生查看详情,例如:医生姓名、性别、职称、所在科室、主治症状、照片等。
已注册用户的功能如下:
登录:根据账号密码进行登录操作。
维护个人信息:用户因个人信息的变更可以随时修改自己注册信息。
挂号预约:用户根据自己的病症选中某个科室医生放出得号源进行挂号预约操作。
挂号取消:用户可以根据自己的实际情况提交挂号取消申请。
核酸预约:用户可以在线进行核酸预约。
核酸报告:用户可以查看个人的核酸检测报告。
后台可分为医生和管理员。
医生功能如下。
修改密码:管理员可以随时修改自己进入系统的登录密码,以保证系统的安全性。
挂号预约管理:处理用户提交的挂号预约信息。
对核酸预约:查看核酸预约订单信息,办理预约审核等。
患者病例:管理病人的病例信息。
管理员功能如下:
修改密码:管理员可以随时修改自己进入系统的登录密码,以保证系统的安全性。
挂号预约信息进行处理:办理挂号预约订单审核等。
科室信息管理:对科室信息进行维护,添加、删除、修改信息。
医生信息管理:对医生信息进行维护,添加、删除、修改信息。
患者病例管理:对患者病例进行维护,添加、删除、修改信息。
挂号预约管理:对患者用户系统提交的挂号,预约处理。
挂号取消管理:对患者用户系统提交的挂号取消进行审核。
资讯信息管理:发布、删除相关的资讯数据信息。
核酸报告管理:对核酸检测报告信息进行维护管理。
对系统的数据流进行分析,系统的使用者分为二类,一般用户,管理员。系统主要对界面信息传送,登录信息的验证,注册信息的接收,用户各种操作的响应做处理。
系统顶层数据流图如下图所示。
图3-2 顶层数据流图
要判断用户是是什么身份,是根据登录的数据来判断后,跳转到对应的功能界面。在系统的内部用户就可以对数据进行操作,数据库中心就可以接收到系统传输的有效数据流来对数据sql语句进行对应操作。
系统底层数据流图如下图所示。
图3-3 底层数据流图
系统可以分为前台和后台两部分,每一种操作后系统都返回操作结果。前台和后台的数据连接主要通过数据库,既分别对数据库做不同的操作。
本医院挂号系统的架构设计主要分为可以3层,主要有Web层,业务层,Model层。其中web层还包括View层和Controller层,Model层包括元数据扩展层和数据访问层。
系统架构如下图所示。
图4-1 系统架构
医院挂号系统总体分为前台用户模块和后台管理员模块。
两个模块表现上是分别独立存在,但是访问的数据库是一样的。每一个模块的功能都是根据先前完成的需求分析,并查阅相关资料后整理制作的。
综上所述,系统功能结构图如下图所示。
图4-2 系统功能结构图
资讯数据模块:可分为资讯数据浏览、资讯数据检索、资讯数据维护三个模块,管理员对资讯数据有维护的权限,发布新的资讯数据、更新已有的资讯数据等。
科室管理模块:科室管理分为科室添加、修改和科室购买。科室信息由管理员进行修改、添加、删除操作;科室购买由普通用户来执行。
医生管理模块:医生管理分为医生添加、修改和医生线上沟通。医生信息由管理员进行修改、添加、删除操作;医生线上沟通由普通用户来执行。
挂号就诊管理模块:预约就诊管理分为:就诊预约的添加、修改、提交。用户提交后医生能查询到,后台管理员对预约进行处理。
从前面可以分析到数据库中最重要的是医生信息,科室信息,挂号预约信息,同时存在患者信息。分析可以得到如下数据描述:
平台用户:用于记录用户的各种信息,包括用户名、密码、姓名、性别、地址、邮箱、联系方式等数据项。
管理员:记录管理员的登录信息。包括用户名,密码,权限等数据项。
科室:科室名称,包括科室编号、科室类别、科室图片等数据项。
医生:存储各种医生信息。包括医生工号、密码、医生姓名、性别、职称、所在科室、主治症状、照片、是否审核等数据项。
挂号预约:存储用户的挂号预约信息。包括挂号预约的订单编号、医生工号、医生名称、科室类别、挂号日期时间、预约人、是否支付、是否审核、审核回复等数据项。
由需求分析中可知,我们主要依据一下对象:系统管理员、患者、就诊预约、预约订单、就诊医生、科室分类、患者比你等来创建完整得类图,如图4-3所示。
图4-3系统类图
根据前面的数据流程图,结合系统的功能模块设计,设计出符合系统的各信息实体。
(1)前台用户实体属性图,如图4-4所示。
图4-4 前台用户实体属性图
- 科室实体属性图,如图4-5所示。
图4-5科室实体属性图
- 医生实体属性图,如图4-6所示。
图4-6医生实体属性图
- 就诊预约实体属性图,如图4-7所示。
图4-7就诊预约实体属性图
- 管理员实体属性图,图4-8所示。
图4-8管理员实体属性图
- 取消预约实体属性图,如图4-9所示。
图4-9取消预约实体属性图
- 实体联系图,如4-10所示。
图4-10实体联系图
- 基于Springboot医院挂号系统活动图,如图4-11所示。
图4-11系统活动图
医院挂号系统所拥有的数据表有以下:用户信息表,科室信息表,挂号预约表,医生信息表,医院资讯表。
由于数据表较多,只展示系统主要数据表,如下表所示。
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
group_id | mediumint | 8 | 是 | 是 | 用户组ID |
display | smallint | 4 | 是 | 否 | 显示顺序 |
name | varchar | 16 | 是 | 否 | 名称 |
description | varchar | 255 | 否 | 否 | 描述 |
source_table | varchar | 255 | 否 | 否 | 来源表: |
source_field | varchar | 255 | 否 | 否 | 来源字段: |
source_id | int | 10 | 是 | 否 | 来源ID: |
register | smallint | 1 | 否 | 否 | 注册位置: |
create_time | timestamp | 0 | 是 | 否 | 创建时间: |
update_time | timestamp | 0 | 是 | 否 | 更新时间: |
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
department_management_id | int | 11 | 是 | 是 | 科室管理ID |
department_name | varchar | 64 | 否 | 否 | 科室名称 |
department_number | varchar | 64 | 是 | 否 | 科室编号 |
picture | varchar | 255 | 否 | 否 | 图片 |
department_details | varchar | 64 | 否 | 否 | 科室详情 |
department_director | int | 11 | 否 | 否 | 科室主任 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
notice_announcement_id | int | 11 | 是 | 是 | 通知公告ID |
title | varchar | 64 | 否 | 否 | 标题 |
content | text | 0 | 否 | 否 | 内容 |
release_date | date | 0 | 否 | 否 | 发布日期 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
visit_appointment_id | int | 11 | 是 | 是 | 挂号预约ID |
visiting_doctor | int | 11 | 否 | 否 | 就诊医生 |
department | varchar | 64 | 否 | 否 | 所在科室 |
visit_time | varchar | 64 | 否 | 否 | 就诊时间 |
registration_fee | int | 11 | 否 | 否 | 挂号费 |
remaining_number_source | int | 11 | 否 | 否 | 剩余号源 |
visits | varchar | 64 | 否 | 否 | 就诊情况 |
doctor_attending | text | 0 | 否 | 否 | 医生主治 |
job_number | varchar | 64 | 否 | 否 | 工号 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
doctor_information_id | int | 11 | 是 | 是 | 医生信息ID |
doctor | int | 11 | 否 | 否 | 医生 |
name_of_doctor | varchar | 64 | 否 | 否 | 医生姓名 |
doctor_photos | varchar | 255 | 否 | 否 | 医生照片 |
department | varchar | 64 | 否 | 否 | 科室 |
title | varchar | 64 | 否 | 否 | 职称 |
visit_time | varchar | 64 | 否 | 否 | 出诊时间 |
place_of_visit | varchar | 64 | 否 | 否 | 出诊地点 |
doctor_profile | text | 0 | 否 | 否 | 医生简介 |
hits | int | 11 | 是 | 否 | 点击数 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
Hospital information_id | int | 11 | 是 | 是 | 医院资讯ID |
title | varchar | 64 | 否 | 否 | 标题 |
brief introduction | text | 0 | 否 | 否 | 简介 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
该系统是通过jdbc和MySQL达成连接的,新建一个jdbc.properties文件来填写与数据库连接所需要的驱动和参数。
jdbc.driverClass=com.MySQL.jdbc.Driver
jdbc.url=jdbc:MySQL://localhost:3306/tsi
jdbc.username=root
jdbc.password=123
第一个参数代表MySQL数据库的驱动,第二个参数代表要连接的数据库,第三个和第四个参数代表数据库连接名和密码。
后台与数据库访问主要是通过HQL语句来进行查询的,查询语句中的表名是表格的实体类名,在这种查询语句中*是不允许使用的,除非适合聚合函数一起使用才可以。
用户在填写数据的时候必须与注册页面上的验证相匹配否则会注册失败,注册页面的表单验证是通过JavaScript进行验证的,用户名的长度必须在6到18之间,邮箱必须带有@符号,密码和密码确认必须相同,你输入的密码,系统会根据你输入密码的强度给出指定的值,电话号码和身份证号码必须要求输入格式与生活相符合,当你前台验证通过的时候你点击注册,表单会将你输入的值通过name值传递给后台并保存到数据库中。
用户注册流程图如下图所示。
图5-1用户注册流程图
用户注册界面如下图所示。
图5-2用户注册界面
用户注册的关键代码如下。
* 注册
* @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;
}
-
- 登录模块的实现
主要由两部分组成,登录前的登录界面以及登录后的用户功能界面。登录界面,要求用户输入用户名和密码,当用户名和密码其中一个输入为空时,给出提示“用户名,密码不能为空”。获取用户名和密码后到数据库中查找,如果用户名存在,以及对应的密码正确,则登录成功,否则登录失败。登录失败后给出提示,并把焦点停在文本框中。登录成功后将该次会话的全局变量username设置为用户名。登录成功后进入会员的功能模块,主要有会员基本信息修改,已经发布药品信息管理,发布信息,和退出功能。退出功能是清除全局变量username的值,并跳回到首页。
登录流程图如下图所示。
图5-3登录流程图
用户登录界面如下图所示。
图5-4用户登录界面
用户登录的关键代码如下。
* 登录
* @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, "账号或密码不正确");
}
}
-
- 用户资料修改模块的实现
用户登录/注册成功之后可以修改自己的基本信息。修改页面的表单中每一个input的name值都要与实体类中的参数相匹配,在用户点击修改页面的时候,如果改后用户名与数据库里面重复了,页面会提示该用户名已经存在了,否则通过Id来查询用户,并将用户的信息修改为表单提交的数据。
如果科室信息的信息需要修改,管理员可以通过查询科室的基本信息来查询科室信息,查询科室信息是通过ajax技术来进行查询的,需要传递科室名称、编号等参数然后在返回到该页面中,可以选中要修改或删除的那条信息,如果选中了超过一条数据,页面会挑一个窗口提醒只能选择一条数,如果没有选中数据会挑一个窗口题型必须选择一条数据。当选择确认修改的时候,后台会根据传过来的id到数据库查询,并将结果返回到修改页面中,可以在修改页面中修改刚刚选中的信息当点击确认的时候from表单会将修改的数据提交到后台并保存到数据库中,就是说如果提交的数据数据库中存在就修改,否则就保存。
科室信息展示界面如下图所示。
图5-5科室信息展示界面
科室信息的关键代码如下。
@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();
}
源码 文档 下载获取地址
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者