簡單的python后臺管理程序
一、作業(yè)需求


二、流程圖

三、源碼與具體思路
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): #裝飾器,若不是管理員則輸出“權(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("沒有權(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']: #若用戶還沒注冊
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 #標(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("要刪除普通用戶不存在")
elif type_user == '2': #若刪除的是管理員用戶
print("沒有權(quán)限刪除管理員帳號")
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(): #管理員調(diào)用
num = input("請選擇:1.修改密碼;2.查看本用戶信息;3.修改普通用戶密碼;"
"4.刪除/添加普通用戶;5.權(quán)限管理;6.關(guān)鍵字搜索普通用戶信息;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("請輸入要查找的關(guān)鍵字:")
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(): #管理員調(diào)用
num = input("請選擇:1.修改密碼;2.查看本用戶信息;3.修改普通用戶密碼;"
"4.刪除/添加普通用戶;5.權(quán)限管理;6.關(guān)鍵字搜索普通用戶信息;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("請輸入要查找的關(guān)鍵字:")
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()
四、坑總結(jié)
1.怎么修改密碼?
當(dāng)時我蒙了。因為如果用f.write(xx),是直接寫在文件的最后面的。這樣我想,好吧寫在最后面也行。
但將已修改密碼的記錄加在最后一行,那又怎么把原來的刪掉?又多了一個麻煩。
或者說,不加在最后一行,直接改那一行,又怎么做?
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) 剛開始我也用了,但是,后來有BUG!
比如:當(dāng)用戶名與密碼一樣是,修改密碼時,把密碼也修改了。還不止,用replace()方法,在改
user_type時也出現(xiàn)把用戶名等修改的現(xiàn)象。當(dāng)時我再次蒙比。這不科學(xué)!
后來仔細(xì)看了replace()的源碼才發(fā)現(xiàn)我錯了。
也可以看看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'])
原來這里我重新賦值USER_LOGIN['user_type'] = '1'
后來為了解決這類問題,寫了個get_user_type()方法
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python創(chuàng)建與遍歷List二維列表的方法
這篇文章主要介紹了python創(chuàng)建與遍歷List二維列表的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-08-08
Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫教程
原本感覺在Django1.7+python 2.78+pycharm環(huán)境下配置mysql數(shù)據(jù)庫是件很容易的事情,結(jié)果具體操作的時候才發(fā)現(xiàn),問題還是挺多的,這里記錄一下最終的配置結(jié)果,給需要的小伙伴參考下吧2014-11-11
Python 實現(xiàn)某個功能每隔一段時間被執(zhí)行一次的功能方法
今天小編就為大家分享一篇Python 實現(xiàn)某個功能每隔一段時間被執(zhí)行一次的功能方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
詳解用Python進(jìn)行時間序列預(yù)測的7種方法
這篇文章主要介紹了詳解用Python進(jìn)行時間序列預(yù)測的7種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Django發(fā)送郵件和itsdangerous模塊的配合使用解析
這篇文章主要介紹了Django發(fā)送郵件和itsdangerous模塊的配合使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
Python使用numpy實現(xiàn)BP神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細(xì)介紹了Python使用numpy實現(xiàn)BP神經(jīng)網(wǎng)絡(luò),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
使用SQLAlchemy操作數(shù)據(jù)庫表過程解析
這篇文章主要介紹了使用SQLAlchemy操作數(shù)據(jù)庫表過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06

