模拟实现ATM+购物商城程序

流程图:

需求:

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()

db目录

{"66661111": {"locked": "False", "password": 666666, "totalbill": 998, "credictcard": 66661111, "deflimit": 15000, "personinfo": "zhiww", "limitcash": 6502, "limit": 14002}, "66668888": {"credictcard": 66668888, "password": 123456, "totalbill": 0, "locked": "False", "deflimit": 15000, "personinfo": "alex", "limitcash": 7500, "limit": 15000}}
[["shoes", "998"]]
oppoR9s 2500
ipad 5000
book 350
bike 1999
clothes 1600
shoes 998
{"admin": "123"}

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
#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("你输入有误!")
#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("你输入的信用卡账号不存在!")
#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
#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("购物车为空,请去商城看看!!!")

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器人网

工程师须知:关于伺服电机的21个关键问题

工业机器人电动伺服系统的一般结构为三个闭环控制,即电流环、速度环和位置环。一般情况下,对于交流伺服驱动器,可通过对其内部功能参数进行人工设定而实现位置控制、速度...

30680
来自专栏黑白安全

网络安全究竟是什么?

“网络安全”是指任何活动旨在保护您的网络和数据的可用性和完整性。它包括硬件和软件技术。有效的网络安全管理对网络的访问。它针对的是一种不同的威胁,阻止他们进入或在...

12120
来自专栏FreeBuf

不是闹鬼,是病毒!全球首个Golem(傀儡)病毒感染数万手机

手机放在桌子上充电,突然亮屏,在没人触摸的情况下,一个手机游戏自己运行,滑动,执行许多命令。执行完之后,手机静悄悄关闭屏幕显示,跟什么都没发生一样。手机主人会发...

22180
来自专栏黑白安全

GovPayNet 凭证系统存在漏洞 1400 万交易记录被曝光

GovPayNet是总部位于美国印第安納波利斯市(Indianapolis)的私营企业,为美国35个州的2300多个美国政府机构提供在线支付服务。根据最新信息,...

10030
来自专栏FreeBuf

2015 Android 恶意软件威胁报告(上)

执行摘要 勒索软件在过去几年中一直困扰着Windows PC,但最近,勒索软件的平台已经不局限于Windows系统,它的魔爪已经伸向了Linux和Androi...

23960
来自专栏海天一树

2.5亿融资引发的血案:中国红芯依然是谷歌芯

中午吃饭的时候,把红芯浏览器的融资故事,给做区块链发空气币的朋友简单讲了一下。他气得拍起了桌子:“这TM是诈骗啊,兄弟。

14110
来自专栏黑白安全

研究称卫星有漏洞:黑客可让卫星过度充电令其损

(原标题:Warning over satellite security bugs)

9820
来自专栏FreeBuf

最新漏洞利用包可租用每天需80美元

? 近日,以色列网络安全公司IntSights Cyber Intelligence透露,一种新型的漏洞利用套件正在俄罗斯某地下黑客论坛被进行出售。据论坛信息...

441110
来自专栏顶级程序员

删雇主网站源码判刑五年!!

来自:程序员头条 据新华社报道,软件工程师徐某离职后因公司未能如期结清工资,便利用其在所设计的网站中安插的后门文件将网站源代码全部删除。 ? 公诉机关北京市丰...

30860
来自专栏Dawnzhang的开发者手册

https与http的区别?

11810

扫码关注云+社区

领取腾讯云代金券