python基礎要打牢,ATM+購物車拿來練手不錯,另外也可以了解開發軟體的流程,總之感覺nice(▽),
2020.12.31今天是2020年最后一天,意義非凡,ATM+購物車是我第一次寫的比較正規龐大的專案……原諒我沒做過課設,感覺其實用三層架構來寫也沒那么難,(不過我打算上周天和上周一寫完的…執行力不夠)且當跨年禮物吧…2021再繼續哈哈哈哈哈,
文章目錄
- 一、 需求分析
- 二、程式的架構分析
- 一個專案怎么從無到有
- 1.1需求分析
- 1.2程式的架構設計
- 1.3分任務開發
- 1.4測驗
- 1.5上線
- 三、軟體開發目錄
- 四、創建用戶功能字典及搭建用戶視圖層
- 五、詳細寫各個功能
- 1、注冊功能
- 2、登錄功能
- 3、查看余額
- 4、提現功能
- 5、還款功能
- 6、轉賬功能
- 7、查看流水
- 8、購物功能
- 9、查看購物車
- 10、管理員功能
- 10.1搭建管理員視圖層以及管理員功能字典
- 10.2實作管理員各個功能
- 六、演示視頻
一、 需求分析
模擬實作一個ATM + 購物商城程式
1. 額度 15000或自定義 ==》注冊功能
2.實作購物商城,買東西加入 購物車,呼叫信用卡介面結賬 ==》購物功能、支付功能
3.可以提現,手續費5% ==》提現功能
4.支持多賬戶登錄 ==》登陸功能
5.支持賬戶間轉賬 ==》轉賬功能
6.記錄日常消費流水 ==》記錄流水功能
7.提供還款介面 ==》還款功能
8.ATM記錄操作日志 ==》日志功能
9.提供管理介面,包括添加賬戶、用戶額度,凍結賬戶等,,,==》管理功能
10.用戶認證用裝飾器==》登陸認證裝飾器
"用戶視圖層" 展示給用戶選擇的功能
1、注冊功能
2、登錄功能
3、查看余額
4、提現功能
5、還款功能
6、轉賬功能
7、查看流水
8、購物功能
9、查看購物車
10、管理員功能
二、程式的架構分析
一個專案怎么從無到有
1.1需求分析
客戶提出需求,公司拿到專案
——》公司出人去(一般一個前端一個后端)和客戶討論需求、商品需求功能的可實作性、專案價格、開發周期等,得到一個需求檔案
——》公司內部開會得到一個開發檔案交給不同崗位的程式員開發,
- Python: 后端,爬蟲
- 不同的崗位:
- UI界面設計:
- 設計軟體的布局,會分局軟體的外觀切成一張張圖片,
- 前端:
- 拿到UI交給他的圖片,然后去搭建網頁面,
- 設計一些頁面中,哪些位置需要接收資料,需要進行資料互動,
- 后端:
- 直接核心的業務邏輯,調度資料庫進行資料的增刪查改,
- 測驗:
- 會給代碼進行全面測驗,比如壓力測驗,界面測驗(CF卡箱子),
- 運維:
- 部署專案,
1.2程式的架構設計
1.程式設計的好處
1)思路清晰
2)不會出現寫一半代碼時推翻重寫的情況
3)方便自己或以后的同事更好維護
2.三層架構設計的好處
1)把每個功能都分層三部分,邏輯清晰
2)如果用戶更換不同的用戶界面或不同,
的資料儲存機制都不會影響介面層的核心
邏輯代碼,擴展性強,
3)可以在介面層,準確的記錄日志與流水,
3.三層架構
一 用戶視圖層
用于與用戶互動的,可以接受用戶的輸入,列印介面回傳的資料,
二 邏輯介面層
接受 用戶視圖層 傳遞過來的引數,根據邏輯判斷呼叫資料層加以處理,并回傳一個結果給 用戶視圖層,
三 資料處理層
接受介面層傳遞過來的引數,做資料的處理
- 保存資料
- 查看資料
- 更新資料
- 洗掉資料
程式架構圖:

1.3分任務開發
1.4測驗
1.5上線
三、軟體開發目錄
conf:專案的配置資訊
core:核心的代碼
db:資料
interface:介面
lib:共用的一些功能
log:日志
readme:介紹專案的功能使用等
srart.py:專案的啟動檔案

四、創建用戶功能字典及搭建用戶視圖層
core中src代碼如下
# 1.注冊功能
def register():
...
#2.登錄功能
def login():
...
#3.查看余額
def check_banlance():
...
#4.提現功能
def withdraw():
...
#5.還款功能
def repay():
...
#6.轉賬功能
def transfer():
...
#7.查看流水
def check_flow():
...
#8.購物功能
def shopping():
...
#9.查看購物車
def check_shop_car():
...
#10.管理員功能
def admin():
...
fuc_dic = {
'1':register,
'2':login,
'3':check_banlance,
'4':withdraw,
'5':repay,
'6':transfer,
'7':check_flow,
'8':shopping,
'9':check_shop_car,
'10':admin
}
def run():
while True:
print('''
====== ATM+購物車======
1、注冊功能
2、登錄功能
3、查看余額
4、提現功能
5、還款功能
6、轉賬功能
7、查看流水
8、購物功能
9、查看購物車
10、管理員功能
====== THE END======
''')
#接受用戶輸入
choice = input('請輸入命令編號:').strip()
#判斷命令編號是否合法
if choice in fuc_dic:
fuc_dic[choice]()
else:
print('請輸入合法的命令編號!')
start.py代碼如下
import os
import sys
# 添加解釋器的環境變數
sys.path.append(os.path.dirname(__file__))
from core import src
if __name__ == '__main__':
src.run()
五、詳細寫各個功能
1、注冊功能
核心邏輯分析
用戶在視圖層輸入賬號和密碼,將賬號和密碼交給邏 輯 處理層,邏輯處理層呼叫資料處理層的功能來判斷賬號和密碼是否存在,存在與否,則回傳相應結果給邏輯處理層(介面層),若賬號密碼存在,則介面層直接回傳,若不存在需要介面層需要完成注冊功能,介面層需要做的是組織用戶的資訊,然后呼叫資料處理層的功能將用戶資訊寫入相應json檔案并回傳,最終由介面層將是否注冊成功回傳給用戶視圖層,
def register():
while True:
# 1.用戶輸入用戶名和密碼進行校驗
name = input('請輸入用戶名:').strip()
pwd = input('請輸入密碼:').strip()
re_pwd = input('請確認密碼').strip()
# 2.小的邏輯判斷
if pwd == re_pwd:
# 呼叫介面層來判斷是否注冊成功
res,tag= user_interface.register_interface(name,pwd)
if res:
print(tag)
break
else:
print(tag)
interface中的注冊介面
def register_interface(username,password,balance = 15000):
# 1.呼叫資料處理層中的select函式會回傳用戶資訊字典或者None
if db_handler.select(username):
return False,'用戶已存在,請重新輸入!'
else:
password = common.get_pwd_md5(password)
#1.組織用戶資訊,準備注冊
user_dic = {
'username': username,
'password': password,
'balance': balance,
# 用于記錄用戶流水的串列
'flow': [],
# 用于記錄用戶購物車
'shop_car': {},
# locked:用于記錄用戶是否被凍結
# False: 未凍結 True: 已被凍結
'locked': False
}
# 2.呼叫資料處理層的保存函式將用戶資訊寫入檔案
#密碼加密
db_handler.save(user_dic)
return True, f'{username} 注冊成功!'
資料處理層功能的select功能
def select(username):
# 1.接收用戶名,拼接用戶資訊的完整json路徑
user_path = os.path.join(
settings.BASE_PATH,f'{username}.json'
)
# 2.判斷用戶json檔案是否存在
if os.path.exists(user_path):
with open(user_path,'r',encoding='utf-8') as f:
user_dic = json.load(f)
return user_dic
# 不return默認回傳None
conf下的配置資訊
import os
BASE_PATH = os.path.dirname(
os.path.dirname(__file__))
lib中的common.py密碼加密功能
# 密碼加密
def get_pwd_md5(pwd):
m = hashlib.md5(pwd.encode('utf-8'))
salt = 'wangxunzhidashuaibi'
m.updae(salt.encode('utf-8'))
return m.hexdegist()
2、登錄功能
核心邏輯分析
用戶在視圖層輸入賬號和密碼交給登錄介面層,介面層呼叫資料處理層的功能來判斷用戶是否登錄成功,另外加了一個用戶的登錄狀態變數login_user用于記錄用戶登錄狀態和一個用戶登錄認證裝飾器,
def login():
while True:
name = input('請輸入你的賬號:').strip()
password = input('請輸入你的密碼:').strip()
# 登錄介面:
#登錄成功回傳True,登錄成功
res,tag = user_interface.login_interface(name,password)
if res:
global login_user
login_user = name
print(tag)
break
else:
print(tag)
interface中的登錄介面
def login_interface(name,password):
# 呼叫資料處理層的select功能,來校驗用戶登錄是否成功
# 回傳user_dic 或者None
res = db_handler.select(name)
if res:
# 給用戶輸入的密碼加密
password = common.get_pwd_md5(password)
if password == res.get('password'):
return True,'登錄成功!'
else:
return False,'密碼錯誤!'
return False,'用戶不存在!請重新輸入!'
用戶登錄認證
from core import src
def login_auth(func):
def outter(*args,**kwargs):
if src.login_user:
res = func(*args,**kwargs)
return res
else:
print('未登錄,無法使用該功能!請登錄!')
src.login()
return outter
3、查看余額
核心邏輯分析
用戶登錄后(未登錄會被強制登錄),查看余額,直接呼叫查看余額介面,查看余額介面呼叫資料處理層中的功能,完成任務,
@common.login_auth
def check_banlance():
#直接呼叫查看余額介面
#回傳余額
banlance = user_interface.check_balance_interface(login_user)
print(f'====用戶{login_user}余額為{banlance}====')
interface查看余額介面
# 查看余額介面
def check_bal_interface(username):
user_dic = db_handler.select(username)
return user_dic['balance']
4、提現功能
核心邏輯分析
用戶在登錄后(未登錄會強制登錄),在用戶視圖層輸入提現金額,呼叫介面層中的提現介面,在提現介面中呼叫了資料處理層中的功能回傳給介面層,介面層完成邏輯處理后將結果回傳視圖層,
記錄流水和日志:要在介面層接入記錄日志的功能,
原因:介面層是處理邏輯的核心所在,用戶每次有提現/還款等功能都需要經過介面層,
注意:
轉賬要注意手續費的處理,以及用戶輸入的是否為數字等細節判斷,
#4.提現功能
@common.login_auth
def withdraw():
while True:
# 1.讓用戶輸入提現金額
money = input('請輸入提現金額:').strip()
# 2.小邏輯判斷:判斷用戶輸入的是否為數字
if money.isdigit():
# 呼叫提現介面層
# 回傳(bool,str)
flag,msg=bank_interface.withdraw_interface(login_user,money)
if flag:
print(msg)
break
else:
print(msg)
else:
print('您的輸入不合法,請您輸入數字,比如1220')
interface提現介面
def withdraw_interface(name,money):
#1.拿到用戶資訊
user_dic = db_handler.select(name)
#2.查看賬戶的余額
balance = user_dic.get('balance')
#判斷余額是否大于提現金額和手續費
if balance >= int(money) * 1.05:
balance -= int(money) * 1.05
user_dic['balance'] = balance
#記錄流水
flow =f'用戶{name}提現{money}成功!' \
f'手續費為{int(money)*0.05},余額為{balance}'
user_dic['flow'].append(flow)
#保存或者更新用戶資料
db_handler.save(user_dic)
#流水既輸出在螢屏上,也保存在檔案中
bank_logger.info(flow)
return True,flow
else:
return False,'提現失敗!請重新輸入金額!'
common.py中日志功能(在介面層記錄日志)
def get_logger(log_type): # log_type ---> user
'''
:param log_type: 比如是 user日志,bank日志,購物商城日志
:return:
'''
# 1、加載日志配置資訊
logging.config.dictConfig(
settings.LOGGING_DIC
)
# 2、獲取日志物件
logger = logging.getLogger(log_type)
return logger
settings.py新增日志配置字典
"""
logging配置
"""
# 定義三種日志輸出格式 開始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' # 其中name為getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# 定義日志輸出格式 結束
# ****************注意1: log檔案的目錄
# BASE_PATH = os.path.dirname(os.path.dirname(__file__))
logfile_dir = os.path.join(BASE_PATH, 'log')
# print(logfile_dir)
# ****************注意2: log檔案名
logfile_name = 'atm.log'
# 如果不存在定義的日志目錄就創建一個
if not os.path.isdir(logfile_dir):
os.mkdir(logfile_dir)
# log檔案的全路徑
logfile_path = os.path.join(logfile_dir, logfile_name)
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
# 列印到終端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 列印到螢屏
'formatter': 'simple'
},
# 列印到檔案的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到檔案
'formatter': 'standard',
'filename': logfile_path, # 日志檔案
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志檔案的編碼,再也不用擔心中文log亂碼了
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 這里把上面定義的兩個handler都加上,即log資料既寫入檔案又列印到螢屏
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)傳遞
},
},
}
interface中新增bank_log日志物件
#銀行流水日志物件
bank_logger = common.get_logger('bank')
5、還款功能
核心邏輯分析
用戶在視圖層輸入還款金額,由介面層進行與資料處理層進行互動,完成功能,
@common.login_auth
def repay():
while True:
money = input('請輸入你要還款的金額:').strip()
if money.isdigit():
if eval(money) >=0:
# 接入還款介面
flag,msg = bank_interface.repay_interface(login_user,money)
if flag:
print(msg)
break
else:
print('金額不能小于0!請重新輸入!')
else:
print('必須輸入數字!請重新輸入!')
interface還款介面
def repay_interface(name,money):
#1.得到用戶資訊字典
user_dic = db_handler.select(name)
#2.將還款金額加入用戶余額
user_dic['balance'] += eval(money)
#3.記錄流水
flow = f'====用戶{name}還款{money}元成功,' \
f'現有{user_dic["balance"]}元===='
bank_logger.info(flow)
#4.保存或者更新用戶資訊
db_handler.save(user_dic)
return True,flow
6、轉賬功能
核心邏輯分析
用戶輸入要轉入的賬戶和金額,傳入轉賬介面,轉賬介面利用資料處理層的select和save完成功能,
def transfer():
while True:
#1.接收轉賬物件及金額
name = input('請輸入你要轉賬物件:').strip()
money = input('請輸入你要轉賬金額:').strip()
#2.判斷用戶輸入的金額是否為數字以及是否>0
if money.isdigit():
if eval(money) > 0:
flag,msg=bank_interface.transfer_interface(name,money)
if flag:
print(msg)
break
else:
print(msg)
else:
print('轉賬金額必須大于0!')
else:
print('必須輸入數字!')
轉賬介面
def transfer_interface(name,money):
#1.判斷被轉賬用戶是否存在
#接入資料處理層的查找功能,回傳user_dic 或者None
res = db_handler.select(name)
if not res:
return False,'目標用戶不存在!'
#2.獲取當前用戶資料
user_dic = db_handler.select(src.login_user)
#3.判斷當前用戶的余額是否夠轉賬
money = eval(money)
if user_dic.get('balance') > money:
user_dic['balance'] -= money
res['balance'] += money
else:
return False,'用戶的錢不夠轉賬!'
#4.記錄流水
from_log_flow = f'用戶給用戶{name}轉賬{money}元成功!'
user_dic['flow'].append(from_log_flow)
to_user_flow = f'用戶接受用戶{src.login_user}轉賬{money}元成功!'
res['flow'].append(to_user_flow)
bank_logger.info(f'用戶{src.login_user}給用戶{name}轉賬{money}元成功!')
#5.更新用戶資料
db_handler.save(user_dic)
db_handler.save(res)
return True,from_log_flow
7、查看流水
核心邏輯分析
用戶在視圖層選擇查看流水功能,呼叫查看流水介面,流水介面呼叫資料處理層的查看功能完成功能,
#7.查看流水
@common.login_auth
def check_flow():
#接入查看流水介面
res = bank_interface.check_flow_interface(login_user)
if res:
n = 1
for i in res:
print(f'{n}:{i}')
n+=1
else:
print('用戶{name}無流水記錄!')
查看流水介面
def check_flow_interface(login_user):
user_dic = db_handler.select(login_user)
return user_dic.get('flow')
8、購物功能
核心邏輯分析
用戶在視圖層選擇購物后==》
看到商品資訊==》
選擇購物/支付/加入購物車==》
1.購物:需要對用戶輸入的指令進行判定
2.支付:計算當前購物車總花費,接入支付介面,完成支付
3.加入購物車:讀取之前的購物車,若存在加入重復的商品 名,則數量增加,否則新增購物,最后更新購物車
#8.購物功能
@common.login_auth
def shopping():
# 1.列印商品資訊
shop_list = []
print('============歡迎來到有趣用品商城============')
with open(r'F:\ATM+購物車\db\shoppings.txt',encoding='utf-8') as f:
n = 1 # 記錄商品編號
for line in f:
shop_name,shop_price = line.strip().split(':')
shop_price = eval(shop_price)
shop_list.append((shop_name,shop_price))
print(f'商品編號:{n},'
f'商品名稱:{shop_name},'
f'商品單價:{shop_price}')
n+=1
print('================24小時服務================')
# 2.初始化購物車
shopping_car = {}
#3.模擬用戶購物
while True:
choice = input('請輸入商品編號(若結賬輸入y 添加購物車輸入n):').strip()
#3.1選擇結賬
if choice == 'y':
# 判斷購物車是否為空 ==》
#空==》不能支付
#否則==》呼叫支付介面
if not shopping_car:
print('購物車為空,無法支付!')
else:
#呼叫商品結算介面
flag,msg=shop_interface.shopping_interface(shopping_car,login_user)
if flag:
print(msg)
break
else:
print(msg)
elif choice == 'n':
#判斷購物車內是否為空
# 空==》提示用戶選擇商品
# 非空 ==》代表用戶選擇了商品加入了購物車
if not shopping_car:
print('當前購物車為空,請在該購物車內添加商品!')
else:
#接入添加購物車介面
res = shop_interface.add_shop_car(login_user,shopping_car)
if res:
print('添加購物車成功!')
break
else:
print('添加購物車失敗!')
else:
#模擬用戶選擇商品
#判斷用戶輸入的編號是否合法
if not choice.isdigit():
print('請輸入數字編號!')
elif not type(eval(choice)) is int:
print('請輸入整數編號!')
elif eval(choice) > n or eval(choice) < 1:
print('請輸入1-{n}內的編號!')
else:
#獲取用戶所選商品的名字和單價
shop_name,shop_price = shop_list[eval(choice)-1]
#采用{'name':[price,number]}形式組織購物車
if shop_name in shopping_car:
shopping_car[shop_name][1]+=1
else:
shopping_car[shop_name] = [shop_price,1]
print(f'當前購物車{shopping_car}')
商品結算介面和添加購物車介面
#商品結算介面
def shopping_interface(shopping_car,name):
#1.計算用戶商品總花銷
cost= 0
# 采用{'name':[price,number]}形式組織購物車
for i in shopping_car.values():
price,number = i
cost+=price*number
#2.支付
#呼叫銀行支付介面
flag,msg=bank_interface.pay_interface(name,cost)
return flag,msg
#添加購物車介面
def add_shop_car(name,shopping_car):
# 獲取用戶購物車
use_dic = db_handler.select(name)
user_car = use_dic['shop_car']
#添加購物車
for shop_name,shop_price_num in shopping_car.items():
shop_price,shop_num = shop_price_num
#判斷商品在不在購物車里面,若在則數量增加
#否則將商品添加到購物車里
#購物車組織{商品名:[單價,數量]}
if shop_name in user_car:
use_dic['shop_car'][shop_name][1] += shop_num
else:
use_dic['shop_car'][shop_name] = [shop_price,shop_num]
#等同于use_dic['shop_car'].update({shop_name:[shop_price,shop_num]})
#更新購物車資料
db_handler.save(use_dic)
return True
支付介面
# 支付介面
def pay_interface(login_user, cost):
user_dic = db_handler.select(login_user)
# 判斷用戶金額是否足夠
if user_dic.get('balance') >= cost:
# 減錢
user_dic['balance'] -= cost
# 記錄消費流水
flow = f'用戶消費金額: [{cost}$]'
user_dic['flow'].append(flow)
# 保存資料
db_handler.save(user_dic)
# return True 或 return False 交給購物介面來做處理
return True
return False
9、查看購物車
核心邏輯分析
和查看余額一樣,直接呼叫介面層,利用資料處理層查看功能完成任務,
#9.查看購物車
@common.login_auth
def check_shop_car():
#呼叫查看購物車介面
res = shop_interface.check_spc(login_user)
if res:
for i in res:
print(i)
else:
print('用戶購物車內沒東西!')
查看購物車介面
def check_spc(name):
user_dic = db_handler.select(name)
shop_car = user_dic['shop_car']
return shop_car
10、管理員功能
核心邏輯分析
有點像寫一個小的ATM+購物車,只不過功能不一樣,
管理員需要有的功能分析如下:
1.添加用戶
2.修改用戶額度
3.凍結用戶
與寫整個專案不同,管理員功能相對來說比較獨立,我們在寫這個功能的時候,同樣采取三層架構,
即管理員視圖層=》管理員介面層=》管理員資料處理層,但這里處理的是用戶的資料,其實也是用戶資料處理層,
#添加用戶
def add_user():
...
#修改用戶額度
def change_balance():
...
#凍結用戶
def lock_user():
...
#管理員功能字典
admin_dic={}
#管理員視圖層
def admin_run():
print('=====歡迎進入管理員功能區=====')
10.1搭建管理員視圖層以及管理員功能字典
#管理員功能字典
admin_dic={
'0':['退出',None],
'1':['添加用戶',add_user],
'2':['修改用戶額度',change_balance],
'3':['凍結用戶',lock_user]
}
#管理員視圖層
def admin_run():
print('=====歡迎進入管理員功能區=====')
#展示管理員功能
while True:
for k,v in admin_dic:
print(f'{k}:{v[0]}')
#管理員選擇功能
choice = input('請輸入您想要使用的管理員功能').strip()
#判斷用戶輸入的合法性
if choice not in admin_dic:
print('請您輸入合法的數字!')
else:
admin_dic[choice][1]()
10.2實作管理員各個功能
1、添加用戶功能
#添加用戶
def add_user():
#相當于注冊一個用戶
src.register()
2、修改用戶額度功能
#修改用戶額度
def change_balance():
#獲取要修改物件的賬號和所要修改的額度
while True:
name = input('請輸入要修改的賬號:').strip()
balance = input('請輸入要修改的額度:').strip()
#判斷輸入額度的合法性
if not balance.isdigit():
print('輸入不合法!')
else:
#修改用戶的額度,呼叫修改用戶額度介面
#修改成功回傳 True和日志
flag,msg = admin_interface.change_balance(name,balance)
if flag:
print(msg)
break
print(msg)
修改用戶額度介面
#修改用戶額度
def change_balance(name,money):
#獲取用戶的資訊字典
#接入資料處理層查看資料:回傳用戶資訊字典或者None
user_dic = db_handler.select(name)
if user_dic:
#修改額度
user_dic['balance'] = eval(money)
#記錄流水
flow = f'管理員{src.login_user}修改{name}用戶額度為{money}成功!'
admin_logger.info(flow)
#保存資料
db_handler.save(user_dic)
return True,flow
return False,'用戶不存在!'
3、凍結用戶功能
#凍結用戶
def lock_user():
while True:
name = input('請您輸入要凍結的賬號名').strip()
#呼叫凍結用戶介面
flag,msg = admin_interface.lock_user_interface(name)
if flag:
print(msg)
break
print(msg)
凍結用戶介面
#凍結用戶
def lock_user_interface(name):
#拿到用戶資訊字典
user_dic = db_handler.select(name)
if user_dic:
#locked:用于記錄用戶是否被凍結
# False: 未凍結 True: 已被凍結
user_dic['locked'] = 'True'
#記錄日志
msg =f'用戶{name}被凍結!'
admin_logger.info(msg)
#保存資料
db_handler.save(user_dic)
return True,msg
return False,'用戶不存在!'
六、演示視頻
ps:ATM+購物車專案壓縮包私我
ATM+購物車
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/243559.html
標籤:其他
上一篇:作業五年經驗總結
下一篇:DVWA+Xampp靶機搭建
