python之简单后台管理程序

时间:2024-03-09 07:02:54

一、作业需求

 

 

 

 

二、流程图

 

 

 

 

 

三、源码与具体思路

 

 

import shutil
import os
import sys


USER_LOGIN = {\'is_login\': False}

def outer(func):                   #装饰器,若没有登陆则输出“请登陆”
    def inner(*args, **kwargs):
        if USER_LOGIN[\'is_login\']:
            r = func(*args, **kwargs)
            return r
        else:
            print("请登陆")
    return inner


def outer1(func):                 #装饰器,若不是管理员则输出“权限不足”
    def inner1(*args, **kwargs):
        if USER_LOGIN[\'user_type\'] == \'2\':
            r = func(*args, **kwargs)
            return r
        else:
            print("不是管理员,权限不足")
    return inner1


@outer
def change_pwd(changed_user, changed_pwd, type_user):         #修改密码
    if type_user == \'1\':
        print("欢迎%s修改密码".center(50, \'-\') % USER_LOGIN[\'current_user\'])
        with open(\'regist\', \'r\', encoding=\'utf-8\') as f1, open(\'regist_new\', \'w\', encoding=\'utf-8\') as f2:
            for line in f1:
                read_list = line.strip().split(\'|\')
                if read_list[0] == changed_user:
                    read_list[1] = changed_pwd
                    f2.write(\'|\'.join(read_list) + \'\n\')
                    continue

                f2.write(line)
        shutil.move(\'regist\', \'regist_bak\')           #把regist文件复制到regist_bak文件中去
        os.rename(\'regist_new\', \'regist\')             #再将regist_new改名为regist            妙妙妙!
    else:
        print("没有权限修改管理员密码")



@outer
def look_information():           #查看本用户信息
    print("欢迎%s查看信息".center(50, \'-\') % USER_LOGIN[\'current_user\'])
    with open(\'regist\', \'r+\', encoding=\'utf-8\') as f:
        for line in f:
            read_list = line.strip().split(\'|\')
            if read_list[0] == USER_LOGIN[\'current_user\']:
                print("用户名:%s" % read_list[0])
                print("密码:%s" % read_list[1])
                print("邮箱:%s" % read_list[2])
                print("电话:%s" % read_list[3])



def login(user, pwd):         #登陆
    with open(\'regist\', \'r+\', encoding=\'utf-8\') as f:
        for line in f:
            read_list = line.strip().split(\'|\')
            if read_list[0] == user and read_list[1] == pwd:    #若用户存在
                USER_LOGIN[\'is_login\'] = True
                USER_LOGIN[\'current_user\'] = user
                USER_LOGIN[\'user_type\'] = read_list[-1]
                print("欢迎%s登陆".center(50, \'-\') % USER_LOGIN[\'current_user\'])
                break

    if not USER_LOGIN[\'is_login\']:        #若用户还没注册
        print("用户不存在,请注册")



def register(reg_user, reg_pwd, reg_email, reg_phone):         #注册
    register_list = []
    register_list.append(reg_user)      #将用户信息加入列表
    register_list.append(reg_pwd)
    register_list.append(reg_email)
    register_list.append(reg_phone)
    register_list.append(\'1\')
    with open(\'regist\', \'a\', encoding=\'utf-8\') as f:   #将用户信息写入文件
        li = \'|\'.join(register_list)
        f.write(li + \'\n\')

    print("注册/添加信息:", li)




def delete_func(dele_user, type_user):       #删除普通用户
    if type_user == \'1\':          #若删除的是普通用户
        exit_flag = False
        with open(\'regist\', \'r+\', encoding=\'utf-8\') as f1, open(\'regist_new\', \'w\', encoding=\'utf-8\') as f2:
            for line in f1:
                ret_list = line.strip().split(\'|\')
                if ret_list[0] == dele_user:
                    exit_flag = True        #标志位原本设为False,当找到相应用户删除后,标志位设为True
                    print("普通用户删除成功")
                    continue
                f2.write(line)
        shutil.move(\'regist\', \'regist_bak\')
        os.rename(\'regist_new\', \'regist\')

        if not exit_flag:
            print("要删除普通用户不存在")
    elif type_user == \'2\':      #若删除的是管理员用户
        print("没有权限删除管理员帐号")



def upper_level(upper_user):    #升级为管理员
    with open(\'regist\', \'r+\', encoding=\'utf-8\') as f1, open(\'regist_new\', \'w\', encoding=\'utf-8\') as f2:
        for line in f1:
            li = line.strip().split(\'|\')
            if li[0] == upper_user:
                li[-1] = \'2\'
                print("%s已成为管理员" % upper_user)
                f2.write(\'|\'.join(li) + \'\n\')
                continue
            f2.write(line)

    shutil.move(\'regist\', \'regist_bak\')
    os.rename(\'regist_new\', \'regist\')



def search(search_info):     #简单搜索
    with open(\'regist\', \'r+\', encoding=\'utf-8\') as f:
        for line in f:
            ret_list = line.strip().split(\'|\')
            if search_info in ret_list:
                print(ret_list)



def get_usertype(user):     #通地用户名获得用户类型,返回1或2
    with open(\'regist\', \'r+\', encoding=\'utf-8\') as f:
        for line in f:
            li = line.strip().split(\'|\')
            if li[0] == user:
                return li[-1]      #返回帐号的类型  1或2



@outer1
def admin_user():            #管理员调用
    num = input("请选择:1.修改密码;2.查看本用户信息;3.修改普通用户密码;"
                                      "4.删除/添加普通用户;5.权限管理;6.关键字搜索普通用户信息;7.退出:")
    if num == \'1\':
        new_pwd = input("请输入新的密码:")
        change_pwd(new_pwd)
    elif num == \'2\':
        look_information()
    elif num == \'3\':
        user_changed = input("请输入修改密码的用户名:")
        type_user = get_usertype(user_changed)
        new_pwd = input("请输入新的密码:")
        change_pwd(user_changed, new_pwd, type_user)
    elif num == \'4\':
        add_or_dele = input("1.删除普通用户;2.添加普通用户")
        if add_or_dele == \'1\':
            delete_username = input("请输入要删除普通用户的用户名:")
            type_user = get_usertype(delete_username)
            delete_func(delete_username, type_user)
        elif add_or_dele == \'2\':
            regi_username = input("请输入注册用户名:")
            regi_pwd = input("请输入注册密码:")
            regi_email = input("请输入邮箱:")
            regi_phone = input("请输入电话:")
            register(regi_username, regi_pwd, regi_email, regi_phone)
    elif num == \'5\':
        upper_user = input("请输入升级为管理员的普通用户名:")
        upper_level(upper_user)

    elif num == \'6\':
        search_information = input("请输入要查找的关键字:")
        search(search_information)
    elif num == \'7\':
        sys.exit()





def main():

    while True:
        choice = input("请选择:1.登陆;2.注册;3.修改密码;4.查看信息;5.后台管理;6.退出:")
        if choice == \'1\':
            username = input("请输入用名名:")
            password = input("请输入密码:")
            login(username, password)
        elif choice == \'2\':
            regi_username = input("请输入注册用户名:")
            regi_pwd = input("请输入注册密码:")
            regi_email = input("请输入邮箱:")
            regi_phone = input("请输入电话:")
            register(regi_username, regi_pwd,regi_email,regi_phone)
            print("注册成功".center(50, \'*\'))
        elif choice == \'3\':
            new_pwd = input("请输入新的密码:")
            current_user = USER_LOGIN[\'current_user\']
            change_pwd(current_user, new_pwd)
            print("修改密码成功,请重新登陆".center(50, \'-\'))
            sys.exit()
        elif choice == \'4\':
            look_information()
        elif choice == \'5\':
            admin_user()
        elif choice == \'6\':
            sys.exit()


main()
View Code

 

为了方便,再贴下不折叠代码

 

@outer1
def admin_user():            #管理员调用
    num = input("请选择:1.修改密码;2.查看本用户信息;3.修改普通用户密码;"
                                      "4.删除/添加普通用户;5.权限管理;6.关键字搜索普通用户信息;7.退出:")
    if num == \'1\':
        new_pwd = input("请输入新的密码:")
        change_pwd(new_pwd)
    elif num == \'2\':
        look_information()
    elif num == \'3\':
        user_changed = input("请输入修改密码的用户名:")
        type_user = get_usertype(user_changed)
        new_pwd = input("请输入新的密码:")
        change_pwd(user_changed, new_pwd, type_user)
    elif num == \'4\':
        add_or_dele = input("1.删除普通用户;2.添加普通用户")
        if add_or_dele == \'1\':
            delete_username = input("请输入要删除普通用户的用户名:")
            type_user = get_usertype(delete_username)
            delete_func(delete_username, type_user)
        elif add_or_dele == \'2\':
            regi_username = input("请输入注册用户名:")
            regi_pwd = input("请输入注册密码:")
            regi_email = input("请输入邮箱:")
            regi_phone = input("请输入电话:")
            register(regi_username, regi_pwd, regi_email, regi_phone)
    elif num == \'5\':
        upper_user = input("请输入升级为管理员的普通用户名:")
        upper_level(upper_user)

    elif num == \'6\':
        search_information = input("请输入要查找的关键字:")
        search(search_information)
    elif num == \'7\':
        sys.exit()





def main():

    while True:
        choice = input("请选择:1.登陆;2.注册;3.修改密码;4.查看信息;5.后台管理;6.退出:")
        if choice == \'1\':
            username = input("请输入用名名:")
            password = input("请输入密码:")
            login(username, password)
        elif choice == \'2\':
            regi_username = input("请输入注册用户名:")
            regi_pwd = input("请输入注册密码:")
            regi_email = input("请输入邮箱:")
            regi_phone = input("请输入电话:")
            register(regi_username, regi_pwd,regi_email,regi_phone)
            print("注册成功".center(50, \'*\'))
        elif choice == \'3\':
            new_pwd = input("请输入新的密码:")
            current_user = USER_LOGIN[\'current_user\']
            change_pwd(current_user, new_pwd)
            print("修改密码成功,请重新登陆".center(50, \'-\'))
            sys.exit()
        elif choice == \'4\':
            look_information()
        elif choice == \'5\':
            admin_user()
        elif choice == \'6\':
            sys.exit()

main()

 

 

四、坑总结

  1.怎么修改密码?

  当时我蒙比了。因为如果用f.write(xx),是直接写在文件的最后面的。这样我想,好吧写在最后面也行。

但将已修改密码的记录加在最后一行,那又怎么把原来的删掉?又多了一个麻烦。
或者说,不加在最后一行,直接改那一行,又怎么做?
shutil.move(\'regist\', \'regist_bak\')       #把regist文件复制到regist_bak文件中去
os.rename(\'regist_new\', \'regist\')         #再将regist_new改名为regist            妙妙妙!

 

2.怎么修改用户user_type(将1改为2)
我看到有的博客有replace()方法。
new_str = line.replace(read_list[1], changed_pwd) 刚开始我也用了,但是,后来有BUG!
比如:当用户名与密码一样是,修改密码时,把密码也修改了。还不止,用replace()方法,在改
user_type时也出现把用户名等修改的现象。当时我再次蒙比。这不科学!
  后来仔细看了replace()的源码才发现我错了。
也可以看看http://www.runoob.com/python/att-string-replace.html

3.当我登入管理员后,添加普通用户后,发现不能再次登入管理员了。
于是我回去看register(reg_user, reg_pwd, reg_email, reg_phone),
发现我滥用全局变量
USER_LOGIN[\'user_type\'] = \'1\'
register_list.append(USER_LOGIN[\'user_type\'])

原来这里我重新赋值USER_LOGIN[\'user_type\'] = \'1\'

后来为了解决这类问题,写了个get_user_type()方法