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. suse 安装mysql5.7

    1.上传包到home目录下 2.安装 1,解压下载的文件: tar -xvf mysql-5.7.29-1.sles12.x86_64.rpm-bundle.tar 解压后: 3.安装libatomi ...

  2. 关于AWS-EC2或者多个资源的tag的批量添加-基于Resource Groups & Tag Editor 和 命令处理

    今天收到一个请求,需要对公司所有的ec2-添加上两个成本IO标签,因为机器太多了 想到了如下两种方案去批量处理 方案一:利用aws的 [Management Tools]下的 Resource Gro ...

  3. 为Azure-云准备一个基于Red Hat 8.x 的虚拟机镜像

    由于公司最近要求部分项目上线到Azure云上,要求操作系统使用的Redhat 8.x,而且必须加固 而在Azure官网提供的镜像中,又没有Redhat,于是只有自己自定义Redhat镜像,最后加固,作 ...

  4. 文盘Rust -- struct 中的生命周期

    最近在用rust 写一个redis的数据校验工具.redis-rs中具备 redis::ConnectionLike trait,借助它可以较好的来抽象校验过程.在开发中,不免要定义struct 中的 ...

  5. 记一次 .NET 某工控视觉软件 非托管泄漏分析

    一:背景 1.讲故事 最近分享了好几篇关于 非托管内存泄漏 的文章,有时候就是这么神奇,来求助的都是这类型的dump,一饮一啄,莫非前定.让我被迫加深对 NT堆, 页堆 的理解,这一篇就给大家再带来一 ...

  6. MergeOption.NoTracking的使用

    前两天项目维护出现一个bug,报错信息是提交出错:AcceptChanges 无法继续,因为该对象的键值与 ObjectStateManager 中的另一个对象冲突.请在调用 AcceptChange ...

  7. 实例分析Scheduled Thread Pool Executor与Timer的区别

    摘要:JDK 1.5开始提供Scheduled Thread PoolExecutor类,Scheduled Thread Pool Executor类继承Thread Pool Executor类重 ...

  8. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(28)-Fiddler如何抓取Android7.0以上的Https包-下篇

    1.简介 虽然依旧能抓到大部分Android APP的HTTP/HTTPS包,但是别高兴的太早,有的APP为了防抓包,还做了很多操作:① 二次加密有的APP,在涉及到关键数据通信时,会将正文二次加密后 ...

  9. 使用ssm框架搭建的图书管理系统

    等下贴代码 学生图书管理系统 实现的功能: 1.图书信息查询(暂时未分页处理) 2.图书信息修改(点击保存按钮后返回修改后的图书信息界面) 3.删除一本图书(删除某一本书籍,在图书管理界面则不存在该条 ...

  10. 齐博x1fun实例 鉴于很多人问列表的筛选怎么放到首页、内容页等等地方 贴出方法

    application\common\fun\Field.php 你可以复制一份 也可以直接改 直接改记得加锁 不然升级就覆盖了 我们把   public function list_filter($ ...