You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

383 lines
14 KiB

from flask import Flask,render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
import datetime
import warnings
import requests
import re
warnings.filterwarnings("ignore")
app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/epidemic'
db = SQLAlchemy(app)
#定义类
class Province(db.Model):
__tablename__='province'
provinceID=db.Column(db.String(8))
provinceName=db.Column(db.String(8),unique=True,primary_key=True)
currentCount = db.Column(db.Integer)
confirmedCount = db.Column(db.Integer)
suspectedCount = db.Column(db.Integer)
curedCount = db.Column(db.Integer)
deadCount = db.Column(db.Integer)
class City(db.Model):
__tablename__='city'
cityID=db.Column(db.String(8),primary_key=True,index=True)
cityName=db.Column(db.String(8),nullable=False,unique=True)
provinceName=db.Column(db.String(8))
currentCount=db.Column(db.Integer)
confirmedCount=db.Column(db.Integer)
suspectedCount=db.Column(db.Integer)
curedCount=db.Column(db.Integer)
deadCount=db.Column(db.Integer)
class District(db.Model):
__tablename__='district'
districtID=db.Column(db.String(8),primary_key=True,index=True)
districtName=db.Column(db.String(8),nullable=False,unique=True)
cityID=db.Column(db.String(8),db.ForeignKey(City.cityID))
currentCount = db.Column(db.Integer,default=0)
confirmedCount = db.Column(db.Integer,default=0)
suspectedCount = db.Column(db.Integer,default=0)
curedCount = db.Column(db.Integer,default=0)
deadCount = db.Column(db.Integer,default=0)
class Community(db.Model):
__tablename__='community'
cID=db.Column(db.String(16),primary_key=True,index=True)
cName=db.Column(db.String(32),index=True,unique=True)
districtID = db.Column(db.String(8), db.ForeignKey(District.districtID))
currentCount = db.Column(db.Integer,default=0)
confirmedCount = db.Column(db.Integer,default=0)
suspectedCount = db.Column(db.Integer,default=0)
curedCount = db.Column(db.Integer,default=0)
deadCount = db.Column(db.Integer,default=0)
class Workplace(db.Model):
__tablename__='workplace'
wID=db.Column(db.String(32),primary_key=True)
wName=db.Column(db.String(32),unique=True,index=True)
wRate=db.Column(db.Float)
districtID=db.Column(db.String(8),db.ForeignKey(District.districtID))
class Hospital(db.Model):
__tablename__='hospital'
hID=db.Column(db.String(32),primary_key=True)
hName=db.Column(db.String(32),unique=True,nullable=False)
hStorage=db.Column(db.Integer)
hCurrent=db.Column(db.Integer,default=0)
hCured=db.Column(db.Integer,default=0)
hDead=db.Column(db.Integer,default=0)
districtID=db.Column(db.String(8),db.ForeignKey(District.districtID))
class Resident(db.Model):
__tablename__='resident'
rID=db.Column(db.String(18),primary_key=True)
rName=db.Column(db.String(8),nullable=False)
rFrom=db.Column(db.String(8)) #收录城市信息不全,暂不建立外键
rLive=db.Column(db.String(16),db.ForeignKey(Community.cID),nullable=False)
rWork=db.Column(db.String(32),db.ForeignKey(Workplace.wID))
rStatus=db.Column(db.String(16),default='default')
#r.Treat=db.Column(db.String(32),db.ForeignKey=(hospital.hID))
class Ware(db.Model):
__tablename__='ware'
ID=db.Column(db.Integer,primary_key=True,autoincrement=True)
wareID=db.Column(db.String(8))
wareName=db.Column(db.String(16))
wareNum=db.Column(db.Integer,default=0)
districtID=db.Column(db.String(8),db.ForeignKey(District.districtID),nullable=False)
class Treat(db.Model):
__tablename__='treat'
treatID=db.Column(db.Integer,primary_key=True,autoincrement=True)
rID=db.Column(db.String(18),db.ForeignKey(Resident.rID))
hID=db.Column(db.String(32),db.ForeignKey(Hospital.hID))
startDate=db.Column(db.Date,nullable=False)
endDate=db.Column(db.Date)
endStatus=db.Column(db.String(8))#dead死亡crued出院
class Distribute1(db.Model):
__tablename__='distribute1'
d1=db.Column(db.Integer,primary_key=True,autoincrement=True)
districtID=db.Column(db.String(8),db.ForeignKey(District.districtID))
wareID=db.Column(db.String(8),db.ForeignKey(Ware.wareID))
cID=db.Column(db.String(16),db.ForeignKey(Community.cID))
wareNum=db.Column(db.Integer,default=0)
class Distribute2(db.Model):
__tablename__ = 'distribute2'
d2=db.Column(db.Integer,primary_key=True,autoincrement=True)
districtID = db.Column(db.String(8), db.ForeignKey(District.districtID))
wareID=db.Column(db.String(8),db.ForeignKey(Ware.wareID))
wID=db.Column(db.String(32),db.ForeignKey(Workplace.wID))
wareNum=db.Column(db.Integer,default=0)
class Distribute3(db.Model):
__tablename__ = 'distribute3'
d3=db.Column(db.Integer,primary_key=True,autoincrement=True)
districtID = db.Column(db.String(8), db.ForeignKey(District.districtID))
wareID=db.Column(db.String(8),db.ForeignKey(Ware.wareID))
hID=db.Column(db.String(32),db.ForeignKey(Hospital.hID))
wareNum=db.Column(db.Integer,default=0)
class User(db.Model):
__tablename__ = 'user'
uID=db.Column(db.String(32),primary_key=True)
uPassword=db.Column(db.String(32),nullable=False)
uType=db.Column(db.String(32),nullable=False)
'''
db.drop_all()
db.create_all()
'''
#从网页爬取各城市信息
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ''
def getData(provList,cityList,html):
prov=re.findall(r'{"provinceName":".+?","provinceShortName":".+?","currentConfirmedCount":.+?}]}',html,re.S)
for i in prov:
try:
l=[]#单省份信息列表
i=eval(i)
provinceName=i['provinceShortName']
l.append(i['locationId'])
l.append(i['provinceShortName'])
l.append(i['currentConfirmedCount'])
l.append(i['confirmedCount'])
l.append(i['suspectedCount'])
l.append(i['curedCount'])
l.append(i['deadCount'])
provList.append(l)
l2=i['cities']
for j in range(len(l2)):
l3=[]#单城市信息列表
if l2[j]['locationId']==0:
continue
l3.append(l2[j]['locationId'])
l3.append(l2[j]['cityName'])
l3.append(provinceName)
l3.append(l2[j]['currentConfirmedCount'])
l3.append(l2[j]['confirmedCount'])
l3.append(l2[j]['suspectedCount'])
l3.append(l2[j]['curedCount'])
l3.append(l2[j]['deadCount'])
cityList.append(l3)
except:
continue
infourl='https://ncov.dxy.cn/ncovh5/view/pneumonia?scene=2'
HTMLText=getHTMLText(infourl)
provList=[]
cityList=[]
getData(provList,cityList,HTMLText)
for i in provList:
provinceID=i[0]
prov=Province(provinceID=i[0],provinceName=i[1],currentCount=i[2],\
confirmedCount=i[3],suspectedCount=i[4],curedCount=i[5],\
deadCount=i[6])
try:
db.session.add(prov)
db.session.commit()
except:
continue
for j in cityList:
cityID=j[0]
city=City(cityID=j[0],cityName=j[1],provinceName=j[2],currentCount=j[3],\
confirmedCount=j[4],suspectedCount=j[5],curedCount=j[6],deadCount=j[7])
try:
if cityID>=100000:
db.session.add(city)
db.session.commit()
except:
continue
@app.route('/')
def frontpage():
return redirect('/select')
@app.route('/register_page')
def register_list():
return render_template('register.html')
@app.route('/register',methods=['GET','POST'])
def register():
ID=request.form['ID']
password=request.form['password']
type=request.form['type']
try:
user=User(uID=ID,uPassword=password,uType=type)
db.session.add(user)
db.session.commit()
return redirect('/select')
except:
return render_template('error.html')
@app.route('/login_page')
def login_list():
return render_template('login.html')
@app.route('/login',methods=['POST','GET'])
def login():
ID = request.form['ID']
password = request.form['password']
try:
a=User.query.filter_by(uID=ID).first()
if a.uPassword==password:
type=a.uType
else:
return render_template('error.html')
except:
return render_template('error.html')
if type=='default':
return redirect('/select')
elif type=='medical':
return redirect('/medicalUser')
else:
return redirect('/comUser')
@app.route('/select')
def select():
provinces=Province.query.all()
cities=City.query.all()
districts=District.query.all()
communities=Community.query.all()
d1=[]
d2=[]
d3=[]
d4=[]
for i in provinces:
d1.append({'provinceID':i.provinceID,'provinceName':i.provinceName,\
'currentCount':i.currentCount,'confirmedCount':i.confirmedCount,\
'suspectedCount':i.suspectedCount,'curedCount':i.curedCount,'deadCount':i.deadCount})
for j in cities:
d2.append({'cityID':j.cityID,'cityName':j.cityName,'provinceName':j.provinceName, \
'currentCount': j.currentCount, 'confirmedCount': j.confirmedCount, \
'suspectedCount': j.suspectedCount, 'curedCount': j.curedCount, 'deadCount': j.deadCount})
for k in districts:
d3.append({'districtID':k.districtID,'districtName':k.districtName,'cityId':k.cityID, \
'currentCount': k.currentCount, 'confirmedCount': k.confirmedCount, \
'suspectedCount': k.suspectedCount, 'curedCount': k.curedCount, 'deadCount': k.deadCount})
for l in communities:
d4.append({'cID':l.cID,'cName':l.cName,'districtID':l.districtID, \
'currentCount': l.currentCount, 'confirmedCount': l.confirmedCount, \
'suspectedCount': l.suspectedCount, 'curedCount': l.curedCount, 'deadCount': l.deadCount})
return render_template('select.html',d1=d1,d2=d2,d3=d3,d4=d4)
@app.route('/medicalUser')
def medicalUser():
hospitals = Hospital.query.all()
d1=[]
for l in hospitals:
d1.append({'districtID':l.districtID,'ID':l.hID,'name':l.hName,'storage':l.hStorage,\
'current':l.hCurrent,'crued':l.hCured,'dead':l.hDead})
distributions=Distribute3.query.all()
d2=[]
for i in distributions:
ware=Ware.query.filter_by(wareID=i.wareID).first()
name=ware.wareName
d2.append({'wareID':i.wareID,'wareName':name,'wareNum':i.wareNum,'hospitalID':i.hID})
patients=Treat.query.all()
d3=[]
for a in patients:
d3.append({'ID':a.treatID,'rID':a.rID,'hID':a.hID,'startDate':a.startDate,\
'endDate':a.endDate,'endStatus':a.endStatus})
return render_template('medicalUser.html',d1=d1,d2=d2,d3=d3)
@app.route('/cruedPatient',methods=['GET'])
def cruedP():
try:
id=request.args.get('id')#获取病人id
hid=request.args.get('hid')#获取医院id
rid=request.args.get('rid')
patient=Treat.query.filter_by(treatID=id).first()
patient.endStatus='crued'
db.session.commit()
hospital=Hospital.query.filter_by(hID=hid).first()
hospital.hCured+=1
db.session.commit()
resident=Resident.query.filter_by(rID=rid).first()
resident.rStatus='crued'
db.session.commit()
rlive=resident.rLive
community=Community.query.filter_by(cID=rlive).first()
community.currentCount-=1
community.curedCount+=1
db.session.commit()
did=community.districtID
district=District.query.filter_by(districtID=did).first()
district.currentCount -= 1
district.curedCount += 1
db.session.commit()
return redirect('/medicalUser')
except:
return render_template('error.html')
@app.route('/deadPatient',methods=['GET'])
def deadP():
try:
id=request.args.get('id')#获取病人id
hid=request.args.get('hid')#获取医院id
rid = request.args.get('rid')
patient=Treat.query.filter_by(treatID=id).first()
patient.endStatus='dead'
db.session.commit()
hospital=Hospital.query.filter_by(hID=hid).first()
hospital.hDead+=1
db.session.commit()
resident = Resident.query.filter_by(rID=rid).first()
resident.rStatus = 'dead'
db.session.commit()
rlive = resident.rLive
community = Community.query.filter_by(cID=rlive).first()
community.currentCount -= 1
community.deadCount += 1
db.session.commit()
did = community.districtID
district = District.query.filter_by(districtID=did).first()
district.currentCount -= 1
district.deadCount += 1
db.session.commit()
return redirect('/medicalUser')
except:
return render_template('error.html')
@app.route('/addPatient')
def addPPage():
return render_template('addPatient.html')
@app.route('/addP',methods=['GET','POST'])
def addP():
rID=request.form['rID']
hID=request.form['hID']
startDate=request.form['startDate']
patient=Treat(rID=rID,hID=hID,startDate=startDate)
hospital=Hospital.query.filter_by(hID=hID).first()
hospital.hCurrent+=1 #医院累计收治人数增加
resident=Resident.query.filter_by(rID=rID).first()
community=Community.query.filter_by(cID=resident.rLive).first()
resident.rStatus='comfirmed'#居民状态更改为确诊
db.session.add(patient)
db.session.commit()
rlive = resident.rLive
community = Community.query.filter_by(cID=rlive).first()
community.currentCount += 1
community.confirmedCount += 1
db.session.commit()
did = community.districtID
district = District.query.filter_by(districtID=did).first()
district.currentCount += 1
district.confirmedCount += 1
db.session.commit()
return redirect('/medicalUser')