1 #!/usr/bin/env python3
2 Menu = {
3 '电器':{
4 '电视':{'索尼':'¥2999','康佳':'¥3999','飞利浦':'¥4999','购物车':'购物车','返回':'返回','退出':'退出'},
5 '洗衣机':{'美的':'¥999','海尔':'¥1099','奥克斯':'¥1599','购物车':'购物车','返回':'返回','退出':'退出'},
6 '中央空调':{'格力':'¥5699','日立':'¥18999','海信':'¥28999','购物车':'购物车','返回':'返回','退出':'退出'},
7 '购物车':'购物车',
8 '返回':'返回',
9 '退出':'退出'
10 },
11 '数码产品':{
12 '手机':{'苹果':'¥12999','小米':'¥3299','华为':'4299','购物车':'购物车','返回':'返回','退出':'退出'},
13 '电脑':{'联想':'¥6999','戴尔':'¥8999','惠普':'¥7999','购物车':'购物车','返回':'返回','退出':'退出'},
14 '摄影机':{'索尼相机':'¥19999','佳能':'¥1999','尼康':'¥6999','购物车':'购物车','返回':'返回','退出':'退出'},
15 '购物车': '购物车',
16 '返回':'返回',
17 '退出':'退出'
18 },
19 '服装':{
20 '鞋子':{'阿迪':'¥699','耐克':'¥599','李宁':'¥499','购物车':'购物车','返回':'返回','退出':'退出'},
21 '衣服':{'七匹狼':'¥689','花花公子':'¥109','美特斯邦威':'¥209','购物车':'购物车','返回':'返回','退出':'退出'},
22 '裤子':{'森马':'¥119','班尼路':'¥229','佐丹奴':'¥339','购物车':'购物车','返回':'返回','退出':'退出'},
23 '购物车': '购物车',
24 '返回':'返回',
25 '退出':'退出'
26 },
27 '购物车':'购物车',
28 '退出':'退出',
29 }
30 import time #时间模块
31 local_time = time.strftime('%Y{y}%m{m}%d{d} %H:%M:%S').format(y='年',m='月',d='日') #定义一个时间格式
32
33
34 def black_list(): #打开文件写入黑名单函数
35 with open("black_list", "a") as black:
36 black.write('\n'+user_input.strip()) #将变量user_input写到文件中,\n为换行
37
38 def lis(): #显示购物车空函数
39 print('您的购物车里什么都没有哦,快去选购吧!\n'
40 '请输入%s或%s' % (previous, sign_out))
41 for i in enumerate(lis_previous_sign_out, 1): #循环将列表中元素前加序号,从1开始
42 print(i[0], i[1]) #打印元祖i的第一个和第二个元素
43 dic_previous_sign_out[str(i[0])] = i[1] #循环将i的第一个元素加为字典中keys,第二个元素为values
44
45 def exit(): #结算退出函数
46 ye = float(balance.strip('¥')) - float(sum(js_list)) #浮点计算,float为浮点,这里strip用来去掉字符串的符号,
47 # sum()求和函数,这里用来计算列表js_list中所有元素的总和,js_list中为每个商品购买的总价
48 if ye >= 0: #余额大于等于0
49 while True:
50 shopping = input('继续购物y或者结算退出商城n,输入y or n:').strip()
51 if len(shopping) == 0:
52 print('输入不能为空,请重新输入!')
53 continue
54 if shopping == 'y':
55 return False #返回False
56 if shopping == 'n':
57 print('本次购物总计消费¥%s元,余额:¥%s元' % (float(sum(js_list)), ye))
58 print('欢迎下次购买,'
59 '用户%s退出商城!'
60 '%s' % (user_input, local_time))
61 return True
62 else:
63 print('输入有误,请重新输入!')
64 continue
65 else:
66 print('余额不足请充值')
67 return True
68
69 def js_Settlement(): #结算函数
70 while True:
71 settlement = input('继续购物y或者结算n,输入%s/%s:' % ('y', 'n')).strip()
72 if settlement == 'y':
73 continue_flag = True
74 break
75 elif len(settlement) == 0:
76 print('输入不能为空')
77 continue
78 elif settlement == 'n':
79 for i in enumerate(Shopping_Cart.items(), 1):
80 # print(i) i = (1:(索尼:{¥2999:[1,]}))
81 sp = i[1][0] #i[1]=(索尼:{¥2999:[1,]}) i[1][0]=索尼
82 dj = list(i[1][1])[0] #i[1][1]={¥2999:[1,]},list(i[1][1])=(¥2999:[1,]),
83 # list(i[1][1])[0]=¥2999
84 sl = i[1][1][list(i[1][1])[0]].count(1) #i[1][1]={¥2999:[1,]},list(i[1][1])[0]=¥2999,
85 # i[1][1][list(i[1][1])[0]]=字典{¥2999:[1,]}取keys¥2999得到values[1],count(1)列表计算方法,统计列表中元素1有多少个
86 zj = int(dj.strip('¥')) * sl #¥2999用strip去掉符号¥,乘以sl
87 js_list.append(zj) #将zj用append方法追加到列表js_list中
88 print('%s 商品:%s 单价:%s 数量:%s 总价:%s' % (i[0], sp, dj, sl, zj))
89 while True:
90 settlement = input('确认结算,确认y或者退出商城n,输入y or n:')
91 ye = float(balance.strip('¥')) - float(sum(js_list)) #浮点计算,sum(js_list)为列表js_list所有元素总和
92 print('本次购物总计消费¥%s元' % (float(sum(js_list))))
93 if settlement == 'y':
94 if exit(): #判断函数exit()返回True
95 return True
96 else:
97 return False
98 if settlement == 'n':
99 return False
100 # if break_flag == True:
101 # break
102 else:
103 print('输入有误,请输入y/n')
104 continue
105
106 def shopping_cart():
107 if Shopping_Cart:
108 js_Settlement()
109 else:
110 while True:
111 lis() # 调用函数lis()
112 user_choice = input('输入编号:').strip()
113 if user_choice == list(dic_previous_sign_out)[0]:
114 return True
115 elif user_choice == list(dic_previous_sign_out)[1]:
116 return False
117 elif len(user_choice) == 0:
118 print('输入不能为空!!!')
119 continue
120 else:
121 print('输入有误,请重新输入!!!')
122 continue
123
124 with open('user_passwd', 'r') as f: #打开用户密码文件
125 user = dict(line.strip().split(":") for line in f if line)#将文件内容转换为字典
126
127 passwd_error = [] #创建密码错误列表,密码错误一次将用户写入列表
128 user_does_not_exist = [] #创建不存在用户列表,不存在用户写入列表
129 Shopping_Cart = {} #购物车空字典
130 dic_menu = {} #商品展示第一级空字典
131 dic_class = {} #商品展示第二级空字典
132 dic_commodity = {}
133 lis_previous_sign_out = ['返回商城','退出商城'] #购物车中列表
134 dic_previous_sign_out = {} #购物车中空字典
135 balance = '¥100000.00'
136 break_flag = False #默认设置为False,用来退出多层循环
137 continue_flag = False #默认设置为False,用来退出当前循环
138 previous = '返回商城'
139 sign_out = '退出商城'
140 js_list = [] #每个商品的总价写入这个列表,商品*数量
141
142 for i in range(10): #循环10次
143 user_input = input("Name:").strip() #输入账号,strip去除两侧空格
144 user_passwd = input("Passwd:").strip() #输入密码,strip去除两侧空格
145 with open("black_list","r") as black: #打开黑名单文件
146 for line in black:
147 if user_input == line.strip(): #判断用户是否在黑名单中
148 Tips = '账户%s被锁定,请与管理员联系!'%user_input #定义字符串,将用户输入变量带入字符串,%s代替用户输入
149 print(Tips.center(30,'*')) #字符串center方法,字符串居中,30为总长度,空白处用*代替
150 break_flag = True #将break_flag的值重新定义
151 break #退出循环
152 if break_flag == True: #判断break_flag的值是否为True
153 break
154 if len(user_input) == 0 or len(user_passwd) == 0: #判断用户输入是否为空格
155 Tips = '用户名或密码不能为空!'
156 print(Tips.center(30,'*'))
157 continue #退出本次循环
158 if user_input in user and user[user_input] == user_passwd:#判断用户名和密码是否一致
159 Tips = '''
160 %s 欢迎用户%s登录商城'''%(local_time,user_input)
161 print(Tips.strip()) #格式化输出%s来代替变量
162 msg = '''
163 用户:%s 账户余额:%s
164 '''%(user_input,balance)
165 print(msg.strip())
166 while True:
167 for i in enumerate(Menu, 1): #将字典第一级的kyes打印出来并加上序号,从1开始
168 print(i[0],i[1]) #i为元祖,这里循环打印元祖的第一个元素和第二个元素
169 dic_menu[str(i[0])] = i[1] #循环将i的第一个元素写到字典dic_menu中为keys,
170 # 第二个元素写到字典中为vlaues。
171 user_choice_1 = input('请选择商品分类或退出:').strip()
172 if user_choice_1 == list(dic_menu)[-1]:
173 break
174 elif user_choice_1 == list(dic_menu)[-2]:
175 if shopping_cart():
176 continue
177 else:
178 break_flag = True
179 break
180 elif len(user_choice_1) == 0:
181 print('输入不能为空!!!')
182 continue
183 elif user_choice_1 in list(dic_menu)[0:3]: #判断用户输入是否在列表的0-3,0包含0,3为小于3
184 while True:
185 for i in enumerate((Menu[dic_menu[user_choice_1]]), 1):
186 print(i[0], i[1])
187 dic_class[str(i[0])] = i[1]
188 user_choice_2 = input('请选择商品:').strip()
189 if user_choice_2 == list(dic_class)[-1]:
190 break_flag = True
191 break
192 elif user_choice_2 == list(dic_class)[-2]:
193 continue_flag = True
194 break
195 elif user_choice_2 == list(dic_class)[-3]:
196 if shopping_cart(): #注意:判断函数返回值会执行函数,这里不需要单独在执行函数,否则会重复执行
197 continue
198 else:
199 break_flag = True
200 break
201 elif len(user_choice_2) == 0:
202 print('输入不能为空!!!')
203 continue
204 elif user_choice_2 in list(dic_class)[0:3]: #判断用户输入是否在列表的0-3,0包含0,3为小于3
205 commodity = Menu[dic_menu[user_choice_1]][dic_class[user_choice_2]]
206 while True:
207 for i in enumerate(commodity.items(),1):
208 if i[0] < 4: #enumerate方法为字典前添加序号,添加后为元祖:(1,(索尼:¥2999))
209 # 循环元祖,取元祖第一个元素比较,小于4输出
210 print(i[0], i[1][0], ':', i[1][1])#格式化输出,例:(1,(索尼:¥2999))为i,i[0]为1,i[1]为(索尼:¥2999),
211 # i[1][0]为索尼,i[1][1]为¥2999
212 elif i[0] >= 4:
213 print(i[0], i[1][0])
214 dic_commodity[str(i[0])] = i[1][0]
215 user_choice_3 = input('请选择购买商品编号:').strip()
216 if user_choice_3 == list(dic_commodity)[-1]: #判断用户输入是否和列表最后一个元素相等,-1代表最后一个
217 break_flag = True
218 break
219 elif user_choice_3 == list(dic_commodity)[-2]:
220 continue_flag = True
221 break
222 elif user_choice_3 == list(dic_commodity)[-3]:
223 if shopping_cart():
224 continue
225 else:
226 break_flag = True
227 break
228 elif len(user_choice_3) == 0:
229 print('输入不能为空!!!')
230 continue
231 elif user_choice_3 in list(dic_commodity)[0:3]:
232 print('%s:%s已经加入购物车' % (dic_commodity[user_choice_3], commodity[dic_commodity[user_choice_3]]))
233 k = dic_commodity[user_choice_3]
234 v = commodity[dic_commodity[user_choice_3]] #commodity = Menu[dic_menu[user_choice_1]][dic_class[user_choice_2]]
235 if Shopping_Cart: #判断字典Shopping_Cart是否为空,这里非空
236 if k in Shopping_Cart and v == list(Shopping_Cart[k])[0]:
237 Shopping_Cart[k][v].append(1) #Shopping_Cart[k][v]取出列表用append方法追加1进去
238 if k not in Shopping_Cart:
239 Shopping_Cart[k] = {v: [1, ]}
240 else:
241 Shopping_Cart[k] = {v:[1,]}
242 if js_Settlement(): #判断函数的返回值,为True
243 break_flag = True
244 break
245 else: #函数返回值False
246 continue
247 # if break_flag == True:
248 # break
249 # if continue_flag == True:
250 # continue
251 else:
252 print('输入有误,请重新输入!!!')
253 continue
254 if break_flag == True:
255 break
256 if continue_flag == True:
257 continue
258 else:
259 print('输入有误,请重新输入!!!')
260 continue
261 if break_flag == True:
262 break
263 if continue_flag == True:
264 continue
265
266 else:
267 print('输入有误,请重新输入!!!')
268 continue
269 if break_flag == True:
270 break
271 if continue_flag == True:
272 continue
273 elif user_input not in user: #判断用户是都存在
274 Tips = '用户%s不存在,请重试!'%user_input
275 print(Tips.center(30,'*'))
276 user_does_not_exist.append(user_input) #用户不存在就写入用户不存在列表中
277 if user_does_not_exist.count(user_input) == 5: #统计用户不在列表中不存在的用户次数,超过5次锁定
278 Tips = '尝试次数过多,账户%s锁定!'%user_input
279 print(Tips.center(30,'*'))
280 black_list() #调用函数black_list
281 break
282 else:
283 Tips = '密码错误!'
284 print(Tips.center(30,'*'))
285 passwd_error.append(user_input) #将密码错误用户写入密码错误列表中
286 if passwd_error.count(user_input) == 3: #统计密码错误用户是否超过3次
287 Tips = '密码错误3次,账户%s锁定,请联系管理员!'%user_input
288 print(Tips.center(30,'*'))
289 black_list() #调用函数black_list
290 break
291 else:
292 continue #退出当前循环
293 else:
294 Tips = '尝试次数过多!'
295 print(Tips.center(30,'*'))