• 员工信息表作业 和 函数考试登陆功能题


    
    

    文件存储格式如下:
    id,name,age,phone,job
    1,Alex,22,13651054608,IT
    2,Egon,23,13304320533,Tearcher
    3,nezha,25,1333235322,IT

    
    

    现在需要对这个员工信息文件进行增删改查。
    基础必做:
    a.可以进行查询,支持三种语法:
    select 列名1,列名2,… where 列名条件
    支持:大于小于等于,还要支持模糊查找。
    示例:
    select name, age where age>22
    select * where job=IT
    select * where phone like 133

    
    

    进阶选做:

    
    

    b.可创建新员工记录,id要顺序增加c.可删除指定员工记录,直接输入员工id即可
    d.修改员工信息
    语法:set 列名=“新的值” where 条件
    #先用where查找对应人的信息,再使用set来修改列名对应的值为“新的值”

    
    

    注意:要想操作员工信息表,必须先登录,登陆认证需要用装饰器完成
    其他需求尽量用函数实现


    """
    1,Alex,22,13651054608,IT 2,Egon,23,13304320533, Tearcher 3,沛齐,23,13304320533, Tearcher 4,金鑫,23,13304320533, Tearcher """ import os user_dic = {'username': None, 'password': None, 'login': True } flag = False name_list = ['id', 'name', 'age', 'phone', 'job'] check_conditions = ['>', '<', '=', 'like'] def auth(func): def wrapper(*args, **kwargs): with open('user-pwd', 'r', encoding='utf8') as f: user = eval(f.read()) count = 0 while count < 3: username = input('请输入用户名:').strip() password = input('请输入密码:').strip() if user.get(username) and password == user[username]: user_dic['username'] = username user_dic['password'] = password user_dic['login'] = True ret = func(*args, **kwargs) return ret else: count += 1 if count == 3: print('用户名密码不正确,您已经没有输入机会,请重新登录') else: print('用户名密码不正确,您还有%s输入机会' % (3 - count)) return wrapper def get_last_id(): """ 此函数是获取id表中的id :return: 返回值是最后的id,如果第一次给员工信息表添加数据,id为0 """ with open('id表', encoding='utf-8') as f: list_id = f.read() return int(list_id) if list_id else 0 def add(): """ 此函数是为员工信息表添加新的数据,关键点在添加新数据之后,你的id表的id会随之改变。 :return: None """ old_last_id = get_last_id() input_info = input('按照下列格式输入信息:' '姓名,年龄,电话,职业').strip() new_last_id = str(int(old_last_id)+1) add_info = new_last_id + ',' + input_info with open('员工信息表', 'a', encoding='utf-8') as f2: # 此三元运算符是判断员工信息表中如果是第一次添加内容直接添加,否则 换行添加。 f2.write(add_info) if old_last_id == 0 else f2.write(' '+add_info) print('您已成功添加,请继续操作') with open('id表', 'w', encoding='utf-8') as f3: f3.write(new_last_id) def pop(): """ 此函数的功能是删除员工信息表中的数据,关键点: 1,删除的id不是员工信息表最后的id,则不涉及id表中的id更改。 2,删除的id是员工信息表最后的id,则删除之后必须将id表中的id自增1,以便下次添加数据从新的id开始。 3,flag的设置是因为我在打开员工信息表的过程中,不能删除此员工信息表, 所以设置标志位,等操作完成之后,在删除原文件,重新命名新文件。 :return: """ pop_id = input('请填写你想删除的信息id') with open('员工信息表', encoding='utf-8') as f: for line in f: line_list = line.strip().split(',') if pop_id == line_list[0]: # 判断删除的id是否在文件中,设置标志位,等文件操作完成后,在删除文件,重命名文件。 global flag flag = True last_id = get_last_id() if pop_id == last_id: with open('id表', 'w', encoding='utf-8') as f3: f3.write(str(int(pop_id)+1)) with open('员工信息表', encoding='utf-8') as f1, open('员工信息表.bak', 'w', encoding='utf-8') as f2: for line1 in f1: f2.write(line1) if pop_id != line1.strip().split(',')[0] else f2.write('') break else: print('您输入的序号不存在,请重新输入') if flag: os.remove('员工信息表') os.rename('员工信息表.bak', '员工信息表') def update(): """ 此函数的功能:修改员工信息 语法:set 列名=“新的值” where 条件 先用where查找对应人的信息,再使用set来修改列名对应的值为“新的值” 关键点:check_conditions, name_list 这两个列表的运用 check_conditions 为 where 关键字后面的比较条件:> < = like name_list 为员工信息表的列名,'id', 'name', 'age', 'phone', 'job' 索引与员工信息表每行信息的每列一一对应。 思路: 1,先通过 where 分割,得到content(如 set name = 太白),cond(如 id > 3) 2,循环 check_conditions(> < = like) 通过 条件 分割 得到结果:name是id,key是 > , cond 是 3 3,对 content进行操作,得到要修改的列名:column_name,要修改的值update_value 4,接下来就用到了文件改的思想,如果要修改文件,需要对将原文件读取,一行一行的写入新文件,将需要改动的行写入, 然后将原文件删除,新文件重命名成原文件,这样就做到了文件的改的操作。 5,关键点:check_dict 这是一个if条件的字典,这样设置是因为,不管条件为 < > = 或者like 他们只要满足条件,下面进行的操作是一样的,所以只是条件不同,那么根据key的不同,执行check_dict不同的条件, 然后进行相同的内容即可。 :return: None """ pass def check(): """ :param: 可以进行查询,支持三种语法: select 列名1,列名2,… where 列名条件 支持:大于小于等于,还要支持模糊查找。 示例: check_info = select name, age where age>22 select * where job=IT select * where phone like 133 关键点:check_conditions, name_list 这两个列表的运用 check_conditions 为 where 关键字后面的比较条件:> < = like name_list 为员工信息表的列名,'id', 'name', 'age', 'phone', 'job' 索引与员工信息表每行信息的每列一一对应。 思路: 1,先通过 where 分割,得到content(如 select name,id),cond(如 id > 3) 2,循环 check_conditions(> < = like) 通过 条件 分割 得到结果:name是id,key是 > , cond 是 3 3,对 content进行操作,得到要修改的列名:column_name,要修改的值update_value 4,接下来读文件,而读文件分两种:select * (全部) 和select name,id,.. 部分,所以走两条路。 5,关键点:check_dict 这是一个if条件的字典,这样设置是因为,不管条件为 < > = 或者like 他们只要满足条件,下面进行的操作是一样的,所以只是条件不同,那么根据key的不同,执行check_dict不同的条件, 然后进行相同的内容即可。 :return: """ try: check_info = input('请输入查询语句:').strip() content, condition = check_info.split('where') # print(content,condition) if 'select' in content: for key in check_conditions: if key in condition: index_check_conditions = check_conditions.index(key) name, cond = condition.strip().split(key) # content为 'select name,id,'或'select *,' # name 是 where后面的第一个关键字 # key 是比较运算符 # cond 是 实际需要比较的 关键字. # 例如:where id > 3 name是id,key是 > , cond 是 3 content = ''.join(content.split('select')[1:]) with open('员工信息表', encoding='utf-8') as f: for line in f: if line.strip(): line_list = [i.strip() for i in line.strip().replace('',',').split(',')] # 上面此举是为了解决add信息时,输入的有中文逗号,从而导致split出问题的问题。 # 例:line_list = ['3','Egon','23','13304320533','Tearcher'] index = name_list.index(name.strip()) # index 查询条件的索引,比如你的查询条件是select * where id > 3 # name 就是 id 求出的index 就是id在name_list列表中的索引,他亦是line_list的id的索引 # 这样就可以方便比较了。 check_dict = { 0: int(line_list[index]) > int(cond), 1: int(line_list[index]) < int(cond), 2: line_list[index].strip() == cond.strip(), 3: cond.strip() in line_list[index].strip(), } if check_dict[index_check_conditions]: if content.strip() == "*": print(line.strip()) else: if ',' in content.strip(): select_name_list = content.strip().split(',') select_name_list = [i for i in select_name_list if i != ''] str1 = '' for names in select_name_list: name_index = name_list.index(names.strip()) str1 = str1 + line_list[name_index] + ',' print(str1) else: print(line_list[name_list.index(content)]) break else: print('您输入的不正确,请重新输入') else: print('您没有输入select或者select输入有误,请重新输入') except Exception: print('您输入的查询语句有误,请重新输入。') def loginout(): print('感谢您登陆员工内部系统') user_dic['login'] = False @auth def main(): menu = """ 欢迎%s用户登录内部员工系统,请进行选择: 选项 1,增加员工信息 选项 2,删除员工信息 选项 3,更改员工信息 选项 4,查询员工信息 选项 5,退出内部员工系统 """ % (user_dic['username']) choice_dict = { '1': add, '2': pop, '3': update, '4': check, '5': loginout } while user_dic['login']: print(menu) option = input('请输入你的选项:').strip() if option in choice_dict: choice_dict[option]() else: print('请输入正确选项') if __name__ == '__main__': main()

    写程序完成下列功能:(20分,有5分加分项,共计25分)

     

    1),启动程序,首页面应该显示成如下格式:
        欢迎来到博客园首页
        1:请登录
        2:请注册
        3:文章页面
        4:日记页面
        5:评论页面
        6:收藏页面
        7:注销
        8:退出程序
    2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
    3),用户选择登录,用户名密码从register文件中读取验证,三次机会,没成功则结束整个程 序运行,成功之后,可以选择访问3~6项,访问页面之前,必须要在log文件中打印日志, 日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,访问页面时,页面内容为:欢 迎xx用户访问评论(文章,日记,收藏)页面
    4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录(完成自动登录+5 分),然后进入首页选择。
    5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
    6),退出程序为结束整个程序运行。

    import time
    status_dic = {
        'username':None,
        'status':False,
    }
    
    flag1 = True
    
    def login(*args,**kwargs):
        i = 0
        while i < 3:
            if args:
                status_dic['username'] = args[0]
                status_dic['status']= True
                return True
            else:
                username = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                with open('register',encoding = 'utf-8')as f1:
                    for line in f1:
                        line_list = line.strip().split()
                        if username == line_list[0] and password == line_list[1]:
                            print('登陆成功')
                            status_dic['username'] = username
                            status_dic['status'] = True
                            return True
                    else:
                        print('输入不正确,请重新输入,还剩余%s次机会' % (2-i))
                        if i == 2:return Quit()
                    i += 1
    
    def register(*args,**kwargs):
        flag = True
        while flag:
            username = input('请输入要注册的用户名:').strip()
            f1 = open('register',encoding='utf-8')
            for i in f1:
                if username in i:
                    print('用户名重复,请重新输入')
                    f1.close()
                    break
            else:
                f1.close()
                password = input('请输入要注册的密码:').strip()
                f2 = open('register',encoding = 'utf-8',mode ='a')
                f2.write('
    {}	{}'.format(username,password))
                f2.close()
                print('恭喜您,注册成功,已经自动为您登录,现在跳转到首页>>>')
                return login(username,password)
    
    def wrapper(func):
        def inner(*args,**kwargs):
            if status_dic['status']:
                ret = func(*args,**kwargs)
                return ret
            else:
                print('请先进行登录')
                if login():
                    ret = func(*args,**kwargs)
                    return ret
        return inner
    
    def log_record(func):
        def inner(*args,**kwargs):
            struct_time = time.localtime()
            time_now = time.strftime('%Y年%m月%d日 %H:%M:%S',struct_time)
            with open('log_func','a',encoding = 'utf-8')as f1:
                f1.write('用户:%s 在%s 执行了%s函数
    ' % (status_dic['username'],time_now,func.__name__))
            ret = func(*args,**kwargs)
            return ret
        return inner
    
    @wrapper
    @log_record
    def article():
        print('欢迎%s访问文章页面' % status_dic['username'])
    
    @wrapper
    @log_record
    def diary():
        print('欢迎%s访问日志页面' % status_dic['username'])
    
    @wrapper
    @log_record
    def comment():
        print('欢迎%s访问评论页面' % status_dic['username'])
    
    @wrapper
    @log_record
    def collect():
        print('欢迎%s访问收藏页面' % status_dic['username'])
    
    def login_out():
        status_dic['username'] = None
        status_dic['status'] = False
        print('注销成功')
    
    def Quit():
        global flag1
        flag1 = False
        return flag1
    
    choice_dict ={
        1: login,
        2: register,
        3: article,
        4: diary,
        5: comment,
        6: collect,
        7: login_out,
        8: Quit,
    }
    
    
    while flag1:
        print('欢迎来到博客园首页
    1:请登录
    2:请注册
    3:文章页面
    4:日记页面
    5:评论页面
    6:收藏页面
    7:注销
    8:退出程序')
        choice = input('请输入您选择的序号:').strip()
        if choice.isdigit():
            choice = int(choice)
            if 0 < choice <= len(choice_dict):
                choice_dict[choice]()
            else:
                print('输入的超出范围,请重新输入')
        else:
            print('您输入的选项有非法字符,请重新输入')
  • 相关阅读:
    微信公众号接口配置
    OFBIZ:启动之ContainerLoader
    OFBIZ:启动之StartupLoader
    Capture a Screen Shot
    在 Windows 上安装Rabbit MQ 指南
    Quartz.NET管理周期性任务
    使用Topshelf创建Windows服务
    Redirecting Console.WriteLine() to Textbox
    Greenplum 备忘
    CockroachDB 备忘
  • 原文地址:https://www.cnblogs.com/kateli/p/8762559.html
Copyright © 2020-2023  润新知