基于SpringBoot+vue的无偿献血后台管理系统

news2024/9/23 7:33:44

基于SpringBoot+vue的无偿献血后台管理系统

✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌

🍅文末获取项目下载方式🍅


一、项目背景介绍:

第一:完善献血者管理,建立一个真正的“献血者信息管理系统”,既能为献血者提供便利的服务,又能为采供血机构和卫生行政部门提供一个献血招募决策依据。
第二:我国感染艾滋病、丙肝、乙肝等患者不断增多,其中输血感染已成为一个主要感染途径,如何从源头上堵住携带或感染艾滋病病毒、各种肝炎病毒者进行献血,确保用血者的安全已经变得刻不容缓。
第三:该系统运用计算机网络技术的发展,带来了新的设计思想、管理思想和系统实行的方式,它使血液管理系统能主动实现这些变化,确保采供血业务的正常开展。
本课题依此为出发点,以建立一个网站为基础,在基础上实现给医疗行业提供一个平台,无偿献血者管理服务系统就是为各地中心血站、卫生行政主管部门提供一个决策依据,帮助中心血站和卫生主管部门掌握献血者的情况[1],稳定和壮大无偿献血者队伍,保证有充足的血源,建立全面、快速、有效的血液预警机制。献血者信息系统建立能保障患者充足、安全输血,满足各医疗单位的需求和为献血者提供血液化验结果方面的查询等而搭建深层次的献血者人性化服务和管理平台,实现新形势、新阶段献血者服务管理工作方式的转变,为当前献血招募和管理的重要工作提供了坚实的基础。

二、项目技术简介:

  1. JAVA:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
  2. Vue:Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助开发者高效地开发用户界面。
    Vue是一个独立的社区驱动的项目,它是由尤雨溪在2014年作为其个人项目创建, 是一个成熟的、经历了无数实战考验的框架,它是目前生产环境中使用最广泛的JavaScript框架之一,可以轻松处理大多数web应用的场景,并且几乎不需要手动优化,并且Vue完全有能力处理大规模的应用。
  3. Element-UI:Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。
  4. SpringBoot:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
  5. Mybatis-Plus:MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。
  6. Spring-Mvc:Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框。
  7. Html:HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。

超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。这些相互关联的信息媒体可能在同一文本中,也可能是其他文件,或是地理位置相距遥远的某台计算机上的文件。这种组织信息方式将分布在不同位置的信息资源用随机方式进行连接,为人们查找,检索信息提供方便。

三、系统功能模块介绍:

功能模块图

四、数据库设计:

1:‘管理员表’(admin)

字段名类型默认值列注释
idbigintNULLid
user_namevarcharNULL用户名
pass_wordvarcharNULL密码
nick_namevarcharNULL昵称
head_imgvarcharNULL头像

2:‘审核表’(audit)

字段名类型默认值列注释
idbigintNULLid
user_idbigintNULL用户ID
organ_idbigintNULL器官ID
remarkvarcharNULL备注
statusintNULL申请状态[0:审核中,1:审核通过,2审核不通过,3:撤销申请]
create_timedatetimeNULL创建时间

3:‘逝者信息表’(dead_info)

字段名类型默认值列注释
idbigintNULLid
user_idbigintNULL用户ID
create_timedatetimeNULL创建时间
end_ageintNULL享年岁数
infovarcharNULL逝世原因
addressvarcharNULL家庭住址
home_namevarcharNULL家庭联系人
home_telvarcharNULL家庭电话

4:‘器官类型表’(organ)

字段名类型默认值列注释
idbigintNULLid
organ_namevarcharNULL器官名称
attentiontextNULL捐赠注意事项

5:‘用户表’(users)

字段名类型默认值列注释
idbigintNULLid
user_namevarcharNULL用户名
pass_wordvarcharNULL密码
telvarcharNULL联系方式
header_imgvarcharNULL基本照片
namevarcharNULL真实姓名
sexintNULL性别[0:未知,1:男,2:女]
ageintNULL年龄
create_timedatetimeNULL创建时间

五、功能模块:

  1. 管理员登录:当管理员在浏览器上输入项目访问地址进入时,会优先显示系统的登录页面,进入登录界面之后,管理员输入刚好的账号密码进行登录,当管理员选择退出时,可以直接关闭浏览器,也可通过管理员管理选择退出登录操作。

    管理员登录

  2. 管理员信息页面:当系统管理员登录后,可以查看所有管理员列表,会对应显示每个管理员的基本信息

    管理员信息页面

  3. 用户基本信息管理:当有新的献血者前来献血是,管理员需要在此页面登记献血者的基本信息情况,以便后面统计每一位献血者的总献血量。

    用户基本信息管理

  4. 献血者体检信息:每一位献血者在献血之前都需要进行身体检查,献血中心的护士人员都是为他们做免费的血液检查,以确保每一份鲜血都是健康可用的

    献血者体检信息

  5. 体检结果管理:界面记录每一位献血者的体检结果信息,如果体检合格,医护人员才会为改用户进行血液抽取工作

    体检结果管理

  6. 献血记录:该界面用来记录每一位献血者总的献血次数和总的献血量,当献血量达到一定的标准,系统将会把改用户记录到表彰档案中。

    献血记录

  7. 稀有血型管理:该界面记录着每一位献血者的血液稀有程度,以便为每一位血液需求者提供精确的血型

 稀有血型管理

六、代码示例:

管理员登录

    @PostMapping("/login")
    public ReturnMsg login(String userName,String password){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(User::getUserName,userName);
        User one = userService.getOne(wrapper);
        if(ObjectUtil.isNotEmpty(one)){
            // 密码比较
            String dbPwd = one.getPassword();
            if(myCipherUtil.encry(password).equals(dbPwd)){
                return ReturnMsg.ok("用户登录成功").put("data",one);
            }
        }
        return ReturnMsg.error("用户名或密码错误");
    }
管理员信息页面

    /**
     * 查询单个
     *
     * @param user
     * @return
     */
    @PostMapping("/findOne")
    public ReturnMsg findOne(@RequestBody User user) {
        return ReturnMsg.ok().put("item", baseService.getOne(new QueryWrapper<>(user)));
    }
用户基本信息管理
    /**
     * 根据id删除信息
     *
     * @param id
     * @return
     */
    @GetMapping("/removeById")
    public ReturnMsg removeById(String id) {
        if (StrUtil.isNotEmpty(id)) {
            return baseService.removeById(id)
                    ? ReturnMsg.ok().put("msg", "信息删除成功")
                    : ReturnMsg.error().put("msg", "信息删除失败");
        }
        return ReturnMsg.error().put("msg", "传入的信息有误,请联系管理员");
    }


    /**
     * 批量删除
     *
     * @param ids 类型 List 集合
     * @return JsonReturn
     */
    @GetMapping("/removeByIds")
    public ReturnMsg delete(List<String> ids) {
        return baseService.removeByIds(ids)
                ? ReturnMsg.ok().put("msg", "信息删除成功")
                : ReturnMsg.error().put("msg", "信息删除失败");
    }
献血者体检信息
    /**
     * 保存修改公用 POST请求方式
     * @param blood 修改或保存的对象
     * @return JsonReturn
     */
    @PostMapping("/saveOrUpdate")
    public ReturnMsg saveOrUpdate(@RequestBody Blood blood) {
        QueryWrapper<Inspect> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(Inspect::getInspectName,blood.getBloodName());
        wrapper.lambda().eq(Inspect::getInspectResult,"合格");
        List<Inspect> list = inspectService.list(wrapper);
        if(list.size() > 0){
            Inspect inspect = list.get(0);
            blood.setBlood(inspect.getInspectBlood());
            return baseService.saveOrUpdate(blood)
                    ? ReturnMsg.ok().put("msg" , "提交信息成功")
                    : ReturnMsg.error().put("msg" , "信息提交失败");
        }else{
            return ReturnMsg.error().put("msg" , "献血成员未在个人信息中找到或体检不合格");
        }
    }
体检结果管理
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
献血记录
    /**
     * 查询所有
     * @param
     * @return
     */
    @GetMapping("/findAll")
    public ReturnMsg findAll(){
        PageDto pageDto = new PageDto();
        List<Blood> list = baseService.list(null);
        pageDto.setList(list);
        pageDto.setTotalNum(list.size());
        return ReturnMsg.ok().put("items",pageDto);
    }
稀有血型管理
    @Override
    public PageDto getListPage(Map<String, Object> params) {
        List<RareDto> resultList = new ArrayList<>();
        QueryWrapper<Rare> wrapper =new QueryWrapper();
        Object rareName = params.get("rareName");
        if(ObjectUtil.isNotEmpty(rareName)){
            wrapper.lambda().like(Rare::getRareName,rareName);
        }
        Object rareBlood = params.get("rareBlood");
        if(ObjectUtil.isNotEmpty(rareBlood)){
            wrapper.lambda().like(Rare::getRareBlood,rareBlood);
        }
        List<Rare> list = baseMapper.selectList(wrapper);
        List<String> donateNameList = new ArrayList<>();
        for (Rare rare : list) {
            donateNameList.add(rare.getRareName());
        }
        if(donateNameList.size()<=0){
            return MyPageUtil.toPage(resultList,params);
        }
        Map<String,Donate> donateMap = donateService.listByDonateNames(donateNameList);
        for (Rare rare : list) {
            RareDto rareDto = new RareDto();
            rareDto.setRareId(rare.getId());
            rareDto.setRareName(rare.getRareName());
            rareDto.setRareBlood(rare.getRareBlood());
            rareDto.setCreateTime(rare.getCreateTime());
            rareDto.setUpdateTime(rare.getUpdateTime());

            Donate donate = donateMap.get(rare.getRareName());
            rareDto.setRareAddress(donate.getDonateAddress());
            rareDto.setRareId(donate.getDonateId());
            rareDto.setRarePhone(donate.getDonatePhone());
            resultList.add(rareDto);
        }
        return MyPageUtil.toPage(resultList,params);
    }

七、论文参考:

论文参考···论文参考图

八、项目总结:

这次设计开始是根据需求做一个大致的系统业务流程图,通过参考全国血液中心等平台的业务模式,再结合系统本身计划服务的市场范围,设计出属于自己的,适用于各大医院无偿献血者信息管理平台的业务模式。再是根据系统的业务流程设计数据库,总共设计了七张表用来存放连接系统所有的数据。
数据库设计完善之后再进行页面的设计搭建,用h5+css+js基本技术搭配Element-UI+Vue等前端框架对界面进行样式统一以及数据双向绑定渲染。基础界面搭建好之后,采用SSM+SpringBoot+Mybatis-plus搭建后端的低层框架,运用ajax实现前后端的交互。在整个系统基本完善之后,进行一次完整的业务流程测试,测试系统的功能、业务bug及设计缺陷,过程中对发现的bug或者缺陷即时进行修改。系统从登陆开始到献血者个人信息的保存、查看等功能都能够顺利实现,最终一个初始版本的,服务于医院的无偿献血者信息管理平台就完成了。
程序设计需要态度严谨、逻辑思维敏捷、良好的编程习惯和系统设计实力。通过这次做项目,也学习到许多宝贵的经验。例如,如何更好的去设计实现系统的业务逻辑、完善界面、设计数据库,写代码也变得更严谨,对一些框架搭建和方法的使用也更加熟练。

九、源码获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取联系方式👇🏻👇🏻👇🏻

链接点击直达:下载链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于BIM技术建设的重庆来福士广场项目

1. BIM工程应用概况 1.1 工程概况 重庆来福士广场项目位于朝天门广场与解放碑之间&#xff0c;直面长江与嘉陵江交汇口。是集大型购物中心、高端住宅、办公楼、公寓式酒店和酒店为一体的综合体项目。由于本项目钢结构体量大、结构复杂&#xff0c;混凝土标号高、强度大…

树莓派centos7.9(armv7hl)安装最新版宝塔linux面板 2023-0219

内存卡或usb存储器容量建议不小于16GB 1.启用 EPEL 软件源 树莓派安装centos7.9(armv7hl)以及宝塔linux面板. 2023-2-16_mklpo147的博客-CSDN博客 2.使用gcc-6 树莓派centos7.9(armv7hl)安装并切换GCC-6版本. 2023-2-18_mklpo147的博客-CSDN博客 3.更新系统 yum install -y e…

第1讲-初步认识数据库系统(测试题总结)

一、测试题 数据库系统 包含 数据库管理系统 详细版&#xff1a; 数据库管理系统DBMS是数据管理软件&#xff0c;在用户和操作系统之间。 数据库系统DBS由数据库&#xff0c;数据库管理系统&#xff08;及其应用开发工具&#xff09;、应用程序和数据库管理员DBA组成的存储、管…

使用51单片机的GPIO输出占空比可调节的PWM波

一、前言 在一些单片机或微控制器中&#xff0c;通用GPIO可以被配置为产生PWM信号。PWM即脉冲宽度调制&#xff0c;是一种用于模拟输出的技术。它可以通过改变输出信号的脉冲宽度来控制电路中的电平&#xff0c;从而实现对电路的控制。 二、什么是PWM波&#xff1f; PWM波&a…

JavaSE-线程池(5)- 建议使用的方式

JavaSE-线程池&#xff08;5&#xff09;- 建议使用的方式 虽然JDK Executors 工具类提供了默认的创建线程池的方法&#xff0c;但一般建议自定义线程池参数&#xff0c;下面是阿里巴巴开发手册给出的理由&#xff1a; 另外Spring也提供了线程池的实现&#xff0c;比如 Thread…

Flink02:Flink快速上手(Streaming WorldCount)

一、Flink快速上手 使用 &#xff08;1&#xff09;先把Flink的开发环境配置好。 &#xff08;2&#xff09;创建maven项目&#xff1a;db_flink &#xff08;3&#xff09;首先在model中将scala依赖添加进来。 &#xff08;4&#xff09;然后创建scala目录&#xff0c;因为针…

Lesson5---NumPy科学计算库

5.1 多维数组 Python拥有出色的第三方库生态系统在机器学习中&#xff0c;需要把所有的输入数据&#xff0c;都转变为多为数组的形式。score[i, j]二维数组i,j都从0开始 score[5] [85, 72, 61, 92, 80] score[2,5] [[85, 72, 61, 92, 80],[85, 72, 61, 92, 80]] score[30,5…

Linux系统之iptables应用SNAT与DNAT

目录 SNAT 一.SNAT的原理介绍 1.应用环境 2.SNAT原理 3.SNAT转换前提条件 二.开启SNAT 1.临时打开 2.永久打开 三.SNAT的转换 1.固定的公网IP地址 2.非固定的公网IP地址(共享动态IP地址) 四.SNAT实验 1.实验环境准备 2.配置web服务器&#xff08;192.168.100.100…

测试3.测试方法的分类

3.测试分类 系统测试包括回归测试和冒烟测试 回归测试&#xff1a;修改了旧的代码后&#xff0c;重新测试功能是否正确&#xff0c;有没有引入新的错误或导致其它代码产生错误 冒烟测试&#xff1a;目的是确认软件基本功能正常&#xff0c;可以进行后续的正式测试工作 按是否…

什么是 RESTful 风格?

一、什么是 REST &#xff1f; REST即表述性状态传递&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST&#xff09;是Roy Thomas Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式&#…

游戏开发 - 开发流程 - 收集

1.应用场景 主要用于了解&#xff0c;掌握游戏开发的整个流程。 2.学习/操作 1.文档阅读 复习课 | 带你梳理客户端开发的三个重点-极客时间 2.整理输出 2.1 游戏开发流程 -- 参考 按照游戏开发中的三大模块策划、程序、美术&#xff0c;画了一个图。 开发游戏的时候&#xff…

LeetCode171-Excel表列序号(进制转换问题)

LeetCode171-Excel表列序号1、问题描述2、解题思路&#xff1a;进制转换3、代码实现1、问题描述 给你一个字符串columnTitle,表示Excel表格中得列名称。返回该列名称对应得列序号。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 …

linux shell 入门学习笔记3 shebang

shebang 计算机程序中&#xff0c;shebang指的是出现在文本文件的第一行前两个字符#! 在Unix系统中&#xff0c;程序会分析shebang后面的内容&#xff0c;作为解释器的指令&#xff0c;例如 以#!/bin/sh 开头的文件&#xff0c;程序在执行的时候会调用/bin/sh&#xff0c;也就…

[软件工程导论(第六版)]第5章 总体设计(复习笔记)

文章目录5.1 设计过程5.2 设计原理5.2.1 模块化5.2.2 抽象5.2.3 逐步求精5.2.4 信息隐藏和局部化5.2.5 模块独立5.3 启发规则5.4 描绘软件结构的图形工具5.4.1 层次图5.4.2 HIPO图5.4.3 结构图5.5 面向数据流的设计方法目的 总体设计的基本目的就是回答“概括地说&#xff0c;系…

2.19 索引和事务

一.联合查询面试问题:聚合查询与联合查询的区别聚合查询是行与行之间的数据加工聚合函数 :count,sum,avg...group by 进行分组,指定列的值,相同的记录合并到同一个组,每个组又可以分别进行聚合查询分组还可以指定条件筛选,如果分组之前指定条件 用where,如果对分组之后指定条件…

< CSDN周赛解析:第 28 期 >

CSDN周赛解析&#xff1a;第 27 期&#x1f449; 第一题&#xff1a; 小Q的鲜榨柠檬汁> 题目解析> 解决方案&#x1f449; 第二题&#xff1a; 三而竭> 解析> 解决方案> 拓展知识&#x1f449; 第三题&#xff1a; 隧道逃生> 解析> 解决方案&#x1f449;…

【人工智能AI】四、NoSQL进阶《NoSQL 企业级基础入门与进阶实战》

帮我写一篇介绍NoSQL的技术文章&#xff0c;文章的标题是《四、NoSQL进阶》&#xff0c;不少于3000字。帮我细化到三级目录&#xff0c;使用markdown格式。这篇文章的目录是&#xff1a; 四、NoSQL 进阶 4.1 NoSQL 高可用 4.2 NoSQL 数据安全 4.3 NoSQL 性能优化 4.4 总结 四、…

Vue:extends继承组件复用性

提到extends继承&#xff0c;最先想到的可能是ES6中的class、TS中的interface、面向对象编程语言中中的类和接口概念等等&#xff0c;但是我们今天的关注点在于&#xff1a;如何在Vue中使用extends继承特性。 目录 Vue&#xff1a;创建Vue实例的方式 构造函数方式&#xff1…

3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation

文章目录 聚类结果一、论文内容1.1 Ground Surface Removal1.2 Fast Euclidean Clustering题外:欧几里得聚类Fast Euclidean Clustering二、参考聚类结果 原始代码中采用的是pcl中的搜索方式,替换为另外第三方库,速度得到进一步提升。 一、论文内容 论文中给出的结论:该…

java基础学习 day42(继承中构造方法的访问特点,this、super的使用总结)

继承中&#xff0c;构造方法的访问特点 父类的构造方法不会被子类继承&#xff0c;但可以通过super()调用父类的构造方法&#xff0c;且只能在子类调用&#xff0c;在测试类中是不能手动单写构造方法的。子类中所有的构造方法默认先调用父类的无参构造&#xff0c;再执行自己构…