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

时间:2023-11-22 14:13:26

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

用户入口具有以下功能:

  1. 登录认证
    1. 可以锁定用户
    2. 密码输入次数大于3次,锁定用户名
    3. 连续三次输错用户名退出程序
  2. 可以选择直接购买,也可以选择加入购物车
  3. 用户使用支付密码完成支付,支付密码连续输入错误达3次,锁定用户名

商家入口具有以下功能:

  1. 登录认证
    1. 可以锁定用户
    2. 密码输入次数大于3次,锁定用户名
    3. 连续三次输错用户名退出程序
  2. 商家可以编辑商品
    1. 上架新品
    2. 下架商品
    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('请选择:\n\t1. 用户登陆\n\t2. 商家登陆\n>>>')
if entrance != '' and entrance != '':
print('\n输入有误,请重试...\n')
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('\n').split(', ')
commodity_list.append(L)
print((str(index) + '. ' + commodity).ljust(20) + ('单价:' + price + '元').ljust(15) + '库存:' + stock)
index += 1
return # 用户入口
if entrance == '': info = [] # 存放用户的信息,初始为空
if_payed = True # if_payed 表示订单是否已支付
username = '' # 登录接口
count = 0
while count < 3:
username = input('\n用户名: ') # 打开锁定列表文件
with open('lock_list.txt', 'r+') as lock_file:
for lock_line in lock_file:
# 用户名在锁定名单里面,则退出程序
if username == lock_line.strip('\n'):
exit('\n用户名 %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('\n').split(',')
# 用户名匹配,则进入密码输入环节
if user == username:
n = 0
# 3次输入机会
while n < 3:
password = getpass.getpass('密码: ')
# 密码匹配,显示登录成功
if passwd == password:
print('\n欢迎 %s 登录商城,祝您购物愉快!\n' % username)
login = True # 登录标志赋值为True
break
# 密码不匹配
else:
# n = 2 时是最后一次机会,不必提示还剩下0次机会
if n != 2:
print('\n密码错误,请重新输入,您还有 %d 次机会\n' % (2-n))
n += 1
# 密码错误次数达到3次,锁定用户名,退出程序
else:
open('lock_list.txt', 'w').write(username + '\n')
exit('\n错误次数过多,账户已被锁定...') # 登录成功,跳出for循环
if login:
break
else:
if count != 2:
print('\n用户名不存在,请重试,您还有 %d 次机会' % (2-count)) user_file.close() count += 1 # 登录成功,跳出while循环
if login:
break else:
exit('\n错误次数过多,程序已退出...') # 购买程序
shopping_cart = [] # 购物车初始为空
commodity_list = [] print_product_list() while True:
i = input('\n请选择商品(输入序号),或输入 c 取消购买:') if i == 'c':
while True:
a = input('\n是否继续购买?(Y/N):')
if a == 'n' or a == 'N':
exit('\n交易结束...')
elif a == 'y' or a == 'Y':
break
else:
print('\n输入格式有误,请重试...')
continue if not i.isdigit():
print('\n输入格式有误,请重试...')
continue i = int(i) if i <= 0 or i > 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 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('\n您已选择了 %s,单价:%s 元,数量:%s,您想立即购买还是加入购物车?\n' % (item_name, item_price, num))
print('\t1. 立即购买\n\t2. 加入购物车\n') while True:
choice = input('>>>')
if not (choice == '' or choice == ''):
print('输入有误,请重试...')
continue
break user_balance = int(info[2]) # 立即购买
if choice == '':
amount = int(item_price) * int(num)
count = 0
cancel = False while count < 3:
user_pay_passwd = getpass.getpass('\n请输入支付密码,或输入 c 放弃支付:')
if user_pay_passwd == 'c':
print('\n取消支付成功...')
cancel = True
break
elif user_pay_passwd != info[3]:
if count != 2:
print('\n密码错误,请重试,您还有 %d 次机会...' % (2-count))
count += 1
else:
break if count == 3:
with open('lock_list.txt', 'w') as lock_file:
lock_file.write(username + '\n')
exit('密码错误,账户已被锁定...') if cancel:
while True:
choice = input('\n是否继续购买?(Y/N):')
if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
print('\n输入格式有误,请重试...')
continue
break
if choice == 'Y' or choice == 'y':
continue
else:
break # 如果用户的账户余额大于总金额
if user_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()
# 修改用户余额
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('\n对不起,您的余额不足...') 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('\n成功加入购物车!') while True:
choice = input('\n是否继续购买?(Y/N):')
if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
print('\n输入格式有误,请重试...')
continue
break if choice == 'Y' or choice == 'y':
continue
else:
break # 如果购物车不为空
if shopping_cart:
print('\n您的购物车里有以下宝贝:\n')
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('\n合计:%d 元' % total_sum) while True:
if_buy = input('\n是否结算?(Y/N):')
if not (if_buy == 'Y' or if_buy == 'y' or if_buy == 'N' or if_buy == 'n'):
print('\n输入有误,请重试...')
continue
break while True:
# 结算
if if_buy == 'Y' or if_buy == 'y':
count = 0
cancel = False while count < 3:
user_pay_passwd = getpass.getpass('\n请输入支付密码,或输入 c 放弃支付:')
if user_pay_passwd == 'c':
print('\n取消支付成功...')
cancel = True
break
elif user_pay_passwd != info[3]:
if count != 2:
print('\n密码错误,请重试,您还有 %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 + '\n')
exit('\n密码错误,账户已被锁定...') else:
if total_sum <= user_balance:
user_balance -= total_sum
print('\n支付成功!您已成功购买以下商品:\n')
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)) + '\n') # 修改商品库存
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('\n合计:%d 元, 账户余额:%d 元' % (total_sum, user_balance)) # 不结算
else:
print('\n您有一笔未支付订单...')
while True:
choice = input('\n是否进行支付?(Y/N):')
if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
print('\n输入有误,请重试...')
continue
break
if choice == 'n' or choice == 'N':
exit('\n订单已取消,感谢光临购物商城,再见...')
else:
if_buy = 'Y'
continue if not if_payed:
print('\n您有一笔未支付订单...')
while True:
choice = input('\n是否进行支付?(Y/N):')
if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
print('\n输入有误,请重试...')
continue
break if choice == 'n' or choice == 'N':
exit('\n订单已取消,感谢光临购物商城,再见...')
else:
if_buy = 'Y'
continue # 商家入口
if entrance == '': seller_name = '' # 登录接口
count = 0
while count < 3:
seller_name = input('\n用户名:') with open('lock_list.txt', 'r') as lock_file:
for lock_line in lock_file:
if seller_name == lock_line.strip('\n'):
exit('\n用户名 %s 已被锁定,请联系管理员...' % seller_name) seller_file = open('seller_list.txt', 'r')
login = False for seller_line in seller_file:
(seller, passwd) = seller_line.strip('\n').split(',')
if seller_name == seller:
n = 0
while n < 3:
password = getpass.getpass('密码:')
# 登录成功,跳出while循环
if password == passwd:
print('\n欢迎 %s 登录商城' % seller_name)
login = True
break
else:
if n != 2:
print('\n密码错误,请重试,您还有 %d 次机会' % (2-n))
n += 1
# n = 3,锁定用户名
else:
open('lock_list.txt', 'w').write(seller_name + '\n')
exit('\n错误次数过多,账户已被锁定...')
# 登录成功,跳出for循环
if login:
break # 用户名不存在
else:
if count != 2:
print('\n用户名不存在,请重试,您还有 %d 次机会' % (2-count)) # 登录成功,跳出while循环
if login:
break count += 1 else:
exit('\n错误次数过多,程序已退出...') # 商品列表编辑程序 L = []
# 存放商品列表,初始为空
commodity_list = []
index = 1 print('\n您的货架上有以下商品:\n') print_product_list() while True:
choice = input('\n是否编辑您的商品列表?(Y/N):')
if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
print('\n输入有误,请重试...')
continue
break if choice == 'Y' or choice == 'y':
while True:
print('\n请选择(输入 q 退出):\n')
print('1. 上架新品\n\n2. 下架商品\n\n3. 修改商品信息')
choice = input('\n>>>')
if not (choice == '' or choice == '' or choice == '' or choice == 'q'):
print('输入有误,请重试...')
continue # 上架新品
if choice == '':
while True:
if_add = False # 是否添加商品的标志,初始为False
new_commodity = input('\n输入商品名:') product_file = open('product_list.txt', 'r') for product_line in product_file:
commodity = product_line.strip('\n').split(', ')[0] # 获取商品列表中的商品名
if new_commodity == commodity:
print('\n此商品已在货架上...')
continue
else:
while True:
if_sure = input('\n确定上架新品 %s 吗?(Y/N):' % new_commodity)
if not (if_sure == 'Y' or if_sure == 'y' or if_sure == 'N' or if_sure == 'n'):
print('\n输入有误,请重试...')
continue
break
# 确定上架新品
if if_sure == 'Y' or if_sure == 'y':
while True: # 输入单价
price = input('\n请输入单价:')
if not price.isdigit():
print('\n输入有误,请重试...')
continue
break
while True: # 输入库存
stock = input('\n请输入库存:')
if not stock.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)) while True:
option = input('\n是否继续添加?(Y/N):')
if not (option == 'Y' or option or option == 'N' or option == 'n'):
print('\n输入有误,请重试...')
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 == '':
while True:
del_num = input('\n请输入您想下架商品的序号:')
if not (del_num.isdigit() or int(del_num) > 0 and int(del_num) <= len(commodity_list)):
print('\n输入有误,请重试...')
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('\n您已成功下架 %s !' % del_commodity) # 修改商品信息
elif choice == '': # 修改商品信息
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] + '\n'
# 修改商品价格
elif j == 2:
update_line = commodity_list[i-1][0] + ', ' + mod_price() + ', ' + commodity_list[i-1][2] + '\n'
# 修改商品库存
else:
update_line = commodity_list[i-1][0] + ', ' + commodity_list[i-1][1] + ', ' + mod_stock() + '\n' f.write(update_line)
return def mod_name():
new_name = input("\n请输入新的商品名:")
return new_name def mod_price():
new_price = input("\n请输入新的商品单价:")
return new_price def mod_stock():
new_stock = input("\n请输入新的商品库存:")
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("\n请输入需要编辑的商品序号(输入 c 取消):")
if not (i.isdigit or i == 'c' or int(i) > 0 and int(i) <= len(commodity_list)):
print("\n输入有误,请重试...")
continue
elif i == 'c':
break
else:
while True:
j = input("\n请选择需要编辑的选项(输入 c 取消):\n\n1. 商品名\n\n2. 单价\n\n3. 库存\n\n>>>")
if not (j == 'c' or j == '' or j == '' or j == ''):
print("\n输入有误,请重试...")
continue
break
if j == 'c':
break
else:
mod_commodity_info(i, j) else:
exit('\n您已退出商城...')
else:
exit('\n您已退出商城...')