体温管理项目练习分析

体温管理项目
目标:
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('输入有误!')

 

posted @ 2020-11-09 11:08  失控的狗蛋  阅读(113)  评论(0编辑  收藏  举报