python3.5实现购物车
一、购物车实现:
购物车功能:
- 用户登录:密码错误三次锁定账户。
- 商品列表分页显示:输入页码查看指定页数商品信息。
- 已购买商品列表:显示已购买的物品列表;可以模糊查询已购买的商品并在终端打印。
- 充值:输入充值金额,对db.txt里的对应账户余额进行更改。
-源码:
db.txt
dylan|123|19840|3 elaine|123|10000000000064255|3 admin|123|99999999761000|3
shopping_cart.py
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #---------------------------------------------- 4 #@version: 3.6 5 #@author: Dylan_wu 6 #@software: PyCharm 7 #@file: shopping_cart.py 8 #@time: 2017/4/24 13:57 9 #---------------------------------------------- 10 import prettytable 11 import sys 12 13 def buy_goods(user_name,money,goods,total_goods,total_page_num): 14 goods_num = 0 # 初始化购买商品总数量 15 all_goods_price = 0 # 初始化商品总价 16 buy_list = [] # 初始化购物列表 17 print('\033[1;32mUser Name:[%s] Account Balance:[¥%s]\033[0m'%(user_name,money)) 18 while True: 19 try: 20 print('\033[1;32mTotal_GOODS_Num:[%s] Total_Page_Num:[%s]\033[0m'%(total_goods,total_page_num)) 21 page_num = input('\033[1;36mPlease choose the page number(Press[C]to Check_Out_List,[Q]to quit):\033[0m') 22 int_page_num = int(page_num) 23 start = (int_page_num - 1) * 5 24 end = int_page_num * 5 25 print('\033[1;35m+----+----+GOODS_LIST+-------+-------+\033[0m') 26 #########开始构建商品表(分页)######### 27 table = prettytable.PrettyTable() 28 table.field_names = ['ID','Name', 'Unit_Price','Stock'] 29 for i in goods[start:end]: 30 table.add_row([i['id'],i['name'],i['price'],i['stock']]) 31 print(table) 32 print('\033[1;35m+----+------Page-[%s]---------+-------+\033[0m' % page_num) 33 except: 34 if page_num == 'C': #跳出循环,进入checkout 35 break 36 elif page_num == 'Q': #结束程序 37 exit() 38 else: 39 print('\033[1;31mPlease enter a Page_num!\033[0m') 40 continue 41 #########开始购买程序########### 42 while True: 43 choose_ID = input("\033[1;36mWhich good do you want to buy?Please choose the ID(Press[B]to back,[Q]to quit):\033[0m") 44 try: 45 int_ID = int(choose_ID) # 输入商品序号转化为int类型,若不报错,向下执行 46 if int_ID in [i['id'] for i in goods]: # 判断商品序号是否存在 47 product_quantity = int(input("\033[1;36mWhat`s the quantity of products you want to buy:\033[0m")) 48 if product_quantity <= goods[int_ID-1]['stock'] and product_quantity != 0: #若购买数量<=库存 49 goods[int_ID - 1]['stock'] -= product_quantity #更改库存 50 goods_num += product_quantity #更新购买总数 51 all_goods_price += (goods[int_ID - 1]['price']*product_quantity) # 叠加商品价格 52 #########构造购物列表######### 53 buy_list.append({'ID': int_ID, 'name': goods[int_ID - 1]['name'], 'price': goods[int_ID - 1]['price'],'quantity':product_quantity}) 54 elif product_quantity == 0: 55 print("\033[1;31mThe quantity of products can`t be[0]!!!!\033[0m") 56 continue 57 else: 58 print('\033[1;31mUnder stock!!!!\033[0m') 59 continue 60 else: 61 print('\033[1;31mYou choose wrong number or out of range!\033[0m') 62 continue 63 except : # 输入值不能转化为int,报错走这里 64 if choose_ID == 'B': #重新开始循环,回到分页界面 65 break 66 elif choose_ID == 'Q': #结束程序 67 exit() 68 else: 69 print('\033[1;31mPlease input a legal value!\033[0m') # 打印报错 70 print('\033[1;36mGoods_Num:[%s] Total_Price:[¥%s]\033[0m' % (goods_num, all_goods_price)) 71 return goods_num, all_goods_price, buy_list 72 73 74 def check_out_list(b_list): 75 #########开始构建购物表######### 76 while True: 77 cart_table = prettytable.PrettyTable() 78 cart_table.field_names = ['Product_ID', 'Product_Name', 'Unit_Price','Product_Quantity'] 79 search_name = input('\033[1;36mEnter the product name you want to search in Check_out_list(Press[C]to Check_Out_List,[Q]to quit):\033[0m') 80 if search_name == 'C': 81 break 82 elif search_name == 'Q': 83 exit() 84 else: #输入字符串,得到相应的搜索结果,找不结果返回空表格,不输入返回所有 85 for i in b_list: 86 if i['name'].find(search_name) != -1: 87 cart_table.add_row([i['ID'], i['name'], i['price'],i['quantity']]) 88 print(cart_table) 89 90 91 def check_out(user_name,account_balance,num,all_price): 92 print('\033[1;36mTotal_Num:[%s] Total_Price:[¥%s] Account_Balance:[¥%s]\033[0m' % (num, all_price,account_balance)) 93 while True: 94 choose_ID = input('\033[1;36mDo you want to check out?Press[R]to recharge,[C]to check out,press[B]to back and clear the check_out_list[Q]to quit:\033[0m') 95 if choose_ID == 'C': #选择C进行check_out 96 if all_price <= int(account_balance): #若总价少于余额 97 print('\033[1;32mThe consumption is ¥%s totally,thank You for Your Custom!\033[0m'%(all_price)) 98 balance = int(account_balance) - all_price 99 mod_user(user_name,2,str(balance)) #对db里的用户余额进行更改 100 break 101 else: 102 print('\033[1;31mSorry,your balance has been insufficient,please recharge.\033[0m') 103 elif choose_ID == 'B': #选择B返回购物菜单(清空购物列表,刷新商品字典) 104 GOODS = [ 105 {"id": 1, "name": "特斯拉", "price": 998, "stock": 10}, 106 {"id": 2, "name": "玛莎拉蒂", "price": 898, "stock": 10}, 107 {"id": 3, "name": "宾利", "price": 1998, "stock": 10}, 108 {"id": 4, "name": "保时捷", "price": 1000, "stock": 10}, 109 {"id": 5, "name": "丰田", "price": 298, "stock": 10}, 110 {"id": 6, "name": "本田", "price": 398, "stock": 10}, 111 {"id": 7, "name": "斯巴鲁", "price": 298, "stock": 10}, 112 {"id": 8, "name": "奥拓", "price": 100, "stock": 10}, 113 {"id": 9, "name": "尼桑", "price": 198, "stock": 10}, 114 {"id": 10, "name": "奥迪", "price": 598, "stock": 10}, 115 {"id": 11, "name": "奔驰", "price": 998, "stock": 10}, 116 {"id": 12, "name": "宝马", "price": 1000, "stock": 10}, 117 {"id": 13, "name": "兰博基尼", "price": 1998, "stock": 10}, 118 {"id": 14, "name": "GMC", "price": 9898, "stock": 10}, 119 {"id": 15, "name": "哈佛", "price": 398, "stock": 10}, 120 {"id": 16, "name": "路虎", "price": 900, "stock": 10}, 121 {"id": 17, "name": "悍马", "price": 998, "stock": 10}, 122 {"id": 18, "name": "别克", "price": 198, "stock": 10}, 123 {"id": 19, "name": "雪铁龙", "price": 198, "stock": 10}, 124 {"id": 20, "name": "福特", "price": 300, "stock": 10}, 125 {"id": 21, "name": "雪佛兰", "price": 398, "stock": 10}, 126 ] 127 num, all_price, b_list = buy_goods(user_name,account_balance,GOODS,total_goods,total_page_num) 128 check_out_list(b_list) 129 check_out(user_name,account_balance,num,all_price) 130 exit() 131 elif choose_ID == 'R': #选择R进行充值 132 account_balance = user_recharge(user_name,account_balance) #执行充值函数 133 elif choose_ID == 'Q': #选择Q退出程序 134 exit() 135 else: 136 print('\033[1;31mPlease press[R],[C]or[B],[Q]!\033[0m') 137 138 def user_recharge(user_name,balance): 139 while True: 140 print('\033[1;36mDear %s!Your Account_Balance is:[¥%s]\033[0m' % (user_name, balance)) 141 recharge_num = input('\033[1;36mPlease enter the amount you want to charge,press[B]to back,press[Q]to quit:\033[0m') 142 try: 143 int_amount = int(recharge_num) #int所输入余额,不报错走这里 144 now_balance = str(int_amount + int(balance)) #计算并str充值后余额 145 mod_user(user_name,2,now_balance) #调用mod_user函数修改db里的账户余额 146 print('\033[1;32mRecharge success!\033[0m') 147 return now_balance #返回充值后余额 148 149 except ValueError as e: #报错走这里(输入值不能int) 150 if recharge_num == 'B': 151 return balance 152 elif recharge_num == 'Q': 153 exit() 154 else: 155 print('\033[1;31mPlease enter a valid value!\033[0m') 156 157 #============================主程序=============================# 158 GOODS = [ 159 {"id":1,"name": "特斯拉", "price": 998,"stock":10}, 160 {"id":2,"name": "玛莎拉蒂", "price": 898,"stock":10}, 161 {"id":3,"name": "宾利", "price": 1998,"stock":10}, 162 {"id":4,"name": "保时捷", "price": 1000,"stock":10}, 163 {"id":5, "name": "丰田", "price": 298,"stock":10}, 164 {"id":6, "name": "本田", "price": 398,"stock":10}, 165 {"id":7, "name": "斯巴鲁", "price": 298,"stock":10}, 166 {"id":8, "name": "奥拓", "price": 100,"stock":10}, 167 {"id":9, "name": "尼桑", "price": 198,"stock":10}, 168 {"id":10, "name": "奥迪", "price": 598,"stock":10}, 169 {"id":11, "name": "奔驰", "price": 998,"stock":10}, 170 {"id":12, "name": "宝马", "price": 1000,"stock":10}, 171 {"id":13, "name": "兰博基尼", "price": 1998,"stock":10}, 172 {"id":14, "name": "GMC", "price": 9898,"stock":10}, 173 {"id":15, "name": "哈佛", "price": 398,"stock":10}, 174 {"id":16, "name": "路虎", "price": 900,"stock":10}, 175 {"id":17, "name": "悍马", "price": 998,"stock":10}, 176 {"id":18, "name": "别克", "price": 198,"stock":10}, 177 {"id":19, "name": "雪铁龙", "price": 198,"stock":10}, 178 {"id":20, "name": "福特", "price": 300,"stock":10}, 179 {"id":21, "name": "雪佛兰", "price": 398,"stock":10}, 180 ] 181 182 f = open('db.txt','r') 183 user_line = f.readlines() 184 f.close() 185 total_goods = len(GOODS) #获取商品总数 186 if len(GOODS)%5 == 0: #获取商品总页数 187 total_page_num = len(GOODS)//5 188 else: 189 total_page_num = len(GOODS)//5 + 1 190 #========================修改数据库函数===========================# 191 #=============='''以用户名为标识,修改相应位置的值'''==============# 192 def mod_user(username,key_num,key_values): 193 for i in range(len(user_line)): 194 new_list = user_line[i].strip('\n').split('|') 195 if username == new_list[0]: 196 new_list[key_num] = key_values 197 user_line[i] = '|'.join(new_list)+'\n' #构成新user_line 198 f1 = open('db.txt', 'w') 199 f1.writelines(user_line) #新user_line保存到db 200 f1.close() 201 202 while True: 203 username = input('\033[1mPlease input your username:\033[0m') 204 password = input('\033[1mPlease input your password:\033[0m') 205 for user_info in user_line: 206 user_name,pass_word,balance,locked = user_info.strip('\n').split('|') 207 208 if username == user_name and password == pass_word and int(locked) != 0: #登录成功条件判断 209 print('\033[1;32mLogin Successful!!\033[0m') 210 num, all_price, b_list = buy_goods(user_name,balance, GOODS,total_goods,total_page_num) 211 check_out_list(b_list) 212 check_out(username,balance,num,all_price) 213 exit() 214 215 elif username == user_name and int(locked) == 0: #登录被锁定用户条件判断 216 print('\033[1;31mThe username:[%s]has been locked!Please contact the system administrator!\033[0m'%(user_name)) 217 sys.exit('\033[1;32mGood Bye!\033[0m') 218 219 elif username == user_name and int(locked) != 0: #登录用户密码错误,锁定数-1条件判断 220 locked_count = int(locked) #获取user_info中的locked 221 print('\033[1;31mYou password is incorrect!You have %s attempts left before you will be locked out of your account.\033[0m'%(locked_count-1)) 222 locked_count-=1 223 mod_user(username,3,str(locked_count)) #修改用户的locked 224 225 if locked_count == 0: #锁定数=0时,退出程序 226 print('\033[1;31mYou account has been locked!!!Please contact the system administrator!\033[0m') 227 sys.exit('\033[1;32mGood Bye!\033[0m') 228 else: 229 break 230 print('\033[1;31mYou username or password is wrong!!!\033[0m')
二、部分功能展示:
用户登录:
登录失败三次,账户锁定:
再次无法登陆:
购买商品:
购买数量不能为0报错:
商品分页:
已购买商品列表查询功能:
-输入值进行模糊查询:
-不输入值显示所有已购买商品:
-输入不存在的值显示空列表:
充值功能:
结账: