python全栈学习项目案例(一)atm+购物车
atm+购物车
文章目录
- atm+购物车
- 一、项目需求
- 二、项目构架图
- 三、视图的实现
- 四、登录认证
- 五、转账功能
- 六、购物功能
一、项目需求
二、项目构架图
其中用户功能层中有呈现给用户的视图、各个功能的简单函数(这些简单函数需要调用接口层中函数的具体功能)
接口层存放各个功能的具体代码
数据层中存放着一些操作文件的函数
日志中存放着日志相关的函数,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}')