zoukankan      html  css  js  c++  java
  • python3-模拟ATM_shopping

    一、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:Python36python3.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:Python36python3.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:Python36python3.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:Python36python3.exe F:/PyCharm/script/atm_shopping/shopping/bin/goods_put_or_off.py
    --商品上架--
    请输入商品名称(退出:exit):榴莲
    请输入商品价格:60
    请输入商品名称(退出:exit):苹果
    请输入商品价格:15
    请输入商品名称(退出:exit):exit
    5)、购物
    C:Python36python3.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:PyCharmscriptatm_shoppinganklogatm_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:PyCharmscriptatm_shoppingshoppinglogshopping_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('33[32;1m请输入正确选项!33[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('33[96;1m信用额度为:%s,可用额度为:%s 元33[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('33[101;1m请输入数字金额!33[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('33[91;1m成功向账户[%s]转账[%s]元!33[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('33[103;1m可用额度不足!33[0m')
                logger.logger('账户[%s]  转账给账户[%s] [%s]元 失败 因可用额度不足' % (account_from, account_to, money),'critical')
                return False
        else:
            print('33[103;1m账户不存在!33[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('33[91;1m成功取款[%s]元33[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('33[91;1m成功还款[%s]元33[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('33[91;1m修改密码成功33[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('33[31;1m密码连续输入不正确,账号%s已被锁,请联系400-123456进行解锁。33[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('33[36;1m欢迎登陆33[0m')
                    #logger.logging.info('银行卡账户[%s] 登陆成功'%account_info['account'])
                    logger.logger('银行卡账户[%s] 登陆成功'%account_info['account'])
                    write_user()
                    FLAG = True
    
        else:
            print('33[31;1m账号%s已被锁,请联系400-123456进行解锁.33[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('''33[36;1m编号   名称   价格33[0m
    -------------------''')
            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('''33[31;1m请选择:33[0m
        1:购物
        2:退商品
        3:付款
        4:购物清单
        5:退出''')
        select=int(input('33[31;1m请选择:33[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:PyCharmscriptday520180412atm_shoppingshoppinglogshopping_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
    '%(user,shangpin,price,time))
        f.flush()
        f.close()
    
    def show_goods(goods):#展示商品
        print('''33[36;1m编号   名称   价格33[0m
    -------------------''')
        for k,v in goods.items():
            print('''%s      %s    %s'''%(k,v[0],v[1]))
    def shopping(goods,buy_thing,user):#购物
        thing=input('33[31;1m请选择要购买的商品编号:33[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('33[32;1m请选择一个要退的商品编号:33[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('33[31;1m请重新选择付款并输入正确账号!33[0m')
            elif res:
                print('33[36;1m付款成功33[0m')
                for i in buy_thing:
                    logger(i[0], i[1], i[2])
            else:
                print('33[41;1m钱不够,请推掉部分商品!33[0m')
    def show_buy_goods(buy_thing):
        print('33[46;1m所购商品清单:33[0m')
        print('''编号   名称   价格
    -------------------''')
        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('33[36;1m欢迎登陆33[0m')
                        #write_user()
                        f.close()
                        FLAG = True
    
            else:
                print('33[31;1m用户%s已被锁,请联系400-123456进行解锁.33[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('33[36;1m删除成功!33[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('33[36;1m重置密码成功!33[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('33[31;1m输入错误,请重新输入!33[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('33[36;1m重置成功,锁状态为[%s]!33[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('33[31;1m输入错误,请重新输入!33[0m')
    if __name__=='__main__':
        main()
    

      

     

  • 相关阅读:
    洛谷[P1002]过河卒
    ACM-Teleportation
    ACM-Team Tic Tac Toe
    Data_Structure04-树
    Data_Structure03-栈和队列
    Data_Structure02-线性表
    Data_Structure01-绪论
    C语言第二次实验报告
    C语言第一次实验报告
    mysql
  • 原文地址:https://www.cnblogs.com/qqran/p/8986525.html
Copyright © 2011-2022 走看看