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 相关文章推荐
python通过urllib2爬网页上种子下载示例
Feb 24 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
python使用matplotlib绘制柱状图教程
Feb 08 Python
Python类的动态修改的实例方法
Mar 24 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 Python
如何用Matlab和Python读取Netcdf文件
Feb 19 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&amp;mysql(一)
2006/10/09 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
用户注册常用javascript代码
2009/08/29 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
详解微信小程序实现WebSocket心跳重连
2018/07/31 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
python+opencv实现高斯平滑滤波
2020/07/21 Python
pytest中文文档之编写断言
2019/09/12 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
python opencv如何实现图片绘制
2020/01/19 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
PHP面试题大全
2015/10/16 面试题
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
一月红领巾广播稿
2014/02/11 职场文书
新闻专业学生的自我评价
2014/02/13 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
对学校的意见和建议
2015/06/04 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript