English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ich habe so lange Python gelernt und das erste Mal so viel Code geschrieben (ich gebe zu, dass ich nur3Über 00 Zeilen, es gibt viel wiederholten Code, ich gebe zu, dass ich wirklich schrottig bin), aber es war auch nicht einfach
Benutzerdefinierte Funktion+Dekoratoren, eine Funktion, die jeder Modul schreibt
An vielen Orten können Dekoratoren verwendet werden (die Logik hält nicht mit, an einigen Orten werden sie nicht verwendet), einschließlich doppelten Dekoratoren (kann nicht), an vielen Orten ist eine Optimierung erforderlich, es gibt zu viel wiederholten Code
Ich werde meine Prozessdiagramme herausnehmen, auch wenn sie schlechter aussehen als das letzte Mal Müll, aber ich habe eine Stunde gemacht, das ist nicht einfach!
Es scheint recht hässlich zu sein (zeigt an, dass ich nicht zeichnen kann, aber ich werde mir das nächste Mal sicher anstrengen)
Benutzerdatei:
Der Dateiname lautet: user.txt
1Der Vertreter des Administrators
2代表普通用户
smelond|admin|[email protected]|1 admin|admin|[email protected]|2 qwe|qweasd|[email protected]|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("Bitte geben Sie den Benutzernamen ein:") while True: passwd = input("Bitte geben Sie das Passwort ein:") if len(passwd) >= 5: break else: # 如果输入的密码小于5位数,向下操作 print("请输入大于5Passwörter mit einer bestimmten Anzahl von Zeichen) 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"] # Unser Benutzername, Passwort und E-Mail werden in einer Liste gespeichert, Normalbenutzer, daher wurde ein2 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("Der Benutzername wurde bereits registriert") break if register_user[2] == f_user_list[2]: # Beurteilen Sie, ob die von uns eingegebenen E-Mail-Adresse und Benutzername bereits existieren print("Die E-Mail wurde bereits registriert") break else: # Als Nächstes beginnen wir damit, unsere Registrierungsinformationen in die Datenbank zu schreiben (es fühlt sich so an, als gäbe es oben einen Bug) user_write = "|".join(register_user) # Verwenden Sie die join-Methode, um diese Liste in ein durch | getrenntes Format zu konvertieren # open_user = open("user.txt", "a") # a schreibt in die Datei als Anhänge # open_user.write("\n" + user_write) # open_user.close() # Denken Sie daran, zu schließen with open("user.txt", "a") as f: f.write("\n" + user_write) # Auf die gleiche Weise wie oben, dies erfordert keine Schließung der Datei print("Registrierung erfolgreich") user_write = """Benutzername:【%s】; Passwort:【%s】; E-Mail:【%s】""" \ % (register_user[0], register_user[1], register_user[2]) # Hinweis auf erfolgreiche Registrierung return user_write # Rückgabe der Hinweismeldung def outer(func): # Dekoration, um die Schnittstelle zu verwalten def inner(*args, **kwargs): if WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "1: # Warum werden Anführungszeichen verwendet? Weil in der Liste Strings gespeichert sind, nicht Ganzzahlen r = func() # Ausführung der übergebenen Funktion return r # Rückgabe elif WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "2: # Wenn der Benutzer ein normaler Benutzer ist, wird darauf hingewiesen, dass keine ausreichenden Berechtigungen vorhanden sind, und die Funktion main wird zurückgegeben print("\nDer aktuelle Benutzer ist ein normaler Benutzer 【%s】,hat nicht genügend Berechtigungen" % USER_LIST[0]) main() else: print("\nDerzeit ist kein Benutzer angemeldet, bitte melden Sie sich an und versuchen Sie es erneut...") # Andernfalls ist der Benutzer nicht angemeldet main() return inner def user_login(func): # Überprüfungsdekoration, ob der Benutzer angemeldet ist def inner(*args, **kwargs): if WHETHER_LOGIN["is_login"] == "success": # Überprüfen Sie, ob angemeldet r = func() return r # Wenn bereits angemeldet, zurück zum ursprünglichen Funktion else: user_no = input("Bitte melden Sie sich an, um erneut zu versuchen【1: Benutzeranmeldung;2: zurückschicken】:") if user_no == "1: login() else: print("Rückgabe erfolgreich") main() return inner # Bitte beachten Sie, dass hier inner zurückgegeben werden muss, sonst wird upper inner nicht ausgeführt. Es sollte keine () am Ende hinzugefügt werden, da dies sonst die Funktion aufruft def exit_login(): # 6Abmeldung global USER_LIST if USER_LIST: quit_login = input("Der aktuelle Benutzer ist【%s】,sind Sie sicher, dass Sie abmelden möchten【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"): # Wenn quit_login einem der folgenden Werte entspricht, wird fortgesetzt WHETHER_LOGIN["is_login"] = "error" USER_LIST = [] # Die Liste wird direkt auf den初始状态清除,weiß nicht, ob diese Methode gut ist, aber es scheint zu funktionieren elif quit_login in ("N", "n", "No", "nO", "NO"): print("Abmeldung fehlgeschlagen") else: print("Kein Benutzer hat sich angemeldet。。。") def verifi_passwd(): with open("user.txt", "r") as old_user: # Öffnen Sie die Datei "user.txt" im Lesemodus lines = old_user.readlines() # Lesen Sie den gesamten Inhalt der Datei auf einmal, was nicht gut ist flag = True cout = 3 while flag: cout -= 1 user_info = input("Bitte geben Sie den Benutzernamen ein:") if user_info == "": # Überprüfen Sie, ob ein String eingegeben wurde print("Du hast keinen Benutzer eingegeben。。。\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 # Wenn der eingegebene Benutzer mit dem Benutzer im Dateiinhalt übereinstimmt, wird seine gesamte Information in eine neue Liste geschrieben 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: # Öffnen Sie die Datei "user.txt" im Schreibmodus 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: # Benutzerinformationen anzeigen print("\n" + "-" * 80) # Druck80个- with open("user.txt", "r") as user_info: for line in user_info: user_list = line.strip("\n").split("|") # Entferne den Standard \n und | und wandele ihn in eine Liste um if user_list[3] == "1: user_rights = "Adminbenutzer" # Wenn die letzte Zahl des Benutzers gleich ist1,was einen Administrator bedeutet else: user_rights = "Normalbenutzer" # Andernfalls ist es ein Normalbenutzer ordinary_user = """Benutzername【%s】\tPasswort【%s】\tE-Mail【%s】\tBenutzerstufe【%s】""" \ %% (user_list[0], user_list[1], user_list[2], user_rights) # Zwischen ihnen ist ein Zeilenumbruch print(ordinary_user) print("-" * 80 + \n") elif user_input == "2: while True: ret = register_function() # Register-Funktion aufrufen print(ret) # Zeige den Rückgabewert an break # Verlasse den aktuellen While-Zyklus elif user_input == "3: flag = "error" # Standard ist, dass es keinen Benutzer gibt (zur Anzeige einer Meldung) del_user = verifi_passwd()[1][0] # Hole den zweiten Wert der Rückgabe der Funktion print("\033[1;31mDer zu löschende Benutzer ist:\033[0m", del_user) with open("user.txt", "r") as old_user: # Öffnen Sie die Datei "user.txt" im Lesemodus lines = old_user.readlines() # Lesen Sie den gesamten Inhalt der Datei auf einmal, was nicht gut ist1 with open("user.txt", "w") as new_user: # Öffnen Sie die Datei "user.txt" im Schreibmodus for line in lines: # Iterieren Sie jede Zeile der gelesenen Sammlung if line.startswith(del_user): # Überprüfe, ob der Benutzer im Datenbank-System existiert (mit dem Namen des eingegebenen Benutzers beginnend) flag = "success" continue new_user.write(line) if flag == "success": # Zeige Erfolg an print("Löschen erfolgreich") else: print("Dieser Benutzer existiert nicht...") # Wenn der Eingabe leer ist oder einige Benutzer ohne Benutzername, wird "Dieser Benutzer existiert nicht..." angezeigt continue elif user_input == "4: ret = verifi_passwd() # Hole den Rückgabewert der Funktion lines = ret[0] # Hole den gesamten Inhalt der zurückgegebenen Datei username = ret[1] # Hole den zurückgegebenen Benutzer, der das Passwort ändern muss new_password = input("Gib das neue Passwort des Benutzers ein:") if len(new_password) < 5: # Überprüfe, ob die Länge des Passworts größer oder gleich ist5Ziffern error_prompt = input("Die Länge deines Passworts ist kleiner als ")5Ziffern, da du ein Administrator bist, gib Y ein, um fortzufahren: ").strip("") # Entferne die Leerzeichen Wenn error_prompt nicht in ("y", "Y") enthalten ist: # Wenn der eingegebene Wert nicht "y" oder "Y" ist, wird direkt beendet 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("Bitte geben Sie das aktuelle Benutzerpasswort ein\033[1;31mNeues Passwort\033[0m:") # Fügen Sie dem neuen Passwort eine Farbe hinzu new_user_password1 = input("Wiederholung der Eingabe des aktuellen Benutzers\033[1;31mNeues Passwort\033[0m:") if len(new_user_password) >= 5: flag = False elif count == 0: print("Mehrfach ungültige Eingabe, das Programm kehrt automatisch zurück... main() else: print("Ungültige Eingabe, geben Sie bitte ein Passwort mit mehr als5Passwörter mit einer bestimmten Anzahl von Zeichen) if new_user_password == new_user_password1: # Vergleichen Sie die Passwörter, die zweimal eingegeben wurden with open("user.txt", "r") as user_info: # Öffnen Sie diese Datei im Lesemodus old_user_info = "|".join(USER_LIST) # Erhalten Sie alte Informationen for line in user_info: # Schreiben Sie jede Zeile der erhaltenen Informationen aus if USER_LIST[0] in line: # Finden Sie den aktuellen angemeldeten Benutzernamen USER_LIST[1] = new_user_password1 # Wenn gefunden, fügen Sie das neue Passwort erneut in unsere globale Benutzerinformationenliste hinzu new_user_info = "|".join(USER_LIST) # Konvertieren Sie den Inhalt der Benutzerinformationsliste in das Format der Benutzerdatenbank (neue Benutzerinformationen) # print(new_user_info) # print(old_user_info) break # Verlassen Sie den aktuellen Durchlauf with open("user.txt", "r") as old_user: # Öffnen Sie die Datei "user.txt" im Lesemodus lines = old_user.readlines() # Lesen Sie den gesamten Inhalt der Datei auf einmal, was nicht gut ist with open("user.txt", "w") as new_user: # Öffnen Sie die Datei "user.txt" im Schreibmodus for line in lines: # Iterieren Sie jede Zeile der gelesenen Sammlung if old_user_info in line: # Überprüfen Sie, ob alte Benutzerinformationen im Datei enthalten sind line = line.replace(old_user_info, new_user_info) # Wenn vorhanden, verwenden Sie replace zum Ersetzen new_user.write(line) # Schreiben Sie dann in die Datei print("Änderung erfolgreich√") break # Nach Abschluss des Abbruchs else: # Die beiden sind unterschiedlich print("Die beiden Passwörter sind unterschiedlich, das Programm kehrt automatisch zurück...") main() else: # Das Passwort des aktuellen Benutzers wurde falsch eingegeben print("Das Passwort des aktuellen Benutzers wurde falsch eingegeben, das Programm kehrt automatisch zurück...") main() def register(): # 2Benutzerregistrierung if WHETHER_LOGIN["is_login"] == "success": quit_login = input("Kann Benutzer nicht registrieren, bitte melden Sie sich ab und versuchen Sie es erneut【1: Exit login;2:Zurück zum vorherigen Schritt】:") if quit_login == "1: exit_login() # Zum Ausloggen der Benutzerfunktion springen elif quit_login == "2: print("Rückgabe erfolgreich") elif WHETHER_LOGIN["is_login"] == "error": ret = register_function() # Register-Funktion aufrufen print(ret) # Die Rückgabewerte ausgeben def login(): # 1Benutzerlogin print("Benutzerlogin".center(82, "=")) username = input("Bitte geben Sie den Benutzernamen ein:") passwd = input("Bitte geben Sie das Passwort ein:") with open("user.txt", "r") as user: for line in user: f_user_list = line.strip("\n").split("|") # Entfernen Sie die Standard-Zeilenenden und "|", und fügen Sie es als Liste zu f_admin_list hinzu if f_user_list[0] == username and f_user_list[1] == passwd: print("Login erfolgreich") global USER_LIST USER_LIST = f_user_list # Die aktuelle Zeile in die Benutzerinformationsliste einfügen WHETHER_LOGIN["is_login"] = "success" # Wenn der Login erfolgreich ist, wird der Wert von is_login auf "success" gesetzt WHETHER_LOGIN["is_user"] = username # Unser angemeldeter Benutzer in den Dictionary einfügen, um spätere Abfragen zu erleichtern # 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 the 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 errors too many times, program automatically exits...") 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 shared by the editor. I hope it can provide a reference for everyone and also hope everyone will support and cheer for the tutorial.
Statement: The content of this article is from the Internet, 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 manually edited, and does not assume any relevant legal liability. If you find any content suspected of copyright infringement, please send an email to: notice#oldtoolbag.com (Please replace # with @ when sending an email to report abuse, and provide relevant evidence. Once verified, this site will immediately delete the infringing content.)