python自动化-作业5.ATM+购物商城————A

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

完成时间:2018、12、14
项目名称:
ATM + 购物商城程序v1.0版

工程文件目录:

start.py文件:
import sys
import os

start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(start_path)

from conf.config import *
from core.src import *
from core.atm import *


if __name__ == '__main__':
    while True:
        user = json.load(open('../db/admin_info', 'r'))
        print('欢迎来到ATM+完美购物商城'.center(100,'-'))
        in_user = input('请输入您的账号:\n>>>')
        if in_user == 'q':                                                          # 退出
            Flog['exit_flog'] = True
            exit('您已经退出'.center(100,'-'))
        in_password = input('请输入您的密码:\n>>>')
        if in_password == 'q':                                                      # 退出
            Flog['exit_flog'] = True
            exit('您已经退出'.center(100,'-'))
        for i in user:
            if in_user == i.get('username') and in_password == i.get('password'):
                Flog['login_flog'] = True
                print('登录成功'.center(50,'-'))
                logging.debug('debug')
                logging.info('--------<{}>成功登录--------'.format(i['username']))
                Flog['tamp_item'] = i                                                       # tamp_item存放登录账户的所有信息字典
                Flog['tamp_item']['wares'] = {}                                             # 拿购物车
                Flog['tamp_item']['total_price'] = 0                                        # 单次购买商品总价
                Flog['tamp_item']['this_buy'] = {}                                          # 清空本次购买(上次购买)
                break
        if Flog['login_flog']:
            Flog['login_flog'] = False
            while True:
                print('请输入您的选择:\n1.ATM账户\n2.购物商城\n3.ATM管理(管理员账户可用)')
                select = input('请输入您的选择序号(q.退出登录):>>>')
                if select == 'q':
                    print('退出成功'.center(50,'-'))
                    logging.debug('debug')
                    logging.info('--------<{}>退出成功--------'.format(Flog['tamp_item']['username']))
                    break
                if int(select) in range(1,4):
                    if select == '1':
                        Atm_System(user,Flog['tamp_item']['username'])                      # 进入ATM账户
                    if select == '2':
                        Shopping_Mall(user)                                                 # 进入网上商城
                        if Flog['exit_flog']:
                            break
                    if select == '3':                                                       # 进入ATM管理(新增账户、提高额度、冻结账户)
                        if not Flog['tamp_item']['manager']:
                            print('请使用管理员账户登录'.center(50,'-'))
                            break
                        ATM_manage(user)                                                    # 只限管理员账户使用
                    if Flog['restart_system']:
                        Flog['restart_system'] = False
                        break
                else:
                    print('您的输入有误,请重新输入'.center(50,'-'))
        else:
            print('您的账户或密码输入错误,请重新输入'.center(50,'-'))

atm.py文件:

#author:    guogangzhi

import json
from conf.config import *

start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(start_path)



def find_atminfo():                     # 查询信用卡信息
    print('登录的信用卡信息'.center(100,'-'))
    print('账户名称     信用卡可用额度      还款时间')
    print('{}           {}                 {}'.format(Flog['atm_tamp_item']['atm_user'],
                                               Flog['atm_tamp_item']['remainder'],
                                               Flog['atm_tamp_item']['repayment_time']))
    print('这个月的消费流水'.center(80,'-'))
    print('序号        购买时间                  数量       价格     商品名称')
    Flog['atm_tamp_item']['consume_water'] = Flog['tamp_item']['Records_of_consumption']
    for buytime, item in Flog['atm_tamp_item']['consume_water'].items():
        print('---------------------------{}---------------------------'.format(buytime))
        for num, (x, i) in enumerate(item.items()):
            print('{: <3}       {: <20}       {: <3}        {}      {}'.format(num + 1, x, i[0], i[1], i[2]))

def withdraw_deposit():                 # 提现
    while True:
        out_money = input('请输入你要提现的金额(手续费:5%)(q.退出提现):>>>')
        if out_money == 'q':
            print('退出提现'.center(50,'-'))
            break
        if out_money.isdigit():
            out_money = int(out_money)
            if Flog['atm_tamp_item']['remainder'] >= out_money*(1+0.05):
                Flog['atm_tamp_item']['remainder'] -= out_money*(1+0.05)
                print('提现成功'.center(50,'-'))
                logging.debug('debug')
                logging.info('{}账户提现成功'.format(Flog['atm_tamp_item']['atm_user']))
                break
            else:
                print('您的额度不够,请减少提现金额'.center(50,'-'))
        else:
            print('您的输入有误,请重新输入'.center(50,'-'))

def transfer_accounts(a):                # 转账
    while True:
        transfer_user = input('请输入您要转账账户的用户名(q.退出转账):>>>')
        if transfer_user == 'q':
            print('您已经退出转账'.center(50,'-'))
            break
        transfer_password = input('请输入您要转账账户的密码(q.退出转账):>>>')
        if transfer_password == 'q':
            print('您已经退出转账'.center(50,'-'))
            break
        for keys in a:
            for i in a[keys]:
                if transfer_user == i['atm_user'] and transfer_password == i['atm_password']:
                    print('账户存在'.center(50,'-'))
                    Flog['transfer_user_exist'] = True
                    Flog['atm_transfer_item'] = i
        if Flog['transfer_user_exist']:                         # 账户存在可以转账
            Flog['transfer_user_exist'] = False
            transfer_mormy = input('请输入转账金额:>>>')
            if transfer_mormy.isdigit():
                transfer_mormy = int(transfer_mormy)
                if Flog['atm_tamp_item']['remainder'] >= transfer_mormy:
                    Flog['atm_transfer_item']['remainder'] += transfer_mormy        # 转入账户+
                    Flog['atm_tamp_item']['remainder'] -= transfer_mormy            # 转出账户-
                    print('转账成功'.center(50,'-'))
                    logging.debug('debug')
                    logging.info('{}账户提现成功'.format(Flog['atm_tamp_item']['atm_user']))
                    Flog['atm_transfer_item'] = None
                    break
                else:
                    print('额度不够'.center(50,'-'))
            else:
                print('输入错误'.center(50,'-'))
        else:
            for keys in a:
                for i in a[keys]:
                    if transfer_user == i['atm_user'] and '_' + transfer_password == i['atm_password']:
                        Flog['freeze_flog'] = True  # 判断账户是否冻结
                        break
            if Flog['freeze_flog']:
                Flog['freeze_flog'] = False
                print('您的账户已经被冻结'.center(50,'-'))
            else:
                print('您输入的账户不存在,请重新输入'.center(50,'-'))

def repayment():            # 还款
    while True:
        in_repayment = input('请输入还款金额(q.退出还款):>>>')
        if in_repayment == 'q':
            print('您现在已经退出还款'.center(50,'-'))
            break
        if in_repayment.isdigit():
            in_repayment = int(in_repayment)
            if in_repayment>0:
                Flog['atm_tamp_item']['remainder'] += in_repayment
                print('还款成功'.center(50,'-'))
                logging.debug('debug')
                logging.info('{}账户还款成功'.format(Flog['atm_tamp_item']['atm_user']))
                break
        else:
            print('您的输入有误,请重新输入'.center(50,'-'))

def change_loginuser(u,a,n):             # 更改绑定ATM账户
    '''
    :param u:   user
    :param n:   绑定商城的帐号名
    :return:
    '''
    while True:
        in_username = input('请输入您新绑定账户的用户名(q.退出绑定账户):>>>')
        if in_username == 'q':
            print('您已经退出绑定账户'.center(50,'-'))
            break
        in_userpassword = input('请输入您新绑定账户的密码(q.退出绑定账户):>>>')
        if in_username == 'q':
            print('您已经退出绑定账户'.center(50,'-'))
            break
        for i in a[n]:
            if in_username == i['atm_user'] and in_userpassword == i['atm_password']:
                print('账户存在'.center(50, '-'))
                Flog['transfer_user_exist'] = True
                Flog['atm_transfer_item'] = i
        if Flog['transfer_user_exist']:
            Flog['tamp_item']['username'] = Flog['atm_transfer_item']['atm_user']
            a[Flog['tamp_item']['username']] = a[n]                         # 在atm中将绑定商城的帐号修改
            del(a[n])                                                     # 用的方法是删除原来的新建一个键值对
            json.dump(u,open('../db/admin_info','w'))
            json.dump(a,open('../db/atm_admin_info','w'))
            print('绑定账户成功'.center(50,'-'))
            logging.debug('debug')
            logging.info('{}绑定账户成功'.format(Flog['tamp_item']['username']))
            Flog['transfer_user_exist'] = False
            Flog['atm_transfer_item'] = None
            Flog['restart_system'] = True                   # 重启系统
            print('请重新登录系统'.center(100,'-'))
            break
        else:
            for i in a[n]:
                if in_username == i['atm_user'] and '_' + in_userpassword == i['atm_password']:
                    Flog['freeze_flog'] = True  # 判断账户是否冻结
                    break
            if Flog['freeze_flog']:
                Flog['freeze_flog'] = False
                print('您的账户已经被冻结'.center(50,'-'))
            else:
                print('您输入的账户/密码错误,请重新输入'.center(50,'-'))

def login_elseuser(a,n):                                      # 登录其他账户(商城账户的用户的其他atm账户)
    while True:
        in_atmusername = input('请输入您其他账户的用户名(q.退出绑定账户):>>>')
        if in_atmusername == 'q':  # 退出
            print('退出登录其他用户'.center(50,'-'))
            break
        in_atmpassword = input('请输入您其他账户的密码(q.退出绑定账户):>>>')
        if in_atmpassword.startswith('_'):
            print('这个账户已被冻结,请使用其他账户'.center(50,'-'))
            break
        if in_atmpassword == 'q':  # 退出
            print('退出登录其他用户'.center(50, '-'))
            break
        for i in a[n]:
            if in_atmusername == i.get('atm_user') and in_atmpassword == i.get('atm_password'):
                Flog['atm_login_flog'] = True   # 置位登录成功标志
                Flog['atm_tamp_item'] = i       # tamp_item登录账户的所有信息字典
                break
        if Flog['atm_login_flog']:
            Flog['atm_login_flog'] = False
            print('账户切换成功'.center(50, '-'))
            break
        else:
            for i in atm[login_goods_user]:
                if in_atmusername == i.get('atm_user') and '_' + in_atmpassword == i.get('atm_password'):
                    Flog['freeze_flog'] = True  # 判断账户是否冻结
                    break
            if Flog['freeze_flog']:
                Flog['freeze_flog'] = False
                print('您的账户已经被冻结'.center(50,'-'))
            else:
                print('您输入的帐号、密码有误,请重新输入'.center(50,'-'))

def Atm_System(u,login_goods_user):
    '''
    :param u:   admin_info中的所有数据
    :param login_goods_user:    商城的登录帐号名
    :return:
    '''
    while True:
        atm = json.load(open('../db/atm_admin_info', 'r'))
        in_atmpassword = input('请输入您绑定商城的账户密码(q.退出登录ATM):>>>')
        if in_atmpassword == 'q':                                                           # 退出
            Flog['quit_atm'] = True
            break
        for i in atm[login_goods_user]:
            if login_goods_user == i.get('atm_user') and in_atmpassword == i.get('atm_password'):
                Flog['atm_login_flog'] = True                                               # 置位登录成功标志
                print('登录ATM成功'.center(50, '-'))
                logging.debug('debug')
                logging.info('{}登录ATM成功'.format(i['atm_user']))
                Flog['atm_tamp_item'] = i                           # tamp_item登录账户的信用卡密码对应的信息字典
                break
        if Flog['atm_login_flog']:
            Flog['atm_login_flog'] = False  # 复位登录成功标志
            while True:
                print('【{}】请选择您需要的服务项目:\n1.查询信用卡信息\n2.提现\n3.转账\n4.还款\n5.更改绑定ATM账户\n6.登录其他账户\n'.format(Flog['atm_tamp_item']['atm_user']))
                in_select = input('请输入您的选择(q.退出ATM、z.重启系统):>>>')
                if in_select == 'q':                        # 退出ATM
                    Flog['quit_atm'] = True
                    break
                if in_select == 'z':                        # 退出整个系统
                    Flog['restart_system'] = True
                    break
                if int(in_select) in range(1,7):
                    if in_select == '1':                    # 1.查询信用卡信息
                        find_atminfo()
                    if in_select == '2':                    # 2.提现
                        withdraw_deposit()
                    if in_select == '3':                    # 3.转账
                        transfer_accounts(atm)
                    if in_select == '4':                    # 4.还款
                        repayment()
                    if in_select == '5':                    # 5.更改绑定ATM账户
                        change_loginuser(u,atm,login_goods_user)
                    if in_select == '6':                    # 6.登录其他账户(商城账户的用户的其他atm账户)
                        login_elseuser(atm,login_goods_user)
                else:
                    print('输入错误,请重新输入'.center(50,'-'))
                if Flog['restart_system']:                  # 重新启动系统
                    break
        else:
            for i in atm[login_goods_user]:
                if login_goods_user == i.get('atm_user') and '_' + in_atmpassword == i.get('atm_password'):
                    Flog['freeze_flog'] = True  # 判断账户是否冻结
                    break
            if Flog['freeze_flog']:
                Flog['freeze_flog'] = False
                print('您的账户已经被冻结'.center(50,'-'))
            else:
                print('密码输入有误,请重新输入'.center(50,'-'))
        if Flog['restart_system']:  # 重新启动系统
            break
        if Flog['quit_atm']:        # 退出ATM
            break
    if Flog['restart_system'] or Flog['quit_atm']:               # 判断是否已经退出ATM
        json.dump(atm,open('../db/atm_admin_info','w'))         # 将数据保存到文件
        Flog['quit_atm'] = False
        print('您已经退出ATM'.center(100, '-'))
        logging.debug('debug')
        logging.info('{}登录ATM成功'.format(Flog['atm_tamp_item']['atm_user']))

def new_atm_user(u,a):                     # 新增账户
    while True:
        goods_user = input('请输入您已经绑定的购物商城帐号:>>>')
        goods_password = input('请输入您已经绑定的购物商城密码:>>>')
        for i in u:
            if goods_user == i['username'] and goods_password == i['password']:
                Flog['goods_user_yes'] = True
                break
        if Flog['goods_user_yes']:              # 购物商城账户确认(表示在这个商城账户下创建ATM账户)
            in_user = input('请输入您要在【{}】帐号下创建账户的用户名>>>'.format(goods_user))
            in_password = input('请输入您要在【{}】帐号下创建账户的密码:>>>'.format(goods_user))
            new_user = {
                'atm_user': in_user,              # atm账户
                'atm_password': in_password,          # atm密码
                'remainder': 15000,             # 信用卡额度
                'consume_water': {},            # 每月消费流水
                'repayment_time': '每个月10号', # 还款时间str
            }
            a[goods_user].append(new_user)           # 创建ATM账户完成
            # print(a[goods_user])
            json.dump(a, open('../db/atm_admin_info', 'w'))  # 将数据保存到文件
            print('ATM用户创建完成'.center(50,'-'))
            logging.debug('debug')
            logging.info('{}ATM账户创建完成'.format(goods_user))
            break
        else:
            print('没有这个绑定商城的帐号'.center(50,'-'))

def up_atm_remainder(a):                 # 提高ATM账户额度
    while True:
        in_user = input('请输入要提高额度ATM账户的用户名:>>>')
        in_password = input('请输入要提高额度ATM账户的密码:>>>')
        for value in a.values():
            for i in value:
                if in_user == i['atm_user'] and in_password == i['atm_password']:
                    Flog['tamp_flog_yes'] = True
                    Flog['atm_manage_item'] = i
                    print('已经确认账户'.center(50,'-'))
                    break
            if Flog['tamp_flog_yes']:
                break
        if Flog['tamp_flog_yes']:
            Flog['tamp_flog_yes'] = False
            in_mormy = input('额度提升到多少:>>>')
            if in_mormy.isdigit() and int(in_mormy)>15000:
                in_mormy = int(in_mormy)-15000
                Flog['atm_manage_item']['remainder'] += in_mormy
                json.dump(a, open('../db/atm_admin_info', 'w'))  # 将数据保存到文件
                print('ATM账户额度以提高'.center(50,'-'))
                logging.debug('debug')
                logging.info('{}账户额度以提高'.format(Flog['atm_manage_item']['atm_user']))
                break
            else:
                print('您的输入有错误,请重新输入'.center(50,'-'))
        else:
            print('没有找到对应账户'.center(50,'-'))

def freeze_atm(a):                               # 冻结账户 在账户的密码前面加‘_’,在登录时做判断是否冻结。
    while True:
        in_user = input('请输入要冻结的ATM账户的用户名:>>>')
        in_password = input('请输入要冻结的ATM账户的密码:>>>')
        for value in a.values():
            for i in value:
                if in_user == i['atm_user'] and in_password == i['atm_password']:
                    Flog['tamp_flog_yes'] = True
                    Flog['atm_manage_item'] = i
                    print('已经确认账户'.center(50,'-'))
                    break
            if Flog['tamp_flog_yes']:
                break
        if Flog['tamp_flog_yes']:
            Flog['tamp_flog_yes'] = False
            Flog['atm_manage_item']['atm_password'] = '_'+Flog['atm_manage_item']['atm_password']
            json.dump(a, open('../db/atm_admin_info', 'w'))  # 将数据保存到文件
            print('ATM账户以冻结'.center(50,'-'))
            logging.debug('debug')
            logging.info('{}账户已被冻结'.format(Flog['atm_manage_item']['atm_user']))
            break
        else:
            print('没有找到对应账户'.center(50,'-'))

def ATM_manage(u):                            # 进入ATM管理(新增账户、提高额度、冻结账户)
    while True:
        atm = json.load(open('../db/atm_admin_info', 'r'))
        print('ATM管理'.center(100,'-'))
        logging.debug('debug')
        logging.info('登录ATM管理')
        print('请选择您的操作:\n1.新增ATM账户\n2.提高账户额度\n3.冻结账户\n')
        in_select= input('请输入您的选择(q.退出ATM管理、z.重启系统):>>>')
        if in_select == 'q':
            Flog['quit_atm_manage'] = True          # 退出ATM管理标志置位
            break
        if in_select == 'z':
            Flog['restart_system'] = True           # 重启系统
            break
        if int(in_select) in range(1,4):
            if in_select == '1':                    # 1.新增ATM账户
                new_atm_user(u,atm)
            if in_select == '2':                    # 2.提高账户额度
                up_atm_remainder(atm)
            if in_select == '3':                    # 3.冻结账户
                freeze_atm(atm)
        else:
            print('您的输入有误请重新输入'.center(50,'-'))
    if Flog['restart_system'] or Flog['quit_atm_manage']:
        Flog['quit_atm_manage'] = False
        json.dump(atm, open('../db/atm_admin_info', 'w'))           # 将数据保存到文件
        print('您已经退出ATM管理'.center(100,'-'))
        logging.debug('debug')
        logging.info('退出ATM管理')

src.py文件:

import json
import time
from conf.config import *
from bin.start import *
start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(start_path)

def add_gocar(goods_key,unit_price,num):                               # 将商品加入购物车(商品名称、单价、数量)
    time_obj = time.localtime()  # 加入购物车时间戳
    time_str = '{}-{}-{} {}:{}:{}'.format(
        time_obj.tm_year,
        time_obj.tm_mon,
        time_obj.tm_mday,
        time_obj.tm_hour,
        time_obj.tm_min,
        time_obj.tm_sec)
    if goods_key in Flog['tamp_item']['wares'].keys():
        select_value_num = Flog['tamp_item']['wares'][goods_key][0] + num  # 如果有同样的商品和之前的购买数量相加
    else:
        select_value_num = num
        Flog['tamp_item']['wares'][goods_key] = [select_value_num,select_value_num*unit_price,time_str]  # 存入用户商品名称、数量、价格、时间戳到用户账户

def display_gocar():
    print('您现在购物车中的商品有'.center(80,'-'))
    print('序号       名称                        数量     价格')
    Flog['tamp_tamp'] = Flog['tamp_item'].get('wares')
    Flog['tamp_item']['total_price'] = 0
    for num, i in enumerate(Flog['tamp_tamp'].items()):
        Flog['tamp_item']['total_price'] += i[1][1]
        print('{: <3}      {: <15}{: <3}      {}'.format(num + 1, i[0], i[1][0], i[1][1]))
    print('-'*60)
    print('总价:{: >50}'.format(Flog['tamp_item']['total_price']))
    print('-' * 90)

def credit_card_interface():                 # 结账
    if Flog['tamp_item']['total_price']:                                            # 购物车不为空
        if Flog['tamp_item']['remainder'] >= Flog['tamp_item']['total_price']:              # 判断是否买得起
            Flog['tamp_item']['remainder'] -= Flog['tamp_item']['total_price']              # 从信用卡额度扣除
            print('购买成功'.center(50, '-'))
            time_obj = time.localtime()  # 下单时间戳
            time_str = '{}-{}-{} {}:{}:{}'.format(
                time_obj.tm_year,
                time_obj.tm_mon,
                time_obj.tm_mday,
                time_obj.tm_hour,
                time_obj.tm_min,
                time_obj.tm_sec)
            Flog['tamp_item']['Records_of_consumption'][time_str] = {}
            for w_name, w_value in Flog['tamp_item']['wares'].items():  # 购买时间/购买商品名称 在字典中的位置互换
                Flog['tamp_item']['Records_of_consumption'][time_str].update(
                    {w_value[2]: [w_value[0], w_value[1], w_name]})     # 保存到《购买记录》

            Flog['tamp_item']['this_buy'].update(Flog['tamp_item']['wares'])                # 保存到《本次购买记录》
            Flog['tamp_item']['wares'] = {}                             # 清空购物车
        else:
            print('您的信用卡额度不足,请及时还款'.center(50, '-'))
    else:
        print('您的购物车为空'.center(50,'-'))

def Shopping_Mall(u):
    print('购物车网上商城'.center(100, '-'))
    while True:
        goods_list = [goods]
        while True:
            print('请选择您需要的商品序号:')
            type_value = [*goods_list[-1].values()][0]
            if type(type_value) == int:                                                 # 判断是商品列表中是最后一层   加¥价格
                for index,i in enumerate(goods_list[-1]):
                    print('{}.{: <10}  ¥{}'.format(str(index+1),i,[*goods_list[-1].values()][index]))
            else:                                                                       # 不是最后一层
                for index,key in enumerate(goods_list[-1]):
                    print('{}.{}'.format(str(index+1),key))

            in_goods_class = input('你选择的商品序号是(b.用户信息查询、c.充值、j.进入购物车、q.退出商城、z.返回上一级):>>>')
            if in_goods_class =='q':                                                    # 退出
                Flog['exit_flog'] = True
                break
            if in_goods_class == 'b':                                                   # 停止购买
                Flog['stop_flog'] = True
                break
            if in_goods_class == 'c':                                                   # 充值
                money = input('请输入您要充值的金额:>>>')
                if money.isdigit():
                    Flog['tamp_item']['remainder'] += int(money)
                    print('钱已到账,您现在的信用卡账户余额是:【{}】'.format(Flog['tamp_item']['remainder']))
                    break
                else:
                    print('输入错误,请重新选择购买商品或充值!'.center(40,'-'))
                    break
            if in_goods_class == 'j':                                                   # 进入购物车
                display_gocar()
                isnot_account = input('是否结账(y.是、n.清空购物车、任意键.还要买东西):>>>')
                if isnot_account == 'y':
                    credit_card_interface()     # 结算

                    break
                if isnot_account == 'n':
                    Flog['tamp_item']['wares'] = {}  # 清空购物车
                    print('购物车已经清空'.center(50,'-'))
                    break
                else:
                    break
            if in_goods_class == 'z':
                goods_list.pop()
                continue
            if in_goods_class.isdigit():
                in_goods_class=int(in_goods_class)
            else:
                print('输入错误,请重新输入您要的商品序号!'.center(20,'-'))
            if in_goods_class in range(1,len(goods_list[-1])+1):                  # 是否有这个商品类
                select_goods_class = [*goods_list[-1].values()][in_goods_class-1]       # select_goods_class是所选择的字典的值
                select_goods_keys = [*goods_list[-1].keys()][in_goods_class-1]          # select_goods_key是所选择的字典的键
                goods_list.append(select_goods_class)                                   # 压栈
                if (type(select_goods_class) == int):                                   # 值是数字,说明是(最后层)
                    in_num = input('请输入购买数量(b.用户信息查询、j.购物车、q.退出商城、z.返回上一级):>>>')
                    if in_num == 'q':                                                   # 退出
                        Flog['exit_flog'] = True
                        break
                    if in_num == 'b':                                                   # 停止购买
                        Flog['stop_flog'] = True
                        break
                    if in_num == 'c':                                                   # 充值
                        money = input('请输入您要充值的金额:>>>')
                        if money.isdigit():
                            Flog['tamp_item']['remainder'] += int(money)
                            print('钱已到账,您现在的账户余额是:【{}】'.format(Flog['tamp_item']['remainder']))
                            break
                        else:
                            print('输入错误,请重新选择购买商品或充值!'.center(40,'-'))
                            break
                    if in_num == 'j':                                                   # 进入购物车
                        display_gocar()
                        isnot_account = input('是否结账(y.是、任意键.还要买东西):>>>')
                        if isnot_account == 'y':
                            credit_card_interface()  # 结算
                            break
                        else:
                            break
                    if in_num == 'z':                                                   # 返回上一级
                        goods_list.pop()
                        continue
                    in_num = int(in_num)
                    add_gocar(select_goods_keys,select_goods_class,in_num)                               # 加入购物车
                    break
        if Flog['exit_flog']:
            break
        while Flog['stop_flog']:                                                                                        # 查询模式
            print('请选择你要查询的内容:\n1.您当前的余额\n2.您的购物车(已付款)\n3.您的购买记录')
            in_find_num = input('请输入你要查询的内容(b.采购商品、c.充值、q.退出):>>>')
            if in_find_num == '1':                                                                                  # 查看当前用户余额
                while True:
                    is_not_money = input('您当前的余额为:【{}】,是否充值(c.充值、任意键.退出):>>>'.format(Flog['tamp_item']['remainder']))
                    if is_not_money == 'c':
                        money = input('请输入您要充值的金额:>>>')
                        if money.isdigit():
                            Flog['tamp_item']['remainder'] += int(money)
                            print('钱已到账,您现在的账户余额是:【{}】'.format(Flog['tamp_item']['remainder']))
                            break
                        else:
                            print('输入错误,请重新选择购买商品或充值:')
                            break
                    else:
                        print('已退出充值'.center(50,'-'))
                        break
            elif in_find_num == '2':                                                                                # 查看你本次购买的商品
                print('您的购买清单'.center(100, '-'))
                print('序号       名称                        数量     价格      日期')
                tamp_tamp = Flog['tamp_item']['this_buy']
                for num, i in enumerate(tamp_tamp.items()):
                    print('{: <3}      {: <15}{: <3}      {}       {}'.format(num + 1, i[0], i[1][0], i[1][1],i[1][2]))
                print('-' * 106)
            elif in_find_num == '3':                                                                                # 查看登录账户所有的购买记录
                print('您的购买记录'.center(100, '-'))
                print('序号        购买时间                  数量       价格     商品名称')
                for buytime, item in Flog['tamp_item']['Records_of_consumption'].items():
                    print('---------------------------{}---------------------------'.format(buytime))
                    for num,(x,i) in enumerate(item.items()):
                        print('{: <3}       {: <20}       {: <3}        {}      {}'.format(num + 1, x,i[0], i[1], i[2]))
                print('-' * 106)
            elif in_find_num == 'b':                        # 退出查询模式,进入购买模式
                Flog['stop_flog'] = False
                break
            elif in_find_num == 'q':                        # 退出购物车
                Flog['stop_flog'] = False
                Flog['exit_flog'] = True
                break
            elif in_find_num == 'c':                        # 充值
                money = input('请输入您要充值的金额:>>>')
                if money.isdigit():
                    Flog['tamp_item']['remainder'] += int(money)
                    print('钱已到账,您现在的账户余额是:【{}】'.format(Flog['tamp_item']['remainder']))
                    break
                else:
                    print('输入错误,请重新选择购买商品或充值:'.center(40, '-'))
                    break
            else:
                print('您的输入有误,请重新输入'.center(40,'-'))
    json.dump(u, open('../db/admin_info', 'w'))                                 # 将用户数据保存到user_info文件(为什么可以保存?)
    print('您已经退出网上商城了'.center(100, '-'))                                  # 退出商城

    print('您本次的购买清单'.center(100, '-'))                                      # 打印清单
    print('序号       名称                        数量     价格')
    Flog['tamp_tamp'] = Flog['tamp_item'].get('wares')
    for num, i in enumerate(Flog['tamp_tamp'].items()):
        print('{: <3}      {: <15}{: <3}      {}'.format(num + 1, i[0], i[1][0], i[1][1]))
    print('-' * 106)

admin_info文件:

[{"username": "nb", "password": "123", "atm_user": "nb", "remainder": 15000, "wares": {}, "this_buy": {}, "total_price": 0, "Records_of_consumption": {}, "manager": true}, {"username": "ggz", "password": "123", "atm_user": "nb", "remainder": 15000, "wares": {}, "this_buy": {}, "total_price": 0, "Records_of_consumption": {}, "manager": false}]

atm_admin_info文件:

[{"username": "nb", "password": "123", "atm_user": "nb", "remainder": 15000, "wares": {}, "this_buy": {}, "total_price": 0, "Records_of_consumption": {}, "manager": true}, {"username": "ggz", "password": "123", "atm_user": "nb", "remainder": 15000, "wares": {}, "this_buy": {}, "total_price": 0, "Records_of_consumption": {}, "manager": false}]

common.py文件:

import os
import sys

start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(start_path)

goods = {                           #所有货物分级
    '家电类':{
        '海尔':{
            '海尔最新款电视':2200,
            '海尔最新款冰箱':5200,
            '海尔最新款洗衣机':3600
        },
        '美的':{
            '美的最新款电视': 2100,
            '美的最新款冰箱': 5100,
            '美的最新款洗衣机': 3200
        }
    },
    '衣服类':{
        '优衣库':{
            '优衣库最新款外衣':380,
            '优衣库最新款裤子':450,
            '优衣库最新款鞋子':500
        },
        '七匹狼':{
            '七匹狼最新款外衣': 390,
            '七匹狼最新款裤子': 420,
            '七匹狼最新款鞋子': 400
        }
    },
    '手机类':{
        '魅族 ΜⅢ':3000,
        '小米 ΧⅤ':2999,
        '华为 ΗⅥ':4000,
        '中兴 ΖⅣ':2600
    },
    '车类':{
        '宝马 Χ叁':300000,
        '奔驰 Β陆':150000,
        '特斯拉 ВЕ':130000
    }
}

config文件:

import os
import sys

start_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(start_path)

from lib.common import *



import logging
logging.basicConfig(filename='../log/log.log',
                    level = logging.INFO,
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p')


Flog = {
    #-----------购物商城----------
    'login_flog' : False,          # 登录标志
    'exit_flog' : False,           # 用户按q键退出购物车标志
    'stop_flog' : False,           # 用户按b键停止购买标志
    'tamp_item' : None,            # 存放单个用户性息
    'goods_list' : [goods],        # 数组的最末尾元素存放当前层级商品类
    'goods_tamp' : None,           # 存放单个字典
    #-----------ATM账户-----------
    'atm_login_flog': False,        # atm登录成功
    'atm_tamp_item': None,          # atm用户信息
    'transfer_user_exist': False,   # 转出账户是否存在
    'atm_transfer_item': None,      # 转账用户信息
    'restart_system' : False,       # 重启系统
    'quit_atm' : False,             # 退出ATM标志
    #-----------ATM管理-----------
    'quit_atm_manage': False,       # ATM管理退出标志
    'goods_user_yes': False,        # 购物商城账户确认
    'atm_manage_item': None,          # atm用户信息
    'tamp_flog_yes': False,         #ATM帐号确认标志
    'freeze_flog' : False,          # 冻结标志
}

log文件:

2018-12-14 16:05:33 PM - root - INFO -start:  nb成功登录
2018-12-14 16:30:35 PM - root - INFO -start:  nb成功登录
2018-12-14 16:31:44 PM - root - INFO -atm:  nb登录ATM成功
2018-12-14 16:31:51 PM - root - INFO -atm:  nb账户提现成功
2018-12-14 16:33:02 PM - root - INFO -atm:  nb1账户提现成功
2018-12-14 16:33:52 PM - root - INFO -atm:  nb登录ATM成功
2018-12-14 16:41:48 PM - root - INFO -start:  nb成功登录
2018-12-14 16:48:27 PM - root - INFO -start:  --------<nb>成功登录--------
2018-12-14 16:48:33 PM - root - INFO -start:  --------nb退出成功--------
2018-12-14 18:45:12 PM - root - INFO -start:  --------<nb>成功登录--------
2018-12-14 19:18:02 PM - root - INFO -start:  --------<nb>成功登录--------
2018-12-14 19:31:50 PM - root - INFO -start:  --------<nb>成功登录--------
2018-12-14 19:32:27 PM - root - INFO -atm:  登录ATM管理
2018-12-14 19:32:41 PM - root - INFO -atm:  退出ATM管理
2018-12-14 19:38:30 PM - root - INFO -start:  --------<nb>退出成功--------
2018-12-14 19:38:44 PM - root - INFO -start:  --------<ggz>成功登录--------
2018-12-14 19:39:09 PM - root - INFO -start:  --------<nb>成功登录--------
2018-12-14 19:39:18 PM - root - INFO -atm:  登录ATM管理
2018-12-14 19:39:41 PM - root - INFO -atm:  退出ATM管理
2018-12-14 19:39:46 PM - root - INFO -start:  --------<ggz>成功登录--------
2018-12-14 19:39:52 PM - root - INFO -start:  --------<ggz>退出成功--------
2018-12-14 19:40:26 PM - root - INFO -start:  --------<nb>成功登录--------
2018-12-14 19:40:31 PM - root - INFO -atm:  登录ATM管理

debug文件:

#author:    guogangzhi


import json

user = [                            # 所有用户
    {
        'username': 'nb',           # 用户名
        'password': '123',          # 密码
        'atm_user': 'nb',               # 绑定信用卡用户名
        'remainder': 15000,             # 信用卡额度
        'wares': {                  # 购物车
            # 'wares_name':['num','price','time']               # 名称:[数量,价格,购买时间]
        },
        'this_buy':{                # 本次购买的商品
            # 'wares_name':['num','price','time']               # 名称:[数量,价格,购买时间]
        },
        'total_price': 0,           # 本次购买的商品的总价
        'Records_of_consumption':{  # 消费记录
            # 'buy_time':{                                                  # 购买时间
                        # 'time':['num','price','wares_name']               # 加入购物车时间:[数量,价格,名称]
                        # 'time':['num','price','wares_name']               # 加入购物车时间:[数量,价格,名称]
                        # 'time':['num','price','wares_name']               # 加入购物车时间:[数量,价格,名称]
                    # }
        },
        'manager': True
    },
    {
        'username': 'ggz',  # 用户名
        'password': '123',  # 密码
        'atm_user': 'nb',  # 绑定信用卡用户名
        'remainder': 15000,  # 信用卡额度
        'wares': {  # 购物车
            # 'wares_name':['num','price','time']               # 名称:[数量,价格,购买时间]
        },
        'this_buy': {  # 本次购买的商品
            # 'wares_name':['num','price','time']               # 名称:[数量,价格,购买时间]
        },
        'total_price': 0,  # 本次购买的商品的总价
        'Records_of_consumption': {  # 消费记录
            # 'buy_time':{                                                  # 购买时间
            # 'time':['num','price','wares_name']               # 加入购物车时间:[数量,价格,名称]
            # 'time':['num','price','wares_name']               # 加入购物车时间:[数量,价格,名称]
            # 'time':['num','price','wares_name']               # 加入购物车时间:[数量,价格,名称]
            # }
        },
        'manager': False
    },
]

atm = {
    'nb':               # 绑定的商城帐号
        [                   # 对应于‘nb’这个人有三个ATM账户
            {
                'atm_user': 'nb',                # atm账户
                'atm_password': '456',             # atm密码
                'remainder': 15000,              # 信用卡额度
                'consume_water':{},              # 每月消费流水
                'repayment_time':'每个月10号',              # 还款时间戳
            },
            {
                'atm_user': 'nb1',  # atm账户
                'atm_password': '456',  # atm密码
                'remainder': 15000,  # 信用卡额度
                'consume_water': {},  # 每月消费流水
                'repayment_time': '每个月10号',  # 还款时间str
            },
            {
                'atm_user': 'nb2',  # atm账户
                'atm_password': '456',  # atm密码
                'remainder': 15000,  # 信用卡额度
                'consume_water': {},  # 每月消费流水
                'repayment_time': '每个月10号',  # 还款时间戳
            }
        ],
    'ggz':
        [
            {
                'atm_user': 'ggz',  # atm账户
                'atm_password': '456',  # atm密码
                'remainder': 15000,  # 信用卡额度
                'consume_water': {},  # 每月消费流水
                'repayment_time': '每个月10号',  # 还款时间戳
            },
            {
                'atm_user': 'ggz1',  # atm账户
                'atm_password': '456',  # atm密码
                'remainder': 15000,  # 信用卡额度
                'consume_water': {},  # 每月消费流水
                'repayment_time': '每个月10号',  # 还款时间戳
            },
            {
                'atm_user': 'nb2',  # atm账户
                'atm_password': '456',  # atm密码
                'remainder': 15000,  # 信用卡额度
                'consume_water': {},  # 每月消费流水
                'repayment_time': '每个月10号',  # 还款时间戳
            }
        ],
}


json.dump(user, open('db/admin_info', 'w'))



猜你喜欢

转载自www.cnblogs.com/guogangzhi/p/10121818.html