流程图:

需求:

ATM:模拟实现一个ATM + 购物商城程序额度 15000或自定义实现购物商城,买东西加入 购物车,调用信用卡接口结账可以提现,手续费5%支持多账户登录支持账户间转账记录每月日常消费流水提供还款接口ATM记录操作日志提供管理接口,包括添加账户、用户额度,冻结账户等。。。用户认证用装饰器

程序目录结构
../module2-ATM
├── ATM流程图.png   #流畅图
├── bin       #atm执行程序目录
│   ├── ATM_start.py
│   └── __init__.py
├── db            #数据库目录
│   ├── __init__.py
│   ├── shopping_car    #购物车文件
│   ├── shopping_data   #信用卡信息文件
│   └── user_data       #管理后台用户密码
├── __init__.py
├── log                #日志目录
│   ├── __init__.py
│   └── record.log
├── main             #主要目录,相关模块功能都在这里
│   ├── admin.py   #管理后台模块
│   ├── core.py        #调用各个模块的主模块
│   ├── credictcard.py  #信用卡模块
│   ├── __init__.py
│   ├── log.py           #日志模块
│   └── shopping_mall.py  #商城模块
└── README

程序目录结构

bin目录

atm_start.py执行程序

#coding:utf-8
#Author:支文伟
'''执行ATM程序'''
import os,sys
core_path  = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '/main'
sys.path.append(core_path)  #把该路径加到环境变量
from core import *
if __name__ == '__main__':
    core()

ATM_start.py

db目录

{": {"credictcard": 66668888, "password": 123456, "totalbill": 0, "locked": "False", "deflimit": 15000, "personinfo": "alex", "limitcash": 7500, "limit": 15000}}

credictcard_data

[["]]

shopping_car

oppoR9s 2500
ipad 5000
book 350
bike 1999
clothes 1600
shoes 998

shopping_data

{"}

user_data

log目录

2017-09-02 22:17:56,156 --- 购物---oppoR9s---价格---2500
2017-09-02 22:17:59,843 --- 购物---ipad---价格---5000
2017-09-02 22:19:27,083 --- 购物---oppoR9s---价格---2500
2017-09-02 22:19:27,667 --- 购物---ipad---价格---5000
2017-09-02 22:20:41,450 --- 购物---oppoR9s---价格---2500
2017-09-02 22:20:42,227 --- 购物---ipad---价格---5000
2017-09-02 22:21:03,874 --- 购物---oppoR9s---价格---2500
2017-09-02 22:21:04,307 --- 购物---ipad---价格---5000
2017-09-02 22:21:15,297 --- 购物---oppoR9s---价格---2500
2017-09-02 22:21:15,707 --- 购物---ipad---价格---5000
2017-09-02 22:21:43,529 --- 购物---oppoR9s---价格---2500
2017-09-02 22:21:43,778 --- 购物---ipad---价格---5000
2017-09-02 22:21:44,138 --- 购物---oppoR9s---价格---2500
2017-09-02 22:23:12,962 --- 购物---oppoR9s---价格---2500
2017-09-02 22:23:40,754 --- 购物---oppoR9s---价格---2500
2017-09-02 22:24:31,233 --- 购物---oppoR9s---价格---2500
2017-09-02 22:24:52,283 --- 购物---oppoR9s---价格---2500
2017-09-02 22:36:49,801 --- 购物---oppoR9s---价格---2500
2017-09-02 22:36:50,240 --- 购物---ipad---价格---5000
2017-09-02 22:37:14,768 --- 购物---oppoR9s---价格---2500
2017-09-02 22:37:15,385 --- 购物---ipad---价格---5000
2017-09-02 22:38:20,097 --- 购物---oppoR9s---价格---2500
2017-09-02 22:38:20,586 --- 购物---ipad---价格---5000
2017-09-02 22:39:09,520 --- 购物---oppoR9s---价格---2500
2017-09-02 22:39:09,841 --- 购物---ipad---价格---5000
2017-09-02 22:39:10,584 --- 购物---oppoR9s---价格---2500
2017-09-02 22:39:45,185 --- 购物---oppoR9s---价格---2500
2017-09-02 22:39:46,233 --- 购物---ipad---价格---5000
2017-09-02 22:39:59,344 --- 购物---bike---价格---1999
2017-09-02 22:40:16,728 --- 购物---oppoR9s---价格---2500
2017-09-02 22:41:28,536 --- 购物---oppoR9s---价格---2500
2017-09-02 22:44:09,529 --- 购物---oppoR9s---价格---2500
2017-09-02 22:44:10,210 --- 购物---ipad---价格---5000
2017-09-02 22:45:01,121 --- 购物---oppoR9s---价格---2500
2017-09-02 22:45:41,448 --- 购物---oppoR9s---价格---2500
2017-09-02 22:50:57,263 --- 购物---oppoR9s---价格---2500
2017-09-02 22:51:27,760 --- 购物---oppoR9s---价格---2500
2017-09-02 22:54:17,922 --- 购物---oppoR9s---价格---2500
2017-09-02 22:54:54,464 --- 购物---oppoR9s---价格---2500
2017-09-02 22:54:55,879 --- 购物---ipad---价格---5000
2017-09-02 22:54:57,209 --- 购物---book---价格---350
2017-09-02 22:55:36,530 --- 购物---shoes---价格---998
2017-09-02 22:55:37,552 --- 购物---book---价格---350
2017-09-02 22:55:38,208 --- 购物---bike---价格---1999
2017-09-02 22:55:38,680 --- 购物---oppoR9s---价格---2500
2017-09-06 14:37:00,639 --- 购物---oppoR9s---价格---2500
2017-09-06 14:37:01,162 --- 购物---book---价格---350
2017-09-06 14:37:01,570 --- 购物---clothes---价格---1600
2017-09-07 10:16:24,277 --- 12345678--信用卡商城结账--4450
2017-09-07 10:18:59,989 --- 12345678--信用卡商城结账--4450¥
2017-09-10 15:00:49,031 --- 购物---oppoR9s---价格---2500
2017-09-10 15:00:49,031 --- 购物---oppoR9s---价格---2500
2017-09-10 15:00:50,222 --- 购物---ipad---价格---5000
2017-09-10 15:00:50,222 --- 购物---ipad---价格---5000
2017-09-10 15:04:51,710 --- 购物---ipad---价格---5000
2017-09-10 15:04:51,710 --- 购物---ipad---价格---5000
2017-09-10 15:04:53,343 --- 购物---oppoR9s---价格---2500
2017-09-10 15:04:53,343 --- 购物---oppoR9s---价格---2500
2017-09-10 15:05:53,751 --- 购物---ipad---价格---5000
2017-09-10 15:05:53,751 --- 购物---ipad---价格---5000
2017-09-10 15:05:54,527 --- 购物---book---价格---350
2017-09-10 15:05:54,527 --- 购物---book---价格---350
2017-09-10 15:06:27,303 --- 购物---book---价格---350
2017-09-10 15:06:27,303 --- 购物---book---价格---350
2017-09-11 10:16:57,211 --- 购物---oppoR9s---价格---2500
2017-09-11 10:16:57,211 --- 购物---oppoR9s---价格---2500
2017-09-11 10:16:57,930 --- 购物---ipad---价格---5000
2017-09-11 10:16:57,930 --- 购物---ipad---价格---5000
2017-09-11 10:17:28,513 --- 购物---oppoR9s---价格---2500
2017-09-11 10:17:28,513 --- 购物---oppoR9s---价格---2500
2017-09-11 10:17:32,387 --- 购物---oppoR9s---价格---2500
2017-09-11 10:17:32,387 --- 购物---oppoR9s---价格---2500
2017-09-11 10:17:34,916 --- 购物---book---价格---350
2017-09-11 10:17:34,916 --- 购物---book---价格---350
2017-09-11 10:44:51,037 --- 购物---oppoR9s---价格---2500
2017-09-11 10:44:51,037 --- 购物---oppoR9s---价格---2500
2017-09-11 10:44:52,299 --- 购物---ipad---价格---5000
2017-09-11 10:44:52,299 --- 购物---ipad---价格---5000
2017-09-11 11:55:00,038 --- 购物---shoes---价格---998
2017-09-11 11:55:00,038 --- 购物---shoes---价格---998
2017-09-11 11:55:30,671 --- 66661111--信用卡商城结账--998¥
2017-09-11 11:55:30,671 --- 66661111--信用卡商城结账--998¥

日志记录

main目录

#coding:utf-8
#Author:zhiwenwei
import os,json
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
'''数据库文件的绝对路径'''
creditcard_data = base_dir + '/db/creditcard_data'
user_dir = base_dir + '/db/user_data'

'''管理员用户认证装饰器'''
def auth_admin(func):
    def wrapper(*args,**kwargs):
        while True:
            check = input("是否确认认证用户?y确认q退出认证")
            if check == "y":
                print("管理员用户认证".center(60,'-'))
                username = input("请输入管理员账户:").strip()
                passwd = input("请输入管理员密码:").strip()
                with open(user_dir, 'r', encoding='utf-8') as f:
                    _user_data = json.loads(f.read())
                    if username in _user_data.keys() and int(passwd) == int(_user_data[username]):
                        print("用户%s认证成功"%(username))
                    else:
                        print("用户名或密码有误")
                        continue
            else:
                print("已退出管理用户认证")
                break
            func(*args,**kwargs)
    return wrapper

'''申请信用卡'''
@auth_admin
def apply():
    while True:
        print("申请信用卡".center(40,'-'))
        with open(creditcard_data,'r+',encoding='utf-8') as f:
            _credictcard_data = json.loads(f.read())
            credictcard_id = input("请输入你要申请的信用卡号(八位数字):")
            if credictcard_id.isdigit() and len(credictcard_id) == 8:
                if credictcard_id not in _credictcard_data.keys():
                    apply_user = input("请输入信用卡申请人:").strip()
                    apply_passwd = input("请输入信用卡密码(六位数):").strip()
                    if len(apply_user) > 0:
                        if apply_passwd.isdigit() and len(apply_passwd) == 6:
                            _credictcard_data[credictcard_id] = {"limitcash": 7500, "password":int(apply_passwd), "personinfo": apply_user,"locked": "False",
                                                                 "deflimit": 15000, "credictcard": int(credictcard_id), "limit": 15000, "totalbill": 0}
                            dict = json.dumps(_credictcard_data)
                            f.seek(0)
                            f.truncate(0)
                            f.write(dict)
                            f.flush()
                            print("申请信用卡成功!\n卡号:%s\t持卡人:%s\n额度:15000\t取现额度:7500"%(credictcard_id,apply_user))
                            break
                        else:
                            print("输入密码有误!")
                            continue
                    else:
                        print("申请人不能为空")
                else:
                    print("改信用卡已存在")
                    continue
            else:
                print("输入信用卡有误!")
'''修改信用卡密码'''
@auth_admin
def alter_pw():
    while True:
        print("修改信用卡密码".center(40,'-'))
        with open(creditcard_data,'r+',encoding='-utf8') as f:
            _creditcard_data = json.loads(f.read())
            creditcard_id = input("请输入你要修改的信用卡:").strip()
            if creditcard_id.isdigit() and len(creditcard_id) ==8:
                if creditcard_id in _creditcard_data.keys():
                    passwd = _creditcard_data[creditcard_id]["password"]
                    _passwd = input("请输入信用卡原密码:").strip()
                    if int(_passwd) == passwd:
                        passwd_new = input("请输入你要设置的信用卡密码:").strip()
                        _creditcard_data[creditcard_id]["password"] = int(passwd_new)
                        dict = json.dumps(_creditcard_data)
                        f.seek(0)
                        f.truncate(0)
                        f.write(dict)
                        f.flush()
                        print("密码修改成功!")
                        break
                    else:
                        print("你输入的原密码有误!")
                else:
                    print("你输入的信用卡不存在")
            else:
                print("你输入的信用卡有误")
'''添加管理员账户'''
@auth_admin
def alter_admin():
    while True:
        print("添加管理员账户".center(50,'-'))
        username = input("请设置管理员账户名:").strip()
        passwd = input("请设置账户密码:").strip()
        with open(user_dir,'r+',encoding='utf-8') as f:
            user_data = json.loads(f.read())
            if username not in user_data.keys():
                if len(username) >= 0 and len(passwd) >= 0:
                    user_data[username] = passwd
                    user_data = json.dumps(user_data)
                    f.seek(0)
                    f.truncate(0)
                    f.write(user_data)
                    f.flush()
                    print("成功添加[%s]管理员"%(username))
                    break
                else:
                    print("账户或密码不能为空")
            else:
                print("该管理账户名[%s]已存在!请换一个用户名!"%(username))
                continue

admin.py

#coding:utf-8
#Author:zhiwenwei
import os,sys
# base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# core_path = base_dir + 'main'
# sys.path.insert(0,core_path)
from admin import *
from credictcard import *
from shopping_mall import *
'''主页面列表'''
def core_list():
    list = ["  ATM  ",
            "购物商城",
            "后台管理",
            "退出程序"]
    index = 0
    for i in list:
        print(index+1,i)
        index +=1

'''ATM页面列表'''
def atm_list():
    list = ["信用卡信息",
            "信用卡转账",
            "信用卡取现",
            "信用卡还款",
            ]
    index = 0
    for i in list:
        print(index+1,i)
        index += 1
'''后台管理列表'''
def admin_list():
    list = [" 申请信用卡 ",
            "添加管理员账户",
            "修改信用卡密码"
            ]
    index = 0
    for i in list:
        print(index +1,i)
        index += 1
'''购物商城列表'''
def shopping_list():
    list = ["购物商城",
            "购物结算",
            "清空购物车",
            "查看购物车"
            ]
    index = 0
    for i in list:
        print(index+1,i)
        index += 1

'''主函数'''
def core():
    print("欢迎来到购物商城ATM系统".center(30,'-'))
    while True:
        core_list()
        choice = input("请选择ID:").strip()
        if choice == "q":
            print("已退出,欢迎下次使用!".center(40,'-'))
            exit()
        if choice.isdigit():
            choice = int(choice)
            if  1 <= choice <= 4:
                while True:
                    if choice == 1:
                        print("欢迎来到信用中心".center(40,'-'))
                        atm_list()
                        atm_choice = input("请选择ATM操作id:").strip()
                        if atm_choice == "q":break
                        if atm_choice == "exit":exit("已退出程序,欢迎下次使用!")
                        if atm_choice.isdigit():
                            atm_choice = int(atm_choice)
                            if 1 <= atm_choice <= 4:
                                while True:
                                    if atm_choice == 1:
                                        creditcard_info()
                                        break
                                    elif atm_choice == 2:
                                        transfer()
                                        break
                                    elif atm_choice == 3:
                                        takecash()
                                        break
                                    elif atm_choice == 4:
                                        repayment()
                                        break
                            else:
                                print("请输入正确的id")
                    elif choice ==2:
                        print("欢迎来到购物商城".center(40,'-'))
                        shopping_list()
                        shop_choice = input("请选择id:").strip()
                        if shop_choice == "q":break
                        if shop_choice == "exit":exit("已退出程序,欢迎下次使用!")
                        if shop_choice.isdigit():
                            shop_choice = int(shop_choice)
                            if 1 <= shop_choice <= 4:
                                while True:
                                    if shop_choice == 1:
                                        mall()
                                        break
                                    elif shop_choice == 2:
                                        shopping_pay()
                                        break
                                    elif shop_choice == 3:
                                        del_shoppingcar()
                                        break
                                    elif shop_choice == 4:
                                        search_shopppingcar()
                                        break
                            else:
                                print("请输入正确的id")
                        else:
                            print("请输入正确的id")
                    elif choice == 3:
                        print("欢迎来到管理后台中心".center(50,'-'))
                        admin_list()
                        admin_choice = input("请选择id(q返回exit退出)").strip()
                        if admin_choice == "q":break
                        if admin_choice == "exit":exit("已退出程序,欢迎下次使用!")
                        if admin_choice.isdigit():
                            admin_choice = int(admin_choice)
                            if 1 <= admin_choice <= 3:
                                while True:
                                    if admin_choice == 1:
                                        apply()
                                        break
                                    elif admin_choice == 2:
                                        alter_admin()
                                        break
                                    elif admin_choice == 3:
                                        alter_pw()
                                        break
                            else:
                                print("请输入正确的id")
                    elif choice == 4:
                        exit("已退出程序,欢迎下次使用!")
            else:
                print("请输入正确的id")
        else:
            print("你输入有误!")

core.py

#coding:utf-8
#Author:支文伟
"""信用卡中心"""
import os
import json
import sys
from log import get_logger #导入日志模块

'''获取数据文件的绝对路径'''
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #获取当前目录的上级目录绝对路径
creditcard_path = base_dir + '/db/creditcard_data'
user_path = base_dir + '/db/user_data'
recordlog_path = base_dir + '/log/record.log'
logger = get_logger() #日志实例化对象

'''个人信用卡信息'''
def creditcard_info():
    while True:
        with open(creditcard_path,'r',encoding='utf8') as f:
            creditcard_data = json.loads(f.read())
            choice = input("请输入你要查询的信用卡卡号(8位数字)(退出输入q):").strip()
            if choice in creditcard_data.keys():
                print("我的信用卡信息:".center(50,'-'))
                print("持卡人:[ %s ]\n卡号:[ %s ]\n额度:[ %s ]\n可用额度:[ %s ]\n提现额度:[ %s ]"
                      % (creditcard_data[choice]["personinfo"],choice,creditcard_data[choice]["deflimit"],
                         creditcard_data[choice]["limit"],creditcard_data[choice]["limitcash"]))
            elif choice == "q":
                break
            else:
                print("你输入的信用卡不存在!")
'''信用卡转账'''
def transfer():
    while  True:
        print("信用卡转账".center(50, '-'))
        with open(creditcard_path,'r+',encoding='utf8') as f:
            creditcard_data = json.loads(f.read())
            choice = input("请输入你的信用卡账号('q'返回):").strip()
            if choice == 'q':
                break
            if choice in creditcard_data.keys():
                now_limit = creditcard_data[choice]["limit"]
                transfer_card = input("请输入你要转账的账户:").strip()
                if transfer_card.isdigit() and transfer_card in creditcard_data.keys() and len(transfer_card) == 8:
                    transfer_money = input("请输入转账金额:").strip()
                    if transfer_money.isdigit():
                        transfer_money = int(transfer_money)
                        creditcard_passwd = input("请输入信用卡密码:").strip()
                        creditcard_passwd = int(creditcard_passwd)
                        if creditcard_passwd == creditcard_data[choice]["password"]:
                            if transfer_money <= int(now_limit):
                                creditcard_data[choice]["limit"] -= transfer_money
                                creditcard_data[choice]["limitcash"] -= transfer_money
                                creditcard_data[transfer_card]["limit"] += transfer_money
                                creditcard_data[transfer_card]["limitcash"] += transfer_money
                                print("转账成功".center(50,'-'))
                                print("转账金额:[ %s ]\n信用卡可用额度:[ %s ]" % (transfer_money,creditcard_data[choice]["limit"]))
                                '''转账信息记录到日志'''
                                transfer_info = ["信用卡转账",str(choice),str(transfer_money)]
                                transfer_info = '---'.join(transfer_info)
                                logger.debug(transfer_info)
                                f.seek(0)
                                #f.truncate(0)
                                creditcard_data_dumps = json.dumps(creditcard_data)
                                f.write(creditcard_data_dumps)
                            else:
                                print("转账额度不能大于信用额度")
                        else:
                            print("输入密码有误")
                    else:
                        print("请输入数字格式的金额!")
                else:
                    print("你输入的账户不存在")
            else:
                print("你输入的信用卡账号不存在!")
'''信用卡取现'''
def takecash():
    while True:
        print("信用卡取现".center(50,'-'))
        with open(creditcard_path,'r+',encoding='utf-8') as f:
            creditcard_data = json.loads(f.read())
            creditcard = input("请输入你的信用卡账号(q返回):").strip()
            if creditcard == 'q':break
            if creditcard in creditcard_data.keys():
                limit = creditcard_data[creditcard]["limit"]
                limitcash = creditcard_data[creditcard]["limitcash"]
                totalbill = creditcard_data[creditcard]["totalbill"]
                print("信用卡额度:[ %d ]\n信用卡账单:[ %d ]\n单信用卡可取现额度:[ %d ]" %(limit,totalbill,limitcash,))
                cash = input("请输入你要取现的额度,手续费%5:").strip()
                if cash.isdigit() and 0 < int(cash) <= limitcash:
                    passwd = input("请输入信用卡:%s的密码:" %(creditcard)).strip()
                    if int(passwd) == creditcard_data[creditcard]["password"]:
                        cash = int(cash)
                        fee = cash * 0.05  # 手续费
                        total_cash = cash + fee
                        totalbill += cash
                        creditcard_data[creditcard]["limitcash"] -= total_cash
                        creditcard_data[creditcard]["limit"] -= total_cash
                        creditcard_data[creditcard]["totalbill"] = totalbill
                        print("成功取现:[%d]\n收取手续费:[%d]" %(cash,fee))
                        '''取现信息记录到日志'''
                        takecash_info = ["信用卡取现",creditcard,str(cash)]
                        takecash_info = '---'.join(takecash_info)
                        logger.debug(takecash_info)
                        '''永久保存数据库'''
                        f.seek(0)
                        creditcard_data = json.dumps(creditcard_data)
                        f.write(creditcard_data)
                        f.flush()
                    else:
                        print("信用卡密码有误!")
                else:
                    print("你输入额度含有非数字或超过可取现额度")
            else:
                print("你输入的信用卡账号不存在")
'''信用卡还款'''
def repayment():
    while True:
        print("信用卡还款".center(50,'-'))
        creditcard = input("请输入信用卡账号:").strip()
        with open(creditcard_path,'r+',encoding='utf8') as f:
            creditcard_data = json.loads(f.read())
            print(creditcard_data)
            if creditcard in creditcard_data.keys():
                totalbill = creditcard_data[creditcard]["totalbill"]
                print("你的信用卡[%s]总账单:[%d]"%(creditcard,totalbill))
                repayments = input("请输入你要还款的额度:").strip()
                if repayments.isdigit() and 0 < int(repayments) <= totalbill:
                    passwd = input("请输入信用卡:[%s]的密码:"%(creditcard)).strip()
                    if int(passwd) == creditcard_data[creditcard]["password"]:
                        repayments = int(repayments)
                        creditcard_data[creditcard]["totalbill"] -= repayments
                        creditcard_data[creditcard]["limit"] += repayments
                        creditcard_data[creditcard]["limitcash"] += repayments
                        totalbill -= repayments
                        '''记录还款信息到日志'''
                        repayment_info = ["信用卡还款",creditcard,str(repayments)]
                        repayment_info = '---'.join(repayment_info)
                        logger.debug(repayment_info)
                        '''写到文件'''
                        f.seek(0)
                        creditcard_data = json.dumps(creditcard_data)
                        f.write(creditcard_data)
                        f.flush()
                        print("成功还款:[%d]\n剩下总账单:[%d]"%(repayments,totalbill))
                    else:
                        print("你输入的密码有误")
                else:
                    print("你输入的额度非数字或超过还款额度!")
            else:
                print("你输入的信用卡账号不存在!")

credictcard.py

#coding:utf-8
#Author:Mr Zhi
import logging,os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #获取上级目录的绝对路径
log_dir = BASE_DIR + '/log/record.log'
def get_logger():
    fh = logging.FileHandler(log_dir,encoding='utf-8') #创建一个文件流并设置编码utf8
    logger = logging.getLogger() #获得一个logger对象,默认是root
    logger.setLevel(logging.DEBUG)  #设置最低等级debug
    fm = logging.Formatter("%(asctime)s --- %(message)s")  #设置日志格式
    logger.addHandler(fh) #把文件流添加进来,流向写入到文件
    fh.setFormatter(fm) #把文件流添加写入格式
    return logger

log.py

#coding:utf-8
#Author:支文伟
import os,json
from log import get_logger
logger = get_logger() #日志模块实例化对象
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
'''数据库文件的绝对路径'''
shopping_data = base_dir + '/db/shopping_data'
shopping_car = base_dir + '/db/shopping_car'
creditcard_data = base_dir + '/db/creditcard_data'

'''购物商城'''
def mall():
    product_list = []
    product_list2 = []
    with open(shopping_data,'r',encoding='utf8') as f:
        for i in f:
            product_list.append(i.strip("\n").split(' ')) #拆分为列表并添加到product_list
    def product_info():
        for index,item in enumerate(product_list):
            print(index +1,item[0],item[1])
    while True:
        print("欢迎来到购物商城".center(30, '-'))
        product_info()
        choice_id = input("请输入商品编号(q返回):").strip()
        if choice_id.isdigit():
            choice_id = int(choice_id)
            if 0 <= choice_id <= len(product_list):
                product_item = product_list[choice_id-1] #获取选择的商店
                print("商品 %s 加入购物车,价格 %s " % (product_item[0],product_item[1]))
                product_list2.append(product_item)
                '''购物信息记录到日志模块'''
                shopping_info = ["购物",str(product_item[0]),"价格",product_item[1]]
                shopping_info = "---".join(shopping_info)
                logger.debug(shopping_info)
            else:
                print("没有对应的商品编号,请重新输入!")
        elif choice_id == "q":
            with open(shopping_car,'r+',encoding='utf-8') as f:
                list = json.loads(f.read())
                list.extend(product_list2)
                f.seek(0)
                list = json.dumps(list)
                f.write(list)
                f.flush()
                break
        else:
            print("没有对应的商品编号,请重新输入!")

'''清空购物车'''
def del_shoppingcar():
    while True:
        choice = input("是否清空购物车?('y'确认'q'退出):").strip()
        if choice == 'q':break
        if choice == 'y':
            with open(shopping_car,"r+",encoding='utf-8') as f:
                res = json.loads(f.read())
                print(type(res))
                if res != []:
                    f.seek(0)
                    f.truncate(0)  #截断后面所有的字符也就是清空
                    list = json.dumps([])
                    f.write(list)
                    f.flush()
                    print("购物车已经清空!")
                    break
                else:
                    print("你还没有消费,购物车为空!")
        else:
            print("你输入指令有误!")
            break

'''购物结算'''
def shopping_pay():
    while True:
        print("购物结算".center(50,'-'))
        with open(shopping_car,'r+',encoding='utf-8') as f:
            data = json.loads(f.read())
            if data != []:
                print("\t商品\t价格")
                for index,item in enumerate(data):
                    print(index +1,item[0],item[1])
                money = sum([int(i[1]) for i in data])
            else:
                print("你还没消费,快去花钱吧!")
                break
        choice = input("商品总额:%s (y)确认支付,(q)返回:" %(money))
        if choice == 'q':break
        if choice == 'y':
            creditcard_id = input("请输入结算的信用卡账号:").strip()
            with open(creditcard_data,'r+',encoding='utf-8') as f2:
                _creditcard_data  = json.loads(f2.read())
                if creditcard_id in _creditcard_data.keys():
                    passwd = input("请输入信用卡 %s 支付密码:" % (_creditcard_data[creditcard_id]["credictcard"])).strip()
                    if int(passwd) == _creditcard_data[creditcard_id]["password"]:
                        limit = _creditcard_data[creditcard_id]["limit"]
                        limitcash = _creditcard_data[creditcard_id]["limitcash"]
                        if _creditcard_data[creditcard_id]["limit"] >= money:
                            _creditcard_data[creditcard_id]["limit"] -= money
                            _creditcard_data[creditcard_id]["limitcash"] -= money
                            _creditcard_data[creditcard_id]["totalbill"] += money #账单
                            '''写入日志'''
                            shopping_info = [creditcard_id,"信用卡商城结账",str(money)+"¥"]
                            shopping_info = '--'.join(shopping_info)
                            logger.debug(shopping_info)
                            '''写入数据'''
                            dict = json.dumps(_creditcard_data)
                            f2.seek(0)
                            f2.truncate(0)
                            f2.write(dict)
                            print("支付成功:%s¥"%(money))
                            break
                        else:
                            print("当前信用卡额度%s不足支付!"%(limit))
                    else:
                        print("密码有误,请重新输入!")
                else:
                    print("你输入的信用卡不存在!")

'''查看购物车'''
def search_shopppingcar():
    print("购物车".center(60,'-'))
    with open(shopping_car,'r',encoding='utf-8') as f:
        shopping_car_info = json.loads(f.read())
        if shopping_car_info != []:
            print("\t商品\t价格")
            for i in shopping_car_info:
                print(i)
        else:
            print("购物车为空,请去商城看看!!!")

shopping_mall

												

模拟实现ATM+购物商城程序的更多相关文章

  1. day4作业模拟实现一个ATM + 购物商城程序

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

  2. 2.2 - ATM+购物商城程序

    要求:模拟实现一个ATM + 购物商城程序1.额度 15000或自定义2.实现购物商城,买东西加入 购物车,调用信用卡接口结账3.可以提现,手续费5%4.支持多账户登录5.支持账户间转账6.记录每月日 ...

  3. First Project -用函数写的ATM+购物商城程序

    作业需求:模拟实现一个ATM + 购物商城程序 额度15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠 ...

  4. ATM&购物商城程序

    模拟实现一个ATM + 购物商城程序 额度15000或自定义 实现购物商城,买东西加入购物车,调用信用卡接口转账 可以体现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接 ...

  5. ATM:模拟实现一个ATM + 购物商城程序

    额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接 ...

  6. 模拟实现一个ATM+购物商城程序

    记得上次小编上传了一个购物车程序,这次呢稍微复杂一点,还是那句话,上传在这里不是为了炫耀什么,只是督促小编学习,如果大神有什么意见和建议,欢迎指导.(PS:本次主要参考学习为主,自己原创的很少) 要求 ...

  7. python 模拟实现一个ATM + 购物商城程序

    思路:ATM是一个单独程序,提供给消费的是一个接口core下的settlement.py,只做了个人的,没写管理的模块 Shopping也是一个单独的,只做了一个购物的消费模块,没写商家模块,偷懒用了 ...

  8. Python开发程序:ATM+购物商城

    一.程序要求 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还 ...

  9. ATM+购物商城

    知识内容: 1.luffy买tesla 2.ATM+购物商城 一.luffy买tesla 需求: 1.目录结构说明 account luffy.json --> 存储用户账户信息 {" ...

随机推荐

  1. python使用cx_Oracle在Linux和Windows下的一点差异

    1. 主要是线程方面的差异. Windows下,把cx_Oracle.connect(connectedId)得到的handle传给定时器线程,主线程和和定时器可以用同一个handle. 但Linux ...

  2. 解决vmvare关闭过慢

    打开虚拟机文件夹下的.vmx文件,将下面的内容添天加进去,保存prefvmx.minVmMemPct = "100" mainMem.useNamedFile = "FA ...

  3. shell基础:环境变量

    子shell是在父shell中打开的shell. 使用pstree查看进程树. $调用环境变量 set查看所有变量内容, env查询环境变量 只是临时改变

  4. 利用css伪类编写冒泡小三角

    HTML代码 <div class="lf otherLogin"> <span>其他方式注册</span> <div class=&qu ...

  5. nodejs发送邮件

    这里我主要使用的是 nodemailer 这个插件 第一步 下载依赖 cnpm install nodemailer --save 第二步 建立email.js 'use strict'; const ...

  6. H5进行录音,播放,上传

    废话不说,直接上代码吧 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q ...

  7. LeetCode69.x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  8. DataGridView控件用法合集

    1.当前的单元格属性取得.变更 Console.WriteLine(DataGridView1.CurrentCell.Value) Console.WriteLine(DataGridView1.C ...

  9. jdk8新特性-亮瞎眼的lambda表达式

    jdk8之前,尤其是在写GUI程序的事件监听的时候,各种的匿名内部类,大把大把拖沓的代码,程序毫无美感可言!既然Java中一切皆为对象,那么,就类似于某些动态语言一样,函数也可以当成是对象啊!代码块也 ...

  10. SQLConnect

    SQLConnect 函数定义: 这个函数就是与数据库建立连接 SQLRETURN SQLConnect( SQLHDBC     ConnectionHandle, SQLCHAR *     Se ...