1. 程式人生 > 其它 >員工管理系統函式封裝版與裝飾器的常見使用

員工管理系統函式封裝版與裝飾器的常見使用

# 1.編寫員⼯管理系統進階版
#  功能全部封裝成函式 資料全部來源於⽂件
#  ⼤致功能:註冊 登入 新增員⼯ 檢視員⼯等
#  普通要求:
#  新增 檢視等功能每次都必須先登入才可執⾏(認證裝飾器)
#  進階要求:
#  ⽤戶登入⼀次之後⽆需校驗身份(全域性校驗)
#  昇華超越:(後期再說)
#  每個⽤戶配備⻆⾊資訊
#  ⽤戶認證過程中只有管理員才可執⾏被裝飾函式


# 定義一個認證裝飾器
is_login = {'is_login':False}  # 全域性校驗功能
def login_auth(func):
    def auth(*args,**kwargs):
        # 1.1 先判斷使用者是否已經登入
        if is_login.get('is_login'):
            # 3.正常執行函式index
            res = func(*args, **kwargs)
            return res
        # 1.先獲取使用者的使用者名稱和密碼
        print('請輸入管理員專用使用者名稱和密碼')
        username = input('username>>>:').strip()
        password = input('password>>>:').strip()
        # 2.校驗專屬管理員使用者名稱和密碼是否正確
        if username == 'jia' and password == '123':
            # 3.正常執行函式index
            res = func(*args,**kwargs)
            # 4.將記錄使用者登入狀態的資料修改
            is_login['is_login'] = True
            return res

        else:
            print('使用者名稱或密碼錯誤 無法使用管理員許可權')
    return auth



# 1註冊資訊
def register():
    print('註冊功能')
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    # 4.應該先校驗使用者編號是否已存在
    with open(r'a.txt', 'rt', encoding='utf8') as f:
        for i in f:
            username1, password1 = i.split('|')
            if username1 == username:
                print('使用者已存在')
                break  # 結束for迴圈校驗
        else:
            data = '%s|%s\n'%(username, password)
            with open(r'a.txt', 'at', encoding='utf8') as f:
                f.write(data)
                print('使用者%s註冊成功'%username)

				
				
# 2.登入功能
def login():
    print('登入功能')
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    with open(r'a.txt', 'rt', encoding='utf8') as f:
    # 2.校驗使用者名稱和密碼是否正確
        for i in f:
            username1, password1 = i.split('|')
            # print(i)
            if username1 == username and password1.strip() == password:
                print('登陸成功')
                break
            elif username == 'jia' and password == '123':
                is_login['is_login'] = True
                print('管理員身份登入成功')
                break
        else:
            print('使用者名稱或密碼錯誤 重新嘗試')

			
			
# 3.新增員工
@login_auth
def add():
    print('輸入員工資訊>>>:')
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    with open(r'a.txt', 'rt', encoding='utf8') as f:
        for i in f:
            username1, password1 = i.split('|')
            if username1 == username:
                print('使用者已存在')
                break  # 結束for迴圈校驗
        else:
            data = '%s|%s\n'%(username, password)
            with open(r'a.txt', 'at', encoding='utf8') as f:
                f.write(data)
                print('使用者%s新增成功'%username)

				
				
# 4.檢視員工資訊
@login_auth
def look():
    print('檢視員工資訊')
    choice1 = input('輸入1查詢所有 輸入2按個人編號查詢:').strip()  # 讓客戶選擇查詢範圍
    if choice1 == '1':
        with open(r'a.txt', 'rt', encoding='utf8') as f:
            for i in f:
                print(i)
    elif choice1 == '2':
        username = input('輸入員工姓名:').strip()
        with open(r'a.txt', 'rt', encoding='utf8') as f:
            for i in f:
                username1, password1 = i.split('|')
                if username1 == username:
                    print(i)
                else:
                    print('輸入使用者資訊錯誤')

					
while True:
    print("""
    1.註冊功能
    2.登入功能
    3.新增員工
    4.檢視員工資訊
    """)
    choice = input('請輸入功能編號>>>:').strip()
    # 判斷使用者輸入的編號
    func_dic = {
        '1': register,
        '2': login,
        '3': add,
        '4': look,
        }
    if choice in func_dic:
        # 獲取功能字典的值
        func_name = func_dic.get(choice)
        # 呼叫相印的函式
        func_name()
    else:
        print('功能不存在')



		
		
# 2.編寫統計函式執⾏次數裝飾器
#  任意定義⼀個函式給其新增裝飾器
#  要求:每次執⾏該函式 裝飾器⾃動記錄次數 記錄需儲存在⽂件中


# 計算執行次數的功能
def func1(name):
    num = 0   # 閉包中外函式中的變數指向的引用不可變
    def func2():
        name()
        nonlocal num # 使用nonlocal 訪問修改外部函式變數
        num += 1
        print("執行次數", num)
        res = '%s\n' % num    # NoneNoneNoneNone
        with open(r'a.txt', 'at', encoding='utf8') as f:
            f.write(res)
    return func2
# 待計次方法
@func1
def index():
    pass
index()
index()
index()

# 執行次數 1
# 執行次數 2
# 執行次數 3