购物车需求:
可购买的商品信息显示
显示购物车内的商品信息、数量
购物车内的商品数量进行增加、减少
用户余额的充值
用户购买完成进行结账,将最终余额回写到用户文件中
流程图:
代码:
1、主文件
def login():# 验证用户帐号和密码函数global namelock = "lock.txt"loginfile = "password.txt"login_info = 0i = 0while i < 3 and login_info == 0:name = input("Please input your name: ")with open(lock, "r") as f:for line in f:# if name in line:if name == line.strip():sys.exit('\033[32:1m用户 %s 已经被锁定\033[0m' % name)password = input("Please input password: ")with open(loginfile, "r") as f:for line in f:user_file, pass_file = line.split()if user_file == name and pass_file == password:print("Bingo!")login_info = 1return nameelse:print("You name or password is error!")i += 1else:if i == 3 and login_info == 0:f = open(lock, "a")f.write(name + "\n")f.close()print('\033[32:1m用户 %s 已经被锁定\033[0m' % name)
def show_goods():# 显示当前商店所有商品函数commodity = "commodity.txt"x = PrettyTable(["商品名称", "价格", "数量"])x.align["商品名称"] = "l" # 以name字段左对齐x.align["价格"] = "r" # 以name字段右对齐x.align["数量"] = "r" # 以name字段右对齐x.padding_width = 1 # 填充宽度with open(commodity, "r", encoding='utf-8') as f:for line in f:name, money, number = line.split()x.add_row([name, money, number])print(x)
def show_shopping_cart():# 显示购物车商品函数open_shop_cart()
def show_bought_goods():# 显示已购买商品函数open_bought()
def show_yue(username):# 显示帐号的金额money = "money.txt"x = PrettyTable(["用户", "余额"])x.align["用户"] = "l" # 以name字段左对齐x.align["余额"] = "r" # 以name字段右对齐x.padding_width = 1 # 填充宽度with open(money, "r", encoding='utf-8') as f:for line in f:name, money = line.split()if name == username:x.add_row([name, money])print(x)
def show_info():# 显示信息函数print("*****************************")print("修改密码,请输入E:")print("查看购物车,请输入S:")print("查看已购买商品函数,请输入V:")print("充值,请输入M:")print("查询余额,请输入Y:")print("购买商品,请输入B:")print("查看商品数量和价格,请输入G:")print("添加商品到购物车,请输入商品名称:")print("*****************************")return input("请输入你的选择:")
def recharge(username):# 充值函数key = usernamen = input("请输入充值金额:")filename = "money.txt"edit_file_data(filename, username, n, '+')
def add_goods_shopping_cart(key):# 添加商品到购物车函数n = input("请输入购买数量:")file1 = "commodity.txt"file2 = "shop-cart.txt"ret = edit_file_data(file1, key, n, '-')if int(ret) == 1:print("*****************************")print("商品数量不足,请重新选择")returnelse:edit_file_data(file2, key, n, '+')
def goods_bought(username):# 从商品购买函数while True:show_shopping_cart()q = input("输入q返回上级菜单,输入其他键继续:")if q.lower() == 'q':return# else:key = input("请输入购买商品名称:")n = input("请输入购买数量:")file1 = "money.txt"file2 = "shop-cart.txt"file3 = "bought.txt"with open("commodity.txt", "r", encoding='utf-8') as f1:for line in f1:shop = line.split()if str(shop[0]) == str(key):value = shop[2]sum_value = int(n) * int(value)with open(file1, "r", encoding='utf-8') as f1:for line in f1:shop = line.split()if str(shop[0]) == str(username):value = shop[1]if int(sum_value) > int(value):print("*****************************")print("余额不足请充值:")print("*****************************")return recharge(username)ret = edit_file_data(file2, key, n, '-')if int(ret) == 1:print("*****************************")print("购物车中没有这么多商品,请重新选择")print("*****************************")continueelse:edit_file_data(file1, username, sum_value, '-')edit_file_data(file3, key, n, '+')
def edit_password(username):# 修改帐号密码函数passwd1 = input("请输入你的新密码:")passwd2 = input("请再次确认你的密码:")if passwd1 != passwd2:print("*****************************")print("你2次输入的密码不一致,请重新输入")print("*****************************")return edit_password(username)else:file1 = "password.txt"file2 = "tmp.txt"with open(file1, "r", encoding='utf-8') as f1:with open(file2, "w", encoding='utf-8') as f2:for line in f1:shop = line.split()if str(shop[0]) == str(username):shop[1] = str(passwd1)dat_out = " ".join(shop)f2.write(dat_out + "\n")else:dat_out = " ".join(shop)f2.write(dat_out + "\n")move_filename(file1)print("*****************************")print("密码修改成功!")
def open_shop_cart():x = PrettyTable(["商品名称", "数量"])x.align["商品名称"] = "l" # 以name字段左对齐# x.align["价格"] = "r" # 以name字段右对齐x.align["数量"] = "r" # 以name字段右对齐x.padding_width = 1 # 填充宽度with open("shop-cart.txt", "r", encoding='utf-8') as f:for line in f:name, number = line.split()x.add_row([name, number])print("*****************************")print(x)
def open_commodity():x = PrettyTable(["商品名称", "价格", "数量"])x.align["商品名称"] = "l" # 以name字段左对齐x.align["价格"] = "r" # 以name字段右对齐x.align["数量"] = "r" # 以name字段右对齐x.padding_width = 1 # 填充宽度with open("commodity.txt", "r", encoding='utf-8') as f:for line in f:name, money, number = line.split()x.add_row([name, money, number])print(x)
def open_bought():x = PrettyTable(["商品名称", "数量"])x.align["商品名称"] = "l" # 以name字段左对齐x.align["数量"] = "r" # 以name字段右对齐x.padding_width = 1 # 填充宽度with open("bought.txt", "r", encoding='utf-8') as f:for line in f:name, number = line.split()x.add_row([name, number])print(x)
def move_filename(filename):# 重命名文件名函数for file in os.listdir('.'): # os.listdir('.')遍历文件夹内的每个文件名,并返回一个包含文件名的listif file == filename:os.remove(file)for file in os.listdir('.'):if file == "tmp.txt":new_name = filenameos.rename(file, new_name)return
def edit_file_data(filename, key, n, operator):# 修改文件数据函数file2 = "tmp.txt"sign = 0if operator == '+':with open(filename, "r", encoding='utf-8') as f1:with open(file2, "w", encoding='utf-8') as f2:for line in f1:shop = line.split()if str(shop[0]) == str(key):sign = 1shop[1] = str(int(shop[1]) + int(n))dat_out = " ".join(shop)f2.write(dat_out + "\n")else:dat_out = " ".join(shop)f2.write(dat_out + "\n")if sign == 0:shop = [key, str(n)]dat_out = " ".join(shop)f2.write(dat_out + "\n")elif operator == '-':with open(filename, "r", encoding='utf-8') as f1:with open(file2, "w", encoding='utf-8') as f2:for line in f1:shop = line.split()if str(shop[0]) == str(key):if int(shop[1]) < int(n):return 1else:shop[1] = str(int(shop[1]) - int(n))dat_out = " ".join(shop)f2.write(dat_out + "\n")else:dat_out = " ".join(shop)f2.write(dat_out + "\n")move_filename(filename)return 0
#!/usr/bin/env python
# -*- conding:utf-8 -*-
# create a shopping cart system# 20170921
# evescnimport sys
import os
import yaml
from prettytable import PrettyTabledef main():# 验证用户帐号和密码username = login()# 显示当前商店内的所有商品show_goods()while True:# 输出显示信息key = show_info()print("*****************************")if key.lower() == 's':show_shopping_cart()elif key.lower() == 'e':edit_password(username)elif key.lower() == 'v':show_bought_goods()elif key.lower() == 'm':recharge(username)elif key.lower() == 'y':show_yue(username)elif key.lower() == 'b':goods_bought(username)elif key.lower() == 'g':show_goods()else:add_goods_shopping_cart(key)if __name__ == "__main__":main()
2、用户帐号密码文件
# password.txt
evescn 123456
gmkk 12321
3、用户金额文件
# money.txt
evescn 30
gmkk 200
4、商品文件
# commodity.txt
《Python入门》 5 100
《Python放弃》 12 100
瓜子 89 10
苹果 55 5
西瓜 15 2
葡萄 12 3
西红柿 8 4
5、购物车文件
# shop-cart.txt
瓜子 6
苹果 2
西瓜 3
西红柿 2
6、已购商品文件
# bought.txt
瓜子 1
运行结果:
1、修改用户密码测试
Please input your name: evescn
Please input password: 123456
Bingo!
+----------------+------+------+
| 商品名称 | 价格 | 数量 |
+----------------+------+------+
| 《Python入门》 | 5 | 100 |
| 《Python放弃》 | 12 | 100 |
| 瓜子 | 89 | 10 |
| 苹果 | 55 | 5 |
| 西瓜 | 15 | 2 |
| 葡萄 | 12 | 3 |
| 西红柿 | 8 | 4 |
+----------------+------+------+
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:e
*****************************
请输入你的新密码:Gmkk
请再次确认你的密码:gmkk
*****************************
你2次输入的密码不一致,请重新输入
*****************************
请输入你的新密码:gmkk
请再次确认你的密码:gmkk
*****************************
密码修改成功!
*****************************
# password.txt 文件内容
evescn gmkk
gmkk 12321
2、添加商品到购物车测试
# 原商品文件信息《Python入门》 5 100
《Python放弃》 12 100
瓜子 89 10
苹果 55 5
西瓜 15 2
葡萄 12 3
西红柿 8 4# 原购物车文件信息瓜子 6
苹果 2
西瓜 3
西红柿 2
Please input your name: evescn
Please input password: 123456
Bingo!
+----------------+------+------+
| 商品名称 | 价格 | 数量 |
+----------------+------+------+
| 《Python入门》 | 5 | 100 |
| 《Python放弃》 | 12 | 100 |
| 瓜子 | 89 | 10 |
| 苹果 | 55 | 5 |
| 西瓜 | 15 | 2 |
| 葡萄 | 12 | 3 |
| 西红柿 | 8 | 4 |
+----------------+------+------+
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:瓜子
*****************************
请输入购买数量:20
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:
# 商品文件信息《Python入门》 5 100
《Python放弃》 12 100
瓜子 69 10
苹果 55 5
西瓜 15 2
葡萄 12 3
西红柿 8 4# 购物车文件信息瓜子 26
苹果 2
西瓜 3
西红柿 2
3、充值测试和显示余额测试
# 充值前 money.txt 文件
evescn 30
gmkk 200
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:m
*****************************
请输入充值金额:200
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:y
*****************************
+--------+------+
| 用户 | 余额 |
+--------+------+
| evescn | 230 |
+--------+------+
*****************************
4、显示购物车
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:s
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 26 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
*****************************
5、显示已购商品
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:v
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 1 |
+----------+------+
*****************************
6、购买商品
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:b
*****************************
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 26 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:
请输入购买商品名称:瓜子
请输入购买数量:20
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 6 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:
请输入购买商品名称:瓜子
请输入购买数量:5
*****************************
余额不足请充值:
*****************************
请输入充值金额:200
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:b
*****************************
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 6 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:
请输入购买商品名称:瓜子
请输入购买数量:7
*****************************
购物车中没有这么多商品,请重新选择
*****************************
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 6 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:
请输入购买商品名称:瓜子
请输入购买数量:6
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 0 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:q
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:
# 运行后文件数据*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:y
*****************************
+--------+------+
| 用户 | 余额 |
+--------+------+
| evescn | 170 |
+--------+------+
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:s
*****************************
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 0 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:v
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 27 |
+----------+------+
*****************************
已知的bug问题:
没有对用户输入的商品进行判断,一旦用户输入的商品不存在,将会报错(添加商品到购物车和购买商品时需要输入商品名称)