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

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

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

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

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

用户文件:

文件名为: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 == "":
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 == "":
pass
else:
main() register_user = [username, passwd, email, ""] # 将我们输入的用户名密码以及邮箱放到一个列表中,普通用户,所以加上了一个2
with open("user.txt", "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("user.txt", "a") # a 以追加方式写入文件
# open_user.write("\n" + user_write)
# open_user.close() # 记得关闭
with open("user.txt", "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] == "": # 为什么要加上引号,因为在列表中存储的是字符串,而不是整形
r = func() # 执行我们传入的函数
return r # 返回
elif WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "": # 如果为普通用户,提示没有足够权限并且返回到main函数
print("\n当前用户为普通用户【%s】,没有足够的权限" % USER_LIST[0])
main()
else:
print("\n当前没有用户登录,请登录后再试。。。") # 否者就是没有登录了
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 == "":
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("你没有输入任何用户。。。\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 = 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 == "": # 查看用户信息
print("\n" + "-" * 80) # 打印80个-
with open("user.txt", "r") as user_info:
for line in user_info:
user_list = line.strip("\n").split("|") # 去掉默认的\n和|将他转换为列表类型
if user_list[3] == "":
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(ordinary_user)
print("-" * 80 + "\n") elif user_input == "":
while True:
ret = register_function() # 调用注册函数
print(ret) # 输出返回值
break # 跳出当前这个while循环 elif user_input == "":
flag = "error" # 默认是没有用户的(做到一个提示作用)
del_user = verifi_passwd()[1][0] # 得到函数返回的第二个值
print("\033[1;31m删除用户为:\033[0m", del_user)
with open("user.txt", "r") as old_user:
lines = old_user.readlines() # 一次性读取整个文件,感觉这方方式不好1
with open("user.txt", "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 == "":
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 == "": # 下面这部分和上面的部分基本相似,其实可以写一个函数用来调用的
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, "", 3, lines) # 传入实参:用户名、权限(1代表管理员)、位置、循环的文件内容
elif user_input == "":
print("返回上一级!!!")
main()
else:
print("输入有误") @user_login # 调用装饰器
def see(): # 4查询当前用户的基本信息
if USER_LIST[3] == "": # 数据库里面定义了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]:
flag = True
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("user.txt", "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("user.txt", "r") as old_user:
lines = old_user.readlines() # 一次性读取整个文件,感觉这方方式不好
with open("user.txt", "w") as new_user:
for line in lines: # 将上面读取到的文集一行一行的循环出来
if old_user_info in line: # 检查文件里面是否有我们用户的旧信息
line = line.replace(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 == "":
exit_login() # 跳转到退出用户函数
elif quit_login == "":
print("返回成功")
elif WHETHER_LOGIN["is_login"] == "error":
ret = register_function() # 调用注册函数
print(ret) # 将返回值输出 def login(): # 1用户登录
print("用户登录".center(82, "="))
username = input("请输入用户名:")
passwd = input("请输入密码:")
with open("user.txt", "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 == "":
if USER_LIST:
if USER_LIST[3] == "":
print("当前为管理员用户:【%s】,不能继续登录" % USER_LIST[0])
else:
print("当前用户为【%s】,不能继续登录" % USER_LIST[0])
else:
login()
elif inp == "":
register()
elif inp == "":
alter()
elif inp == "":
see()
elif inp == "":
manage()
elif inp == "":
exit_login()
elif inp == "":
exit("程序已退出!!!")
else:
if COUNT == 3:
exit("输入错误次数过多,程序自动退出。。。")
else:
print("输入有误,请重新输入。。。\n")
continue main()

python用户管理系统的更多相关文章

  1. 当用户管理系统遇上python和mongodb后……

    Overview: 环境 前言 效果图 mongdb安装 代码涉及知识点 关于windows的cmd下执行python文件显示中文乱码的问题 总结 0.环境 操作系统:Windows Python版本 ...

  2. day16,模块 , 用户管理系统 , 购物车程序 , 分页显示.

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.列举你常见的内置函数."""强制转换:int() / str() / li ...

  3. 鹏程网用户管理系统学习(2016-07-18 by 徐鹏)

    新的平台:X平台(x.hna.net)旧的平台:鹏程网(www.hna.net) 如今的平台情况:很多业务已经转到X平台,但也存在少量的业务还是用鹏程网的旧系统.例如**用户管理系统(也逐渐转移到易服 ...

  4. python - 用户交互/数据类型/格式化输出/运算符/流程控制单双多分支

    python:用户交互: 等用户输入,做反应: username=input("username:")password=input("password:")pr ...

  5. JDBC MySQL 实例之 用户管理系统

    1 Java 和 MySQL 怎么建立连接 2 通过Java怎么对数据库进行操作 package day01; import java.sql.Connection; import java.sql. ...

  6. php+js实现一个简单的用户管理系统

    php + js 实现一个简单的用户管理系统 说实话,我对PHP是抵触的,但是我们的WEB课程刚好学的就是这个,不得已看了看,下面是用PHP实现的一个简单的用户管理系统. 我们首先来看一下目录结构 a ...

  7. 简易用户管理系统-前端实现(表单&提交请求&button$基础)

    laravel框架编写简易用户管理系统,前端Layui框架. 1.动态生成列表项 实现效果 PHP后台传入用户对象($users). 前端页面接收数据传入table. 逻辑就是在生成表格时,遍历传来的 ...

  8. Vue + Springboot 开发的简单的用户管理系统

    后台接口如下: 页面如下: 1. 主页,显示所有的用户信息 2. 点击详情,看到某个id的用户的详细信息 3. 点击编辑按钮,跳转到的详细的编辑(更新)页面 4. 添加用户页面 对应的vue代码如下 ...

  9. python用户评论标签匹配的解决方法

    python用户评论标签匹配的解决方法 这篇文章主要为大家详细介绍了python用户评论标签匹配的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 我们观察用户评论发现:属性词往往和情感词伴 ...

随机推荐

  1. java三级考试理论题

    Java试卷 一.单项选择题: 1. 试题: 在WINDOWS环境下,ODBC在__A____中设置 A. 控制面板 B. 注册表 C. 浏览器 D. 写字板 2. 阅读以下描述: C <jsp ...

  2. R-CNN论文翻译——用于精确物体定位和语义分割的丰富特征层次结构

    原文地址 我对深度学习应用于物体检测的开山之作R-CNN的论文进行了主要部分的翻译工作,R-CNN通过引入CNN让物体检测的性能水平上升了一个档次,但该文的想法比较自然原始,估计作者在写作的过程中已经 ...

  3. C#三大方法:虚方法、静态方法、实例方法

    虚方法:使用virtual关键字定义,当子类继承父类时,可以对父类中的虚方法进行重写. 如下面代码中的类B,它继承类A,类A实现了接口I(实现了接口中的foo()方法).在类A中使用virtual将f ...

  4. SignalR实现消息推送,包括私聊、群聊、在线所有人接收消息(源码)

    一.关于SignalR 1.简介:Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面, ...

  5. linux-mv

    linux-mv 主要用于文件或者目录的移动或者改动, 命令参数 -i:ruguo目标文件或者目录存在,提示是否覆盖目标文件或目录 -f:无论目标文件是否存在,直接覆盖,不提示, 有好多参数,自己可以 ...

  6. 用cmd命令创建oracle 数据库、用户和表空间

    Win+R调查运行窗口,输入cmd回车 连接到本地oracle库 创建名为"SXSJ"的表空间,其初始大小为512M,支持自动扩展,每次增量为32M: create tablesp ...

  7. WIN7+wampserver2.4+zend stadio10.6.1配置Xdebug

    一.前言 zend stadio调试很不方便,php5.3版本之前可使用zend debuger调试,php5.3以后就需要使用XDebug调试了.下面介绍我配置的经验,希望帮助更多的人 二.配置步骤 ...

  8. 关于thinkphp控制器引用model里的方法的一点收获

    有时候真的是很绕,为了这一点点收获,我几乎花了一天的时间.当我弄明白了的那一刻,我.........好吧,写到这里,我发现不能换行.好吧,就这样吧,开始说正题:要想在controler从model引用 ...

  9. 【分享】纯jQuery实现星巴克官网导航栏效果

    前言 大冬天的没得玩,只能和代码玩. 所以就无聊研究了一下星巴克官网,在我看来应该是基本还原吧~ 请各位大神指教! 官网效果图 要写的就是最上方的会闪现的白色条条 效果分析 1.在滚动条往下拉到一定距 ...

  10. C语言系列之printf和%12d的用法(三)

    看C语言程序的时候,往往会遇到printf函数输出,在此,我想总结一下printf的一般用法以及%12d是什么意思 printf函数的一般格式为 printf(格式控制,输出列表): 例如: prin ...