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

Exemple de système de gestion des utilisateurs Python

J'ai appris Python depuis longtemps, c'est la première fois que j'écris un code aussi long (je reconnais que je n'ai que3Plus de 00 lignes, il y a beaucoup de code répété, je reconnais que je suis vraiment mauvais, mais c'est aussi pas facile

Fonction personnalisée+Décorateur, une fonction écrite pour chaque module

Beaucoup de lieux peuvent utiliser des décorateurs (la logique ne suit pas, certains endroits ne sont pas utilisés), y compris les décorateurs doubles (je ne sais pas), beaucoup de lieux nécessitent une optimisation, trop de code répété

Je vais quand même sortir mon diagramme de flux, même si il semble pire que la fois dernière, mais j'ai quand même passé une heure, ce n'est pas facile !

Ça semble assez laid (je ne sais pas dessiner, mais je vais certainement m'efforcer la prochaine fois)

Fichier utilisateur :

Le nom du fichier est : user.txt

1représente l'utilisateur administrateur

2代表普通用户

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

code (il semble que ce programme ait encore beaucoup de bugs):

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Type de fichier:programme de gestion d'utilisateur, version décorée, multifonctionnelle
# Nom de fichier:user_manage_program.py
# Auteur:smelond
import os
os.system("cls") # effacer l'écran dans windows
COUNT = 0 # compteur
WHETHER_LOGIN = {"is_login": "error"} # utilisé pour déterminer si un utilisateur est connecté
USER_LIST = [] # liste de stockage des informations des utilisateurs actuels
def register_function(): # fonction d'enregistrement (tous les enregistrements appellent cette fonction)
 count = 3 # compteur, joue un rôle d'indication à l'utilisateur
 for i in range(3): # boucle3fois
 print("Enregistrement utilisateur【Vous n'avez que3fois】, vous avez encore 【%s】fois d'opportunité".center(8(0, "=") % count) # afficher l'indication
 count -= 1 # réduire à chaque fois1
 username = input("请输入用户名:")
 while True:
  passwd = input("请输入密码:")
  si len(passwd) >= 5:
  break
  sinon: # Si le mot de passe saisi est inférieur à5, chiffres, opération vers le bas
  print("Veuillez saisir un mot de passe supérieur à5de caractères de mot de passe)
  input_passwd = input("【1:continuer à saisir;2:retourner à l'étape précédente】)
  si input_passwd == "1:
   pass
  else:
   main()
 while True:
  email = input("Veuillez saisir une adresse e-mail :")
  email_count = email.count("@") # vérifier si l'adresse e-mail saisie contient @,
  # print(email_count) # retourner1représente qu'il y a un @
  si email_count == 1:
  break # Si il y a un symbole @, cela signifie que l'adresse e-mail saisie est correcte, sortir du cycle actuel
  else:
  print("Veuillez saisir une adresse e-mail correcte")
  input_email = input("【1:continuer à saisir;2:retourner à l'étape précédente】)
  si input_email == "1:
   pass
  else:
   main()
 register_user = [username, passwd, email, "2"] # Mettre notre nom d'utilisateur, mot de passe et adresse e-mail dans une liste, utilisateur ordinaire, donc ajouter un2
 with open("user.txt", "r") as user:
  for line in user:
  f_user_list = line.strip("\n").split("|")
  si register_user[0] == f_user_list[0]:
   print("Le nom d'utilisateur est déjà enregistré")
   break
  if register_user[2] == f_user_list[2]: # Juger si l'email et le nom d'utilisateur que nous avons entrés existent déjà
   print("L'email est déjà enregistré")
   break
  else: # Après avoir passé le filtre ci-dessus, commencer à écrire nos informations d'enregistrement dans la base de données (j'ai l'impression qu'il y a un bug là-bas)
  user_write = "|".join(register_user) # Utiliser la méthode join pour convertir cette liste en une liste séparée par |
  # open_user = open("user.txt", "a") # a pour écrire en mode append
  # open_user.write("\n" + user_write)
  # open_user.close() # N'oubliez pas de fermer
  with open("user.txt", "a") as f:
   f.write("\n" + user_write) # Comme la méthode mentionnée ci-dessus, cette méthode n'a pas besoin de fermer le fichier
  print("Enregistrement réussi")
  user_write = """Nom d'utilisateur:【%s】;Mot de passe:【%s】;Email:【%s】""" \
    % (register_user[0], register_user[1], register_user[2]) # Message d'information de l'enregistrement réussi
  return user_write # Retourner le message d'information
def outer(func): # Décorateur, utilisé pour gérer les interfaces
 def inner(*args, **kwargs):
 if WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "1: # Pourquoi ajouter des guillemets ? Parce que dans la liste, il s'agit de chaînes de caractères, pas de nombres entiers
  r = func() # Exécuter la fonction passée en paramètre
  return r # Retourner
 elif WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "2: # Si c'est un utilisateur ordinaire, indiquer qu'il n'a pas de permissions suffisantes et retourner à la fonction main
  print("\nL'utilisateur actuel est un utilisateur ordinaire【%s】,n'a pas de permissions suffisantes" % USER_LIST[0])
  main()
 else:
  print("\nAucun utilisateur connecté actuellement, veuillez vous connecter à nouveau avant de réessayer...") # Sinon, il n'est pas connecté
  main()
 return inner
def user_login(func): # Décorateur pour vérifier si l'utilisateur est connecté
 def inner(*args, **kwargs):
 if WHETHER_LOGIN["is_login"] == "success": # Vérifiez si vous êtes connecté
  r = func()
  return r # Si vous êtes déjà connecté, retournez à la fonction originale
 else:
  user_no = input("Veuillez vous connecter à nouveau avant de réessayer【1:connexion de l'utilisateur;2:retour à】:")
  if user_no == "1:
  login()
  else:
  print("返回成功")
  main()
 return inner # Attention, il faut absolument retourner un inner, sinon inner au-dessus ne sera pas exécuté, ne pas ajouter () à la fin, si vous l'ajoutez, cela équivaut à appeler cette fonction
def exit_login(): # 6Déconnexion
 global USER_LIST
 if USER_LIST:
 quit_login = input("L'utilisateur actuel est [%s],êtes-vous sûr de vouloir vous déconnecter [Y/N] : "%s" % 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 correspond à l'un de ceux-ci, continuez l'exécution
  WHETHER_LOGIN["is_login"] = "error"
  USER_LIST = [] # Effacez directement la liste pour la remettre à son état initial, je ne sais pas si cette méthode est bonne, mais elle semble fonctionner
 elif quit_login in ("N", "n", "No", "nO", "NO"):
  print("Échec de la sortie")
 else:
 print("Aucun utilisateur connecté....")
def verifi_passwd():
 with open("user.txt", "r") as old_user:
 lines = old_user.readlines() # Lisez tout le fichier en une fois, cela ne semble pas être une bonne méthode
 flag = True
 cout = 3
 while flag:
 cout -= 1
 user_info = input("Veuillez saisir un nom d'utilisateur : ")
 if user_info == "": # Vérifiez si une chaîne a été saisie
  print("Vous n'avez pas saisi d'utilisateur....\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 l'utilisateur entré est le même que celui dans le fichier utilisateur, écrivez toutes ses informations dans une nouvelle liste
  flag = False
 if cout == 0:
  print("Cependant, vous ne savez peut-être pas quels utilisateurs il y a, allez-y voir de toute urgence....")
  manage()
 lines_user = [lines, current_user]
 return lines_user
def user_info_func(username, password_or_power, user_info, lines): # Quelques types de paramètres transmis : nom d'utilisateur, mot de passe ou droits d'accès, emplacement de la liste de l'utilisateur à modifier, contenu du fichier à boucler
 new_user_info = username.copy() # Copiez username dans new_user_info
 new_user_info[user_info] = password_or_power # Modifiez le nouveau mot de passe de l'utilisateur ou les droits d'accès
 username = "|".join(username) # Convertir la liste en contenu reconnu par la base de données
 new_user_info = "|".join(new_user_info)
 # print(username, new_user_info)
 with open("user.txt", "w") as new_user:
 for line in lines: # Afficher le contenu complet du fichier en boucle
  if username in line: # Si les informations de l'utilisateur retournées sont dans le fichier retourné
  line = line.replace(username, new_user_info) # Remplacez les anciennes informations de l'utilisateur par les nouvelles informations de l'utilisateur
  new_user.write(line) # Écrire dans le fichier
 print("Modification réussie") # Message d'information
@outer # Appel du décorateur
def manage(): # 5Interface de gestion des utilisateurs
 while True:
 print("Interface de gestion des utilisateurs【Bienvenue administrateur[%s]】".center(69, "=") % USER_LIST[0])
 print("1:查看所有用户;2、添加新用户;3:删除用户;4:修改用户密码;5:升级用户权限;6:退出用户管理
 user_input = input("Veuillez saisir le numéro d'objet : ")
 if user_input == "1: # Voir les informations de l'utilisateur
  print("\n" + "-" * 80) # Afficher80个-
  with open("user.txt", "r") as user_info:
  pour line in user_info:
   user_list = line.strip("\n").split("|") # Supprime le retour chariot par défaut et le "|", le convertit en type de liste
   si user_list[3] == "1:
   user_rights = "Utilisateur administrateur" # Si le dernier nombre de l'utilisateur est égal à1représente l'administrateur
   else:
   user_rights = "Utilisateur ordinaire" # Sinon, c'est un utilisateur ordinaire
   ordinary_user = """Nom d'utilisateur【%s】\tMot de passe【%s】\tEmail【%s】\tNiveau d'utilisateur【%s】""" \
     % (user_list[0], user_list[1], user_list[2], user_rights) # Il y a généralement un retour chariot entre les utilisateurs
   print(ordinary_user)
  print("-" * 80 + \n")
 elif user_input == "2:
  while True:
  ret = register_function() # Appel de la fonction d'enregistrement
  print(ret) # Affiche la valeur de retour
  break # Sort de la boucle while actuelle
 elif user_input == "3:
  flag = "error" # Par défaut, il n'y a pas d'utilisateur (pour faire une提示作用)
  del_user = verifi_passwd()[1][0] # Obtient la deuxième valeur retournée par la fonction
  print("\033[1;31mL'utilisateur à supprimer est : \033[0m", del_user)
  with open("user.txt", "r") as old_user:
  lines = old_user.readlines() # Lisez tout le fichier en une fois, cela ne semble pas être une bonne méthode1
  with open("user.txt", "w") as new_user:
  for line in lines: # Parcourez ligne par ligne le texte lu précédemment
   si line.startswith(del_user): # Vérifie si l'utilisateur entré est dans la base de données (commence par le nom d'utilisateur entré)
   flag = "success"
   continue
   new_user.write(line)
  si flag == "success": # Indique le succès
   print("Suppression réussie")
  else:
   print("Il n'y a pas cet utilisateur...") # Si l'entrée est un espace ou des utilisateurs inexistants, indique qu'il n'y a pas cet utilisateur
   continue
 elif user_input == "4:
  ret = verifi_passwd() # Obtient la valeur de retour de la fonction
  lines = ret[0] # Obtient le contenu complet du fichier retourné
  username = ret[1] # Obtient les utilisateurs qui doivent modifier leur mot de passe
  new_password = input("Entrez le nouveau mot de passe de l'utilisateur :")
  si len(new_password) < 5: # Vérifie si la longueur du mot de passe entré est supérieure ou égale à5compte des chiffres
  error_prompt = input("La longueur de votre mot de passe entré est inférieure à ")5compte des chiffres, puisqu'il s'agit de vous, administrateur, entrez "Y" pour continuer: ").strip("") # Supprime les espaces
  si error_prompt n'est pas dans ("y", "Y"): # Si la valeur entrée n'est pas "y" ou "Y", le programme se termine directement
   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("Entrez le mot de passe actuel de l'utilisateur\033[1;31m nouveau mot de passe\033[0m:) # Ajoutez une couleur au nouveau mot de passe
  new_user_password1 = input("Entrer à nouveau le mot de passe actuel de l'utilisateur\033[1;31m nouveau mot de passe\033[0m:)
  if len(new_user_password) >= 5:
   flag = False
  elif count == 0:
   print("Entrée illégale multiple, le programme revient automatiquement...
   main()
  else:
   print("L'entrée n'est pas légitime, veuillez entrer un mot de passe supérieur à5de caractères de mot de passe)
  if new_user_password == new_user_password1: # Jugez si les mots de passe entrés deux fois sont égaux
  with open("user.txt", "r") as user_info: # Ouvrez ce fichier en mode lecture
   old_user_info = "|".join(USER_LIST) # Obtenez les informations anciennes
   for line in user_info: # Affichez chaque ligne obtenue
   if USER_LIST[0] in line: # Trouvez le nom d'utilisateur du utilisateur connecté en ce moment
    USER_LIST[1] = new_user_password1 # Si trouvé, ajoutez à nouveau le nouveau mot de passe à notre liste d'information utilisateur globale
    new_user_info = "|".join(USER_LIST) # Convertissez le contenu de la liste USER_LIST en format de base de données utilisateur (nouvelle information utilisateur)
    # print(new_user_info)
    # print(old_user_info)
    break # Sortir de la boucle actuelle
  with open("user.txt", "r") as old_user:
   lines = old_user.readlines() # Lisez tout le fichier en une fois, cela ne semble pas être une bonne méthode
  with open("user.txt", "w") as new_user:
   for line in lines: # Parcourez ligne par ligne le texte lu précédemment
   if old_user_info in line: # Vérifiez si l'ancienne information utilisateur est présente dans le fichier
    line = line.replace(old_user_info, new_user_info) # Si existant, utilisez replace pour remplacer
   new_user.write(line) # Continuez à écrire dans le fichier
  print("修改成功√")
  break # Sortir après la fin
  else: # 两次不相等
  print("两次输入的密码不相同,程序自动返回。。。")
  main()
 else: # 当前用户密码输入错误
  print("当前用户密码输入错误,程序自动返回。。。")
  main()
def register(): # 2用户注册
 if WHETHER_LOGIN["is_login"] == "success":
 quit_login = input("无法注册用户,请退出登录后重试【1: Exit login;2:返回上一步】:")
 if quit_login == "1:
  exit_login() # Passer à la fonction de sortie utilisateur
 elif quit_login == "2:
  print("返回成功")
 elif WHETHER_LOGIN["is_login"] == "error":
 ret = register_function() # Appel de la fonction d'enregistrement
 print(ret) # Affichez la valeur de retour
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("|") # Supprimez les retours chariot par défaut et |, puis convertissez-le en liste et affectez-le à f_admin_list
  if f_user_list[0] == username and f_user_list[1] == passwd:
  print("登录成功")
  global USER_LIST
  USER_LIST = f_user_list # Placez la ligne actuelle obtenue dans la liste des informations utilisateur
  WHETHER_LOGIN["is_login"] = "success" # Configurez la valeur de is_login à success une fois connecté
  WHETHER_LOGIN["is_user"] = username # Placer l'utilisateur connecté dans le dictionnaire pour une recherche ultérieure
  # print(USER_LIST)
  return f_user_list
 else:
  print("Login failed")
def main():
 while True:
 global COUNT
 COUNT += 1
 print("User Management System".center(80, "*) + \n")
 print("1, User login;2: User registration;3: Change password;4: User information;5: User management;6: Exit login;7: Exit program)
 inp = input("Please enter the number: ")
 if inp == "1:
  if USER_LIST:
  if USER_LIST[3] == "1:
   print("The current user is an administrator: [%s], cannot continue to log in" % USER_LIST[0])
  else:
   print("The current user is [%s], cannot continue to log in" % 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("Program has exited!!!")
 else:
  if COUNT == 3:
  exit("Input error times too many, program will exit automatically...")
  else:
  print("Input error, please re-enter...\n")
  continue
main()

This is the full content of the example explanation of the Python user management system that the editor has shared with everyone. I hope it can be a reference for everyone, and I also hope that everyone will support the Shouting Tutorial more.

Declaration: The content of this article is from the Internet, and the copyright belongs to the original author. The content is contributed and uploaded by Internet users spontaneously. This website does not own the copyright, has not been edited by humans, and does not assume relevant legal liabilities. If you find any content suspected of copyright infringement, please send an email to: notice#oldtoolbag.com (when sending an email, please replace # with @ to report abuse, and provide relevant evidence. Once verified, this site will immediately delete the infringing content.)

Vous pourriez aussi aimer