[18] Python控制台版-体温管理项目

Python控制台版-体温管理项目

目标:

  • 1. 根据页面设计系统功能!
  • 2. 设计项目数据库!
  • 3. 代码实现!

项目介绍

登记学生每天体温信息! 发现并记录异常情况!

页面介绍

  • 1.首页: 生成每个学生当天体温名单, 按照日期查询某天体温情况!

image-20201108142005784

注意:一天不能重复生成!!

  • 2.体温状态修改页面: 实现修改某个人的体温状态!!(1:正常 2体温异常. 3: 未登记)

image-20201108142102436

  • 3.异常信息登记页面:根据名字修改各种信息!

image-20201108142259991

  • 4.某天体温记录统计:

image-20201108142425821

要求: 完成统计功能统计:体温正常有多少人,异常有多少人!

扩展: 统计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 多

设计实现

image-20201108150741535

image-20201108171048643

  • 体温记录表

image-20201108150912679

image-20201109141636124

  • 标记表

image-20201109141509714

代码实现

功能

  1. 登陆
  2. 注册
  3. 生成今日体温记录
  4. 根据名字修改体温记录
  5. 根据日期查询统计
  6. 学生的增加,删除,修改,查询 [已经完成了!]

项目代码基础架构

# 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]}	,人数:{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('输入有误!')
更多交流,请加QQ:390351113.请备注好友来自博客园<IT自学吧>
原文地址:https://www.cnblogs.com/itzixueba/p/13944946.html