一、项目背景介绍:
医院管理系统从整个社会实践过程来看,对医院进行信息化管理可以带来的好处如下所示:
(1)患者快速预约就诊。不同于线下就诊的是,患者不需要到医院进行排队叫号,然后才能正常就诊,信息化的结果就为该过程省略了第一步的时间,从而整体上缩短了问诊时间,方便了患者用户,和医院的叫号系统。并且患者还可以通过系统来一目了然的了解自己的症状和需要用药的情况。
(2)促使经济效益得到提升。医院在信息化的管理下,整个医院的问诊效率都大大得到了提高,并且也大大降低了各项成本,节约了人力,时间成本。物资管理中严格记录出、入库数据,随时动态掌握每种物资和药品库存利用情况,从而获得物资和经费的最大使用效益。
(3)提高社会福利。患者掌握了医院信息,提高了医院的知名度,并且可以随时知道自己的医疗费用,减少纠纷,有效的提高了社会效益。
(4)加快医院管理流程。使用管理系统,可以了解所有的医疗状况、医生和患者信息等数据,有效的提高了医院管理的效率。
二、项目技术简介:
- JAVA:Java是一门 面向对象编程语言 ,不仅 吸收了C++语言的各种优点 ,还摒弃了C++里难以理解的 多继承、指针 等概念,因此Java语言具有 功能强大和简单易用 两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
- Vue:Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助开发者高效地开发用户界面。 Vue是一个独立的社区驱动的项目,它是由尤雨溪在2014年作为其个人项目创建, 是一个成熟的、经历了无数实战考验的框架,它是目前生产环境中使用最广泛的JavaScript框架之一,可以轻松处理大多数web应用的场景,并且几乎不需要手动优化,并且Vue完全有能力处理大规模的应用。
- Element-UI:Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。
- SpringBoot:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来 简化 新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
- Mybatis-Plus:MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。
- Spring-Mvc:Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框。
三、系统功能模块介绍:
四、数据库设计:
1:‘管理员表’(admin)
字段名 | 类型 | 默认值 | 列注释 |
id | bigint | NULL | 主键ID |
user_name | varchar | NULL | 用户名 |
pass_word | varchar | NULL | 密码 |
head_img | varchar | NULL | 头像 |
nick_name | varchar | NULL | 姓名 |
create_time | datetime | NULL | 创建时间 |
2:‘科室表’(dept)
字段名 | 类型 | 默认值 | 列注释 |
id | bigint | NULL | 主键ID |
department_name | varchar | NULL | 科室名称 |
create_time | datetime | NULL | 创建时间 |
3:‘医生表’(doctor)
字段名 | 类型 | 默认值 | 列注释 |
id | bigint | NULL | 主键ID |
nick_name | varchar | NULL | 医生姓名 |
sex | int | NULL | 性别[1:男,2:女] |
age | int | NULL | 年龄 |
head_img | varchar | NULL | 头像 |
id_card | varchar | NULL | 身份证号 |
dept_id | bigint | NULL | 所属科室ID |
create_time | datetime | NULL | 创建时间 |
tel | varchar | NULL | 手机 |
| varchar | NULL | 邮箱 |
user_name | varchar | NULL | 用户名 |
pass_word | varchar | NULL | 密码 |
info | text | NULL | 简介 |
4:‘药物表’(drug)
字段名 | 类型 | 默认值 | 列注释 |
id | bigint | NULL | 主键ID |
drug_name | varchar | NULL | 药物名称 |
drug_num | varchar | NULL | 药物编号 |
drug_price | varchar | NULL | 药物价格 |
location | varchar | NULL | 产地 |
describes | text | NULL | 药物描述 |
drug_info | text | NULL | 功能 |
remark | text | NULL | 注意事项 |
drug_img | varchar | NULL | 药品图片 |
5:‘预约药品表’(sick_drug)
字段名 | 类型 | 默认值 | 列注释 |
id | bigint | NULL | 主键ID |
drug_id | bigint | NULL | 药品ID |
subscribe_id | bigint | NULL | 预约表ID |
6:‘患者表’(sick_info)
字段名 | 类型 | 默认值 | 列注释 |
id | bigint | NULL | 主键ID |
name | varchar | NULL | 姓名 |
sex | int | NULL | 性别[1:男,2:女] |
age | int | NULL | 年龄 |
id_card | varchar | NULL | 身份证号 |
home_location | varchar | NULL | 家庭住址 |
family_tel | varchar | NULL | 手机号 |
info_img | varchar | NULL | 基本图片 |
7:‘病人预约表’(subscribe)
字段名 | 类型 | 默认值 | 列注释 |
id | bigint | NULL | 主键ID |
doctor_id | bigint | NULL | 医生ID |
sick_id | bigint | NULL | 病人ID |
create_time | datetime | NULL | 预约时间 |
info | varchar | NULL | 病情信息 |
status | int | NULL | [1:未处理,2:已处理] |
prescription | varchar | NULL | 药方 |
update_time | datetime | NULL | 治疗时间 |
五、功能模块:
- 系统登录模块:本系统主要分为管理员,医生,患者三种不同身份的用户,三者皆使用同一个登录页面,但不同的是登录之后的操作页面将会根据角色不同进行变化。
- 医生管理:医生管理模块主要是对于医院所有医生的一个管理,其中包括医生的基本信息,例如姓名,性别,年龄,照片等。该模块主要对医生的详细信息信息进行维护,其中包括基本信息检索,证件照上传等
- 预约管理页面功能:预约管理模块主要用来操作刚刚入院的病人信息,为病人分配主治医生,在病人治疗期间开治疗药品等。
- 管理员管理:管理员即是系统管理员的信息管理,包括管理员的基本信息等。
- 患者管理:系统患者管理主要是患者自己进行操作录入,改模块可以根据不同的条件查询不同的患者信息,也包括对患者的一些特殊处理等。
- 科室管理:科室管理主要对医院中所存在的科室,例如心血管内科,泌尿科等科室进行基本信息的信息化管理,其中主要包括查询,添加,编辑,删除等基本功能。
- 药品管理:药品管理模块主要包括药品的基本信息,图片,注意事项,功能的信息化管理。
六、代码示例:
系统登录模块
@PostMapping()
public ReturnMsg login(@RequestBody AdminDTO adminDTO) {
if (adminDTO.getType() == 1) {
Assert.isTrue(StrUtil.isNotEmpty(adminDTO.getUserName())
&& StrUtil.isNotEmpty(adminDTO.getPassWord()), "账号或密码不能为空!");
LambdaQueryWrapper<AdminDTO> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(AdminDTO::getUserName, adminDTO.getUserName()).
eq(AdminDTO::getPassWord, adminDTO.getPassWord()).last(BaseConstant.LIMIT_ONE);
AdminDTO loginUser = adminService.getOne(queryWrapper);
Assert.notNull(loginUser, "账号或密码错误!");
loginUser.setType(1);
return ReturnMsg.ok(loginUser);
}
if (adminDTO.getType() == 2) {
Assert.isTrue(StrUtil.isNotEmpty(adminDTO.getUserName())
&& StrUtil.isNotEmpty(adminDTO.getPassWord()), "账号或密码不能为空!");
LambdaQueryWrapper<DoctorDTO> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(DoctorDTO::getUserName, adminDTO.getUserName()).
eq(DoctorDTO::getPassWord, adminDTO.getPassWord()).last(BaseConstant.LIMIT_ONE);
DoctorDTO loginUser = doctorService.getOne(queryWrapper);
Assert.notNull(loginUser, "账号或密码错误!");
loginUser.setType(2);
return ReturnMsg.ok(loginUser);
}
if (adminDTO.getType() == 3) {
Assert.isTrue(StrUtil.isNotEmpty(adminDTO.getUserName()), "联系方式不能为空!");
LambdaQueryWrapper<SickInfoDTO> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(SickInfoDTO::getFamilyTel, adminDTO.getUserName()).last(BaseConstant.LIMIT_ONE);
SickInfoDTO loginUser = sickInfoService.getOne(queryWrapper);
if (loginUser == null) {
loginUser = new SickInfoDTO();
loginUser.setFamilyTel(adminDTO.getUserName());
loginUser.setName("患者-游客");
sickInfoService.save(loginUser);
}
loginUser.setType(3);
return ReturnMsg.ok(loginUser);
}
return ReturnMsg.error("账号或密码错误");
}
医生管理
@GetMapping("/getDeptData")
public ReturnMsg getDeptData(){
List<DeptDTO> dataList = deptService.list();
List<BaseSelectEntity> selectEntities = new ArrayList<>();
if(CollectionUtil.isNotEmpty(dataList)){
dataList.forEach(item -> {
BaseSelectEntity baseSelectEntity = new BaseSelectEntity();
baseSelectEntity.setKey(item.getId());
baseSelectEntity.setValue(item.getDepartmentName());
selectEntities.add(baseSelectEntity);
});
}
return ReturnMsg.ok(selectEntities);
}
预约管理页面功能
/**
* 默认分页查询
*
* @param sickDrugDTO
* @return
* @throws IOException
*/
@PostMapping("/page")
public ReturnMsg page(@RequestBody SickDrugDTO sickDrugDTO) {
return ReturnMsg.ok(baseService.basePage(sickDrugDTO));
}
@PostMapping(value = "/save/update1")
public ReturnMsg baseSaveOrUpdate1(@RequestBody SickDrugDTO entity) throws Exception {
LambdaQueryWrapper<SickDrugDTO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SickDrugDTO::getSubscribeId, entity.getSubscribeId()).eq(SickDrugDTO::getDrugId, entity.getDrugId());
List<SickDrugDTO> list = this.baseService.list(queryWrapper);
if (CollectionUtil.isNotEmpty(list)) {
return ReturnMsg.ok();
}
this.baseService.save(entity);
return ReturnMsg.ok();
}
管理员管理
@Override
public Page<AdminDTO> basePage(AdminDTO adminDTO) {
if (null != adminDTO.getCurrent() && null != adminDTO.getPageSize())
adminDTO.setCurrent((adminDTO.getCurrent() - 1) * adminDTO.getPageSize());
List<AdminDTO> list = this.baseMapper.findList(adminDTO);
int count = this.baseMapper.findPageCount(adminDTO);
Page<AdminDTO> page = new Page<>();
page.setTotal(count);
page.setRecords(list);
return page;
}
患者管理
@GetMapping("/getDoctorData")
public ReturnMsg getDoctorData() {
List<DoctorDTO> dataList = doctorService.list();
List<BaseSelectEntity> selectEntities = new ArrayList<>();
if (CollectionUtil.isNotEmpty(dataList)) {
dataList.forEach(item -> {
BaseSelectEntity baseSelectEntity = new BaseSelectEntity();
baseSelectEntity.setKey(item.getId());
baseSelectEntity.setValue(item.getNickName());
selectEntities.add(baseSelectEntity);
});
}
return ReturnMsg.ok(selectEntities);
}
科室管理
@Override
@Resource(name = "drugService")
protected void setBaseService(DrugService drugService) {
this.baseService = drugService;
}
/**
* 图片上传文件夹名称
*/
private final String realPath = "/drug";
/**
* 图片上传
*
* @param filename
* @param id 需要修改的数据主键id
* @return
* @throws IOException
*/
@PostMapping("/upload/{id}")
public ReturnMsg upload(@RequestParam("file") MultipartFile filename, @PathVariable("id") Long id) throws IOException {
return ReturnMsg.ok(this.baseUpLoad(filename, id, realPath, DrugDTO.class));
}
药品管理
public Page<SubscribeDTO> basePage(SubscribeDTO subscribeDTO) {
if (null != subscribeDTO.getCurrent() && null != subscribeDTO.getPageSize())
subscribeDTO.setCurrent((subscribeDTO.getCurrent() - 1) * subscribeDTO.getPageSize());
List<SubscribeDTO> list = this.baseMapper.findList(subscribeDTO);
int count = this.baseMapper.findPageCount(subscribeDTO);
Page<SubscribeDTO> page = new Page<>();
page.setTotal(count);
page.setRecords(list);
return page;
}
七、论文参考:
论文参考···
八、项目总结:
时间飞逝,一转眼五个月时间已经过去,医院管理系统也从无到可以正式使用,经过此次软件整个流程的设计与开发,使我感触颇深,也让我从中学习到了很多实践性的知识。
一个软件开发的难以程度完全取决于初期对于技术的选型以及之后的项目基础架构的搭建工作。正所谓磨刀不误砍柴工,只有把刀磨的锋利了,效率才会高,软件建设亦是如此。对于项目基础结构的搭建时,需要考虑的因素非常之多,例如项目包结构如何正确划分才能够使结构清晰,基础公共部分的代码该如何处理或者说如何高效的编写等等,在前端项目方面亦是如此,组件化如何拆分才能使代码复用性更高,使功能更加简易开发,在此些问题的基础之下,后端包结构划分为connom公共包,util帮助包,controller Web项目接口包,biz业务处理包,entity实体包,dao持久成包,在此项目包结构的帮助下,整个项目中的文件变得清晰明了,当处理问题的时候新建的文件或者需要修改的代码在什么地方,可以做到一目了然。所以整个项目我认为基础搭建尤为重要。
一个好的项目的研发离不开生活中人们需要的问题,只要存在问题就会存在需要,存在需要,项目才会变得更加的有意义,这才是一个完整的供需关系。在弄清楚需求之后,需要对整个项目的整体业务逻辑进行构思以及最重要的数据库表的设计,项目主要面向的用户是B端用户还是C端用户,不同的用户数据库表的设计思路也存在差异,C端用户的系统主要关键在查询操作,查询速度必须要更快,而此系统主要面向的用户为B端用户所以项目主要关注的点在于如何减少用户的操作难度,对查询速度要求很高。
系统实现是整个项目整体流程的最后一个环节,在明确本次项目需求之后,首先需求进行整体的需求分析和项目设计,然后在进行技术的一个确认工作。此外,最好能和学院的老师一起交流探讨设计的系统有啥不足之处,然后进行修改。最后在慢慢的调试中,系统得以被完整的开发出来。但系统依旧存在不足之处,需要不断的补充和完善。
此源码非开源,若需要此源码可扫码添加微信进行咨询!