English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ejemplo de explicación de un sistema de gestión de usuarios de Python

He estado aprendiendo Python tanto tiempo, y por primera vez he escrito tanto código (admito que solo300 líneas, hay mucho código repetido, admito que realmente soy malo), pero también ha sido difícil

Función personalizada+Decoradores, una función escrita para cada módulo

En muchos lugares se pueden usar decoradores (la lógica no sigue, algunos lugares no los utilizan), incluyendo decoradores de doble capa (no sabe), en muchos lugares se necesita optimizar, hay demasiado código repetido

Aún así, saco mi diagrama de flujo, aunque parece peor que el anterior, he trabajado una hora en él, ¡no es fácil!

Parece que es bastante feo (indica que no sabe dibujar, pero seguro que se esforzará la próxima vez)

Archivo de usuario:

El nombre del archivo es: user.txt

1Representa el usuario administrador

2Representa a un usuario común

smelond|admin|[email protected]|1
admin|admin|[email protected]|2
qwe|qweasd|[email protected]|2

Código (sentirse que este programa tiene muchos errores):

#!/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("请输入大于5caracteres de contraseña")
  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("El nombre de usuario ya ha sido registrado")
   break
  if register_user[2== f_user_list[2]: # Determinar si el correo electrónico y el nombre de usuario que hemos ingresado ya existen
   print("El correo electrónico ya ha sido registrado")
   break
  else: # A continuación, una vez que se ha pasado el filtro anterior, comenzamos a escribir nuestra información de registro en la base de datos (siento que hay un bug allí)
  user_write = "|".join(register_user) # Convertir esta lista en una cadena separada por |
  # open_user = open("user.txt", "a") # Escribir en modo追加
  # open_user.write("\n" + user_write)
  # open_user.close() # Recordar cerrar
  with open("user.txt", "a") as f:
   f.write("\n" + user_write) # De la misma manera que antes, este método no requiere cerrar el archivo
  print("Registro exitoso")
  user_write = """Nombre de usuario:【%s】;Contraseña:【%s】;Correo electrónico:【%s】""" \
    % (register_user[0], register_user[1], register_user[2]) # Mensaje de confirmación de registro exitoso
  return user_write # Regresar el mensaje de información
def outer(func): # Decorador, utilizado para gestionar interfaces
 def inner(*args, **kwargs):
 if WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "1: # ¿Por qué agregar comillas? Porque en la lista se almacenan cadenas de texto, no enteros
  r = func() # Ejecutar la función proporcionada
  return r # Regresar
 elif WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "2: # Si es un usuario común, se indica que no tiene permisos suficientes y se regresa a la función principal
  print("\nEl usuario actual es un usuario común【%s】,no tiene suficientes permisos" % USER_LIST[0])
  main()
 else:
  print("\nActualmente no hay usuarios conectados, por favor inicie sesión nuevamente...") # De lo contrario, es que no está conectado
  main()
 return inner
def user_login(func): # Decorador para verificar si el usuario está conectado
 def inner(*args, **kwargs):
 if WHETHER_LOGIN["is_login"] == "success": # Verifica si se ha iniciado sesión
  r = func()
  return r # Si ya ha iniciado sesión, regrese a la función original
 else:
  user_no = input("Por favor, inicie sesión nuevamente【1:Inicio de sesión de usuario;2:Volver】:")
  if user_no == "1:
  login()
  else:
  print("返回成功")
  main()
 return inner # Cuidado, aquí debe devolver un inner, de lo contrario, el inner superior no se ejecutará, no puede agregar () al final, si los agrega, es como si llamaran esta función
def exit_login(): # 6Salir de la sesión
 global USER_LIST
 if USER_LIST:
 quit_login = input("El usuario actual es【%s】,¿está seguro de que desea salir【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"): # Si quit_login cumple con uno de estos, continúe ejecutando
  WHETHER_LOGIN["is_login"] = "error"
  USER_LIST = [] # Limpia directamente la lista para su estado inicial, no sé si este método es bueno, pero parece que funciona
 elif quit_login in ("N", "n", "No", "nO", "NO"):
  print("Fallo al salir")
 else:
 print("Ningún usuario ha iniciado sesión。。。")
def verifi_passwd():
 with open("user.txt", "r") as old_user: # Abre el archivo user.txt en modo lectura
 lines = old_user.readlines() # Lee todo el archivo de una vez, parece que esta manera no es tan buena
 flag = True
 cout = 3
 while flag:
 cout -= 1
 user_info = input("Por favor, ingrese el nombre de usuario:")
 if user_info == "": # Verifica si se ha ingresado una cadena
  print("No ha ingresado ningún usuario。。。\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 # Si el usuario ingresado es el mismo que el usuario en el archivo de usuarios, escriba toda su información en una nueva lista
  flag = False
 if cout == 0:
  print("Sin embargo, puede que no sepa qué usuarios hay, vaya a verlo de inmediato...")
  manage()
 lines_user = [lines, current_user]
 return lines_user
def user_info_func(username, password_or_power, user_info, lines): # Algunos tipos de entrada: nombre de usuario, contraseña o permisos de usuario, posición de la lista de usuarios que necesita modificar, contenido del archivo que necesita recorrer
 new_user_info = username.copy() # Copiar username a new_user_info
 new_user_info[user_info] = password_or_power # Cambiar la nueva contraseña de usuario a la nueva contraseña ingresada
 username = "|".join(username) # Convertir la lista en contenido que la base de datos puede identificar
 new_user_info = "|".join(new_user_info)
 # print(username, new_user_info)
 with open("user.txt", "w") as new_user: # Abre el archivo user.txt en modo escritura
 for line in lines: # Imprimir todo el archivo devuelto en un ciclo
  if username in line: # Si la información del usuario devuelta está en el archivo devuelto
  line = line.replace(username, new_user_info) # Reemplazar la información del usuario antiguo con la nueva información del usuario
  new_user.write(line) # Escribir en el archivo
 print("Modificación exitosa") # Mensaje de información
@outer # Llamar al decorador
def manage(): # 5Interfaz de gestión de usuarios
 while True:
 print("Interfaz de gestión de usuarios【Bienvenido administrador[%s]】.center(69, "=") % USER_LIST[0])
 print("1:ver todos los usuarios;2、agregar nuevo usuario;3:eliminar usuario;4:cambiar la contraseña de usuario;5:actualizar los permisos de usuario;6:salir de la gestión de usuarios)
 user_input = input("Por favor, ingrese el número de objeto: ")
 if user_input == "1: # Ver información del usuario
  print("\n" + "-" * 80) # Imprimir80个-
  with open("user.txt", "r") as user_info:
  for line in user_info:
   user_list = line.strip("\n").split("|") # Eliminar el \n predeterminado y | para convertirlo en una lista de tipo
   if user_list[3] == "1:
   user_rights = "usuario administrador" # Si el último número del usuario es igual a1representa administrador
   else:
   user_rights = "usuario común" # De lo contrario, es usuario común
   ordinary_user = """Nombre de usuario【%s】\tContraseña【%s】\tCorreo electrónico【%s】\tNivel de usuario【%s】""" \
     % (user_list[0], user_list[1], user_list[2], user_rights) # Hay un salto de línea entre medio
   print(ordinary_user)
  print("-" * 80 + "
")
 elif user_input == "2:
  while True:
  ret = register_function() # 调用注册函数
  print(ret) # Imprimir el valor de retorno
  break # Salir del bucle while actual
 elif user_input == "3:
  flag = "error" # Por defecto, no hay usuarios (hacer un recordatorio)
  del_user = verifi_passwd()[1][0] # Obtenga el segundo valor devuelto por la función
  print("\033[1;31mEl usuario eliminado es: \033[0m", del_user)
  with open("user.txt", "r") as old_user: # Abre el archivo user.txt en modo lectura
  lines = old_user.readlines() # Lee todo el archivo de una vez, parece que esta manera no es tan buena1
  with open("user.txt", "w") as new_user: # Abre el archivo user.txt en modo escritura
  for line in lines: # Itera una línea por línea de la colección leída anteriormente
   if line.startswith(del_user): # Verifique si el usuario ingresado está en la base de datos (con el nombre de usuario ingresado como inicio)
   flag = "success"
   continue
   new_user.write(line)
  if flag == "success": # Indique el éxito
   print("Eliminación exitosa")
  else:
   print("No existe este usuario...") # Si el valor ingresado es un espacio en blanco o algunos usuarios sin nombre, indique que no existe este usuario
   continue
 elif user_input == "4:
  ret = verifi_passwd() # Obtenga el valor de retorno de la función
  lines = ret[0] # Obtenga todo el contenido del archivo devuelto
  username = ret[1] # Obtenga el usuario que necesita cambiar la contraseña devuelto
  new_password = input("Ingrese la nueva contraseña del usuario:")
  if len(new_password) < 5: # Verifique si la longitud de la contraseña ingresada es mayor o igual que5dígito
  error_prompt = input("La longitud de su contraseña ingresada es menor que ")5dígito, ya que eres administrador, ingrese "Y" para continuar: ").strip("") # Elimine los espacios en blanco
  si error_prompt no está en ("y", "Y"): # Si el valor ingresado no es "y" o "Y", salga directamente
   print("Salir...")
   continue
  user_info_func(username, new_password, 1, lines) # Parámetros reales para la función,1En la posición de la lista representa la nueva contraseña del usuario
 elif user_input == "5]: # Esta parte es básicamente similar a la parte superior, realmente se puede escribir una función para llamar
  ret = verifi_passwd()
  lines = ret[0]
  username = ret[1] # Obtener toda la información del usuario ingresado
  new_power = input("Ingrese Y para aumentar los permisos del usuario:")
  if new_power not in ("y", "Y"):
  print("Entrada incorrecta...")
  break
  user_info_func(username, "1, 3, lines) # Parámetros reales:nombre de usuario、permisos(1Representa a un administrador)、ubicación、contenido del archivo en bucle
 elif user_input == "6:
  print("Volver al nivel anterior!!!")
  main()
 else:
  print("Entrada incorrecta")
@user_login # Llamar al decorador
def see(): # 4Consultar la información básica del usuario actual
 if USER_LIST[3] == "1]: # En la base de datos se definió1Representa a un usuario administrador,2Representa a un usuario común
 user_level = "usuario administrador"
 else:
 user_level = "usuario común"
 user_see = """
 ----------------------------------------
 Nombre de usuario: 【%s】
 Contraseña: 【%s】
 Correo electrónico: 【%s】
 Nivel de usuario:【%s】
 ----------------------------------------
 """ % (USER_LIST[0], USER_LIST[1], USER_LIST[2], user_level) # Una salida de formato simple
 print(user_see)
def error_password():
 counter = 3
 while True:
 counter -= 1
 if counter == 0:
  print("Ha ingresado la contraseña incorrectamente demasiadas veces, el programa se devolverá automáticamente...")
  main()
 else:
  print("Las contraseñas ingresadas no coinciden...")
  continue
@user_login # Llamar al decorador
def alter(): # 3Modificar contraseña
 print("El usuario actual es:【%s】" % USER_LIST[0])
 while True:
 old_user_password = input("Por favor, ingrese la contraseña anterior del usuario:")
 if old_user_password == USER_LIST[1]:
  flag = True
  count = 3
  while flag:
  count -= 1
  new_user_password = input("Ingrese la contraseña actual del usuario\033[1;31mContraseña nueva\033[0m:) # Añade color al nuevo password
  new_user_password1 = input("Ingrese nuevamente la contraseña actual del usuario\033[1;31mContraseña nueva\033[0m:)
  if len(new_user_password) >= 5:
   flag = False
  elif count == 0:
   print("La entrada no es válida múltiples veces, el programa se devolverá automáticamente..."}
   main()
  else:
   print("La entrada no es válida, ingrese una mayor de5caracteres de contraseña")
  if new_user_password == new_user_password1: # Determina si las contraseñas introducidas dos veces son iguales
  with open("user.txt", "r") as user_info: # Abre este archivo en modo lectura
   old_user_info = "|".join(USER_LIST) # Obtiene la información antigua
   for line in user_info: # Escribe cada línea obtenida
   if USER_LIST[0] in line: # Encuentra el nombre de usuario actual en el usuario
    USER_LIST[1] = new_user_password1 # Si encuentra, vuelve a agregar la nueva contraseña a nuestra lista de información de usuarios global
    new_user_info = "|".join(USER_LIST) # Convierte el contenido de la tabla de información de usuarios en el formato de la base de datos de usuarios (nueva información de usuarios)
    # print(new_user_info)
    # print(old_user_info)
    break # Salta la actual
  with open("user.txt", "r") as old_user: # Abre el archivo user.txt en modo lectura
   lines = old_user.readlines() # Lee todo el archivo de una vez, parece que esta manera no es tan buena
  with open("user.txt", "w") as new_user: # Abre el archivo user.txt en modo escritura
   for line in lines: # Itera una línea por línea de la colección leída anteriormente
   if old_user_info in line: # Verifica si la información antigua del usuario está en el archivo
    line = line.replace(old_user_info, new_user_info) # Si existe, usa replace para reemplazar
   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:salir de la sesión de inicio de sesión;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的值设置成功
  WHETHER_LOGIN["is_user"] = username # 将我们登录的用户放入字典用,方便后期查询
  # print(USER_LIST)
  return f_user_list
 else:
  print("Fallo de inicio de sesión")
def main():
 while True:
 global COUNT
 COUNT += 1
 print("Sistema de gestión de usuarios".center(80, "*) + "
")
 print("1、inicio de sesión de usuarios;2:registro de usuarios;3:cambiar contraseña;4:información de usuarios;5:gestión de usuarios;6:salir de la sesión de inicio de sesión;7:salir del programa")
 inp = input("Ingrese el número de serie:")
 if inp == "1:
  if USER_LIST:
  if USER_LIST[3] == "1:
   print("El usuario actual es el administrador [%s], no se puede iniciar sesión" % USER_LIST[0])
  else:
   print("El usuario actual es [%s], no se puede iniciar sesión" % 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("¡El programa se ha cerrado!")
 else:
  if COUNT == 3:
  exit("La cantidad de entradas incorrectas es demasiado alta, el programa se cerrará automáticamente...")
  else:
  print("La entrada es incorrecta, ingrese de nuevo...
")
  continue
main()

La explicación de ejemplo del sistema de gestión de usuarios de Python mencionado anteriormente es todo lo que el editor comparte con ustedes, espero que les sea útil y esperamos que todos nos apoyen y alentemos el tutorial.

Declaración: El contenido de este artículo se obtiene de la red, pertenece al propietario original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente y no asume la responsabilidad legal correspondiente. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar y proporcione evidencia. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.)

Te gustará