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

Pythonユーザー管理システムの実例解説

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(メール送信時は、#を@に変更して報告してください。関連する証拠を提供してください。一旦確認が取れたら、このサイトは侵害される内容をすぐに削除します。)

おすすめ