一.需求分析

  1. 拥有用户接口和商家接口
  2. 用户能够进行消费记录查询,充值,购物等功能,消费记录存储于数据库
  3. 商家可以进行商品的增删改等操作

二.程序流程图

  程序大致流程图如下:

  

三.代码实现

  本程序分成两部分,生成两个py函数,分别是DataAccess_txt.py和ShoopingCar.py,DataAccess_txt.py函数主要是用于编写一些数据库的操作接口,比如增删改操作,用户数据查询存储等操作。ShoopingCar.py用户主函数的编辑与处理,话不多说上代码:

  DataAccess_txt.py程序代码如下:

import time#导入模块方法,用于系统时间获取

#查询数据库中的数据
def search_data_access():
goods=[]
fp = open('goods_info.txt','r')#打开商品信息表
lines = fp.readlines()
for line in lines:
goods.append(line.rstrip('\n').split(' '))#清楚格式转换成列表
for i in range(len(goods)):
print('%s 价格 :%s 库存 :%s'%(goods[i][0],goods[i][1],goods[i][2])) #删除商品操作
def delet_goods_opt(GoodName):
goods=[]
fp = open('goods_info.txt','r')
lines = fp.readlines()
for line in lines:
goods.append(line.rstrip('\n').split(' '))#清楚格式转换成列表
# for i in range(len(goods)):
# print('%s 价格 :%s 库存 :%s'%(goods[i][0],goods[i][1],goods[i][2]))
for i in range(len(lines)):
if GoodName == goods[i][0]:
print("删除商品%s成功!"%goods[i][0])
goods.remove(goods[i])
fp.close()
fp = open('goods_info.txt', 'w')
for i in range(len(goods)):
fp.write(' '.join(goods[i]) + '\n')
fp.close()
return
print("没有此商品信息,删除失败!") #添加商品操作
#参数说明:goodname 商品名 prace 价格 Num 库存量
def add_goods_opt(GoodName,prace,Num):
goods = []
fp = open('goods_info.txt', 'r')
lines = fp.readlines()
for line in lines:
goods.append(line.rstrip('\n').split(' ')) # 清楚格式转换成列表
T = False
for i in range(len(goods)):
if goods[i][0] == GoodName:
T = True
print("商品已存在,添加失败!")
return
Info = GoodName+' '+str(prace)+' '+str(Num)+'\n'
fp.close()
fp = open('goods_info.txt', 'a')
fp.write(Info)
fp.close()
print("添加商品%s成功!" %GoodName ) #修改商品参数
#参数说明:goodname 商品名 prace 价格 Num 库存量
def Change_goods_info(GoodName,prace,Num):
goods = []
fp = open('goods_info.txt', 'r')
lines = fp.readlines()
for line in lines:
goods.append(line.rstrip('\n').split(' ')) # 清楚格式转换成列表
for i in range(len(goods)):
if goods[i][0] == GoodName:
goods[i][1] = str(prace)
goods[i][2] = str(Num)
fp.close()
fp = open('goods_info.txt', 'w')
for i in range(len(goods)):
fp.write(' '.join(goods[i]) + '\n')
fp.close()
print("商品%s参数修改成功!"%(GoodName))
return
print("数据库中没有此商品,修改失败!") #查余额
def user_printAccountBalance(GoodName):
user_info=[]
fp = open('users_value.txt', 'r')
lines = fp.readlines()
for line in lines:
user_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
for i in range(len(user_info)):
if user_info[i][0] == GoodName:
print("\033[32;1m%s\033[0m的账户余额 :\033[32;1m%s\033[0m"%(GoodName,user_info[i][1]))
return #充值
# UserName :用户名,充值金额 :新老用户标识 新用户为True老用户为False
def user_TopUp(UserName,Value):
user_info = []
fp = open('users_value.txt', 'r')
lines = fp.readlines()
for line in lines:
user_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
for i in range(len(user_info)):
if user_info[i][0] == UserName:
user_info[i][1]=str(int(user_info[i][1])+Value)
fp.close()
fp = open('users_value.txt', 'w')
for temp in range(len(user_info)):
fp.write(' '.join(user_info[temp]) + '\n')
fp.close()
print("充值成功\033[32;1m%s\033[0m当前的账户余额 :\033[32;1m%s\033[0m" % (UserName, user_info[i][1]))
return
user_info = UserName + ' ' + str(Value) + '\n' # +' '+ (str(time.ctime())).replace(' ','')+'\n'
fp = open('users_value.txt', 'a')
fp.write(user_info)
fp.close()
print("新用户充值成功\033[32;1m%s\033[0m当前的账户余额 :\033[32;1m%s\033[0m" % (UserName, Value)) #查询用户消费记录
def user_RecordsConsumption(GoodName):
user_info = []
fp = open('users_info.txt', 'r')
lines = fp.readlines()
fp.close()
for line in lines:
user_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
T = False
for i in range(len(user_info)):
if GoodName == user_info[i][0]:
T=True
print('用户 :\033[32;1m%s\033[0m 购物清单 :%s 消费 :%s 日期 :%s'%(user_info[i][0],user_info[i][1],user_info[i][2],user_info[i][3]))
if T==False:
print("用户\033[32;1m%s\033[0m无消费记录!"%GoodName) #购物车
def user_ShoopCar(Username):
goods_info = []
ShoopCar = [] # 创建购物车列表
expense=0
fp = open('goods_info.txt', 'r')
f = open('users_value.txt','r')
ValueAccess = f.readlines()
lines = fp.readlines()
f.close()
fp.close()
for line in ValueAccess:
if line.split(' ')[0] == Username:
Salary = int(line.split(' ')[1])
for line in lines:
goods_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
while True:
for i, index in enumerate(goods_info):
print(i, index)
getNum = input("请输入要购买的商品编号,结算输入q :")
if getNum.isdigit():
getNum=int(getNum)
if Salary >= int(goods_info[getNum][1]):
ShoopCar.append(goods_info[getNum][0])
Salary = Salary - int(goods_info[getNum][1])
expense += int(goods_info[getNum][1])
if int(goods_info[getNum][2]) > 0:
goods_info[getNum][2] = str(int(goods_info[getNum][2])-1)
print("当前余额为 :\033[31;1m%s\033[0m"%Salary)
else:
print("余额不足!")
elif getNum=='q':
f = open('users_info.txt', 'a')
f.write( Username + ' ' + ','.join(ShoopCar) +' '+ str(expense) +' '+(str(time.ctime())).replace(' ','')+'\n')
f.close()
f = open('goods_info.txt', 'w')
for i in range(len(goods_info)):
f.write(' '.join(goods_info[i]) + '\n')
f.close()
value_info=[]
f = open('users_value.txt', 'r')
lines = f.readlines()
for line in lines:
value_info.append(line.rstrip('\n').split(' ')) # 清除格式转换成列表
f.close()
for i in range(len(value_info)):
if value_info[i][0] == Username:
value_info[i][1] = str(Salary)
f = open('users_value.txt', 'w')
for i in range(len(value_info)):
f.write(' '.join(value_info[i]) + '\n')
f.close()
break
else:
pass

  ShoopingCar.py程序代码如下:

import DataAccess_txt#要导入DataAccess_txt.py这个模块

while True:
Num=input("1.用户界面,2.商家界面,输入q退出 :")
if Num.isdigit():
Num = int(Num)
if Num == 1:
username = input("Please Input The Username :")
DataAccess_txt.user_printAccountBalance(username)
while True:
UserChoose = input("1.查询购物记录,2.购物,3.充值,输入q返回上级目录 :")
if UserChoose.isdigit():
UserChoose = int(UserChoose)
if UserChoose == 1:
DataAccess_txt.user_RecordsConsumption(username)#查询购物记录
elif UserChoose == 2:
DataAccess_txt.user_ShoopCar(username)#购物车
elif UserChoose == 3:
value = int(input("请输入充值金额 :"))
DataAccess_txt.user_TopUp(username,value)#充值
elif UserChoose=='q':
break
else:
pass elif Num == 2:#商家界面
DataAccess_txt.search_data_access()#打印商品信息和库存
while True:
UserChoose = input("1.添加商品,2.修改商品信息,3.删除商品,输入q返回上级目录 :")
if UserChoose.isdigit():
UserChoose = int(UserChoose)
if UserChoose==1:
goodsname=input("请输入商品名 :")
goodsvalue=int(input("请输入商品价格 :"))
goodnum = int(input("请输入商品数量 :"))
DataAccess_txt.add_goods_opt(goodsname,goodsvalue,goodnum)#商品添加操作
elif UserChoose==2:
goodsname = input("请输入要修改的商品名 :")
goodsvalue = int(input("请输入商品价格 :"))
goodnum = int(input("请输入商品数量 :"))
DataAccess_txt.Change_goods_info(goodsname, goodsvalue,goodnum)
elif UserChoose==3:
goodsname = input("请输入要删除的商品名 :")
DataAccess_txt.delet_goods_opt(goodsname)
elif UserChoose=='q':
break
else:
pass
else:
pass
elif Num == 'q':
break
else:
pass

  要注意的是必须要记得导入模块,不然没有办法使用自己编写的数据操作接口,ShoopingCar.py的第一行代码就是模块的导入,调用DataAccess_txt.py的数据操作接口时,以delet_goods_opt()删除商品信息接口为例,调用方法是DataAccess_txt.delet_goods_opt()。

  数据库文件截图如下:

  users_vlaue.txt文件存储的第一个数据参数为用户名,第二个参数为用户余额,参数之间用空格隔开

  users_info.txt文件存储的第一个数据参数为用户名,第二个参数为用户购物商品记录,第三个参数为消费总数,第四个参数为日期

  goods_info.txt文件存储的第一个数据参数为商品名,第二个参数为商品价格,第三个参数为库存总数

python购物车优化的更多相关文章

  1. 简单的python购物车

                 这几天,一直在学python,跟着视频老师做了一个比较简单的python购物车,感觉不错,分享一下 products = [['Iphone8',6888],['MacPro ...

  2. python性能优化

      注意:本文除非特殊指明,”python“都是代表CPython,即C语言实现的标准python,且本文所讨论的是版本为2.7的CPython. python为什么性能差: 当我们提到一门编程语言的 ...

  3. Python内存优化

    实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...

  4. python 购物车小程序

    python 购物车小程序 功能要求:1.启动程序后,输入用户名密码后,让用户输入工资,然后打印商品列表2.允许用户根据商品编号购买商品3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4. ...

  5. Python内存优化:Profile,slots,compact dict

    实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...

  6. Python性能优化(转)

    分成两部分:代码优化和工具优化 原文:http://my.oschina.net/xianggao/blog/102600 阅读 Zen of Python,在Python解析器中输入 import ...

  7. python的优化机制与垃圾回收与gc模块

    python属于动态语言,我们可以随意的创建和销毁变量,如果频繁的创建和销毁则会浪费cpu,那么python内部是如何优化的呢? python和其他很多高级语言一样,都自带垃圾回收机制,不用我们去维护 ...

  8. python购物车小案例

    python购物车小案例# 案列描述:有一个小型水果店里面有水果(苹果:¥8/kg,香蕉:¥5/kg,芒果:¥15/kg,葡萄:¥12/kg),客户带了100元钱进店选购水果.# 1.客户输入相应序号 ...

  9. Python性能优化方案

    Python性能优化方案 从编码方面入手,代码算法优化,如多重条件判断有限判断先决条件(可看 <改进python的91个建议>) 使用Cython (核心算法, 对性能要求较大的建议使用C ...

随机推荐

  1. log4j与logback包冲突原因及解决,不可忽视的Warning

    场景 一个简单的spring-boot程序,需要用kafka做消息队列,于是在maven中引入kafka依赖,一切看似没问题,在启动时,打印出Warning信息: SLF4J: Class path ...

  2. ansible批量修改用户密码

    实现批量修改目标主机多个用户密码: --- - hosts: testchanange passwd gather_facts: false tasks: - name: change you pas ...

  3. C++练习 | 二分练习

    Codeforces 371C : Hamburgers #include<bits/stdc++.h> using namespace std; char B='B',S='S',C=' ...

  4. MySQL->索引的维护[20180504]

    学习MySQL数据库中表的索引维护(新增和删除)       索引的好处:             提高查询的效率             可限定特定的资料(如唯一)     索引的不足:       ...

  5. 什么是ajax和json,说说他们的优缺点

    ajax异步传输的js和xml.实现页面无刷新状态更新页面和异步提交 所谓异步,简单解释就是:向服务器发送请求的时候,我们不必等待结果,而是同时做其他的事情,等到有了结果后它自己会根据设定进行后续操作 ...

  6. ionic ios 打包

    1.安装Xcode   从appstore 安装就行 2.安装node.js 3.安装cordova  由于权限问题  网络问题  可以考虑一下方式 1️⃣使用淘宝镜像    npm install ...

  7. Struts2速记手册

    工作原理 Action类 Action类 普通Action类 私有属性及getter.setter(处理请求参数) execute()方法(处理请求)   实现Action接口 提供常量   继承Ac ...

  8. Hadoop源码学习笔记之NameNode启动场景流程五:磁盘空间检查及安全模式检查

    本篇内容关注NameNode启动之前,active状态和standby状态的一些后台服务及准备工作,即源码里的CommonServices.主要包括磁盘空间检查. 可用资源检查.安全模式等.依然分为三 ...

  9. dns欺骗之ettercap

    ettercap是一个基于ARP地址欺骗方式的网络嗅探工具,主要适用于局域网. ettercap是一款现有流行的网络抓包软件,它利用计算机在局域网内进行通信的ARP协议的缺陷进行攻击,在目标与服务器之 ...

  10. golang基础--Gocurrency并发

    Go并发特点 goroutine只是由官方实现的超级"线程池"而已,每个实例4-5kb的栈内存占用和用于实现机制而大幅减少的创建和销毁开销. 并发不是并行(多CPU): Concu ...