一、目錄規范

二、readme
# ATM + 購物車專案 # 一個專案是如何從無到有的 # 1、需求分析(需要關注) 額度 15000 或 自定義 ---> 注冊功能 實作購物商城,買東西加入 購物車,呼叫 信用卡介面 結賬 ----> 購物功能、支付功能 可以提現,手續費5% ---> 提現功能 支持多賬戶登錄 ---> 登錄功能 支持賬戶間轉賬 ---> 轉賬功能 記錄消費流水 ---> 記錄流水功能 提供還款介面 ---> 還款功能 ATM記錄操作日志 ---> 記錄日志功能 提供管理介面,包括添加賬戶、修改用戶額度,凍結賬戶等,,, ---> 管理員功能(添加賬戶、修改用戶額度,凍結賬戶) 用戶認證用裝飾器 ---> 登錄認證裝飾器‘ # 用戶界面允許用戶能選擇的功能 1.注冊功能 2.登錄功能 3.查看余額 4.提現功能 5.還款功能 6.轉賬功能 7.查看流水 8.購物功能 9.查看購物車功能 10.管理員功能 - 添加賬戶、修改用戶額度,凍結賬戶 # 2、程式的架構設計(需要關注) - 三層架構(*******) - 視圖層: 專門用于與用戶互動; - 展示功能給用戶看、接收用戶輸入的資料、將功能回傳的結果展示給用戶看的; - 介面層: 專門做業務邏輯的處理; - 接收到用戶輸入的資料,進行邏輯判斷,然后回傳判斷后的結果給視圖層; - 資料層: 專門做資料的處理 - 增加資料 - 洗掉資料 - 更新資料 - 查看資料 # 3、分任務開發 - 專案經理:(專案的負責人) - UI(1-2人): 界面設計(app端的界面/web界面), - 前端(1-2人): 拿到UI的設計圖紙,開發頁面, - 后端(2-3人): 開發業務邏輯 - 運維(1人): 拿到開發好的代碼,部署再 “服務器” 中,上線運行 # 4、測驗軟體 # 5、上線運營
三、start.py
# 啟動程式入口 # 1.將當前ATM專案工程,添加解釋器的環境變數 import os # 與作業系統進行互動 import sys # 與解釋器進行互動 # 1) 獲取ATM的目錄路徑 base_path = os.path.dirname(__file__) # 2) 將專案路徑添加到解釋器的環境變數中 sys.path.append(base_path) # 3) 將視圖層中的執行函式,參考到當前位置執行 from core import src if __name__ == '__main__': # 執行src模塊中的run函式 src.run()
四、conf---->settings
# 組態檔(常量) import os # ATM根目錄路徑 # D:\python全堆疊15期\day18\ATM BASE_PATH = os.path.dirname(os.path.dirname(__file__)) # DB目錄路徑 # D:\python全堆疊15期\day18\ATM\db DB_PATH = os.path.join(BASE_PATH, 'db')
五、core--->src
# 視圖層 from interface import user_interface from interface import bank_interface from lib import common # 專門用于記錄用戶是否登錄,登錄狀態 user_info = { 'user': None } # 拆分三層架構版本 def register(): while True: # 1) 讓用戶輸入用戶名與密碼 username = input('請輸入用戶名: ').strip() password = input('請輸入密碼: ').strip() re_password = input('請輸入密碼: ').strip() # 2)小的邏輯判斷 if password == re_password: # 3) 再視圖層中呼叫注冊介面,將用戶與密碼傳遞給注冊介面做 核心邏輯的處理 # flag, msg = (False, '用戶已存在,請重新輸入') flag, msg = user_interface.register_interface(username, password) # True, f'用戶[{username}]注冊成功' if flag: print(msg) break # False, '用戶已存在,請重新輸入' else: print(msg) else: print('兩次密碼不一致,請重新輸入!') # 2.登錄功能 def login(): while True: # 1) 讓用戶輸入用戶名與密碼 username = input('請輸入用戶名: ').strip() password = input('請輸入密碼: ').strip() # 3) 再視圖層中呼叫 登錄介面 ,將用戶與密碼傳遞給登錄介面做 核心邏輯的處理 flag, msg = user_interface.login_interface(username, password) # True, f'用戶[{username}]登錄成功' if flag: print(msg) user_info['user'] = username break # False, '用戶已存在,請重新輸入' else: print(msg) # 3.查看余額 @common.login_auth def check_bal(): # 直接呼叫查看余額介面層,獲取資料 bal = user_interface.check_bal_interface(user_info.get('user')) print(f'當前用戶的余額為:[{bal}]') # 4.提現功能 @common.login_auth def withdraw(): while True: # 1) 輸入需要提現的金額 balance = input('請輸入需要提現的金額:').strip() # 小的邏輯判斷,判斷是否是數字,若是數字則轉為int型別 if not balance.isdigit(): print('請輸入數字型別!') continue # str ---> int balance = int(balance) # 2) 呼叫提現介面 # flag, msg = (True, f'提現[{money}]成功! 手續費為:[{money2 - money}]') flag, msg = bank_interface.withdraw_interface(user_info.get('user'), balance) # 3)列印介面回傳的結果 if flag: print(msg) break else: print(msg) # 5.還款功能 @common.login_auth def repay(): while True: # 1) 讓用戶輸入還款金額 money = input('請輸入需要還款的金額: ').strip() # 2) 小的邏輯判斷,判斷是否是數字,若是數字則轉為int型別 if not money.isdigit(): print('請輸入數字型別!') continue money = int(money) # 3) 呼叫還款介面 msg = bank_interface.repay_interface(user_info.get('user'), money) print(msg) break # 6.轉賬功能 @common.login_auth def transfer(): pass # 7.查看流水 @common.login_auth def check_flow(): pass # 8.購物功能 @common.login_auth def shopping(): pass # 9.查看購物車功能 @common.login_auth def check_shop_car(): pass # 10.管理員功能 @common.login_auth def admin(): pass # 函式功能字典 func_dic = { '1': register, '2': login, '3': check_bal, '4': withdraw, '5': repay, '6': transfer, '7': check_flow, '8': shopping, '9': check_shop_car, '10': admin, } # 提供給用戶選擇的函式 def run(): while True: print(''' 1.注冊功能 2.登錄功能 3.查看余額 4.提現功能 5.還款功能 6.轉賬功能 7.查看流水 8.購物功能 9.查看購物車功能 10.管理員功能 ''') choice = input('請輸入功能編號: ').strip() # 判斷用戶選擇的編號是否再函式功能字典中 if choice not in func_dic: print('編號有誤,請重新輸入!') continue # func_dic.get('1') ---> register() func_dic.get(choice)()
# 1.注冊功能 # 不分層版本 # def register(): # while True: # username = input('請輸入用戶名: ').strip() # password = input('請輸入密碼: ').strip() # re_password = input('請輸入密碼: ').strip() # # if password == re_password: # # # 組織用戶的資料,轉成json資料 --> json_str 保存到檔案中 # # 邏輯處理 # user_dic = { # 'name': username, # 'pwd': password, # 'balance': 15000, # 'flow': [], # # 'shop_car': {'商品名稱': ['商品數量', '單價']} # 'shop_car': {}, # 'locked': False # } # # D:\python全堆疊15期\day18\ATM\db\tank.json # # 以每個注冊 “用戶的名字” 作為json檔案名 # user_path = os.path.join(settings.DB_PATH, '%s.json' % username) # # # 判斷當前注冊用戶是否存在,os.path.exists(需要判斷的檔案路徑) # if os.path.exists(user_path): # print('用戶已存在,請重新輸入!') # continue # # with open(user_path, 'w', encoding='utf-8') as f: # # dict ---> json_str ---> f.write(json_str) ----> json檔案中 # json.dump(user_dic, f) # # 檔案重繪 # f.flush() # # print(f'用戶[{username}]注冊成功') # break # else: # print('兩次密碼不一致,請重新輸入!')
六、db---->handler
# 資料層 import json from conf import settings import os # 1、查看資料 def select(username): # 用戶json檔案的路徑 user_path = os.path.join(settings.DB_PATH, '%s.json' % username) # 判斷當前注冊用戶是否存在,os.path.exists(需要判斷的檔案路徑) if os.path.exists(user_path): # 讀取檔案中的資料 with open(user_path, 'r', encoding='utf-8') as f: # f.read() ---> json_str ---> python user_dic = json.load(f) return user_dic # 2、保存資料 def save(user_dic): # 用戶json檔案的路徑 user_path = os.path.join(settings.DB_PATH, '%s.json' % user_dic['name']) # 將資料寫入檔案中 with open(user_path, 'w', encoding='utf-8') as f: # dict ---> json_str ---> f.write(json_str) ----> json檔案中 json.dump(user_dic, f) # 檔案重繪 f.flush()
七、interface
bank_interface.py
# 銀行功能介面 from db import db_handler # 提現介面 def withdraw_interface(username, money): user_dic = db_handler.select(username) # 可以提現,手續費5% # 1) 判斷用戶賬戶的金額是否,大于等于 提現金額 + 5%手續費 # 提現金額 + 5%手續費 money + money * 0.05 money2 = money * 1.05 if user_dic.get('balance') >= money2: # 給當前用戶字典金額減錢 user_dic['balance'] -= money2 db_handler.save(user_dic) return True, f'提現[{money}]成功! 手續費為:[{money2 - money}]' else: return False, '余額不足,快去充錢!' # 還款介面 def repay_interface(username, money): # 1) 先將當前用戶字典取出來 user_dic = db_handler.select(username) # 2)直接加錢 user_dic['balance'] += money # 3)再更新資料 db_handler.save(user_dic) return f'還款[{money}]成功!'
user_interface.py
# 用戶功能介面 from db import db_handler # 注冊介面 def register_interface(username, password): # 邏輯處理 ---> 介面層 # 1) 去資料處理層獲取用戶資料 # user_dic ---> 用戶字典 / None user_dic = db_handler.select(username) # 2) 若user_dic有資料,則代表用戶存在,回傳用戶已存在,請重新輸入給 if user_dic: return False, '用戶已存在,請重新輸入' # ---》 return (False, '用戶已存在,請重新輸入') # 3) 若用戶不存在,則可以注冊 # 組織用戶的資料,轉成json資料 --> json_str 保存到檔案中 user_dic = { 'name': username, 'pwd': password, 'balance': 15000, 'flow': [], # 'shop_car': {'商品名稱': ['商品數量', '單價']} 'shop_car': {}, 'locked': False } # 4) 呼叫資料層中的保存資料功能save,將字典傳遞過去進行資料的保存 db_handler.save(user_dic) # 5) 回傳注冊結果給用戶視圖層 return True, f'用戶[{username}]注冊成功' # 登錄介面 def login_interface(username, password): # 1) 先去資料層,獲取用戶字典資料 user_dic = db_handler.select(username) # 2) 判斷用戶是否存在,若存在則校驗密碼 if user_dic: if password == user_dic.get('pwd'): return True, f'用戶[{username}]登錄成功!' else: return False, '密碼錯誤,請重新輸入' # 3) 若不存在,則回傳 錯誤資訊給視圖層 else: return False, '用戶不存在,請重新輸入' # 查看余額介面 def check_bal_interface(username): user_dic = db_handler.select(username) return user_dic.get('balance')
八、lib---->common.py
# 此處寫公共方法 # 登錄認證裝飾器模板 def login_auth(func): # 解決回圈匯入問題 from core import src def inner(*args, **kwargs): # 判斷用戶的登錄狀態,若有值代表已登錄,通過校驗 if src.user_info.get('user'): res = func(*args, **kwargs) return res else: src.login() return inner
九、log
日志
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/75656.html
標籤:Python
