English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ho studiato Python da tanto tempo, è la prima volta che scrivo così tanto codice (ammetto che sono solo 300+ righe, ci sono molti codici ripetuti, ammetto di essere veramente mediocre), ma è stato anche difficile
Funzione personalizzata + decoratore, ogni modulo scrive una funzione
In molti luoghi si possono utilizzare decoratori (la logica non è a passo con, alcuni luoghi non li ho utilizzati), inclusi decoratori a due livelli (non so), molti luoghi necessitano di ottimizzazione, ci sono molti codici ripetuti
Ecco la mia flowchart, anche se sembra più brutta della scorsa, ci ho passato un'ora, non è stato facile!
Sembra piuttosto brutto (non sono bravo a disegnare, ma farò di meglio la prossima volta!)
File degli utenti:
Il nome del file è: user.txt
1 rappresenta l'utente amministratore
2 rappresenta l'utente normale
smelond|admin|[email protected]|1 admin|admin|[email protected]|2 qwe|qweasd|[email protected]|2
Codice(sentito che questo programma ha molti bug):
#!/usr/bin/env python # _*_ coding:utf-8 _*_ # File_type:programma di gestione degli utenti, versione con decoratori, multifunzionale # Filename:user_manage_program.py # Author:smelond import os os.system("cls") # Pulizia dello schermo in Windows COUNT = 0 # Contatore WHETHER_LOGIN = {"is_login": "error"} # Utilizzato per determinare se c'è un utente connesso USER_LIST = [] # Elenco delle informazioni degli utenti attuali def register_function(): # Funzione di registrazione (tutte le registrazioni chiamano questa funzione) count = 3 # Contatore, ha un ruolo di avviso all'utente for i in range(3): # Ripeti 3 volte print("Registrazione utente【ti rimangono solo 3 tentativi】,ti rimangono【%s】tentativi".center(80, "=") % count) # Mostra l'avviso count -= 1 # Diminuisci di 1 ogni volta username = input(\"Inserisci il nome utente: \") while True: passwd = input(\"Inserisci la password: \") if len(passwd) >= 5: break else: # Se la lunghezza della password è inferiore a 5 cifre, procedi di conseguenza print("Inserisci una password con più di 5 cifre") input_passwd = input("【1:continua inserendo;2:torna alla schermata precedente】") if input_passwd == "1": pass else: main() while True: email = input("Inserisci l'email:") email_count = email.count("@") # Controlla se l'email inserita contiene @ # print(email_count) # Restituisce 1 se c'è un "@" if email_count == 1: break # Se c'è un simbolo @, significa che l'email è stata inserita correttamente, esci dal ciclo corrente else: print("Inserisci un'email corretta") input_email = input("【1:Continua l'inserimento;2:Torna al passo precedente】") if input_email == "1": pass else: main() register_user = [username, passwd, email, "2"] # Metti il nome utente, la password e l'email che hai inserito in una lista, utente normale, quindi aggiungi un 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("Il nome utente è stato registrato") break if register_user[2] == f_user_list[2]: # Verifica se l'email e il nome utente inseriti esistono già print("L'email è stata registrata") break else: # Ora abbiamo superato il filtro sopra, inizia a scrivere le nostre informazioni di registrazione nel database (sembrava ci fosse un bug lì) user_write = "|".join(register_user) # Usa il metodo join per convertire questa lista in una separata da | # open_user = open("user.txt", "a") # Scrivi in appendimento nel file # open_user.write("\n" + user_write) # open_user.close() # Ricorda di chiudere with open("user.txt", "a") as f: f.write("\n" + user_write) # Come sopra, questo metodo non richiede di chiudere il file print("Registrazione riuscita") user_write = """Nome utente:【%s】;Password:【%s】;Email:【%s】""" (register_user[0], register_user[1], register_user[2]) # Messaggio di conferma del registro di successo return user_write # Restituzione messaggio di avviso def outer(func): # Decoratore per gestire l'interfaccia def inner(*args, **kwargs): if WHETHER_LOGIN["is_login"] == "success" e USER_LIST[3] == "1": # Perché aggiungere virgolette, perché negli elenchi sono memorizzati come stringhe, non come interi r = func() # Esegui la funzione passata return r # Restituzione elif WHETHER_LOGIN["is_login"] == "success" e USER_LIST[3] == "2": # Se è un utente normale, avvisa che non ha i permessi sufficienti e torna alla funzione main print(" L'utente corrente è un utente normale [%s],non ha i permessi sufficienti" % USER_LIST[0]) main() else: print(" Non ci sono utenti loggati, prova di nuovo dopo il login...") # Altrimenti non è loggato main() return inner def user_login(func): # Decoratore per verificare se l'utente è loggato def inner(*args, **kwargs): if WHETHER_LOGIN["is_login"] == "success": # Giudica se è loggato r = func() return r # Se è già loggato, torna alla funzione originale else: user_no = input("Prova di nuovo dopo il login [1: login utente; 2: tornare]:") if user_no == "1": login() else: print(\"Ritorno di successo\") main() return inner # Presta attenzione, qui deve essere restituito un inner, altrimenti l'inner sopra non verrà eseguito, non puoi aggiungere (), se lo fai, significa chiamare questa funzione def exit_login(): # 6 Esci dalla login global USER_LIST if USER_LIST: quit_login = input("L'utente corrente è [%s],sei sicuro di voler uscire [Y/N]:" % USER_LIST[0]) # Se quit_login == "Y" o quit_login == "y" o quit_login == "yes": Se quit_login è uno dei seguenti: ("Y", "y", "yes", "yES", "yeS", "yEs", "YES", "Yes", "YEs"), continua l'esecuzione WHETHER_LOGIN["is_login"] = "error" USER_LIST = [] # Svuota direttamente la lista per ripristinarla allo stato iniziale, non so se questo metodo è buono, ma sembra funzionare elif quit_login in ("N", "n", "No", "nO", "NO"): print("Fallimento dell'uscita") else: print("Nessun utente ha effettuato il login...") def verifi_passwd(): with open("user.txt", "r") as old_user: # Apri il file user.txt in lettura lines = old_user.readlines() # Leggi tutto il file in una volta, sembra che questo metodo non sia buono flag = True cout = 3 while flag: cout -= 1 if user_info == \ print("Non hai inserito alcun utente...") manage() for line in lines: user_all_info = line.strip("\n").split("|") if user_info == user_all_info[0]: current_user = user_all_info # Se l'utente inserito è lo stesso dell'utente nel file degli utenti, scrivi tutte le sue informazioni in una nuova lista flag = False if cout == 0: print("Ma forse non sai quali utenti ci sono, corri a controllare ora...") manage() lines_user = [lines, current_user] return lines_user def user_info_func(username, password_or_power, user_info, lines): # Alcuni tipi di input: nome utente, password o permessi, posizione della lista dell'utente da modificare, contenuto del file da iterare new_user_info = username.copy() # Copia username in new_user_info new_user_info[user_info] = password_or_power # Modifica la nuova password dell'utente o i permessi username = \ new_user_info = \ # stampa il nome utente e le nuove informazioni dell'utente with open("user.txt", "w") as new_user: # Apri il file user.txt in scrittura for line in lines: # Stampa l'intero file restituito in un ciclo if username in line: # Se le informazioni utente restituite sono nel file restituito line = line.replace(username, new_user_info) # Sostituire le informazioni utente esistenti con le nuove informazioni utente new_user.write(line) # Scrivere nel file print("Modificato con successo") # Messaggio di avviso @outer # Chiamare il decoratore def manage(): # Interfaccia di gestione utenti while True: print("Interfaccia di gestione utenti【Benvenuto amministratore[%s]】".center(69, "=") % USER_LIST[0]) print("1: Visualizza tutti gli utenti; 2: Aggiungi nuovo utente; 3: Elimina utente; 4: Modifica la password utente; 5: Aggiorna i permessi utente; 6: Esci dalla gestione utenti") user_input = input("Inserisci il numero dell'oggetto: ") if user_input == "1": # Visualizzare le informazioni utente print("\n" + "-" * 80) # Stampare 80 di "-" with open("user.txt", "r") as user_info: for line in user_info: user_list = line.strip("\n").split("|") # Rimuovere il newline predefinito e il "|", convertirli in un tipo elenco if user_list[3] == "1": user_rights = "Utente amministratore" # Se l'ultimo numero dell'utente è uguale a 1, rappresenta l'amministratore else: user_rights = "Utente normale" # Altrimenti utente normale ordinary_user = """Nome utente【%s】\tPassword【%s】\tEmail【%s】\tLivello utente【%s】""" \ %% (user_list[0], user_list[1], user_list[2], user_rights) # C'è un newline predefinito in mezzo print(ordinary_user) print("-" * 80 + "\n") elif user_input == "2": while True: ret = register_function() # Chiamata alla funzione di registrazione print(ret) # Output del valore di ritorno break # Saltare il ciclo while corrente elif user_input == "3": flag = "error" # Predefinito senza utente (funzione di avviso) del_user = verifi_passwd()[1][0] # Ottieni il secondo valore del valore di ritorno della funzione print("\033[1;31mEliminazione utente: \033[0m", del_user) with open("user.txt", "r") as old_user: # Apri il file user.txt in lettura lines = old_user.readlines() # Leggi tutto il file in una volta, sembra che questo metodo non sia il migliore with open("user.txt", "w") as new_user: # Apri il file user.txt in scrittura for line in lines: # Itera riga per riga il testo letto sopra if line.startswith(del_user): # Controlla se l'utente inserito è presente nel database (inizia con il nome dell'utente) flag = "success" continue new_user.write(line) if flag == "success": # Mostra il messaggio di successo print("Eliminazione riuscita") else: print("Questo utente non esiste...") # Se l'input è vuoto o un utente non esistente, viene visualizzato un messaggio di errore continue elif user_input == "4": ret = verifi_passwd() # Ottieni il valore di ritorno della funzione lines = ret[0] # Ottieni il contenuto completo del file username = ret[1] # Ottieni l'utente che deve modificare la password new_password = input("Inserisci la nuova password dell'utente:") if len(new_password) < 5: # Verifica se la lunghezza della password è maggiore o uguale a 5 cifre error_prompt = input("La lunghezza della tua password è inferiore a 5 cifre, poiché sei l'amministratore, inserisci Y per continuare:").strip(" ") # Rimuovi gli spazi if error_prompt not in ("y", "Y"): # Se il valore inserito non è y o Y, esce direttamente print("Uscita...") continue user_info_func(username, new_password, 1, lines) # Passa i parametri alla funzione, 1 rappresenta la posizione nella lista del nuovo password dell'utente elif user_input == "5": # Questa parte è simile alla parte sopra, potrebbe essere scritta come una funzione da chiamare ret = verifi_passwd() lines = ret[0] username = ret[1] # Ottieni tutte le informazioni dell'utente inserito new_power = input("Inserisci Y per aumentare i permessi dell'utente:") if new_power not in ("y", "Y"): print("Errore di input...") break user_info_func(username, "1", 3, lines) # Passare argomenti: nome utente, permessi (1 per amministratore), posizione, contenuto del file di ciclo elif user_input == "6": print("Torna al livello superiore!!!") main() else: print("Inserimento errato") @user_login # Chiamare decoratore def see(): # 4 Cerca informazioni di base dell'utente corrente if USER_LIST[3] == "1": # Definito nel database 1 come utente amministratore, 2 come utente normale user_level = "Utente amministratore" else: user_level = "Utente normale" user_see = """ ---------------------------------------- Nome utente: 【%s】 Password: 【%s】 Email: 【%s】 Livello utente: 【%s】 ---------------------------------------- """ % (USER_LIST[0], USER_LIST[1], USER_LIST[2], user_level) # Output formattato semplice print(user_see) def error_password(): counter = 3 while True: counter -= 1 if counter == 0: print("Hai inserito troppi password errate, il programma si chiude automaticamente...") main() else: print("Le password inserite non corrispondono...") continue @user_login # Chiamare decoratore def alter(): # 3 Modifica password print("Utente corrente: 【%s】" % USER_LIST[0]) while True: old_user_password = input("Inserisci la vecchia password dell'utente corrente: ") if old_user_password == USER_LIST[1]: flag = True count = 3 while flag: count -= 1 new_user_password = input("Inserisci la nuova password dell'utente corrente: ") # Aggiungere colore al testo della nuova password new_user_password1 = input("Riinserisci la nuova password dell'utente corrente: ") segnalare lunghezza(new_user_password) >= 5: flag = False elif count == 0: print(" troppe volte non legali, il programma si ripete automaticamente...") main() else: print("L'input non è legittimo, inserisci una password con più di 5 cifre") if new_user_password == new_user_password1: # Verifica se le password inserite due volte sono le stesse with open("user.txt", "r") as user_info: # Apri questo file in modalità lettura old_user_info = "|".join(USER_LIST) # Ottieni le vecchie informazioni for line in user_info: # Itera ogni riga ricevuta if USER_LIST[0] in line: # Trova il nome utente corrente del login USER_LIST[1] = new_user_password1 # Se è stato trovato, aggiungi nuovamente la nuova password alla nostra lista globale delle informazioni degli utenti new_user_info = "|".join(USER_LIST) # Converti il contenuto della tabella delle informazioni degli utenti con il metodo join nel formato del database degli utenti (nuova informazione dell'utente) # print(new_user_info) # print(old_user_info) break # Uscire dal momento corrente with open("user.txt", "r") as old_user: # Apri il file user.txt in lettura lines = old_user.readlines() # Leggi tutto il file in una volta, sembra che questo metodo non sia buono with open("user.txt", "w") as new_user: # Apri il file user.txt in scrittura for line in lines: # Itera riga per riga il testo letto sopra if old_user_info in line: # Controlla se l'antica informazione dell'utente è nel file line = line.replace(old_user_info, new_user_info) # Se esiste, usa replace per sostituire new_user.write(line) # Continua a scrivere nel file print("Modifica riuscita √") break # Dopo aver completato, uscire else: # Due volte non uguali print("Le password inserite due volte non sono le stesse, il programma si ripete automaticamente...") main() else: # L'utente attuale ha inserito una password errata print("L'utente attuale ha inserito una password errata, il programma si ripete automaticamente...") main() def register(): # 2 Registrazione utente if WHETHER_LOGIN[\"is_login\"] == \"success\": quit_login = input(\"Impossibile registrare l'utente, esce dal login e riprova [1: esce dal login; 2: torna indietro]: \") if quit_login == \"1\": exit_login() # Saltiamo alla funzione di uscita utente elif quit_login == \"2\": print(\"Ritorno di successo\") elif WHETHER_LOGIN[\"is_login\"] == \"error\": ret = register_function() # Chiamata alla funzione di registrazione print(ret) # Stampa il valore di ritorno def login(): # 1 Login utente print(\"Login utente\".center(82, \"=\")) username = input(\"Inserisci il nome utente: \") passwd = input(\"Inserisci la password: \") with open(\"user.txt\", \"r\") as user: for line in user: f_user_list = line.strip(\"\n\").split(\"|\") # Rimuoviamo il ritorno a capo predefinito e |, e lo convertiamo in una lista assegnata a f_admin_list if f_user_list[0] == username and f_user_list[1] == passwd: print(\"Login successo\") global USER_LIST USER_LIST = f_user_list # Mettiamo la riga attuale in lista informazioni utenti WHETHER_LOGIN[\"is_login\"] = \"success\" # Se il login è successo, impostiamo il valore di is_login a success WHETHER_LOGIN[\"is_user\"] = username # Inseriamo l'utente che ci è loggato nel dizionario per facilitare le ricerche future # print(USER_LIST) return f_user_list else: print(\"Login fallito\") def main(): while True: global COUNT COUNT += 1 print(\"Gestione degli utenti\".center(80, \"*\") + \"\n\") print("1, accesso utente; 2: registrazione utente; 3, modifica password; 4, informazioni utente; 5, gestione utente; 6, uscita login; 7, uscita programma") inp = input("Inserisci il numero di sequenza: ") if inp == "1": if USER_LIST: if USER_LIST[3] == "1": print("L'utente corrente è l'amministratore [%s], non puoi continuare a effettuare l'accesso" % USER_LIST[0]) else: print("L'utente corrente è [%s], non puoi continuare a effettuare l'accesso" % 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("Il programma è stato chiuso!!!") else: if COUNT == 3: exit("Il numero di tentativi di input è troppo alto, il programma si è automaticamente chiuso...") else: print("L'input è errato, inserisci nuovamente...") continue main()
Questa è l'intera spiegazione dell'esempio di sistema di gestione degli utenti Python che l'editor ha condiviso con tutti voi, speriamo che possa essere di riferimento per voi e che speriamo che tutti possiate sostenere l'insegnamento di urla.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il diritto d'autore è della proprietà del rispettivo autore, il contenuto è stato contribuito e caricato volontariamente dagli utenti di Internet, il sito web non possiede il diritto di proprietà, non è stato elaborato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del diritto d'autore, è possibile inviare una e-mail a notice#oldtoolbag.com (sostituisci # con @ quando invii l'e-mail) per segnalare il problema e fornire prove pertinenti. Una volta verificata, il sito eliminerà immediatamente i contenuti sospetti di violazione del diritto d'autore.