python第八天)——购物车作业优化完成
发现之前的三级菜单代码有BUG现已经修改过来了
购物车程序:
启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
允许用户根据商品编号购买商品
用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
可随时退出,退出时,打印已购买商品和余额
在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
允许查询之前的消费记录
对于昨天的作业自己不太满意!所以重新设计了流程图:
增加新的功能:
1,可以注册!
2,可以查看当前购物的清单
3,可以不结算退出
详细代码如下:
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import time,sys,os 5 user_file=open("user_file.txt",'r+',encoding='utf-8')#打开用户列表文件 6 #with open('user_file.txt','r+',encoding='utf-8') as user_file: 7 user_list=eval(user_file.readline())#转换用户文件中的字符串 user_list:注册用户列表 8 lock_name=open('lock_name.txt','r+',encoding='utf-8')#打开锁定用户列表文件 9 lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串 10 11 12 def regis(): 13 while True: 14 name=input("请输入您要注册的用户名:") 15 if name not in user_list: 16 print("恭喜!该用户名可以被注册!>>>") 17 password=input('请输入密码:') 18 password2=input('请再次确认密码:') 19 if password==password2: 20 name_infor='''恭喜您用户注册成功! 21 用户名:{name} 22 密 码:{password} 23 请牢记您的用户名与密码 24 ''' 25 print(name_infor.format(name=name,password=password2)) 26 user_list[name]=password2#增加注册用户到字典中 27 user_file.seek(0)#称到最前 28 user_file.write(str(user_list))#写入文件 29 user_file.flush()#即可保存 30 31 #confirm() 32 break 33 else: 34 print("该用户名已经被注册啦!请重新来过<<<") 35 confirm()#是否退出 36 continue 37 38 39 40 def userchar(_user_name):#检测用户名的函数 41 while True: 42 if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常 43 return True#存在返回真 44 elif _user_name in user_list and _user_name in lock_list:#判断用户是否被锁定 45 print('您的用户已经被锁定,请联系商家解锁!') 46 break 47 else: 48 reg=input('您输入用户不存在,请先注册!按\033[31;1m Q/q\033[0m 直接退出 \033[31;1m Y/y\033[0m 确定注册,其它键返回!') 49 if reg=='y' or reg=='Y': 50 regis()#用户注册函数 51 print('是否直接退出商城?') 52 break 53 elif reg=='q' or reg=='Q': 54 print("您已经退出!" ) 55 exit() 56 else : 57 break 58 59 def confirm():#退出确认函数 60 qu=input("是否退出!按\033[31;1mY/y\033[0m退出? 按其它键返回<<<") 61 if qu=='Y'or qu=='y': 62 print("您已经退出!" ) 63 exit()#退出程序 64 else : 65 pass 66 67 def user_pass(): 68 bool=True#定义退出循环条件变量 69 while bool: 70 print("用户登陆".center(30,'-')) 71 _user_name=(input('请输入用户名:')) 72 if userchar(_user_name.strip()):#运行检测用户名的函数判断,去除两边空格 73 count=3#定义锁次数 74 while count>0 :#如果密码错误次数超过退出密码输入 75 #password=getpass.getpass('请输入密码:') 76 password=input('请输入密码:') 77 if password==user_list[_user_name]:#密码通过验证结束循环 78 print("密码通过验证") 79 bool=False 80 print("欢迎您 \033[32;1m%s\033[0m 您已经登陆成功!" % _user_name) 81 return _user_name#返回用户名 82 else: 83 count -=1#次数减少 84 print("密码错误请重试,剩余:\033[31;1m%s\033[0m次! "% count) 85 pass 86 else: 87 print("\033[31;1m超出所试次数,账户已锁定!请联系商家!\033[0m") 88 lock_list.append(_user_name)#将用户名加出锁定列表 89 lock_name.seek(0)#指针移动到开头,以免产生多个元组 90 lock_name.write(str(lock_list))#写入锁定用户文件 91 lock_name.tell()#获取当前指针,以免产生多个元组 92 lock_name.close()#关闭锁定用户文件 93 confirm()#退出确认函数 94 #continue#退回到输入用户名的位置 95 else:#如果用户名出错新来过 96 confirm() 97 pass 98 99 def infor():#打开用户信息函数 100 with open('user_infor','r+',encoding='utf-8') as user_infor:#打开用户购物信息文件 101 infor_list=eval(user_infor.readline())#转换文件的字符串 102 return infor_list 103 104 def history_user():#用户购物历史记录函数 105 with open('history','r',encoding="utf-8") as user_history:#读取用户文件 106 history_list=eval(user_history.readline())#用户购物信息 107 return history_list 108 109 def history():#用户消费记录函数 110 history_list=history_user()#用户购物历史记录 111 history=history_list[_user_name]#用户购物记录信息 112 print('您的购物记录如下:') 113 for k,v in history.items():#转为列表进行输出 114 print(k,v)#输出购物记录 115 choose_index=input("请选择您想要的操作:按\033[32;1mq/Q\033[0m直接退出商城!其它键返回!") 116 if choose_index=='Q' or choose_index=='q' : 117 choo=input('''>>>>>\033[42;1m您确定出退商城吗?\033[0m 118 如果您已经添加商品,此操作将不进行结算, 119 您就无法将心爱的东东买回家了,按\033[31;1my/Y\033[0m确定直接退出!''') 120 if choo=='y'or choo=='Y': 121 print("您已经出退商城!") 122 exit() 123 else: 124 pass 125 #程序开始: 126 if os.path.exists('history'):#确认文件是否存在 127 pass 128 else: 129 with open('history','w',encoding='utf-8') as user_history:#创建一个用户帐户购物记录文件 130 user_history.write('{}')#写入空值 131 pass 132 133 if os.path.exists('user_infor'):#确认文件是否存在 134 pass 135 else: 136 with open('user_infor','w',encoding='utf-8') as user_infor:#创建一个用户帐户信息记录文件 137 user_infor.write('{}')#写入空值 138 pass 139 140 print("欢迎来到\033[31;1mpython\033[0m购物商城!") 141 142 time_format='%y-%m-%d %X'#定义时间格式 143 times=time.strftime(time_format)#定义时间 144 _user_name= user_pass()#将通过验证的用户名赋于变量 145 146 if _user_name in infor():#如果用户信息存在记录就跳过 147 pass 148 else: 149 while True: 150 name_char=input("首次登陆,请输入工资(购物资金):")#用户输入工资(购物资金) 151 if name_char.isdigit():#检测输入是否为整数 152 name_char=int(name_char)#转为int 153 with open('history','r+',encoding='utf-8') as user_history:#打开用户帐户购物记录文件 154 history_list=eval(user_history.readline())#将文本读为字典 155 history_list[_user_name]={}#创建用户购物记录 156 user_history.seek(0)#移到开头 157 user_history.write(str(history_list))#写入文件 158 with open('user_infor','r+',encoding='utf-8') as user_infor: 159 infor_list=eval(user_infor.readline())#转换首登用户文件中的字符串 160 infor_list[_user_name]={"金额":name_char} 161 user_infor.seek(0) 162 user_infor.write(str(infor_list))#写入用户信息 163 print("充值成功,充值金额:\033[32;1m%s\033[0m元."% name_char) 164 break 165 else: 166 print('金额不能为0或负数请正确输入金额!') 167 continue 168 169 #再次登陆直接显示用户信息 170 infor_list=infor()#使用用户信息函数 获取用户信息字典 171 name_char=int(infor_list[_user_name]['金额'])#获取余额 172 print("\n您的帐户信息:") 173 print('用户名:\033[32;1m%s\033[0m:'%_user_name)#输出用户信息 174 print('您的余额:\033[31;1m%s\033[0m元.:'%name_char) 175 while True: 176 print('''您可以进行以下相关操作:\n 177 按 1 >>>查询购物记录。 178 按 2 >>>显示商品列表开始购物! 179 按 3 >>>直接出退商城! 180 ''') 181 choose=input("请选择您所要的功能:")#请用户可以查询 182 if choose=='1': 183 history()#查询消费记录 184 elif choose=='2': 185 ###进入商品列表### 186 shoplist=[]#购物车列表 187 shop_count=0#购物金额统计 188 goodsname=[]#定义商品列表 189 print('加载商品列表:') 190 for i in range(40):#加载动画 191 sys.stdout.write('#') 192 sys.stdout.flush() 193 time.sleep(0.05) 194 print('\n') 195 with open('goodslist.txt','r',encoding='utf-8') as f:#打开商品列表文件 196 for line in f: 197 a=line.find(',')#定位分割符的索引进行分割 198 goodsname.append((line[0:a],int(line[a+1:])))#元组模式追加到列表,价格转为整数 199 while True: 200 print("商品列表".center(50,'=')) 201 for index,p_item in enumerate(goodsname):#取出下标输出 商品列表 202 print(index,p_item)#输出商品列表 203 print("列表底部".center(50,'=')) 204 user_index=input('请输入商品编号添加你所在购买的商品,按\033[31;1mc/C\033[0m>> 查看当前购物清单, \033[31;1mh/H\033[0m查看消费记录 \033[31;1mq/Q\033[0m结算商品退出>>>:') 205 if user_index.isdigit():#判断是否为整数 206 user_index=int(user_index)#转为数字 207 if user_index < len(goodsname) and user_index>=0:#判断所选商品编号在在列表 208 p_item=goodsname[user_index]#读取下标所在(元素)商品 209 if p_item[1]<=name_char:#余额是否足够 210 shoplist.append(p_item)#添加到购物车 211 name_char-=p_item[1]#扣除金额 212 shop_count+=p_item[1]#累加购物金额 213 print("添加 \033[32;1m%s\033[0m 到购物车,价格: \033[32;1m%s\033[0m 元"% p_item) 214 print("你的购物金额余: \033[31;1m%s\033[0m 元"% name_char) 215 else: 216 print("你的购物金额余: \033[41;1m%s\033[0m 元,无法购买该商品!" % name_char) 217 else: 218 print('输入错误,该编号 \033[41;1m%s\033[0m 的商品不存在!'%user_index) 219 elif user_index=='q'or user_index=='Q': 220 print('你的购物清单:') 221 for up in shoplist:#打印购物清单 222 print(up) 223 print("你的购物总金额为:\033[32;1m%s\033[0m 元!"% shop_count) 224 print("你的购物金额余: \033[31;1m%s\033[0m 元!" % name_char) 225 while True: 226 confirm=input("你是否确定结算商品并退出商城?\033[31;1m Y/y\033[0m是, \033[31;1mN/n\033[0m否:") 227 if confirm== 'Y'or confirm== 'y' : 228 infor_list[_user_name]['金额']=name_char#修改用户金额(购物后) 229 shoplist.append(('总额:',shop_count))#列表加入总额 230 history_list=history_user()#用户消费记录函数 231 history_list[_user_name][times+'购物清单:']=shoplist#添加时间:清单 232 with open('user_infor','w',encoding="utf-8") as user_infor:#写入文件用户信息 233 user_infor.seek(0)#移到最前 234 user_infor.write(str(infor_list))#写入 235 with open('history','r+',encoding='utf-8') as user_history:#购物信息写入文件 236 user_history.seek(0)#移到最前 237 user_history.write(str(history_list))#写入 238 exit(print("谢谢!\033[31;1mpython\033[0m 商城欢迎您再次光临!")) 239 elif confirm=='N'or confirm== 'n' : 240 break 241 else: 242 print("输入错误!请按提示输入!") 243 continue 244 elif user_index=='h'or user_index=='H': 245 history()#查消费记录 246 elif user_index=='c'or user_index=='C': 247 print("当前购物清单:") 248 for up in shoplist:#打印购物清单 249 print(up) 250 print("总金额:\033[32;1m%s\033[0m"%shop_count) 251 continue 252 else: 253 print('\033[41;1m输入商品编号错误,请重新输入!\033[0m') 254 255 elif choose=='3': 256 print("您已经出退商城!") 257 exit()#退出商城 258 else: 259 print("\033[31;1m输入有误,请重新输入!\033[0m") 260 continue
花了两天,感觉还是值得的!!哈哈!
![](https://files.cnblogs.com/files/uge3/%E5%BE%AE%E4%BF%A1.bmp)
您的资助是我最大的动力!
金额随意,欢迎来赏!
![](https://files.cnblogs.com/files/uge3/%E6%94%AF%E4%BB%98%E5%AE%9D.bmp)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【莫柔落切】!
联系或打赏博主【莫柔落切】!https://home.cnblogs.com/u/uge3/