commit b0a67b38c127a1558e8494513b94c5f03b46458d
Author: WangJingbo <1149669347@qq.com>
Date: Wed May 6 23:28:07 2020 +0800
final
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..73f69e0
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/epidemic.iml b/.idea/epidemic.iml
new file mode 100644
index 0000000..b16640c
--- /dev/null
+++ b/.idea/epidemic.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..6649a8c
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..7838098
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/__pycache__/app.cpython-38.pyc b/__pycache__/app.cpython-38.pyc
new file mode 100644
index 0000000..9addcdb
Binary files /dev/null and b/__pycache__/app.cpython-38.pyc differ
diff --git a/app.py b/app.py
new file mode 100644
index 0000000..7442a45
--- /dev/null
+++ b/app.py
@@ -0,0 +1,383 @@
+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')
\ No newline at end of file
diff --git a/templates/addPatient.html b/templates/addPatient.html
new file mode 100644
index 0000000..345ba64
--- /dev/null
+++ b/templates/addPatient.html
@@ -0,0 +1,15 @@
+
+
+
+
+ 添加病人
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/defaultUser.html b/templates/defaultUser.html
new file mode 100644
index 0000000..5fd093f
--- /dev/null
+++ b/templates/defaultUser.html
@@ -0,0 +1,10 @@
+
+
+
+
+ 普通用户
+
+
+ 查询
+
+
\ No newline at end of file
diff --git a/templates/error.html b/templates/error.html
new file mode 100644
index 0000000..cfdc024
--- /dev/null
+++ b/templates/error.html
@@ -0,0 +1,10 @@
+
+
+
+
+ 错误!
+
+
+点此返回首页
+
+
\ No newline at end of file
diff --git a/templates/govUser.html b/templates/govUser.html
new file mode 100644
index 0000000..566549b
--- /dev/null
+++ b/templates/govUser.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Title
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/login.html b/templates/login.html
new file mode 100644
index 0000000..b2113cb
--- /dev/null
+++ b/templates/login.html
@@ -0,0 +1,15 @@
+
+
+
+
+ 用户登录
+
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/medicalUser.html b/templates/medicalUser.html
new file mode 100644
index 0000000..40d488b
--- /dev/null
+++ b/templates/medicalUser.html
@@ -0,0 +1,74 @@
+
+
+
+
+ 医疗单位用户
+
+
+
+医院信息 |
+
+ 区ID |
+医院ID |
+医院名称 |
+最大容纳病人数 |
+在院人数 |
+ 治愈人数 |
+ 死亡人数 |
+
+{% for item in d1 %}
+
+{{item.districtID}} |
+{{item.ID}} |
+{{item.name}} |
+ {{item.storage}} |
+ {{item.current}} |
+ {{item.crued}} |
+ {{item.dead}} |
+
+{% endfor %}
+
+
+
+物资供给 |
+
+物资ID |
+物资名称 |
+数量 |
+医院ID |
+
+{% for item in d2 %}
+
+{{item.wareID}} |
+{{item.wareName}} |
+{{item.wareNum}} |
+{{ item.hospitalID }} |
+
+{% endfor %}
+
+
+
+病人信息 |
+
+病人ID |
+医院名称 |
+入院时间 |
+ 出院时间 |
+ 出院状态 |
+操作 |
+
+{% for item in d3 %}
+
+{{item.rID}} |
+{{item.hID}} |
+{{item.startDate}} |
+ {{item.endDate}} |
+ {{item.endStatus}} |
+ 出院 死亡 |
+
+{% endfor %}
+
+
+添加病人
+
+
\ No newline at end of file
diff --git a/templates/register.html b/templates/register.html
new file mode 100644
index 0000000..1d44ef7
--- /dev/null
+++ b/templates/register.html
@@ -0,0 +1,18 @@
+
+
+
+
+ 用户注册
+
+
+