Python 实现购物商城,含有用户入口和商家入口

软件设计 2017-09-14

这是模拟淘宝的一个简易的购物商城程序。

用户入口具有以下功能:

  1. 登录认证 可以锁定用户
  2. 密码输入次数大于3次,锁定用户名
  3. 连续三次输错用户名退出程序
可以选择直接购买,也可以选择加入购物车 用户使用支付密码完成支付,支付密码连续输入错误达3次,锁定用户名

商家入口具有以下功能:

  1. 登录认证 可以锁定用户
  2. 密码输入次数大于3次,锁定用户名
  3. 连续三次输错用户名退出程序
商家可以编辑商品
  1. 上架新品
  2. 下架商品
  3. 修改商品信息:商品名、单价、库存

每个用户的用户名、密码、余额、支付密码,以行记录定义在 user_list.txt 文件中,以逗号分隔;

每件商品的商品名、单价、库存,以行记录定义在 product_list.txt 文件中,以逗号加一个空格分隔;

被锁定用户名记录在 lock_list.txt 文件中,以行分隔;

商家的用户名、密码定义在 seller_list.txt 文件中,以逗号分隔;

1 # Joe Young
  2 
  3 import getpass
  4 import os
  5 
  6 # 调用os模块的system方法传入'cls'参数,清屏
  7 os.system('cls')    
  8 
  9 while True:
 10     entrance = input('请选择:\n\t1. 用户登陆\n\t2. 商家登陆\n>>>')
 11     if entrance != '1' and entrance != '2':
 12         print('\n输入有误,请重试...\n')
 13     else:
 14         break
 15 
 16 # 打印商品列表
 17 def print_product_list():
 18     index = 1
 19     with open('product_list.txt', 'r') as product_file:
 20         for product_line in product_file:
 21             L = [commodity, price, stock] = product_line.strip('\n').split(', ')
 22             commodity_list.append(L)
 23             print((str(index) + '. ' + commodity).ljust(20) + ('单价:' + price + '元').ljust(15) + '库存:' + stock)
 24             index += 1
 25     return
 26 
 27 # 用户入口
 28 if entrance == '1':
 29 
 30     info = []          # 存放用户的信息,初始为空
 31     if_payed = True    # if_payed 表示订单是否已支付
 32     username = ''
 33 
 34     # 登录接口
 35     count = 0
 36     while count < 3:
 37         username = input('\n用户名: ')
 38 
 39         # 打开锁定列表文件
 40         with open('lock_list.txt', 'r+') as lock_file:  
 41             for lock_line in lock_file:
 42                 # 用户名在锁定名单里面,则退出程序
 43                 if username == lock_line.strip('\n'):   
 44                     exit('\n用户名 %s 已被锁定,请联系管理员...' % username)
 45 
 46         login = False   # 登录标志,初始为False
 47 
 48         # 打开用户名列表文件,读权限
 49         user_file = open('user_list.txt', 'r')     
 50 
 51         for user_line in user_file:
 52             # 获取每行的用户信息,用户名、密码、余额、支付密码,存入info列表
 53             info = [user, passwd, balance, pay_passwd] = user_line.strip('\n').split(',')
 54             # 用户名匹配,则进入密码输入环节
 55             if user == username:    
 56                 n = 0
 57                 # 3次输入机会
 58                 while n < 3:    
 59                     password = getpass.getpass('密码: ')
 60                     # 密码匹配,显示登录成功
 61                     if passwd == password:  
 62                         print('\n欢迎 %s 登录商城,祝您购物愉快!\n' % username)
 63                         login = True        # 登录标志赋值为True
 64                         break
 65                     # 密码不匹配
 66                     else:   
 67                         # n = 2 时是最后一次机会,不必提示还剩下0次机会
 68                         if n != 2:  
 69                             print('\n密码错误,请重新输入,您还有 %d 次机会\n' % (2-n))
 70                     n += 1
 71                 # 密码错误次数达到3次,锁定用户名,退出程序
 72                 else:   
 73                     open('lock_list.txt', 'w').write(username + '\n')
 74                     exit('\n错误次数过多,账户已被锁定...')
 75 
 76                 # 登录成功,跳出for循环
 77                 if login:   
 78                     break
 79         else:
 80             if count != 2:
 81                 print('\n用户名不存在,请重试,您还有 %d 次机会' % (2-count))
 82 
 83         user_file.close()
 84 
 85         count += 1
 86 
 87         # 登录成功,跳出while循环
 88         if login:   
 89             break
 90 
 91     else:
 92         exit('\n错误次数过多,程序已退出...')
 93 
 94     # 购买程序
 95     shopping_cart = []  # 购物车初始为空
 96     commodity_list = []
 97 
 98     print_product_list()
 99 
100     while True:
101         i = input('\n请选择商品(输入序号),或输入 c 取消购买:')
102 
103         if i == 'c':
104             while True:
105                 a = input('\n是否继续购买?(Y/N):')
106                 if a == 'n' or a == 'N':
107                     exit('\n交易结束...')
108                 elif a == 'y' or a == 'Y':
109                     break
110                 else:
111                     print('\n输入格式有误,请重试...')
112                     continue
113 
114         if not i.isdigit():
115             print('\n输入格式有误,请重试...')
116             continue
117 
118         i = int(i)
119 
120         if i <= 0 or i > len(commodity_list):
121             print('\n此商品不存在,请重试...')
122             continue
123 
124         item_name = commodity_list[i-1][0]      # 商品名称
125         item_price = commodity_list[i-1][1]     # 商品价格
126         item_stock = commodity_list[i-1][2]     # 商品库存
127 
128         print('\n您已选择了 %s ,请输入购买的数量,或输入 b 重新选择:' % item_name)
129 
130         back = False
131 
132         while True:
133             num = input('>>>')
134             if num == 'b':
135                 back = True
136                 break
137             if not num.isdigit():
138                 print('输入格式有误,请重试...')
139                 continue
140             if int(num) > int(item_stock):
141                 print('数量大于库存,请重试...')
142                 continue
143             if int(num) == 0:
144                 print('数量应大于0,请重试...')
145             break
146         if back:
147             continue
148 
149         item = [item_name, item_price, num]
150 
151         print('\n您已选择了 %s,单价:%s 元,数量:%s,您想立即购买还是加入购物车?\n' % (item_name, item_price, num))
152         print('\t1. 立即购买\n\t2. 加入购物车\n')
153 
154         while True:
155             choice = input('>>>')
156             if not (choice == '1' or choice == '2'):
157                 print('输入有误,请重试...')
158                 continue
159             break
160 
161         user_balance = int(info[2])
162 
163         # 立即购买
164         if choice == '1':   
165             amount = int(item_price) * int(num)
166             count = 0
167             cancel = False
168 
169             while count < 3:
170                 user_pay_passwd = getpass.getpass('\n请输入支付密码,或输入 c 放弃支付:')
171                 if user_pay_passwd == 'c':
172                     print('\n取消支付成功...')
173                     cancel = True
174                     break
175                 elif user_pay_passwd != info[3]:
176                     if count != 2:
177                         print('\n密码错误,请重试,您还有 %d 次机会...' % (2-count))
178                     count += 1
179                 else:
180                     break
181 
182             if count == 3:
183                 with open('lock_list.txt', 'w') as lock_file:
184                     lock_file.write(username + '\n')
185                 exit('密码错误,账户已被锁定...')
186 
187             if cancel:
188                 while True:
189                     choice = input('\n是否继续购买?(Y/N):')
190                     if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
191                         print('\n输入格式有误,请重试...')
192                         continue
193                     break
194                 if choice == 'Y' or choice == 'y':
195                     continue
196                 else:
197                     break
198 
199             # 如果用户的账户余额大于总金额
200             if user_balance >= amount:  
201                 user_balance -= amount
202                 print('\n支付成功!您已成功购买 %s ,单价:%s 元,数量:%s,总金额:%s 元,账户余额:%s 元'
203                       % (item_name, item_price, num, amount, user_balance))
204                 lines = open('product_list.txt', 'r').readlines()
205                 # 定位到用户所购买的商品所在行,分割成列表赋值给select
206                 select = lines[i-1].strip('\n').split(', ')             
207                 # 修改商品的库存
208                 select[-1] = (str(int(select[-1]) - int(num)) + '\n')   
209                 # 拼接成字符串
210                 lines[i-1] = ', '.join(select)                          
211                 # 将修改写回文件
212                 open('product_list.txt', 'w').writelines(lines)         
213 
214                 lines = open('user_list.txt', 'r').readlines()
215                 # 修改用户余额
216                 for line in lines:  
217                     if username in line.split(','):     # 定位到用户名所在行
218                         j = lines.index(line)           # 获取用户名所在行的行号索引
219                         select = line.split(',')        # 分割用户名所在行赋值给列表select
220                         select[-2] = str(user_balance)  # 修改用户余额
221                         lines[j] = ','.join(select)     # 修改后的列表拼接成字符串,覆盖用户名所在行
222                         open('user_list.txt', 'w').writelines(lines)    # 将修改写回文件
223             else:
224                 print('\n对不起,您的余额不足...')
225 
226         else:   # 加入购物车
227             j = 0
228             for j in range(len(shopping_cart)):
229                 # 如果商品在购物车里面,更新商品数量
230                 if item_name in shopping_cart[j]:   
231                     shopping_cart[j][2] = str(int(shopping_cart[j][2]) + int(num))
232                     break
233             # 商品若不在购物车,则添加到购物车
234             else:
235                 shopping_cart.append(item)  
236             print('\n成功加入购物车!')
237 
238         while True:
239             choice = input('\n是否继续购买?(Y/N):')
240             if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
241                 print('\n输入格式有误,请重试...')
242                 continue
243             break
244 
245         if choice == 'Y' or choice == 'y':
246             continue
247         else:
248             break
249 
250     # 如果购物车不为空
251     if shopping_cart:   
252         print('\n您的购物车里有以下宝贝:\n')
253         i = 1
254         total_sum = 0
255         for item in shopping_cart:
256             (commodity, price, number) = (item[0], item[1], item[2])
257             print((str(i) + '. ' + commodity).ljust(20) + ('单价:' + price + ' 元').ljust(15) + '数量:' + number)
258             total_sum += int(price) * int(number)
259             i += 1
260         print('\n合计:%d 元' % total_sum)
261 
262         while True:
263             if_buy = input('\n是否结算?(Y/N):')
264             if not (if_buy == 'Y' or if_buy == 'y' or if_buy == 'N' or if_buy == 'n'):
265                 print('\n输入有误,请重试...')
266                 continue
267             break
268 
269         while True:
270             # 结算
271             if if_buy == 'Y' or if_buy == 'y':  
272                 count = 0
273                 cancel = False
274 
275                 while count < 3:
276                     user_pay_passwd = getpass.getpass('\n请输入支付密码,或输入 c 放弃支付:')
277                     if user_pay_passwd == 'c':
278                         print('\n取消支付成功...')
279                         cancel = True
280                         break
281                     elif user_pay_passwd != info[3]:
282                         if count != 2:
283                             print('\n密码错误,请重试,您还有 %d 次机会...' % (2-count))
284                         count += 1
285                     else:
286                         break
287 
288                 if cancel:
289                     if_payed = False
290 
291                 elif count == 3:
292                     with open('lock_list.txt', 'w') as lock_file:
293                         lock_file.write(username + '\n')
294                     exit('\n密码错误,账户已被锁定...')
295 
296                 else:
297                     if total_sum <= user_balance:
298                         user_balance -= total_sum
299                         print('\n支付成功!您已成功购买以下商品:\n')
300                         i = 1
301                         for item in shopping_cart:
302                             (commodity, price, number) = (item[0], item[1], item[2])
303                             print((str(i) + '. ' + commodity).ljust(20) +
304                                   ('单价:' + price + ' 元').ljust(15) + '数量:' + number)
305                             lines = open('product_list.txt', 'r').readlines()
306                             for line in lines:  # 修改商品库存
307                                 if commodity in line.split(', '):                    # 定位到商品所在行
308                                     j = lines.index(line)                            # 获取商品所在行的行号索引
309                                     select = line.split(', ')                        # 商品所在行分割为字符串列表
310                                     select[-1] = (str(int(select[-1]) - int(number)) + '\n')    # 修改商品库存
311                                     lines[j] = ', '.join(select)                     # 将修改后的字符串列表组成字符串
312                                     open('product_list.txt', 'w').writelines(lines)  # 把修改写回文件
313                             i += 1
314 
315                         lines = open('user_list.txt', 'r').readlines()
316 
317                         for line in lines:  # 用户余额写入文件
318                             if username in line.split(','):
319                                 j = lines.index(line)
320                                 select = line.split(',')
321                                 select[-2] = str(user_balance)
322                                 lines[j] = ','.join(select)
323                                 open('user_list.txt', 'w').writelines(lines)
324 
325                         exit('\n合计:%d 元, 账户余额:%d 元' % (total_sum, user_balance))
326 
327             # 不结算
328             else:   
329                 print('\n您有一笔未支付订单...')
330                 while True:
331                     choice = input('\n是否进行支付?(Y/N):')
332                     if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
333                         print('\n输入有误,请重试...')
334                         continue
335                     break
336                 if choice == 'n' or choice == 'N':
337                     exit('\n订单已取消,感谢光临购物商城,再见...')
338                 else:
339                     if_buy = 'Y'
340                     continue
341 
342             if not if_payed:
343                 print('\n您有一笔未支付订单...')
344                 while True:
345                     choice = input('\n是否进行支付?(Y/N):')
346                     if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
347                         print('\n输入有误,请重试...')
348                         continue
349                     break
350 
351                 if choice == 'n' or choice == 'N':
352                     exit('\n订单已取消,感谢光临购物商城,再见...')
353                 else:
354                     if_buy = 'Y'
355                     continue
356 
357 # 商家入口
358 if entrance == '2':     
359 
360     seller_name = ''
361 
362     # 登录接口
363     count = 0
364     while count < 3:
365         seller_name = input('\n用户名:')
366 
367         with open('lock_list.txt', 'r') as lock_file:
368             for lock_line in lock_file:
369                 if seller_name == lock_line.strip('\n'):
370                     exit('\n用户名 %s 已被锁定,请联系管理员...' % seller_name)
371 
372         seller_file = open('seller_list.txt', 'r')
373         login = False
374 
375         for seller_line in seller_file:
376             (seller, passwd) = seller_line.strip('\n').split(',')
377             if seller_name == seller:
378                 n = 0
379                 while n < 3:
380                     password = getpass.getpass('密码:')
381                     # 登录成功,跳出while循环
382                     if password == passwd:
383                         print('\n欢迎 %s 登录商城' % seller_name)
384                         login = True
385                         break   
386                     else:
387                         if n != 2:
388                             print('\n密码错误,请重试,您还有 %d 次机会' % (2-n))
389                     n += 1
390                 # n = 3,锁定用户名
391                 else:           
392                     open('lock_list.txt', 'w').write(seller_name + '\n')
393                     exit('\n错误次数过多,账户已被锁定...')
394                 # 登录成功,跳出for循环
395                 if login:       
396                     break
397 
398         # 用户名不存在
399         else:       
400             if count != 2:
401                 print('\n用户名不存在,请重试,您还有 %d 次机会' % (2-count))
402 
403         # 登录成功,跳出while循环
404         if login:   
405             break
406 
407         count += 1
408 
409     else:
410         exit('\n错误次数过多,程序已退出...')
411 
412 
413     # 商品列表编辑程序
414   
415     L = []
416     # 存放商品列表,初始为空
417     commodity_list = []
418     index = 1
419 
420     print('\n您的货架上有以下商品:\n')
421   
422     print_product_list()
423 
424     while True:
425         choice = input('\n是否编辑您的商品列表?(Y/N):')
426         if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'):
427             print('\n输入有误,请重试...')
428             continue
429         break
430 
431     if choice == 'Y' or choice == 'y':
432         while True:
433             print('\n请选择(输入 q 退出):\n')
434             print('1. 上架新品\n\n2. 下架商品\n\n3. 修改商品信息')
435             choice = input('\n>>>')
436             if not (choice == '1' or choice == '2' or choice == '3' or choice == 'q'):
437                 print('输入有误,请重试...')
438                 continue
439 
440             # 上架新品
441             if choice == '1':
442                 while True:
443                     if_add = False  # 是否添加商品的标志,初始为False
444                     new_commodity = input('\n输入商品名:')
445 
446                     product_file = open('product_list.txt', 'r')
447 
448                     for product_line in product_file:
449                         commodity = product_line.strip('\n').split(', ')[0]     # 获取商品列表中的商品名
450                         if new_commodity == commodity:
451                             print('\n此商品已在货架上...')
452                             continue
453                         else:
454                             while True:
455                                 if_sure = input('\n确定上架新品 %s 吗?(Y/N):' % new_commodity)
456                                 if not (if_sure == 'Y' or if_sure == 'y' or if_sure == 'N' or if_sure == 'n'):
457                                     print('\n输入有误,请重试...')
458                                     continue
459                                 break
460                             # 确定上架新品
461                             if if_sure == 'Y' or if_sure == 'y':
462                                 while True:     # 输入单价
463                                     price = input('\n请输入单价:')
464                                     if not price.isdigit():
465                                         print('\n输入有误,请重试...')
466                                         continue
467                                     break
468                                 while True:     # 输入库存
469                                     stock = input('\n请输入库存:')
470                                     if not stock.isdigit():
471                                         print('\n输入有误,请重试...')
472                                         continue
473                                     break
474                                 new_line = '\n' + new_commodity + ', ' + price + ', ' + stock
475                                 open('product_list.txt', 'a').writelines(new_line)
476                                 print('\n成功上架新品 %s ,单价 %s 元,库存 %s 件' % (new_commodity, price, stock))
477 
478                                 while True:
479                                     option = input('\n是否继续添加?(Y/N):')
480                                     if not (option == 'Y' or option or option == 'N' or option == 'n'):
481                                         print('\n输入有误,请重试...')
482                                         continue
483                                     break
484                                 if option == 'Y' or option == 'y':
485                                     if_add = True
486                                     break   # 跳出for循环
487                                 else:
488                                     break
489                             # 取消上架新品
490                             else:
491                                 if_add = False
492                                 break   # 跳出for循环
493                     product_file.close()
494 
495                     if if_add is True:
496                         continue
497                     else:
498                         break   # 跳出while循环
499 
500             # 下架商品
501             elif choice == '2':
502                 while True:
503                     del_num = input('\n请输入您想下架商品的序号:')
504                     if not (del_num.isdigit() or int(del_num) > 0 and int(del_num) <= len(commodity_list)):
505                         print('\n输入有误,请重试...')
506                         continue
507                     break
508 
509                 del_num = int(del_num)
510                 del_commodity = commodity_list[del_num - 1][0]
511 
512                 with open('product_list.txt', 'r') as old_file:
513                     with open('product_list.txt', 'r+') as new_file:
514 
515                         current_line = 0
516 
517                         # 定位到需要删除的行
518                         while current_line < (del_num - 1):
519                             old_file.readline()
520                             current_line += 1
521 
522                         # 当前光标在被删除行的行首,记录该位置
523                         seek_point = old_file.tell()
524 
525                         # 设置光标位置
526                         new_file.seek(seek_point, 0)
527 
528                         # 读需要删除的行,光标移到下一行行首
529                         old_file.readline()
530                         
531                         # 被删除行的下一行读给 next_line
532                         next_line = old_file.readline()
533 
534                         # 连续覆盖剩余行,后面所有行上移一行
535                         while next_line:
536                             new_file.write(next_line)
537                             next_line = old_file.readline()
538 
539                         # 写完最后一行后截断文件,因为删除操作,文件整体少了一行,原文件最后一行需要去掉
540                         new_file.truncate()
541 
542                 print('\n您已成功下架 %s !' % del_commodity)
543 
544             # 修改商品信息
545             elif choice == '3':
546 
547                 # 修改商品信息
548                 def mod_commodity_info(i, j):
549                     i = int(i)
550                     j = int(j)
551                     with open('product_list.txt', 'r+') as f:
552                         current_line = 0
553                         while current_line < i - 1:
554                             f.readline()
555                             current_line += 1
556                         seek_point = f.tell()
557                         f.seek(seek_point, 0)
558 
559                         # 修改商品名
560                         if j == 1:
561                             update_line = mod_name() + ', ' + commodity_list[i-1][1] + ', ' + commodity_list[i-1][2] + '\n'
562                         # 修改商品价格
563                         elif j == 2:
564                             update_line = commodity_list[i-1][0] + ', ' + mod_price() + ', ' + commodity_list[i-1][2] + '\n'
565                         # 修改商品库存
566                         else:
567                             update_line = commodity_list[i-1][0] + ', ' + commodity_list[i-1][1] + ', ' + mod_stock() + '\n'
568                         
569                         f.write(update_line)
570                     return
571                 
572                 def mod_name():
573                     new_name = input("\n请输入新的商品名:")
574                     return new_name
575 
576                 def mod_price():
577                     new_price = input("\n请输入新的商品单价:")
578                     return new_price
579 
580                 def mod_stock():
581                     new_stock = input("\n请输入新的商品库存:")
582                     return new_stock
583 
584                 # 修改商品单价
585                 def mod_commodity_price(i):
586                     i = int(i)
587                     with open('product_list.txt', 'r+') as f:
588                         current_line = 0
589                         while current_line < i -1:
590                             f.readline()
591                             current_line += 1
592                         seek_point = f.tell()
593                         f.seek(seek_point, 0)
594                         new_price = input()
595 
596 
597                 while True:
598                     i = input("\n请输入需要编辑的商品序号(输入 c 取消):")
599                     if not (i.isdigit or i == 'c' or int(i) > 0 and int(i) <= len(commodity_list)):
600                         print("\n输入有误,请重试...")
601                         continue
602                     elif i == 'c':
603                         break
604                     else:
605                         while True:
606                             j = input("\n请选择需要编辑的选项(输入 c 取消):\n\n1. 商品名\n\n2. 单价\n\n3. 库存\n\n>>>")
607                             if not (j == 'c' or j == '1' or j == '2' or j == '3'):
608                                 print("\n输入有误,请重试...")
609                                 continue
610                             break
611                         if j == 'c':
612                             break
613                         else:
614                             mod_commodity_info(i, j)
615 
616             else:
617                 exit('\n您已退出商城...')
618     else:
619         exit('\n您已退出商城...')

相关推荐