ATM+购物车
ATM购物车
一、一个项目是如何从无到有的
1.需求分析
注册,登陆,查看余额,支付,购物车,
提现,还款,转账,查看流水,注销,管理员,
查看购物车,登陆认证装饰器, 密码加密
2.程序的架构设计
三层架构:
用户功能层: 接收用户输入的内容,展示给用户的内容. 小的逻辑判断,例如两次密码是否一致.
接口层: 处理业务逻辑.
数据处理层: 对数据进行增删查改.
3.分任务开发
4.测试
5.上线运行
二、项目需求
1.注册
2.登录
3.转账
4.查询余额
5.还款
6.取款
7.查看流水
8.购物
9.查看购买商品
10.管理员
q.注销
需要登录认证装饰器
管理员:冻结、解冻用户
三、项目开发
random.txt 项目说明文件
ATM + 购物车
前戏: 一个项目是如何从无到有的.
一 需求分析
对项目需求进行分析,并提取出相应的功能.
- 额度15000或自定义 ---> 注册功能
- 实现购物商城,买东西加入购物车,调用信用卡接口结账 ---> 购物车, 支付功能
- 可以提现,手续费5% ---> 提现
- 支持多账户登录 ---> 登陆
- 支持账户间转账 ---> 转账
- 记录每月日常消费流水 ---> 记录流水
- 提供还款接口 ---> 还款
- ATM记录操作日志 ---> 日志功能
- 提供管理接口,包括添加账户、用户额度,冻结账户等... ---> 管理员功能
- 用户认证功能 ---> 登陆认证,使用装饰器
二 程序的架构设计
用户功能层:
负责接收用户输入的内容,并返回结果给用户.
做一些小的逻辑判断.
接口层:
处理业务逻辑.
数据处理层:
对文件进行处理.
增,删,查,改操作.
三层架构的好处:
1.代码结构清晰
2.可扩展性强.
3.易维护,管理.
三 分任务开发
- CTO
- 技术总监
- 架构师
- 项目经理
- 普通开发
UI: 用户界面设计师
前端: 网页的开发
后端: 写业务逻辑,写接口
测试: 测试软件
运维: 部署项目.
四 测试
- 手动测试
传统人工去手动测试.
- 自动化测试
通过脚本模拟人的行为,自动化执行测试.
- 黑盒测试:
对用户界面进行测试.
- 白盒测试:
对软件的性能进行测试,例如每分钟能接收多少并发量.
五 上线运行
把测试好的代码交给运维人员, 部署上线.
start.py 项目启动文件
import os
import sys
from core import src
BASE_PATH = os.path.dirname(__file__)
# 添加到环境变量
sys.path.append(BASE_PATH)
if __name__ == '__main__':
src.run()
conf--------setting.py 系统环境变量配置
import os
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DB_PATH = os.path.join(BASE_PATH, 'db')
core------src.py 业务核心逻辑
from interface import user_interface
from interface import bank_interface
from interface import shoping_interface
from lib import common
from interface import admin_interface
import datetime
user_info = {
'user': None
}
def register():
while True:
print("---注册---")
user_name = input('请输入用户名:').strip()
passwd = input('请输入密码:').strip()
passwd_d = input('确认密码:').strip()
# 接口
flat = user_interface.check_user_interface(user_name)
if flat:
print('用户已存在,重新输入!')
continue
elif passwd == passwd_d:
# 接口
user_interface.register_inerface(user_name, passwd)
print('注册成功!')
break
def login():
while True:
print("---登录---")
user = input('输入用户名:').strip()
passwd = input('输入密码:').strip()
flag, msg = user_interface.login_interface(user, passwd)
if flag:
print(msg)
user_info['user'] = user
break
else:
print(msg)
break
@common.outter
def transfer():
while True:
print("---转账---")
to_name = input('输入转账目标用户:')
to_user = user_interface.check_user_interface(to_name)
if to_user:
money = input('请输入转账金额:').strip()
if money.isdigit():
money = int(money)
flaw, msg = bank_interface.transfer_interface(to_name, money, user_info['user'])
if flaw:
print(msg)
break
else:
print(msg)
break
else:
print('输入不正确!!')
continue
else:
print('用户不存在,重新输入!')
continue
@common.outter
def check_balance():
print("---查询余额---")
bank_interface.select_money(user_info['user'])
@common.outter
def repayment():
print("---还款---")
money = input('输入还款金额:').strip()
if money.isdigit():
money = int(money)
bank_interface.repayment_interface(user_info['user'], money)
else:
print('输入不正确!')
@common.outter
def withdraw_money():
print("---取款---")
money = input('输入取款金额:').strip()
if money.isdigit():
money = int(money)
if money >= 0:
bank_interface.withdraw_interface(user_info['user'], money)
else:
print('必须大于0')
else:
print("输入不正确!")
@common.outter
def view_pipelining():
print("---查看流水---")
bank_interface.see_worter_interface(user_info['user'])
@common.outter
def shopping():
# 购买过的商品
pay_list = []
num_money = 0
while True:
print("---购物---")
shopping_list = [
['QBZ95自动步枪', 999],
['M4A1', 999],
['手雷', 99],
['防弹衣', 299],
['尼泊尔军刀', 199],
['坦克', 5000000],
['神秘武器VIP', 1000000]
]
# 打印商品列表
for index, i in enumerate(shopping_list):
print(index, i)
print('q.退出 w.结账 e.查看已选商品')
choice = input('请快速配置你的装备:').strip()
if choice == 'q':
break
elif choice == 'w':
yes = input('是否结账?y/n:')
if yes == 'y':
# 调用接口结账
bank_interface.payment(num_money, user_info['user'])
# 调用接口保存购买商品
shoping_interface.save_car(pay_list, user_info['user'])
break
elif yes == 'n':
continue
elif choice == 'e':
print('---已选商品---')
for index, i in enumerate(pay_list):
print(index, i)
continue
# 1.判断输入是否为数字
if not choice.isdigit():
print('输入不合法!!!你还有两次机会')
continue
# 2.输入的为字符串,转成int数字型
choice = int(choice)
# 3.判断选择是否再范围内
if 0 <= choice <= len(shopping_list):
name, money = shopping_list[choice]
# 4.添加到已选商品
now_time = datetime.datetime.today()
now_time = str(now_time)
# 时间处理操作 2019-11-21 18:45:18.803910 处理为2019-11-21 18:45:18
now_time = now_time[0:19]
# 添加时间
shopping_list[choice].append(now_time)
pay_list.append(shopping_list[choice])
# 计价
num_money += money
print('添加成功')
continue
else:
print('请选择正确的范围!!!')
continue
@common.outter
def shopping_cat():
while True:
print("---查看购买商品---")
shoping_interface.select_car(user_info['user'])
break
def admin():
while True:
print('''
1:冻结用户
2:解冻用户
q:退出
''')
dict = {
'1': lock,
'2': unlock
}
choice = input('请输入你的功能:').strip()
if choice == 'q':
break
elif not choice.isdigit():
print('请输入数字!!')
continue
elif choice in dict:
dict[choice]()
else:
print("你的输入有误,重新输入!!!")
continue
def lock():
print('---冻结用户---')
user_name = input('请输入你要冻结的用户名:').strip()
yes = input('确认冻结该用户? y/n:')
if yes == 'y':
res = admin_interface.lock_interface(user_name)
print(res)
elif yes == 'n':
print('已取消冻结!')
else:
print('输入有误,重新输入!')
def unlock():
print('---解冻用户---')
user_name = input('请输入你要解冻的用户名:').strip()
yes = input('确认解冻该用户? y/n:')
if yes == 'y':
res = admin_interface.unlock_interface(user_name)
print(res)
elif yes == 'n':
print('已取消解冻!')
else:
print('输入有误,重新输入!')
def run():
while True:
print('''
1.注册
2.登录
3.转账
4.查询余额
5.还款
6.取款
7.查看流水
8.购物
9.查看购买商品
10.管理员
q.注销
''')
list_dic = {
'1': register,
'2': login,
'3': transfer,
'4': check_balance,
'5': repayment,
'6': withdraw_money,
'7': view_pipelining,
'8': shopping,
'9': shopping_cat,
'10': admin
}
choice = input('前选择功能编号:').strip()
if choice == 'q':
break
elif choice in list_dic:
list_dic.get(choice)()
else:
print('选择功能有误,请重新输入:')
continue
db-----db_hander.py 真实数据层
from conf import setting
import os
import json
def select_user(user):
user_path = f'{setting.DB_PATH}/{user}.json'
if os.path.exists(user_path):
with open(user_path,'r',encoding='utf-8')as f:
user_dict = json.load(f)
return user_dict
else:
return False
def save(user_dict):
# 路径
user_path = f'{setting.DB_PATH}/{user_dict["user"]}.json'
# 保存
with open(user_path, 'w', encoding='utf-8')as f:
json.dump(user_dict, f, ensure_ascii=False)
f.flush()
interface-----admin_interface.py 管理员接口
from db import db_hander
# 冻结用户
def lock_interface(user_name):
user_dict = db_hander.select_user(user_name)
if user_dict:
user_dict['lock'] = False
# 保存更新
db_hander.save(user_dict)
return '已冻结!'
else:
return '不存在该用户,重新输入!'
# 解冻用户
def unlock_interface(user_name):
user_dict = db_hander.select_user(user_name)
if user_dict:
user_dict['lock'] = True
# 保存更新
db_hander.save(user_dict)
return '已解冻!'
else:
return '不存在该用户,重新输入!'
interface----bank_interface.py 银行接口
from db import db_hander
import datetime
# 转账接口
def transfer_interface(to_name, money, user):
to_user_dict = db_hander.select_user(to_name)
user_dict = db_hander.select_user(user)
if to_name != user:
# 判断转账的钱是否大于余额
if 0 <= money <= user_dict['balance']:
# 加减钱的操作
user_dict['balance'] -= money
to_user_dict['balance'] += money
# 拼接
my = user_dict['balance']
to = to_user_dict['balance']
time = datetime.datetime.today()
msg = f'【{user}】用户给【{to_name}】用户转账【{money}】元,当前余额【{my}】元 {time}'
flg = f'【{to_name}】用户给收到【{user}】用户转账【{money}】元,当前余额【{to}】元 {time}'
# 添加到流水信息
user_dict['worter'].append(msg)
to_user_dict['worter'].append(flg)
# 保存数据
db_hander.save(user_dict)
db_hander.save(to_user_dict)
return True, msg
else:
msg = '余额不足'
return False, msg
else:
return False, '不允许给自己账户转账!'
# 查看余额
def select_money(user):
user_dict = db_hander.select_user(user)
money = user_dict['balance']
return print('当前余额为【%s】元' % money)
# 还款接口
def repayment_interface(user, money):
user_dict = db_hander.select_user(user)
# 加钱操作
user_dict['balance'] += money
a = user_dict['balance']
time = datetime.datetime.today()
msg = f'【{user}】用户还款【{money}】元成功,当前余额【{a}】元 {time}'
# 添加到流水信息
user_dict['worter'].append(msg)
# 保存更新
db_hander.save(user_dict)
return print(msg)
# 取款接口
def withdraw_interface(user, money):
while True:
user_dict = db_hander.select_user(user)
# 判断余额是否足够
if money <= user_dict['balance']*1.05:
# 减钱操作,手续费
money_s = money*0.05
user_dict['balance'] -= money*1.05
a = user_dict['balance']
time = datetime.datetime.today()
msg = f'【{user}】用户取款【{money}】元成功,手续费5%【{money_s}】元,当前余额【{a}】元 {time}'
# 添加到流水信息
user_dict['worter'].append(msg)
# 保存更新
db_hander.save(user_dict)
return print(msg)
else:
print('余额不足!!')
break
# 查看流水
def see_worter_interface(user):
user_dict = db_hander.select_user(user)
worter = user_dict['worter']
for i in worter:
print(i)
# 结账接口
def payment(num_money,user):
while True:
user_dict = db_hander.select_user(user)
if num_money <= user_dict['balance']:
# 减钱的操作
user_dict['balance'] -= num_money
a = user_dict['balance']
time = datetime.datetime.today()
msg = f'【{user}】用户购买商品成功,消费【{num_money}】元,当前余额【{a}】元 {time}'
# 记录流水
user_dict['worter'].append(msg)
# 保存信息
db_hander.save(user_dict)
print(msg)
break
else:
print('余额不足,请充值!!!')
break
interface----shoping_interface.py 购物接口
from db import db_hander
# 保存购物车
def save_car(shopping_list, user):
user_dict = db_hander.select_user(user)
# 添加到字典
user_dict['shop_car'].append(shopping_list)
# 保存
db_hander.save(user_dict)
# 查看购物车
def select_car(user):
user_dict = db_hander.select_user(user)
car_list = user_dict['shop_car']
# for index, i in enumerate(car_list):
# print(index, i)
for line in car_list:
for index, i in enumerate(line):
print(index, i)
interface----user_interface.py 用户接口
from db import db_hander
from lib import common
# 查看用户是否存在接口,存在返回Turn和字典,不存在返回False
def check_user_interface(user):
user_dict = db_hander.select_user(user)
if user_dict:
return user_dict
else:
return False
# 注册接口
def register_inerface(user, passwd):
# 调用接口,加密
pwd = common.get_md5(passwd)
# 把用户所有信息做成一个字典,然后调用接口保存
user_dict = {
'user': user,
'pwd': pwd,
'balance': 10000,
'worter': [],
'shop_car': [],
'lock': True
}
db_hander.save(user_dict)
return f'{user_dict["user"]}用户注册成功!'
# 登录接口
def login_interface(user, passwd):
user_dict = db_hander.select_user(user)
passwd = common.get_md5(passwd)
# 如果用户存在
if user_dict:
# 如果用户没有被锁
if user_dict['lock'] == True:
# 如果密码正确
if passwd == user_dict['pwd']:
return True, '登录成功!'
else:
return False, '用户名或密码不正确,重新输入!'
else:
return False, '用户已被解冻,请联系管理员!'
else:
return False, '用户名或密码不正确,重新输入!'
lib----common.py 公共功能
import hashlib
from core import src
def get_md5(pwd):
val = '辜氏家族终极密码'
md5 = hashlib.md5()
md5.update(val.encode('utf-8'))
md5.update(pwd.encode('utf-8'))
res = md5.hexdigest()
return res
def outter(func):
def inner(*args, **kwargs):
while True:
if src.user_info['user']:
res = func(*args, **kwargs)
return res
else:
print('请先登录!')
break
return inner
选择了IT,必定终身学习