簡(jiǎn)單的python后臺(tái)管理程序
一、作業(yè)需求
二、流程圖
三、源碼與具體思路
import shutil import os import sys USER_LOGIN = {'is_login': False} def outer(func): #裝飾器,若沒(méi)有登陸則輸出“請(qǐng)登陸” def inner(*args, **kwargs): if USER_LOGIN['is_login']: r = func(*args, **kwargs) return r else: print("請(qǐng)登陸") return inner def outer1(func): #裝飾器,若不是管理員則輸出“權(quán)限不足” def inner1(*args, **kwargs): if USER_LOGIN['user_type'] == '2': r = func(*args, **kwargs) return r else: print("不是管理員,權(quán)限不足") 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文件復(fù)制到regist_bak文件中去 os.rename('regist_new', 'regist') #再將regist_new改名為regist 妙妙妙! else: print("沒(méi)有權(quán)限修改管理員密碼") @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']: #若用戶還沒(méi)注冊(cè) print("用戶不存在,請(qǐng)注冊(cè)") def register(reg_user, reg_pwd, reg_email, reg_phone): #注冊(cè) 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: #將用戶信息寫(xiě)入文件 li = '|'.join(register_list) f.write(li + '\n') print("注冊(cè)/添加信息:", 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 #標(biāo)志位原本設(shè)為False,當(dāng)找到相應(yīng)用戶刪除后,標(biāo)志位設(shè)為True print("普通用戶刪除成功") continue f2.write(line) shutil.move('regist', 'regist_bak') os.rename('regist_new', 'regist') if not exit_flag: print("要?jiǎng)h除普通用戶不存在") elif type_user == '2': #若刪除的是管理員用戶 print("沒(méi)有權(quán)限刪除管理員帳號(hào)") def upper_level(upper_user): #升級(jí)為管理員 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): #簡(jiǎn)單搜索 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] #返回帳號(hào)的類型 1或2 @outer1 def admin_user(): #管理員調(diào)用 num = input("請(qǐng)選擇:1.修改密碼;2.查看本用戶信息;3.修改普通用戶密碼;" "4.刪除/添加普通用戶;5.權(quán)限管理;6.關(guān)鍵字搜索普通用戶信息;7.退出:") if num == '1': new_pwd = input("請(qǐng)輸入新的密碼:") change_pwd(new_pwd) elif num == '2': look_information() elif num == '3': user_changed = input("請(qǐng)輸入修改密碼的用戶名:") type_user = get_usertype(user_changed) new_pwd = input("請(qǐng)輸入新的密碼:") 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("請(qǐng)輸入要?jiǎng)h除普通用戶的用戶名:") type_user = get_usertype(delete_username) delete_func(delete_username, type_user) elif add_or_dele == '2': regi_username = input("請(qǐng)輸入注冊(cè)用戶名:") regi_pwd = input("請(qǐng)輸入注冊(cè)密碼:") regi_email = input("請(qǐng)輸入郵箱:") regi_phone = input("請(qǐng)輸入電話:") register(regi_username, regi_pwd, regi_email, regi_phone) elif num == '5': upper_user = input("請(qǐng)輸入升級(jí)為管理員的普通用戶名:") upper_level(upper_user) elif num == '6': search_information = input("請(qǐng)輸入要查找的關(guān)鍵字:") search(search_information) elif num == '7': sys.exit() def main(): while True: choice = input("請(qǐng)選擇:1.登陸;2.注冊(cè);3.修改密碼;4.查看信息;5.后臺(tái)管理;6.退出:") if choice == '1': username = input("請(qǐng)輸入用名名:") password = input("請(qǐng)輸入密碼:") login(username, password) elif choice == '2': regi_username = input("請(qǐng)輸入注冊(cè)用戶名:") regi_pwd = input("請(qǐng)輸入注冊(cè)密碼:") regi_email = input("請(qǐng)輸入郵箱:") regi_phone = input("請(qǐng)輸入電話:") register(regi_username, regi_pwd,regi_email,regi_phone) print("注冊(cè)成功".center(50, '*')) elif choice == '3': new_pwd = input("請(qǐng)輸入新的密碼:") current_user = USER_LOGIN['current_user'] change_pwd(current_user, new_pwd) print("修改密碼成功,請(qǐng)重新登陸".center(50, '-')) sys.exit() elif choice == '4': look_information() elif choice == '5': admin_user() elif choice == '6': sys.exit() main()
為了方便,再貼下不折疊代碼
@outer1 def admin_user(): #管理員調(diào)用 num = input("請(qǐng)選擇:1.修改密碼;2.查看本用戶信息;3.修改普通用戶密碼;" "4.刪除/添加普通用戶;5.權(quán)限管理;6.關(guān)鍵字搜索普通用戶信息;7.退出:") if num == '1': new_pwd = input("請(qǐng)輸入新的密碼:") change_pwd(new_pwd) elif num == '2': look_information() elif num == '3': user_changed = input("請(qǐng)輸入修改密碼的用戶名:") type_user = get_usertype(user_changed) new_pwd = input("請(qǐng)輸入新的密碼:") 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("請(qǐng)輸入要?jiǎng)h除普通用戶的用戶名:") type_user = get_usertype(delete_username) delete_func(delete_username, type_user) elif add_or_dele == '2': regi_username = input("請(qǐng)輸入注冊(cè)用戶名:") regi_pwd = input("請(qǐng)輸入注冊(cè)密碼:") regi_email = input("請(qǐng)輸入郵箱:") regi_phone = input("請(qǐng)輸入電話:") register(regi_username, regi_pwd, regi_email, regi_phone) elif num == '5': upper_user = input("請(qǐng)輸入升級(jí)為管理員的普通用戶名:") upper_level(upper_user) elif num == '6': search_information = input("請(qǐng)輸入要查找的關(guān)鍵字:") search(search_information) elif num == '7': sys.exit() def main(): while True: choice = input("請(qǐng)選擇:1.登陸;2.注冊(cè);3.修改密碼;4.查看信息;5.后臺(tái)管理;6.退出:") if choice == '1': username = input("請(qǐng)輸入用名名:") password = input("請(qǐng)輸入密碼:") login(username, password) elif choice == '2': regi_username = input("請(qǐng)輸入注冊(cè)用戶名:") regi_pwd = input("請(qǐng)輸入注冊(cè)密碼:") regi_email = input("請(qǐng)輸入郵箱:") regi_phone = input("請(qǐng)輸入電話:") register(regi_username, regi_pwd,regi_email,regi_phone) print("注冊(cè)成功".center(50, '*')) elif choice == '3': new_pwd = input("請(qǐng)輸入新的密碼:") current_user = USER_LOGIN['current_user'] change_pwd(current_user, new_pwd) print("修改密碼成功,請(qǐng)重新登陸".center(50, '-')) sys.exit() elif choice == '4': look_information() elif choice == '5': admin_user() elif choice == '6': sys.exit() main()
四、坑總結(jié)
1.怎么修改密碼?
當(dāng)時(shí)我蒙了。因?yàn)槿绻胒.write(xx),是直接寫(xiě)在文件的最后面的。這樣我想,好吧寫(xiě)在最后面也行。
但將已修改密碼的記錄加在最后一行,那又怎么把原來(lái)的刪掉?又多了一個(gè)麻煩。
或者說(shuō),不加在最后一行,直接改那一行,又怎么做?
shutil.move('regist', 'regist_bak') #把regist文件復(fù)制到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) 剛開(kāi)始我也用了,但是,后來(lái)有BUG!
比如:當(dāng)用戶名與密碼一樣是,修改密碼時(shí),把密碼也修改了。還不止,用replace()方法,在改
user_type時(shí)也出現(xiàn)把用戶名等修改的現(xiàn)象。當(dāng)時(shí)我再次蒙比。這不科學(xué)!
后來(lái)仔細(xì)看了replace()的源碼才發(fā)現(xiàn)我錯(cuò)了。
也可以看看Python replace()方法
3.當(dāng)我登入管理員后,添加普通用戶后,發(fā)現(xiàn)不能再次登入管理員了。
于是我回去看register(reg_user, reg_pwd, reg_email, reg_phone),
發(fā)現(xiàn)我濫用全局變量
USER_LOGIN['user_type'] = '1' register_list.append(USER_LOGIN['user_type'])
原來(lái)這里我重新賦值USER_LOGIN['user_type'] = '1'
后來(lái)為了解決這類問(wèn)題,寫(xiě)了個(gè)get_user_type()方法
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在Django下測(cè)試與調(diào)試REST API的方法詳解
今天小編就為大家分享一篇在Django下測(cè)試與調(diào)試REST API的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Python語(yǔ)言實(shí)現(xiàn)獲取主機(jī)名根據(jù)端口殺死進(jìn)程
這篇文章主要介紹了Python語(yǔ)言實(shí)現(xiàn)獲取主機(jī)名根據(jù)端口殺死進(jìn)程的相關(guān)資料,需要的朋友可以參考下2016-03-03Python列表對(duì)象實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Python列表對(duì)象實(shí)現(xiàn)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python數(shù)據(jù)分析模塊pandas用法詳解
這篇文章主要介紹了Python數(shù)據(jù)分析模塊pandas用法,結(jié)合實(shí)例形式詳細(xì)分析了Python數(shù)據(jù)分析模塊pandas的功能、常見(jiàn)用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09python如何標(biāo)準(zhǔn)化日期時(shí)間格式轉(zhuǎn)化成非標(biāo)準(zhǔn)化格式
這篇文章主要介紹了python如何標(biāo)準(zhǔn)化日期時(shí)間格式轉(zhuǎn)化成非標(biāo)準(zhǔn)化格式問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Python中使用pypdf2合并、分割、加密pdf文件的代碼詳解
這篇文章主要介紹了Python中使用pypdf2合并、分割、加密pdf文件的代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05python實(shí)現(xiàn)自動(dòng)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)發(fā)送郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06