zoukankan      html  css  js  c++  java
  • [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自学吧>
  • 相关阅读:
    Maximum Flow Exhaustion of Paths Algorithm
    ubuntu下安装java环境
    visualbox使用(二)
    vxworks一个超级奇怪的错误(parse error before `char')
    February 4th, 2018 Week 6th Sunday
    February 3rd, 2018 Week 5th Saturday
    February 2nd, 2018 Week 5th Friday
    February 1st, 2018 Week 5th Thursday
    January 31st, 2018 Week 05th Wednesday
    January 30th, 2018 Week 05th Tuesday
  • 原文地址:https://www.cnblogs.com/itzixueba/p/13944946.html
Copyright © 2011-2022 走看看