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实现简单的计时器功能函数
Mar 14 Python
Python制作爬虫采集小说
Oct 25 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
python基于SMTP协议发送邮件
May 31 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
Python字符串格式化f-string多种功能实现
May 07 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 Python
python 获取域名到期时间的方法步骤
Feb 10 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防止刷新重复提交页面的示例代码
2015/11/11 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
python获取糗百图片代码实例
2013/12/18 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
利用Python爬取可用的代理IP
2016/08/18 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
python利用7z批量解压rar的实现
2019/08/07 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
美丽的现代设计家具:2Modern
2018/07/26 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
行政前台岗位职责
2013/12/04 职场文书
网页美工求职信
2014/02/15 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书