python⽤户管理系统的实例讲解
学Python这么久了,第⼀次写⼀个这么多的代码(我承认只有300多⾏,重复的代码挺多的,我承认我确实垃圾),但是也挺不容易的⾃定义函数+装饰器,每⼀个模块写的⼀个函数
很多地⽅能⽤装饰器(逻辑跟不上,有的地⽅没⽤),包括双层装饰器(不会),很多地⽅需要优化,重复代码太多
我还是把我的流程图拿出来吧,虽然看着⽐上次的垃圾,但是我也做了⼀个⼩时,不容易!
好像是挺丑的(表⽰不会画,但我下次⼀定努⼒)
⽤户⽂件:
1代表管理员⽤户
2代表普通⽤户
smelond|admin|*********|1
admin|admin|*************|2
qwe|qweasd|**********|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 = unt("@") # 查看输⼊的邮箱是否带@,
# 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("", "r") as user:
for line in user:
f_user_list = line.strip("\n").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("", "a") # a 以追加⽅式写⼊⽂件
字符串函数strip()的作用是# open_user.write("\n" + user_write)
# open_user.close() # 记得关闭
with open("", "a") as f:
f.write("\n" + 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("\n当前⽤户为普通⽤户【%s】,没有⾜够的权限" % USER_LIST[0])
main()
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("", "r") as old_user:
lines = adlines() # ⼀次性读取整个⽂件,感觉这⽅⽅式不好
flag = True
cout = 3
while flag:
cout -= 1
user_info = input("请输⼊⽤户名:")
if user_info == "": # 判断是否输⼊字符串
print("你没有输⼊任何⽤户。。。\n")
manage()
for line in lines:
user_all_info = line.strip("\n").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 = py() # 将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("", "w") as new_user:
for line in lines: # 将返回的整个⽂件循环打印
if username in line: # 如果返回的⽤户信息在返回的⽂件⾥⾯
line = place(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("\n" + "-" * 80) # 打印80个-
with open("", "r") as user_info:
for line in user_info:
user_list = line.strip("\n").split("|") # 去掉默认的\n和|将他转换为列表类型
if user_list[3] == "1":
user_rights = "管理员⽤户" # ⽤户最后⼀个数如果等于1,代表管理员
else:
user_rights = "普通⽤户" # 否者为普通⽤户
ordinary_user = """⽤户名【%s】\t密码【%s】\t邮箱【%s】\t⽤户等级【%s】""" \
% (user_list[0], user_list[1], user_list[2], user_rights) # 中间默认有⼀个换⾏符
print("-" * 80 + "\n")
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("\033[1;31m删除⽤户为:\033[0m", del_user)
with open("", "r") as old_user:
lines = adlines() # ⼀次性读取整个⽂件,感觉这⽅⽅式不好1
with open("", "w") as new_user:
for line in lines: # 将上⾯读取到的⽂集⼀⾏⼀⾏的循环出来
if line.startswith(del_user): # 检查数据库⾥⾯是否有我们输⼊的⽤户(以输⼊的⽤户名开头)
flag = "success"
continue
new_user.write(line)
if flag == "success": # 提⽰成功
print("删除成功")
else:
print("没有这个⽤户。。。") # 如果输⼊的为空格或⼀些没有的⽤户,提⽰没有这个⽤户
continue
elif user_input == "4":
ret = verifi_passwd() # 得到函数返回值
lines = ret[0] # 获取到返回的整个⽂件内容
username = ret[1] # 获取到返回的需要修改密码的⽤户
new_password = input("请输⼊⽤户的新密码:")
if len(new_password) < 5: # 判断输⼊的密码长度是否⼤于或等于5位数
error_prompt = input("你输⼊的密码长度⼩于5位数,由于你是管理员,输⼊Y继续:").strip("") # 去掉输⼊的空格  if error_prompt not in ("y", "Y"): # 如果输⼊的值不为y或Y,就直接退出
print("退出。。。")
continue
user_info_func(username, new_password, 1, lines) # 传⼊实参到函数,1在列表中的位置代表⽤户的新密码
elif user_input == "5": # 下⾯这部分和上⾯的部分基本相似,其实可以写⼀个函数⽤来调⽤的
ret = verifi_passwd()
lines = ret[0]
username = ret[1] # 获取到输⼊⽤户的所有信息
new_power = input("输⼊Y提升⽤户权限:")
if new_power not in ("y", "Y"):
print("输⼊错误。。。")
break
user_info_func(username, "1", 3, lines) # 传⼊实参:⽤户名、权限(1代表管理员)、位置、循环的⽂件内容 elif user_input == "6":
print("返回上⼀级")
main()
else:
print("输⼊有误")
@user_login # 调⽤装饰器
def see(): # 4查询当前⽤户的基本信息
if USER_LIST[3] == "1": # 数据库⾥⾯定义了1代表管理员⽤户,2代表普通⽤户
user_level = "管理员⽤户"
else:
user_level = "普通⽤户"
user_see = """
-
---------------------------------------
⽤户名:【%s】
密码:【%s】
邮箱:【%s】
⽤户等级:【%s】
----------------------------------------
""" % (USER_LIST[0], USER_LIST[1], USER_LIST[2], user_level) # ⼀个简单的格式化输出
print(user_see)
def error_password():
counter = 3
while True:
counter -= 1
if counter == 0:
print("你输⼊错误的次数太多,程序⾃动返回。。。")
main()
else:
print("两次输⼊的密码不相同。。。")
continue
@user_login # 调⽤装饰器
def alter(): # 3修改密码
print("当前⽤户为:【%s】" % USER_LIST[0])
while True:
old_user_password = input("请输⼊当前⽤户的旧密码密码:")
if old_user_password == USER_LIST[1]:
count = 3
while flag:
count -= 1
new_user_password = input("请输⼊当前⽤户的\033[1;31m新密码\033[0m:") # 给新密码字体加颜⾊
new_user_password1 = input("再次输⼊当前⽤户的\033[1;31m新密码\033[0m:")
if len(new_user_password) >= 5:
flag = False
elif count == 0:
print("多次不合法,程序⾃动返回。。。")
main()
else:
print("输⼊不合法,请输⼊⼤于5位数的密码")
if new_user_password == new_user_password1: # 判断两次输⼊的密码是否相等
with open("", "r") as user_info: # 以读的⽅式打开这个⽂件
old_user_info = "|".join(USER_LIST) # 获取以前的旧信息
for line in user_info: # 将获取到的每⾏循环输出
if USER_LIST[0] in line: # 到当前登录的⽤户的这个⽤户名
USER_LIST[1] = new_user_password1 # 如果到了,就把新密码重新加⼊到我们全局的⽤户的信息列表中
new_user_info = "|".join(USER_LIST) # 将⽤户信息表中的内容⽤join⽅法转换为⽤户数据库⾥⾯的格式(新⽤户信息)    # print(new_user_info)
# print(old_user_info)
break # 跳出当前
with open("", "r") as old_user:
lines = adlines() # ⼀次性读取整个⽂件,感觉这⽅⽅式不好
with open("", "w") as new_user:
for line in lines: # 将上⾯读取到的⽂集⼀⾏⼀⾏的循环出来
if old_user_info in line: # 检查⽂件⾥⾯是否有我们⽤户的旧信息
line = place(old_user_info, new_user_info) # 如果有就⽤replace替换
new_user.write(line) # 接着写⼊到⽂件
print("修改成功√")
break # 完成后跳出
else: # 两次不相等
print("两次输⼊的密码不相同,程序⾃动返回。。。")
main()
else: # 当前⽤户密码输⼊错误
print("当前⽤户密码输⼊错误,程序⾃动返回。。。")
main()
def register(): # 2⽤户注册
if WHETHER_LOGIN["is_login"] == "success":
quit_login = input("⽆法注册⽤户,请退出登录后重试【1:退出登录;2:返回上⼀步】:")
if quit_login == "1":
exit_login() # 跳转到退出⽤户函数
elif quit_login == "2":
print("返回成功")
elif WHETHER_LOGIN["is_login"] == "error":
ret = register_function() # 调⽤注册函数
print(ret) # 将返回值输出
def login(): # 1⽤户登录
print("⽤户登录".center(82, "="))
username = input("请输⼊⽤户名:")
passwd = input("请输⼊密码:")
with open("", "r") as user:
for line in user:
f_user_list = line.strip("\n").split("|") # 去除每⾏默认的回车,以及|,并且将它转换为列表赋给f_admin_list
if f_user_list[0] == username and f_user_list[1] == passwd:
print("登录成功")
global USER_LIST
USER_LIST = f_user_list # 将获取到的当前⾏放到⽤户信息列表中
WHETHER_LOGIN["is_login"] = "success" # 登录成功将is_login的值设置success
WHETHER_LOGIN["is_user"] = username # 将我们登录的⽤户放⼊字典⽤,⽅便后期查询
# print(USER_LIST)
return f_user_list
else:
print("登录失败")
def main():
while True:
global COUNT
COUNT += 1
print("⽤户管理系统".center(80, "*") + "\n")
print("1、⽤户登录;2:⽤户注册;3:修改密码;4:⽤户信息;5:⽤户管理;6:退出登录;7:退出程序")
inp = input("请输⼊序号:")
if inp == "1":
if USER_LIST:
if USER_LIST[3] == "1":
print("当前为管理员⽤户:【%s】,不能继续登录" % USER_LIST[0])
else:
print("当前⽤户为【%s】,不能继续登录" % USER_LIST[0])
else:
login()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。