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. centos7.9使用yum方式安装MongoDB 5.x

    1.配置阿里云yum仓库 #vim /etc/yum.repos.d/mongodb-org-5.0.repo [mngodb-org] name=MongoDB Repository baseurl ...

  2. CentOS 7配置Chrony服务进行时间同步

    CentOS 7版本中使用Chrony工具实现本地时间与标准时间同步.与CentOS 6版本中的NTP服务不同,Chrony可以更快更准确地同步系统时钟,最大程度的减少时间和频率误差.Chrony包含 ...

  3. python csv写入多列

    import csv import os def main(): current_dir = os.path.abspath('.') file_name = os.path.join(current ...

  4. 在CentOS 8服务器上搭建FastDFS环境

    什么是FastDFS? 这里,我就摘录下百度百科上对于FastDFS的描述. FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下 ...

  5. Java(15)Object类

    前言 Object类是Java中所有类的始祖,在Java中每个类都扩展了Object.如果没有明确地指出超类,Object就被认为是这个类的超类.由于在Java中每个类都是由Object类扩展而来的, ...

  6. Docker | Compose创建mysql容器

    本文通过Docker Compose来创建mysql容器 在linux服务器上创建文件,用于管理容器 mkdir docker-mysql cd docker-mysql vim docker-com ...

  7. 同一台电脑安装两个不同版本的mysql。简单暴力有效

    1.先找到mysql的安装地址.找到my.ini 2.修改端口号(mysql默认端口是3306)我这里修改为3307 3.打开服务.找到刚刚修改的mysql版本 4.重新启动该服务(我已经安装了mys ...

  8. win10本地python第三方库安装成功,但是pycharm项目无法使用解决方案

    一.背景win10本地python第三方库安装成功,但是pycharm项目无法使用解决方案如本地安装的python中的request库,在pycharm项目中居然无法使用,比较郁闷 pip list ...

  9. 8.gitlab服务器搭建(基于centos7)

    gitlab服务硬件要求 建议服务器最低配置:2核 2G以上内存(不包含2GB,2GB内存运行的时候内存直接爆掉) 官网给出的推荐配置:4核 4GB内存 支持500个用户,8核 8GB内存 支持100 ...

  10. Mybatis 报错Mapper method 'xxx' has an unsupported return type

    报错原因: 出现这种错误,说明sql语句执行成功,只是返回类型出了问题. 解决方法: insert.delete.update操作默认返回一个int类型的整数,将增删改的接口改成int或者void即可 ...