# 高校健康上报系统 **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
输入图片说明
输入图片说明