python編程-權限管理2


一、作業需求

二、流程圖

三、源碼與具體思路

import shutil
import os
import sys
 
 
USER_LOGIN = {'is_login': False}
 
def outer(func):     #裝飾器,若沒有登陸則輸出“請登陸”
 def inner(*args, **kwargs):
  if USER_LOGIN['is_login']:
   r = func(*args, **kwargs)
   return r
  else:
   print("請登陸")
 return inner
 
 
def outer1(func):     #裝飾器,若不是管理員則輸出“權限不足”
 def inner1(*args, **kwargs):
  if USER_LOGIN['user_type'] == '2':
   r = func(*args, **kwargs)
   return r
  else:
   print("不是管理員,權限不足")
 return inner1
 
 
@outer
def change_pwd(changed_user, changed_pwd, type_user):   #修改密碼
 if type_user == '1':
  print("歡迎%s修改密碼".center(50, '-') % USER_LOGIN['current_user'])
  with open('regist', 'r', encoding='utf-8') as f1, open('regist_new', 'w', encoding='utf-8') as f2:
   for line in f1:
    read_list = line.strip().split('|')
    if read_list[0] == changed_user:
     read_list[1] = changed_pwd
     f2.write('|'.join(read_list) + '\n')
     continue
 
    f2.write(line)
  shutil.move('regist', 'regist_bak') #把regist文件復制到regist_bak文件中去
  os.rename('regist_new', 'regist') #再將regist_new改名為regist 妙妙妙!
 else:
  print("沒有權限修改管理員密碼")
 
 
 
@outer
def look_information(): #查看本用戶信息
 print("歡迎%s查看信息".center(50, '-') % USER_LOGIN['current_user'])
 with open('regist', 'r+', encoding='utf-8') as f:
  for line in f:
   read_list = line.strip().split('|')
   if read_list[0] == USER_LOGIN['current_user']:
    print("用戶名:%s" % read_list[0])
    print("密碼:%s" % read_list[1])
    print("郵箱:%s" % read_list[2])
    print("電話:%s" % read_list[3])
 
 
 
def login(user, pwd):   #登陸
 with open('regist', 'r+', encoding='utf-8') as f:
  for line in f:
   read_list = line.strip().split('|')
   if read_list[0] == user and read_list[1] == pwd: #若用戶存在
    USER_LOGIN['is_login'] = True
    USER_LOGIN['current_user'] = user
    USER_LOGIN['user_type'] = read_list[-1]
    print("歡迎%s登陸".center(50, '-') % USER_LOGIN['current_user'])
    break
 
 if not USER_LOGIN['is_login']: #若用戶還沒注冊
  print("用戶不存在,請注冊")
 
 
 
def register(reg_user, reg_pwd, reg_email, reg_phone): #注冊
 register_list = []
 register_list.append(reg_user) #將用戶信息加入列表
 register_list.append(reg_pwd)
 register_list.append(reg_email)
 register_list.append(reg_phone)
 register_list.append('1')
 with open('regist', 'a', encoding='utf-8') as f: #將用戶信息寫入文件
  li = '|'.join(register_list)
  f.write(li + '\n')
 
 print("注冊/添加信息:", li)
 
 
 
 
def delete_func(dele_user, type_user): #刪除普通用戶
 if type_user == '1': #若刪除的是普通用戶
  exit_flag = False
  with open('regist', 'r+', encoding='utf-8') as f1, open('regist_new', 'w', encoding='utf-8') as f2:
   for line in f1:
    ret_list = line.strip().split('|')
    if ret_list[0] == dele_user:
     exit_flag = True  #標志位原本設為False,當找到相應用戶刪除后,標志位設為True
     print("普通用戶刪除成功")
     continue
    f2.write(line)
  shutil.move('regist', 'regist_bak')
  os.rename('regist_new', 'regist')
 
  if not exit_flag:
   print("要刪除普通用戶不存在")
 elif type_user == '2': #若刪除的是管理員用戶
  print("沒有權限刪除管理員帳號")
 
 
 
def upper_level(upper_user): #升級為管理員
 with open('regist', 'r+', encoding='utf-8') as f1, open('regist_new', 'w', encoding='utf-8') as f2:
  for line in f1:
   li = line.strip().split('|')
   if li[0] == upper_user:
    li[-1] = '2'
    print("%s已成為管理員" % upper_user)
    f2.write('|'.join(li) + '\n')
    continue
   f2.write(line)
 
 shutil.move('regist', 'regist_bak')
 os.rename('regist_new', 'regist')
 
 
 
def search(search_info):  #簡單搜索
 with open('regist', 'r+', encoding='utf-8') as f:
  for line in f:
   ret_list = line.strip().split('|')
   if search_info in ret_list:
    print(ret_list)
 
 
 
def get_usertype(user):  #通地用戶名獲得用戶類型,返回1或2
 with open('regist', 'r+', encoding='utf-8') as f:
  for line in f:
   li = line.strip().split('|')
   if li[0] == user:
    return li[-1]  #返回帳號的類型 1或2
 
 
 
@outer1
def admin_user():   #管理員調用
 num = input("請選擇:1.修改密碼;2.查看本用戶信息;3.修改普通用戶密碼;"
    "4.刪除/添加普通用戶;5.權限管理;6.關鍵字搜索普通用戶信息;7.退出:")
 if num == '1':
  new_pwd = input("請輸入新的密碼:")
  change_pwd(new_pwd)
 elif num == '2':
  look_information()
 elif num == '3':
  user_changed = input("請輸入修改密碼的用戶名:")
  type_user = get_usertype(user_changed)
  new_pwd = input("請輸入新的密碼:")
  change_pwd(user_changed, new_pwd, type_user)
 elif num == '4':
  add_or_dele = input("1.刪除普通用戶;2.添加普通用戶")
  if add_or_dele == '1':
   delete_username = input("請輸入要刪除普通用戶的用戶名:")
   type_user = get_usertype(delete_username)
   delete_func(delete_username, type_user)
  elif add_or_dele == '2':
   regi_username = input("請輸入注冊用戶名:")
   regi_pwd = input("請輸入注冊密碼:")
   regi_email = input("請輸入郵箱:")
   regi_phone = input("請輸入電話:")
   register(regi_username, regi_pwd, regi_email, regi_phone)
 elif num == '5':
  upper_user = input("請輸入升級為管理員的普通用戶名:")
  upper_level(upper_user)
 
 elif num == '6':
  search_information = input("請輸入要查找的關鍵字:")
  search(search_information)
 elif num == '7':
  sys.exit()
 
 
 
 
 
def main():
 
 while True:
  choice = input("請選擇:1.登陸;2.注冊;3.修改密碼;4.查看信息;5.后台管理;6.退出:")
  if choice == '1':
   username = input("請輸入用名名:")
   password = input("請輸入密碼:")
   login(username, password)
  elif choice == '2':
   regi_username = input("請輸入注冊用戶名:")
   regi_pwd = input("請輸入注冊密碼:")
   regi_email = input("請輸入郵箱:")
   regi_phone = input("請輸入電話:")
   register(regi_username, regi_pwd,regi_email,regi_phone)
   print("注冊成功".center(50, '*'))
  elif choice == '3':
   new_pwd = input("請輸入新的密碼:")
   current_user = USER_LOGIN['current_user']
   change_pwd(current_user, new_pwd)
   print("修改密碼成功,請重新登陸".center(50, '-'))
   sys.exit()
  elif choice == '4':
   look_information()
  elif choice == '5':
   admin_user()
  elif choice == '6':
   sys.exit()
 
 
main()

為了方便,再貼下不折疊代碼

@outer1
def admin_user():   #管理員調用
 num = input("請選擇:1.修改密碼;2.查看本用戶信息;3.修改普通用戶密碼;"
          "4.刪除/添加普通用戶;5.權限管理;6.關鍵字搜索普通用戶信息;7.退出:")
 if num == '1':
  new_pwd = input("請輸入新的密碼:")
  change_pwd(new_pwd)
 elif num == '2':
  look_information()
 elif num == '3':
  user_changed = input("請輸入修改密碼的用戶名:")
  type_user = get_usertype(user_changed)
  new_pwd = input("請輸入新的密碼:")
  change_pwd(user_changed, new_pwd, type_user)
 elif num == '4':
  add_or_dele = input("1.刪除普通用戶;2.添加普通用戶")
  if add_or_dele == '1':
   delete_username = input("請輸入要刪除普通用戶的用戶名:")
   type_user = get_usertype(delete_username)
   delete_func(delete_username, type_user)
  elif add_or_dele == '2':
   regi_username = input("請輸入注冊用戶名:")
   regi_pwd = input("請輸入注冊密碼:")
   regi_email = input("請輸入郵箱:")
   regi_phone = input("請輸入電話:")
   register(regi_username, regi_pwd, regi_email, regi_phone)
 elif num == '5':
  upper_user = input("請輸入升級為管理員的普通用戶名:")
  upper_level(upper_user)
 
 elif num == '6':
  search_information = input("請輸入要查找的關鍵字:")
  search(search_information)
 elif num == '7':
  sys.exit()
 
  
 
  
 
def main():
 
 while True:
  choice = input("請選擇:1.登陸;2.注冊;3.修改密碼;4.查看信息;5.后台管理;6.退出:")
  if choice == '1':
   username = input("請輸入用名名:")
   password = input("請輸入密碼:")
   login(username, password)
  elif choice == '2':
   regi_username = input("請輸入注冊用戶名:")
   regi_pwd = input("請輸入注冊密碼:")
   regi_email = input("請輸入郵箱:")
   regi_phone = input("請輸入電話:")
   register(regi_username, regi_pwd,regi_email,regi_phone)
   print("注冊成功".center(50, '*'))
  elif choice == '3':
   new_pwd = input("請輸入新的密碼:")
   current_user = USER_LOGIN['current_user']
   change_pwd(current_user, new_pwd)
   print("修改密碼成功,請重新登陸".center(50, '-'))
   sys.exit()
  elif choice == '4':
   look_information()
  elif choice == '5':
   admin_user()
  elif choice == '6':
   sys.exit()
 
main()

四、坑總結

1.怎么修改密碼?

當時我蒙了。因為如果用f.write(xx),是直接寫在文件的最后面的。這樣我想,好吧寫在最后面也行。

但將已修改密碼的記錄加在最后一行,那又怎么把原來的刪掉?又多了一個麻煩。

或者說,不加在最后一行,直接改那一行,又怎么做?

shutil.move('regist', 'regist_bak') 
#把regist文件復制到regist_bak文件中去
os.rename('regist_new', 'regist') 
#再將regist_new改名為regist   妙妙妙!

2.怎么修改用戶user_type(將1改為2)

我看到有的博客有replace()方法。
new_str = line.replace(read_list[1], changed_pwd) 剛開始我也用了,但是,后來有BUG!
比如:當用戶名與密碼一樣是,修改密碼時,把密碼也修改了。還不止,用replace()方法,在改
user_type時也出現把用戶名等修改的現象。當時我再次蒙比。這不科學!
后來仔細看了replace()的源碼才發現我錯了。
也可以看看Python replace()方法

3.當我登入管理員后,添加普通用戶后,發現不能再次登入管理員了。

於是我回去看register(reg_user, reg_pwd, reg_email, reg_phone),
發現我濫用全局變量

USER_LOGIN['user_type'] = '1'
register_list.append(USER_LOGIN['user_type'])

原來這里我重新賦值USER_LOGIN['user_type'] = '1'

后來為了解決這類問題,寫了個get_user_type()方法

以上就是本文的全部內容,希望對大家的學習有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM