# 高校健康上报系统
**Repository Path**: albb0608/uhrs
## Basic Information
- **Project Name**: 高校健康上报系统
- **Description**: 健康上报系统。
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2022-12-02
- **Last Updated**: 2022-12-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
高校健康上报系统
一、项目介绍
1. 本项目主要目的是实现一个健康上报系统,该系统的角色主要为校内用户和管理员。校内用户主要功能是在小程序打卡上报每天体温,同时用户还可以在地图上查看发热人员打卡地点和风险地区;管理员主要功能是在网页端查看用户每天的打卡记录且可以导出Excel表格、csv文件和pdf文件、管理用户和打卡信息。
2. 由于要获取用户打卡时的真实位置,需要定位服务,微信小程序端有两个组件,一个是wx.getLocation()(只能获取经纬度,但不需要用户操作,可以保证真实性),另一个是wx.chooseLocation()(能获取经纬度信息和地名信息,但需要用户确认或者修改位置,不能保证真实性),于是引入腾讯逆地址解释服务,将wx.getLocation()获取到的经纬度信息发送到逆地址解释服务接口来获取地名信息,从而保证用户打卡位置信息的真实性。
3. 由于打卡信息包含用户的个人信息,于是引入Spring Security来实现访问控制,但由于个人版小程序不能打开网页,只有管理员网页端采用了Spring Security,而小程序端采用检验JWT来实现安全访问。
4. 网页端管理员除了可以通过账号密码登录,还可以使用DGUT中央认证登录因此调用了中央认证接口,而小程序端由于个人版不能打开网页,没有接入中央认证,但为了用户登录方便,使用了小程序云开发函数来获取微信用户的openId,用户只需要在绑定页面将账号与微信绑定即可使用微信快速登录
5. 由于微信小程序要想上传为体验版和正式版需要https的域名,但https的域名申请并不简单,于是使用微信小程序云开发功能,利用其云函数作为中介避开微信小程序的域名检查,从而实现无需https域名也能访问接口,相应地就要将wx.request()替换成wx.callCloudFunction(),而云函数则使用Nodejs来实现接口的调用
6. 为了防止DOS攻击,小程序端和网页端都接入腾讯007防水墙
7. 为了解决用户重复打卡问题,用户在登录小程序端的同时在数据库中查找用户当天的打卡记录,若已打卡,则不显示打卡按钮(显示你已打卡字样),若未打卡则显示打卡按钮
8. 为解决每天凌晨更新用户打卡状态为未打卡,使用SpringBoot自动任务,每天凌晨0点调用更新用户打卡状态方法来解决
9. 为了实现将用户打卡信息导出为excel、pdf和csv功能,使用Layui框架自带的导出功能
10. 网页端访问地址为 http://81.69.13.22:8080/admin (因使用了Spring Security,会拦截请求跳转到 http://81.69.13.22:8080/admin/toAdminLogin ),由于DGUT中央认证为测试版接口,其返回接口为 http://localhost:8080/dgut/login,所以部署在服务器上的项目无法使用该功能,如想体验可以自行fork项目到本地主机体验(要将项目内的接口地址改为localhost),想体验微信小程序端可以扫码体验(注意:小程序内高风险地区的展示为测试数据,不代表实际环境中的数据)
网页端测试账号:zjp 密码: 123456
小程序端测试账号(该测试账号已解绑微信):201841412128 密码:123456
小程序码:
二、条件和环境
1. JDK 11或更高版本
2. Maven 3.6+
3. IntelliJ IDEA
4. 微信小程序开发者工具
5. 腾讯云服务器(Ubuntu 18.04.5 LTS)
6. Docker 20.10.2
7. 小程序云开发函数
8. Nodejs 12.22.1
9. npm 6.14.12
10. 腾讯逆地址解释服务
11. jquery-1.8.0
12. 腾讯007防水墙
13. layui 2.6.4
### **三、小程序端**
1. 使用WeUI框架实现用户登录页和用户打卡页:
2. 用户登录功能的实现
流程:用户在小程序端输入账号密码后点击登录,弹出腾讯防水墙验证码,验证成功后通过云开发函数请求/user/userLogin接口将用户的账号密码封装到form表单然后发送post请求到后台,后台在验证账号密码无误后将该用户的基本信息封装到User中同时生成Json web token (JWT)一并返回给小程序端,小程序端若收到到返回的user和token则跳转到打卡页面
小程序端代码:
后端代码:
3. 用户打卡功能实现:
流程:进入该页面时先判断用户是否已经打卡,该方法写在OnReady()中,即在页面初次渲染成功时执行,若已经打卡则打卡按钮变成提示语言“你已打卡!”,否则显示打卡按钮,基本信息诸如姓名、学号、打卡日期和打卡地点由系统填补,只有温度信息需要用户填写,填写完毕后点击提交即可以打卡。
判断用户是否打卡小程序端代码:
判断用户是否打卡接口代码:
进入登录页面后,用户基本信息从全局变量中读取,同时后台同时调取wx.getLocation()获取用户所在地址的经纬度,然后调用腾讯逆地址解释服务的API通过经纬度获取具体地址名称,然后将其显示在登录页面:
小程序端代码:
用户只需填写完体温信息(如若手机号变更也可以重新输入手机号码,其他信息均为自动填入)后点击提交即可打卡,打卡成功后则打卡按钮变成打卡成功字样,用户无法再次重复打卡:
小程序端代码:
后端API代码:
效果:
假如打卡记录中的体温超过37.3,会在发热人员打卡地点中显示位置:
4. 发热人员打卡地点功能实现:
流程:调用微信小程序中的map组件,根据前面获取的用户的经纬度信息,然后在进入该页面时调用云函数访问接口获取发热人员的信息,然后将这些信息利用markers标记在地图上,为了实现切换页面后再返回本页面能更新发热人员信息,在OnShow()中再次编写调用云函数的代码
小程序端代码(效果见上图):
后端API代码:
5. 高风险地区功能实现:
流程:调用微信小程序中的map组件,根据前面获取的用户的经纬度信息,然后在进入该页面时调用云函数访问接口获取高风险地区信息,然后将这些信息利用markers标记在地图上
小程序端代码:
后端API代码:
效果:
6. 绑定微信功能实现:
流程:小程序端点击绑定微信,进入绑定微信页面,用户输入其账号密码,点击绑定,小程序端调用wx.cloud.callFunction()分别调用getOpenId()和doPost()云函数,前者获取该微信的openId,后者将账号密码和获取的openId发送到后端,后端先验证该账号密码是否正确,若正确则继续查询该账号是否已绑定微信,若未绑定,则绑定该微信openId到该账号
小程序端代码:
后端API代码:
检查用户账号是否已经绑定微信:
UserController:

UserService:

UserMapper:
用户账号绑定微信:
UserController:

UserService:

UserMapper:
效果:
7. 绑定微信后微信快速登录功能实现:
流程:用户账号绑定微信,可以在小程序端用户登录界面点击微信快速登录按钮实现快速登录,在点击按钮后小程序端先发送该用户的openId给后端,后端验证该openId是否已绑定用户账号,若绑定则发送该用户的信息到小程序端,小程序端收到后执行与上面小程序端登录后的操作,进入打卡页面
小程序端代码:
后端API代码:
查询该openId绑定的用户,若存在,则生产token加入到usr1中发送回前端,若无则返回null:
UserController:

UserService:

UserMapper:
效果:
8. 添加登录前先判断用户是否被锁定判断,若被锁定,则提示用户并不让其进行登录以及登录后的操作:
小程序端代码:
后端API代码:
效果:
四、网页端
1. 管理员登录的实现:
流程:用户在未登录欲进入除管理员登录页面,SpringSecurity的拦截器就会自动拦截并重定向到http://81.69.13.22:8080/admin/toAdminLogin页面,在输入账号密码点击登录时,弹出防水墙验证码,验证成功后发送post请求,验证账号密码成功后跳转到管理员主页
实现代码:
2. 查看打卡记录功能的实现:
效果:
查看当天所有打卡记录:
查看当天未打卡的人:
查看当天异常记录:
查看所有记录:
查看所有异常记录:
3. 打印成csv、excel、pdf功能:
4. 搜索功能,因所有搜索功能基本实现效果一样,这里只展示一个页面的搜索功能:
5. 排序功能和分页功能:
web网页端代码实现:
使用Layui的数据表单:
6. 后端API代码实现:
7. 引入的依赖:
```
org.springframework.boot
spring-boot-starter-activemq
org.springframework.boot
spring-boot-starter-security
org.springframework.boot
spring-boot-starter-web
io.jsonwebtoken
jjwt
0.9.1
javax.xml.bind
jaxb-api
com.sun.xml.bind
jaxb-impl
3.0.0
com.sun.xml.bind
jaxb-core
3.0.0
org.projectlombok
lombok
true
mysql
mysql-connector-java
runtime
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
com.alibaba
druid
1.2.5
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-test
test
org.springframework.security
spring-security-test
test
net.minidev
json-smart
```
8. 项目结构:
9. JWTToken工具类:
10. CrosConfig类主要解决跨域问题:
11. SecurityConfig类配置SpringSecurity:
12. 设置SpringBoot自动任务,每天凌晨0点将用户的打卡状态设置为未打卡:
13. 添加网页端打卡记录编辑功能:
网页前端实现效果:点击编辑按钮后弹出一个修改表单,修改完成后点击确认则发送请求给后端API,修改成功后重新加载表格
网页前端实现代码:
后端实现代码:
14. 管理员登录接入莞工中央认证第三方登录:
在管理员登录页面点击中央认证登录可以重定向到莞工中央认证,登录成功后返回用户基本信息到后台验证是否有管理员权限,若有则跳转到管理员首页:
网页前端实现代码:
后端实现代码:
15. 用户管理功能的实现:
网页前端实现效果:点击用户管理里的所有用户,可以查看目前数据库中的所有用户信息,并且可以进行对应的编辑,删除,查询,锁定、解锁,排序,打印成csv、excel和pdf功能,并且做了分页功能
网页前端实现代码:
后端实现代码:
UserController:

UserService:

UserMapper:
五、部署上云并打包docker镜像
1. 在云服务器上安装docker:
2. 打包项目:
3. 新建一个文件夹(dockerFile),并将打包好的jar文件上传到此文件夹,新建一个dockerFile文件:
4. 编写dockerFile:
5. 打包Docker镜像 docker build -f dockerFile -t uhrs:v1.0 . :
6. 运行镜像:
-p后面有两个端口,分别是:宿主机端口:容器端口
docker run -p 8080:8080 --name=uhrs uhrs:v1.0
以上是没有后台运行的情况,如果要后台运行,则添加-d参数即可:
-p后面有两个端口,分别是:宿主机端口:容器端口
docker run -d -p 8080:8080 --name=uhrs uhrs:v1.0