백엔드 개발 파이썬 튜토리얼 Python으로 간단한 쇼핑몰 구현

Python으로 간단한 쇼핑몰 구현

Mar 02, 2017 pm 04:14 PM

 本文为大家分享了购物商城小程序,供大家参考,具体内容如下

软件版本:python3.x
功能:实现简单购物商城
1.允许用户选择购买多少件
2.允许多用户登录,下一次登录后,继续按上次的余额继续购买
3. 允许用户查看之前的购买记录(显示购买时间) 
4. 商品列表分级展示

操作:
1.默认用户,pan,li,密码为123
2.登录后需正确输入用户名和密码
3.按提示选择充值的金额
4.选择购买的商品,按q退出,按c查看易购买记录,按s查看当前已购买商品

注:file_lock.txt,username_file.txt需事先创建

代码如下:

#!/usr/bin/env python
#coding:utf-8
#Auto:Panwenbin
#function:
import shelve
import time
shop_list={ #定义商品清单
 '数码电器':{'电脑':'8000','照相机':'10000','手机':'3800','打印机':'3600'},
 '服装百货':{'牛仔裤':'288','夹克':'300','王老吉':'6','方便面':'4'},
 '汽车':{'特斯拉':'999999','宝马X5':'550000','帕沙特':'250000','奇瑞':'100000'},
 '化妆品':{'欧莱雅':'888','欧诗漫':'666','韩束':'388','百雀羚':'259'},
}
count=0#定义一个计数器
jiage=[]
shop_list1={}
shop_name=list(shop_list.keys()) #将商品第一层清单数据类型转换为列表
lock_file=open('file_lock.txt','r+')
user_pass=open('username_file.txt','r+')
count=0
def show_list():#打印序列号与商品分类清单
 for i,j in enumerate(shop_list):
  print('%d:%s'%(i,j))
def show_menu(user_choise):#打印序列号与商品第二层清单
 user_choise=int(user_choise)
 a=shop_name[user_choise]
 for index,key in enumerate(shop_list[a]): #打印序列号与商品第二层清单
  print('%d:%s %s'%(index,key,shop_list[a][key]))
def show_menu2(user_choise,user_choise2):#调用用户第一次选择和第二次选择,进入对应的购物列表
  user_choise=int(user_choise)
  if user_choise2.isdigit() and int(user_choise2) < len(shop_list[shop_name[int(user_choise)]]):#判断用户输入的是否为数字,并小于商品序列号
   user_choise2=int(user_choise2)
  # if user_choise2==0:
  jiage.clear()
  for v,k in enumerate(shop_list[shop_name[user_choise]]): #获取用户进入第二层商品的清单
   jiage.append(shop_list[shop_name[user_choise]][k])#将获取的商品清单存入列表中
  jiage2=(int(jiage[user_choise2]))
  global jiage2
def quit_time():#查询完成后退出
 for i in [3,2,1]:
  print(&#39;\033[32;1m查询完毕,正在返回主菜单.....\033[1m&#39;,i)
  time.sleep(1)
def start():
 while True:
  if user_choise.isdigit() and int(user_choise) <len(shop_list):#判断用户输入的是否为数字,并小于商品序列号
    show_menu(user_choise)#调用show_menu函数,
    break
  else:
   print(&#39;\033[31;1m无效选项,请重新输入\033[1m&#39;)#用户重新输入
   break
########################################################################################################################
while count <3:#只要重试不超过3次就不断循环
 print(&#39;\033[31;1m默认用户名密码为:pan,123 li,123\033[1m&#39;)
 username=input(&#39;\033[34;1m请输入您的用户名:\033[1m&#39;)
 for i in lock_file.readlines(): #判断用户名是否在锁文件中
  i=i.split()
  if username in i[0]:
   print(&#39;\033[31;1m对不起 %s 已锁定\033[1m&#39;%username)
   exit()
 match = False
 for j in user_pass.readlines():
  user,password = j.strip(&#39;\n&#39;).split() #去掉每行多余的\n并把这一行按空格分成两列,分别赋值为user,passwd两个变量
  if username == user: #判断输入的用户是否存在
    passwd=input (&#39;\033[30;1m请输入密码:&#39;)
    if password == passwd:
      match = True
      break

    elif password != passwd:#在用户名正确的前提下,判断输入的密码是否正确
      for i in range(2):
      passwd=input (&#39;\033[31;1m密码错误,请重新输入密码:\033[1m&#39;)
      if password == passwd:
        match =True
        break
      else:
      print(&#39;\033[31;1m密码和用户名不匹配,尝试超过三次,用户被锁定\033[1m&#39;)
      lock_file.write(&#39;%s \n&#39;%username)
      lock_file.close()
      user_pass.close()
      exit()
 if username != user:
   print(&#39;\033[31;1m您输入用户名不存在,程序已退出\033[1m&#39;)
   exit()
 elif match==True:
  break

########################################################################################################################
f=shelve.open(&#39;user.db&#39;,&#39;c+&#39;)
try:
 if f[user] >0:
  pay=f[user]
  chong_zhi=input(&#39;\033[33;1m您的当前余额为%d,是否充值?充值请输入您要充值的金额,任意键进入下一步,退出程序请按q:\033[1m&#39;%f[user])
  if chong_zhi.isdigit() and int(chong_zhi) > 0:
   pay=int(chong_zhi)+int(pay)
   print(&#39;\033[35;1m充值后金额为\033[1m&#39;,pay)
except KeyError:
 chong_zhi=input(&#39;\033[36;1m您的当前余额为0,是否充值?充值请输入您要充值的金额,退出程序请按q:\033[1m&#39;)
 while True:
  if chong_zhi.isdigit() and int(chong_zhi) > 0:
   pay=int(chong_zhi)
   print(&#39;\033[33;1m充值后金额为\033[1m&#39;,pay)
   break
  elif chong_zhi==&#39;q&#39;:
   print(&#39;\033[36;1m程序正在退出\033[1m&#39;)
   exit()
  else:
   pass
#  pay=input(&#39;您的当前余额为0,是否充值?充值请输入您要充值的金额,退出程序请按q:&#39;)
########################################################################################################################
while True:
 show_list()#调用show_list函数,打印商品分类清单
 user_choise=input(&#39;\033[32;1m选择购买商品的类型:\033[1m&#39;) #获取用户选择商品的分类
 start()#调用start函数
 user_choise2=input(&#39;\033[36;1m选择购买商品的类型。按q退出,按c查看易购买记录,按s查看当前已购买商品,任意键返回上一级菜单,:\033[0m&#39;)#获取用户选择的商品
# user_num=input(&#39;\033[35;1m请选择需要购买的件数,默认为1:\033[0m&#39;)#获取用户选择商品的数量
 if user_choise2.isdigit() and int(user_choise2) < len(shop_list[shop_name[int(user_choise)]]):#判断用户输入的是否为数字,并小于商品序列号
   user_num=input(&#39;\033[35;1m请选择需要购买的件数,默认为1:\033[1m&#39;)#获取用户选择商品的数量
   show_menu2(user_choise,user_choise2)#调用show_menu2函数,获取用户选择商品的种类和数量,可用金额是否满足
   if user_num.strip() ==&#39;&#39;:#如果用户输入为空,默认为1
    user_num=int(1)
   elif user_num.isdigit and int(user_num) > 1:#如果用户输入是数字切大于1,获得用户输入中
   user_num=int(user_num)
   else:
   user_num=int(1)#其余情况下默认为一
   pay=int(pay)
   if pay > jiage2*user_num:#判断用户选择商品的价格*数量是否可以支付
   pay=pay-jiage2*user_num
   choise=list(shop_list[shop_name[int(user_choise)]].keys())#得到用户进入第二层商品列表
   count+=1   #计数器值加一
   goumai_jilu=shelve.open(&#39;goumai_jilu.txt&#39;,&#39;a+&#39;) #调用shelve打开一个数据文件
   goumai_jilu[str(count)]=choise[int(user_choise2)],jiage2,user_num,time.ctime()#向数据文件中插入用户选择的商品,个数和购买时间
   goumai_jilu.close()#关闭数据文件
   a=choise[int(user_choise2)]#得到用户选择的商品,choise为用户选择第二层商品列表
   if a in shop_list1:  #如果用户选择的商品已购买
    shop_list1[a][0]=int(shop_list1[a][0])+user_num #将购买数加一
    shop_list1[a][1]=int(shop_list1[a][1])+int(shop_list1[a][1]*user_num) #将总额加
   else:
    shop_list1[a]=list([1,jiage2])
   print(&#39;\033[32;1m您的余额为:\033[1m&#39;,pay)
   else:
   print(&#39;\033[32;1m您的余额不足,请重新选择:\033[0m&#39;)
 elif user_choise2==&#39;b&#39;:#返回商品分类清单
  continue
 elif user_choise2==&#39;q&#39;:#退出程序
  f=shelve.open(&#39;user.db&#39;,&#39;a+&#39;)
  f[user]=pay
  f.close()
  exit()
 elif user_choise2==&#39;c&#39;:
  goumai_jilu=shelve.open(&#39;goumai_jilu.txt&#39;,&#39;a+&#39;)
  print(&#39;\033[32;1m您的当前购买记录为:\033[1m&#39;)
  for i in goumai_jilu.items(): #获取购买记录中的数据
   print(&#39;{} {}&#39;.format(i[0],goumai_jilu[i[0]]))#打印购买记录
  print(&#39;\033[32;1m################################################\033[0m&#39;)
  quit_time()
 elif user_choise2==&#39;s&#39;:
  print(&#39;\033[32;1mp_name  num   total_price\033[1m&#39;)
  print(&#39;\033[32;1m%-10s%-10s%-10s\033[1m&#39;%(a,shop_list1[a][0],shop_list1[a][1]))#打印当前购买的商品,个数以及总额
  print(&#39;\033[32;1m################################################\033[0m&#39;)
  quit_time()
 else:
  print(&#39;\033[41;33m无效选项,请重新选择:\033[0m&#39;)
  continue
로그인 후 복사


以上就是本文的全部内容,希望对大家学习Python程序设计有所帮助。

更多python实现简单购物商城相关文章请关注PHP中文网!


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Apr 01, 2025 pm 05:09 PM

Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? 10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법? Apr 02, 2025 am 07:18 AM

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? 중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까? Apr 02, 2025 am 07:15 AM

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

한 데이터 프레임의 전체 열을 Python의 다른 구조를 가진 다른 데이터 프레임에 효율적으로 복사하는 방법은 무엇입니까? 한 데이터 프레임의 전체 열을 Python의 다른 구조를 가진 다른 데이터 프레임에 효율적으로 복사하는 방법은 무엇입니까? Apr 01, 2025 pm 11:15 PM

Python의 Pandas 라이브러리를 사용할 때는 구조가 다른 두 데이터 프레임 사이에서 전체 열을 복사하는 방법이 일반적인 문제입니다. 두 개의 dats가 있다고 가정 해

Uvicorn은 Serving_forever ()없이 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 Serving_forever ()없이 HTTP 요청을 어떻게 지속적으로 듣습니까? Apr 01, 2025 pm 10:51 PM

Uvicorn은 HTTP 요청을 어떻게 지속적으로 듣습니까? Uvicorn은 ASGI를 기반으로 한 가벼운 웹 서버입니다. 핵심 기능 중 하나는 HTTP 요청을 듣고 진행하는 것입니다 ...

Inversiting.com의 크롤링 메커니즘을 우회하는 방법은 무엇입니까? Inversiting.com의 크롤링 메커니즘을 우회하는 방법은 무엇입니까? Apr 02, 2025 am 07:03 AM

Investing.com의 크롤링 전략 이해 많은 사람들이 종종 Investing.com (https://cn.investing.com/news/latest-news)에서 뉴스 데이터를 크롤링하려고합니다.

문자열을 통해 객체를 동적으로 생성하고 방법을 파이썬으로 호출하는 방법은 무엇입니까? 문자열을 통해 객체를 동적으로 생성하고 방법을 파이썬으로 호출하는 방법은 무엇입니까? Apr 01, 2025 pm 11:18 PM

파이썬에서 문자열을 통해 객체를 동적으로 생성하고 메소드를 호출하는 방법은 무엇입니까? 특히 구성 또는 실행 해야하는 경우 일반적인 프로그래밍 요구 사항입니다.

See all articles