目录
Python控制台版-体温管理项目
目标:
- 1. 根据页面设计系统功能!
- 2. 设计项目数据库!
- 3. 代码实现!
项目介绍
登记学生每天体温信息! 发现并记录异常情况!
页面介绍
- 1.首页: 生成每个学生当天体温名单, 按照日期查询某天体温情况!
注意:一天不能重复生成!!
- 2.体温状态修改页面: 实现修改某个人的体温状态!!(1:正常 2体温异常. 3: 未登记)
- 3.异常信息登记页面:根据名字修改各种信息!
- 4.某天体温记录统计:
要求: 完成统计功能统计:体温正常有多少人,异常有多少人!
扩展: 统计7天内/本周/某个时间段内: 某人异常体温次数!
项目功能需求分析:
项目功能列表
- 登陆
- 注册
- 展示首页:
###############################################
***********欢迎使用北网体温登记系统***************
1. 生成今日体温记录
2. 查询体温情况统计
###############################################
- 生成今日体温记录
# 根据名单生成今日的体温记录! 25-->生成25条记录
id, 学生id, 日期, 异常状态(1正常2异常,3缺失) ,temp(温度) desc:说明
1 1(乔林茹) 2020-11-08 1 36.1 正常
2 2(杨洋) 2020-11-08 2 37.8 感冒发热中!
....
- 根据名字和日期修改体温记录情况!
- 根据日期统计体温正常和异常人数!
数据库设计
分析
核心对象
- 用户对象
- 学生对象
- 记录对象(隐含的对象,容易忽略!)
- 比如:购物记录单,是真实存在 的实体! 买东西的发票记录也是真实存在的! 去银行存款的单子也是真实存在的!请假单也真是真实存在的!
表
- 用户表
- 学生表
- 学生记录表
对象/表之间关系
学生--->记录
1 多
设计实现
- 体温记录表
- 标记表
代码实现
功能
- 登陆
- 注册
- 生成今日体温记录
- 根据名字修改体温记录
- 根据日期查询统计
- 学生的增加,删除,修改,查询 [已经完成了!]
项目代码基础架构
# 1. 导入工具类
from db_util import DBUtil #导入数据库的工具类
from datetime import datetime # 导入日期
def login_menu():
'''登陆菜单'''
print('##########欢迎使用北网体温管理系统###########')
print('1. 登陆')
print('2. 注册')
print('##########################################')
def login(name,pwd):
'''登陆功能'''
# 创建数据库对象
db = DBUtil('39.98.39.173', 13306, 'root', 'root', '1909C2')
sql ="select * from users where uname =%s and pwd =%s"
params =[name,pwd]
result =db.get_one(sql,params)
return result
def sys_menu():
'''系统菜单'''
print('**************************************')
print('1. 生成今日体温记录')
print('2. 根据名字修改体温记录')
print('3.根据日期查询统计')
print('*************************************')
num = int(input('请选择菜单:'))
if num==1:
gener_jilu() #生成今日体温记录
elif num==2:
update_jilu() #根据名字修改
elif num==3:
mycount() #统计
else:
print('输入错误!')
def gener_jilu():
print('生成今日体温记录!')
def update_jilu():
print('根据名字修改记录资料')
def mycount():
print('统计!')
if __name__ == '__main__':
# 1. 显示菜单
login_menu()
num =int( input("请选择菜单:"))
if num==1:
name = input('请输入名字:')
pwd = input('请输入密码:')
if login(name, pwd) is not None:
print('登陆成功;')
sys_menu()
else:
print('用户名或密码错误!')
elif num==2:
print('注册功能')
else:
print('输入有误!')
生成今日体温记录
先查询所有学生信息! 再给每个人新建一条记录!
- 先查
- 再循环,再插入!
- execute_many(sql,[(),(),......])
def gener_jilu():
print('生成今日体温记录!')
# 1. 创建数据库对象
db = DBUtil('39.98.39.173', 13306, 'root', 'root', '1909C2')
# 2. 先查所有学生
students = db.get_all("select * from students",None)
print(f'共:{len(students)}名学生!')
# 3. 生成记录
list_jilu=[]
time = datetime.now()
for stu in students:
#print(f'id:{stu[0]},名字:{stu[1]}')
jilu = (stu[0],time,1,'正常') #记录
list_jilu.append(jilu)
# [(),(),(),]===>execute_many(sql,[(),(),...])
print(f'今日体温记录:{len(list_jilu)},条')
# 4.调用批量插入
sql ="insert into jilu(sid,create_time,status,shuoming) values(%s,%s,%s,%s)"
num =db.my_executemany(sql,list_jilu)
#print(num)
if num >0:
print('体温记录生成成功!')
else:
print('生产失败!')
**Bug: 需要解决体温记录重复生成问题! **
如何判断今日记录是否生成过?
- 方案1:从所有记录中查是否有今日的? 速度越来越慢! 体温记录表数据会爆增!
1万人---->每天测量体温1次---->记录表1天增加1万条--10天---增加10万!
1万次---->每天3次---->记录表1天增加3完条---10天---增加30万!
10-->30万--->100天--->300万!
def gener_jilu():
print('生成今日体温记录!')
# 1. 创建数据库对象
db = DBUtil('39.98.39.173', 13306, 'root', 'root', '1909C2')
# 2. 先查所有,.学生
students = db.get_all("select * from students",None)
print(f'共:{len(students)}名学生!')
# 3. 生成记录
list_jilu=[]
day = datetime.now()
for stu in students:
#print(f'id:{stu[0]},名字:{stu[1]}')
jilu = (stu[0],day,1,'正常') #记录
list_jilu.append(jilu)
# [(),(),(),]===>execute_many(sql,[(),(),...])
print(f'今日体温记录:{len(list_jilu)},条')
# 判断今日是否生成过!
start = time.time()
sql ='select * from jilu where create_time =%s'
pamras=('2020-11-08')
result = db.get_all(sql,pamras)
end = time.time()
if len(result)>0:
print('今日生成过了!')
print(end-start)
else:
print('生成!')
# 4.调用批量插入
sql = "insert into jilu(sid,create_time,status,shuoming) values(%s,%s,%s,%s)"
num = db.my_executemany(sql, list_jilu)
# print(num)
if num > 0:
print('体温记录生成成功!')
else:
print('生产失败!')
- 方案2: 新建标记表!
- 完整体温记录生成流程
def gener_jilu():
print(f'生成:{current_day}体温记录!')
# 1. 创建数据库对象
db = DBUtil('39.98.39.173', 13306, 'root', 'root', '1909C2')
#判断是否生成过
result =db.get_one('select * from flag where create_time=%s',(current_day))
#print(result)
if result is None:
try:
students = db.get_all("select * from students", None)
# 3. 生成记录
list_jilu = []
for stu in students:
jilu = (stu[0], current_day, 1, '正常') # 记录
list_jilu.append(jilu)
#print(f'今日体温记录:{len(list_jilu)},条')
# 4.调用批量插入
sql = "insert into jilu(sid,create_time,status,shuoming) values(%s,%s,%s,%s)"
db.my_executemany(sql, list_jilu) # 第1个数据库操作
# 生成一条标记! #第2个数据库操作
db.my_execute('insert into flag(create_time,flag) values(%s,%s)', (current_day, 1))
print('无错误生成成功!!')
except Exception as e:
print(e)
else:
print('今日已生成!')
问题思考: 1个流程中包含多个数据库操作步骤时?如何避免部分成功?
使用:事务,可以实现多个步骤同时成功或同时失败!
根据名字修改体温记录
- 1.先根据名字查sid
- 2. 再根据名字和日期该!
def update_jilu():
print('根据名字修改记录资料')
name = input('请输入体温异常人名字:')
status = input('输入体温状态(1正常2,异常3缺失):')
shuoming = input('请输入说明:')
temp = input('请输入体温:')
try:
# 1.先查sid
sql = 'select id from students where name = %s'
result = db.get_one(sql,[name])
sid = result[0] #学生id
# 2 改
sql2 = 'update jilu set status =%s, shuoming = %s,temp=%s where sid=%s and create_time =%s'
params =(status,shuoming,temp,sid,current_day)
db.my_execute(sql2,params)
print('修改成功')
except Exception as e:
print(e)
查询统计
- 体温正常人数?
- 体温异常人数?
def mycount():
print('统计,')
current_day = input('请输入日期(xxxx-xx-xx):')
sql ='select status,count(*) from jilu where create_time =%s group by status '
result = db.get_all(sql,(current_day))
print(f'日期:{current_day}')
print('状态1:正常 2.异常 3缺失!')
for item in result:
print(f'状态:{item[0]} ,人数:{item[1]}')
完整项目代码
- DBUtil数据库工具类
db_util.py
import pymysql # 导入数据库驱动模块!
class DBUtil():
#db = MysqlHelper('39.98.39.173',13306,'root','root','1909C2')
def __init__(self,host,port,user,passwd,db,charset='utf8'):
self.host= host
self.port = port
self.user = user
self.passwd = passwd
self.db = db
self.charset=charset
#self.conn = None
def connect(self):
'''功能1: 获取连接'''
self.conn = pymysql.connect(host=self.host,port=self.port,user=self.user,passwd=self.passwd,db=self.db,charset=self.charset)
self.cursor =self.conn.cursor()
def close(self):
'''功能2:释放资源'''
self.cursor.close() #关游标
self.conn.close()# 关连接
def my_execute(self,sql,params):
'''
增删改通用功能
:param sql: sql语句
:param params: 参数列表
:return: num 影响行数
'''
num =0
# 1. 打开连接
self.connect()
num = self.cursor.execute(sql,params)
self.conn.commit()
self.close() #释放资源
return num
def my_executemany(self,sql,params):
'''
通用批量插入
:param sql: sql语句
:param params: 参数列表[(),(),]
:return: num 影响行数
'''
num =0
# 1. 打开连接
self.connect()
num = self.cursor.executemany(sql,params)
self.conn.commit()
self.close() #释放资源
return num
def get_one(self,sql,params):
'''
查询1条
:param sql: sql语句
:param params: 参数列表
:return: 1条结果
'''
result =None
#1.打开链接
self.connect()
# 2.执行查询
self.cursor.execute(sql,params)
# 3 逐行抓取
result = self.cursor.fetchone()
#4.释放资源
self.close()
return result
def get_all(self, sql, params):
'''
查询所有
:param sql: sql语句
:param params: 参数列表
:return: 1条结果
'''
result = ()
self.connect()
self.cursor.execute(sql, params)
result = self.cursor.fetchall()
self.close()
return result
if __name__ == '__main__':
# 实例化对象
db = DBUtil('39.98.39.173',13306,'root','root','1909C2')
#增加
#insert into students values(default,'张A','男',20,'2020-11-05','176','山西')
'''
sql = 'insert into students values(default,%s,%s,%s,%s,%s,%s)'
params=['张B','男',20,'2020-11-05','176','山西']
num = db.my_execute(sql,params)
print(num)
'''
# 查1条
sql = 'select * from students '
params=None
result =db.get_one(sql,params) #((),())
print(result)
studetns = db.get_all(sql,params)
print(len(studetns))
- 完整代码
# 1. 导入工具类
from db_util import DBUtil #导入数据库的# 工具类
import datetime # 导入日期
import time
current_day = datetime.date.today() # 今天日期 2020-11-08
db = DBUtil('39.98.39.173', 13306, 'root', 'root', '1909C2')
def login_menu():
'''登陆菜单'''
print('##########欢迎使用北网体温管理系统###########')
print('1. 登陆')
print('2. 注册')
print('##########################################')
def login(name,pwd):
'''登陆功能'''
# 创建数据库对象
db = DBUtil('39.98.39.173', 13306, 'root', 'root', '1909C2')
sql ="select * from users where uname =%s and pwd =%s"
params =[name,pwd]
result =db.get_one(sql,params)
return result
def sys_menu():
'''系统菜单'''
print('**************************************')
print('1. 生成今日体温记录')
print('2. 根据名字修改体温记录')
print('3.根据日期查询统计')
print('*************************************')
num = int(input('请选择菜单:'))
if num==1:
gener_jilu() #生成今日体温记录
elif num==2:
update_jilu() #根据名字修改
elif num==3:
mycount() #统计
else:
print('输入错误!')
def gener_jilu():
print(f'生成:{current_day}体温记录!')
# 1. 创建数据库对象
db = DBUtil('39.98.39.173', 13306, 'root', 'root', '1909C2')
#判断是否生成过
result =db.get_one('select * from flag where create_time=%s',(current_day))
#print(result)
if result is None:
try:
students = db.get_all("select * from students", None)
# 3. 生成记录
list_jilu = []
for stu in students:
jilu = (stu[0], current_day, 1, '正常') # 记录
list_jilu.append(jilu)
#print(f'今日体温记录:{len(list_jilu)},条')
# 4.调用批量插入
sql = "insert into jilu(sid,create_time,status,shuoming,temp) values(%s,%s,%s,%s,36.1)"
db.my_executemany(sql, list_jilu)
# 生成一条标记!
db.my_execute('insert into flag(create_time,flag) values(%s,%s)', (current_day, 1))
print('无错误生成成功!!')
except Exception as e:
print(e)
else:
print('今日已生成!')
def update_jilu():
print('根据名字修改记录资料')
name = input('请输入体温异常人名字:')
status = input('输入体温状态(1正常2,异常3缺失):')
shuoming = input('请输入说明:')
temp = input('请输入体温:')
try:
# 1.先查sid
sql = 'select id from students where name = %s'
result = db.get_one(sql,[name])
sid = result[0] #学生id
# 2 改
sql2 = 'update jilu set status =%s, shuoming = %s,temp=%s where sid=%s and create_time =%s'
params =(status,shuoming,temp,sid,current_day)
db.my_execute(sql2,params)
print('修改成功')
except Exception as e:
print(e)
def mycount():
print('统计,')
current_day = input('请输入日期(xxxx-xx-xx):')
sql ='select status,count(*) from jilu where create_time =%s group by status '
result = db.get_all(sql,(current_day))
print(f'日期:{current_day}')
print('状态1:正常 2.异常 3缺失!')
for item in result:
print(f'状态:{item[0]} ,人数:{item[1]}')
if __name__ == '__main__':
# 1. 显示菜单
login_menu()
num =int( input("请选择菜单:"))
if num==1:
name = input('请输入名字:')
pwd = input('请输入密码:')
if login(name, pwd) is not None:
print('登陆成功;')
sys_menu()
else:
print('用户名或密码错误!')
elif num==2:
print('注册功能')
else:
print('输入有误!')