Python 实现购物商城,含有用户入口和商家入口的示例
这是模拟淘宝的一个简易的购物商城程序。
用户入口具有以下功能:
登录认证
可以锁定用户
密码输入次数大于3次,锁定用户名
连续三次输错用户名退出程序
可以选择直接购买,也可以选择加入购物车
用户使用支付密码完成支付,支付密码连续输入错误达3次,锁定用户名
商家入口具有以下功能:
登录认证
可以锁定用户
密码输入次数大于3次,锁定用户名
连续三次输错用户名退出程序
商家可以编辑商品
上架新品
下架商品
修改商品信息:商品名、单价、库存
每个用户的用户名、密码、余额、支付密码,以行记录定义在user_list.txt文件中,以逗号分隔;
每件商品的商品名、单价、库存,以行记录定义在product_list.txt文件中,以逗号加一个空格分隔;
被锁定用户名记录在lock_list.txt文件中,以行分隔;
商家的用户名、密码定义在seller_list.txt文件中,以逗号分隔;
#JoeYoung
importgetpass
importos
#调用os模块的system方法传入'cls'参数,清屏
os.system('cls')
whileTrue:
entrance=input('请选择:\n\t1.用户登陆\n\t2.商家登陆\n>>>')
ifentrance!='1'andentrance!='2':
print('\n输入有误,请重试...\n')
else:
break
#打印商品列表
defprint_product_list():
index=1
withopen('product_list.txt','r')asproduct_file:
forproduct_lineinproduct_file:
L=[commodity,price,stock]=product_line.strip('\n').split(',')
commodity_list.append(L)
print((str(index)+'.'+commodity).ljust(20)+('单价:'+price+'元').ljust(15)+'库存:'+stock)
index+=1
return
#用户入口
ifentrance=='1':
info=[]#存放用户的信息,初始为空
if_payed=True#if_payed表示订单是否已支付
username=''
#登录接口
count=0
whilecount<3:
username=input('\n用户名:')
#打开锁定列表文件
withopen('lock_list.txt','r+')aslock_file:
forlock_lineinlock_file:
#用户名在锁定名单里面,则退出程序
ifusername==lock_line.strip('\n'):
exit('\n用户名%s已被锁定,请联系管理员...'%username)
login=False#登录标志,初始为False
#打开用户名列表文件,读权限
user_file=open('user_list.txt','r')
foruser_lineinuser_file:
#获取每行的用户信息,用户名、密码、余额、支付密码,存入info列表
info=[user,passwd,balance,pay_passwd]=user_line.strip('\n').split(',')
#用户名匹配,则进入密码输入环节
ifuser==username:
n=0
#3次输入机会
whilen<3:
password=getpass.getpass('密码:')
#密码匹配,显示登录成功
ifpasswd==password:
print('\n欢迎%s登录商城,祝您购物愉快!\n'%username)
login=True#登录标志赋值为True
break
#密码不匹配
else:
#n=2时是最后一次机会,不必提示还剩下0次机会
ifn!=2:
print('\n密码错误,请重新输入,您还有%d次机会\n'%(2-n))
n+=1
#密码错误次数达到3次,锁定用户名,退出程序
else:
open('lock_list.txt','w').write(username+'\n')
exit('\n错误次数过多,账户已被锁定...')
#登录成功,跳出for循环
iflogin:
break
else:
ifcount!=2:
print('\n用户名不存在,请重试,您还有%d次机会'%(2-count))
user_file.close()
count+=1
#登录成功,跳出while循环
iflogin:
break
else:
exit('\n错误次数过多,程序已退出...')
#购买程序
shopping_cart=[]#购物车初始为空
commodity_list=[]
print_product_list()
whileTrue:
i=input('\n请选择商品(输入序号),或输入c取消购买:')
ifi=='c':
whileTrue:
a=input('\n是否继续购买?(Y/N):')
ifa=='n'ora=='N':
exit('\n交易结束...')
elifa=='y'ora=='Y':
break
else:
print('\n输入格式有误,请重试...')
continue
ifnoti.isdigit():
print('\n输入格式有误,请重试...')
continue
i=int(i)
ifi<=0ori>len(commodity_list):
print('\n此商品不存在,请重试...')
continue
item_name=commodity_list[i-1][0]#商品名称
item_price=commodity_list[i-1][1]#商品价格
item_stock=commodity_list[i-1][2]#商品库存
print('\n您已选择了%s,请输入购买的数量,或输入b重新选择:'%item_name)
back=False
whileTrue:
num=input('>>>')
ifnum=='b':
back=True
break
ifnotnum.isdigit():
print('输入格式有误,请重试...')
continue
ifint(num)>int(item_stock):
print('数量大于库存,请重试...')
continue
ifint(num)==0:
print('数量应大于0,请重试...')
break
ifback:
continue
item=[item_name,item_price,num]
print('\n您已选择了%s,单价:%s元,数量:%s,您想立即购买还是加入购物车?\n'%(item_name,item_price,num))
print('\t1.立即购买\n\t2.加入购物车\n')
whileTrue:
choice=input('>>>')
ifnot(choice=='1'orchoice=='2'):
print('输入有误,请重试...')
continue
break
user_balance=int(info[2])
#立即购买
ifchoice=='1':
amount=int(item_price)*int(num)
count=0
cancel=False
whilecount<3:
user_pay_passwd=getpass.getpass('\n请输入支付密码,或输入c放弃支付:')
ifuser_pay_passwd=='c':
print('\n取消支付成功...')
cancel=True
break
elifuser_pay_passwd!=info[3]:
ifcount!=2:
print('\n密码错误,请重试,您还有%d次机会...'%(2-count))
count+=1
else:
break
ifcount==3:
withopen('lock_list.txt','w')aslock_file:
lock_file.write(username+'\n')
exit('密码错误,账户已被锁定...')
ifcancel:
whileTrue:
choice=input('\n是否继续购买?(Y/N):')
ifnot(choice=='Y'orchoice=='y'orchoice=='N'orchoice=='n'):
print('\n输入格式有误,请重试...')
continue
break
ifchoice=='Y'orchoice=='y':
continue
else:
break
#如果用户的账户余额大于总金额
ifuser_balance>=amount:
user_balance-=amount
print('\n支付成功!您已成功购买%s,单价:%s元,数量:%s,总金额:%s元,账户余额:%s元'
%(item_name,item_price,num,amount,user_balance))
lines=open('product_list.txt','r').readlines()
#定位到用户所购买的商品所在行,分割成列表赋值给select
select=lines[i-1].strip('\n').split(',')
#修改商品的库存
select[-1]=(str(int(select[-1])-int(num))+'\n')
#拼接成字符串
lines[i-1]=','.join(select)
#将修改写回文件
open('product_list.txt','w').writelines(lines)
lines=open('user_list.txt','r').readlines()
#修改用户余额
forlineinlines:
ifusernameinline.split(','):#定位到用户名所在行
j=lines.index(line)#获取用户名所在行的行号索引
select=line.split(',')#分割用户名所在行赋值给列表select
select[-2]=str(user_balance)#修改用户余额
lines[j]=','.join(select)#修改后的列表拼接成字符串,覆盖用户名所在行
open('user_list.txt','w').writelines(lines)#将修改写回文件
else:
print('\n对不起,您的余额不足...')
else:#加入购物车
j=0
forjinrange(len(shopping_cart)):
#如果商品在购物车里面,更新商品数量
ifitem_nameinshopping_cart[j]:
shopping_cart[j][2]=str(int(shopping_cart[j][2])+int(num))
break
#商品若不在购物车,则添加到购物车
else:
shopping_cart.append(item)
print('\n成功加入购物车!')
whileTrue:
choice=input('\n是否继续购买?(Y/N):')
ifnot(choice=='Y'orchoice=='y'orchoice=='N'orchoice=='n'):
print('\n输入格式有误,请重试...')
continue
break
ifchoice=='Y'orchoice=='y':
continue
else:
break
#如果购物车不为空
ifshopping_cart:
print('\n您的购物车里有以下宝贝:\n')
i=1
total_sum=0
foriteminshopping_cart:
(commodity,price,number)=(item[0],item[1],item[2])
print((str(i)+'.'+commodity).ljust(20)+('单价:'+price+'元').ljust(15)+'数量:'+number)
total_sum+=int(price)*int(number)
i+=1
print('\n合计:%d元'%total_sum)
whileTrue:
if_buy=input('\n是否结算?(Y/N):')
ifnot(if_buy=='Y'orif_buy=='y'orif_buy=='N'orif_buy=='n'):
print('\n输入有误,请重试...')
continue
break
whileTrue:
#结算
ifif_buy=='Y'orif_buy=='y':
count=0
cancel=False
whilecount<3:
user_pay_passwd=getpass.getpass('\n请输入支付密码,或输入c放弃支付:')
ifuser_pay_passwd=='c':
print('\n取消支付成功...')
cancel=True
break
elifuser_pay_passwd!=info[3]:
ifcount!=2:
print('\n密码错误,请重试,您还有%d次机会...'%(2-count))
count+=1
else:
break
ifcancel:
if_payed=False
elifcount==3:
withopen('lock_list.txt','w')aslock_file:
lock_file.write(username+'\n')
exit('\n密码错误,账户已被锁定...')
else:
iftotal_sum<=user_balance:
user_balance-=total_sum
print('\n支付成功!您已成功购买以下商品:\n')
i=1
foriteminshopping_cart:
(commodity,price,number)=(item[0],item[1],item[2])
print((str(i)+'.'+commodity).ljust(20)+
('单价:'+price+'元').ljust(15)+'数量:'+number)
lines=open('product_list.txt','r').readlines()
forlineinlines:#修改商品库存
ifcommodityinline.split(','):#定位到商品所在行
j=lines.index(line)#获取商品所在行的行号索引
select=line.split(',')#商品所在行分割为字符串列表
select[-1]=(str(int(select[-1])-int(number))+'\n')#修改商品库存
lines[j]=','.join(select)#将修改后的字符串列表组成字符串
open('product_list.txt','w').writelines(lines)#把修改写回文件
i+=1
lines=open('user_list.txt','r').readlines()
forlineinlines:#用户余额写入文件
ifusernameinline.split(','):
j=lines.index(line)
select=line.split(',')
select[-2]=str(user_balance)
lines[j]=','.join(select)
open('user_list.txt','w').writelines(lines)
exit('\n合计:%d元,账户余额:%d元'%(total_sum,user_balance))
#不结算
else:
print('\n您有一笔未支付订单...')
whileTrue:
choice=input('\n是否进行支付?(Y/N):')
ifnot(choice=='Y'orchoice=='y'orchoice=='N'orchoice=='n'):
print('\n输入有误,请重试...')
continue
break
ifchoice=='n'orchoice=='N':
exit('\n订单已取消,感谢光临购物商城,再见...')
else:
if_buy='Y'
continue
ifnotif_payed:
print('\n您有一笔未支付订单...')
whileTrue:
choice=input('\n是否进行支付?(Y/N):')
ifnot(choice=='Y'orchoice=='y'orchoice=='N'orchoice=='n'):
print('\n输入有误,请重试...')
continue
break
ifchoice=='n'orchoice=='N':
exit('\n订单已取消,感谢光临购物商城,再见...')
else:
if_buy='Y'
continue
#商家入口
ifentrance=='2':
seller_name=''
#登录接口
count=0
whilecount<3:
seller_name=input('\n用户名:')
withopen('lock_list.txt','r')aslock_file:
forlock_lineinlock_file:
ifseller_name==lock_line.strip('\n'):
exit('\n用户名%s已被锁定,请联系管理员...'%seller_name)
seller_file=open('seller_list.txt','r')
login=False
forseller_lineinseller_file:
(seller,passwd)=seller_line.strip('\n').split(',')
ifseller_name==seller:
n=0
whilen<3:
password=getpass.getpass('密码:')
#登录成功,跳出while循环
ifpassword==passwd:
print('\n欢迎%s登录商城'%seller_name)
login=True
break
else:
ifn!=2:
print('\n密码错误,请重试,您还有%d次机会'%(2-n))
n+=1
#n=3,锁定用户名
else:
open('lock_list.txt','w').write(seller_name+'\n')
exit('\n错误次数过多,账户已被锁定...')
#登录成功,跳出for循环
iflogin:
break
#用户名不存在
else:
ifcount!=2:
print('\n用户名不存在,请重试,您还有%d次机会'%(2-count))
#登录成功,跳出while循环
iflogin:
break
count+=1
else:
exit('\n错误次数过多,程序已退出...')
#商品列表编辑程序
L=[]
#存放商品列表,初始为空
commodity_list=[]
index=1
print('\n您的货架上有以下商品:\n')
print_product_list()
whileTrue:
choice=input('\n是否编辑您的商品列表?(Y/N):')
ifnot(choice=='Y'orchoice=='y'orchoice=='N'orchoice=='n'):
print('\n输入有误,请重试...')
continue
break
ifchoice=='Y'orchoice=='y':
whileTrue:
print('\n请选择(输入q退出):\n')
print('1.上架新品\n\n2.下架商品\n\n3.修改商品信息')
choice=input('\n>>>')
ifnot(choice=='1'orchoice=='2'orchoice=='3'orchoice=='q'):
print('输入有误,请重试...')
continue
#上架新品
ifchoice=='1':
whileTrue:
if_add=False#是否添加商品的标志,初始为False
new_commodity=input('\n输入商品名:')
product_file=open('product_list.txt','r')
forproduct_lineinproduct_file:
commodity=product_line.strip('\n').split(',')[0]#获取商品列表中的商品名
ifnew_commodity==commodity:
print('\n此商品已在货架上...')
continue
else:
whileTrue:
if_sure=input('\n确定上架新品%s吗?(Y/N):'%new_commodity)
ifnot(if_sure=='Y'orif_sure=='y'orif_sure=='N'orif_sure=='n'):
print('\n输入有误,请重试...')
continue
break
#确定上架新品
ifif_sure=='Y'orif_sure=='y':
whileTrue:#输入单价
price=input('\n请输入单价:')
ifnotprice.isdigit():
print('\n输入有误,请重试...')
continue
break
whileTrue:#输入库存
stock=input('\n请输入库存:')
ifnotstock.isdigit():
print('\n输入有误,请重试...')
continue
break
new_line='\n'+new_commodity+','+price+','+stock
open('product_list.txt','a').writelines(new_line)
print('\n成功上架新品%s,单价%s元,库存%s件'%(new_commodity,price,stock))
whileTrue:
option=input('\n是否继续添加?(Y/N):')
ifnot(option=='Y'oroptionoroption=='N'oroption=='n'):
print('\n输入有误,请重试...')
continue
break
ifoption=='Y'oroption=='y':
if_add=True
break#跳出for循环
else:
break
#取消上架新品
else:
if_add=False
break#跳出for循环
product_file.close()
ifif_addisTrue:
continue
else:
break#跳出while循环
#下架商品
elifchoice=='2':
whileTrue:
del_num=input('\n请输入您想下架商品的序号:')
ifnot(del_num.isdigit()orint(del_num)>0andint(del_num)<=len(commodity_list)):
print('\n输入有误,请重试...')
continue
break
del_num=int(del_num)
del_commodity=commodity_list[del_num-1][0]
withopen('product_list.txt','r')asold_file:
withopen('product_list.txt','r+')asnew_file:
current_line=0
#定位到需要删除的行
whilecurrent_line<(del_num-1):
old_file.readline()
current_line+=1
#当前光标在被删除行的行首,记录该位置
seek_point=old_file.tell()
#设置光标位置
new_file.seek(seek_point,0)
#读需要删除的行,光标移到下一行行首
old_file.readline()
#被删除行的下一行读给next_line
next_line=old_file.readline()
#连续覆盖剩余行,后面所有行上移一行
whilenext_line:
new_file.write(next_line)
next_line=old_file.readline()
#写完最后一行后截断文件,因为删除操作,文件整体少了一行,原文件最后一行需要去掉
new_file.truncate()
print('\n您已成功下架%s!'%del_commodity)
#修改商品信息
elifchoice=='3':
#修改商品信息
defmod_commodity_info(i,j):
i=int(i)
j=int(j)
withopen('product_list.txt','r+')asf:
current_line=0
whilecurrent_line0andint(i)<=len(commodity_list)):
print("\n输入有误,请重试...")
continue
elifi=='c':
break
else:
whileTrue:
j=input("\n请选择需要编辑的选项(输入c取消):\n\n1.商品名\n\n2.单价\n\n3.库存\n\n>>>")
ifnot(j=='c'orj=='1'orj=='2'orj=='3'):
print("\n输入有误,请重试...")
continue
break
ifj=='c':
break
else:
mod_commodity_info(i,j)
else:
exit('\n您已退出商城...')
else:
exit('\n您已退出商城...')
以上这篇Python实现购物商城,含有用户入口和商家入口的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。