# 疫情防控及疾病预测_基于sklearn随机深林_springboot_vue **Repository Path**: tzltd_kefu/yiqingapp ## Basic Information - **Project Name**: 疫情防控及疾病预测_基于sklearn随机深林_springboot_vue - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2021-04-16 - **Last Updated**: 2025-02-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 遵循 apache 协议,同时接商用软件,微信 : 18565703296 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0416/160627_496fe725_7824008.png "屏幕截图.png") 1. - 1. 开发文档 1. - 1. 1.项目功能 1. - 1. 2.开发技术 1. - 1. 3.开发工具 1. - 1. 4.核心功能模块介绍 项目功能: 用户功能: 1. 全国疾病数据地理位置分布 1. 用户注册登录 1. 疫苗接种预约 1. 出行防护提醒 1. 身体疾病预测(基于随机 sklearn 随机森林) 1. 医生端功能: 1. 医生注册登录 1. 未检测病人分配 1. 病人信息录入 1. 身体疾病预测(基于随机 sklearn 随机森林) 管理员功能: - 登录 - 医院管理(预约人数管理) - 医生管理(删改查) - 用户管理(删改查) 开发技术: - mysql server8 数据库 - spring boot 全家桶 - redis (session管理) - vue 全家桶 - 饿了么 ui (element ui) - python sklearn (随机深林预测) - csv 疾病数据集存储 - js 爬虫全国疫情数据信息,https://ncov.dxy.cn/ncovh5/view/pneumonia 爬虫链接 开发工具: - idea - mysql workbench 核心功能模块介绍: 1:数据库: _程序使用 mysql workbench 建表. 1:admin表包含(name,password)2:doctor 表字段为:(id,name,password,phone,realname,hid,status,subject,idcard,age citys gender )hid 为该医生所属医院,status 为该医生是否可用,subject 为该医生所在的科室。3:hosptial表字段为:(id,name,maxorder,status ) 分别意为 医院名称,每天最大申请预约,开启状态。4:spiderlog表字段为:(data,createtime)爬虫获取的数据,以及爬取的时间,5用户表字段为(id,name,password,status,idcard,realname,citys,work,gender,age,checked,infoed)status为状态,checked 为是否录入血常规信息,infoed为是否上传用户基本信息)6、用户健康信息表:(uid,rbc,hb,plt,ly,mono,zam,apky,ns,xt,xy)分别为 用户id,红细胞计数,血红蛋白浓度,血小板计数,淋巴细胞比值,单核细胞计数(MONO),转氨酶,癌胚抗原,尿酸,血糖,血压,7、user_health_report表代表对应项的检测报告,8、yimiao_order代表用户预约医院的时间。 _ 2:机器学习-随机深林 _基于python3 sklearn 使用 随机深林算法训练模型并预测输入值,随机深林是一种需要手工标记特征点的算法,故从AkshayBhat获取响应数, 首先,导入pandas 、sklearn、numpy等依赖库 import pandas as pd import numpy as np from pandas import DataFrame from sklearn.metrics import roc_auc_score from sklearn.metrics import classification_report from sklearn.ensemble import RandomForestClassifier from sklearn import tree from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split import sys, getopt 使用pandas 导入csv文件,再讲csv数据集分割为19-1 作为训练数据集,测试数据集,提取数据集最后一行作为结果集,使用sklearn.tree 随机深林里的RandomForestClassifier随机深林分类器对数据进行分类,设置最大深度为none,防止模型过拟合,获得随机深林模型,再使用随机深林模型预测用户的输入数据。_ 3:爬虫获取疫情数据 _首先创建webpack基础项目,导入cheerio,superagent,jquery等基础库,使用superagent获取丁香园连接的整个dom,使用cheerio加载dom文件到$节点,再获取getAreaStat,getListByCountryTypeService2true节点下的疫情数据_ 4:springboot restful 后台接口 _ 创建spring boot 基础项目,添加 security,redis,fastjson,mybatis-plus,lombok等基础库作为项目基础脚手架,添加配置器,继承如下方法实现运行前后端跨域处理 @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 设置允许跨域请求的域名 .allowedOriginPatterns("*") // 是否允许证书(cookies) .allowCredentials(true) // 设置允许的方法 .allowedMethods("*") // 跨域允许时间 .maxAge(3600); } 添加接口申请流量控制,对接口进行防ddos攻击处理 @Inherited @Documented @Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface AccessLimit { //指定second 时间内 API请求次数 int times() default 1; // 请求次数的指定时间范围 秒数(redis数据过期时间) int second() default 1; } 创建mapper作为数据库操作接口层,继承于basemapper,可使用mybais-plus的基础功能,创建对应bean为数据库对应表对应字段列的。再创建commandline命令行调用工具类,代码如下,调用executeCmd函数后,调用 Runtime.getRuntime().exec()方法执行cmd命令,由此即可调用python中的随机深林进行疾病预测,以及疫情数据获取。 @Override public String executeCmd(String cmd) { Process p = null; String res; log.debug("CommandService cmd info : {}", cmd); try { List cmds = new ArrayList<>(); cmds.add(BASH); cmds.add(BASH_PARAM); cmds.add(cmd); ProcessBuilder pb = new ProcessBuilder(cmds); p = pb.start(); Future errorFuture = executor.submit(new ReadTask(p.getErrorStream())); Future resFuture = executor.submit(new ReadTask(p.getInputStream())); int exitValue = p.waitFor(); if (exitValue > 0) { log.info("exec cmd error: {} ", errorFuture.get()); res = errorFuture.get(); } else { res = resFuture.get(); } } catch (Exception e) { log.info("exec cmd error: {} ", e.getMessage()); res = e.getMessage(); } finally { if (p != null) { p.destroy(); } } return res; } class ReadTask implements Callable { InputStream is; ReadTask(InputStream is) { this.is = is; } @Override public String call() throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(is,"GBK")); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); } return sb.toString(); } } 后端添加定时爬取最新疫情数据方法: @Scheduled(fixedRate = 1000000) public void execute() { String res = commandService.executeCmd("cd spider/server ;node spider.js"); Spiderlog spiderlog = new Spiderlog(); spiderlog.setCreatetime(LocalDateTime.now()); spiderlog.setData(res); spiderMapper.insert(spiderlog); } 设置Scheduled注解,设置执行频率100000毫秒,调用 commandService执行爬虫cmd 权限分级实现方法: 用户登录后,设置request.getsession. Setattribute (“”loginid”, user.get(0). getid)) request.getSession().setAttribute("loginrole","admin");从而实现权限控制, 5:Vue 前台设计 1:设置依赖如下: "axios": "0.17.1", "element-china-area-data": "^5.0.2", "element-ui": "2.15.1", "js-cookie": "2.2.0", "normalize.css": "7.0.0", "nprogress": "0.2.0", "vue": "2.5.10", "vue-router": "3.0.1", "vuex": "3.0.1" 2:基础框架,main.js添加导入permission,icon,router,store,ElementUI,echarts,等作为项目基础结构脚手架,router/router.js里添加管理员路由,用户路由,医生路由,以及其他路由并设置访问权限 3:echarts地图页的实现,views/user/index/index.vue 页面里面添加dom节点如下:
Methods里面添加如下方法,并在createed里面调用该方法,方法中,调用getlastSpiderlog api从后端获取最后一次爬虫的结果,并json解析data节点的内容作为爬虫数据,使用this.$echarts.init方法并传入上面创建的dom节点创建myChart 变量,并设置对应的option作为echart参数,成功后即可绘制地图 getbaseinfo() { getlastSpiderlog({}).then(res => { this.yiqingdata = res.info.data this.yiqingdata = JSON.parse( this.yiqingdata ); var myChart = this.$echarts.init(document.getElementById('myChart')); const result = this.yiqingdata.getAreaStat; var filterArr = []; console.log(result) result.forEach(item => { filterArr.push({ name: item.provinceShortName, // 省份 value: item.confirmedCount, // 累计确诊 deadCount: item.deadCount, // 死亡人数 curedCount: item.curedCount, // 治愈人数 currentConfirmedCount: item.currentConfirmedCount // 当前确诊人数 }); }); // console.log(filterArr); // 使用刚指定的配置项和数据显示图表。 myChart.setOption({ title: { // 标题 text: '全国实时疫情数据分布图', left: 'center', // 居中 top: 10, }, // 背景色 backgroundColor: '#f7f7f7', visualMap: [{ type: 'piecewise', //piecewise分段 continuous连续 pieces: [ { gt: 10000 }, // (10000, Infinity] { gt: 1000, lte: 9999 }, // (1000, 9999] { gt: 100, lte: 999 }, // (100, 999] { gt: 10, lte: 99 }, // (10, 99] { gt: 0, lte: 9 } // (0, 9) ], inRange: { // 设置地图颜色 color: ['#fdebcf', '#f59e83', '#e55a4e', '#fd030b', '#811c24'], } }], tooltip: { // 鼠标移上去人数提示 formatter: function (params) { // console.log(params); return `地区:${params.name}
累计确诊:${params.data && params.data.value || 0}
累计死亡:${params.data && params.data.deadCount || 0}
累计治愈:${params.data && params.data.curedCount || 0}
现存确诊:${params.data && params.data.currentConfirmedCount||0}` } }, series: [{ type: 'map', // 设置类型为地图 map: 'china', // 引入地图 js label: { // 显示各省名称 show: true }, data: filterArr // 数据数组 }] }); this.loading = false; }) } 4:配置axios 作为ajax于后端api进行交互 import axios from 'axios' import { Message, MessageBox } from 'element-ui' import store from '../store' import { getToken } from '@/utils/auth' // 创建axios实例 const service = axios.create({ baseURL: process.env.BASE_API, // api的base_url timeout: 300000, // 请求超时时间 async: false, }) service.defaults.withCredentials = true //使用同浏览器的cokie,session签证 // request拦截器 service.interceptors.request.use(config => { if (store.getters.token) { config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 } return config }, error => { // Do something with request error console.log(error) // for debug Promise.reject(error) }) // respone拦截器 service.interceptors.response.use( response => { /** * code为非1是抛错 可结合自己业务进行修改 */ var res = response.data console.log(res) if (res.code !== 1) { Message({ message: res.info, type: 'error', duration: 5 * 1000 }) // 50008:非法的token; 50012:其他客户端登录了; 50014:Token 过期了; if (res.code === 50008 || res.code === 50012 || res.code === 50014) { MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { store.dispatch('FedLogOut').then(() => { location.reload()// 为了重新实例化vue-router对象 避免bug }) }) } return Promise.reject('error') } else { return Promise.resolve(res) } }, error => { console.log('err' + error)// for debug Message({ message: error.info, type: 'error', duration: 5 * 1000 }) return Promise.reject(error) } ) export default service _