网上预约挂号系统的设计与实现
Posted 程序猿麦小七
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网上预约挂号系统的设计与实现相关的知识,希望对你有一定的参考价值。
项目描述
临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问题,今天给大家介绍一篇网上预约挂号系统的设计与实现。
功能需求
医院预约挂号平台需要各种数据的应用和管理,本系统将以mysql作为数据库,利用开发工具来设计数据库,包括各种表的建立(医生信息表,患者信息表,科室信息表,预约挂号时间表等,以及各个表之间的联系等。)
每个系统需要管理员进行管理,设置用户,所以这里将设置一个用户管理模块,实现对用户的管理,所有权负责人有权预约信息管理员和预约人进行添加、修改和删除,以及查看用户的资料等。
为了提供医生资料的详细信息,专门有功能提供医生资料的输入及管理。
患者资料的录入方便了系统对患者相关资料的管理。
为了方便医生的查找,患者可通过输入医生姓名或所需要预约挂号的科室查找所求的医生,并且选择日期进行预约。
管理员根据医生的工作时间,设置患者可以预约到医生的时间,患者须在该时间段选择预约医生的日期和具体时间段。
具备以下功能:
用户模块:
(1)登录注册:需要就诊的用户浏览医院介绍信息,有需要预约挂号的可以通过通过注册后登陆进行预约操作。
(2)预约挂号:用户通过选择科室信息,选择需要就诊的医生挂号。
(3)科室查询:用户可以通过科室风采进入科室列表页,查看科室信息。
(4)预约信息:用户可以查看所有预约信息记录,对需要处理的预约记录进行操作。
(5)个人信息:重置密码、个人基本信息修改、消息提醒。
医师模块:
(1)登录功能:医生可以通过分配账号登录进入系统。
(2)个人信息:医生可以对平台录入信息进行修改。
(3)医生排班:根据科室、排班日期、医生姓名查看排班情况。
(4)预约信息:医生可以查看所有用户的历史预约情况,根据患者信息查看当日预约情况进行处理操作。
管理员模块:
(1)管理员登录:为了安全考虑,管理员通过账号密码登录进入后台系统。
(2)预约管理:用户预约记录删除、处理、修改、详情查看。
(3)科室信息:网上预约挂号系统设计的所有科室统一管理。
(4)医生管理:可以查看系统中所有可以挂号的医生,可以统一添加、删除、修改等操作。
(5)用户管理:用户界面主要实现平台所有用户的管理。
系统总体设计
在这里插入图片描述](https://img-blog.csdnimg.cn/60c44242975d446eb4470e59edeb8e91.png)
部分效果图
数据库设计
系统中用到了11张表,针对每个表都进行了设计,下面对部分核心表进行汇总罗列展示。
部分代码
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/hospital?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
mvc:
view:
prefix: /
suffix: .html
hiddenmethod:
filter:
enable:true
# static-path-pattern: classpath:/resources/,classpath:/static/,classpath:/templates/
kafka:
bootstrap-servers: localhost:9092 #????ip?????????????????????
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: yhtest #???????id
enable-auto-commit: true
auto-commit-interval: 1000
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
mybatis:
mapper-locations: classpath:generator/*.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<package name="com.example.HIS.models"/>
</typeAliases>
<typeHandlers>
<typeHandler handler="com.example.HIS.type.EnabledTypeHandler"
javaType="com.example.HIS.type.Enabled"/>
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNSCHOOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/hospital"/>
<property name="username" value="root"/>
<property name="password" value="hyy.499622"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.example.HIS.generator"/>
</mappers>
</configuration>
安装部署需求
eclipse、idea运行启动
系统部署
系统开发后,在生产环境配置项目运行环境,具体步骤如下:
安装linux或者windows10操作系统;
安装JDK1.8并配置环境变量;
安装MySQL5.7版本以上版本数据库,创建数据库并执行脚本创建表;
在IDEA中编辑进行打包;
下载并配置Tomcat8.0服务器,配置系统服务,上传项目打包文件
本项目用到的技术和框架
1.开发语言:Java
2.开发模式:B/S
3.数据库:MySQL
4.框架:jsp+springboot+mybatis
本项目中的关键点
此系统的开发采用java语言开发,基于B/S结构,这些开发环境使系统更加完善。使用到的工具和技术都是开源免费的。
环境工具
开发工具 Eclipse/IDEA
语言 JDK1.8 、jsp、CSS、springboot、mybatis
硬件:笔记本电脑;
软件:Tomcat8.0 Web服务器、Navicat数据库客户端、MySQL;
操作系统:Windows 10;
其它软件:截图工具、常用浏览器;
以上是本系统的部分功能展示,如果你的选题正好相符,那么可以做毕业设计或课程设计使用。
基于SSM+Layui实现医院预约挂号系统
项目编号:BS-YL-010
基于SSM的医院在线预约挂号平台。前端使用layui框架。分为管理员、医生、患者三个角色,功能完善。适合练习java web开发,也可以用作课程设计和毕业设计。
运行环境
jdk8+tomcat9+mysql+IntelliJ IDEA+maven
项目技术(必填)
spring+spring mvc+mybatis+layui+jquery
下面展示一下系统的部分功能:
管理员登陆
我的面板: 主要包含个人信息查看、修改密码、登陆日志
医生管理
患者管理
公告管理
科室管理
用户注册
患者登陆
查看我的预约
患者信息管理
预约医师
医生登陆
查看预约患者
接诊管理
添加诊断病历
病历管理
个人信息管理
查看医院公告
package com.zhang.hospital.service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhang.hospital.dao.AdminDao;
import com.zhang.hospital.dao.MenuDao;
import com.zhang.hospital.dao.RoleDao;
import com.zhang.hospital.dao.RoleMenuDao;
import com.zhang.hospital.entity.*;
import com.zhang.hospital.util.EncryptUtil;
import com.zhang.hospital.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.ParseException;
import java.util.*;
@Service
@Transactional
public class AdminServiceImpl implements AdminService
@Autowired
private AdminDao adminDao;
@Autowired
private RoleMenuDao roleMenuDao;
@Autowired
private MenuDao menuDao;
@Autowired
private RoleDao roleDao;
//登录
@Override
public Admin login(String username, String password)
return adminDao.login(username,password);
//记录登录记录
@Override
public void insAdminLog(String username, String loginIp, Date loginTime,Date logoutTime,Integer isSafeExit)
adminDao.insAdminLog(username,loginIp,loginTime,logoutTime,isSafeExit);
//根据id查询admin
@Override
public Admin getAdminById(Integer id)
return adminDao.getAdminById(id);
//*******Menu相关的一些***//
@Override
public List<Menu> getMenus(Admin admin)
List<Menu> menuList=new ArrayList<>();
Long roleId=admin.getRoleId();
List<RoleMenu> roleMenus=roleMenuDao.selMenusByRoleId(roleId);
//rolemenu里面就是一个中间表 将两个字段 roleId、 menuId 关联起来
if(roleMenus!=null&&roleMenus.size()>0)
List<Menu> noChildrenMenus=new ArrayList<>();
for(int i=0;i<roleMenus.size();i++)
Menu menu=menuDao.getMenuById(roleMenus.get(i).getMenuId()); //获取rolemenu中的menuId
noChildrenMenus.add(menu); //就是根据这个登陆者的roleid 所拥有的菜单取出来
for(int i=0;i<noChildrenMenus.size();i++)
if(noChildrenMenus.get(i).getParentId()==0)
//说明这个菜单是一级菜单 没有上一级菜单
//如果这里不为0 表示这个菜单是二级菜单 或者三级菜单 ParentId对应了属于哪个上级菜单
Menu menu=new Menu();
menu=noChildrenMenus.get(i); //把这个一级菜单取出来
List<Menu> menus=new ArrayList<>();
for(int j=0;j<noChildrenMenus.size();j++) //把所有菜单过一遍
//如果有菜单属于这个一级菜单
if(noChildrenMenus.get(j).getParentId()==noChildrenMenus.get(i).getMenuId())
Menu menu2=new Menu();
menu2=noChildrenMenus.get(j);//取出这个二级菜单
menus.add(menu2);
menu.setChildren(menus); //存放了属于这个一级菜单的所有二级菜单
menuList.add(menu);//存放了所有的一级菜单和其对应的所有二级菜单
//下面是根据menu的sorting进行排序 升序排列 这样左侧菜单就会按照升序排列
Collections.sort(menuList, new Comparator<Menu>()
@Override
public int compare(Menu o1, Menu o2)
return o1.getSorting().compareTo(o2.getSorting());
);
return menuList;
@Override
public ResultUtil getAdminList(Integer page, Integer limit)
//mybatis分页插件
PageHelper.startPage(page,limit); //默认传过来的是1 和10
//在需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,
// 紧跟在这个方法后的第一个Mybatis查询方法会被进行分页。
List<Admin> admins=adminDao.getAdminsList();
//底层的sql语句是select * from admin order by id
//这里因为是sqlserver2012的新特性 分页查询的时候 必须要加上 order by
// 前面有startPage 自动加上了分页查询的语句
// Tomcat Localhost Log 会输出错误信息
for(Admin admin:admins)
List<Role> roles=roleDao.selRoles();//取出所有的角色
for(Role role:roles)
if(role.getRoleId()==admin.getRoleId())
admin.setRoleName(role.getRoleName());
//这里查出管理员中的roleID然后设置下roleName
PageInfo<Admin> pageInfo=new PageInfo<Admin>(admins);
ResultUtil resultUtil=new ResultUtil();
resultUtil.setCode(0);//前段接收为0 代表成功
resultUtil.setCount(pageInfo.getTotal());//代表数据库中总条数
resultUtil.setData(pageInfo.getList()); //根据上面startPage设置的第几页 每页多少条 查询出的数据
return resultUtil;
@Override
public List<Role> getRoles()
return roleDao.selRoles();
@Override
public ResultUtil getRoles(Integer page, Integer limit)
PageHelper.startPage(page,limit);
List<Role> roles=roleDao.selRoles();
PageInfo<Role> pageInfo=new PageInfo<Role>(roles);
ResultUtil resultUtil=new ResultUtil();
resultUtil.setCode(0);
resultUtil.setCount(pageInfo.getTotal());
resultUtil.setData(pageInfo.getList());
return resultUtil;
@Override
public void updAdmin(Admin admin)
adminDao.updAdmin(admin);
@Override
public void delAdminById(Long id)
adminDao.delAdminById(id);
@Override
public Admin getAdminByUsername(String username)
return adminDao.getAdminByUsername(username);
@Override
public void insAdmin(Admin admin)
admin.setPassword(EncryptUtil.encrypt(admin.getPassword()));//加密
adminDao.insAdmin(admin);
@Override
public void delRole(Long roleId)
roleDao.delRole(roleId);
@Override
public Role getRoleById(Long roleId)
return roleDao.getRoleById(roleId);
//根据角色展示菜单
@Override
public List<Menu> getXtreeData(Long roleId)
List<Menu> allMenus=menuDao.getAllMenus(); //获得所有的菜单
if(!roleId.equals(Long.valueOf("-1")))//不是-1
List<RoleMenu> roleMenus=roleMenuDao.selMenusByRoleId(roleId); //选出此角色对应的菜单
for(Menu menu:allMenus) //遍历所有菜单
for(RoleMenu roleMenu:roleMenus)
if(roleMenu.getMenuId()==menu.getMenuId())
menu.setChecked("true"); //将所有菜单中 此角色有的菜单
// 设置为true状态 前面权限树,会体现出选中状态
//ztree会检查返回的数据中有没有 checked 属性 如果为true就会把这个节点设为选中状态
return allMenus;
@Override
public Role getRoleByRoleName(String roleName)
return roleDao.getRoleByRoleName(roleName);
@Override
public void updRole(Role role, String m)
roleDao.updateByKey(role);
roleMenuDao.deleteMenusByRoleId(role.getRoleId()); //把roleId对应的菜单都删除
if(m!=null&&m.length()!=0)
String [] result=m.split(",");
//重新赋予权限
if(result!=null&&result.length>0)
for(int i=0;i<result.length;i++)
RoleMenu roleMenu=new RoleMenu();
roleMenu.setMenuId(Long.parseLong(result[i]));
roleMenu.setRoleId(role.getRoleId());
//插入一条数据
roleMenuDao.insert(roleMenu);
@Override
public void insRole(Role role, String m)
roleDao.insertRole(role); //插入一条新数据
Role role2=roleDao.selectRoleByRoleName(role.getRoleName()); //把新插入的读出来
if(m!=null&&m.length()!=0)
String [] result=m.split(",");
if(result!=null&&result.length>0)
for(int i=0;i<result.length;i++)
RoleMenu roleMenu=new RoleMenu();
roleMenu.setMenuId(Long.parseLong(result[i]));
roleMenu.setRoleId(role2.getRoleId());
roleMenuDao.insert(roleMenu);
@Override
public List<Menu> getAllMenus()
return menuDao.getAllMenus();
@Override
public void updMenuSortingById(Menu menu)
Menu menu1=menuDao.getMenuById(menu.getMenuId()); //更新对象之前 先读出来
menu1.setSorting(menu.getSorting()); //设置新的排序
menuDao.updateMenuByKey(menu1); //更新
@Override
public Menu getMenuById(Long menuId)
return menuDao.getMenuById(menuId);
@Override
public List<Menu> checkNameSameLevel(Menu menus)
return menuDao.checkNameSameLevel(menus);
@Override
public void insMenu(Menu menus)
menuDao.insMenu(menus);
@Override
public void updMenu(Menu menus)
menuDao.updateMenu(menus);
@Override
public List<Menu> getMenusByParentId(Long menuId)
return menuDao.getMenuByParentId(menuId);
@Override
public void delMenuById(Long menuId)
menuDao.delMenuById(menuId);
roleMenuDao.deleteMenuByMenuId(menuId);
@Override
public List<RoleMenu> getRoleMenuByMenuId(Long menuId)
return roleMenuDao.getRoleMenuByMenuId(menuId);
@Override
public AdminLog getAdminLogByUsername(String username)
return adminDao.getAdminLogByUsername(username);
@Override
public void updateAdminLog(AdminLog adminLog)
adminDao.updateAdminLog(adminLog);
@Override
public AdminLog getAdminLogByLoginTime(Date loginTime)
return adminDao.getAdminLogByLoginTime(loginTime);
@Override
public ResultUtil getAdminLogList(Integer page, Integer limit) throws ParseException
List<AdminLog> adminLogList=new ArrayList<>();
//带分页的查询 sql server 中 select 语句必须有 order by
PageHelper.startPage(page,limit);
List<AdminLog> adminLogs=adminDao.getAdminLogsList();
PageInfo<AdminLog> pageInfo=new PageInfo<>(adminLogs);
ResultUtil resultUtil=new ResultUtil();
resultUtil.setCode(0);
resultUtil.setCount(pageInfo.getTotal()-1); //不显示最后一条数据
//不显示最后一条登陆信息 因为是正在登陆
adminLogList.addAll(pageInfo.getList().subList(0,pageInfo.getList().size()-1));
resultUtil.setData(adminLogList);
return resultUtil;
package com.zhang.hospital.service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhang.hospital.dao.MenuDao;
import com.zhang.hospital.dao.RoleMenuDao;
import com.zhang.hospital.dao.UserDao;
import com.zhang.hospital.entity.*;
import com.zhang.hospital.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@Service
@Transactional
public class UserServiceImpl implements UserService
@Autowired
private UserDao userDao;
@Autowired
private RoleMenuDao roleMenuDao;
@Autowired
private MenuDao menuDao;
@Override
public void insUser(User user)
userDao.insUser(user);
@Override
public User login(String username, String password)
return userDao.login(username,password);
@Override
public List<Menu> getMenus(User user1)
List<Menu> menuList=new ArrayList<>();
Long roleId=user1.getRoleId();
List<RoleMenu> roleMenus=roleMenuDao.selMenusByRoleId(roleId);
//rolemenu是一个中间表 两个字段 roleId menuId 关联起来
if(roleMenus!=null&&roleMenus.size()>0)
List<Menu> noChildrenMenus=new ArrayList<>();
for(int i=0;i<roleMenus.size();i++)
Menu menu=menuDao.getMenuById(roleMenus.get(i).getMenuId()); //获取rolemenu中的menuId
noChildrenMenus.add(menu); //根据登陆者的roleid 所拥有的菜单取出来
for(int i=0;i<noChildrenMenus.size();i++)
if(noChildrenMenus.get(i).getParentId()==0)
//说明这个菜单是一级菜单 没有上一级菜单
//如果这里不为0 表示这个菜单是二级菜单 或者三级菜单 ParentId对应了属于哪个上级菜单
Menu menu=new Menu();
menu=noChildrenMenus.get(i); //把这个一级菜单取出来
List<Menu> menus=new ArrayList<>();
for(int j=0;j<noChildrenMenus.size();j++) //把所有菜单过一遍
//如果有菜单属于这个一级菜单
if(noChildrenMenus.get(j).getParentId()==noChildrenMenus.get(i).getMenuId())
Menu menu2=new Menu();
menu2=noChildrenMenus.get(j);//取出这个二级菜单
menus.add(menu2);
menu.setChildren(menus); //存放了属于这个一级菜单的所有二级菜单
menuList.add(menu);//存放了所有的一级菜单和其对应的所有二级菜单
//下面是根据menu的sorting进行排序 升序排列 这样左侧菜单就会按照升序排列
Collections.sort(menuList, new Comparator<Menu>()
@Override
public int compare(Menu o1, Menu o2)
return o1.getSorting().compareTo(o2.getSorting());
);
return menuList;
@Override
public User getUserById(Integer user_id)
return userDao.getUserById(user_id);
@Override
public ResultUtil updateUser(User user)
userDao.updateUser(user);
return ResultUtil.ok();
@Override
public User getUsertByUserName(String username)
return userDao.getUserByUserName(username);
@Override
public ResultUtil getAllUserList(Integer page, Integer limit, UserSearch search)
PageHelper.startPage(page,limit);
List<User> users=userDao.getAllUserList(search);
PageInfo<User> pageInfo=new PageInfo<>(users);
ResultUtil resultUtil=new ResultUtil();
resultUtil.setCode(0);
resultUtil.setCount(pageInfo.getTotal());
resultUtil.setData(pageInfo.getList());
return resultUtil;
@Override
public ResultUtil updateUserStatusById(int user_id, int status)
userDao.updateUserStatusById(user_id,status);
return ResultUtil.ok();
@Override
public ResultUtil deleteUserById(int user_id)
userDao.deleteUserById(user_id);
return ResultUtil.ok();
以上是关于网上预约挂号系统的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章
基于java+ssm医院门诊预约挂号排班系统-计算机毕业设计
基于SSM的医院门诊预约挂号系统的设计与实现(文末附源码论文)
java基于微信小程序的医院核酸检测预约挂号系统+springboot+uinapp+Mysql+计算机毕业设计