您的当前位置:首页正文

Python实现有用户和商家入口的购物商城

2020-11-27 来源:好走旅游网

下面小编就为大家带来一篇Python 实现购物商城,含有用户入口和商家入口的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

这是模拟淘宝的一个简易的购物商城程序。

用户入口具有以下功能:

登录认证

可以锁定用户

密码输入次数大于3次,锁定用户名

连续三次输错用户名退出程序

可以选择直接购买,也可以选择加入购物车

用户使用支付密码完成支付,支付密码连续输入错误达3次,锁定用户名

商家入口具有以下功能:

登录认证

可以锁定用户

密码输入次数大于3次,锁定用户名

连续三次输错用户名退出程序

商家可以编辑商品

上架新品

下架商品

修改商品信息:商品名、单价、库存

每个用户的用户名、密码、余额、支付密码,以行记录定义在 user_list.txt 文件中,以逗号分隔;

每件商品的商品名、单价、库存,以行记录定义在 product_list.txt 文件中,以逗号加一个空格分隔;

被锁定用户名记录在 lock_list.txt 文件中,以行分隔;

商家的用户名、密码定义在 seller_list.txt 文件中,以逗号分隔;


# Joe Young

import getpass
import os

# 调用os模块的system方法传入'cls'参数,清屏
os.system('cls') 

while True:
 entrance = input('请选择:
	1. 用户登陆
	2. 商家登陆
>>>')
 if entrance != '1' and entrance != '2':
 print('
输入有误,请重试...
')
 else:
 break

# 打印商品列表
def print_product_list():
 index = 1
 with open('product_list.txt', 'r') as product_file:
 for product_line in product_file:
 L = [commodity, price, stock] = product_line.strip('
').split(', ')
 commodity_list.append(L)
 print((str(index) + '. ' + commodity).ljust(20) + ('单价:' + price + '元').ljust(15) + '库存:' + stock)
 index += 1
 return

# 用户入口
if entrance == '1':

 info = [] # 存放用户的信息,初始为空
 if_payed = True # if_payed 表示订单是否已支付
 username = ''

 # 登录接口
 count = 0
 while count < 3:
 username = input('
用户名: ')

 # 打开锁定列表文件
 with open('lock_list.txt', 'r+') as lock_file: 
 for lock_line in lock_file:
 # 用户名在锁定名单里面,则退出程序
 if username == lock_line.strip('
'): 
 exit('
用户名 %s 已被锁定,请联系管理员...' % username)

 login = False # 登录标志,初始为False

 # 打开用户名列表文件,读权限
 user_file = open('user_list.txt', 'r') 

 for user_line in user_file:
 # 获取每行的用户信息,用户名、密码、余额、支付密码,存入info列表
 info = [user, passwd, balance, pay_passwd] = user_line.strip('
').split(',')
 # 用户名匹配,则进入密码输入环节
 if user == username: 
 n = 0
 # 3次输入机会
 while n < 3: 
 password = getpass.getpass('密码: ')
 # 密码匹配,显示登录成功
 if passwd == password: 
 print('
欢迎 %s 登录商城,祝您购物愉快!
' % username)
 login = True # 登录标志赋值为True
 break
 # 密码不匹配
 else: 
 # n = 2 时是最后一次机会,不必提示还剩下0次机会
 if n != 2: 
 print('
密码错误,请重新输入,您还有 %d 次机会
' % (2-n))
 n += 1
 # 密码错误次数达到3次,锁定用户名,退出程序
 else: 
 open('lock_list.txt', 'w').write(username + '
')
 exit('
错误次数过多,账户已被锁定...')

 # 登录成功,跳出for循环
 if login: 
 break
 else:
 if count != 2:
 print('
用户名不存在,请重试,您还有 %d 次机会' % (2-count))

 user_file.close()

 count += 1

 # 登录成功,跳出while循环
 if login: 
 break

 else:
 exit('
错误次数过多,程序已退出...')

 # 购买程序
 shopping_cart = [] # 购物车初始为空
 commodity_list = []

 print_product_list()

 while True:
 i = input('
请选择商品(输入序号),或输入 c 取消购买:')

 if i == 'c':
 while True:
 a = input('
是否继续购买?(Y/N):')
 if a == 'n' or a == 'N':
 exit('
交易结束...')
 elif a == 'y' or a == 'Y':
 break
 else:
 print('
输入格式有误,请重试...')
 continue

 if not i.isdigit():
 print('
输入格式有误,请重试...')
 continue

 i = int(i)

 if i <= 0 or i > len(commodity_list):
 print('
此商品不存在,请重试...')
 continue

 item_name = commodity_list[i-1][0] # 商品名称
 item_price = commodity_list[i-1][1] # 商品价格
 item_stock = commodity_list[i-1][2] # 商品库存

 print('
您已选择了 %s ,请输入购买的数量,或输入 b 重新选择:' % item_name)

 back = False

 while True:
 num = input('>>>')
 if num == 'b':
 back = True
 break
 if not num.isdigit():
 print('输入格式有误,请重试...')
 continue
 if int(num) > int(item_stock):
 print('数量大于库存,请重试...')
 continue
 if int(num) == 0:
 print('数量应大于0,请重试...')
 break
 if back:
 continue

 item = [item_name, item_price, num]

 print('
您已选择了 %s,单价:%s 元,数量:%s,您想立即购买还是加入购物车?
' % (item_name, item_price, num))
 print('	1. 立即购买
	2. 加入购物车
')

 while True:
 choice = input('>>>')
 if not (choice == '1' or choice == '2'):
 print('输入有误,请重试...')
 continue
 break

 user_balance = int(info[2])

 # 立即购买
 if choice == '1': 
 amount = int(item_price) * int(num)
 count = 0
 cancel = False

 while count < 3:
 user_pay_passwd = getpass.getpass('
请输入支付密码,或输入 c 放弃支付:')
 if user_pay_passwd == 'c':
 print('
取消支付成功...')
 cancel = True
 break
 elif user_pay_passwd != info[3]:
 if count != 2:
 print('
密码错误,请重试,您还有 %d 次机会...' % (2-count))
 count += 1
 else:
 break

 if count == 3:
 with open('lock_list.txt', 'w') as lock_file:
 lock_file.write(username + '
')
 exit('密码错误,账户已被锁定...')

 if cancel:
 while True:
 choice = input('
是否继续购买?(Y/N):')
 if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
 print('
输入格式有误,请重试...')
 continue
 break
 if choice == 'Y' or choice == 'y':
 continue
 else:
 break

 # 如果用户的账户余额大于总金额
 if user_balance >= amount: 
 user_balance -= amount
 print('
支付成功!您已成功购买 %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('
').split(', ') 
 # 修改商品的库存
 select[-1] = (str(int(select[-1]) - int(num)) + '
') 
 # 拼接成字符串
 lines[i-1] = ', '.join(select) 
 # 将修改写回文件
 open('product_list.txt', 'w').writelines(lines) 

 lines = open('user_list.txt', 'r').readlines()
 # 修改用户余额
 for line in lines: 
 if username in line.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('
对不起,您的余额不足...')

 else: # 加入购物车
 j = 0
 for j in range(len(shopping_cart)):
 # 如果商品在购物车里面,更新商品数量
 if item_name in shopping_cart[j]: 
 shopping_cart[j][2] = str(int(shopping_cart[j][2]) + int(num))
 break
 # 商品若不在购物车,则添加到购物车
 else:
 shopping_cart.append(item) 
 print('
成功加入购物车!')

 while True:
 choice = input('
是否继续购买?(Y/N):')
 if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
 print('
输入格式有误,请重试...')
 continue
 break

 if choice == 'Y' or choice == 'y':
 continue
 else:
 break

 # 如果购物车不为空
 if shopping_cart: 
 print('
您的购物车里有以下宝贝:
')
 i = 1
 total_sum = 0
 for item in shopping_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('
合计:%d 元' % total_sum)

 while True:
 if_buy = input('
是否结算?(Y/N):')
 if not (if_buy == 'Y' or if_buy == 'y' or if_buy == 'N' or if_buy == 'n'):
 print('
输入有误,请重试...')
 continue
 break

 while True:
 # 结算
 if if_buy == 'Y' or if_buy == 'y': 
 count = 0
 cancel = False

 while count < 3:
 user_pay_passwd = getpass.getpass('
请输入支付密码,或输入 c 放弃支付:')
 if user_pay_passwd == 'c':
 print('
取消支付成功...')
 cancel = True
 break
 elif user_pay_passwd != info[3]:
 if count != 2:
 print('
密码错误,请重试,您还有 %d 次机会...' % (2-count))
 count += 1
 else:
 break

 if cancel:
 if_payed = False

 elif count == 3:
 with open('lock_list.txt', 'w') as lock_file:
 lock_file.write(username + '
')
 exit('
密码错误,账户已被锁定...')

 else:
 if total_sum <= user_balance:
 user_balance -= total_sum
 print('
支付成功!您已成功购买以下商品:
')
 i = 1
 for item in shopping_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()
 for line in lines: # 修改商品库存
 if commodity in line.split(', '): # 定位到商品所在行
 j = lines.index(line) # 获取商品所在行的行号索引
 select = line.split(', ') # 商品所在行分割为字符串列表
 select[-1] = (str(int(select[-1]) - int(number)) + '
') # 修改商品库存
 lines[j] = ', '.join(select) # 将修改后的字符串列表组成字符串
 open('product_list.txt', 'w').writelines(lines) # 把修改写回文件
 i += 1

 lines = open('user_list.txt', 'r').readlines()

 for line in lines: # 用户余额写入文件
 if username in line.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('
合计:%d 元, 账户余额:%d 元' % (total_sum, user_balance))

 # 不结算
 else: 
 print('
您有一笔未支付订单...')
 while True:
 choice = input('
是否进行支付?(Y/N):')
 if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
 print('
输入有误,请重试...')
 continue
 break
 if choice == 'n' or choice == 'N':
 exit('
订单已取消,感谢光临购物商城,再见...')
 else:
 if_buy = 'Y'
 continue

 if not if_payed:
 print('
您有一笔未支付订单...')
 while True:
 choice = input('
是否进行支付?(Y/N):')
 if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
 print('
输入有误,请重试...')
 continue
 break

 if choice == 'n' or choice == 'N':
 exit('
订单已取消,感谢光临购物商城,再见...')
 else:
 if_buy = 'Y'
 continue

# 商家入口
if entrance == '2': 

 seller_name = ''

 # 登录接口
 count = 0
 while count < 3:
 seller_name = input('
用户名:')

 with open('lock_list.txt', 'r') as lock_file:
 for lock_line in lock_file:
 if seller_name == lock_line.strip('
'):
 exit('
用户名 %s 已被锁定,请联系管理员...' % seller_name)

 seller_file = open('seller_list.txt', 'r')
 login = False

 for seller_line in seller_file:
 (seller, passwd) = seller_line.strip('
').split(',')
 if seller_name == seller:
 n = 0
 while n < 3:
 password = getpass.getpass('密码:')
 # 登录成功,跳出while循环
 if password == passwd:
 print('
欢迎 %s 登录商城' % seller_name)
 login = True
 break 
 else:
 if n != 2:
 print('
密码错误,请重试,您还有 %d 次机会' % (2-n))
 n += 1
 # n = 3,锁定用户名
 else: 
 open('lock_list.txt', 'w').write(seller_name + '
')
 exit('
错误次数过多,账户已被锁定...')
 # 登录成功,跳出for循环
 if login: 
 break

 # 用户名不存在
 else: 
 if count != 2:
 print('
用户名不存在,请重试,您还有 %d 次机会' % (2-count))

 # 登录成功,跳出while循环
 if login: 
 break

 count += 1

 else:
 exit('
错误次数过多,程序已退出...')


 # 商品列表编辑程序
 
 L = []
 # 存放商品列表,初始为空
 commodity_list = []
 index = 1

 print('
您的货架上有以下商品:
')
 
 print_product_list()

 while True:
 choice = input('
是否编辑您的商品列表?(Y/N):')
 if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
 print('
输入有误,请重试...')
 continue
 break

 if choice == 'Y' or choice == 'y':
 while True:
 print('
请选择(输入 q 退出):
')
 print('1. 上架新品

2. 下架商品

3. 修改商品信息')
 choice = input('
>>>')
 if not (choice == '1' or choice == '2' or choice == '3' or choice == 'q'):
 print('输入有误,请重试...')
 continue

 # 上架新品
 if choice == '1':
 while True:
 if_add = False # 是否添加商品的标志,初始为False
 new_commodity = input('
输入商品名:')

 product_file = open('product_list.txt', 'r')

 for product_line in product_file:
 commodity = product_line.strip('
').split(', ')[0] # 获取商品列表中的商品名
 if new_commodity == commodity:
 print('
此商品已在货架上...')
 continue
 else:
 while True:
 if_sure = input('
确定上架新品 %s 吗?(Y/N):' % new_commodity)
 if not (if_sure == 'Y' or if_sure == 'y' or if_sure == 'N' or if_sure == 'n'):
 print('
输入有误,请重试...')
 continue
 break
 # 确定上架新品
 if if_sure == 'Y' or if_sure == 'y':
 while True: # 输入单价
 price = input('
请输入单价:')
 if not price.isdigit():
 print('
输入有误,请重试...')
 continue
 break
 while True: # 输入库存
 stock = input('
请输入库存:')
 if not stock.isdigit():
 print('
输入有误,请重试...')
 continue
 break
 new_line = '
' + new_commodity + ', ' + price + ', ' + stock
 open('product_list.txt', 'a').writelines(new_line)
 print('
成功上架新品 %s ,单价 %s 元,库存 %s 件' % (new_commodity, price, stock))

 while True:
 option = input('
是否继续添加?(Y/N):')
 if not (option == 'Y' or option or option == 'N' or option == 'n'):
 print('
输入有误,请重试...')
 continue
 break
 if option == 'Y' or option == 'y':
 if_add = True
 break # 跳出for循环
 else:
 break
 # 取消上架新品
 else:
 if_add = False
 break # 跳出for循环
 product_file.close()

 if if_add is True:
 continue
 else:
 break # 跳出while循环

 # 下架商品
 elif choice == '2':
 while True:
 del_num = input('
请输入您想下架商品的序号:')
 if not (del_num.isdigit() or int(del_num) > 0 and int(del_num) <= len(commodity_list)):
 print('
输入有误,请重试...')
 continue
 break

 del_num = int(del_num)
 del_commodity = commodity_list[del_num - 1][0]

 with open('product_list.txt', 'r') as old_file:
 with open('product_list.txt', 'r+') as new_file:

 current_line = 0

 # 定位到需要删除的行
 while current_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()

 # 连续覆盖剩余行,后面所有行上移一行
 while next_line:
 new_file.write(next_line)
 next_line = old_file.readline()

 # 写完最后一行后截断文件,因为删除操作,文件整体少了一行,原文件最后一行需要去掉
 new_file.truncate()

 print('
您已成功下架 %s !' % del_commodity)

 # 修改商品信息
 elif choice == '3':

 # 修改商品信息
 def mod_commodity_info(i, j):
 i = int(i)
 j = int(j)
 with open('product_list.txt', 'r+') as f:
 current_line = 0
 while current_line < i - 1:
 f.readline()
 current_line += 1
 seek_point = f.tell()
 f.seek(seek_point, 0)

 # 修改商品名
 if j == 1:
 update_line = mod_name() + ', ' + commodity_list[i-1][1] + ', ' + commodity_list[i-1][2] + '
'
 # 修改商品价格
 elif j == 2:
 update_line = commodity_list[i-1][0] + ', ' + mod_price() + ', ' + commodity_list[i-1][2] + '
'
 # 修改商品库存
 else:
 update_line = commodity_list[i-1][0] + ', ' + commodity_list[i-1][1] + ', ' + mod_stock() + '
'
 
 f.write(update_line)
 return
 
 def mod_name():
 new_name = input("
请输入新的商品名:")
 return new_name

 def mod_price():
 new_price = input("
请输入新的商品单价:")
 return new_price

 def mod_stock():
 new_stock = input("
请输入新的商品库存:")
 return new_stock

 # 修改商品单价
 def mod_commodity_price(i):
 i = int(i)
 with open('product_list.txt', 'r+') as f:
 current_line = 0
 while current_line < i -1:
 f.readline()
 current_line += 1
 seek_point = f.tell()
 f.seek(seek_point, 0)
 new_price = input()


 while True:
 i = input("
请输入需要编辑的商品序号(输入 c 取消):")
 if not (i.isdigit or i == 'c' or int(i) > 0 and int(i) <= len(commodity_list)):
 print("
输入有误,请重试...")
 continue
 elif i == 'c':
 break
 else:
 while True:
 j = input("
请选择需要编辑的选项(输入 c 取消):

1. 商品名

2. 单价

3. 库存

>>>")
 if not (j == 'c' or j == '1' or j == '2' or j == '3'):
 print("
输入有误,请重试...")
 continue
 break
 if j == 'c':
 break
 else:
 mod_commodity_info(i, j)

 else:
 exit('
您已退出商城...')
 else:
 exit('
您已退出商城...')
显示全文