English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Pythonを学んでこのぐらいで、初めてこれほどの量のコードを書きました(認めますが、私が書いたコードは少なくありません)300行以上、重複のコードも多いです、私は実際にゴミだと思っています(認めますが、私が書いたコードは少なくありません)、でも本当に大変でした
カスタム関数+デコレータ、各モジュールに書かれた関数
多くの場所でデコレータを使用できます(論理が追いついていないため、一部の場所では使用されていません)、二重デコレータ(使い方を知らない)も多くの場所で必要で、多くの場所を最適化する必要があります、重複のコードが多いです
私は私のフローチャートを出してしまいます、前回のゴミよりも見た目が悪いかもしれませんが、私は一時間かけて作成しました、簡単ではありませんでした!
ちょっと不気味な感じ(描かないと言う意味ですが、次は必ず努力します)
ユーザーファイル:
ファイル名は:user.txt
1代表管理员用户
2通常ユーザーを表す
smelond|admin|[email protected]|1 admin|admin|[email protected]|2 qwe|qweasd|[email protected]|2
コード(このプログラムにはまだ多くのバグがある感じです):
#!/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(): # 注册函数 (所有注册都来调用这个函数) カウント = 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: # 上記のフィルタリングを通過した後、登録情報をデータベースに書き込む(上記にバグがあるような気がします) user_write = "|".join(register_user) # joinメソッドを使用してリストを|で区切って変換 # open_user = open("user.txt", "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() # ファイル全体を一度に読み込む、この方法は良くないと感じる フラグ = True cout = 3 while フラグ: 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件- ファイル「user.txt」を「r」モードでオープンします。 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;31print("删除用户为:\0"33[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(): カウンタ = 3 while True: カウンタ -= 1 if カウンタ == 0: print("入力エラーの回数が多すぎます、プログラムが自動的に戻ります。。。") main() else: print("入力したパスワードが異なります。。。") continue @user_login # デコレータを呼び出す def alter(): # 3パスワードを変更 print("現在のユーザーは:【%s】" % USER_LIST[0]) while True: old_user_password = input("現在のユーザーの旧パスワードを入力してください:") if オld_user_password == USER_LIST[1]: フラグ = True カウント = 3 while フラグ: 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ユーザー管理システムの例解が編集者が皆さんに提供した全ての内容です。皆さんに参考になれば幸いですし、呐喊チュートリアルを多くのサポートをお願いします。
声明:この記事の内容はインターネットから取得され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしました。このサイトは権利を所有しておらず、編集も行っていません。著作権に関する問題がある場合は、notice#wにメールを送ってください。3codebox.com(メール送信時は、#を@に変更して報告してください。関連する証拠を提供してください。一旦確認が取れたら、このサイトは侵害される内容をすぐに削除します。)