需求分析

  • 登录注册功能
  • 管理员功能(删除用户、拉黑用户等)
  • 购物功能
  • 银行功能

架构设计

编程语言:python

界面显示:控制台

数据库:文本文件

框架:无

功能实现

搭建文件目录

  • conf存放配置文件
  • core为表现层,展示给用户的界面
  • db存储数据,为数据访问层,访问数据用
  • interface为业务逻辑层,存放核心代码
  • lib存放公共功能模块
  • log存放日志文件,记录日志
  • run.py为启动文件

conf配置文件夹

db_path.py提供存放用户数据和商品信息的路径

db_path.py
import os

# 获取ATM路径
path = os.path.dirname(os.path.dirname(__file__))
DB_PATH = os.path.join(path, 'db')
if not os.path.exists(DB_PATH):
os.mkdir(DB_PATH)
# user文件夹路径
USER_PATH = os.path.join(DB_PATH, 'user')
# product文件夹路径
PRODUCT_PATH = os.path.join(DB_PATH, 'product') if not os.path.exists(USER_PATH):
os.mkdir(DB_PATH)
if not os.path.exists(PRODUCT_PATH):
os.mkdir(DB_PATH) if __name__ == '__main__':
print(USER_PATH)
print(PRODUCT_PATH)

log_dict.py提供日志字典

log_dict.py
import os
# 自动创建log文件夹
log_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'log')
if not os.path.isdir(log_path):
os.mkdir(log_path) # 自定义文件路径
logfile_path = os.path.join(log_path, 'log.log') # 定义复杂的日志输出格式, 其中name为getlogger指定的名字
standard_format = '%(levelname)s :%(asctime)s - %(name)s - %(filename)s: %(message)s' # 配置日志字典
LOG_DICT = {
'version': 1, # 不用管
'disable_existing_loggers': False, # 不用管
'formatters': { # 绑定输出格式
'standard': {
'format': standard_format # 绑定复杂的输出格式
},
},
'filters': {}, # 过滤日志 不用管
'handlers': { # 配置输出日志位置
'default': { # 打印到文件的日志
'level': 'DEBUG', # 定义日志可以输出的等级
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard', # 绑定的输出格式
'filename': logfile_path, # 输出的路径
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
'backupCount': 5, # 日志个数,5个
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置
# 当键不存在的情况下(也就是key设为空字符串),默认都会使用该k:v配置
# loggers配置中使用空字符串作为字典的键,兼容性最好
'': { # 可以当作是日志输出的分类信息
'handlers': ['default'], # log数据写入文件
'level': 'DEBUG', # 定义日志可以输出的等级
'propagate': True, # 向上(更高level的logger)传递
},
},
}

lib公共功能文件夹

encrypt.py提供加密功能

encrypt.py
import hashlib

def encrypt(data):
md5 = hashlib.md5()
md5.update(data.encode('utf8'))
return md5.hexdigest() if __name__ == '__main__':
print(encrypt('123'))

get_logger.py提供日志logger对象,用于输出日志

get_logger.py
import logging.config
from conf import log_dict def get_logger(msg):
logging.config.dictConfig(log_dict.LOG_DICT) # 自动加载字典中的配置
# 自定义分类信息会传给日志字典中'logger'中的空字符串
logger1 = logging.getLogger(msg)
# 输出到日志的信息
return logger1

time_print.py提供了根据时间的不同输出内容不同的功能

time_print.py
import time

def time_print(username):
import time
hour = time.localtime()[3] if hour < 5:
print(f'凌晨好, {username}')
elif hour < 8:
print(f'早晨好, {username}')
elif hour < 11:
print(f'上午好, {username}')
elif hour < 13:
print(f'中午好, {username}')
elif hour < 17:
print(f'下午好, {username}')
elif hour < 19:
print(f'傍晚好, {username}')
elif hour < 24:
print(f'晚上好, {username}') if __name__ == '__main__':
time_print(1)

db数据文件夹

user文件夹存放用户数据,product文件夹存放商品数据

db_handler.py提供了数据的增删改查功能

db_handler.py
import json
import os
from conf import db_path # 根据用户名获取用户数据
def get_user_data(username):
# 获取ATM下的db文件的user文件夹
user_path = os.path.join(db_path.USER_PATH, '%s.txt' % username)
# 如果用户名不存在
if not os.path.isfile(user_path):
return False
with open(user_path, 'r', encoding='utf8') as f:
user_dict = json.load(f)
return user_dict # 更新用户数据
def update_user_data(user_dict):
username = user_dict['username']
# 获取ATM下的db文件的user文件夹
user_path = os.path.join(db_path.USER_PATH, '%s.txt' % username)
with open(user_path, 'w', encoding='utf8') as f:
json.dump(user_dict, f, ensure_ascii=False)
return # 删除用户数据
def remove_user_data(username):
# 获取ATM下的db文件的user文件夹
user_path = os.path.join(db_path.USER_PATH, '%s.txt' % username)
if os.path.isfile(user_path):
os.remove(user_path)
return True
return False # 获取所有用户字典
def select_all_user():
# 获取用户名的文本文件
user_file_list = os.listdir(db_path.USER_PATH)
# 获取用户名的名字
user_list = [user.split('.txt')[0] for user in user_file_list]
return user_list # 获取商品信息
def select_product():
# 商品信息路径
product_path = os.path.join(db_path.PRODUCT_PATH, 'product.txt')
# 获取商品信息
with open(product_path, 'r', encoding='utf8') as f:
product_list = json.load(f)
return product_list if __name__ == '__main__':
print(select_all_user())

interface业务逻辑层文件夹

user_interface.py提供了登录和注册接口

user_interface.py
from db import db_handler
from lib import encrypt, get_logger # 注册接口
def register_interface(username, password):
# 判断用户名和密码是否符合条件
if username == '' or password == '':
return False, "用户名或密码不能为空!请重新输入..."
elif db_handler.get_user_data(username):
return False, "用户名已存在!请重新输入..."
password = encrypt.encrypt(password)
# 创建用户对应的文本文件
temp_dict = {'administrator': 0, 'black': 0,
'username': username, 'password': password,
'store': {'money': 1000, 'shopping': {}},
'ATM': {'money': 1000, 'bill': []}
}
db_handler.update_user_data(temp_dict)
logger = get_logger.get_logger('用户注册记录')
logger.info('%s成功注册!!' % username)
return True, "用户:%s注册成功!" % username # 登录接口
def login_interface(username, password):
# 判断用户名和密码是否符合条件
if username == '' or password == '':
return False, "用户名或密码不能为空!请重新输入..."
elif not db_handler.get_user_data(username):
return False, "用户名不存在!请重新输入..."
password = encrypt.encrypt(password)
# 创建用户对应的文本文件
user_dict = db_handler.get_user_data(username)
if user_dict['black']:
return False, "你已被拉黑,无法登录!"
if username == user_dict['username'] and password == user_dict['password']:
logger = get_logger.get_logger('用户登录记录')
logger.info('%s成功登录!!' % username)
return True, "用户:%s登录成功!" % username
else:
return False, "用户名或密码错误!请重新输入..." if __name__ == '__main__':
register_interface('asd', '123')

administrator_interface.py提供了管理员操作的接口

administrator_interface.py
from db import db_handler

# 判断用户的管理员权限
def check_administrator_interface(username):
user_dict = db_handler.get_user_data(username)
if user_dict:
if user_dict['administrator']:
return True # 获取所有用户名
def select_user_interface():
# 获取用户名的名字
user_list = db_handler.select_all_user()
temp_dict = {}
for user in user_list:
user_dict = db_handler.get_user_data(user)
if user_dict['administrator'] == 1:
temp_dict[user] = ['管理员', user_dict['black']]
else:
temp_dict[user] = ['普通用户', user_dict['black']] return temp_dict # 删除用户
def remove_user_interface(username):
return db_handler.remove_user_data(username) # 拉黑用户
def black_user_interface(username):
user_dict = db_handler.get_user_data(username)
if user_dict:
user_dict['black'] = 1
db_handler.update_user_data(user_dict)
return True # 拉白用户
def white_user_interface(username):
user_dict = db_handler.get_user_data(username)
if user_dict:
user_dict['black'] = 0
db_handler.update_user_data(user_dict)
return True

bank_interface.py提供了银行操作的接口

bank_interface.py
from db import db_handler

# 查询atm余额
def look_money_interface(username):
user_dict = db_handler.get_user_data(username)
return user_dict['ATM']['money'] # 查询用户是否存在的接口
def check_user_interface(username):
if db_handler.get_user_data(username):
return True # 转账
def transfer_accounts(gived_name, received_name, transfer_money):
if received_name == gived_name:
return False, '不能给自己转账!'
# 判断存不存在此用户
if not db_handler.get_user_data(received_name):
return False, '用户不存在!请重新输入...'
# 判断是否纯数字
if not transfer_money.isdigit():
return False, '输入格式错误!'
# 字符串转整型
transfer_money = int(transfer_money)
# 获取用户数据
gived_user_dict = db_handler.get_user_data(gived_name)
received_user_dict = db_handler.get_user_data(received_name)
# 判断转账的金额是否超出了转账方的余额
if transfer_money > gived_user_dict['ATM']['money']:
return False, '余额不足,转账失败!'
# 修改双方数据
gived_user_dict['ATM']['money'] -= transfer_money
received_user_dict['ATM']['money'] += transfer_money
# 获取当前时间
import time
t = time.strftime("%Y-%m-%d %X")
# 添加账单
gived_user_dict['ATM']['bill'].append(f'{t} 你转给了{received_name}金额{transfer_money}')
received_user_dict['ATM']['bill'].append(f'{t} 收到了来自{gived_name}的转账{transfer_money}')
# 更新双方数据
db_handler.update_user_data(gived_user_dict)
db_handler.update_user_data(received_user_dict)
return True, gived_user_dict['ATM']['money'] # 账单
def select_bill(username):
user_dict = db_handler.get_user_data(username)
return user_dict['ATM']['bill'] # 充值
def put_money_interface(username, money):
user_dict = db_handler.get_user_data(username)
money = int(money)
user_dict['ATM']['money'] += money
import time
t = time.strftime("%Y-%m-%d %X")
user_dict['ATM']['bill'].append(f'{t} 你充值了{money}')
db_handler.update_user_data(user_dict)
return user_dict['ATM']['money']

shopping_interface.py提供了购物操作的接口

shopping_interface.py
from db import db_handler

# 获取商品信息接口
def select_product_interface():
return db_handler.select_product() # 查询购物车接口
def select_shopping_car_interface(username):
user_dict = db_handler.get_user_data(username)
shopping_car_dict = user_dict['store']['shopping']
return shopping_car_dict # 更新购物车接口
def update_shopping_car_interface(username, shopping_car_dict):
user_dict = db_handler.get_user_data(username)
user_dict['store']['shopping'] = shopping_car_dict
db_handler.update_user_data(user_dict)
return True # 结算购物车
def clear_shopping_car_interface(username, total_money):
user_dict = db_handler.get_user_data(username)
# 余额
user_money = user_dict['store']['money']
if user_money >= total_money:
user_dict['store']['shopping'] = {}
user_dict['store']['money'] -= total_money
db_handler.update_user_data(user_dict)
return True, user_dict['store']['money']
return False, False # 获取用户余额
def get_user_shopping_money_interface(username):
user_dict = db_handler.get_user_data(username)
return user_dict['store']['money'] # 充值购物卡
def put_money_in_shopping_interface(username, money):
user_dict = db_handler.get_user_data(username)
# 判断银行卡余额是否足够
if money > user_dict['ATM']['money']:
return False, False, False
# 修改数据
user_dict['store']['money'] += money
user_dict['ATM']['money'] -= money
# 获取当前时间
import time
t = time.strftime("%Y-%m-%d %X")
user_dict['ATM']['bill'].append(f'{t} 向购物卡中充值了{money}')
db_handler.update_user_data(user_dict)
return True, user_dict['store']['money'], user_dict['ATM']['money'] # 提现购物卡
def get_money_in_shopping_interface(username, money):
user_dict = db_handler.get_user_data(username)
# 判断购物卡余额是否足够
if money > user_dict['store']['money']:
return False, False, False
# 修改数据
user_dict['store']['money'] -= money
user_dict['ATM']['money'] += money
# 获取当前时间
import time
t = time.strftime("%Y-%m-%d %X")
user_dict['ATM']['bill'].append(f'{t} 向购物卡中充值了{money}')
db_handler.update_user_data(user_dict)
return True, user_dict['store']['money'], user_dict['ATM']['money']

core表现层文件夹

user.py展示登录注册功能

user.py
from interface import user_interface

def user_login():
username = input('请输入用户名(输入q退出登录):').strip()
# 输入q则退出
if username == 'q':
print()
print("已退出登录".center(30, '-'))
print()
return 'q'
password = input('请输入密码:').strip() flag, msg = user_interface.login_interface(username, password)
if flag:
print()
print(msg.center(30, '-'))
print()
return username
else:
print()
print(msg.center(30, '-'))
print()
return def user_register():
username = input('请输入用户名(输入q退出注册):').strip()
# 输入q则退出
if username == 'q':
print()
print("已退出注册".center(30, '-'))
print()
return 'q'
password = input('请输入密码:').strip()
flag, msg = user_interface.register_interface(username, password)
if flag:
print()
print(msg.center(30, '-'))
print("已自动登录!".center(30, '-'))
print()
return username
else:
print()
print(msg.center(30, '-'))
print() def register():
while True:
res = user_register()
if res == 'q':
return None
elif res:
return res def login():
while True:
res = user_login()
if res == 'q':
return None
elif res:
return res if __name__ == '__main__':
register()

shopping.py展示购物功能

shopping.py
from interface import shopping_interface
from lib.time_print import time_print def shopping():
from core.src import logged_user_name
# 获取商品信息
product_list = shopping_interface.select_product_interface() # 获取所有商品信息
def select_product():
print()
print('序号'.ljust(3, chr(12288)) +
'商品名称'.ljust(10, chr(12288)) +
'商品单价'.ljust(6, chr(12288))) for i, product in enumerate(product_list, 1):
print(str(i).ljust(3, chr(12288)) + chr(12288) +
product[0].ljust(10, chr(12288)) +
str(product[1]).ljust(6, chr(12288)))
print() # 逛商品
def go_shopping():
select_product()
# 获取购物车内容,临时存储
temp_shopping_dict = shopping_interface.select_shopping_car_interface(logged_user_name)
while True:
get_product_id = input('请选择你要购买的商品序号(输入q结束购物, 输入ls查看商品):').strip()
if get_product_id == 'q':
# 更新购物车
shopping_interface.update_shopping_car_interface(logged_user_name, temp_shopping_dict)
print('已返回初始界面!'.center(30, '-'))
print()
return
if get_product_id == 'ls':
select_product()
continue
get_num = input('请输入你要购买的数量:').strip()
# 判断输入是否是纯数字
if not get_product_id.isdigit() or not get_num.isdigit():
print('输入的格式不正确!'.center(30, '-'))
print()
continue
get_product_id = int(get_product_id) - 1
get_num = int(get_num)
# 判断商品是否存在
if get_product_id in range(len(product_list)):
# product_list: [["挂壁面", 3], ["印度飞饼", 22]]
product_name = product_list[get_product_id][0]
product_price = product_list[get_product_id][1]
# 判断购物车是否有了这个商品
if product_name in temp_shopping_dict:
temp_shopping_dict[product_name][1] += get_num
else:
temp_shopping_dict[product_name] = [product_price, get_num]
print('添加商品成功!'.center(30, '-'))
print()
else:
print('所选的商品不存在!'.center(30, '-'))
print() # 查询购物车
def select_shopping_car():
# 总金额
total_money = 0
# 获取用户购物车数据
temp_shopping_dict = shopping_interface.select_shopping_car_interface(logged_user_name)
print()
print('你的购物车'.center(30, '-'))
print('商品名称'.ljust(10, chr(12288)) +
'商品数量'.ljust(6, chr(12288)) +
'商品单价'.ljust(6, chr(12288))) # temp_shopping_dict:{'挂壁面': [3, 15], '仿真玩偶': [10000, 1]}
for i in temp_shopping_dict:
# 商品名称
product_name = i
# 商品数量
product_num = temp_shopping_dict[product_name][1]
# 商品单价
product_price = temp_shopping_dict[product_name][0]
# 购物车总金额
total_money += product_num * product_price
print(product_name.ljust(11, chr(12288)) +
str(product_num).ljust(9, ' ') +
str(product_price))
print('总计\t%d'.center(30, '-') % total_money)
print()
return temp_shopping_dict, total_money # 支付购物车
def look_shopping_cart():
# 获取购物车数据和总价格
temp_shopping_dict, total_money = select_shopping_car() while True:
get_is_clear = input('是否支付(y/n)?:').strip()
if get_is_clear == 'y':
flag, money = shopping_interface.clear_shopping_car_interface(logged_user_name, total_money)
if not flag:
print('抱歉!你的余额不足!'.center(30, '-'))
print('已退出购物车!'.center(30, '-'))
print()
return
else:
print('感谢惠顾!你的余额还有:%d'.center(30, '-') % money)
print()
return
elif get_is_clear == 'n':
print('已退出购物车!'.center(30, '-'))
print()
return
else:
print('请输入正确的指令!'.center(30, '-'))
print() # 查询金额
def get_money():
money = shopping_interface.get_user_shopping_money_interface(logged_user_name)
print()
print('你的所剩余额:%d'.center(30, '-') % money)
print() # 修改购物车
def change_shopping_cart():
print()
print('修改购物车'.center(30, '-'))
temp_shopping_dict, total_money = select_shopping_car() while True:
# 获取用户输入
product_name_input = input('请输入你要修改的商品名称(输入q退出修改):').strip()
if product_name_input == 'q':
print('已退出修改!'.center(30, '-'))
print()
return
product_num_input = input('请输入修改后的商品数量:').strip() # 判断输入是否正确
if not product_num_input.isdigit() or product_name_input == '':
print('输入格式错误!'.center(30, '-'))
print()
continue
elif product_name_input not in temp_shopping_dict:
print('你输入的商品不存在!'.center(30, '-'))
print()
continue # 修改商品数量
temp_shopping_dict[product_name_input][1] = int(product_num_input)
print('修改成功!'.center(30, '-'))
print() cmd = input('是否继续修改(y/n)?:')
if cmd == 'y':
continue
elif cmd == 'n':
shopping_interface.update_shopping_car_interface(logged_user_name, temp_shopping_dict)
print('已退出修改!'.center(30, '-'))
print()
return
else:
print('请输入正确的指令!'.center(30, '-'))
print() # 充值金额
def put_money():
print()
print('充值界面'.center(30, '-'))
while True:
get_input_money = input('请输入要充值的金额(输入q退出充值):').strip()
# 判断是否要退出
if get_input_money == 'q':
print('已退出充值!'.center(30, '-'))
print()
break
# 判断是否是纯数字
if not get_input_money.isdigit():
print('输入格式错误!'.center(30, '-'))
print()
continue
# 字符串转整型
get_input_money = int(get_input_money)
flag, shopping_money, atm_money = shopping_interface.put_money_in_shopping_interface(logged_user_name,
get_input_money)
if flag:
print('充值成功!目前购物余额:%d,银行卡余额:%d'.center(30, '-') % (shopping_money, atm_money))
print('已退出充值!'.center(30, '-'))
print()
break
print('抱歉!你的银行卡余额不足!'.center(30, '-'))
print() # 提现到银行卡
def out_to_bank():
print()
print('提现界面'.center(30, '-'))
while True:
get_output_money = input('请输入要提现的金额(输入q退出提现):').strip()
# 判断是否要退出
if get_output_money == 'q':
print('已退出提现!'.center(30, '-'))
print()
break
# 判断是否是纯数字
if not get_output_money.isdigit():
print('输入格式错误!'.center(30, '-'))
print()
continue # 字符串转整型
get_output_money = int(get_output_money)
flag, shopping_money, atm_money = shopping_interface.get_money_in_shopping_interface(logged_user_name,
get_output_money)
# 判断购物卡余额是否足够
if flag:
print('提现成功!目前购物余额:%d,银行卡余额:%d'.center(30, '-') % (shopping_money, atm_money))
print('已退出提现!'.center(30, '-'))
print()
break
print('抱歉!你的购物卡余额不足!'.center(30, '-'))
print() # 初始化
def init():
print()
time_print(logged_user_name)
print("功能列表".center(15, '*'))
print(" 1.浏览商品")
print(" 2.查看并支付购物车")
print(" 3.修改购物车")
print(" 4.查询金额")
print(" 5.从银行卡充值金额")
print(" 6.提现到银行卡")
print(" 7.退出逛商品")
print("".center(18, '*'))
print() def quit_system():
print()
print("欢迎下次光临!".center(30, '-'))
print()
return 'quit' # 功能字典
function_dict = {
'ls': init,
'1': go_shopping,
'2': look_shopping_cart,
'3': change_shopping_cart,
'4': get_money,
'5': put_money,
'6': out_to_bank,
'7': quit_system,
}
init()
while True:
choice = input('请输入你想要执行的功能(输入ls查看功能列表):')
if choice in function_dict:
if function_dict[choice]() == 'quit':
break
else:
print('请输入正确指令!'.center(30, '-'))
print() if __name__ == '__main__':
shopping()

bank.py展示银行功能

bank.py
from interface import bank_interface
from lib.time_print import time_print def bank():
from core.src import logged_user_name # 初始化
def init():
print()
time_print(logged_user_name)
print("功能列表".center(15, '*'))
print(" 1.查询金额")
print(" 2.转账")
print(" 3.查看账单")
print(" 4.充值")
print(" 5.退出银行")
print("".center(18, '*'))
print() def quit_system():
print("欢迎下次光临!".center(30, '-'))
print()
return 'quit' # 查询金额
def look_money():
money = bank_interface.look_money_interface(logged_user_name)
print()
print('你的所剩余额:%d'.center(30, '-') % money)
print() # 转账
def transfer_accounts():
print()
print('转账界面'.center(30, '-'))
while True:
receive_user = input('请输入收账用户(输入q退出转账):').strip()
if receive_user == 'q':
print()
print('已退出转账'.center(30, '-'))
print()
break
transfer_money = input('请输入转账金额:').strip()
flag, msg = bank_interface.transfer_accounts(logged_user_name, receive_user, transfer_money)
if flag:
print()
print('转账成功!你目前余额:%d'.center(30, '-') % msg)
print('已退出转账'.center(30, '-'))
print()
break
else:
print()
print(msg.center(30, '-'))
print() # 查看账单
def look_bill():
bill_list = bank_interface.select_bill(logged_user_name)
print()
print('账单'.center(30, '-'))
for i in bill_list:
print(i)
print(''.center(35, '-'))
print() # 充值
def put_money():
print()
print('充值界面'.center(30, '-'))
while True:
money = input('请输入你要充值的金额(输入q退出充值):').strip()
if money == 'q':
print()
print('已退出充值!'.center(30, '-'))
print()
break
elif not money.isdigit():
print()
print('输入格式错误!'.center(30, '-'))
print()
continue
atm_money = bank_interface.put_money_interface(logged_user_name, money)
print()
print('充值成功!你的目前余额:%d'.center(30, '-') % atm_money)
print() # 功能字典
bank_function_dict = {
'ls': init,
'1': look_money,
'2': transfer_accounts,
'3': look_bill,
'4': put_money,
'5': quit_system,
}
init()
while True:
choice = input('请输入你想要执行的功能(输入ls查看功能列表):')
if choice in bank_function_dict:
if bank_function_dict[choice]() == 'quit':
break
else:
print('请输入正确指令!'.center(30, '-'))
print() if __name__ == '__main__':
bank()

administrator.py展示管理员功能

administrator.py
from lib.time_print import time_print
from interface import administrator_interface def administrator():
from core.src import logged_user_name
if not administrator_interface.check_administrator_interface(logged_user_name):
print()
print('你没有此权限!'.center(30, '-'))
print()
return # 初始化
def init():
print()
time_print(logged_user_name)
print("功能列表".center(15, '*'))
print(" 1.查看现有用户")
print(" 2.删除指定用户")
print(" 3.拉黑指定用户")
print(" 4.拉白指定用户")
print(" 5.退出管理员操作")
print("".center(18, '*'))
print() def quit_system():
print("再见!".center(30, '-'))
print()
return 'quit' # 查看用户
def select_user():
print()
print('用户类别'.center(8, '-') + '用户名'.center(7, '-') + '是否被拉黑'.center(7, '-'))
# 获取业务逻辑层返回值
res_dict = administrator_interface.select_user_interface()
for res in res_dict:
print(' ' + res_dict[res][0].ljust(8, chr(12288)), res.ljust(7, chr(12288)), res_dict[res][1])
print(''.center(20, '-'))
print() # 删除用户
def remove_user():
print()
print('删除用户'.center(30, '-'))
while True:
need_remove_username = input('请输入要删除的用户名(输入q退出):').strip()
# 判断是否输入q
if need_remove_username == 'q':
print('已返回初始界面!'.center(30, '-'))
print()
return
# 如果输入的是自己
if need_remove_username == logged_user_name:
print()
print('无法删除自己'.center(30, '-'))
print()
# 判断存不存在
if administrator_interface.remove_user_interface(need_remove_username):
print()
print('删除成功,已返回初始界面!'.center(30, '-'))
print()
return
print()
print('没有此用户!'.center(30, '-'))
print() # 拉黑用户
def black_user():
print()
print('拉黑用户'.center(30, '-'))
while True:
need_black_username = input('请输入要拉黑的用户名(输入q退出):').strip()
# 判断是否输入q
if need_black_username == 'q':
print('已返回初始界面!'.center(30, '-'))
print()
return
# 如果输入的是自己
if need_black_username == logged_user_name:
print()
print('无法拉黑自己'.center(30, '-'))
print()
# 判断存不存在
if administrator_interface.black_user_interface(need_black_username):
print()
print('拉黑成功,已返回初始界面!'.center(30, '-'))
print()
return
print()
print('没有此用户!'.center(30, '-'))
print() # 拉黑用户
def white_user():
print()
print('拉白用户'.center(30, '-'))
while True:
need_black_username = input('请输入要拉白的用户名(输入q退出):').strip()
# 判断是否输入q
if need_black_username == 'q':
print('已返回初始界面!'.center(30, '-'))
print()
return
# 如果输入的是自己
if need_black_username == logged_user_name:
print()
print('无法拉白自己'.center(30, '-'))
print()
# 判断存不存在
if administrator_interface.white_user_interface(need_black_username):
print()
print('拉白成功,已返回初始界面!'.center(30, '-'))
print()
return
print()
print('没有此用户!'.center(30, '-'))
print() # 功能字典
bank_function_dict = {
'ls': init,
'1': select_user,
'2': remove_user,
'3': black_user,
'4': white_user,
'5': quit_system,
}
init()
while True:
choice = input('请输入你想要执行的功能(输入ls查看功能列表):')
if choice in bank_function_dict:
if bank_function_dict[choice]() == 'quit':
break
else:
print('请输入正确指令!'.center(30, '-'))
print() if __name__ == '__main__':
administrator()

src.py综合了上述展示功能

src.py
logged_user_name = None

# 登录注册装饰器
def login_register(function_name):
def inner(*args, **kwargs):
if logged_user_name:
function_name(*args, **kwargs)
else:
print()
print('你还未登录!'.center(30, '-'))
print() return inner # 系统的功能
def user_system():
from lib.time_print import time_print # 初始化
def init():
print()
if logged_user_name:
time_print(logged_user_name)
print("功能列表".center(17, '*'))
print(" 1.登录")
print(" 2.注册")
print(" 3.去银行")
print(" 4.逛商场")
print(" 5.切换账号")
print(" 6.管理用户(管理员权限)")
print(" 7.退出")
print("".center(18, '*'))
print() # 登录功能
def go_to_login():
global logged_user_name
if logged_user_name:
print()
print('你已经登录过了!'.center(30, '-'))
print()
return
print()
print('登录界面'.center(30, '-'))
print()
from core import user
logged_user_name = user.login() # 注册功能
def go_to_register():
global logged_user_name
print()
print('注册界面'.center(30, '-'))
print()
from core import user
res = user.register()
if res:
logged_user_name = res @login_register
# 去银行
def go_to_bank():
from core import bank
bank.bank() @login_register
# 购物
def go_to_shopping():
from core import shopping
shopping.shopping() @login_register
# 切换账号
def change_user():
global logged_user_name
print()
print('切换账号'.center(30, '-'))
print()
from core import user
res = user.login()
# 判断用户是否切换成功了,防止用户在切换时退出切换账号时返回None
if res:
logged_user_name = res
init() @login_register
# 管理员权限
def go_to_administrator():
from core import administrator
administrator.administrator() # 退出系统
def quit_system():
print('bye')
return 'quit' # 功能字典
function_dict = {
'ls': init,
'1': go_to_login,
'2': go_to_register,
'3': go_to_bank,
'4': go_to_shopping,
'5': change_user,
'6': go_to_administrator,
'7': quit_system,
} while True:
# 先打印以下功能列表
init()
get_choice = input('请输入你要去的地方(输入ls可以查看):')
if get_choice in function_dict:
if function_dict[get_choice]() == 'quit':
break
else:
print()
print('请输入正确的指令!'.center(30, '-'))
print() if __name__ == '__main__':
user_system()

测试

目前管理员账号:'zbh' 密码:'123',想要变成管理员可以到用户文本文件把'administrator'属性改成1

运行run.py文件。

最外层功能(src.py)

运行run.py首先出现的页面

如果这时候还没有登录,就输入3、4、5、6,就会提醒未登录

这时候看不到功能列表了,没关系,输入ls就可以查看功能列表了

先输入2进入注册功能

如果不想注册,可以输入q退出

回到注册页面,输入的账号密码如果有一个为空,或是用户已存在,都会提醒你,注册成功则会帮你自动登录

注意到了吗,你登录后,功能列表会根据时间向你问好。

登录后如果再次输入1,会提醒你

在已登录状态下在去注册一个账号,会顶替掉当前已登录账号

输入5也可以切换账号哦

银行的功能(bank.py)

在最外层的界面输入3就可以来到银行了

输入1查询银行卡余额

输入2可以给其他用户转钱,收账的用户不存在提醒你

如果你转账的钱超出了你的余额,也会提醒你

忘记有哪些功能了?输入ls查看一下

输入3查看一下账单,可以看到我们刚刚转的钱被记录了,在收账方的用户也会有记录

输入4往银行卡里充值,充值完了记得按q退出

输入5从银行卡提点钱出来,提现完了记得按q退出

这时候我们再去看一下账单,输入3

输入6退出银行,再输入ls查看功能

购物功能(shopping.py)

在最外层界面输入4去购物

输入1浏览商品,可以一直添加商品直到输入q退出,格式不对会提醒你

输入ls看一下功能

输入3修改购物车里的商品数量,需要输入商品名称更改(忘记搞序号了),在输入数量就可以修改了,格式不对会提醒你,修改完后你可以选择是否继续修改,输入n回到功能列表界面

回到功能列表界面后输入4查看购物车的余额

输入2查看购物车,并可以自行选择是否结算购物车

这时候我们输入y钱是不够的

输入5从银行卡里拿点钱出来

输入4看一下现在的购物余额

现在可以结算购物车了,输入2,再输入y

这时候购物车就空了

我们把剩下的钱在提现回银行卡,输入6

最后输入7返回最外层的界面

我们输入3到银行再去看一下账单

管理员功能(administrator.py)

由于小功能太多,不想加上添加管理员的功能了,想要变成管理员可以到用户文本文件把'administrator'属性改成1

最外层界面输入6进入管理用户界面,需要管理员权限,权限不够会提醒你

输入1查看用户信息

输入3拉黑用户,用户不存在会提醒你,拉黑自己也会提醒你“不能拉黑自己”

输入1查看一下是否被拉黑了

输入4可以把他从黑名单移除

输入2可以删除用户,移除文本文件

输入5回到最外层界面

结束

完成啦

ATM+购物车项目流程的更多相关文章

  1. 阶段性项目 ATM+购物车项目

    ATM + 购物车https://www.cnblogs.com/kermitjam/articles/10687180.html readme 内容前戏: 一个项目是如何从无到有的. 一 需求分析 ...

  2. ATM + 购物车项目

    ''' 存放配置文件 ''' import os #获取项目根目录 BASE_PATH=os.path.dirname(os.path.dirname(__file__)) #获取用户目录 USER_ ...

  3. ATM购物车+三层结构项目设计

    ATM购物车项目 模拟实现一个ATM + 购物商城程序. 该程序实现普通用户的登录注册.提现充值还款等功能,并且支持到网上商城购物的功能. 账户余额足够支付商品价格时,扣款支付:余额不足时,无法支付, ...

  4. python以ATM+购物车剖析一个项目的由来及流程

    ATM+购物车 一个项目是如何从无到有的 ''' 项目的由来,几个阶段 0.采集项目需求 1.需求分析 2.程序的架构设计 3.分任务开发 4.测试 5.上线运行 ''' 需求分析: # 对项目需求进 ...

  5. ATM购物车程序项目规范(更新到高级版)

    ATM购物车程序(高级版) 之前的低级版本已经删除,现在的内容太多,没时间把内容上传,有时间我会把项目源码奉上! 我已经把整个项目源码传到群文件里了,需要的可以加主页qq群号.同时群内也有免费的学习资 ...

  6. 项目: ATM+购物车

    ATM+购物车 项目文件: 介绍 以下为文件夹层次和内容: readme.md 1. 需求 模拟银行取款 + 购物全过程 1.注册 2.登录 3.提现 4.还款 5.转账 6.查看余额 7.查看购物车 ...

  7. day19 十九、ATM+购物车

    项目:ATM+购物车 作业需求:模拟实现一个ATM + 购物商城程序1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账 ...

  8. Python 入门基础16 -- ATM + 购物车

    ATM + 购物车 1.需求分析 2.设计程序以及程序的架构 设计程序的好处: - 扩展性强 - 逻辑清晰 3.分任务开发 4.测试 黑盒: 白盒: 对程序性能的测试 5.上线运行 # Tank -- ...

  9. Python实战之ATM+购物车

    ATM + 购物车 需求分析 ''' - 额度 15000或自定义 - 实现购物商城,买东西加入 购物车,调用信用卡接口结账 - 可以提现,手续费5% - 支持多账户登录 - 支持账户间转账 - 记录 ...

随机推荐

  1. template7入门教程及对它的一些看法

    template7是framework7的内置模板引擎,在此之前使用过jquery-tmpl,不过刚刚打开github看了下,已经停止更新,并且将要被JsRender所替代.妹的,JsRender又是 ...

  2. 记一次曲折的CVE-2018-1270复现分析

    前言 前两天接到朋友对某个授权目标的漏扫结果,也算是初次接触到这个漏洞,就想着顺手分析一下复现一下,因为分析这个漏洞的文章也比较少,所以刚开始比较迷,进度也比较慢. 漏洞复现 使用vulhub搭建环境 ...

  3. python-模拟页面调度LRU算法

    [题目描述]所谓LRU算法,是指在发生缺页并且没有空闲主存块时,把最近最少使用的页面换出主存块,腾出地方来调入新页面. 问题描述:一进程获得n个主存块的使用权,对于给定的进程访问页面次序,问当采用LR ...

  4. EL表达式详解(常用表达式以及取值)

    EL表达式 学习总结 一. El表达式概念 二. El中的表达式 1. 算术表达式 2. 比较表达式 3. 逻辑表达式 4. 三元表达式 5. 判空表达式 三.EL 从四个作用域中取值 1. 概念 2 ...

  5. CSS简单样式练习(一)

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  6. 小程序预览图片wx.previewImage

    效果图:  ====>   ==>  代码: <image mode='aspectFill' bindtap='previewImage' data-src='{{dataList ...

  7. [ Perl ] 对文本文件进行行列翻转

    https://www.cnblogs.com/yeungchie/ code #!/usr/bin/env perl #----------------------------- # Program ...

  8. Java基础语法02——流程控制

    流程控制:顺序结构.分支结构(if-else.switch-case).循环结构(for.while.do-while)

  9. linux添加磁盘及分区挂载

    磁盘管理 1.为什么要添加磁盘 随着系统的使用,磁盘的内容会越来越少,所以这时要添加磁盘增加空间 Linux系统中磁盘管理就是将硬盘通过挂载的方式挂载到linux文件系统中. 2.系统添加磁盘并分区 ...

  10. Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务

    前言 在实验Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务.多组织共同运行维护Orderer服务中,我们已经完成了让普通组织运行维护 Orderer 服务,但是 ...