ATM项目实现思路:

ATM架构设计
三层架构
core目录下的src.py(浏览器) (展示层)
interface目录下的多个py文件(框架) (核心逻辑层)
db目录下db_handler.py(数据库服务) (数据处理层)



项目路径展示:

bin文件夹:

  • start.py:项目启动

core文件夹:

  • src.py:充当第一层数据展示层

 interface文件夹——负责各功能的逻辑判断:

  • user_interface: 用户注册,用户登录
  • bank_interface:  查看余额,提现,还款,转账,查看流水
  • shop_interface: 添加购物车,查看购物车,结算购物车
  • admin_interface: 冻结账户,删除账户,修改密码,账户充值等

db文件夹:

  • 储存用户数据
  • db_handle:负责数据的保存,数据的查询等

conf文件夹:

  • setting.py:路径配制,日志路径、格式、日志字典配制

lib文件夹:

  • common.py:常用公共功能,如数字加密,装饰器,整数或小数类型判断,日志功能函数等

log文件夹:

  • 记录日志数据

第一层(src.py)项目功能搭建:

def register():
pass def login():
pass def check_balance():
pass def withdraw():
pass def recharge():
pass def transfer():
pass def check_flow():
pass def add_shop_car():
pass def check_shop_car():
pass def pay_shop_car():
pass def admin():
pass func_dict = {
'1': register,
'2': login,
'3': check_balance,
'4': withdraw,
'5': recharge,
'6': transfer,
'7': check_flow,
'8': add_shop_car,
'9': check_shop_car,
'10':pay_shop_car,
'11':admin
} def run():
while True:
print("""
1.注册功能
2.登陆功能
3.查看余额
4.提现功能
5.充值功能
6.转账功能
7.查看流水
8.添加购物车
9.查看购物车
10.结算购物车
11.管理员功能
""") choice_num = input('请输入您要的功能编号>>>:').strip()
if choice_num in func_dict:
func_name = func_dict.get(choice_num)
func_name()
else:
print('您输入的功能编号不存在,请重新输入')

项目启动文件start.py:

项目启动文件start.py可以放在项目根路径,也可以放在bin文件夹下。
该文件首先要做的第一件事就是使用os.path.dirname获取当前项目路径,并将其导入sys.path。
然后就是调用展示层文件src.py。
使用if __name__ == '__main__':标志这个文件是启动文件。

配制文件setting.py

1.配制文件存储路径   
2.设置取款费率
3.日志格式、文件路径、日志字典配制

settings文件中存放的是一些不会变动的信息,如项目的根路径、数据库的路径、日志的存放位置等,这此不会变动的信息,变量名可以采用大写。
   当其他模块要用这些路径的时候的时候,从配置文件导入即可。

注意当数据库db不存在时,settings.py会进行创建,所以在第三层一定要导入settings.py。

公共功能common.py

1.加密
2.校验用户登录状态和管理员装饰器
3.判断输入的数字是否是整数或小数
4.日志功能函数

第一层用户密码需要进行加密,因为其他地方也有可能用到加密操作,所以可的将其封装成函数放入common.py中

判断登录状态和管理员权限的的装饰器可以放在一起,先判断登录状态,通过有参装饰器将普通用户和管理员进行区分,普通用户与管理员设置不同的参数,登录的普通用户可以执行设置normal参数的函数的所有功能,如果想要执行admin管理功能,则还需要判断是否是管理员。

进行取款、充值、转账等功能时,需要输入数字金额,要判断输入的是否是整数或小数,可以通过异常捕获功能来实现。也可以放在common.py中。

不同的功能函数需要记录不同的日志类型,所以需要将实现日志功能的接口包装成一个函数,根据不同日志类型上传不同参数。因为日志的路径、格式、字典都是在配制文件中的,所以需要导入settings模块。

数据层db_handler.py

在用户的注册功能、登录功能,还有银行的消费、充值、取款、转账等等都涉及到数据的增、删、改、查,需要对数据进行读取和重新保存,都是一些重复的操作,所以可以将数据的保存、读取分别设置为相应的函数放到db_handler.py文件中,以后要用到的时候可以直接调用。

数据的保存和查询:

各功能的拆分、模块调用 

接下来我们分功能来介绍一下每个功能下的相关操作是如何通过模块进行调用的。

注册功能:

那我们再来看一下现在第一层的展示层:

登录功能:

与注册功能差不多,都是在第二层完成了用户名和密码的比对,返回给第一层。涉及到后面的管理员权限时,在登录功能这里需要加上一些其他判断,后面再说。

银行功能:

查询余额:

第二层逻辑处理:

  • 读取用户数据文件
  • 获取余额信息
  • 返回给第一层

第一层接受第二层返回的数据值:

取款:

第二层逻辑处理:

  • 调用common模块的整数、小数异常捕获,如果未输入小数或者整数,则提醒输入符合要求的数字
  • 读取用户文件数据,获取余额信息
  • 取款金额与用户余额信息+手续费(在配制文件中设置提现手续费)进行比较,余额充足取款成功之后修改字典余额
  • 添加用户流水信息:包括提现时间,提现金额,手续费
  • 记录日志信息
  • 提现成功返回True,提现失败返回False

 第一层接收返回值:

充值:

第二层逻辑处理:

  • 调用common模块的小数、整数异常捕获,如果未输入符合要求的数字则返回False,并提醒输入符合要求的数字
  • 获取用户字典数据,直接添加充值金额
  • 添加流水记录: 时间,充值金额,当前余额
  • 保存用户数据
  • 记录日志信息
  • 返回第一层

 第一层接受返回值:

转账:

第二层逻辑处理:

  • 拼接接受转账用户路径,判断用户是否存在,如果不存在,则返回False
  • 调用common模块的小数、整数判断输入金额是否符合要求,不符合则返回False
  • 读取当前用户字典信息,并获取账户余额
  • 比较当前账户余额和转账金额,余额不足返回False,余额充足修改当前账户和接受转账用户的余额信息
  • 重新保存用户数据
  • 记录流水信息
  • 记录日志信息
  • 返回第一层

第一层:数据展示和接收返回值

查询流水:

第二层逻辑处理:

  • 读取用户字典信息,获取当前流水信息
  • 记录日志信息
  • 返回第一层

第一层:接受第二层返回值和数据展示

 购物车功能:

添加购物车:

可以将所有的逻辑判断全部放在第二层,直接返回结果给第一层

第二层:

import time
from db import db_handler
from lib import common
logger = common.get_logger('购物车信息') def add_shop_car_interface(username):
temp_shop_car = {}
while True:
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
# 循环打印商品信息供用户选择
for num, good_data in enumerate(good_list):
print(f"商品编号:{num} | 商品名称:{good_data[0]} | 商品单价: {good_data[1]}")
# 选择商品编号
good_id = input('请输入您要购买的商品编号(q)>>>:')
# 结束循环,将选购商品信息写入用户数据文件
if good_id == 'q':
user_data_dict = db_handler.select(username)
# 读取旧的购物车信息
old_shop_car = user_data_dict.get('shop_car')
# 判断旧的购物车中是否有商品
for g_name, g_list in temp_shop_car.items():
# 如果旧的购物车中有商品,则用原来的商品数量加现在的商品数量
if g_name in old_shop_car:
old_shop_car[g_name][0] += temp_shop_car[g_name][0]
else:
# 如果原来购物车中没有商品,则添加选购商品信息
old_shop_car[g_name] = g_list
# 将用户信息中的购物加一栏改为修改之后的商品信息
user_data_dict['shop_car'] = old_shop_car
# 将新的数据写入文件
db_handler.save(user_data_dict)
# 记录日志信息
logger.info(f'用户{username}添加购物车成功')
# 返回第一层
return True, '添加购物车成功' if not good_id.isdigit():
print('您输入的商品编号必须为纯数字')
continue
good_id = int(good_id)
if good_id not in range(len(good_list)):
print('没有您要的商品编号')
continue
# 根据商品编号索引取值获取商品信息
target_good_list = good_list[good_id]
good_name = target_good_list[0]
# 输入要购买的商品数量
good_num = input(f'请输入您要购买的{target_good_list[0]}的数量>>>:').strip()
if not good_num.isdigit():
print('商品数量必须为纯数字')
continue
good_num = int(good_num)
# 判断购物车字典中是否有商品
if not good_name in temp_shop_car:
temp_shop_car[good_name] = [good_num, target_good_list[1]] # {'挂壁面' :[10,3]}
else:
temp_shop_car.get(good_name)[0] += good_num
print(temp_shop_car)
第一层:

@common.outer('normal')
def add_shop_car():
flag,msg = shop_interface.add_shop_car_interface(is_login.get('username'))
print(msg)

 查询购物车:

 第二层:

  • 读取用户数据信息写入字典
  • 如果购物车信息存在,则返回True和购物车信息;如果不存在,则返回False,并提醒没有购物车数据
  • 记录日志信息

第一层:

 结算购物车:

 第二层:

  • 读取用户数据
  • 获取余额信息
  • 比较商品总价与余额情况
  • 修改余额,重新存入字典
  • 保存新的数据文件
  • 记录日志信息
  • 返回给第一层

第一层:接收第二层的返回值

 

ATM购物车的更多相关文章

  1. day19 十九、ATM+购物车

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

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

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

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

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

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

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

  5. Python实战之ATM+购物车

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

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

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

  7. ATM+购物车结构

    ATM+购物车 1.需求分析 2.程序设计及目录设计 3.编写程序 4.调试程序

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

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

  9. ATM + 购物车项目

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

  10. 项目: ATM+购物车

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

随机推荐

  1. 2022.3.12 提高A组总结&反思

    今天有点上头了 T1:开场秒,大水题,一眼莫队了,最后没打 T2:开场以为是费用流,后来发现费用流做不了,在做T3的时候突然发现可以状压,也没打 T3:这道题给我极大的亲切感,导致我一个上午硬钢这道题 ...

  2. YOLOv5】LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来

    前言 上一篇博客给大家介绍了使用opencv加载YOLOv5的onnx模型,但我们发现使用CPU进行推理检测确实有些慢,那难道在CPU上就不能愉快地进行物体识别了吗?当然可以啦,这不LabVIEW和O ...

  3. uoj348【WC2018】州区划分

    题目链接 直接讲吨吨吨给的标准做法吧.记\(f(i,j)\)表示各个州(可以重叠)的城市数量之和为i,这些州的并集为j的方案数,反正若有两个州之间有交集最后的\(|j|\)会不等于\(i\).有 \( ...

  4. JavaScript基础&实战(2)js中的强制类型转换、运算符、关系运算符、逻辑运算符、条件运算符

    文章目录 1.强制类型转换Number 1.1 代码 1.2 测试结果 2.进制表示 2.1 代码 2.2 测试结果 3.强制类型转换为Boolea 3.1 代码 3.2 测试结果 4.运算符 4.1 ...

  5. 在js中正则表达式验证小时分钟,将输入的字符串转换为对应的小时和分钟

    文章目录 1.预备知识 2.在js中的代码片段 3.测试结果 1.预备知识 splict()方法 Date()的相关方法 setHours()的用法 2.在js中的代码片段 //验证小时和分钟 var ...

  6. <四>1:全面掌握Const的用法

    const怎么理解? const修饰的变量不能够在作为左值!!初始化完成后,值不能被修改!! C 和C++中const 的区别? 在C程序中 test.c const int a; 只定义,不做初始化 ...

  7. Win环境安装Protobuf 2.0 版本

    转载请注明出处: 安装步骤 下载 protobuf-2.5.0.zip 与 protoc-2.5.0-win32.zip 下载链接 : https://github.com/protocolbuffe ...

  8. 常用Linux命令(常年更新)

    Linux后台运行脚本: nohup python -u test.py > out.log 2>&1 & nohup sh **.sh > /dev/null 2& ...

  9. ElasticSearch这些坑记得避开

    目录 一.管理方式 二.结构维护 三.数据调度 1.同步方案 2.中断和恢复 四.刷新策略 五.深度分页 六.参考源码 Index用不好,麻烦事不会少: 一.管理方式 ElasticSearch作为最 ...

  10. VUE学习2

    目录分析 public目录 index.html是起始的html文件 # 这是关键 <div id="app"></div> src目录 main.js是V ...