体温管理项目练习分析
体温管理项目
目标:
1. 根据页面设计系统功能!
2. 设计项目数据库!
3. 代码实现!
项目介绍
登记学生每天体温信息! 发现并记录异常情况!
页面介绍
1.首页: 生成每个学生当天体温名单, 按照日期查询某天体温情况!
2.体温状态修改页面: 实现修改某个人的体温状态!!(1:正常 2体温异常. 3: 未登记)
3.异常信息登记页面:根据名字修改各种信息!
4.某天体温记录统计
要求: 完成统计功能统计:体温正常有多少人,异常有多少人!
扩展: 统计7天内/本周/某个时间段内: 某人异常体温次数!
项目功能需求分析:
项目功能列表
1. 登陆
2. 注册
3. 展示首页:
4. 生成今日体温记录
###############################################
***********欢迎使用北网体温登记系统***************
1. 生成今日体温记录
2. 查询体温情况统计
###############################################
5. 根据名字和日期修改体温记录情况!
6. 根据日期统计体温正常和异常人数!
数据库设计
核心对象
用户对象
学生对象
记录对象
# 根据名单生成今日的体温记录! 25-->生成25条记录
id, 学生id, 日期, 异常状态(1正常2异常,3缺失) ,temp(温度) desc:说明
1 1(小A) 2020-11-08 1 36.1 正常
2 2(小C) 2020-11-08 2 37.8 感冒发热中
根据名单生成今日的体温记录! 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 多
设计实现
image-20201108150741535
image-20201108171048643
体温记录表
image-20201108150912679
image-20201109141636124
标记表
image-20201109141509714
代码实现
功能
登陆
注册
生成今日体温记录
根据名字修改体温记录
根据日期查询统计
学生的增加,删除,修改,查询 [已经完成了!]
项目代码基础架构
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: 新建标记表! image-20201108163926906 完整体温记录生成流程 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]}\t,人数:{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]}\t,人数:{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('输入有误!')