基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个医院挂号系统

基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个医院挂号系统是一个实用的项目。
在这里插入图片描述

步骤一:需求分析

明确系统需要实现的功能,比如:

  • 用户注册和登录
  • 查看医生列表
  • 预约挂号
  • 查看预约记录
  • 取消预约
  • 管理员管理医生信息和预约记录

步骤二:设计数据库

使用 MySQL 数据库存储系统数据。设计数据库表结构如下:

用户表(users)
  • id (INT, 主键, 自增)
  • username (VARCHAR)
  • password (VARCHAR)
  • email (VARCHAR)
  • phone (VARCHAR)
医生表(doctors)
  • id (INT, 主键, 自增)
  • name (VARCHAR)
  • department (VARCHAR)
  • introduction (TEXT)
  • schedule (TEXT)
预约表(appointments)
  • id (INT, 主键, 自增)
  • user_id (INT, 外键)
  • doctor_id (INT, 外键)
  • appointment_time (DATETIME)
  • status (VARCHAR)

步骤三:选择开发工具

使用 IntelliJ IDEA 或 Eclipse 作为开发环境。

步骤四:搭建项目结构

  1. 创建 Maven 项目。
  2. 添加必要的依赖项(Spring、Spring MVC、MyBatis、MySQL 驱动等)。

步骤五:配置文件

application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/hospital_registration?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis.mapper-locations=classpath:mapper/*.xml
spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.hospital"/><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean></beans>
mybatis-config.xml
<configuration><mappers><mapper resource="mapper/UserMapper.xml"/><mapper resource="mapper/DoctorMapper.xml"/><mapper resource="mapper/AppointmentMapper.xml"/></mappers>
</configuration>

步骤六:编写实体类

User.java
package com.hospital.entity;public class User {private int id;private String username;private String password;private String email;private String phone;// Getters and Setters
}
Doctor.java
package com.hospital.entity;public class Doctor {private int id;private String name;private String department;private String introduction;private String schedule;// Getters and Setters
}
Appointment.java
package com.hospital.entity;import java.util.Date;public class Appointment {private int id;private int userId;private int doctorId;private Date appointmentTime;private String status;// Getters and Setters
}

步骤七:编写 DAO 层

UserMapper.java
package com.hospital.mapper;import com.hospital.entity.User;
import org.apache.ibatis.annotations.*;@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")User login(@Param("username") String username, @Param("password") String password);@Insert("INSERT INTO users(username, password, email, phone) VALUES(#{username}, #{password}, #{email}, #{phone})")@Options(useGeneratedKeys = true, keyProperty = "id")void register(User user);
}
DoctorMapper.java
package com.hospital.mapper;import com.hospital.entity.Doctor;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface DoctorMapper {@Select("SELECT * FROM doctors")List<Doctor> getAllDoctors();@Select("SELECT * FROM doctors WHERE id = #{id}")Doctor getDoctorById(int id);@Insert("INSERT INTO doctors(name, department, introduction, schedule) VALUES(#{name}, #{department}, #{introduction}, #{schedule})")@Options(useGeneratedKeys = true, keyProperty = "id")void addDoctor(Doctor doctor);@Update("UPDATE doctors SET name=#{name}, department=#{department}, introduction=#{introduction}, schedule=#{schedule} WHERE id=#{id}")void updateDoctor(Doctor doctor);@Delete("DELETE FROM doctors WHERE id=#{id}")void deleteDoctor(int id);
}
AppointmentMapper.java
package com.hospital.mapper;import com.hospital.entity.Appointment;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface AppointmentMapper {@Select("SELECT * FROM appointments WHERE user_id = #{userId}")List<Appointment> getAppointmentsByUserId(int userId);@Select("SELECT * FROM appointments WHERE id = #{id}")Appointment getAppointmentById(int id);@Insert("INSERT INTO appointments(user_id, doctor_id, appointment_time, status) VALUES(#{userId}, #{doctorId}, #{appointmentTime}, #{status})")@Options(useGeneratedKeys = true, keyProperty = "id")void addAppointment(Appointment appointment);@Update("UPDATE appointments SET appointment_time=#{appointmentTime}, status=#{status} WHERE id=#{id}")void updateAppointment(Appointment appointment);@Delete("DELETE FROM appointments WHERE id=#{id}")void deleteAppointment(int id);
}

步骤八:编写 Service 层

UserService.java
package com.hospital.service;import com.hospital.entity.User;
import com.hospital.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User login(String username, String password) {return userMapper.login(username, password);}public void register(User user) {userMapper.register(user);}
}
DoctorService.java
package com.hospital.service;import com.hospital.entity.Doctor;
import com.hospital.mapper.DoctorMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class DoctorService {@Autowiredprivate DoctorMapper doctorMapper;public List<Doctor> getAllDoctors() {return doctorMapper.getAllDoctors();}public Doctor getDoctorById(int id) {return doctorMapper.getDoctorById(id);}public void addDoctor(Doctor doctor) {doctorMapper.addDoctor(doctor);}public void updateDoctor(Doctor doctor) {doctorMapper.updateDoctor(doctor);}public void deleteDoctor(int id) {doctorMapper.deleteDoctor(id);}
}
AppointmentService.java
package com.hospital.service;import com.hospital.entity.Appointment;
import com.hospital.mapper.AppointmentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class AppointmentService {@Autowiredprivate AppointmentMapper appointmentMapper;public List<Appointment> getAppointmentsByUserId(int userId) {return appointmentMapper.getAppointmentsByUserId(userId);}public Appointment getAppointmentById(int id) {return appointmentMapper.getAppointmentById(id);}public void addAppointment(Appointment appointment) {appointmentMapper.addAppointment(appointment);}public void updateAppointment(Appointment appointment) {appointmentMapper.updateAppointment(appointment);}public void deleteAppointment(int id) {appointmentMapper.deleteAppointment(id);}
}

步骤九:编写 Controller 层

UserController.java
package com.hospital.controller;import com.hospital.entity.User;
import com.hospital.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/login")public String showLoginForm() {return "login";}@PostMapping("/login")public String handleLogin(@RequestParam("username") String username, @RequestParam("password") String password, Model model) {User user = userService.login(username, password);if (user != null) {model.addAttribute("user", user);return "redirect:/doctors";} else {model.addAttribute("error", "Invalid username or password");return "login";}}@GetMapping("/register")public String showRegisterForm() {return "register";}@PostMapping("/register")public String handleRegister(User user) {userService.register(user);return "redirect:/login";}
}
DoctorController.java
package com.hospital.controller;import com.hospital.entity.Doctor;
import com.hospital.service.DoctorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;@Controller
public class DoctorController {@Autowiredprivate DoctorService doctorService;@GetMapping("/doctors")public String showDoctors(Model model) {List<Doctor> doctors = doctorService.getAllDoctors();model.addAttribute("doctors", doctors);return "doctors";}@GetMapping("/doctor/{id}")public String showDoctorDetails(@RequestParam("id") int id, Model model) {Doctor doctor = doctorService.getDoctorById(id);model.addAttribute("doctor", doctor);return "doctorDetails";}@GetMapping("/addDoctor")public String showAddDoctorForm() {return "addDoctor";}@PostMapping("/addDoctor")public String handleAddDoctor(Doctor doctor) {doctorService.addDoctor(doctor);return "redirect:/doctors";}@GetMapping("/editDoctor/{id}")public String showEditDoctorForm(@RequestParam("id") int id, Model model) {Doctor doctor = doctorService.getDoctorById(id);model.addAttribute("doctor", doctor);return "editDoctor";}@PostMapping("/editDoctor")public String handleEditDoctor(Doctor doctor) {doctorService.updateDoctor(doctor);return "redirect:/doctors";}@GetMapping("/deleteDoctor/{id}")public String handleDeleteDoctor(@RequestParam("id") int id) {doctorService.deleteDoctor(id);return "redirect:/doctors";}
}
AppointmentController.java
package com.hospital.controller;import com.hospital.entity.Appointment;
import com.hospital.entity.Doctor;
import com.hospital.service.AppointmentService;
import com.hospital.service.DoctorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.Date;
import java.util.List;@Controller
public class AppointmentController {@Autowiredprivate AppointmentService appointmentService;@Autowiredprivate DoctorService doctorService;@GetMapping("/appointments")public String showAppointments(@RequestParam("userId") int userId, Model model) {List<Appointment> appointments = appointmentService.getAppointmentsByUserId(userId);model.addAttribute("appointments", appointments);return "appointments";}@GetMapping("/makeAppointment")public String showMakeAppointmentForm(@RequestParam("userId") int userId, Model model) {List<Doctor> doctors = doctorService.getAllDoctors();model.addAttribute("doctors", doctors);model.addAttribute("userId", userId);return "makeAppointment";}@PostMapping("/makeAppointment")public String handleMakeAppointment(@RequestParam("userId") int userId, @RequestParam("doctorId") int doctorId,@RequestParam("appointmentTime") String appointmentTime) {Appointment appointment = new Appointment();appointment.setUserId(userId);appointment.setDoctorId(doctorId);appointment.setAppointmentTime(new Date());appointment.setStatus("Pending");appointmentService.addAppointment(appointment);return "redirect:/appointments?userId=" + userId;}@GetMapping("/cancelAppointment/{id}")public String handleCancelAppointment(@RequestParam("id") int id, @RequestParam("userId") int userId) {appointmentService.deleteAppointment(id);return "redirect:/appointments?userId=" + userId;}
}

步骤十:前端页面

使用 JSP 创建前端页面。以下是简单的 JSP 示例:

login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Login</title>
</head>
<body>
<h2>Login</h2>
<form action="${pageContext.request.contextPath}/login" method="post">Username: <input type="text" name="username"><br>Password: <input type="password" name="password"><br><input type="submit" value="Login">
</form>
<c:if test="${not empty error}"><p style="color: red">${error}</p>
</c:if>
</body>
</html>
doctors.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>Doctors</title>
</head>
<body>
<h2>Doctors</h2>
<table><tr><th>Name</th><th>Department</th><th>Introduction</th><th>Schedule</th><th>Action</th></tr><c:forEach items="${doctors}" var="doctor"><tr><td>${doctor.name}</td><td>${doctor.department}</td><td>${doctor.introduction}</td><td>${doctor.schedule}</td><td><a href="${pageContext.request.contextPath}/doctor/${doctor.id}">View</a><a href="${pageContext.request.contextPath}/editDoctor/${doctor.id}">Edit</a><a href="${pageContext.request.contextPath}/deleteDoctor/${doctor.id}">Delete</a></td></tr></c:forEach>
</table>
<a href="${pageContext.request.contextPath}/addDoctor">Add New Doctor</a>
</body>
</html>
makeAppointment.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>Make Appointment</title>
</head>
<body>
<h2>Make Appointment</h2>
<form action="${pageContext.request.contextPath}/makeAppointment" method="post"><input type="hidden" name="userId" value="${userId}">Doctor:<select name="doctorId"><c:forEach items="${doctors}" var="doctor"><option value="${doctor.id}">${doctor.name} (${doctor.department})</option></c:forEach></select><br>Appointment Time: <input type="datetime-local" name="appointmentTime"><br><input type="submit" value="Make Appointment">
</form>
</body>
</html>

步骤十一:测试与调试

对每个功能进行详细测试,确保所有功能都能正常工作。

步骤十二:部署与发布

编译最终版本的应用程序,并准备好 WAR 文件供 Tomcat 或其他应用服务器部署。

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

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

相关文章

Golang--反射

1、概念 反射可以做什么? 反射可以在运行时动态获取变量的各种信息&#xff0c;比如变量的类型&#xff0c;类别等信息如果是结构体变量&#xff0c;还可以获取到结构体本身的信息(包括结构体的字段、方法)通过反射&#xff0c;可以修改变量的值&#xff0c;可以调用关联的方法…

计算机网络 TCP/IP体系 数据链路层

一. 数据链路层的基本概念 数据链路层主要负责节点之间的通信&#xff0c;确保从物理层接收到的数据能够准确无误地传输到网络层。 数据链路层使用的信道主要有以下两种类型: 点对点信道: 这种信道使用一对一的点对点通信方式。广播信道: 这种信道使用一对多的广播通信方式,…

使用注解装配Bean

&#xff01;&#xff01;&#xff01;仅用作学习笔记记录&#xff01;&#xff01;&#xff01; 一、一些概念&#xff1a; 1.定义Bean的注解&#xff1a; 在实际开发中分别使用Repository、Service与Controller对实现类进行标注。 2.注入Bean组件装配的注解 Autowired默认…

csa文件管理账号管理练习

1、查看/etc/passwd文件的第18-20行内容&#xff0c;并将找到的内容存储至/home/passwd文件中&#xff08;head&#xff0c;tail&#xff0c;>,>>&#xff09; # head -num 显示文件头num行 # tail -num &#xff1a;显示文件的最后num行 # 输出重定向 > # 使用…

软考高级架构 - 8.1 - 系统质量属性与架构评估 - 超详细讲解+精简总结

第8章 系统质量属性与架构评估 软件系统属性包括功能属性和质量属性&#xff0c;而软件架构重点关注质量属性。 8.1 软件系统质量属性 8.1.1 概述 软件系统的质量反映了其与需求的一致性&#xff0c;即&#xff1a;软件系统的质量高低取决于它是否能满足用户提出的需求&#…

初见Linux:基础开发工具

前言&#xff1a; 这篇文章我们将讲述Linux的基本开发工具&#xff0c;以及讨论Linux的生态圈&#xff0c;最后再了解vim开发工具。 Yum&#xff1a; YUM&#xff08;Yellowdog Updater Modified&#xff09;是一个在Linux系统中用于管理软件包的工具&#xff0c;特别是在基于…

电信基站智能计量新方案:DJSF1352双通讯直流计量电表——安科瑞 丁佳雯

随着信息技术的飞速发展和5G时代的到来&#xff0c;电信基站作为信息传输的重要基础设施&#xff0c;其能耗管理和运营效率成为各大运营商关注的焦点。为了应对日益增长的能耗需求和复杂的运维挑战&#xff0c;采用高效、智能的计量方案显得尤为重要。在这样的背景下&#xff0…

Pytorch cuda版本选择(高效简洁版)

简而言之 Pytorch cuda版本选择 只需要低于cuda驱动版本即可&#xff0c;cuda驱动版本查看命令是nvidia-smi, nvcc -V 是runtimeapi版本可以不用管 1.只要看cuda驱动版本 安装pytorch 选择cuda版本&#xff0c;只要看你电脑cuda驱动版本即可。 2.选择依据 pytorch中cuda版本只…

全网最详细的项目管理完整方案!破解项目管理难题,解决方案一网打尽!

在现代企业中&#xff0c;项目管理愈发复杂&#xff0c;尤其是项目规模扩大、团队多元化的情况下&#xff0c;项目管理的难度逐渐上升。当前&#xff0c;企业在项目管理中面临以下主要问题&#xff1a; 信息碎片化&#xff1a;项目数据和文件分散在不同部门和系统中&#xff0…

数据库的使用05:不规范的写法与操作记录

一、写SQL带数据库名 【严禁】sql写成 select * from databasename.dbo.tablename 【原因】生产环境的databsename不一定和开发环境的databsename一样 【正确写法】select * from tablename 二、不合理的表设计 【改善方法】C#小结&#xff1a;数据库中数据表的设计原则、技…

YOLO11改进 | 融合改进 | C3k2引入多尺度分支来增强特征表征【全网独家 附结构图】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的C3k2替…

三维测量与建模笔记 - 3.1 相机标定基本概念

成像领域有多个标定概念 笔记所说的相机标定主要是指几何标定。 相机几何模型基于小孔成像原理&#xff0c;相关文章很多&#xff0c;上图中R t矩阵是外参矩阵&#xff08;和相机在世界空间中的位姿相关&#xff09;&#xff0c;K矩阵是内参矩阵&#xff08;和相机本身参数相关…

安卓/华为手机恢复出厂设置后如何恢复照片

绝大多数安卓用户都会经历过手机恢复出厂设置&#xff0c;部分用户可能没有意识到手机恢复出厂设置可能会导致数据丢失。但是&#xff0c;当您在 云盘上进行备份或在设备上进行本地备份时&#xff0c;情况就会有所不同&#xff0c;并且当您将 安卓手机恢复出厂设置时&#xff0…

丹摩征文活动 |【AI落地应用实战】文本生成语音Parler-TTS + DAMODEL复现指南

目录 一、Parler-TTS简介1.1、TTS 模型1.2、Parler-TTS 二、Parler-TTS复现流程2.1、创建实例2.2、配置代码与环境2.3、配置预训练模型2.4、Parles-TTS使用 Parler-TTS 是一个由 Hugging Face 开源的文本生成语音 (Text-to-Speech, TTS) 模型。它的设计目的是生成高质量的语音输…

【QT项目】QT6项目之基于C++的通讯录管理系统(联系人/学生管理系统)

目录 一.项目背景 二.创建工程 工程创建 添加文件 联系人类 功能类 三.功能实现 联系人类 person.cpp person.h 查 查询按钮槽函数 返回按钮槽函数 findperson.cpp: 增 addperson.cpp: 删 deleteperson.cpp&#xff1a; 改 changeperson.cpp&#xff1a…

一文详谈领域驱动设计实践

作者&#xff1a;泊静 阿里云开发者 导读 本文作者结合在团队的实践过程&#xff0c;分享了自己对领域驱动设计的一些思考。 了解过领域驱动设计的同学都知道&#xff0c;人们常常把领域驱动设计分为两部分&#xff1a;战术设计和战略设计。这两个概念本身都是抽象的&#xff…

单链表OJ思路

目录 前言 一、移除链表元素 二、反转链表 三、链表的中间结点 四、返回倒数第k个结点 五、合并两个有序链表 六、链表分割 七、链表的回文结构 八、相交链表 九、环形链表 十、环形链表|| 十一、随机链表的赋值 前言 11道单链表OJ题的解题思路。 一、移除链表元素 链接&#…

数据结构与算法——Java实现 54.力扣1008题——前序遍历构造二叉搜索树

不要谩骂以前的自己 他当时一个人站在雾里也很迷茫 ​​​​​​​ ​​​​​​​ ​​​​​​​—— 24.11.6 1008. 前序遍历构造二叉搜索树 给定一个整数数组&#xff0c;它表示BST(即 二叉搜索树 )的 先序遍历 &#xff0c;构造树并返回其根。 保证 对于给定…

【Qt聊天室客户端】单聊与群聊

1. 区分单聊和群聊 逻辑分析 具体实现逻辑 主窗口完善判断单聊还是群聊的逻辑 单聊会话详情入口中&#xff0c;设置头像和昵称 2. 删除好友 直接找到删除好友的按钮&#xff0c;然后实现其删除逻辑即可 具体实现 无法删除好友BUG处理 问题复现&#xff0c;点击好友删除后&…

1.集合体系补充(1)

1.接口式引用 集合的构造&#xff0c;我们需要采用接口类型引用的的方式&#xff0c;这样做的好处就是方便根据业务或者设计上的变化&#xff0c;快速更换具体的实现。 事实上&#xff0c;Java集合设计体系者也是支持我们这样做的&#xff0c;并且集合体系的设计也是如此的。 创…