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自学吧>
  • 相关阅读:
    css的一些记录——“Unexpected missing generic font family”
    idea右键java文件找到对应的class文件路径以及查看class文件
    redis的一些记录
    【转】解决IDEA2020控制台乱码的方法
    【转】java去除html代码中含有的html、js、css标签,获取文字内容
    linux 中 AGE的含义
    控制反转容器比较:TinyIoC vs Autofac
    C# 异步方法,尽量避免使用async void而是要用async Task
    xamarin 实现选择文件功能
    xamarin手写签名
  • 原文地址:https://www.cnblogs.com/itzixueba/p/13944946.html
Copyright © 2011-2022 走看看