医院信息化与智能化系统(19)
这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置
如果你想通过文字描述或代码画流程图,可以试试PlantUML
,告诉GPT你的文件结构,让他给你对应的代码
预约挂号微服务模块搭建
前端知识点补充,此章节不会详细讲具体前端的每个知识点
1、登录注册
创建service-user模块,依然是对应创建启动类、配置文件...
需要在getway模块配置文件,配置user的网关
在Controller类中需要创建方法实现功能
- 用户手机号登录接口
common中提供了LoginVo
实体类,包含登录对象
的手机号密码等字段。
在Impl类中创建loginUser
方法,接收LoginVo,返回一个Map集合。
逻辑:
从loginVo获取输入的手机号与验证码
判断手机号与验证码是否为空
判断是否是第一次登录:根据手机号查询数据库,如果不存在相同的手机号,则判定为第一次登录
不是第一次,直接登录,返回登录信息:用户名、token
Token
在用户登录成功后,服务器会生成一个 Token,客户端在后续请求中携带这个 Token 用于身份验证
JWT(JSON Web Token):
一种广泛使用的 Token 格式,通常由三部分组成:Header.Payload.Signature
,以点分隔。
部分 | 名称 | 描述 |
---|---|---|
公共部分 | Header | 包含 Token 的元信息,比如签名算法(alg )和类型(typ )。 |
私有部分 | Payload | 承载的实际数据,包括公共声明(如 iss 、exp )和私有声明(自定义字段,如 userId 、role )。 |
签名部分 | Signature | 确保 Token 未被篡改,由密钥对 Base64URL(Header) + "." + Base64URL(Payload) 进行签名,使用指定算法生成。 |
完整结构 | JWT (最终生成的 Token) | 通过 Base64URL(Header) 、Base64URL(Payload) 和 Base64URL(Signature) 拼接生成,部分数据可通过解码还原(签名部分除外)。 |
在common-util
模块引入依赖jjwt
,并创建JwtHelper类
为后续使用token,代码由项目提供。
生成 Token,输入用户 ID 和用户名,生成一个 JWT。
- 一个主题(Subject)
- 一个过期时间(tokenExpiration)
- 自定义声明(userId 和 userName)
- 签名算法(HS512)和签名密钥(tokenSignKey)。
- 压缩方式(GZIP)
测试时,我无法启动,报错:Mybatis-Mapperscan错误,与spring版本有关;我发现我不小心把service-user的父工程设置成了yygh-parent
了,修改很简单,在service-user的pom中更改为service
模块,再把yygh-parent中pom内的module标签
中,把service-use删了,再在service的pom中module标签中添加service-use即可。
swagger测试
2、阿里云短信服务
进入阿里云官网,查询短信服务->快速学习和测试,下方有一个专用的测试签名和模版
在右上方头像上找到AccessKey,然后创建AccessKey
,注意保存ID
和Secret
3、整合短信服务
创建service的子模块service-msm,添加aliyun-java-sdk-core
依赖
在配置文件application中添加关于redis数据库地址、服务端口、nacos阿里云AccessKey
创建启动类
注释的意思表示 不配置数据库
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)//取消数据源自动配置
@EnableDiscoveryClient
public class ServiceMsmApplication {public static void main(String[] args) {SpringApplication.run(ServiceMsmApplication.class, args);}
}
创建配置类ConstantPropertiesUtils
,在服务器启动时,就能将application中关于AccessKey
的信息,配置到字段REGION_Id
、ACCESS_KEY_ID
、SECRECT
中
在Controller中实现代码逻辑,其中要用到RedisTemplate
类进行redis数据库操作、并在utils文件夹创建RandomUtil
类,用于随机生成验证码
- 从redis获取验证码,如果获取成功,返回ok
- 如果从redis获取不到,调用RandomUtil生成
- 生成验证码,通过整合短信服务进行发送
- 生成验证码放到redis里面,设置有效时间
最终成功接收到短信,并在redis成功接收到信息(这个需要费用的,可以在阿里云充1块钱
)
这样就可以在UserInfoServiceImpl
完成验证手机验证码与redis手机验证码是否一致了。
前端操作
在myheader.vue
,即头页面中进行登录实现
需要安装 npm install js-cookie
,把用户信息记录在cookie中
注意:
- service-user的配置文件需要配置redis!!
- 验证码有有效时间
- 后端要启动5个服务
问题:
在预约挂号页面,选择科室去挂号时我们需要判断当前是否登录,如果登录可以进入下一个页面;如果没有登录需要显示登录层。
注册一个全局登录事件,当需要登录层是,我们发送一个登录事件,头部监听登录事件,然后我们触发登录按钮的点击事件即可打开登录层。
mounted:页面渲染后执行
mounted() {
// 注册全局登录事件对象
window.loginEvent = new Vue();
// 监听登录事件
loginEvent.$on('loginDialogEvent', function () {
document.getElementById("loginDialog").click();})
// 触发事件,显示登录层:loginEvent.$emit('loginDialogEvent')
}
这里要记得,可能你退出登录了,但是cookie还没失效,无法显示效果,可以换一个浏览器试试,它是不携带cookie的。