python全栈学习项目案例(一)atm+购物车

atm+购物车

一、项目需求

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、项目构架图

在这里插入图片描述
其中用户功能层中有呈现给用户的视图、各个功能的简单函数(这些简单函数需要调用接口层中函数的具体功能)
接口层存放各个功能的具体代码
数据层中存放着一些操作文件的函数
日志中存放着日志相关的函数,common中存放通用的函数

下面对项目中部分功能的实现方法作个简单的介绍:

三、视图的实现

将函数的地址存放于字典中,用户通过输入数字选择需要的功能以此来调用字典中的函数。

choice={'注册':0,'登录':1,'查询余额':2,'转账':3,'提现':4,'借款':5,'还款':6,'购物':7,'查询流水':8}
choice0={'0':register,'1':login_in,'2':check_surplus,'3':transfer,'4':withdrawal,'5':lend,repay,'6':buy,'7':check_flowing,'8':checkout}

def user_view():
	while True:
		print(choice)
	    ch=input('请选择功能,输入exit退出')
	    if ch=='exit':
	        break
	    if ch.isdigit():
	        if ch not in choice0:
	            print('请重新输入')
	            continue
	    else:
	        print('请重新输入')
	        continue
	    choice0[ch]()

四、登录认证

对于3-9的功能,我们希望让用户登录以后才能选择,如果用户在未登录时选择了这些功能,就让用户先登录再运行功能,这个一个如何实现呢?稍微梳理一下,我们希望3-9的函数功能不做任何修改并且要在这些函数上添加登录认证功能,这就可以用到装饰器了。

from lib.common import user
def authen(func):
    def rapper(*args,**kwargs):
        if user==None:
            print('请先登录')
            user=login_in()
        else:
            return func(*args,**kwargs)
    return rapper

首先需要在common文件中写入user变量以记录用户的登录信息,咱们在写装饰器的文件中调用uesr,如果user中没有用户信息就是用户没有登录,咱们调用登录函数让用户先登录,如果user中存在用户信息,直接的返回被装饰函数即可。

五、转账功能

转账功能需要先将转出账户信息和转入账户信息从文件中读出来,确定转出账户的余额可以转出以后,再将操作后的转出账户信息和转入账户信息重新写入文件中去。

#文件操作函数
def file_operation(dest,mode,content=None):
    with open(dest,mode,encoding='utf-8') as f:
        if mode=='w' or mode=='a':
            f.write(content)
        if mode=='r':
            return f.readlines()

#保存转出账户信息和转入账户信息
def modify(money,user=None,r=None,s=None):
    with open(dest,'r',encoding='utf-8') as f:
        while True:
            content=f.readline().split('_')
            if s==None:
                if content==['']:
                    break
                if content[0]==user and user != None:
                    content[2]=str(eval(content[2])-eval(money))
                    content[2]=f'{content[2]}'
                if content[0]==r and r != None:
                    content[2]=str(eval(content[2])+eval(money))
                    content[2]=f'{content[2]}'
            elif s==True:
                content[4]=f'{money}\n'
            file_operation(dest0,'a',f'{content[0]}_{content[1]}_{content[2]}_{content[3]}_{content[4]}')
            if s == True:break
    os.remove(dest)
    os.rename(dest0,dest)


#转账函数
@authen
def transfer(user):
    while True:
        r=input('请输入转入的用户名').strip()
        if r==user:
            print('转出账户无法与转入账户相同')
            continue
        r_surplus=None
        for i in file_operation(dest, 'r'):
            if i.split('_')[0]==user:
                user_surplus=i.split('_')[2]
            if i.split('_')[0]==r:
                r_surplus=i.split('_')[2]
        if r_surplus==None:
            print('该用户不存在,请重新输入')
        else:
            break
    while True:
        money=input('输入转账金额')
        if not money.isdigit():
            print('请输入正确的金额数')
        elif eval(money)>eval(user_surplus):
            print('转账金额不足,请重新输入')
        else:
            break
    modify(money,user,r)
    print('转账完成!')
    file_operation(os.path.join(root,f'./db/{user}.txt'),'a',f'转账支出:-{money}\n')
    count(user)
    get_logger(user,f'转账支出:-{money}')
    file_operation(os.path.join(root, f'./db/{r}.txt'), 'a', f'转账收入:{money}\n')
    count(r)
    get_logger(user, f'转账收入:-{money}')

六、购物功能

购物功能分为了两部分,第一部分让用户选择需要的商品加入购物车中,第二部分为扣款功能,首先和核算账户的余额是否可以负担购物的消费,如果可以负担则扣除用户账户中消费的金额。

goods=[('牛奶',10),('饼干',15),('牛肉干',20)]
good=['牛奶','饼干','牛肉干']
shopping_cart=[]
def show_goods():
    for i,j in enumerate(goods):
        print(f'{i}  {j[0]}:{j[1]}')

@authen
def add_to_cart(user):
    for i in eval(read_surplus(user).split('_')[4]):
        shopping=i.split('*')
        shopping_cart.append([shopping[0],int(shopping[1]),goods[good.index(shopping[0])][1]*int(shopping[1])])
    while True:
        print([f'{i[0]}*{i[1]}' for i in shopping_cart])
        while True:
            mode=input('按z键增加购物车商品,按x键减少购物车商品,按c键退出购物')
            if re.findall('[zxc]',mode)==[] or len(mode)>1:
                print('请重新选择')
            else:
                break
        if mode=='c':
            modify([f'{i[0]}*{i[1]}' for i in shopping_cart],s=True)
            break
        show_goods()
        while True:
            choice=input('选择您要操作的商品')
            if choice.isdigit():
                if not 0<=int(choice)<len(goods):
                    print('请重新输入')
                else:
                    break
            else:
                print('请重新输入')
        while True:
            num = input('选择输入您需要操作的数量')
            if not num.isdigit():
                print('请重新输入')
            else:
                break
        if mode=='z':
            if goods[int(choice)][0] not in [i[0] for i in shopping_cart]:
                shopping_cart.append([f'{goods[int(choice)][0]}',int(num),int(num)*goods[int(choice)][1]])
            else:
                indexx = [i[0] for i in shopping_cart].index(goods[int(choice)][0])
                shopping_cart[indexx][1] += int(num)
        if mode=='x':
            if goods[int(choice)][0] not in [i[0] for i in shopping_cart]:
                print('未购买商品,无法删减购物车')
            else:
                indexx = [i[0] for i in shopping_cart].index(goods[int(choice)][0])
                if shopping_cart[indexx][1]<int(num):
                    print('购物车商品数量小于删减数量')
                else:
                    shopping_cart[indexx][1]-=int(num)
                    if shopping_cart[indexx][1]==0:
                        shopping_cart.pop(indexx)


@authen
def checkout(user):
    for i in eval(read_surplus(user).split('_')[4]):
        shopping=i.split('*')
        shopping_cart.append([shopping[0],int(shopping[1]),goods[good.index(shopping[0])][1]*int(shopping[1])])
        print(shopping_cart)
    sum=0
    out='您购买了'
    for i in shopping_cart:
        out+=f'{i[0]}*{i[1]},'
        sum+=i[2]
    out=f'{out}一共{sum}元'
    print(out)
    money=eval(read_surplus(user).split('_')[2])
    if money<sum:
        print('余额不足')
    else:
        modify(str(sum),user)
        print('付款成功')
        shopping_cart.clear()
        modify([], s=True)
    file_operation(os.path.join(root, f'./db/{user}.txt'), 'a', f'购物支付:-{sum}\n')
    count(user)
    get_logger(user, f'购物支付:-{money}')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值