面版式购物车

购物车程序:

应该实现的功能:
  1. 注册
  2. 登陆
  3. 购物
  4. 支付
  5. 充值
大概实现思路:
要求用函数封装功能
while True:
print("""
0. 退出
1. 注册
2. 登陆
3. 购物
4. 支付
5. 充值
""")
choice=input('>>>: ').strip()
if choice == '0':break
if choice == '1':
register()
elif choice == '2':
login()
....

  1 # 存储文件中用户信息
  2 # "abc|123|0,qwe|123|1000"
  3 # 将文件信息读取到内存中,以变量存储,后期需要大量与这些信息交互
  4 # 如何设计存储用户信息的集合变量
  5 # 以用户名为key的dict,value为{}
  6 users_dic = {} # 从文件中读取来
  7 '''
  8 {
  9     'abc': {'ps': '123', 'money': 0},
 10     'qwe': {'ps': '000', 'money': 1000}
 11 }
 12 '''
 13 # 存储当前登录成功的用户的信息
 14 user = {}
 15 # {'usr': 'abc', 'ps': '123', 'money': 0}
 16 
 17 # 获取所有已注册的用户,存放到user_dic
 18 # 获取文件中用户信息
 19 def get_users():
 20     # 如果用户集合已经有值,代表用户信息已经读取过了,不需要重复读取|当值为none,0,空时,为False
 21     if users_dic:#不为空,说明已经读取文件
 22         return users_dic
 23     # 为空,读文件,存用户们
 24     with open('usr.info', 'rt', encoding='utf-8') as f:
 25         # "abc|123|0,qwe|123|1000" or "abc|123|0" or none
 26         data = f.read()
 27         if not data:
 28             # 文件中并没有用户信息,那么用户集合也不需要存储,可以直接返回
 29             return users_dic
 30         # 'abc|123|0, qwe|123|1000' or 'abc|123|0',一个用户也可以用,进行分割
 31         data_list = data.split(',')
 32         for d in data_list:
 33             # ['abc', '123', '0']
 34             user_info = d.split('|')
 35             usr = user_info[0]
 36             ps = user_info[1]
 37             # 文件中读取的money为字符串,将money以数字存储在内存,分别购物等的运算
 38             money = int(user_info[2])
 39             # 按照 'abc': {'ps': '123', 'money': 0} 存储到 users_dic
 40             users_dic[usr] = {'ps': ps, 'money': money}
 41         return users_dic
 42 
 43 # 注册
 44 def regist():
 45     print("注册界面...")
 46     # 获取所有用户信息
 47     users = get_users()#获得返回的用户信息字典
 48     # 账号输入操作
 49     temp_info = ""
 50     #输入用户名阶段
 51     while True:
 52         usr = input(temp_info + "输入账号:").strip()
 53         # 输入的用户名有格式问题
 54         if not usr:  # 用户名为空
 55             print("账号不能为空!")
 56             temp_info = "请重新"
 57             continue
 58         # 用户已存在
 59         if usr in users:
 60             print("用户已存在,请更换用户名!")
 61             temp_info = "请重新"
 62             continue
 63         # 用户不存在,可以进入输入密码阶段
 64         break
 65     # 密码输入操作
 66     temp_info = ""
 67     while True:
 68         ps = input(temp_info + "输入密码:").strip()
 69         # 输入的密码有格式问题
 70         if len(ps) < 3:
 71             print("密码过短!")
 72             temp_info = "请重新"
 73             continue
 74         # ... 添加其他密码安全判断
 75         break
 76     # 账号密码均满足条件,可以注册(写入文件)
 77     with open('usr.info', 'at', encoding='utf-8') as f:
 78         # 文件是否为空
 79         # 为空;不为空abc|123|0 ,qwe|123|0
 80         # users是否为空可以直接反映文件是否为空
 81         if users:#不为空
 82             user_info = ',%s|%s|%d' % (usr, ps, 0)
 83         else:#为空
 84             user_info = '%s|%s|%d' % (usr, ps, 0)
 85         f.write(user_info)
 86     # 文件操作完代表信息更新到文件中了,
 87     # 还需要将信息更新到内存字典中
 88     users[usr] = {'ps': ps, 'money': 0} #key对应value进行存值
 89     print('注册成功!')
 90 
 91 
 92 # 登录
 93 def login():
 94     global user
 95     print("登录界面...")
 96     # 获取所有用户信息
 97     users = get_users()
 98     # 当前是否为登录状态
 99     # 可以通过user(存储已登录账号)来反映是否为登录状态
100     if user:
101         print("系统已经处于登录状态!")
102         return#结束登录函数
103     # 用户名输入
104     temp_info = ""
105     while True:
106         usr = input(temp_info + '输入账号:').strip()
107         # 输入账号为空
108         if not usr:
109             print("账号不能为空!")
110             temp_info = "请重新"
111             continue
112         # 账号不存在
113         if not usr in users:
114             print("输入用户名不存在")
115             # 文件为空,没有必要继续,不为空,可以让用户重新输入
116             if users:
117                 temp_info = "请重新"
118                 continue
119             #文件为空
120             return
121         #账号输入正确,结束循环
122         break
123     # 输入密码操作
125     count = 0
126     while count < 3:
127         ps = input(temp_info + '输入密码:').strip()
128         #密码正确
129         if users[usr]['ps'] == ps:
130             print('登录成功!')
131             # money在二次以后操作文件可能已经拥有金额
132             money = users[usr]['money']
133             # 直接赋值代表覆盖,方法内不能直接覆盖全局变量,需要做global处理
134             user = {'usr': usr, 'ps': ps, 'money': money}
135             break
136         #密码错误
137         print('密码输入错误!')
138         temp_info = "请重新"
139         count += 1
140 
141 # # 登录状态验证
142 # def not_login():
143 #     if not user:
144 #         print('系统未登录!')
145 #         return True
146 
147 # 账户
148 def account():
149     #未登录
150     if not user:
151         print('系统未登录!')
152         return  #结束函数
153     #已登录
154     user_info = '账户:%s | 密码:%s | 金额:%d ' % (user['usr'], user['ps'], user['money'])
155     print(user_info)
156 
157 # 注销
158 def logout():
159     if not user:
160         print('系统未登录!')
161         return
162     #已登录
163     user.clear()
164     print('注销成功')
165 
166 # 登录成功后,对于商品的一系列操作
167 # 商品列表
168 goods_dic = {'1': 'iPhone', '2': 'Mac', '3': 'iPad'}
169 price_dic = {'iPhone': 100, 'Mac': 200, 'iPad': 50}
170 # 购物车
171 shop_car = {}
172 # {'iPhone': 3, 'iPad': 1}
173 goods_msg = '''
174 请添加商品到购物车:
175     1.iPhone | 2.Mac | 3.iPad | 0.退出购买'''
176 
177 # 充值
178 def top_up():
179     if not user:
180         print('系统未登录!')
181         return
182     temp_info = ""
183     while True:
184         money = input(temp_info + '输入充值金额:').strip()
185         if not money.isdigit():
186             print('输入金额有误!')
187             temp_info = "请重新"
188             continue
189         money = int(money)
190         break
191     # 更新金额
192     update_info('money', money)
193     print("充值完毕!")
194 
195 # 对密码或金额进行修改
196 def update_info(k, v):
197     # 需要更新的内容有:
198     # 1.当前登录状态下的用户
199     # 2.内存中的用户们
200     # 3.文件中的用户信息
201 
202     # 更新1号位
203     # 区分更新的类型
204     if k == 'money':
205         user[k] += v
206     else:#改密码
207         user[k] = v
208     # 通过1号位更新2号位
209     users = get_users()
210     #users['abc']['money'] = user['money']
211     users[user['usr']][k] = user[k]
212     # 通过2号位更新3号位
213     #
214     # {'abc': {'ps': '123', 'money': 0},'qwe': {'ps': '000', 'money': 1000}}
215     # 转换为
216     # "abc|123|0,qwe|123|1000"
217     # 写入文件
218     # dict 转换为 str
219     users_info = ''
220     for k, v in users.items():
221         usr = k
222         ps = v['ps']
223         #写入文件时是字符串
224         money = str(v['money'])
225         if not users_info:#拼接第一个用户
226             users_info += '|'.join((usr, ps, money))#覆盖
227         else:#拼接第二及以后用户时,文件已经写入第一个用户
228             users_info += ',' + '|'.join((usr, ps, money))
229     # 转换完毕后便可以写入文件
230     with open('usr.info', 'wt', encoding='utf-8') as f:
231         f.write(users_info)
232 
233 # 购物
234 def shopping():
235     if not user:
236         print('系统未登录!')
237         return
238     print(goods_msg)
239     while True:
240         # 商品编号
241         goods_num = input("商品编号:").strip()
242         if goods_num == '0':
243             print('退出购买!')
244             break
245         if not goods_num in goods_dic:
246             print('商品不存在!')
247             continue
248 
249         while True:
250             # 商品数
251             count = input('商品个数:').strip()
252             if not count.isdigit():
253                 print('个数有误!')
254                 continue
255             count = int(count)
256             # 编号与个数均正确
257             # 加入购物车:{商品名: 个数}
258             goods = goods_dic[goods_num]#商品名
259             # 通过商品与购物车进行匹配,判断商品个数是累加还是赋值
260             if not goods in shop_car:
261                 shop_car[goods] = count
262             else:
263                 shop_car[goods] += count
264             # 更新完购物车后代表一次购物车添加完毕
265             # 查看一下当前购物车信息
266             shop_cart_info()
267             break
268     # 进入支付:余额充足直接付款,不足充值
269     pay_money()
270 
271 # 购物车
272 def shop_cart_info():
273     if not shop_car:
274         print("购物车为空,可前往购物!!!")
275         return
276     print("购物车: ", shop_car)
277 
278 # 支付
279 def pay_money():
280     if not user:
281         print('系统未登录!')
282         return
283     # 由购物来到支付,也可能主动调用支付
284     if not shop_car:
285         print("购物车为空,请前往购物!")
286         return
287     # 计算购物车内商品总价
288     total = 0
289     for goods in shop_car:
290         total += price_dic[goods] * shop_car[goods] # 名称*价格
291     # 判断余额与商品总价大小
292     if user['money'] >= total:
293         print('余额充足,购买成功!')
294         # 更新信息
295         reduce = 0 - total
296         update_info('money', reduce)
297         # 支付成功后,需要清空购物车
298         shop_car.clear()
299     else:
300         print('余额不足,请充值!')
301         top_up()
302 
303 
304 # 系统功能提示信息
305 sys_msg = '''
306 欢迎使用购物车简单系统,请选择:
307 1.注册 | 2.登录 | 3.账户 | 4.充值 | 5.购物 | 6.支付 | 7.购物车 | 10.注销 | 0.退出
308 >>>'''
309 # 功能字典
310 method_dic = {
311     '1': regist,
312     '2': login,
313     '3': account,
314     '4': top_up,
315     '5': shopping,
316     '6': pay_money,
317     '7': shop_cart_info,
318     '10': logout
319 }
320 
321 # 系统入口
322 def system():
323     while True:
324         choice = input(sys_msg).strip()
325         # 退出选项
326         if choice == '0':
327             print("退出系统!")
328             return
329         # 错误选项
330         if not choice in method_dic:
331             print("功能输入有误,请重新输入")
332             continue
333         # 正确选项: eg: '1'-> regist
334         method_dic[choice]()
335 
336 system()
原文地址:https://www.cnblogs.com/xuechengeng/p/9688281.html