簡單的python後台管理程式,python後台管理
一、作業需求
二、流程圖
三、源碼與具體思路
import shutilimport osimport sysUSER_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 innerdef outer1(func): #裝飾器,若不是管理員則輸出“許可權不足” def inner1(*args, **kwargs): if USER_LOGIN['user_type'] == '2': r = func(*args, **kwargs) return r else: print("不是管理員,許可權不足") return inner1@outerdef 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("沒有許可權修改管理員密碼")@outerdef 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@outer1def 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()
為了方便,再貼下不摺疊代碼
@outer1def 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()方法
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。