网络编程
位置:首页>> 网络编程>> Python编程>> Python 实现购物商城,含有用户入口和商家入口的示例

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

作者:乔少年  发布时间:2023-09-26 11:39:46 

标签: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('请选择:\n\t1. 用户登陆\n\t2. 商家登陆\n>>>')
if entrance != '1' and entrance != '2':
 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 == '1':

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 == '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('\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 == '2':  

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 == '1' or choice == '2' or choice == '3' or choice == 'q'):
   print('输入有误,请重试...')
   continue

# 上架新品
  if choice == '1':
   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 == '2':
   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 == '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] + '\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 == '1' or j == '2' or j == '3'):
       print("\n输入有误,请重试...")
       continue
      break
     if j == 'c':
      break
     else:
      mod_commodity_info(i, j)

else:
   exit('\n您已退出商城...')
else:
 exit('\n您已退出商城...')

来源:http://www.cnblogs.com/Dreamer-qiao/archive/2017/09/14/7522952.html

0
投稿

猜你喜欢

  • 前言21世纪是信息的世纪,综合国力的竞争在很大程度上是信息的竞争,更是信息利用率的竞争。近年来,随着“数字地球”和“数字国土”战略的提出和实
  • HTTP头中一般断点下载时才用到Range和Content-Range实体头,Range用户请求头中,指定第一个字节的位置和最后一个字节的位
  • 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组...)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办
  • 1998年,W3C发布HTML 4.0 Specification,里面清清楚楚的写了每个标签的用法和语义。搜索引擎的算法参考了W3C的语义
  • 阻塞定义当来自应用程序的第一个连接控制锁而第二个连接需要相冲突的锁类型时,将发生阻塞。其结果是强制第二个连接等待,而在第一个连接上阻塞。不管
  • 建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户
  • 当今,有一点可以肯定的是,设计的领域在扩大,这是一个需要设计的世界。拒最新的统计资料显示,中国目前已有正规的设计学院教学机构700多所,并且
  • 首先说一个小技巧,True可看作1,False可看作0 ,并且可以参与运算!正文开始!!! 一、map()map(func,ite
  • 发现一个有意思的现象,labelimg打开图片和xml标签时候,看不到标注好的框框,仔细查看了xml文件,没发现什么异常,后面试一下,才发现
  • 序言哈喽兄弟们,今天来实现一个Python采集视频、弹幕、评论与一体的小软件。平常咱们都是直接代码运行,不过今天我们做成软件,这样的话,咱们
  • 搭建环境:操作系统:Win10 64bitPython版本:3.7Pycharm:社区免费版一、Python3.7安装下载链接:官网http
  • 任何数据库系统都无法避免崩溃的状况,即使你使用了Clustered,双机热备等等,仍然无法完全根除系统中的单点故障,何况对于大部分用户来说,
  • python内存管理机制:引用计数垃圾回收内存池1. 引用计数当一个python对象被引用时 其引用计数增加 1 ; 当其不再被变量引用时
  • 看了不少朋友的个人网站,有一个小问题,似乎很多朋友都忽略了,那就是版权声明的写法。虽然那只是一小行字,不过作为设计师也好,作为个人的爱好也好
  • 如果你是个赛车手,并且按一下按钮就能够立即更换引擎而不需要把车开到车库里去换,那会是什么感觉呢?MySQL数据库为开发人员所做的就好像是按按
  • ini文件即Initialization File初始化文件,在应用程序及框架中常作为配置文件使用,是一种静态纯文本文件,使用记事本即可编辑
  • 分页,就是按照某种规则显示分组数据集,但是在SQL Server 中,分页并不是十分容易就能够实现。在过去,开发人员通常需要自己编写程序,使
  • 本文实例讲述了Python画图的基本方法。分享给大家供大家参考,具体如下:Python:使用matplotlib绘制图表python绘制图表
  • 效果展示爬取目标网址:酷我音乐工具使用开发工具:pycharm开发环境:python3.7, Windows10使用工具包:requests
  • 这篇文章主要介绍了简单了解Python3 bytes和str类型的区别和联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
手机版 网络编程 asp之家 www.aspxhome.com