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

花了两天,感觉还是值得的!!哈哈!

posted @ 2017-05-10 14:10  莫柔落切  阅读(2077)  评论(6编辑  收藏  举报