zoukankan      html  css  js  c++  java
  • 路飞学城Python-Day21(practise)

     编写程序, 如下有三点要求:
    自定义用户信息数据结构, 写入文件, 然后读取出内容, 利用json模块进行数据的序列化和反序列化
    e.g
    {
    "egon":{"password":"123",'status':False,'timeout':0},
    "alex":{"password":"456",'status':False,'timeout':0},
    }
    定义用户类,定义方法db,例如 执行obj.db可以拿到用户数据结构
    在该类中实现登录、退出方法, 登录成功将状态(status)修改为True, 退出将状态修改为False(退出要判断是否处于登录状态).
    密码输入错误三次将设置锁定时间(下次登录如果和当前时间比较大于10秒即不允许登录)
    '''
    有bug未及时调整
    登出函数有问题
    '''
    import json
    import time
    def init_info():
        user_if = {
        "egon":{"password":"123",'status':False,'timeout':0},
        "alex":{"password":"456",'status':False,'timeout':0},
        }
        with open('user_info','w',encoding='utf-8') as f:
            json.dump(user_if,f)
    
    
    def read_info():
        with open('user_info','r+',encoding='utf-8') as f:
            print(json.load(f,encoding = 'utf-8'))
    
    user_name = ''
    class User:
    
        def db(self):
            '''
            db方法:调用时打印当前用户信息和信息存储数据格式
            :return:
            '''
            with open('user_info', 'r+', encoding='utf-8') as f:
                user_info = json.load(f, encoding='utf-8')
                for k, v in user_info.items():
                    print('username:%s -' % k, type(k),
                          'password:',[val for val in v.values()][0], type([val for val in v.values()][0]),
                          'status:',[val for val in v.values()][1], type([val for val in v.values()][1]),
                          'timeout:', [val for val in v.values()][2], type([val for val in v.values()][2]),
                          )
    
        def login(self):
            '''
            登录
            登录成功将状态(status)修改为True
            密码输入错误三次将设置锁定时间(下次登录如果和当前时间比较大于10秒即不允许登录)[个人理解应该是10秒内不能登录,这里的表述有问题]
            :return:
            '''
            count = 0
            while count < 3:
                username = input('请输入用户名>>>').strip()
                password = input('请输入密码>>>').strip()
                with open('user_info', 'r+', encoding='utf-8') as f:
                    user_info = json.load(f, encoding='utf-8')
                    user_name_list = []
                    for k in user_info.keys():
                        user_name_list.append(k)
                    if username in user_name_list and password == user_info.get(username)['password']:
                        if user_info.get(username)['timeout'] - time.time()<0:
                            user_info.get(username)['status'] = True
                            print('用户:%s 登陆成功' % username)
                            user_dict = {username:user_info.get(username)}
                            user_name = username
                            with open('user_info','w+',encoding='utf-8') as f:
                                json.dump(user_info, f)
                            return user_dict[username]
                        else:
                            return '用户账号已锁定!'
                    elif count == 2:
                        if username in user_name_list:
                            user_info.get(username)['timeout'] = time.time()+10
                            with open('user_info','w+',encoding='utf-8') as f:
                                json.dump(user_info, f)
                            return  '%s账户已锁定'%username
    
                        else:
                            return '用户名不存在!'
    
                    else:
                        print('账号或密码错误,还有%s次尝试机会'% (3-(count+1)))
                        count += 1
    
        def logout(self):
            '''
            退出将状态修改为False(退出要判断是否处于登录状态)
            :return:
            '''
            with open('user_info', 'r+', encoding='utf-8') as f:
                user_info = json.load(f, encoding='utf-8')
            user_list = []
            for k in user_info.keys():
                user_list.append(k)
            if user_name in user_list:
                print('当前登录账户%s'%user_name)
                choice = input('请确认是否退出,是:Y  否:N').strip()
                if choice == 'y'.upper() or choice == 'y'.lower():
                    user_info.get(user_name)['status'] = False
                    with open('user_info', 'w+', encoding='utf-8') as f:
                        json.dump(user_info, f)
                else:
                    pass
            else:
                pass
    
    
    us = User()
    # us.db()
    u = us.login()
    View Code


    Win a contest, win a challenge
  • 相关阅读:
    <<剪绳子>>题解
    P5743 小猴吃桃 题解
    注意C++中的int与long long 的乘法
    数组初始化方法总结
    一维差分和二维差分
    一维前缀和与二维前缀和
    例2-6 字母转换
    例1-11 评测机队列
    golang ---查找字串实例 IP address
    mongodb ---加减等操作
  • 原文地址:https://www.cnblogs.com/pandaboy1123/p/9333745.html
Copyright © 2011-2022 走看看