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,\'*\'))