欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python用戶管理系統(tǒng)的實例講解

 更新時間:2017年12月23日 08:50:10   作者:smelond  
下面小編就為大家分享一篇python用戶管理系統(tǒng)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

學(xué)Python這么久了,第一次寫一個這么多的代碼(我承認(rèn)只有300多行,重復(fù)的代碼挺多的,我承認(rèn)我確實垃圾),但是也挺不容易的

自定義函數(shù)+裝飾器,每一個模塊寫的一個函數(shù)

很多地方能用裝飾器(邏輯跟不上,有的地方?jīng)]用),包括雙層裝飾器(不會),很多地方需要優(yōu)化,重復(fù)代碼太多

我還是把我的流程圖拿出來吧,雖然看著比上次的垃圾,但是我也做了一個小時,不容易!

好像是挺丑的(表示不會畫,但我下次一定努力)

用戶文件:

文件名為:user.txt

1代表管理員用戶

2代表普通用戶

smelond|admin|xx@qq.com|1
admin|admin|qweqwe@qq.com|2
qwe|qweasd|qwe@qq.com|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 # 計數(shù)器
WHETHER_LOGIN = {"is_login": "error"} # 用于判斷是否有用戶登錄
USER_LIST = [] # 當(dāng)前用戶信息存放的列表

def register_function(): # 注冊函數(shù) (所有注冊都來調(diào)用這個函數(shù))
 count = 3 # 計數(shù)器,做到了一個提示用戶的作用
 for i in range(3): # 循環(huán)3次
 print("用戶注冊【你只有3次機(jī)會】,你還有【%s】次機(jī)會".center(80, "=") % count) # 輸出提示
 count -= 1 # 每次減1
 username = input("請輸入用戶名:")
 while True:
  passwd = input("請輸入密碼:")
  if len(passwd) >= 5:
  break
  else: # 如果輸入的密碼小于5,位數(shù),向下操作
  print("請輸入大于5位數(shù)的密碼")
  input_passwd = input("【1:繼續(xù)輸入;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 # 如果有一個@符號,代表郵箱輸入正確,跳出當(dāng)前循環(huán)
  else:
  print("請輸入正確的郵箱")
  input_email = input("【1:繼續(xù)輸入;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: # 接下來是通過了上面的篩選,開始把我們的注冊信息寫進(jìn)數(shù)據(jù)庫(總感覺上面有bug)
  user_write = "|".join(register_user) # 用join方法將這個列表轉(zhuǎn)換為以|分隔
  # open_user = open("user.txt", "a") # a 以追加方式寫入文件
  # open_user.write("\n" + user_write)
  # open_user.close() # 記得關(guān)閉
  with open("user.txt", "a") as f:
   f.write("\n" + user_write) # 跟上面一樣的方法,這種不用關(guān)閉文件
  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() # 執(zhí)行我們傳入的函數(shù)
  return r # 返回
 elif WHETHER_LOGIN["is_login"] == "success" and USER_LIST[3] == "2": # 如果為普通用戶,提示沒有足夠權(quán)限并且返回到main函數(shù)
  print("\n當(dāng)前用戶為普通用戶【%s】,沒有足夠的權(quán)限" % USER_LIST[0])
  main()
 else:
  print("\n當(dāng)前沒有用戶登錄,請登錄后再試。。。") # 否者就是沒有登錄了
  main()
 return inner

def user_login(func): # 檢測用戶是否登錄的裝飾器
 def inner(*args, **kwargs):
 if WHETHER_LOGIN["is_login"] == "success": # 判斷是否登錄
  r = func()
  return r # 如果已經(jīng)登錄,返回到原本的函數(shù)
 else:
  user_no = input("請登錄后再試【1:用戶登錄;2:返回】:")
  if user_no == "1":
  login()
  else:
  print("返回成功")
  main()
 return inner # 切記,這里必須返回一個inner,不然上面的inner不會執(zhí)行,不能再后面加(),如果加上了,就相當(dāng)于調(diào)用這個函數(shù)

def exit_login(): # 6退出登錄
 global USER_LIST
 if USER_LIST:
 quit_login = input("當(dāng)前用戶為【%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滿足其中一個,繼續(xù)執(zhí)行
  WHETHER_LOGIN["is_login"] = "error"
  USER_LIST = [] # 直接將列表清除為初始狀態(tài),不知道這種方法好不好,但是好像管用
 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() # 一次性讀取整個文件,感覺這方方式不好
 flag = True
 cout = 3
 while flag:
 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): # 幾個傳入的類型為:用戶名、密碼或用戶權(quán)限,需要修改的用戶列表的位置、需要循環(huán)的文件內(nèi)容
 new_user_info = username.copy() # 將username復(fù)制給new_user_info
 new_user_info[user_info] = password_or_power # 將新的用戶密碼修改為輸入的新密碼
 username = "|".join(username) # 將列表轉(zhuǎn)換為數(shù)據(jù)庫可以識別的內(nèi)容
 new_user_info = "|".join(new_user_info)
 # print(username, new_user_info)
 with open("user.txt", "w") as new_user:
 for line in lines: # 將返回的整個文件循環(huán)打印
  if username in line: # 如果返回的用戶信息在返回的文件里面
  line = line.replace(username, new_user_info) # 那就將舊的用戶信息替換為新的用戶信息
  new_user.write(line) # 寫入文件
 print("修改成功") # 提示信息

@outer # 調(diào)用裝飾器
def manage(): # 5用戶管理接口
 while True:
 print("用戶管理接口【歡迎管理員[%s]】".center(69, "=") % USER_LIST[0])
 print("1:查看所有用戶;2、添加新用戶;3:刪除用戶;4:修改用戶密碼;5:升級用戶權(quán)限;6:退出用戶管理")
 user_input = input("請輸入對象序號:")
 if user_input == "1": # 查看用戶信息
  print("\n" + "-" * 80) # 打印80個-
  with open("user.txt", "r") as user_info:
  for line in user_info:
   user_list = line.strip("\n").split("|") # 去掉默認(rèn)的\n和|將他轉(zhuǎn)換為列表類型
   if user_list[3] == "1":
   user_rights = "管理員用戶" # 用戶最后一個數(shù)如果等于1,代表管理員
   else:
   user_rights = "普通用戶" # 否者為普通用戶
   ordinary_user = """用戶名【%s】\t密碼【%s】\t郵箱【%s】\t用戶等級【%s】""" \
     % (user_list[0], user_list[1], user_list[2], user_rights) # 中間默認(rèn)有一個換行符
   print(ordinary_user)
  print("-" * 80 + "\n")
 elif user_input == "2":
  while True:
  ret = register_function() # 調(diào)用注冊函數(shù)
  print(ret) # 輸出返回值
  break # 跳出當(dāng)前這個while循環(huán)
 elif user_input == "3":
  flag = "error" # 默認(rèn)是沒有用戶的(做到一個提示作用)
  del_user = verifi_passwd()[1][0] # 得到函數(shù)返回的第二個值
  print("\033[1;31m刪除用戶為:\033[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: # 將上面讀取到的文集一行一行的循環(huán)出來
   if line.startswith(del_user): # 檢查數(shù)據(jù)庫里面是否有我們輸入的用戶(以輸入的用戶名開頭)
   flag = "success"
   continue
   new_user.write(line)
  if flag == "success": # 提示成功
   print("刪除成功")
  else:
   print("沒有這個用戶。。。") # 如果輸入的為空格或一些沒有的用戶,提示沒有這個用戶
   continue
 elif user_input == "4":
  ret = verifi_passwd() # 得到函數(shù)返回值
  lines = ret[0] # 獲取到返回的整個文件內(nèi)容
  username = ret[1] # 獲取到返回的需要修改密碼的用戶
  new_password = input("請輸入用戶的新密碼:")
  if len(new_password) < 5: # 判斷輸入的密碼長度是否大于或等于5位數(shù)
  error_prompt = input("你輸入的密碼長度小于5位數(shù),由于你是管理員,輸入Y繼續(xù):").strip("") # 去掉輸入的空格
  if error_prompt not in ("y", "Y"): # 如果輸入的值不為y或Y,就直接退出
   print("退出。。。")
   continue
  user_info_func(username, new_password, 1, lines) # 傳入實參到函數(shù),1在列表中的位置代表用戶的新密碼
 elif user_input == "5": # 下面這部分和上面的部分基本相似,其實可以寫一個函數(shù)用來調(diào)用的
  ret = verifi_passwd()
  lines = ret[0]
  username = ret[1] # 獲取到輸入用戶的所有信息
  new_power = input("輸入Y提升用戶權(quán)限:")
  if new_power not in ("y", "Y"):
  print("輸入錯誤。。。")
  break
  user_info_func(username, "1", 3, lines) # 傳入實參:用戶名、權(quán)限(1代表管理員)、位置、循環(huán)的文件內(nèi)容
 elif user_input == "6":
  print("返回上一級!?。?)
  main()
 else:
  print("輸入有誤")

@user_login # 調(diào)用裝飾器
def see(): # 4查詢當(dāng)前用戶的基本信息
 if USER_LIST[3] == "1": # 數(shù)據(jù)庫里面定義了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("你輸入錯誤的次數(shù)太多,程序自動返回。。。")
  main()
 else:
  print("兩次輸入的密碼不相同。。。")
  continue

@user_login # 調(diào)用裝飾器
def alter(): # 3修改密碼
 print("當(dāng)前用戶為:【%s】" % USER_LIST[0])
 while True:
 old_user_password = input("請輸入當(dāng)前用戶的舊密碼密碼:")
 if old_user_password == USER_LIST[1]:
  flag = True
  count = 3
  while flag:
  count -= 1
  new_user_password = input("請輸入當(dāng)前用戶的\033[1;31m新密碼\033[0m:") # 給新密碼字體加顏色
  new_user_password1 = input("再次輸入當(dāng)前用戶的\033[1;31m新密碼\033[0m:")
  if len(new_user_password) >= 5:
   flag = False
  elif count == 0:
   print("多次不合法,程序自動返回。。。")
   main()
  else:
   print("輸入不合法,請輸入大于5位數(shù)的密碼")
  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: # 將獲取到的每行循環(huán)輸出
   if USER_LIST[0] in line: # 找到當(dāng)前登錄的用戶的這個用戶名
    USER_LIST[1] = new_user_password1 # 如果找到了,就把新密碼重新加入到我們?nèi)值挠脩舻男畔⒘斜碇?
    new_user_info = "|".join(USER_LIST) # 將用戶信息表中的內(nèi)容用join方法轉(zhuǎn)換為用戶數(shù)據(jù)庫里面的格式(新用戶信息)
    # print(new_user_info)
    # print(old_user_info)
    break # 跳出當(dāng)前
  with open("user.txt", "r") as old_user:
   lines = old_user.readlines() # 一次性讀取整個文件,感覺這方方式不好
  with open("user.txt", "w") as new_user:
   for line in lines: # 將上面讀取到的文集一行一行的循環(huán)出來
   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: # 當(dāng)前用戶密碼輸入錯誤
  print("當(dāng)前用戶密碼輸入錯誤,程序自動返回。。。")
  main()

def register(): # 2用戶注冊
 if WHETHER_LOGIN["is_login"] == "success":
 quit_login = input("無法注冊用戶,請退出登錄后重試【1:退出登錄;2:返回上一步】:")
 if quit_login == "1":
  exit_login() # 跳轉(zhuǎn)到退出用戶函數(shù)
 elif quit_login == "2":
  print("返回成功")
 elif WHETHER_LOGIN["is_login"] == "error":
 ret = register_function() # 調(diào)用注冊函數(shù)
 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("|") # 去除每行默認(rèn)的回車,以及|,并且將它轉(zhuǎn)換為列表賦給f_admin_list
  if f_user_list[0] == username and f_user_list[1] == passwd:
  print("登錄成功")
  global USER_LIST
  USER_LIST = f_user_list # 將獲取到的當(dāng)前行放到用戶信息列表中
  WHETHER_LOGIN["is_login"] = "success" # 登錄成功將is_login的值設(shè)置success
  WHETHER_LOGIN["is_user"] = username # 將我們登錄的用戶放入字典用,方便后期查詢
  # print(USER_LIST)
  return f_user_list
 else:
  print("登錄失敗")

def main():
 while True:
 global COUNT
 COUNT += 1
 print("用戶管理系統(tǒng)".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("當(dāng)前為管理員用戶:【%s】,不能繼續(xù)登錄" % USER_LIST[0])
  else:
   print("當(dāng)前用戶為【%s】,不能繼續(xù)登錄" % 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("輸入錯誤次數(shù)過多,程序自動退出。。。")
  else:
  print("輸入有誤,請重新輸入。。。\n")
  continue

main()

以上這篇python用戶管理系統(tǒng)的實例講解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python如何獲取Prometheus監(jiān)控數(shù)據(jù)

    python如何獲取Prometheus監(jiān)控數(shù)據(jù)

    這篇文章主要介紹了python如何獲取Prometheus監(jiān)控數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 對PyQt5的輸入對話框使用(QInputDialog)詳解

    對PyQt5的輸入對話框使用(QInputDialog)詳解

    今天小編就為大家分享一篇對PyQt5的輸入對話框使用(QInputDialog)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python3.5 cv2 獲取視頻特定幀生成jpg圖片

    python3.5 cv2 獲取視頻特定幀生成jpg圖片

    這篇文章主要為大家詳細(xì)介紹了python3.5 cv2 獲取視頻特定幀生成jpg圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • openCV入門學(xué)習(xí)基礎(chǔ)教程第二篇

    openCV入門學(xué)習(xí)基礎(chǔ)教程第二篇

    人臉識別,物體檢測,OpenCV是基石,下面這篇文章主要給大家介紹了關(guān)于openCV入門學(xué)習(xí)基礎(chǔ)教程的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • pygame實現(xiàn)井字棋之第三步邏輯優(yōu)化

    pygame實現(xiàn)井字棋之第三步邏輯優(yōu)化

    這篇文章主要介紹了pygame實現(xiàn)井字棋之第三步邏輯優(yōu)化,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們也有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Pandas的Series結(jié)構(gòu)及常用操作實例

    Pandas的Series結(jié)構(gòu)及常用操作實例

    這篇文章主要介紹了Pandas的Series結(jié)構(gòu)及常用操作實例,Series序列,是一種一維的結(jié)構(gòu),類似于一維列表和ndarray中的一維數(shù)組,但是功能比他們要更為強(qiáng)大,Series由兩部分組成:索引index和數(shù)值values,需要的朋友可以參考下
    2023-07-07
  • pygame實現(xiàn)俄羅斯方塊游戲(AI篇2)

    pygame實現(xiàn)俄羅斯方塊游戲(AI篇2)

    這篇文章主要為大家詳細(xì)介紹了pygame實現(xiàn)俄羅斯方塊游戲AI的第2篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • django中使用原生sql語句的方法步驟

    django中使用原生sql語句的方法步驟

    這篇文章主要介紹了django中使用原生sql語句的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 教你使用Python連接oracle

    教你使用Python連接oracle

    今天教各位小伙伴怎么用Python連接oracle,文中附帶非常詳細(xì)的圖文示例,對正在學(xué)習(xí)的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • Python 字符串轉(zhuǎn)換為整形和浮點類型的方法

    Python 字符串轉(zhuǎn)換為整形和浮點類型的方法

    今天小編就為大家分享一篇Python 字符串轉(zhuǎn)換為整形和浮點類型的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評論