Java-基于SSM+JSP的医院挂号管理系统

2023-11-18

项目背景

随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,医院预约挂号系统当然也不能排除在外。医院预约挂号系统是以实际运用为开发背景,运用软件工程开发方法,采用jsp技术构建的一个管理系统。整个开发过程首先对软件系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统总体结构设计、系统数据结构设计、系统功能设计和系统安全设计等;详细设计主要包括模块实现的关键代码,系统数据库访问和主要功能模块的具体实现等。最后对系统进行功能测试,并对测试结果进行分析总结,及时改进系统中存在的不足,为以后的系统维护提供了方便,也为今后开发类似系统提供了借鉴和帮助。
本医院预约挂号系统采用的数据库是Mysql,使用JSP技术开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

功能设计

功能模块图

系统登录流程图
在这里插入图片描述
添加信息流程图
在这里插入图片描述
删除信息流程图
在这里插入图片描述
医院预约挂号系统的结构图
在这里插入图片描述
登录系统结构图
在这里插入图片描述
医院预约挂号系统结构图
在这里插入图片描述

功能截图

医院预约挂号系统,在前台首页功能可以查看首页、科室信息、出诊信息、公告信息、我的、跳转到后台等内容
在这里插入图片描述
用户注册、用户登录,通过注册填写用户名、密码、姓名、联系电话、身份证等信息进行注册、登录操作
在这里插入图片描述
在这里插入图片描述
个人中心,在个人中心页面可以查看用户名、密码、姓名、性别、头像、联系电话、身份证等信息进行上传图片、更新信息、退出登录等操作
在这里插入图片描述
出诊信息,在出诊信息页面可以查看医生工号、医生姓名、职称、照片、科室、擅长、出诊时间、可约人数、挂号费等信息进行预约、点我收藏等操作
在这里插入图片描述
管理员登录,通过填写用户名、密码、角色等信息,输入完成后选择登录即可进入医院预约挂号系统
在这里插入图片描述
管理员登录进入医院预约挂号系统可以查看个人中心、用户管理、科室信息管理、医生管理、出诊信息管理、预约时间段管理、挂号预约管理、问题反馈管理、问题解答管理、系统管理等信息
在这里插入图片描述
用户管理,在用户管理页面可以查看用户名、姓名、性别、头像、联系电话、身份证等信息进行修改、删除、查看等操作
在这里插入图片描述
科室信息管理,在科室信息管理页面可以查看科室、图片、科室介绍、科室位置等信息进行修改、删除、查看等操作
在这里插入图片描述
医生管理,在医生管理页面可以查看医生工号、医生姓名、性别、照片、职称、科室、擅长、手机等信息进行查看、修改、删除等操作
在这里插入图片描述
出诊信息管理,在出诊信息管理页面通过填写医生工号、医生姓名、职称、照片、科室、擅长、出诊时间、可约人数、挂号费等信息进行查看、修改、删除等操作
在这里插入图片描述
挂号预约管理,在挂号预约管理页面可以查看医生工号、医生姓名、照片、职称、科室、挂号费、出诊时间、时间段、就诊描述、体温、健康码、用户名、姓名、身份证、是否审核、审核回复、是否支付等信息进行审核、查看等操作
在这里插入图片描述
问题反馈管理,在问题反馈管理页面可以查看医生工号、医生姓名、职称、科室、出诊时间、时间段、问题反馈、反馈时间、用户名、姓名、是否审核、审核回复等信息进行审核、解答、查看等操作
在这里插入图片描述
个人中心,在个人中心页面通过填写用户名、密码、姓名、性别、头像、联系电话、身份证等信息进行选择文件或提交操作
在这里插入图片描述
挂号预约管理,在挂号预约管理页面可以查看医生工号、医生姓名、照片、职称、科室、挂号费、出诊时间、时间段、就诊描述、体温、健康码、用户名、姓名、身份证、是否审核、审核回复、是否支付等信息进行提问、查看、修改、删除等操作
在这里插入图片描述
问题反馈管理,在问题反馈管理页面可以查看医生工号、医生姓名、职称、科室、出诊时间、时间段、问题反馈、反馈时间、用户名、姓名、是否审核、审核回复等信息进行查看、修改、删除等操作
在这里插入图片描述
问题解答管理,在问题解答管理页面可以查看医生工号、医生姓名、职称、科室、问题解答、解答时间、用户名、姓名等信息进行查看等操作
在这里插入图片描述

相关代码

数据库配置

# Tomcat
server:
    tomcat:
        uri-encoding: UTF-8
    port: 8080
    servlet:
        context-path: /springbootr1tjf

spring:
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/springbootr1tjf?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
        username: root
        password: 123456

#        driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
#        url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=springbootr1tjf
#        username: sa
#        password: 123456

    servlet:
      multipart:
        max-file-size: 10MB
        max-request-size: 10MB
    resources:
      static-locations: classpath:static/,file:static/

#mybatis
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.entity
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 1
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    #驼峰下划线转换
    db-column-underline: true
    #刷新mapper 调试神器
    refresh-mapper: true
    #逻辑删除配置
    logic-delete-value: -1
    logic-not-delete-value: 0
    #自定义SQL注入器
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
    #springboot 项目mybatis plus 设置 jdbcTypeForNull (oracle数据库需配置JdbcType.NULL, 默认是Other)
    jdbc-type-for-null: 'null' 

控制层(controller)

package com.controller;


import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;

/**
 * 登录相关
 */
@RequestMapping("users")
@RestController
public class UserController{
	
	@Autowired
	private UserService userService;
	
	@Autowired
	private TokenService tokenService;

	/**
	 * 登录
	 */
	@IgnoreAuth
	@PostMapping(value = "/login")
	public R login(String username, String password, String captcha, HttpServletRequest request) {
		UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
		if(user==null || !user.getPassword().equals(password)) {
			return R.error("账号或密码不正确");
		}
		String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
		return R.ok().put("token", token);
	}
	
	/**
	 * 注册
	 */
	@IgnoreAuth
	@PostMapping(value = "/register")
	public R register(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

	/**
	 * 退出
	 */
	@GetMapping(value = "logout")
	public R logout(HttpServletRequest request) {
		request.getSession().invalidate();
		return R.ok("退出成功");
	}
	
	/**
     * 密码重置
     */
    @IgnoreAuth
	@RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
    	UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
    	if(user==null) {
    		return R.error("账号不存在");
    	}
    	user.setPassword("123456");
        userService.update(user,null);
        return R.ok("密码已重置为:123456");
    }
	
	/**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
    	PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/list")
    public R list( UserEntity user){
       	EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
      	ew.allEq(MPUtil.allEQMapPre( user, "user")); 
        return R.ok().put("data", userService.selectListView(ew));
    }

    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
    	Long id = (Long)request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);
    	UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
    	if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
    		return R.error("用户名已存在。");
    	}
        userService.updateById(user);//全部更新
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

业务层(Service)


package com.service;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.IService;
import com.entity.UserEntity;
import com.utils.PageUtils;


/**
 * 系统用户
 */
public interface UserService extends IService<UserEntity> {
 	PageUtils queryPage(Map<String, Object> params);
    
   	List<UserEntity> selectListView(Wrapper<UserEntity> wrapper);
   	
   	PageUtils queryPage(Map<String, Object> params,Wrapper<UserEntity> wrapper);
	   	
}

数据访问层(Dao)

package com.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.entity.UserEntity;

/**
 * 用户
 */
public interface UserDao extends BaseMapper<UserEntity> {
	
	List<UserEntity> selectListView(@Param("ew") Wrapper<UserEntity> wrapper);

	List<UserEntity> selectListView(Pagination page,@Param("ew") Wrapper<UserEntity> wrapper);
	
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java-基于SSM+JSP的医院挂号管理系统 的相关文章

  • 在 Java 正则表达式中获取多个模式的重叠匹配

    我有同样的问题这个链接 https stackoverflow com questions 18751486 matching one string multiple times using regex in java 但有多种模式 我的正
  • 在 Java 中使用 Batik 检查和删除 SVG 中的属性

    这个问题基本上说明了一切 如何检查 SVG 是否具有 viewBox 属性 我正在使用蜡染库 我需要这个 因为我需要 至少 通知用户有一个 viewBox 属性 我可以删除它吗 使用 org w3c dom 类 您可以按照以下方式做一些事情
  • 如何在url请求中发送数组

    我的要求如下 我想给出演员姓名 开始日期 结束日期并获取他在该时期出演的所有电影 因此 我的服务请求是这样的 http localhost 8080 MovieDB GetJson name Actor startDate 20120101
  • 查询 MongoDB 集合中的字段。

    我正在尝试查询 mongodb 集合中的特定字段 这是我的代码和输出 Mongo m new Mongo DB db m getDB mydb DBCollection coll db getCollection student addin
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 使用 Spring 控制器处理错误 404

    I use ExceptionHandler处理我的网络应用程序抛出的异常 在我的例子中我的应用程序返回JSON回应HTTP status用于对客户端的错误响应 但是 我正在尝试弄清楚如何处理error 404返回与处理的类似的 JSON
  • 在哪里保存选项值、重要文件的路径等[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在创建一个程序 需要设置一些选项值以及图像文件的一些路径 SQLite 数据库的路径 有关各种按钮上文本的一些信息 有关要使用哪个数据库的信
  • JUnit5 平台启动器 API - 如果没有至少一个测试引擎,则无法创建启动器

    我正在尝试升级我们的自动化测试套件的测试能力以接受 JUnit5 测试并遵循JUnit 平台启动器 API 说明 https junit org junit5 docs current user guide launcher api我收到错
  • 这个等待通知线程语义的真正目的是什么?

    我刚刚遇到一些代码 它使用等待通知构造通过其其他成员方法与类中定义的线程进行通信 有趣的是 获取锁后 同步范围内的所有线程都会在同一锁上进行定时等待 请参见下面的代码片段 随后 在非同步作用域中 线程执行其关键函数 即 做一些有用的事情1
  • 在java中将字符串日期转换为美国格式

    我有下面的代码 其中日期为字符串类型 我必须将其设置为美国格式 所以下面我已经展示了它 private static final SimpleDateFormat usOutputDate new SimpleDateFormat MM d
  • 无法从资源加载图片

    So I am trying to load a image file from a resource so that when I export my application into a jar file it could be use
  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • 确定序列化对象的类型

    我需要通过套接字发送消息 从用户到引擎的请求 以及从引擎到用户的响应 所以流程本质上是 serialized request Server lt network gt Client serialized response request r
  • java setFullScreenWindow 在 Mac 中隐藏登录对话框

    我使用的是全屏窗口 类似于屏幕保护程序 使用这里的方法 GraphicsEnvironment getLocalGraphicsEnvironment getDefaultScreenDevice setFullScreenWindow t
  • 用于层次结构树角色的 Spring Security / Java EE 解决方案

    我知道 Spring Security 非常适合标准角色和基于权限的授权 我不确定的是这种情况 系统中管理着 10 000 名员工 员工被组织成组织结构图 跨部门的谁向谁报告的树 其中一些员工是用户 这些用户仅被允许访问其职责范围内的员工
  • 拆分/标记化/扫描字符串并注意引号

    Java中是否有默认 简单的方法来分割字符串 但要注意引号或其他符号 例如 给定以下文本 There s a man that live next door in my neighborhood and he gets me down Ob
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • BadPaddingException:无效的密文

    我需要一些帮助 因为这是我第一次编写加密代码 加密代码似乎工作正常 但解密会引发错误 我得到的错误是 de flexiprovider api exceptions BadPaddingException 无效的密文 in the 解密函数
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 为什么java.lang.Cloneable不重写java.lang.Object中的clone()方法?

    Java 规范java lang Cloneable接口将自身定义为表示扩展它的任何对象也实现了clone 休眠的方法java lang Object 具体来说 它说 一个类实现了Cloneable接口来指示java lang Object

随机推荐

  • matlab的tfdata函数_matlab 入门基本操作命令与函数

    一 tf 函数 是传递函数的意思 一般学自动控制原理的时候经常用 在s域中 比如你要输入G s 1 s 2 2s 1 就可以在matlab中输入G tf 1 1 2 1 就OK了 不懂的话你可以在command窗口输入help tf 就行了
  • 为什么使用start方法启动Java的Thread线程?

    一 简介 在Java代码当中 当我们需要开启子线程去处理一些任务的时候 往往是调用Thread对象的start方法 这样Thread实例中的Runnable对象的run方法就会在一个新的线程当中执行 创建一个线程 Thread thread
  • 从注意力机制到Vison Transformer

    原视频链接 https www bilibili com video BV1Jh411Y7WQ spm id from 333 788 vd source f04f16dd6fd058b8328c67a3e064abd5 https www
  • 【Zabbix实战之运维篇】Zabbix的客户端自动注册配置

    Zabbix实战之运维篇 Zabbix的客户端自动注册配置 一 自动注册与自动发现介绍 1 自动注册介绍 2 自动发现介绍 3 主动模式与被动模式 二 客户端安装abbix agent2 1 下载zabbix agent2软件包 2 安装z
  • Python 设计真实反弹球算法及原理分析 (使用物理定律)

    文章简单地使用物理定律 编写程序模拟真实世界中的碰撞 在开始正式讲解之前 先看这两个代码 把球掉头 ball speed 0 ball speed 0 ball speed 1 ball speed 1 可以看到 这个代码直接把球的速度反了
  • 某电商数据分析:利用SQL做查询分析

    本文利用MYSQL在数据分析中的作用 将数据导入NAVICAT 对某电商展开数据分析工作 一 理解数据 字段说明 1 orderinfo表 1 orderid 订单编号 2 userid 用户编号 3 isPaid 订单状态 是否已支付 4
  • element ui 树形控件点击

    element 树形控件 点击当前节点 鼠标再离开后 当前节点就是个白色的背景颜色 我试了很多方法都不能完全性解决这个问题 最后是 gt gt gt el tree node focus gt el tree node content ba
  • Java笔试面试总结—try、catch、finally语句中有return 的各类情况

    前言 之前在刷笔试题和面试的时候经常会遇到或者被问到 try catch finally 语法块的执行顺序等问题 今天就抽空整理了一下这个知识点 然后记录下来 正文 本篇文章主要是通过举例的方式来阐述各种情况 我这里根据 try catch
  • 编译SandBoxie-plus自动生成文件脚本

    首先添加moc exe所在目录的PATH环境变量 moc exe MiscHelpers Common CheckableMessageBox h o MiscHelpers Common moc CheckableMessageBox c
  • 【科普】波特率和比特速率的理解

    什么是波特率 单位时间内传输的码元个数称为波特率 单位为 Baud 那码元又是什么呢 码元又称为 符号 即 symbol 维基百科上对码元的解释 持续一段固定时间的通信信道有效状态就是码元 这么解释比较抽象 可以解释码元的物理意义 在通信信
  • win7下exe提示无法正常启动(0xc0000906)

    本人遇见是 avast问题 卸了
  • 【特征工程】特征创建(属性创建)

    特征创建也称属性创建 包括 特征提取 映射数据到新的空间 二次特征 特征构造 1 特征提取 肯定就生成新的特征 2 将数据映射到新的空间 扩维或降维 也会形成性的特征 3 二次特征 通过基础特征构造出新的特征
  • 《Python编程无师自通》读书笔记

    不能越界访问函数内部定义的变量 global不能乱用 啥时候用元组 join连接 小点 但第一次见会觉得蛮有意思 Hangman 10 1的案例蛮有意思的 一搜才发现是十分经典的文字游戏 过程式编程的缺点以及函数式编程和面向对象编程的解决方
  • c++标准异常类的继承实现

    出处来自百度 查来学习之用 AbnomalTest cpp 定义控制台应用程序的入口点 include StdAfx h include
  • Qt中绘制折线

    Qt中绘制折线 基本流程 三要素 场景 图表 序列 创建场景 创建图表 图表添加到场景 创建序列 序列添加到图表 创建坐标轴并设置 坐标轴添加到图表 序列 坐标轴 图表配合 序列设值 1 必要配置 pro文件 QT charts 头文件 i
  • 常见操作String的方法(字符查找,索引查找)

    常见操作String的方法 字符查找 索引查找 在给定的字符串中查找字符或字符串是比较常见的操作 字符串查找分为两种形式 一种是在字符串中获取匹配字符 串 的索引值 另一种是在字符串中获取指定索引位置的字符 根据字符查找indexOf la
  • 分析排查Hystrix熔断降级未能真正生效的问题

    1 现象 压测无法进入hystrix熔断处理 检查feign hystrix enabled是开启的 hystrix设定的最大并发连接为100 降级最大并发连接为50 hystrix command default execution is
  • 算法:双指针

    双指针 双指针是一种思想或一种技巧并不是特别具体的算法 具体就是用两个变量动态存储两个结点 来方便我们进行一些操作 通常用在线性的数据结构中 特别是链表类的题目 经常需要用到两个或多个指针配合来记忆链表上的节点 完成某些操作 常见的双指针方
  • HTML 标签

    浏览器支持 所有浏览器都支持
  • Java-基于SSM+JSP的医院挂号管理系统

    项目背景 随着科学技术的飞速发展 社会的方方面面 各行各业都在努力与现代的先进技术接轨 通过科技手段来提高自身的优势 医院预约挂号系统当然也不能排除在外 医院预约挂号系统是以实际运用为开发背景 运用软件工程开发方法 采用jsp技术构建的一个