1 项目介绍
1.1 摘要
伴随着信息化时代的到来,万物互联,互联网开始走入每家每户中,传统行业也逐步进行数字化信息转型。传统的问诊,需要患者到医院排队取号,效率低,无法查看当前排队数量,医生也无法实时掌握患者动态,医生和患者之间消息是闭塞的 无法打通.因此需要构建一款信息化、智能化的问诊系统来支撑现代化的问诊。
为提升患者和医院的问诊效率,通过构建数字化的智能系统方便医院管理者实时的掌握医院的整体动态,方便医生进行放号,方便患者及时了解医院消息,通过信息化系统进行挂号预约等业务操作,打通患者和医院之间问诊的繁琐性,通过信息化系统简化流程,提升效率.
本课题拟设计的基于Spring Boot+Vue+ElementUI+SpringSecurity框架开发的智慧问诊系统.通过Spring Boot +Spring Security 作为后端的框架保证系统的稳定性和安全性,通过Vue+ElementUI保证用户操作界面的美观性。以此构建出易操作,界面美观的系统。
本文针对患者和医院之间问诊面临的挂号预约不方便,无法及时了解信息,医生放号苦难的痛点,通过构建信息化的智能问诊系统,打通患者和医院之间问诊的困难,通过信息化技术实现智能挂号预约,放号,医生以及科室的智慧化管理。为患者和医院的就诊提供了信息化的支撑,大大提升就诊效率。
1.2 系统技术栈
Spring Boot
Maven
Shrio
MySQL
Vue
VueRout
ElementUI
Bootstrap
1.3 系统角色
管理员
用户
1.4系统功能框架图
1.5 运行可行性
本系统是在Spring Boot,Vue以及Layui开源框架的基础架构上开发的系统,系统成熟稳定可扩展性强,不仅在windows上能够稳定的运行同时在mac系统上也能稳定运行。只需要在IDEA编译器上启动程序,然后在浏览器上输入访问地址就能够访问系统功能。并且本系统通过研究市面上已有成熟系统之后,通过吸取他们的优秀功能以及界面,并在此基础上设计出更加简洁高效操作方便的功能界面,使用户操作更加便捷,并不需要过多的系统方面的介绍以及培训。因此本系统设计开发的新闻推荐系统在运行方面是可行的。
2 详细设计与实现
2.1 登录
系统通过idea成功运行后,浏览器地址栏打开http://localhost:8080,即可进入系统登录页面;用户输入手机号和密码点击登录,系统校验通过之后即可进入到智慧问诊系统首页。如图5.1所示。
图5.1 用户登录界面
用户在输入账号和密码之后,页面会发送POST请求调用/login接口将uname和upass参数传到后台,后台是通过Spring Security进行登录的通过我们自定义的 loadUserByUsername方法进行用户的账号和密码校验。用户登录核心代码如下。
protected void configure(HttpSecurity httpSecurity) throws Exception {
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry expressionInterceptUrlRegistry = httpSecurity.authorizeRequests();
for(String authenticationUrl : noAuthenticationProperties.getAuthentication()){
expressionInterceptUrlRegistry.antMatchers(authenticationUrl).permitAll();
}
expressionInterceptUrlRegistry.and().formLogin()
// 默认提示登陆的接口
.loginPage("/zwz/common/needLogin")
// 默认登陆的接口
.loginProcessingUrl("/zwz/login")
.permitAll()
// 登陆成功
.successHandler(authenticationSuccessHandler)
// 登陆失败
.failureHandler(authenticationFailHandler)
.and()
// IFrame跨域
.headers().frameOptions().disable()
.and()
.logout()
.permitAll()
.and()
.authorizeRequests()
.anyRequest()
// 请求的身份认证
.authenticated()
.and()
// 跨域配置
.cors().and()
// 关闭跨域拦截
.csrf().disable()
// 配置JWT
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
// 系统菜单权限拦截
.exceptionHandling().accessDeniedHandler(zwzAccessDeniedHandler)
.and()
// 验证码过滤
.addFilterBefore(imageValidateFilter, UsernamePasswordAuthenticationFilter.class)
// 备用过滤器
.addFilterBefore(myFilterSecurityInterceptor, FilterSecurityInterceptor.class)
// JWT认证过滤
.addFilter(new JwtRoleFilter(authenticationManager(), zwzLoginProperties, stringRedisTemplate, securityUtil));
}
2.2 注册页面
用户如果没有账号可以登录系统可以在系统注册页面进行账号的注册,注册信息需要输入昵称、手机号、密码。如图5.2所示。
图5.2 注册界面
用户点击注册页面之后Vue的路由就会跳转的注册页面,在用户输入账号密码以及验证码之后点击注册,系统会发送请求到 user/regist用户注册接口,该请求是一个post请求,核心代码如下。
public Result<Object> regist(@Valid User u){
u.setEmail(u.getMobile() + "@qq.com");
QueryWrapper<User> userQw = new QueryWrapper<>();
userQw.and(wrapper -> wrapper.eq("username", u.getUsername()).or().eq("mobile",u.getMobile()));
if(iUserService.count(userQw) > 0L) {
return ResultUtil.error("登陆账号/手机号重复");
}
String encryptPass = new BCryptPasswordEncoder().encode(u.getPassword());
u.setPassword(encryptPass).setType(0);
iUserService.saveOrUpdate(u);
QueryWrapper<Role> roleQw = new QueryWrapper<>();
roleQw.eq("default_role",true);
List<Role> roleList = iRoleService.list(roleQw);
if(roleList.size() > 0){
for(Role role : roleList) {
iUserRoleService.saveOrUpdate(new UserRole().setUserId(u.getId()).setRoleId(role.getId()));
}
}
return ResultUtil.data(u);
}
2.3 科室管理
用户进入到科室管理界面之后,列表展示的字段主要有序号、科室名称、科室代码、科室介绍、成立日期、责任医生、备注。列表主要有编辑和删除字段。
用户进入到科室管理界面之后,页面发送POST请求到HospitalSubjectController类的getByPage接口,后台接收到请求之后将分页查询结果返回给前端,核心代码如下。
public Result<IPage<HospitalSubject>> getByPage(@ModelAttribute HospitalSubject subject,@ModelAttribute PageVo page){
QueryWrapper<HospitalSubject> qw = new QueryWrapper<>();
if(!ZwzNullUtils.isNull(subject.getSubName())) {
qw.like("sub_name",subject.getSubName());
}
if(!ZwzNullUtils.isNull(subject.getSubCode())) {
qw.like("sub_code",subject.getSubCode());
}
return new ResultUtil<IPage<HospitalSubject>>().setData(iHospitalSubjectService.page(PageUtil.initMpPage(page),qw));
}