ATM项目实战

项目需求分析:
1.注册(密码要加密)
2.登陆
3.查看余额
4.提现(可自定手续费)
5.还款
6.转账
7.查看流水
8.添加购物车功能 (商品可配置)
9.查看购物车功能
10.结算购物车功能
11.管理员功能 (可添加账户,冻结账户)
12.项目日志,纪录用户 登录 注册 等操作时间

注册功能

1.创立项目开发目录规范

2.在用户交互层 core - src 文件中 创立 选择功能字典 run( )

3.在 bin - start文件中 调用开始函数 run( )
if __name__ == '__main__':
from core import src
src.run() 4.开始编写第一个功能模块 注册 ,在用户交互层获取 用户名和密码,并在该层判断 2次输入密码是否一致,如果一致则调用注册接口 传入 用户名/密码参数
name = input('请输入用户名').strip()
password = input('请输入密码').strip()
password1 = input('请再次输入密码').strip()
if password == password1:
password = common.hashl(password)
flag, msg = user.register_api(name, password)
print(msg)
else:
print('两次密码输入不一致') 5.编写加密模块放入公共组建中 common 在注册中使用 密码改为密文传入注册接口
def hashl(msg):
md5 = hashlib.md5()
md5.update(msg.encode('utf8'))
md5 = md5.hexdigest()
return md5 6.在接口文件中 编写注册接口 收到传参创建用户字典,并存入db文件中用户信息json文件。
name_dict = {'name': name, 'psd': password, 'balance': 1000, 'car': {}, 'state': True}
if handle.select(name):
return False, '用户名已存在'
handle.save(name_dict)
return True, f'{name} 注册成功' 6.存储用户信息属于 数据库层级操作,在handle文件中编写用户储存函数,调用配置文件路径 DB_DIR 完成数据储存 7.储存用户信息需要用到用户路径,拼接用户路径代码用到db文件夹路径,获取db路径应在配置文件中 setting 中 编写 DB_DIR
BAST_DIR = os.path.dirname(os.path.dirname(__file__))
DB_DIR = os.path.join(BAST_DIR, 'db') 8.注册接口中调用用户储存函数 传入用户字典,完成注册
def save(name_dict):
name_dir = os.path.join(settings.DB_DIR, f'{name_dict.get("name")}.json')
with open(name_dir, 'w', encoding='utf8') as f:
json.dump(name_dict, f) 9.考虑用户注册需要查看用户名是否存在,handle文件中编写用户查询函数,如果有该用户则返回用户字典,如果没有则返回空None
def select(name):
name_dir = os.path.join(settings.DB_DIR, f'{name}.json')
if os.path.exists(name_dir):
with open(name_dir, 'r', encoding='utf8') as f:
name_dict = json.load(f)
return name_dict 10,注册用户接口,首先判断用户是否存在,如果存在返回 用户名已存在,不存在则完成注册操作 if handle.select(name):
return False, '用户名已存在'

登录功能

1.在用户交互层获取 用户名和密码,并且调用加密模块函数,把加密后的密码传给登录接口
name = input('请输入用户名').strip()
password = input('请输入密码').strip()
password = common.hashl(password)
flag, msg = user.login_api(name, password) 2.登录接口 调用 查询用户函数,如果查询用户函数返回空 则代表用户名不存在,结束函数,并把结果返回给 用户交互层 输出
if not handle.select(name):
return False, '用户名不存在' 3.用变量接收查询函数返回值,返回的是一个用户信息字典,利用该字典中的密码和传来的密码对比,一致则 登录成功 不一致则密码错误
name_dict = handle.select(name)
if password == name_dict.get("psd"):
return True, '登录成功'
else:
return False, '密码错误'

查看余额

1.查看余额归属于资金类功能,接口文件夹创建 bank.py文件

2.选择该功能后直接调用 查看余额接口 用户交互层 只做 返回结果展示

 msg = interface.bank.check_balance_api(is_login.get("name"))
print(msg)

3.使用该功能则需要先保证账户是登录状态,并且获取到账户名,不然不知道查看谁的余额哦

4.编写 效验用户登录状态装饰器。由于需要多次使用,所以放在公共组建文件中

def Check_login(func):
def inner(*args, **kwargs):
if src.is_login.get("name"):
res = func(*args, **kwargs)
return res
else:
return '请先登录账户'
src.login()
return inner

5.用户登录后 需要有一个全局变量 记录用户登录,放在用户交互层,所以创建一个字典,用来辨别用户是否登录

is_login = {'name': None}

6.在登录功能内添加,用户登录成功后 全局字典用户登录状态改为已登录

if flag:

        is_login["name"] = name

7.装饰器判断全局字典用户登录状态,已登录正常执行 未登录跳转到登录页面

8.装上装饰器,然后调用 查询余额接口 传入 用户姓名数据

@common.Check_login
def check_balance():
msg = interface.bank.check_balance_api(is_login.get("name"))
print(msg)

9.接口内根据姓名 调用查询数据函数,得到用户数据,然后展示用户余额

    name_dict = handle.select(name)
money = name_dict.get("balance")
return f'您的账户余额为:{money}'

提现功能

1.用户交互层(src)中获取用户需要提现的金额,并直接判断是否是正确的数字,支持浮点数

number = input('请输入您要提现的金额')
try:
number = float(number)
except Exception:
return '请输入正确的数字'

2.比符合要求的提现金额,连同用户名一起传送给提现接口 withdraw_api(name, number):

else:
msg = interface.bank.withdraw_api(is_login.get("name"),number)
print(msg)

3.提现接口内,调用 handle.select(name) 获取用户数据 ,获取到用户余额

name_dict = handle.select(name)
money = name_dict.get("balance")

4.设置提现手续费,由于手续费可配置,故此放到settigs文件中

WITHDRAW_SERVICE = 0.05  # 提现手续费配置比例 目前为百分之5

5.判断账户余额 是否 大于或等于 提现金额+手续费 不符合直接返回结果

   if money < number+withdraw_service:
return f'账目余额不足,账户余额为:{money}'

6.进行将字典中余额 减去 提现金额加手续费 然后保存 提现完成

	money = money-number-withdraw_service
name_dict["balance"] = money
handle.save(name_dict)
return f'提现成功,提现金额{number},手续费:{withdraw_service},账户余额:{name_dict.get("balance")}'

还款功能

1.用户交互层(src)中获取用户需要还款的金额

    number = input('请输入您要充值的金额')

2.调用还款功能接口 传入还款金额 账户姓名

    msg = interface.bank.pay_back_api(is_login.get("name"), number)

3.在接口中判断还款数字输入是否正确 不正确直接返回

 try:
number = float(number)
except Exception:
return '请输入正确的数字'

4.正确则获取 用户数据 得到账户余额,账户中加上充值金额,然后再次保留到用户信息 完成充值

   else:
name_dict = handle.select(name)
name_dict["balance"] += number
handle.save(name_dict)
return f"充值金额:{number},充值成功

转账功能

1.用户交互层(src)中获取用户需要转账的账户,还有转账的金额,并且判断金额是否正确

other_name = input('请问您需要转账给哪个账户').strip()
other_money = input('请问您需要转账的金额').strip()
try:
other_money = float(other_money)
except Exception:
return '请输入正确的数字'

2.将转账的账户名,和转账金额,还有自己的用户名传给 转账接口

msg = interface.bank.transfer_api(is_login.get("name"),other_name,other_money)
print(msg)

3.首先判断对方用户名是否存在

if not handle.select(other_name):
return '转账账户不存在,请再次核实'

4.配置文件 settings中设置 转账手续费比例

TRANSFER_SERVICE = 0.01  # 转账手续费配置比例 目前为百分之1
  1. 调用函数 拿到自身余额 判断自身账户余额是否够
name_dict = handle.select(my_name)
balance = name_dict.get("balance")
transfer_service = other_money * settings.TRANSFER_SERVICE
if balance < other_money + transfer_service:
return '您的账户余额不足,无法转账'

6.自身账户减去转账金额 加 手续费 对方账户加入金额,并保存

transfer_service = other_money * settings.TRANSFER_SERVICE  #手续费
balance = balance - other_money - transfer_service
name_dict["balance"] = balance
handle.save(name_dict)
other_name_dict = handle.select(other_name)
other_name_balance = other_name_dict.get("balance")
other_name_dict["balance"] = other_name_balance + other_money
handle.save(other_name_dict)
return f'转账成功,转账账户:{other_name},转账金额:{other_money},手续费:{other_money * settings.TRANSFER_SERVICE}'

查看流水

1.查看流水,首先在用户注册 构建字典是添加流水记录空列表

name_dict = {'name': name, 'psd': password, 'balance': 1000, 'car': {}, 'state': True,'Check_water':[]}

2.在完成关于余额的操作时添加记录

now_time = time.strftime('%Y-%m-%d %X')
name_dict["Check_water"].append(f'时间:{now_time}----充值金额:{number},充值成功')

3.使用此功能时,调取查看流水接口,传入用户名即可

msg = interface.bank.trading_record_api(is_login.get("name"))

4.接口内获取用户资料 流水内容 返回

name_dict = handle.select(name)
water = name_dict.get("Check_water")
return water

5.判断返回内容是否为空,为空则提示,不为空这循环展示流水结果

if msg:
for i in msg:
print(i)
else:
'暂无流水记录哦'

添加购物车功能

1.选择该功能直接调取 购物车接口 把用户名传过去

interface.shop.add_shop_car(is_login.get("name"))

2.商品信息放入配置文件,在接口中循环打印出来。供用户选择

for num, goods_list in enumerate(settings.goods):
print(f'商品编号:{num + 1} | 商品名称:{goods_list[0]} | 商品单价:{goods_list[1]}')

3.将用户选择的商品信息 放入临时购物车中

number = int(number)
goods_name = settings.goods[choice-1][0]
goods_list1 = [number,settings.goods[choice-1][1]]
if goods_name in new_car:
new_car[goods_name][0] += number
print('商品添加成功')
else:
new_car[goods_name] = goods_list1
print('商品添加成功')

4.当用户退出的时候 读取用户数据,判断购物车中是否有刚刚挑选的商品,如果有就增加数量,没有则新增

choice = input('请挑选的商品>>>(q)退出商城:').strip()
if choice == 'q':
name_dict = handle.select(name)
old_car = name_dict.get("car")
if not new_car:
print('欢迎下次光临')
for goods_name,goods_list in new_car.items():
if goods_name in old_car:
old_car[goods_name][0] += goods_list[0]
print('商品已添加购物车,欢迎下次光临')
name_dict["car"] = old_car
handle.save(name_dict)
break
else:
old_car[goods_name] = goods_list
print('商品已添加购物车,欢迎下次光临')
name_dict["car"] = old_car
handle.save(name_dict)
break

查看购物车功能

1.调用查看购物车接口 还是把名字传进去

msg = interface.shop.pay_shop_car_api(is_login.get("name"))

2.在接口里面拿到 用户真实数据 并且返还出去

name_dict = handle.select(name)
old_car = name_dict.get("car")
return old_car

3.最外层拿到用户购物车数据,循环打印每个商品的名称 数量 金额

if not old_car:
print('购物车空空如也哦')
for goods_name,goods_list in old_car.items():
print(f'商品名:{goods_name},数量:{goods_list[0]},价格:{goods_list[0] * goods_list[1]}')

结算购物车

1.调用结算购物车接口,并把用户名传进去

interface.shop.pay_shop_car_api(is_login.get("name"))

2.拿到用户真实购物车数据 然后计算购物车总价

money = 0
for i,x in old_car.values():
money += i * x

3.判断账户余额

if balance < money:
return '账户余额不足'

4.开始扣除账户余额 并且把 原购物车清空 并且保存

balance = balance - money
name_dict["car"] = {}
name_dict['balance'] = balance
now_time = time.strftime('%Y-%m-%d %X')
name_dict["Check_water"].append(
f'时间:{now_time}----购物成功 | 本次消费{money}/账户余额:{name_dict.get("balance")}')
handle.save(name_dict)
return f'本次消费:{money}元,账户余额为:{name_dict.get("balance")}'

ATM项目的更多相关文章

  1. ATM项目详解

    内容概要: ATM项目 代码实操流程 ATM项目 # 需求: """ - 额度15000或自定义 - 支持多账户登录 - 可以查看账户余额 - 可以提现(可自定义手续费比 ...

  2. day25 ATM项目(第一天)

    项目的说明书 项目:ATM + 购物车 项目需求: 1.额度15000或自定义 --> 注册功能 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 --> 购物功能.支付功能 3.可 ...

  3. 购物车+ATM项目(图形化)

    项目下载 项目目录结构 运行效果 seetings.py import logging import logging.config # 定义日志输出格式 开始 import os standard_f ...

  4. ATM项目开发

    目录 一.项目开发流程 1.项目需求分析: 2.项目架构设计: 3.项目分组开发: 4.项目提交测试: 5.项目交付上线: 二.项目需求分析 1.主题 2.项目核心 3.项目需求: 4.从需求中提炼出 ...

  5. 10月28日内容总结——ATM项目开发流程

    目录 一.项目开发流程 1.项目需求分析: 2.项目架构设计: 3.项目分组开发: 4.项目提交测试: 5.项目交付上线: 二.项目需求分析 1.主题 2.项目核心 3.项目需求: 4.从需求中提炼出 ...

  6. python ATM项目

    1.需求: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用户间转帐 支持多用户 管理员可添加账户.指定用户额度.冻结用户等 购物车: 商品信息 ...

  7. Python基础阶段总结:ATM项目实战

    目录 ATM逻辑描述 三层框架简介 1.第一层(src.py) 2.第二层(interface文件夹下内容) 3.第三层(db_hanlder) 启动函数 用户注册功能 用户登录 common中的小功 ...

  8. ATM购物车项目总结

    目录 项目实现思路 ATM项目 优先实现功能 拆分函数 项目路径展示 项目启动文件 start.py 配置文件 setting.py 日志配置字典 日志函数 展示层 src.py 用户注册 获取用户输 ...

  9. ATM购物车项目 三层架构

    目录 项目开发流程 项目需求 三层架构 (重点) 实际案例 展示层 核心逻辑层 数据处理层 ATM项目 项目开发流程 # 1.项目需求分析 产品经理(客户) 架构师 开发经理 1.架构师 开发经理提前 ...

随机推荐

  1. MinIO管理员完整指南

    官方文档地址:http://docs.minio.org.cn/docs/master/minio-admin-complete-guide MinIO Client(mc)提供了" adm ...

  2. 授予用户/用户组访问 Kubernetes 的一个名称空间

    转载地址:https://www.kuboard.cn/learning/k8s-advanced/sec/rbac/auth-namespace.html 前提条件 已安装 Kuboard v3,版 ...

  3. MySQL集群搭建(6)-双主+keepalived高可用

    双主 + keepalived 是一个比较简单的 MySQL 高可用架构,适用于中小 MySQL 集群,今天就说说怎么用 keepalived 做 MySQL 的高可用. 1 概述 1.1 keepa ...

  4. nsis离开自定义页面保存设置

    这是群里一位朋友问他的自定义页面设置完成后返回上一步无法保存怎么办写的一个小例子,拓展了下,只要不关闭,不管上一步还是进入下一步返回都可以保留原页面设置. !include LogicLib.nsh ...

  5. 独辟蹊径:逆推Krpano切图算法,实现在浏览器切多层级瓦片图

    前言 此文我首发于CSDN(所以里面的图片有它的水印) 趁着隔离梳理一下之前做的一个有用的功能:在浏览器中去切割多分辨率瓦片图 这是一个有趣的过程,跟我一起探索吧 阅读本文需具备前置知识:对krpan ...

  6. 垃圾回收机制GC

    垃圾回收机制GC 我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定. 而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变 ...

  7. 洛谷P1253 [yLOI2018] 扶苏的问题 (线段树)

    一道用来练习打标记的好题. 对于区间加和区间赋值两个操作分别用两个标记,分析如何打标记并下传标记(还是比较好分析的). 坑点:查询操作时,我一开始把ans设为-0x3f3f3f3f(调试了好久才发现) ...

  8. CentOS 7.9 安装 rabbitmq-3.10.2

    一.CentOS 7.9 安装 rabbitmq-3.10.2.tar.gz 地址 https://www.rabbitmq.com https://github.com/rabbitmq/rabbi ...

  9. 计算机保研,maybe this is all you need(普通双非学子上岸浙大工程师数据科学项目)

    写在前面 9.28接收了拟录取通知,也终究是尘埃落定了,我人生的又一个阶段也终于结束.面对最终录取结果,或多或少会有所遗憾,但也还是基本达到了预期的目标了. 作为在今年严峻的保研形势下幸存的我,一直想 ...

  10. Docker 部署 Kibana

    Docker 部署 Kibana 本篇主要介绍 使用 Docker 部署 kibana 用于操作 Elasticsearch 使用. 1. 前置准备 1.1 Elasticsearch 准备 可以先准 ...