python用户管理系统的实例讲解


Posted in Python onDecember 23, 2017

学Python这么久了,第一次写一个这么多的代码(我承认只有300多行,重复的代码挺多的,我承认我确实垃圾),但是也挺不容易的

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

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

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

python用户管理系统的实例讲解

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

用户文件:

文件名为: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("\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] == "1": # 为什么要加上引号,因为在列表中存储的是字符串,而不是整形
  r = func() # 执行我们传入的函数
  return r # 返回
 elif WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "2": # 如果为普通用户,提示没有足够权限并且返回到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 == "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("你没有输入任何用户。。。\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 == "1": # 查看用户信息
  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] == "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(ordinary_user)
  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("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 == "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]:
  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 == "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("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 == "1":
  if USER_LIST:
  if USER_LIST[3] == "1":
   print("当前为管理员用户:【%s】,不能继续登录" % USER_LIST[0])
  else:
   print("当前用户为【%s】,不能继续登录" % USER_LIST[0])
  else:
  login()
 elif inp == "2":
  register()
 elif inp == "3":
  alter()
 elif inp == "4":
  see()
 elif inp == "5":
  manage()
 elif inp == "6":
  exit_login()
 elif inp == "7":
  exit("程序已退出!!!")
 else:
  if COUNT == 3:
  exit("输入错误次数过多,程序自动退出。。。")
  else:
  print("输入有误,请重新输入。。。\n")
  continue

main()

以上这篇python用户管理系统的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
web.py中调用文件夹内模板的方法
Aug 26 Python
说一说Python logging
Apr 15 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
pyqt 实现在Widgets中显示图片和文字的方法
Jun 13 Python
numpy求平均值的维度设定的例子
Aug 24 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
Python 音频生成器的实现示例
Dec 24 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
Jun 23 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
python 列表推导和生成器表达式的使用
Feb 01 Python
Pandas-DataFrame知识点汇总
Mar 16 Python
python队列通信:rabbitMQ的使用(实例讲解)
Dec 22 #Python
python3写爬取B站视频弹幕功能
Dec 22 #Python
机器学习经典算法-logistic回归代码详解
Dec 22 #Python
利用python将xml文件解析成html文件的实现方法
Dec 22 #Python
python实现数据预处理之填充缺失值的示例
Dec 22 #Python
NetworkX之Prim算法(实例讲解)
Dec 22 #Python
Python实现控制台中的进度条功能代码
Dec 22 #Python
You might like
php array_slice函数的使用以及参数详解
2008/08/30 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
js数组的基本使用总结
2021/01/18 Javascript
python3编码问题汇总
2016/09/06 Python
python多进程控制学习小结
2018/10/31 Python
python执行精确的小数计算方法
2019/01/21 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
python实现贪吃蛇双人大战
2020/04/18 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
《动手做做看》教学反思
2014/04/09 职场文书
大学活动总结格式
2014/04/29 职场文书
就业协议书范本
2014/10/08 职场文书
建筑横幅标语
2014/10/09 职场文书
学校捐书倡议书
2015/04/27 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers