SpringBoot医院管理系统设计与实现
作者:mmseoamin日期:2023-12-11

  博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌

项目名称

SpringBoot医院管理系统设计与实现

视频演示

SpringBoot医院管理系统设计与实现_哔哩哔哩_bilibili

系统介绍

医院管理系统设计与实现

摘        要

随着信息技术的快速发展,医院管理系统已逐渐成为提高医疗服务质量和效率的重要工具。本文首先对医院管理系统进行了需求分析,深入了解医院的业务流程以及管理要求。在此基础上,设计实现了一套功能全面且易用的医院管理系统,涵盖了个人信息管理、员工管理、考勤管理、请假管理、部门管理等关键功能模块。医院管理系统的意义在于通过引入信息技术手段,使医院管理更加高效、便捷、透明,为医院的管理者和患者提供更好的服务。具体包括以下几个方面:提高工作效率:医院管理系统可以自动化地处理大量数据,减少了手动操作的工作量,提高了医院工作效率。方便患者就医:医院管理系统可以通过互联网实现患者在线挂号、预约就诊、查询检查报告等服务,方便了患者的就医体验,有利于医院信息化水平的提高,为推进国家医疗卫生信息化建设提供了有力支持[1]。

本研究采用了先进的技术框架和设计思路,如SSM框架、JSP技术和MySQL技术,确保了系统的稳定性和可维护性。通过对不同角色的用户进行权限细分,使得系统具备良好的管理和维护能力,从而提高医院内部管理效率,降低人工操作成本。。在数据库设计方面,我们选择了MySQL数据库,因为它已经发展得相当健壮和成熟,具有良好的安全性和简便的操作,成为开发数据库设计的首选[2]。

本文成功实现了一套适用于医院的管理系统,为医院提供了一种有效的信息化管理手段。在实际应用中,该系统有助于提高医疗服务质量和效率,使医院能够更好地为患者提供服务。未来,随着技术和医疗行业的不断发展,医院管理系统还需不断优化和升级,以满足日益增长的需求。该系统完整实现了医院治疗流程中的管理、患者药品分配、患者手术项目、住院等业务。总体测试结果显示,该网站设计基本满足用户需求,能够达到用户满意度[3]。

关键词:医院管理;门诊挂号管理;B/S;SSM 技术

在许多医疗机构中,尤其是中小型医疗机构,内部信息化管理水平较低,导致医院临床信息和业务流程的数据主要依赖纸质记录。这种方式容易导致数据丢失,给医院带来严重损失。此外,医院的挂号、收费、药房、药库、科室和病床信息管理也存在诸多问题,无法为患者提供完整、高效的临床信息服务。这些问题不仅导致治疗效果受到影响,而且错过最佳治疗时期,给患者带来严重的后果。因此,建立医院信息化管理系统成为迫切的需求。

医院信息化管理系统作为一种集医学、信息、管理等多种学科的综合系统,旨在实现更现代化、科学化、规范化的手段来加强医院管理,提高工作效率,改进医疗质量。通过将人力资源、业务流程与专业技术进行有效整合,系统有助于提升医院管理效果,使得患者得到及时、优质的治疗和服务。

为了实现这一目标,医院需要投入资源,开发并实施一套全面的信息化管理系统。这套系统应覆盖医院的各个业务领域,包括挂号、收费、药房、药库、科室和病床等信息管理,以确保患者临床信息的完整保存和高效查询。通过实施医院信息化管理系统,医疗机构可以克服现有问题,提高医疗服务质量,为患者提供更好的治疗体验达到以上规定的系统软件主要包含下列模块。

  • 基础数据管理模块:此模块负责管理员对系统的菜单、用户、角色等系统服务的管理。同时,管理医院的统计信息、科室、医生、仓库、计量单位等基础信息,以及医院排班和仓库管理。
  • 门诊管理模块:门诊管理模块主要由门诊管理员负责,涵盖用户挂号、处方划价、项目划价、药品缴费和门诊患者管理等功能。
  • 住院管理模块:住院管理模块为住院管理员提供入院登记、缴费管理、全身检查、药品记账、项目记账和出院结算等功能,以便对住院患者的相关信息进行高效管理。
  • 药房管理模块:药房管理员负责医院药房的管理,包括门诊取药和住院取药两个主要功能,确保药品的正确发放和药品库存的有效管理系统功能需求图如下图 3-1 所示。

    图 3-1  系统功能需求图

    3.1.2 基础数据模块

    • 系统管理:管理员负责对菜单管理、角色管理和用户进行管理,确保系统各项功能的正常运行。
    • 统计管理:管理员可以查看各类统计数据,包括门诊月度统计、住院月度统计、门诊年度统计、住院年度统计、医生统计对比和门诊当天收入,以便对医院运营情况进行全面了解。
    • 数据中心:此模块使管理员能够对医院基础信息进行管理,涉及科室中心、医生列表、药品产地、项目大类、挂号类型、仓库、经办人、计量单位、供货商、药品分类和药品字典等内容,确保医院数据的完整性和准确性。基础数据模块图如图 3-2 所示。

      图 3-2   医院基础数据管理模块图

      3.1.3 门诊管理模块

      1. 用户挂号:患者在本系统中进行挂号并查看挂号列表。
      2. 处方划价:门诊管理员为患者选择药品并填写病因,以便进行药品划价。
      3. 项目划价:门诊管理员为患者选择手术项目,以便进行项目划价。
      4. 项目缴费:门诊管理员处理患者的手术项目缴费事宜。
      5. 项目检查:门诊管理员对患者进行检查,确保患者的健康状况符合手术要求。
      6. 药品缴费:门诊管理员处理患者的药品缴费事宜,确保患者能够顺利获取所需药品。
      7. 门诊患者库:门诊管理员管理门诊患者列表,确保患者信息的准确性和完整性。

      门诊管理模块图如图3-3 所示。

      图3-3  门诊管理模块图

      3.1.4 住院管理模块

      1. 入院登记:住院管理员负责患者的入院登记,确保患者信息准确无误。
      2. 缴费管理:住院管理员负责患者的预交费管理,确保患者按时缴纳医疗费用。
      3. 全身检查:住院管理员对患者进行全面检查,以评估患者的健康状况和治疗需求。
      4. 药品记账:住院管理员对患者使用的药品进行记账,确保患者药品费用的准确性。
      5. 项目记账:住院管理员对患者接受的手术项目进行管理,确保项目费用的准确性。
      6. 出院结算:住院管理员负责患者的出院结算,确保患者完成所有医疗费用结算。

      住院管理模块功能图如图 3-5 所示。

      图 3-5 住院管理模块功能图

      3.1.5 药房管理模块

      1. 入院登记:药房管理员对医院药品进行管理。
      2. 缴费管理:药房管理员进行门诊患者取药。
      3. 全身检查:药房管理员进行住院患者取药。

      药房管理模块功能图如图 3-6 所示。

      图 3-6 药房管理模块功能图

      环境需要

      1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。

      2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;

      3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可

      4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 

      5.数据库:MySql 5.7版本;

      6.是否Maven项目:否;

      技术栈

      1. 后端:Spring+SpringMVC+Mybatis

      2. 前端:JSP+CSS+JavaScript+jQuery

      使用说明

      1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;

      2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;

      若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;

      3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;

      4. 运行项目,在浏览器中输入http://localhost:8080/ 登录

      运行截图

       用户管理控制层:

      package com.houserss.controller;
      import javax.servlet.http.HttpSession;
      import org.apache.commons.lang3.StringUtils;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.bind.annotation.ResponseBody;
      import com.houserss.common.Const;
      import com.houserss.common.Const.Role;
      import com.houserss.common.ServerResponse;
      import com.houserss.pojo.User;
      import com.houserss.service.IUserService;
      import com.houserss.service.impl.UserServiceImpl;
      import com.houserss.util.MD5Util;
      import com.houserss.util.TimeUtils;
      import com.houserss.vo.DeleteHouseVo;
      import com.houserss.vo.PageInfoVo;
      /**
       * Created by admin
       */
      @Controller
      @RequestMapping("/user/")
      public class UserController {
          @Autowired
          private IUserService iUserService;
          /**
           * 用户登录
           * @param username
           * @param password
           * @param session
           * @return
           */
          @RequestMapping(value = "login.do",method = RequestMethod.POST)
          @ResponseBody
          public ServerResponse login(User user,String uvcode, HttpSession session){
              String code = (String)session.getAttribute("validationCode");
              if(StringUtils.isNotBlank(code)) {
                  if(!code.equalsIgnoreCase(uvcode)) {
                      return ServerResponse.createByErrorMessage("验证码不正确");
                  }
              }
              ServerResponse response = iUserService.login(user.getUsername(),user.getPassword());
              if(response.isSuccess()){
                  session.setAttribute(Const.CURRENT_USER,response.getData());
              }
              return response;
          }
        
          
          
      }
      

      管理员管理控制层:

      package com.sxl.controller.admin;
      import java.util.List;
      import java.util.Map;
      import javax.servlet.http.HttpServletRequest;
      import org.springframework.http.ResponseEntity;
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      import com.sxl.controller.MyController;
      @Controller("adminController")
      @RequestMapping(value = "/admin")
      public class AdminController extends MyController {
      	
      	@RequestMapping(value = "/index")
      	public String frame(Model model, HttpServletRequest request)throws Exception {
      		return "/admin/index";
      	}
      	
      	@RequestMapping(value = "/main")
      	public String main(Model model, HttpServletRequest request)throws Exception {
      		return "/admin/main";
      	}
      	
      	@RequestMapping(value = "/tj1")
      	public String tj1(Model model, HttpServletRequest request)throws Exception {
      		String sql="select DATE_FORMAT(insertDate,'%Y-%m-%d') dates,sum(allPrice) price from t_order order by DATE_FORMAT(insertDate,'%Y-%m-%d')  desc";
      		List list = db.queryForList(sql);
      		model.addAttribute("list", list);
      		System.out.println(list);
      		return "/admin/tj/tj1";
      	}
      	
      	
      	@RequestMapping(value = "/password")
      	public String password(Model model, HttpServletRequest request)throws Exception {
      		return "/admin/password";
      	}
      	
      	
      	@RequestMapping(value = "/changePassword")
      	public ResponseEntity loginSave(Model model,HttpServletRequest request,String oldPassword,String newPassword) throws Exception {
      		Map admin = getAdmin(request);
      		if(oldPassword.equals(admin.get("password").toString())){
      			String sql="update t_admin set password=? where id=?";
      			db.update(sql, new Object[]{newPassword,admin.get("id")});
      			return renderData(true,"1",null);
      		}else{
      			return renderData(false,"1",null);
      		}
      	}
      }
      

      修改密码业务逻辑:

      package com.sxl.controller.admin;
      import java.util.Map;
      import javax.servlet.http.HttpServletRequest;
      import org.springframework.http.ResponseEntity;
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      import com.sxl.controller.MyController;
      @Controller("userController")
      @RequestMapping(value = "/user")
      public class UserController extends MyController {
      	
      	@RequestMapping(value = "/index")
      	public String frame(Model model, HttpServletRequest request)throws Exception {
      		return "/user/index";
      	}
      	
      	@RequestMapping(value = "/main")
      	public String main(Model model, HttpServletRequest request)throws Exception {
      		return "/user/main";
      	}
      	
      	
      	@RequestMapping(value = "/password")
      	public String password(Model model, HttpServletRequest request)throws Exception {
      		return "/user/password";
      	}
      	
      	
      	@RequestMapping(value = "/changePassword")
      	public ResponseEntity loginSave(Model model,HttpServletRequest request,String oldPassword,String newPassword) throws Exception {
      		Map user = getUser(request);
      		if(oldPassword.equals(user.get("password").toString())){
      			String sql="update t_user set password=? where id=?";
      			db.update(sql, new Object[]{newPassword,user.get("id")});
      			return renderData(true,"1",null);
      		}else{
      			return renderData(false,"1",null);
      		}
      	}
      	@RequestMapping(value = "/mine")
      	public String mine(Model model, HttpServletRequest request)throws Exception {
      Map user =getUser(request);Map map = db.queryForMap("select * from t_user where id=?",new Object[]{user.get("id")});model.addAttribute("map", map);		return "/user/mine";
      	}
      	
      	
      	@RequestMapping(value = "/mineSave")
      	public ResponseEntity mineSave(Model model,HttpServletRequest request,Long id
      		,String username,String password,String name,String gh,String mobile) throws Exception{
      		int result = 0;
      			String sql="update t_user set name=?,gh=?,mobile=? where id=?";
      			result = db.update(sql, new Object[]{name,gh,mobile,id});
      		if(result==1){
      			return renderData(true,"操作成功",null);
      		}else{
      			return renderData(false,"操作失败",null);
      		}
      	}
      	}
      

      通用管理模块:

      package com.sxl.controller;
      import java.nio.charset.Charset;
      import java.util.Locale;
      import java.util.ResourceBundle;
      import javax.servlet.http.HttpServletRequest;
      import org.apache.commons.lang.StringUtils;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.http.HttpHeaders;
      import org.springframework.http.HttpStatus;
      import org.springframework.http.MediaType;
      import org.springframework.http.ResponseEntity;
      import com.sxl.util.JacksonJsonUtil;
      import com.sxl.util.StringUtil;
      import com.sxl.util.SystemProperties;
      public class BaseController {
      	public static final Long EXPIRES_IN = 1000 * 3600 * 24 * 1L;// 1天
      	@Autowired
      	private SystemProperties systemProperties;
      	/**
      	 * 获得配置文件内容
      	 */
      	public String getConfig(String key) {
      		return systemProperties.getProperties(key);
      	}
      	/**
      	 * 返回服务器地址 like http://192.168.1.1:8441/UUBean/
      	 */
      	public String getHostUrl(HttpServletRequest request) {
      		String hostName = request.getServerName();
      		Integer hostPort = request.getServerPort();
      		String path = request.getContextPath();
      		if (hostPort == 80) {
      			return "http://" + hostName + path + "/";
      		} else {
      			return "http://" + hostName + ":" + hostPort + path + "/";
      		}
      	}
      	/***
      	 * 获取当前的website路径 String
      	 */
      	public static String getWebSite(HttpServletRequest request) {
      		String returnUrl = request.getScheme() + "://"
      				+ request.getServerName();
      		if (request.getServerPort() != 80) {
      			returnUrl += ":" + request.getServerPort();
      		}
      		returnUrl += request.getContextPath();
      		return returnUrl;
      	}
      	/**
      	 * 初始化HTTP头.
      	 * 
      	 * @return HttpHeaders
      	 */
      	public HttpHeaders initHttpHeaders() {
      		HttpHeaders headers = new HttpHeaders();
      		MediaType mediaType = new MediaType("text", "html",
      				Charset.forName("utf-8"));
      		headers.setContentType(mediaType);
      		return headers;
      	}
      	/**
      	 * 返回 信息数据
      	 * 
      	 * @param status
      	 * @param msg
      	 * @return
      	 */
      	public ResponseEntity renderMsg(Boolean status, String msg) {
      		if (StringUtils.isEmpty(msg)) {
      			msg = "";
      		}
      		String str = "{\"status\":\"" + status + "\",\"msg\":\"" + msg + "\"}";
      		ResponseEntity responseEntity = new ResponseEntity(str,
      				initHttpHeaders(), HttpStatus.OK);
      		return responseEntity;
      	}
      	/**
      	 * 返回obj数据
      	 * 
      	 * @param status
      	 * @param msg
      	 * @param obj
      	 * @return
      	 */
      	public ResponseEntity renderData(Boolean status, String msg,
      			Object obj) {
      		if (StringUtils.isEmpty(msg)) {
      			msg = "";
      		}
      		StringBuffer sb = new StringBuffer();
      		sb.append("{");
      		sb.append("\"status\":\"" + status + "\",\"msg\":\"" + msg + "\",");
      		sb.append("\"data\":" + JacksonJsonUtil.toJson(obj) + "");
      		sb.append("}");
      		ResponseEntity responseEntity = new ResponseEntity(
      				sb.toString(), initHttpHeaders(), HttpStatus.OK);
      		return responseEntity;
      	}
      	/***
      	 * 获取IP(如果是多级代理,则得到的是一串IP值)
      	 */
      	public static String getIpAddr(HttpServletRequest request) {
      		String ip = request.getHeader("x-forwarded-for");
      		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      			ip = request.getHeader("Proxy-Client-IP");
      		}
      		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      			ip = request.getHeader("WL-Proxy-Client-IP");
      		}
      		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      			ip = request.getRemoteAddr();
      		}
      		if (ip != null && ip.length() > 0) {
      			String[] ips = ip.split(",");
      			for (int i = 0; i < ips.length; i++) {
      				if (!"unknown".equalsIgnoreCase(ips[i])) {
      					ip = ips[i];
      					break;
      				}
      			}
      		}
      		return ip;
      	}
      	/**
      	 * 国际化获得语言内容
      	 * 
      	 * @param key
      	 *            语言key
      	 * @param args
      	 * @param argsSplit
      	 * @param defaultMessage
      	 * @param locale
      	 * @return
      	 */
      	public static String getLanguage(String key, String args, String argsSplit,
      			String defaultMessage, String locale) {
      		String language = "zh";
      		String contry = "cn";
      		String returnValue = defaultMessage;
      		if (!StringUtil.isEmpty(locale)) {
      			try {
      				String[] localeArray = locale.split("_");
      				language = localeArray[0];
      				contry = localeArray[1];
      			} catch (Exception e) {
      			}
      		}
      		try {
      			ResourceBundle resource = ResourceBundle.getBundle("lang.resource",
      					new Locale(language, contry));
      			returnValue = resource.getString(key);
      			if (!StringUtil.isEmpty(args)) {
      				String[] argsArray = args.split(argsSplit);
      				for (int i = 0; i < argsArray.length; i++) {
      					returnValue = returnValue.replace("{" + i + "}",
      							argsArray[i]);
      				}
      			}
      		} catch (Exception e) {
      		}
      		return returnValue;
      	}
      }