基于springboot的医护人员排班系统毕业设计(智能化排班算法+可视化排班界面)


在这里插入图片描述

前言

💗博主介绍:✌CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗

🌟私信联系源码+数据库🌟
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

一、选题的背景和意义

01、选题背景

  • 医护人力资源管理挑战:

    • 医院医护人员的合理排班对于医疗服务的质量和医护人员的工作生活平衡至关重要。然而,传统的排班方式可能存在效率低下、信息不透明等问题。
  • 数字化转型需求:

    • 随着信息技术的发展,医院管理也需要数字化转型,以提高管理效率、降低成本,并更好地满足患者和医护人员的需求。
  • 技术支持需求:

    • 基于Spring Boot等现代技术开发医护人员排班系统,能够提供灵活性、可扩展性和易用性,符合当今医疗机构对技术支持的需求。

02、设计意义

  • 优化排班流程:

    • 通过系统化的排班算法和规则,实现医护人员的合理排班,避免过度疲劳和资源浪费,提高工作效率。
  • 提升医疗服务质量:

    • 合理的排班可以保障医院在每个时段都有足够的医护人员,从而提升医疗服务的质量和安全性。
  • 改善医护人员工作体验:

    • 合理的排班可以更好地照顾医护人员的工作和生活平衡,提升工作满意度和减少人员流失率。
  • 支持决策和管理:

    • 系统化的排班数据可以为医院管理者提供数据支持,帮助他们做出更明智的决策。
  • 技术示范价值:

    • 作为毕业设计项目,基于Spring Boot的医护人员排班系统将展示现代技术在医疗行业的应用前景,具有一定的示范和推广价值。

一、系统设计

基于springboot的医护人员排班系统毕业设计

01、首页

在这里插入图片描述

02、后台

Image

03、编辑器

Image
Image

04、列表展示

Image

二、项目亮点

1、智能化排班算法:
该系统将应用智能化的排班算法,结合医院的具体需求和规则,自动进行排班计划生成。通过算法的优化和灵活性,可以实现医护人员的合理分配和资源最优化利用。

2、多维度排班考虑:
除了基本的时间和班次安排外,该系统还考虑了医护人员的技能、疲劳程度、假期等多个维度因素。通过综合考虑这些因素,可以更好地满足医护人员的需求和医院的运营要求。

3、灵活的排班规则配置:
系统提供灵活的排班规则配置功能,医院管理者可以根据实际情况设置排班规则,如工作时间段、休息时长、连续工作天数限制等。这样可以针对不同科室和岗位的需求进行个性化的排班安排。

4、可视化排班界面:
系统提供直观的可视化排班界面,管理员和医护人员可以通过该界面查看和编辑排班计划。界面友好易用,方便管理人员和医护人员进行操作和交流。

5、实时通知和调整:
系统支持实时通知功能,管理员可以通过系统向医护人员发送排班变动、提醒和通知等信息。同时,系统还提供排班调整功能,当有突发事件或变动时,管理员可以快速进行调整,并通知相关人员。

6、数据分析和报表生成:
系统将收集和分析排班数据,生成排班报表和统计结果,为医院管理者提供数据支持和决策参考。这些报表可以包括工作时长统计、人员利用率分析等内容,帮助优化人力资源管理。

三、论文参考

在这里插入图片描述

四、详细视频演示

请联系我获取更详细的演示视频

五、代码参考

01、后台登录鉴权

zhangstudy-pug-web-app/src/main/java/com/zfs/pug/controller/LoginController.java

@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
   UsersEntity user = userService.selectOne(new EntityWrapper<UsersEntity>().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);
}

	@Override
	public String generateToken(Long userid,String username, String tableName, String role) {
		TokenEntity tokenEntity = this.selectOne(new EntityWrapper<TokenEntity>().eq("userid", userid).eq("role", role));
		String token = CommonUtil.getRandomString(32);
		Calendar cal = Calendar.getInstance();   
    	cal.setTime(new Date());   
    	cal.add(Calendar.HOUR_OF_DAY, 1);
		if(tokenEntity!=null) {
			tokenEntity.setToken(token);
			tokenEntity.setExpiratedtime(cal.getTime());
			this.updateById(tokenEntity);
		} else {
			this.insert(new TokenEntity(userid,username, tableName, role, token, cal.getTime()));
		}
		return token;
	}



/**
 * 权限(Token)验证
 */
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {

    public static final String LOGIN_TOKEN_KEY = "Token";

    @Autowired
    private TokenService tokenService;
    
	@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

		//支持跨域请求
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
	// 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态
	if (request.getMethod().equals(RequestMethod.OPTIONS.name())) {
        	response.setStatus(HttpStatus.OK.value());
            return false;
        }
        
        IgnoreAuth annotation;
        if (handler instanceof HandlerMethod) {
            annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
        } else {
            return true;
        }

        //从header中获取token
        String token = request.getHeader(LOGIN_TOKEN_KEY);
        
        /**
         * 不需要验证权限的方法直接放过
         */
        if(annotation!=null) {
        	return true;
        }
        
        TokenEntity tokenEntity = null;
        if(StringUtils.isNotBlank(token)) {
        	tokenEntity = tokenService.getTokenEntity(token);
        }
        
        if(tokenEntity != null) {
        	request.getSession().setAttribute("userId", tokenEntity.getUserid());
        	request.getSession().setAttribute("role", tokenEntity.getRole());
        	request.getSession().setAttribute("tableName", tokenEntity.getTablename());
        	request.getSession().setAttribute("username", tokenEntity.getUsername());
        	return true;
        }
        
		PrintWriter writer = null;
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		try {
		    writer = response.getWriter();
		    writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
		} finally {
		    if(writer != null){
		        writer.close();
		    }
		}
//				throw new EIException("请先登录", 401);
		return false;
    }
}

02、前台部分代码逻辑

\Work\DHCC\mars\mars-UI-new\acct-mng-UI\src\pages\Acct\loan\PostLoan\ExtensionManagementAcNoView.tsx

constructor(props) {
		super(props);
		this.state = {
			acNo: '',
			acMark: '',
			selectedChange: ''
		}
	}

	//账户信息详情modal关闭
	delModel = () => {
		if(this.state.selectedChange){
			return message.error('请选择一条账户信息')
		}
		let acNo = this.state.acNo;
		let acMark = this.state.acMark
		DvaDispatch({
			type: 'PostLoan/ExtensionManagementDelModal',
			payload: {}
		  });

		//账户信息查询
		DvaDispatch({
			type: "PostLoan/acNoExtensionManagement",
			payload: {
				selectedChange: this.props.record.selectedChange,
				values: {
					acNo,
					acMark
				}
			}
		});
	};

	onSelect = e => {
		this.setState({
			acNo: this.props['PostLoan'].acNo,
			acMark: e.acMark
		})
	};

六、数据库参考

-- ----------------------------
-- Table structure for token
-- ----------------------------
DROP TABLE IF EXISTS `token`;
CREATE TABLE `token` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `userid` bigint(20) NOT NULL COMMENT '用户id',
  `username` varchar(100) NOT NULL COMMENT '用户名',
  `tablename` varchar(100) DEFAULT NULL COMMENT '表名',
  `role` varchar(100) DEFAULT NULL COMMENT '角色',
  `token` varchar(200) NOT NULL COMMENT '密码',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
  `expiratedtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '过期时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='token表';

-- ----------------------------
-- Records of token
-- ----------------------------
INSERT INTO `token` VALUES ('9', '23', 'cd01', 'xuesheng', '学生', 'al6svx5qkei1wljry5o1npswhdpqcpcg', '2023-02-23 21:46:45', '2023-03-15 14:01:36');
INSERT INTO `token` VALUES ('10', '11', 'xh01', 'xuesheng', '学生', 'fahmrd9bkhqy04sq0fzrl4h9m86cu6kx', '2023-02-27 18:33:52', '2023-03-17 18:27:42');
INSERT INTO `token` VALUES ('11', '17', 'ch01', 'xuesheng', '学生', 'u5km44scxvzuv5yumdah2lhva0gp4393', '2023-02-27 18:46:19', '2023-02-27 19:48:58');
INSERT INTO `token` VALUES ('12', '1', 'admin', 'users', '管理员', 'h1pqzsb9bldh93m92j9m2sljy9bt1wdh', '2023-02-27 19:37:01', '2023-03-17 18:23:02');
INSERT INTO `token` VALUES ('13', '21', 'xiaohao', 'shezhang', '社长', 'zdm7j8h1wnfe27pkxyiuzvxxy27ykl2a', '2023-02-27 19:38:07', '2023-03-17 18:25:20');
INSERT INTO `token` VALUES ('14', '27', 'djy01', 'xuesheng', '学生', 'g3teq4335pe21nwuwj2sqkrpqoabqomm', '2023-03-15 12:56:17', '2023-03-15 14:00:16');
INSERT INTO `token` VALUES ('15', '29', 'dajiyue', 'shezhang', '社长', '0vb1x9xn7riewlp5ddma5ro7lp4u8m9j', '2023-03-15 12:58:08', '2023-03-15 14:03:48');

七、源码获取

私信联系我即可~
大家点赞、收藏、关注、评论啦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张develop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值