【python练习】购物车程序
购物车程序
基本功能:
1、使用用户名密码登陆
2、允许用户根据商品编号购买商品
3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4、可随时退出,退出时,打印已购买商品和余额
5、可以记录用户的消费记录,余额,在下次登陆的时候恢复
6、允许查询之前的消费记录
运行方法:
文件执行、交互式执行。
使用说明:
测试账号(用户名:liubei,密码:lb123)
用户数据:
{"lock state": true, "account": "liubei", "password": "lb123", "balance": 993, "record": {"20180101": {"00:00:00": {"name": "\u7535\u8111", "price": 1999}, "23:01:02": {"name": "\u9f20\u6807", "price": 10}}, "20180202": {"00:02:00": {"name": "\u7f8e\u5973", "price": 998}}, "20180724": {"22:11:13": {"name": "\u7535\u8111", "price": 1999}, "22:11:14": {"name": "\u9f20\u6807", "price": 10}, "22:38:21": {"name": "\u7535\u8111", "price": 1999}, "22:40:32": {"name": "\u7535\u8111", "price": 1999}, "22:41:31": {"name": "\u7535\u8111", "price": 1999}, "22:41:35": {"name": "\u9f20\u6807", "price": 10}, "22:42:41": {"name": "\u7535\u8111", "price": 1999}, "22:42:43": {"name": "\u9f20\u6807", "price": 10}, "22:46:16": {"name": "\u9f20\u6807", "price": 10}, "22:56:56": {"name": "\u9f20\u6807", "price": 10}, "23:13:32": {"name": "\u7535\u8111", "price": 1999}}}}
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 ''' 5 测试账号(用户名:liubei,密码:lb123) 6 ''' 7 8 import os,time 9 import json 10 11 goods = [ 12 {'name': '电脑', 'price': 1999}, 13 {'name': '鼠标', 'price': 10}, 14 {'name': '游艇', 'price': 20}, 15 {'name': '美女', 'price': 998} 16 ] 17 18 class Shopping(object): 19 def __init__(self): 20 self.acc_data = {} #用户信息 21 22 def authentication(self): 23 ''' 24 用户认证程序 25 :return:登陆成功返回True 26 ''' 27 acc = '' 28 auth_list = [] # 用于存放每次输入的用户名 29 30 print('- - - Login - - -') 31 while auth_list.count(acc) < 3: # 当相同的用户名登陆失败3次,跳出循环 32 acc = input('Account:').strip() 33 pwd = input('Password:').strip() 34 35 path = 'data\\%s' % acc # 用户信息存放路径 36 if os.path.isfile(path): # 用户名是否存在 37 with open(path) as f: 38 self.acc_data = json.loads(f.read()) #读取信息 39 if self.acc_data['lock state']: #用户是否被锁定 40 if self.acc_data['password'] == pwd: 41 print('Login success !') 42 return True 43 else: 44 auth_list.append(acc) 45 print('The password is error,you have %s times' % (3 - auth_list.count(acc))) 46 else: 47 print('You have tried 3 times,your account has locked.') 48 exit() 49 else: 50 auth_list.append(acc) 51 print('The account is not exist...you have %s times' % (3 - auth_list.count(acc))) 52 53 if auth_list.count(acc) == 3: # 已存在的用户登陆失败三次,锁定,写入文件 54 if os.path.isfile(path): 55 with open(path, 'w')as f: 56 self.acc_data['lock state'] = False 57 f.write(json.dumps(self.acc_data)) 58 59 def shopping(self): 60 ''' 61 购物窗口 62 :return: 63 ''' 64 buy_dic = [] 65 while True: 66 print('List of goods'.center(30,'-')) 67 for index,item in enumerate(goods,1): 68 print('%s . \033[0;33m%s\033[0m \033[0;32m%s\033[0m'%(index,item['name'],item['price'])) 69 buy = input('("q" to exit)\nchoose one to buy:').strip() 70 if buy.isnumeric() and 0 < int(buy) <= len(goods): #输入是数字且在商品序号范围内 71 if self.acc_data['balance'] >= int(goods[int(buy) - 1]['price']): 72 self.acc_data['balance'] -= int(goods[int(buy) - 1]['price']) #扣除余额 73 buy_dic.append(goods[int(buy) - 1]) #购物记录 74 #更新购物清单 75 localday = time.strftime('%Y%m%d', time.localtime()) 76 localtime = time.strftime('%H:%M:%S', time.localtime()) 77 if localday in self.acc_data['record']: 78 self.acc_data['record'][localday][localtime] = goods[int(buy) - 1] 79 else: 80 self.acc_data['record'][localday] = {localtime:goods[int(buy) - 1]} 81 #写入文件 82 if self.db_handle(): 83 print('You have buy:\033[0;32m%s\033[0m'%goods[int(buy) - 1]['name']) 84 else: 85 print('\033[0;31mSystem error...you have not buy %s\033[0m'%goods[int(buy) - 1]['name']) 86 else: 87 print('\033[0;33mYour balance can not afford anyone..\033[0m') 88 elif buy == 'q': 89 if len(buy_dic) != 0: 90 print('\033[1;31;46mShopping receipts\033[0m') 91 for index,item in enumerate(buy_dic,1): 92 print('%s . \033[0;33m%s\033[0m \033[0;32m%s\033[0m' % (index, item['name'], item['price'])) 93 break 94 else: 95 print('\033[0;31minput error...\033[0m') 96 97 def recharge(self): 98 ''' 99 充值 100 :return: 101 ''' 102 recharge = input('You want to recharge:').strip() 103 if recharge.isnumeric() and int(recharge) < 0: 104 print('\033[0;31mPlease input a number greater than zero\033[0m') 105 elif recharge.isnumeric(): 106 self.acc_data['balance'] += int(recharge) 107 if self.db_handle(): 108 print('\033[0;31mRecharge success !\033[0m') 109 else: 110 print('\033[0;31mRecharge error...\033[0m') 111 else: 112 print('\033[0;31minput error...\033[0m') 113 114 def record(self): 115 ''' 116 查询历史清单 117 :return: 118 ''' 119 for date in self.acc_data['record']: 120 print('\033[0;34m%s\033[0m'%date.center(20, '-')) 121 for time in self.acc_data['record'][date]: 122 print(time, ':', self.acc_data['record'][date][time]['name'], 123 self.acc_data['record'][date][time]['price']) 124 125 def exit(self): 126 ''' 127 退出函数 128 :return: 129 ''' 130 print('exit...') 131 exit() 132 133 def db_handle(self): 134 ''' 135 文件写入 136 :return: 137 ''' 138 with open('data\\'+self.acc_data['account'],'w') as f: 139 f.write(json.dumps(self.acc_data)) 140 return True 141 142 def interaction(self): 143 ''' 144 交互 145 :return: 146 ''' 147 print(' Mall '.center(30, '*')) 148 if self.authentication(): #登陆认证成功 149 exit_flag = False 150 while not exit_flag: 151 print('''\nVip name:{account}\nBalance:\033[1;31;46m{balance}\033[0m\n\n1. 购物\n2. 充值\n3. 清单\n4. 退出 152 '''.format(account=self.acc_data['account'], balance=self.acc_data['balance'])) 153 154 menu_dic = { #对应类方法的字典 155 '1': self.shopping, 156 '2': self.recharge, 157 '3': self.record, 158 '4': self.exit 159 } 160 user_option = input('>>>').strip() 161 if user_option in menu_dic: 162 menu_dic[user_option]() 163 else: 164 print('Without this option(%s)' % user_option) 165 166 s = Shopping() #实例化 167 s.interaction()