python用户管理系统

摘要:
“Error”}#用于确定用户是否已登录user_ LIST=[]#存储当前用户信息的列表defregister _函数():“=”)%count)#输出提示计数-=1#每次减去1个用户名=输入(“请输入用户名:向下操作打印(“请键入大于5位的密码”)input_passwd=输入(”[1:

学Python这么久了,第一次写一个这么多的代码(300多行,重复的代码挺多的,比较水),但是也挺不容易的

自定义函数+装饰器,每一个模块写的一个函数

很多地方能用装饰器(逻辑跟不上,有的地方没用),包括双层装饰器(不会),很多地方需要优化,重复代码太多

我还是把我的流程图拿出来吧,虽然看着比上次的垃圾,但是我也做了一个小时,不容易!

python用户管理系统第1张

好像是挺丑的(表示不会画,但我下次一定努力)

 用户文件:

文件名为:user.txt

1代表管理员用户

2代表普通用户

smelond|admin|xx@qq.com|1
admin|admin|qweqwe@qq.com|2
qwe|qweasd|qwe@qq.com|2

代码(感觉这个程序还有很多bug):

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# File_type:用户管理程序,装饰器版本,多功能
# Filename:user_manage_program.py
# Author:smelond

import os

os.system("cls")  # windows中的清屏

COUNT = 0  # 计数器
WHETHER_LOGIN = {"is_login": "error"}  # 用于判断是否有用户登录
USER_LIST = []  # 当前用户信息存放的列表


def register_function():  # 注册函数 (所有注册都来调用这个函数)
    count = 3  # 计数器,做到了一个提示用户的作用
    for i in range(3):  # 循环3次
        print("用户注册【你只有3次机会】,你还有【%s】次机会".center(80, "=") % count)  # 输出提示
        count -= 1  # 每次减1
        username = input("请输入用户名:")
        while True:
            passwd = input("请输入密码:")
            if len(passwd) >= 5:
                break
            else:  # 如果输入的密码小于5,位数,向下操作
                print("请输入大于5位数的密码")
                input_passwd = input("【1:继续输入;2:返回上一步】")
                if input_passwd == "1":
                    pass
                else:
                    main()
        while True:
            email = input("请输入邮箱:")
            email_count = email.count("@")  # 查看输入的邮箱是否带@,
            # print(email_count)  # 返回1代表有一个@
            if email_count == 1:
                break  # 如果有一个@符号,代表邮箱输入正确,跳出当前循环
            else:
                print("请输入正确的邮箱")
                input_email = input("【1:继续输入;2:返回上一步】")
                if input_email == "1":
                    pass
                else:
                    main()

        register_user = [username, passwd, email, "2"]  # 将我们输入的用户名密码以及邮箱放到一个列表中,普通用户,所以加上了一个2
        with open("user.txt", "r") as user:
            for line in user:
                f_user_list = line.strip("
").split("|")
                if register_user[0] == f_user_list[0]:
                    print("用户名已被注册")
                    break
                if register_user[2] == f_user_list[2]:  # 判断我们输入得的邮箱和用户名是否以及存在
                    print("邮箱已被注册")
                    break
            else:  # 接下来是通过了上面的筛选,开始把我们的注册信息写进数据库(总感觉上面有bug)
                user_write = "|".join(register_user)  # 用join方法将这个列表转换为以|分隔
                # open_user = open("user.txt", "a")  # a 以追加方式写入文件
                # open_user.write("
" + user_write)
                # open_user.close()  # 记得关闭
                with open("user.txt", "a") as f:
                    f.write("
" + user_write)  # 跟上面一样的方法,这种不用关闭文件
                print("注册成功")
                user_write = """用户名:【%s】;密码:【%s】;邮箱:【%s】""" 
                             % (register_user[0], register_user[1], register_user[2])  # 注册成功的提示信息
                return user_write  # 返回提示信息


def outer(func):  # 装饰器,用于管理接口
    def inner(*args, **kwargs):
        if WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "1":  # 为什么要加上引号,因为在列表中存储的是字符串,而不是整形
            r = func()  # 执行我们传入的函数
            return r  # 返回
        elif WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "2":  # 如果为普通用户,提示没有足够权限并且返回到main函数
            print("
当前用户为普通用户【%s】,没有足够的权限" % USER_LIST[0])
            main()
        else:
            print("
当前没有用户登录,请登录后再试。。。")  # 否者就是没有登录了
            main()

    return inner


def user_login(func):  # 检测用户是否登录的装饰器
    def inner(*args, **kwargs):
        if WHETHER_LOGIN["is_login"] == "success":  # 判断是否登录
            r = func()
            return r  # 如果已经登录,返回到原本的函数
        else:
            user_no = input("请登录后再试【1:用户登录;2:返回】:")
            if user_no == "1":
                login()
            else:
                print("返回成功")
                main()

    return inner  # 切记,这里必须返回一个inner,不然上面的inner不会执行,不能再后面加(),如果加上了,就相当于调用这个函数


def exit_login():  # 6退出登录
    global USER_LIST
    if USER_LIST:
        quit_login = input("当前用户为【%s】,确定要退出【Y/N】:" % USER_LIST[0])
        # if quit_login == "Y" or quit_login == "y" or quit_login == "yes":
        if quit_login in ("Y", "y", "yes", "yES", "yeS", "yEs", "YES", "Yes", "YEs"):  # 如果quit_login满足其中一个,继续执行
            WHETHER_LOGIN["is_login"] = "error"
            USER_LIST = []  # 直接将列表清除为初始状态,不知道这种方法好不好,但是好像管用
        elif quit_login in ("N", "n", "No", "nO", "NO"):
            print("退出失败")
    else:
        print("没有用户登录。。。")


def verifi_passwd():
    with open("user.txt", "r") as old_user:
        lines = old_user.readlines()  # 一次性读取整个文件,感觉这方方式不好
    flag = True
    cout = 3
    while flag:
        cout -= 1
        user_info = input("请输入用户名:")
        if user_info == "":  # 判断是否输入字符串
            print("你没有输入任何用户。。。
")
            manage()
        for line in lines:
            user_all_info = line.strip("
").split("|")
            if user_info == user_all_info[0]:
                current_user = user_all_info  # 如果输入的用户和用户文件里面的用户相同,那就将他的所有信息写入一个新的列表中
                flag = False
        if cout == 0:
            print("然而,你可能不知道有哪些用户,赶紧去查看吧。。。")
            manage()

    lines_user = [lines, current_user]
    return lines_user


def user_info_func(username, password_or_power, user_info, lines):  # 几个传入的类型为:用户名、密码或用户权限,需要修改的用户列表的位置、需要循环的文件内容
    new_user_info = username.copy()  # 将username复制给new_user_info
    new_user_info[user_info] = password_or_power  # 将新的用户密码修改为输入的新密码
    username = "|".join(username)  # 将列表转换为数据库可以识别的内容
    new_user_info = "|".join(new_user_info)
    # print(username, new_user_info)
    with open("user.txt", "w") as new_user:
        for line in lines:  # 将返回的整个文件循环打印
            if username in line:  # 如果返回的用户信息在返回的文件里面
                line = line.replace(username, new_user_info)  # 那就将旧的用户信息替换为新的用户信息
            new_user.write(line)  # 写入文件
        print("修改成功")  # 提示信息


@outer  # 调用装饰器
def manage():  # 5用户管理接口
    while True:
        print("用户管理接口【欢迎管理员[%s]】".center(69, "=") % USER_LIST[0])
        print("1:查看所有用户;2、添加新用户;3:删除用户;4:修改用户密码;5:升级用户权限;6:退出用户管理")
        user_input = input("请输入对象序号:")
        if user_input == "1":  # 查看用户信息
            print("
" + "-" * 80)  # 打印80个-
            with open("user.txt", "r") as user_info:
                for line in user_info:
                    user_list = line.strip("
").split("|")  # 去掉默认的
和|将他转换为列表类型
                    if user_list[3] == "1":
                        user_rights = "管理员用户"  # 用户最后一个数如果等于1,代表管理员
                    else:
                        user_rights = "普通用户"  # 否者为普通用户
                    ordinary_user = """用户名【%s】	密码【%s】	邮箱【%s】	用户等级【%s】""" 
                                    % (user_list[0], user_list[1], user_list[2], user_rights)  # 中间默认有一个换行符
                    print(ordinary_user)
            print("-" * 80 + "
")

        elif user_input == "2":
            while True:
                ret = register_function()  # 调用注册函数
                print(ret)  # 输出返回值
                break  # 跳出当前这个while循环

        elif user_input == "3":
            flag = "error"  # 默认是没有用户的(做到一个提示作用)
            del_user = verifi_passwd()[1][0]  # 得到函数返回的第二个值
            print("

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇远程桌面连接保存登陆用户以及密码(凭据)备份方法log4net将日志进行分类,保存到不同的目录当中下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【微信小程序】在swiper-item使用wx:for时出现的问题

代码如下: wxml: <!--pages/mall/mall.wxml--> <view class="contianer"> <view class="swiper"> <swiper display-multiple-items="{{swiper_pictures.length}}" indic...

ucos(八)软件定时器

一、概述   内核提供了一个模拟定时器的机制,类似于任务,但是占用资源少,只能做一些简单的定时控制,如可以定时的喂狗、控灯。在软件定时器,不能添加时间管理函数、阻塞等待函数(等待互斥锁/信号量/事件标志组/消息队列)。 1.创建软件定时器 void OSTmrCreate (OS_TMR *p_tmr, CPU_CHAR *p_name, OS_TIC...

iOS开发-应用崩溃日志揭秘(一)

作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作。它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! 如果你跟我一样是个完美主义者,你肯定想将应用做到尽善尽美。于是你打开代码准备修复闪退的问题……但是,从何处着手呢?这时iOS崩溃日志派上用场了。在大多数情况下...

solidity语言11

函数修饰符 pragma solidity ^0.4.11; contract owned { address owner; // 构造函数 function owned() public { owner = msg.sender; } // 此合约定义的函数修饰符不使用,用于衍生的合约...

如何得到idea的Activation code

如何得到idea的Activation code   -- 源自CSDN 晨曦遇晓 原文链接 :https://blog.csdn.net/u014508939/article/details/93495234 以前公司都是使用eclipse进行开发,现在新的公司是使用idea工具,因为该软件是收费的 首次打开会让输入激活码,可以选择输入code的方式来激...

javascript“数组”的常用方法---以及冒泡排序

首先,数组是数据的集合。 可以通过构造函数(var arr = new Array('0','1','hello'))和字面量(var arr = ['0','1'])的方式来创建, 需要注意的是,构造函数创建时,如果值只有一个,而且还是数字,那么他代表数组的长度(var arr = new Array(5),创建一个长度为5的数组)。 数组的索引是从0开...