信用卡+购物商城+ATM管理练习

        最近无聊又写了一个信用卡业务的练习。基于python3。功能如下:

模拟实现一个ATM+购物商城的程序
1.额度15000
2.实现购物商城,买东西加入购物车,调用信用卡接口结账
3.可以提现,手续费5%
4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额的万分之5每日计息
5.支持多账户登录
6.支持账户间转账
7.记录每月日常消费流水
8.提供还款接口
9.ATM记录操作日志
10.提供管理接口,包括添加账户,用户额度,冻结账户

        目前除了还款提醒没有实现,因为没有想到有什么方式比较简单,其他功能都已基本实现。代码中使用的都是标准包,代码也比较基础,适合新手,老鸟勿打击。本次练习项目共是哪个模块:atm(信用卡业务)、shopping(商城)和home(主模块),见源码:

atm.py

#-*-coding:utf-8-*-
import pickle
import os
import sys
import time
import random
from collections import OrderedDict
class ATM:
    '''
    ATM业务
    '''
    def __init__(self):
        #self.name = None
        lists = ['users.txt','acount.txt','forze.txt']
        self.initFile(lists)
        if not os.path.exists('acount_detail.txt'):
            dics = OrderedDict()
            self.edit('acount_detail.txt',dics)
        if not os.path.exists('userShopList.txt'):
            dics = OrderedDict()
            self.edit('userShopList.txt',dics)

    def initFile(self,filesList):
        '''
        初始化文件
        :param files:
        :return:
        '''
        for files in filesList:
            if not os.path.exists(files):
                self.edit(files,{})

    def isForzeNot(self):
        isNot = self.opens('forze.txt')
        if self.name in isNot and isNot[self.name] == 'Y':
            print('该账号已冻结,无法执行该操作!')
            return True
        else:
            return False

    def querys(self):
        '''
        查询余额
        :return:
        '''
        nums = self.query(self.name)
        print('您的账户余额为:¥',nums)

    def query(self,name):
        '''
        查询账号余额
        :return:
        '''
        acount = self.opens('acount.txt')
        return acount[name]

    def opens(self,files):
        '''
        读取信息
        :return:
        '''
        with open(files,'rb') as f:
            acount = pickle.load(f)
            return acount

    def edit(self,files,content):
        '''
        写入文件
        :param f:
        :return:
        '''
        with open(files,'wb') as f:
            pickle.dump(content,f)

    def changes(self,name,now):
        '''
        修改账号信息
        :return:
        '''
        isNot = self.isForzeNot()
        if not isNot:
            acount = self.opens('acount.txt')
            acount[name] = now
            self.edit('acount.txt',acount)

    def login(self):
        '''
        登录
        :param name:
        :param pwd:
        :return:
        '''
        name = input('请输入用户名:')
        pwd = input('请输入密码:')
        users = self.opens('users.txt')
        if name in users and users[name] == pwd:
            self.name = name
            return True
        else:
            print('用户名或密码错误!')
            return False

    def register(self):
        '''
        注册账号
        :param name:
        :param pwd:
        :return:
        '''
        print('注册账号!')
        name = input('请输入新用户名:')
        user_all = self.opens('users.txt')
        if name not in user_all:
            self.name = name
            pwd = input('请输入密码:')
            user_all[name] = pwd
            self.edit('users.txt',user_all)
            self.changes(name,15000.00)
            self.record('record','新建账号,信用卡额度初始化为15000')
            self.record('opsition',15000)
            print('注册成功!')
        else:
            print('该账号已存在!')

    def getCash(self):
        '''
        取现
        :param num:
        :return:
        '''
        isNot = self.isForzeNot()
        if not isNot:
            num = input('请输入金额:')
            num = self.check_nums(num)
            if num:
                acount = self.query(self.name)
                if acount > num:
                    now_cash = round(acount - num*1.05,2)
                    self.changes(self.name,now_cash)
                    print('成功取现:¥',num)
                    self.record('record','取现¥{}'.format(num))
                    print('你的最新余额为:',now_cash)
            else:
                self.getCash()

    def check_nums(self,num):
        '''
        核对金额
        :param num:
        :return:
        '''
        if str(num).isdigit():
            return int(str(num))
        else:
            print('请输入正确的金额,金额必须是整数!')
            return False

    def check_user(self,name):
        '''
        检查账户
        :param name:
        :return:
        '''
        user_all = self.opens('users.txt')
        if name in user_all:
            return True
        else:
            return False

    def transfer(self):
        '''
        转账
        :param user:
        :param num:
        :return:
        '''
        isNot = self.isForzeNot()
        if not isNot:
            user = input('请输入转账账户:')
            if self.check_user(user):
                num = input('请输入转账金额:')
                num = self.check_nums(num)
                now_money = self.query(self.name)
                if num and num<=now_money:
                    self.changes(self.name,now_money-num)
                    self.record('record','向账号{}转账:¥{}'.format(user,num))
                    now_money2 = self.query(user)
                    self.changes(user,now_money2+num)
                    self.recorded('record','账号{}转账转入:¥{}'.format(self.name, num),user)
                    now = self.query(self.name)
                    print('转账成功,您的最新余额为:¥',now)
                elif num:
                    print('对不起,您的余额不足!')

            else:
                print('对不起您输入的账户不存在!')

    def repay(self):
        '''
        还款
        :return:
        '''
        now_money = self.query(self.name)
        print('您当前的账户余额为:¥',now_money)
        num = input('请输入您要充值的金额(整数):')
        num = self.check_nums(num)
        self.changes(self.name,now_money+num)
        self.record('record','账号充值:¥{}'.format(num))
        now = self.query(self.name)
        print('充值成功,你当前余额为:¥',now)

    def record(self,types,commnet):
        '''
        记录流水
        :param types:
        :return:
        '''
        detail = self.opens('acount_detail.txt')
        time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        if self.name in detail:
            if types == 'record':
                detail[self.name][types].update({time_now:commnet})
            else:
                detail[self.name].update({'opsition': commnet})
        else:
            detail[self.name] = {types:{time_now:commnet},'opsition':15000}
        self.edit('acount_detail.txt',detail)

    def recorded(self,types,comment,name):
        '''
        记录被转账
        :param types:
        :param comment:
        :return:
        '''
        detail = self.opens('acount_detail.txt')
        time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        if name in detail:
            if types == 'record':
                detail[name][types].update({time_now: comment})
            else:
                detail[name].update({'opsition': comment})
        else:
            detail[name] = {types: {time_now: comment}, 'opsition': 15000}
        self.edit('acount_detail.txt',detail)

    def readRecord(self):
        '''
        读取流水
        :return:
        '''
        with open('acount_detail.txt','rb') as f:
            user_detail = pickle.load(f)
        return user_detail

    def readDetails(self):
        '''
        查询流水
        :return:
        '''
        details = self.opens('acount_detail.txt')[self.name]['record']
        print('您的信用卡使用记录:')
        for key,value in details.items():
            print('{}:{}'.format(key,value))

    def writeOff(self):
        '''
        注销信用卡
        :return:
        '''
        name_now = self.opens('acount_detail.txt')[self.name]['opsition']
        now_num = self.query(self.name)
        if name_now > now_num:
            print('对不起,你的账号尚有欠款未还,不能注销,请还款后再进行操作!')
        else:
            self.delUser('users.txt',self.name)
            self.delUser('acount.txt',self.name)
            self.delUser('acount_detail.txt',self.name)
            print('注销成功!')

    def delUser(self,files,user):
        '''
        删除用户信息
        :param files:
        :param user:
        :return:
        '''
        fs = self.opens(files)
        del fs[user]
        self.edit(files,fs)

    def forzes(self):
        '''
        冻结/解冻操作
        :return:
        '''
        alls = self.opens('forze.txt')
        if self.name in alls and alls[self.name] == 'Y':
            self.unForze()
            print('账号解冻成功!')
        else:
            self.forze()
            print('账号冻结成功!')

    def forze(self):
        '''
        冻结账号
        :return:
        '''
        alls = self.opens('forze.txt')
        alls[self.name] = 'Y'
        self.edit('forze.txt',alls)

    def unForze(self):
        '''
        解冻
        :return:
        '''
        alls = self.opens('forze.txt')
        del alls[self.name]
        self.edit('forze.txt', alls)

    def position(self):
        '''
        额度
        :return:
        '''
        print()
        while 1:
            yes = input('您确定要申请提升额度吗?\n1.Yes\n2.No\n请选择:')
            if yes == '1':
                print('请稍等..')
                lists = [1,0.2,0.3,0.2,0.2,0.5,0.3,0.1]
                some = random.sample(lists,1)[0]
                num = some*2000
                now = self.query(self.name)
                self.changes(self.name,now+num)
                now_po = self.readRecord()[self.name]['opsition']
                self.record('opsition',now_po+num)
                print('根据您的最近表现,银行特为您提升了{}的额度,您的当前额度是{},祝您使用愉快!'.format(num,now_po+num))
                time.sleep(.3)
                break
            elif yes == '2':
                print('放弃额度申请!')
                break
            else:
                print('错误的指令!')
                continue

    def readShopList(self):
        '''
        查询购物明细
        :return:
        '''
        alls = self.opens('userShopList.txt')
        if self.name in alls:
            for date,detail in alls[self.name].items():
                print(date,detail)
        else:
            print('暂时没有购物记录!')

    def deal(self,shopLists,bill):
        '''
        结账
        :param shopLists:
        :param bill:
        :return:
        '''
        login = self.login()
        if login:
            now_cash = self.query(self.name)
            if now_cash >= bill:
                time_now = time.strftime('%Y-%m-%d', time.localtime())
                lists = OrderedDict()
                lists[time_now] = []
                for name, num in shopLists.items():
                    lists[time_now].append('购买{}数量{}'.format(name, num))

                users = self.opens('userShopList.txt')
                if self.name in users:
                    if time_now in users[self.name]:
                        users[self.name][time_now].extend(lists[time_now])
                    else:
                        users[self.name].update(lists)
                else:
                    users[self.name] = lists

                self.edit('userShopList.txt', users)
                self.changes(self.name,now_cash-bill)
                self.record('record','购物商城消费¥{}'.format(bill))
                return True
            else:
                print('对不起,您的余额不足,请及时充值!')
                return False
        else:
            print('交易失败!')
            return False

shopping.py

#-*-coding:utf-8-*-
import time
from collections import OrderedDict
import sys
import os
import atm
shoplist = OrderedDict()
bill = 0

atm_now = atm.ATM()
def shops():
    '''
    购物模块
    :return:
    '''
    print()
    while 1:
        alls = {1:shoppings,2:shopCar,3:'退出'}
        order = input('欢迎进入网上商城!\n1.购物\n2.购物车\n3.退出\n请选择您的操作:')
        order = checkOrder(order,len(alls))
        if order == 3:
            break
        if order:
            alls[order]()
            time.sleep(.3)
            print()
        else:
            continue

def shopCar():
    '''
    购物车
    :return:
    '''
    while 1:
        print()
        alls = {1:checkList,2:deal,3:'返回'}
        order = input('欢迎进入购物车!\n1.查看清单\n2.结账\n3.返回\n请选择您的操作:')
        order = checkOrder(order,len(alls))
        if order == 3:
            break
        if order == 1:
            checkList()
            time.sleep(.3)
            print()
        elif order == 2:
            ok = deal()
            if ok:
                print('交易成功!')
                global shoplist,bill
                shoplist = OrderedDict()
                bill = 0
                break
        else:
            continue

def checkList():
    '''
    查看清单
    :return:
    '''
    global shoplist,bill
    if shoplist and bill:
        for name,num in shoplist.items():
            print('商品:{} × {}'.format(name,num))
        print('总金额为:¥',bill)
    else:
        print('您的购物车尚未添加商品!')

def deal():
    '''
    结账
    :return:
    '''
    global shoplist,bill
    if bill:
        ok = atm_now.deal(shoplist,bill)
        return ok
    else:
        print('购物车无商品,请添加后结账!')
        return False

def dealNot():
    while 1:
        print()
        global shoplist,bill
        if shoplist and bill:
            doNot = input('请问您是否结账?\n1.结账\n2.否\n请选择:')
            doNot = checkOrder(doNot, 2)
            if doNot == 1:
                return True
            elif doNot == 2:
                return False
            else:
                continue

def shoppings():
    '''
    购物
    :return:
    '''
    while 1:
        print()
        alls = {1:vegetables,2:clothing,3:appliances,4:steam,5:'返回'}
        order = input('欢迎进入购物商城!\n1.蔬菜\n2.服装\n3.家电\n4.steam\n5.返回\n请选择您的品类:')
        order = checkOrder(order,len(alls))
        if order == 5:
            do = dealNot()
            if do:
                ok = deal()
                if ok:
                    print('交易成功!')
                    global shoplist, bill
                    shoplist = OrderedDict()
                    bill = 0
                else:
                    print('交易失败!')
            break
        if order:
            print()
            alls[order]()
            time.sleep(.3)

        else:
            continue

def centers(name):
    '''
    居中打印
    :param name:
    :param num:
    :return:
    '''
    result = name.center(10,' ')
    return result

def checkOrder(order,len):
    '''
    检查指令
    :param order:
    :param len:
    :return:
    '''
    if str(order).isdigit() and int(order) <= len:
        return int(str(order))
    else:
        print('请输入有效的指令!')
        return False

def please():
    '''
    询问
    :return:
    '''
    while 1:
        print()
        order = input('请问您是否要继续?\n1.是\n2.否\n请选择:')
        order = checkOrder(order,2)
        if order==1:
            return True
        elif order == 2:
            return False
        else:
            continue

def sum(name,values):
    '''
    统计
    :param values:
    :param num:
    :return:
    '''
    while 1:
        num = input('请输入数量(整数):')
        if num.isdigit() and int(num) > 0:
            num = int(num)
            money = values * num
            global  bill,shoplist
            bill += money
            if name in shoplist:
                shoplist[name] += num
            else:
                shoplist[name] = num
            break
        else:
            print('请输入正确的数量!')
            print()

def buy(alls,values):
    '''
    购买
    :return:
    '''
    for i in range(0, len(alls)):
        print(centers(str(i + 1)), centers(alls[i]), centers(str(values[i])))
    order = input('请输入您的选择:')
    order = checkOrder(order, len(alls))
    if order:
        order -= 1
        sum(alls[order], values[order])
        isNot = please()
        if isNot:
            return True
        else:
            return False
    else:
        return True

def vegetables():
    '''
    蔬菜
    :return:
    '''
    print('欢迎进入生鲜购物区!')
    while 1:
        print()
        values = [1.0,0.6,1.1,0.8,1.3,0.7]
        alls = ['白菜','萝卜','番茄','大葱','黄瓜','洋葱' ]
        print(centers('序号'),centers('名称'),centers('价格/500g'))
        isNot = buy(alls,values)
        if isNot:
            continue
        else:
            break

def clothing():
    '''
    服装
    :return:
    '''
    print('欢迎进入服装购物区!')
    while 1:
        print()
        values = [1000.0,120.0,500.0,320.0,200.0,120.0]
        alls = ['西装','T恤','羽绒服','卫衣','牛仔裤','短袖' ]
        print(centers('序号'),centers('名称'),centers('价格'))
        isNot = buy(alls,values)
        if isNot:
            continue
        else:
            break
def appliances():
    '''
    家电
    :return:
    '''
    print('欢迎进入家电购物区!')
    while 1:
        print()
        values = [1500.0,2000.0,3000.0,500.0,500.0,5000.0]
        alls = ['洗衣机','冰箱','空调','微波炉','面包机','电视' ]
        print(centers('序号'),centers('名称'),centers('价格'))
        isNot = buy(alls,values)
        if isNot:
            continue
        else:
            break

def steam():
    '''
    游戏
    :return:
    '''
    print('欢迎进入喜加一购物区!')
    while 1:
        print()
        values = [94.0,180.0,160.0,220.0,90.0,300.0]
        alls = ['绝地求生','GTA5','辐射4','刺客信条','巫师3','孤岛惊魂5' ]
        print(centers('序号'),centers('名称'),centers('价格'))
        isNot = buy(alls,values)
        if isNot:
            continue
        else:
            break

home.py

# -*-coding:utf-8-*-
'''
模拟实现一个ATM+购物商城的程序
1.额度15000
2.实现购物商城,买东西加入购物车,调用信用卡接口结账
3.可以提现,手续费5%
4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额的万分之5每日计息
5.支持多账户登录
6.支持账户间转账
7.记录每月日常消费流水
8.提供还款接口
9.ATM记录操作日志
10.提供管理接口,包括添加账户,用户额度,冻结账户
'''
import time
import os
import atm
import shopping

def check(order,len):
    '''
    检查指令
    :param order:
    :param len:
    :return:
    '''
    if str(order).isdigit() and int(order) <= len:
        return int(str(order))
    else:
        print('请输入有效的指令!\n')
        return False

def bank():
    while 1:
        print()
        banks = {1:atm_now.getCash,2:atm_now.querys,3:atm_now.transfer,4:atm_now.repay,5:'返回'}
        order = input('欢迎进入ATM-信用卡业务:\n1.提现\n2.查询\n3.转账\n4.还款\n5.返回\n请选择业务:')
        order = check(order,5)
        if order:
            if order != 5:
                banks[order]()
                time.sleep(.3)
                print()
            else:
                break
        else:
            continue

def manager():
    while 1:
        print()
        banks = {1:atm_now.readDetails,2:atm_now.writeOff,3:atm_now.forzes,4:atm_now.position,5:atm_now.readShopList,6:'返回'}
        order = input('欢迎进入ATM-信用卡管理业务:\n1.查询信用卡记录\n2.注销\n3.冻结/解冻\n4.申请额度\n5.商城购物记录\n6.返回\n请选择业务:')
        order = check(order,len(banks))
        if order == 6:
            break
        if order and order not in [2,6]:
            banks[order]()
            time.sleep(.3)
            print()
        elif order == 2:
            banks[order]()
            time.sleep(.3)
            break
        else:
            continue

def home():
    print()
    print('请先登录!')
    logins = atm_now.login()
    while logins:
        print()
        alls = {1: bank, 2: atm_now.register, 3: shopping.shops, 4: manager, 5: '返回'}
        order = input('欢迎进入ATM业务:\n1.信用卡业务\n2.注册账号\n3.信用卡商城\n4.信用卡管理\n5.返回\n请选择业务:')
        order = check(order, 5)
        if order == 5:
            break
        if order and order not in [2,5]:
            alls[order]()
            time.sleep(.3)
            print()
        elif order == 2:
            alls[order]()
            time.sleep(.3)
            print()
            break
        else:
            continue

if __name__ == '__main__':
    atm_now = atm.ATM()
    while 1:
        print()
        fail_login = {1: home, 2: atm_now.register, 3: '退出'}
        order = input('欢迎光临:\n1.登录\n2.注册\n3.退出\n请选择您的业务:')
        order = check(order, 3)
        if not str(order).isdigit():
            continue
        if int(order) != 3:
            fail_login[int(order)]()
            time.sleep(.3)
        else:
            break
目前代码耦合度较高,有时间再优化下。自己测试了下,目前没发现有重大bug。


猜你喜欢

转载自blog.csdn.net/ljl6158999/article/details/81037242
今日推荐