ATM+购物车
目录
- 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