欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python3-模拟ATM_shopping

程序员文章站 2022-04-13 22:51:17
一、readme 二、程序事例(安照readme中的目录结构顺序) (一)、ATM程序 1)atm.py 2)、atm_bank.py 3)、function.py 4)、logger.py 5)、login.py#bank (二)、shopping程序 1)、goods_put_or_off.py ......

一、readme

一、功能说明
环境:python3
功能:模拟银行ATM及购物商城等功能!
目的:study
注意:如果在Windows下开发并运行后移植到Linux中,需要删除每个目录中的缓存目录(__pycache__)。
二、目录结构
atm_shopping
|-- bank#ATM程序
|   |-- bin#程序入口
|   |   |-- atm_bank.py#ATM后台
|   |   |-- atm.py#ATM
|   |   `-- __init__.py
|   |-- func#功能函数
|   |   |-- function.py
|   |   |-- function.pyc
|   |   |-- __init__.py
|   |   |-- __init__.pyc
|   |   |-- logger.py
|   |   `-- logger.pyc
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- log用户日志
|   |   `-- __init__.py
|   |-- user_data#用户账户信息
|   |   |-- 123.pkl
|   |   `-- __init__.py
|   `-- user_login#ATM登陆认证
|       |-- __init__.py
|       |-- __init__.pyc
|       |-- login.py
|       `-- login.pyc
|-- __init__.py
`-- shopping#购物程序
    |-- bin#程序入口
    |   |-- goods_put_or_off.py#商品上下架
    |   |-- __init__.py
    |   |-- shopping.py#购物
    |   `-- user_set.py#账户设置
    |-- func
    |   |-- function.py#功能函数
    |   `-- __init__.py
    |-- goods#
    |   |-- goods.pkl#商品
    |   `-- __init__.py
    |-- __init__.py
    |-- log
    |   |-- __init__.py
    |   `-- shopping_log.txt#购物日志
    `-- user_login
        |-- login.py#购物登陆认证
        |-- user_create.py
        |-- user_info_all.bak
        |-- user_info_all.dat
        `-- user_info_all.dir

三、使用事例
1)、银行开户
C:\Python36\python3.exe F:/PyCharm/script/atm_shopping/bank/bin/atm_bank.py

        1:开户
        2:解锁或者冻结账户
        3:退出
        
请选择:1
----开始开户,请按提示输入---
请输入账号:123456
请输入姓名:映山红
请输入身份证号:332226199202011020
请输入额度:10000
请输入账户状态,默认为unlock,(Enter):
请输入密码:123456
开户成功:姓名[映山红],账号[123456],额度[10000]

        1:开户
        2:解锁或者冻结账户
        3:退出
        
请选择:3

Process finished with exit code 0
2)、ATM登陆
C:\Python36\python3.exe F:/PyCharm/script/atm_shopping/bank/bin/atm.py
---登陆认证---
请输入账号:123456
{'account': '123456', 'password': '123456', 'time': 3, 'money': 10000, 'name': '映山红', 'identified': '332226199202011020', 

'status': 'unlock', 'edu': 10000}
请输入密码:123456
欢迎登陆

1:查询         2:提现
3:转账         4:还款
5:改密         6:退出

请选择:
3)购物商城用户创建
C:\Python36\python3.exe F:/PyCharm/script/atm_shopping/shopping/bin/user_set.py

        1:创建用户
        2:删除用户
        3:重置密码
        4:重置锁状态
        5:查看用户信息
        6:退出
        
请选择:1
请输入用户名(exit:退出):12345
请输入密码:12345
请输入用户名(exit:退出):exit
4)、商品上架
C:\Python36\python3.exe F:/PyCharm/script/atm_shopping/shopping/bin/goods_put_or_off.py
--商品上架--
请输入商品名称(退出:exit):榴莲
请输入商品价格:60
请输入商品名称(退出:exit):苹果
请输入商品价格:15
请输入商品名称(退出:exit):exit
5)、购物
C:\Python36\python3.exe F:/PyCharm/script/atm_shopping/shopping/bin/shopping.py
请输入用户名:123456
用户名不存在,请重新输入
请输入用户名:12345
请输入密码:12345
欢迎登陆
编号   名称   价格
-------------------
1      榴莲    60
2      苹果    15
请选择:
    1:购物
    2:退商品
    3:付款
    4:购物清单
    5:退出
请选择:1
请选择要购买的商品编号:1
你选择的了:榴莲       价格为:60
编号   名称   价格
-------------------
1      榴莲    60
2      苹果    15
请选择:
    1:购物
    2:退商品
    3:付款
    4:购物清单
    5:退出
请选择:1
请选择要购买的商品编号:2
你选择的了:苹果       价格为:15
编号   名称   价格
-------------------
1      榴莲    60
2      苹果    15
请选择:
    1:购物
    2:退商品
    3:付款
    4:购物清单
    5:退出
请选择:4
所购商品清单:
编号   名称   价格
-------------------
1      榴莲    60
2      苹果    15
编号   名称   价格
-------------------
1      榴莲    60
2      苹果    15
请选择:
    1:购物
    2:退商品
    3:付款
    4:购物清单
    5:退出
请选择:3
--银行卡账号登陆--
请输入账号:123
请输入密码:123
欢迎登陆
应付款:[75]
请输入被转款人的账号:123456
请输入转账金额:75
成功向账户[123456]转账[75]元!
付款成功
编号   名称   价格
-------------------
1      榴莲    60
2      苹果    15
请选择:
    1:购物
    2:退商品
    3:付款
    4:购物清单
    5:退出
请选择:5
欢迎下次光临

Process finished with exit code 0
6)、日志查看
F:\PyCharm\script\atm_shopping\bank\log\atm_log.txt

2018-05-03 16:52:51  user: root  process_id:14244 modual:logger.py line:19 level:INFO message:开户成功:姓名[映山红],账号[123456],额度[10000]
2018-05-03 16:54:11  user: root  process_id:13460 modual:logger.py line:19 level:INFO message:银行卡账户[123456] 登陆成功
2018-05-03 16:54:19  user: root  process_id:13460 modual:logger.py line:19 level:INFO message:用户[123456]  查询
2018-05-03 17:01:59  user: root  process_id:6444 modual:logger.py line:19 level:INFO message:银行卡账户[123] 登陆成功
2018-05-03 17:02:11  user: root  process_id:6444 modual:logger.py line:19 level:INFO message:账户[123]  转账给账户[123456] [75]元
2018-05-03 17:02:11  user: root  process_id:6444 modual:logger.py line:19 level:INFO message:账户[123456]  收到账户[123]转账 [75]元
2018-05-03 17:02:15  user: root  process_id:6444 modual:logger.py line:19 level:INFO message:账户[123] 退出成功

F:\PyCharm\script\atm_shopping\shopping\log\shopping_log.txt
用户:12345   商品:榴莲    价格:60    时间:2018-05-03 17:02:11
用户:12345   商品:苹果    价格:15    时间:2018-05-03 17:02:11

二、程序事例(安照readme中的目录结构顺序)

(一)、ATM程序

1)atm.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#function:
#created by xkq
#date: 2018
import os ,sys
basedir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取bank目录在绝对路径
sys.path.append(basedir)
from user_login import login
from  func import function
print('---登陆认证---')
account=login.logion()#登陆认证
info='''
1:查询         2:提现
3:转账         4:还款
5:改密         6:退出
'''
select={
    '1':function.querry_moeny,
    '2':function.withdrawal,
    '3':function.transfer_accounts,
    '4':function.repayment,
    '5':function.change_password,
    '6':function.logout
}
if account:#登陆成功后方可执行查询等等。。。
    while True:
        print(info)
        user_select=input('请选择:').strip()
        if select.get(user_select):#判断用户输入是否在字典select中
            select[user_select](account)#执行对应的函数
        else:
            print('\033[32;1m请输入正确选项!\033[0m')

2)、atm_bank.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#function:
#created by xkq
#date: 2018
from __future__ import unicode_literals
import os,sys,pickle,shelve
basdir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(basdir)
from func import logger
filedir=os.path.join(basdir,'user_data')
time=3#密码可以输错3次
def open_account():#
        try:
            '''开户,将用户的全部信息记录到目录user_data中以账号命名的后缀为pkg的文件中'''
            print('----开始开户,请按提示输入---')
            account=input('请输入账号:').strip()
            f_user_account = os.path.join(filedir, '%s.pkl'%account)
            while os.path.exists(f_user_account):#判断账户是否存在
                    print('账户已存在,请重新输入...')
                    account = input('请输入账号:').strip()
                    f_user_account = os.path.join(filedir, '%s.pkl' % account)#获取账户所在文件的绝对路径
            name=input('请输入姓名:').strip()
            idenfied=input('请输入身份证号:').strip()
            money=int(input('请输入额度:').strip())
            status=input('请输入账户状态,默认为unlock,(Enter):').strip()
            while status !='' and status != 'lock':
                print('请输入unlock|lock,或者press Enter')
                status = input('请输入账户状态,默认为unlock,(Enter):').strip()
            if status =='':
                status='unlock'#账号默认状态
            password=input('请输入密码:').strip()
            account_info={'account':account,'password':password,'time':time,'money':money,'name':name,'identified':idenfied,'status':status,'edu':money}
            filename=os.path.join(filedir,'%s.pkl'%account)
            f_account_info=open(filename,'wb')#用pickle存储用户详细信息
            pickle.dump(account_info,f_account_info)
            f_account_info.close()
            print('开户成功:姓名[%s],账号[%s],额度[%s]'%(account_info['name'],account_info['account'],account_info['money']))
            logger.logger('开户成功:姓名[%s],账号[%s],额度[%s]'%(account_info['name'],account_info['account'],account_info['money']))
            '''将用户的账号信息记录到目录user_data中user_account文件中'''
            '''
            f_user_account=os.path.join(filedir,'user_account')#用shelve存储用户账号信息
            f_user_account=shelve.open(f_user_account)
            f_user_account[account]=account
            f_user_account.close()
            '''
        except Exception as e:
            print('系统异常:%s'%e)
            logger.logger('开户失败,%s'%e)

def  set_lock():
        try:
                while True:
                        account=input('请输入要解锁或者冻结账户的账号(3退出):').strip()
                        if account == '3':break
                        f_user_account = os.path.join(filedir, '%s.pkl' % account)
                        if os.path.exists(f_user_account) and  os.path.getsize(f_user_account)>0:#如果文件存在并且不为空
                                '''取出用户账户信息'''
                                f=open(r'%s'%f_user_account,'rb')
                                account_info=pickle.load(f)
                                f.close()
                                '''验证身份'''
                                identified = input('请输入你的身份证号码:').strip()
                                while identified !=  account_info['identified']:
                                        print('身份证输入错误,请重新输入!')
                                        identified = input('请输入你的身份证号码:').strip()
                                else:
                                        '''解锁'''
                                        print('用户状态:%s'%account_info['status'])#查看账户当前状态
                                        lock_status=input('请输入1或者2或者3(1:解锁,2:冻结,3:退出):')
                                        if lock_status == '3':break
                                        while lock_status != '1' and lock_status !='2':
                                                print('输入错误,请重新输入!')
                                                lock_status = input('请输入1或者2或者3(1:解锁,2:冻结,3:退出):')
                                                if lock_status == '3': break
                                        else:
                                                if lock_status == '1':
                                                        lock_status='unlock'
                                                else:
                                                        lock_status = 'lock'
                                                f = open(r'%s' % f_user_account, 'wb')
                                                account_info['status'] = lock_status
                                                account_info['time']=3
                                                pickle.dump(account_info,f)
                                                f.close()
                                                print('操作成功,账户当前状态为:%s'%account_info['status'])
                                                logger.logger('设置锁状态操作成功,账户当前状态为:%s'%account_info['status'])
                        else:print('账户不存在,或者账户信息为空')
        except Exception as e:
                print('系统异常:%s' % e)
                logger.logger('系统异常:%s' % e)

def reset_password():
    '''根据账户和身份证号码重新设置密码'''
    pass
def querry_account_info_all():
    '''查询所有账户信息'''
    pass
if __name__=='__main__':
    '''ATM管理员
    open_account():开户
    set_lock():设置账户状态
    '''
    func={
        '1':open_account,
        '2':set_lock,
        '3': sys.exit
    }
    while True:
        print('''
        1:开户
        2:解锁或者冻结账户
        3:退出
        ''')
        active=input('请选择:')
        #if active == '3': break
        if  active in  func.keys():
            func[active]()
        else:print('输入错误,请重新输入!')

3)、function.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#function:
#created by xkq
#date: 2018
import os,sys,pickle
bank_dir=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(bank_dir)
from bank.func import logger
from bank.func import logger
#logger.logger('test')
user_data_dir=os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),'user_data')#获取账户信息所在的目录
def get_account_info(account):
    '''获取用户信息'''
    account_file = os.path.join(user_data_dir, '%s.pkl' % account)
    if not os.path.exists(account_file):
        return False
    else:
        f = open(account_file, 'rb')
        account_info = pickle.load(f)
        f.close()
        return account_info
def write_account_info(account,account_info):
    '''保存用户信息'''
    account_file = os.path.join(user_data_dir, '%s.pkl' % account)
    f = open(account_file, 'wb')
    pickle.dump(account_info,f)
    f.close()
    #print('操作成功')


def querry_moeny(account):#查询额度,account为查询人的账号
    account_info=get_account_info(account)
    print('\033[96;1m信用额度为:%s,可用额度为:%s 元\033[0m'%(account_info['edu'],account_info['money']))
    #logger.logging.info('用户[%s]  查询'%account)
    logger.logger('用户[%s]  查询'%account)
def transfer_accounts(account_from):#转账
    '''account_from:转款人账号
       account_to:被转款人账号
       money:转款金额
    '''
    account_to=input('请输入被转款人的账号:')
    account_info_from=get_account_info(account_from)
    account_info_to = get_account_info(account_to)
    if account_info_to:
        while True:
            try:
                money=int(input('请输入转账金额:').strip())
                break
            except Exception:
                print('\033[101;1m请输入数字金额!\033[0m')
        if money <= account_info_from['money']:
            account_info_from['money']-=money
            account_info_to=get_account_info(account_to)
            account_info_to['money']+=int(money)
            write_account_info(account_from, account_info_from)
            write_account_info(account_to,account_info_to)
            print('\033[91;1m成功向账户[%s]转账[%s]元!\033[0m'%(account_to,money))
            #logger.logger('账户[%s]  转账给账户[%s] [%s]元'%(account_from,account_to,money))
            #logger.logger('账户[%s]  收到账户[%s]转账 [%s]元'%(account_to,account_from,money))
            logger.logger('账户[%s]  转账给账户[%s] [%s]元'%(account_from,account_to,money))
            logger.logger('账户[%s]  收到账户[%s]转账 [%s]元'%(account_to,account_from,money))
            return True
        else:
            print('\033[103;1m可用额度不足!\033[0m')
            logger.logger('账户[%s]  转账给账户[%s] [%s]元 失败 因可用额度不足' % (account_from, account_to, money),'critical')
            return False
    else:
        print('\033[103;1m账户不存在!\033[0m')
        logger.logger('账户[%s]  转账给账户[%s] 失败 因账户不存在' % (account_from, account_to))
        return None

def withdrawal(account):
    '''取款'''
    money=int(input('请输入取款金额:'))
    account_info=get_account_info(account)
    if money<=account_info['money']:
        account_info['money']-=money
        write_account_info(account,account_info)
        print('\033[91;1m成功取款[%s]元\033[0m'%money)
        logger.logger('账户[%s]  取款[%s] 元' % (account,money))
    else:
        print('可用额度不足')
        logger.logger('账户[%s]  取款[%s] 元 失败 因可用额度不足' % (account, money))
def repayment(account):
    '''还款'''
    money=int(input('请输入还款金额:'))
    account_info=get_account_info(account)
    account_info['money'] += money
    write_account_info(account,account_info)
    print('\033[91;1m成功还款[%s]元\033[0m'%money)
    logger.logger('账户[%s]  还款[%s] 元' % (account, money))
def change_password(account):
    '''修改密码'''
    account_info=get_account_info(account)
    old_pw=input('请输入旧密码:').strip()
    while old_pw !=account_info['password']:
        print('旧密码输入错误,请重新输入')
        old_pw = input('请输入旧密码:').strip()
    new_pw1=input('请输入新密码:')
    new_pw2=input('请再次输入新密码:')
    while new_pw1 != new_pw2:
        print('密码不一致,请重新输入:')
        new_pw1 = input('请输入新密码:')
        new_pw2 = input('请再次输入新密码:')
    else:
        account_info['password']=new_pw1
        write_account_info(account,account_info)
        print('\033[91;1m修改密码成功\033[0m')
        logger.logger('账户[%s]  修改密码成功' %account)
def logout(account):
    logger.logger('账户[%s] 退出成功' % account)
    sys.exit()

4)、logger.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#function:
#created by xkq
#date: 2018
import os,sys
#log_file=os.path.join(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),'log'),'atm_log.txt')
def logger(msg,*agrv,**kargv):
    import logging
    log_file = os.path.join(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'log'), 'atm_log.txt')
    logging.basicConfig(format='%(asctime)s  user: %(name)s  process_id:%(process)d modual:%(filename)s line:%(lineno)d level:%(levelname)s message:%(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename=log_file,level=logging.DEBUG)
    if len(agrv)>0:
        if agrv[0] == 'warning':
            logging.warning(msg)
        if agrv[0] == 'critical':
            logging.critical(msg)
    else:
            logging.info(msg)

5)、login.py#bank

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#功能:用户登陆,密码失败3次,账户将被锁住
#created by xkq
#date: 201803
import pickle,sys,getpass,os
basdir=os.path.dirname(os.path.abspath(__file__))#获取当前文件所在的目录
sys.path.append(basdir)
user_data_dir=os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),'user_data')#用户账号信息所在的目录
bank_dir=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(bank_dir)
from bank.func import logger
def account_get(func):
    '''获取用户账号信息'''
    def wrap():
        global f_user_account,account_info
        account=input('请输入账号:').strip()
        f_user_account = os.path.join(user_data_dir, '%s.pkl'%account)#获取用户账号信息所在文件的绝对路径
        while not  os.path.exists(f_user_account):#判断账户是否存在
                print('账户不存在,请重新输入...')
                account = input('请输入账号:').strip()
                f_user_account = os.path.join(user_data_dir, '%s.pkl' % account)
                if account== "exit":
                    sys.exit()
        else:
            f=open(f_user_account,'rb')
            account_info=pickle.load(f)
            print(account_info)
            f.close()
        return (func())
    return wrap

def write_user():#保存用户账号信息
    #print(account_info)
    f = open(f_user_account, 'wb')
    pickle.dump(account_info, f)
    f.close()

@account_get
def logion():
    '''密码验证'''
    FLAG=False
    #print(account_info)
    if account_info['status'] =='unlock':#判断账户是否被锁
            password = input('请输入密码:')
            #password = getpass.getpass('请输入密码:')

            while password != account_info['password']:
                #print(type(account_info[user]['pw']))
                account_info['time'] -=1#每输错一次密码,机会就会减少一次
                if account_info['time'] == 0:
                    account_info['status'] = 'lock'
                    print('\033[31;1m密码连续输入不正确,账号%s已被锁,请联系400-123456进行解锁。\033[0m' % account_info['account'])
                    write_user()
                    #logger.logging.info('账户[%s] 被锁 因密码连续3次输入不正确' % account_info['account'])
                    logger.logger('账户[%s] 被锁 因密码连续3次输入不正确' % account_info['account'],'critical')
                    sys.exit()
                #print(account_info[user]['time'])
                print('密码不正确,你还有%s次机会会,请重新输入:'%account_info['time'])
                #logger.logging.info('账户[%s] 登陆失败 因密码输入错误' % account_info['account'])
                logger.logger('账户[%s] 登陆失败 因密码输入错误' % account_info['account'],'warning')
                # password = getpass.getpass('请输入密码:')
                password = input('请输入密码:')
                if password == 'exit':
                    write_user()
                    sys.exit()
            else:
                account_info['time']=3
                print('\033[36;1m欢迎登陆\033[0m')
                #logger.logging.info('银行卡账户[%s] 登陆成功'%account_info['account'])
                logger.logger('银行卡账户[%s] 登陆成功'%account_info['account'])
                write_user()
                FLAG = True

    else:
        print('\033[31;1m账号%s已被锁,请联系400-123456进行解锁.\033[0m'%account_info['account'])
        #logger.logging.info('账户[%s] 登陆失败 未被解锁' % account_info['account'])
        logger.logger('账户[%s] 登陆失败 未被解锁' % account_info['account'],'warning')
        sys.exit()
    #return FLAG
    return account_info['account']#返回登录账号
if __name__ == '__main__':
    logion()

(二)、shopping程序

1)、goods_put_or_off.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#function:
#created by xkq
#date: 2018
import  pickle,sys,os
base_dir_shopping=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir_shopping)
goods_file=os.path.join(os.path.join(base_dir_shopping,'goods'),'goods.pkl')
def put_on_shelves(goods_file):#商品上架
    print('--商品上架--')
    if os.path.exists(goods_file) and os.path.getsize(goods_file)>0:
        f=open(goods_file,'rb')
        goods=pickle.load(f)
        f.close()
        i = len(goods) + 1
        while True:
            thing = input('请输入商品名称(退出:exit):')
            if thing == 'exit': break
            price = input('请输入商品价格:')
            goods['%s' % i] = [thing, price]
            i += 1
        f = open(goods_file, 'wb')
        goods = pickle.dump(goods, f)
        f.close()
    else:
        goods = {}
        i = 1
        while True:
            thing = input('请输入商品名称(退出:exit):')
            if thing == 'exit': break
            price = input('请输入商品价格:')
            goods['%s' % i] = [thing, price]
            i += 1
        f = open(goods_file, 'wb')
        goods = pickle.dump(goods, f)
        f.close()

def show_goods():#展示已上架商品
    if os.path.exists(goods_file) and os.path.getsize(goods_file) > 0:
        f = open(goods_file, 'rb')
        goods = pickle.load(f)
        f.close()
        print('''\033[36;1m编号   名称   价格\033[0m\n-------------------''')
        for k, v in goods.items():
            print('''%s       %s     %s''' % (k, v[0], v[1]))
def pull_off_shelves():#商品下架
    pass
if __name__=='__main__':
    show_goods()
    put_on_shelves(goods_file)

2)、shopping

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#created by xkq
#date: 2018
import sys,os,pickle
base_dir_shopping=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir_shopping)
from user_login.login import *
from func.function import  *
goods_file=os.path.join(os.path.join(base_dir_shopping,'goods'),'goods.pkl')
#goods={'1':['苹果',20],'2':['香蕉',15],'3':['毛巾',12.3],'4':['牙刷',7],'5':['牙膏',21],\ '6':['大米',150],'7':['手机',2000]}
user=logion()#购物登陆认证
f = open(goods_file, 'rb')
goods = pickle.load(f)
f.close()
buy_goods = []
while user:
    show_goods(goods)
    print('''\033[31;1m请选择:\033[0m
    1:购物
    2:退商品
    3:付款
    4:购物清单
    5:退出''')
    select=int(input('\033[31;1m请选择:\033[0m'))
    if select==1:
        shopping(goods, buy_goods,user)
    if select == 2:
        returned_purchase(buy_goods)
    if select==3:
        pay( buy_goods, user)
    if select==4:
        show_buy_goods(buy_goods)
    if select==5:
        print('欢迎下次光临')
        logout_shoping()

3)、user_set.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#function:
#created by xkq
#date: 2018
import os,sys
base_dir_shopping=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir_shopping)
from user_login.user_create import *
if __name__=='__main__':
    main()

4)、function.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#created by xkq
#date: 2018
import datetime,os,sys

bank_dir_login=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(bank_dir_login)
from bank.user_login import login
from bank.func.function import transfer_accounts,logout
#import logging
#from bank.func import logger


#购物日志文件路径
shopping_log_file=os.path.join(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),'log'),'shopping_log.txt')
#shopping_log='F:\PyCharm\script\day520180412\atm_shopping\shopping\log\shopping_log.txt'

def logger(user,shangpin,price):#购物日志记录函数
    time = datetime.datetime.now().strftime('%F %T')
    f=open(shopping_log_file,'a')
    f.write('用户:%s   商品:%s    价格:%s    时间:%s\n'%(user,shangpin,price,time))
    f.flush()
    f.close()

def show_goods(goods):#展示商品
    print('''\033[36;1m编号   名称   价格\033[0m\n-------------------''')
    for k,v in goods.items():
        print('''%s      %s    %s'''%(k,v[0],v[1]))
def shopping(goods,buy_thing,user):#购物
    thing=input('\033[31;1m请选择要购买的商品编号:\033[0m')
    buy_thing.append([user,goods[thing][0],goods[thing][1]])
    print('你选择的了:%s       价格为:%s'%(goods[thing][0],goods[thing][1]))
def  returned_purchase(buy_thing):#退货
    tmp={}
    for i,k in enumerate(buy_thing,1):
        print(i,k[1])
        tmp[i]=k
    num = int(input('\033[32;1m请选择一个要退的商品编号:\033[0m'))
    buy_thing.remove(tmp[num])
    print('你退的是:%s       价格为:%s'%(tmp[num][1],tmp[num][2]))

login_FALG=True
account=None
def pay(buy_thing,user):
    '''
    付款
    login_FALG=True#记录登陆标志,True表示没有登陆,False表示已登录,避免每次付款都要重新登陆认证
    account=None#记录用户登陆的银行卡账号
    '''
    global login_FALG,account
    pay_money=0
    for i in buy_thing:
        #print(i[2])
        pay_money+=int(i[2])
    #has_money=user_all[user]['money']
    print('--银行卡账号登陆--')
    if login_FALG:
        account=login.logion()#银行卡登陆认证
        login_FALG=False
    print('应付款:[%s]'%pay_money)
    if account:
        res=transfer_accounts(account)
        if res==None:
            print('\033[31;1m请重新选择付款并输入正确账号!\033[0m')
        elif res:
            print('\033[36;1m付款成功\033[0m')
            for i in buy_thing:
                logger(i[0], i[1], i[2])
        else:
            print('\033[41;1m钱不够,请推掉部分商品!\033[0m')
def show_buy_goods(buy_thing):
    print('\033[46;1m所购商品清单:\033[0m')
    print('''编号   名称   价格\n-------------------''')
    for i,k in enumerate(buy_thing,1):
        print('''%s      %s    %s''' %(i,k[1],k[2]))
def logout_shoping():
    if login_FALG==False:
        logout(account)
    else:
        sys.exit()

if __name__=='__main__':
    pass

5)、login.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#功能:用户登陆,密码失败3次,账户将被锁住
#created by xkq
#date: 201803
import pickle,sys,getpass,os,shelve
file=os.path.join(os.path.dirname(os.path.abspath(__file__)),'user_info_all')
f=shelve.open(file)
def logion():
    FLAG=False
    user=input('请输入用户名:')
    while user not in f.keys():
        print('用户名不存在,请重新输入')
        user = input('请输入用户名:')
        if user == "exit":
            sys.exit()
    else:
        user_info=f.get(user)
        if user_info['status'] == 'unlock':
                password = input('请输入密码:')
                #password = getpass.getpass('请输入密码:')
                while password != user_info['pw']:
                    user_info['time']-=1
                    if user_info['time']== 0:
                        user_info['status'] = 'lock'
                        print('密码连续输入不正确,用户%s已被锁,请联系400-123456进行解锁。' % user)
                        #write_user()
                        f[user]=user_info
                        f.close()
                        sys.exit()
                    print('密码不正确,你还有%s次机会会,请重新输入:'%user_info['time'])
                    # password = getpass.getpass('请输入密码:')
                    password = input('请输入密码:')
                    if password == 'exit':
                        f[user] = user_info
                        f.close()
                        sys.exit()
                else:
                    user_info['time']=3
                    f[user] = user_info
                    print('\033[36;1m欢迎登陆\033[0m')
                    #write_user()
                    f.close()
                    FLAG = True

        else:
            print('\033[31;1m用户%s已被锁,请联系400-123456进行解锁.\033[0m'%user)
            sys.exit()
    #return FLAG
    return user
if __name__ == '__main__':
    logion()

6)、user_create.py

#!/usr/bin/env python
#_*_ coding:utf-8 _*_  
#encoding=utf-8
#给购物客户创建用户、重置密码、重置锁状态、查看用户账户信息等
#created by xkq
#date: 2018
import os,sys,shelve
basdir=os.path.dirname((os.path.abspath(__file__)))
user_info_all_file=os.path.join(basdir,'user_info_all')#存放用户信息

time=3#密码可以输错3次
def create_user():#创建用户
    f = shelve.open(user_info_all_file)
    while True:
        try:
            name=input('请输入用户名(exit:退出):')
            if name == 'exit':break
            if name not in f.keys():
                password=input('请输入密码:')
                f[name]={'pw':password,'time':time,'status':'unlock'}
                f.close()
            else:
                print('用户已存在')
                f.close()
        except Exception as e:
                print('系统异常:%s'%e)
                f.close()
def dell_user():#创删除用户
    f = shelve.open(user_info_all_file)
    while True:
        try:
            name=input('请输入用户名(exit:退出):')
            if name == 'exit':break
            if name  in f.keys():
                del f[name]
                f.close()
                print('\033[36;1m删除成功!\033[0m')
            else:
                print('用户不存在')
                f.close()
        except Exception as e:
                print('系统异常:%s'%e)
                f.close()

def reset_password():#重置密码
    while True:
        f = shelve.open(user_info_all_file)
        name=input('请输入重置密码的用户名(exit"退出):')
        if name=='exit':break
        password=input('请输入密码:')
        user_info=f.get(name)
        user_info['pw']=password
        f[name]=user_info
        f.close()
        print('\033[36;1m重置密码成功!\033[0m')
def reset_lock():#重置锁状态
    while True:
        f = shelve.open(user_info_all_file)
        name=input('请输入重置锁状态的用户名(exit"退出):').strip()
        if name=='exit':
            f.close()
            break
        user_info=f.get(name)
        lock_status = input('请输入1或者2(1:解锁,2:枷锁):')
        while lock_status !='1' and  lock_status != '2':
            print('\033[31;1m输入错误,请重新输入!\033[0m')
            lock_status = input('请输入1或者2(1:解锁,2:枷锁):')
        else:
            if lock_status=='1':
                user_info['status']='unlock'
            else:
                user_info['status'] = 'lock'
            f[name]=user_info
            f.close()
            print('\033[36;1m重置成功,锁状态为[%s]!\033[0m'%user_info['status'])


def show_user_all():#查看用户账户信息
    f = shelve.open(user_info_all_file)
    print('用户   可重试次数   锁状态')
    for i in f.keys():
        print('%s        %s         %s'%(i,f.get(i)['time'],f.get(i)['status']))
    f.close()
def main():
    info = '''
        1:创建用户
        2:删除用户
        3:重置密码
        4:重置锁状态
        5:查看用户信息
        6:退出
        '''
    user_info = {
        '1': create_user,
        '2':dell_user,
        '3': reset_password,
        '4': reset_lock,
        '5': show_user_all,
        '6': sys.exit
    }
    while True:
        print(info)
        select = input('请选择:')
        if select in user_info.keys():
            user_info[select]()
        else:
            print('\033[31;1m输入错误,请重新输入!\033[0m')
if __name__=='__main__':
    main()