ATM + 购物车(简易版)

这是一个包含多个模块的程序,包括start.py启动文件、settings.py配置文件、src.py核心逻辑、db_handler.py数据库处理、bank_interface.py银行接口、shop_interface.py商店接口、user_interface.py用户交互界面以及common.py公共函数。该系统实现了ATM机的基本操作和购物车功能。
摘要由CSDN通过智能技术生成
ATM
----bin
	----start.py
----conf
	----settings.py
----core
	----src.py
----db
	----db_handler.py
----interface
	----bank_interface
	----shop_interface
	----user_interface
----lib
	----common.py
----log
	----log.log
----Reanme.txt	

start.py

import sys
import os
from core import src

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)

src.run()

settings.py

import os


BASE_DIR = os.path.dirname(os.path.dirname(__file__))

BASE_DB = os.path.join(BASE_DIR,'db')

src.py

'''
            1、注册 register
            2、登录 login
            3、查询余额 check_balance
            4、转账 transfer
            5、提现 withdraw
            6、查流水 check_records
            7、还款 repay
            8、加入购物车 shopping
            9、查看购物车 check_shopping_cart
'''
from interface import user_interface
from interface import bank_interface
from interface import shop_interface
from lib import common

login_user = None


# 注册
def register():
    print('注册'.center(20, '❄'))
    while True:
        username = input('请输入用户名(按q退出):').strip()

        if username == 'q':
            break

        password = input('请输入密码:').strip()
        flag, msg = user_interface.register_interface(username, password)

        if flag:
            print(msg)
            break
        else:
            print(msg)


# 登录
def login():
    print('登录'.center(20, '❄'))
    while True:
        username = input('请输入用户名(按q退出):').strip()

        if username == 'q':
            break

        password = input('请输入密码:').strip()
        flag, msg = user_interface.login_interface(username, password)

        if flag:
            print(msg)
            global login_user
            login_user = username
            break
        else:
            print(msg)


# 查询余额
@common.login_auth
def check_balance():
    print('查余额'.center(20, '❄'))
    balance = bank_interface.check_balance_interface(login_user)
    print('用户余额为%s' % balance)


# 转账
@common.login_auth
def transfer():
    print('转账'.center(20, '❄'))
    while True:
        to_user = input('请输入被转账用户(按q退出):').strip()

        if to_user == 'q':
            break
        money = input('请输入转账金额:').strip()

        if not money.isdigit():
            print('输入金额不合法!')
        else:

            money = int(money)
            flag, msg = bank_interface.transfer_interface(login_user, to_user, money)

            if flag:
                print(msg)
                break
            else:
                print(msg)

# 提现
@common.login_auth
def withdraw():
    print('提现'.center(20, '❄'))
    while True:
        money = input('请输入需要提现的金额(按q退出):').strip()

        if money == 'q':
            break
        elif not money.isdigit():
            print('输入不合法!')
            continue

        money = int(money)
        flag, msg = bank_interface.withdraw_interface(login_user, money)

        if flag:
            print(msg)
            break
        else:
            print(msg)


# 查流水
@common.login_auth
def check_records():
    print('查流水'.center(20, '❄'))
    bank_flow = bank_interface.check_records_interface(login_user)
    for i in bank_flow:
        print(i)


# 还款
@common.login_auth
def repay():
    print('还款'.center(20, '❄'))
    while True:
        money = input('请输入还款金额(按q退出):').strip()

        if money == 'q':
            break
        elif not money.isdigit():
            print('输入不合法!')
        else:
            money = int(money)
            flag, msg = bank_interface.repay_interface(login_user, money)

        if flag:
            print(msg)
            break


# 购物
@common.login_auth
def shopping():
    print('购物'.center(20, '❄'))
    shop_list = [
        ['商品1',1000],
        ['商品2',1000],
        ['商品3',1000],
        ['商品4',1000]
    ]
    shop_car = {}

    while True:
        for i,j in enumerate(shop_list):
            print('%s:【%s %s元】'%(i,j[0],j[1]))

        choice = input('请输入商品编号(输入q退出):').strip()
        if choice == 'q':
            break

        if not choice.isdigit():
            print('输入不合法')
            continue

        choice = int(choice)
        if choice not in range(len(shop_list)):
            print('输入编号不存在')
            continue


        shop_name = shop_list[choice][0]
        shop_price = shop_list[choice][1]
        if shop_name in shop_car:
            shop_car[shop_name]['number'] += 1
        else:
            shop_car[shop_name] = {'shop_price':shop_price, 'number': 1}

    if shop_car:
        shop_interface.shopping_interface(login_user,shop_car)
        print('购物车加入成功!')
    else:
        print('购物车是空的!')




# 查看购物车
@common.login_auth
def check_shopping_cart():
    print('查看购物车'.center(20, '❄'))
    shop_car = shop_interface.check_shopping_cart_interface(login_user)
    if shop_car:
        print(shop_car)
    else:
        print('用户购物车为空!')



func_dic = {
    '1': register,
    '2': login,
    '3': check_balance,
    '4': transfer,
    '5': withdraw,
    '6': check_records,
    '7': repay,
    '8': shopping,
    '9': check_shopping_cart,
}


def run():
    while True:
        print('''
            1、注册
            2、登录
            3、查询余额
            4、转账
            5、提现
            6、查流水
            7、还款
            8、加入购物车
            9、查看购物车
        ''')
        choice = input('请输入命令编号(按q退出):').strip()
        if choice == 'q':
            break
        elif choice.isdigit():
            if choice in func_dic:
                func_dic[choice]()
            else:
                print('输入命令不存在!')
        else:
            print('请输入命令不合法!')

db_handler.py

'''
数据处理
'''
from conf import settings
import os
import json


# 查询数据
def select(username):
    user_path = os.path.join(settings.BASE_DB, '%s.json' % username)
    if os.path.exists(user_path):
        with open(user_path, 'rt', encoding='utf_8') as f:
            user_dic = json.load(f)
        return user_dic

# 更新数据
def update(user_dic):
    username = user_dic['username']
    user_path = os.path.join(settings.BASE_DB, '%s.json' % username)

    with open(user_path, 'wt', encoding='utf_8') as f:
        json.dump(user_dic,f,ensure_ascii=False)

bank_interface.py

from db import db_handler
from lib import common


# 查询余额接口
def check_balance_interface(username):
    user_dic = db_handler.select(username)
    common.write_logger("用户%s查询了余额" % username)
    return user_dic['balance']


# 转账接口
def transfer_interface(login_user, to_user, money):
    login_user_dic = db_handler.select(login_user)
    to_user_dic = db_handler.select(to_user)

    if not to_user_dic:
        return False, '转账用户不存在'

    elif login_user_dic['balance'] < money:
        return False, '当前用户余额不足'

    else:
        login_user_dic['balance'] -= money
        to_user_dic['balance'] += money

        flow1 = "用户%s向%s转账了%s元" % (login_user, to_user, money)
        flow2 = "用户%s收到%s转账的%s元" % (to_user, login_user, money)
        login_user_dic['bank_flow'].append(flow1)
        to_user_dic['bank_flow'].append(flow2)

        db_handler.update(login_user_dic)
        db_handler.update(to_user_dic)
        common.write_logger(flow1)
        common.write_logger(flow2)

        return True, flow1


# 提现接口
def withdraw_interface(username, money):
    user_dic = db_handler.select(username)

    if user_dic['balance'] >= money * 1.05:
        user_dic['balance'] -= money * 1.05

        flow = "用户%s提现了%s元" % (username, money)
        user_dic['bank_flow'].append(flow)

        db_handler.update(user_dic)
        common.write_logger(flow)

        return True, flow
    else:
        return False, '用户余额不足'


# 查流水接口
def check_records_interface(username):
    user_dic = db_handler.select(username)
    common.write_logger("用户%s查询了账户流水" % username)

    return user_dic['bank_flow']


# 还款接口
def repay_interface(username, money):
    user_dic = db_handler.select(username)

    user_dic['balance'] += money

    flow = "用户%s还款了%s元" % (username, money)
    user_dic['bank_flow'].append(flow)

    db_handler.update(user_dic)
    common.write_logger(flow)
    return True, flow

shop_interface.py

from db import db_handler
from lib import common


# 购物
def shopping_interface(username, shop_car):
    user_dic = db_handler.select(username)
    user_dic['shopping_car'] = shop_car
    db_handler.update(user_dic)
    common.write_logger("用户%s添加了购物车%s" % (username, shop_car))


# 查看购物车
def check_shopping_cart_interface(username):
    user_dic = db_handler.select(username)

    common.write_logger("用户%s查看了购物车" % username)
    return user_dic['shopping_car']

user_interface.py

from db import db_handler
from lib import common

# 注册接口
def register_interface(username, password):
    user_dic = db_handler.select(username)

    if user_dic:
        return False, '用户已存在'
    else:
        user_dic = {
            'username': username,
            'password': password,
            'balance': 15000,
            'bank_flow': [],
            'shopping_car': {}
        }

        db_handler.update(user_dic)
        common.write_logger("用户%s注册成功"%username)
        return True, '注册成功'


# 登录接口
def login_interface(username, password):
    user_dic = db_handler.select(username)
    if not user_dic:
        return False, '用户不存在'
    elif user_dic['password'] == password:
        common.write_logger("用户%s登录成功" % username)
        return True, '用户登陆成功'
    else:
        return False, '用户密码不正确'

common.py

# 登录认证装饰器
def login_auth(func):
    def warpper(*args,**kwargs):
        from core import src
        if src.login_user:
            res = func(*args,**kwargs)
            return res
        else:
            print('未登录无法享受该服务')
            src.login()
    return warpper


# 日志
import logging, os
from conf import settings

logging.basicConfig(
    # 1、日志输出位置:1、终端 2、文件
    # filename='access.log', # 不指定,默认打印到终端
    filename=os.path.join(settings.BASE_DIR, 'log', 'log.log'),

    # 2、日志格式
    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',

    # 3、时间格式
    datefmt='%Y-%m-%d %H:%M:%S %p',

    # 4、日志级别
    # critical => 50
    # error => 40
    # warning => 30
    # info => 20
    # debug => 10
    level=10,
)


# logging.debug('调试debug') # 10
# logging.info('消息info')   # 20
# logging.warning('警告warn')# 30
# logging.error('egon提现失败') # 40
# logging.critical('严重critical') # 50

def write_logger(name):
    return logging.info(name)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值