Python实现有用户和商家入口的购物商城
下面小编就为大家带来一篇Python 实现购物商城,含有用户入口和商家入口的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
这是模拟淘宝的一个简易的购物商城程序。
用户入口具有以下功能:
登录认证
可以锁定用户
密码输入次数大于3次,锁定用户名
连续三次输错用户名退出程序
可以选择直接购买,也可以选择加入购物车
用户使用支付密码完成支付,支付密码连续输入错误达3次,锁定用户名
商家入口具有以下功能:
登录认证
可以锁定用户
密码输入次数大于3次,锁定用户名
连续三次输错用户名退出程序
商家可以编辑商品
上架新品
下架商品
修改商品信息:商品名、单价、库存
每个用户的用户名、密码、余额、支付密码,以行记录定义在 user_list.txt 文件中,以逗号分隔;
每件商品的商品名、单价、库存,以行记录定义在 product_list.txt 文件中,以逗号加一个空格分隔;
被锁定用户名记录在 lock_list.txt 文件中,以行分隔;
商家的用户名、密码定义在 seller_list.txt 文件中,以逗号分隔;
# Joe Young import getpass import os # 调用os模块的system方法传入'cls'参数,清屏 os.system('cls') while True: entrance = input('请选择:\n\t1. 用户登陆\n\t2. 商家登陆\n>>>') if entrance != '1' and entrance != '2': print('\n输入有误,请重试...\n') else: break # 打印商品列表 def print_product_list(): index = 1 with open('product_list.txt', 'r') as product_file: for product_line in product_file: L = [commodity, price, stock] = product_line.strip('\n').split(', ') commodity_list.append(L) print((str(index) + '. ' + commodity).ljust(20) + ('单价:' + price + '元').ljust(15) + '库存:' + stock) index += 1 return # 用户入口 if entrance == '1': info = [] # 存放用户的信息,初始为空 if_payed = True # if_payed 表示订单是否已支付 username = '' # 登录接口 count = 0 while count < 3: username = input('\n用户名: ') # 打开锁定列表文件 with open('lock_list.txt', 'r+') as lock_file: for lock_line in lock_file: # 用户名在锁定名单里面,则退出程序 if username == lock_line.strip('\n'): exit('\n用户名 %s 已被锁定,请联系管理员...' % username) login = False # 登录标志,初始为False # 打开用户名列表文件,读权限 user_file = open('user_list.txt', 'r') for user_line in user_file: # 获取每行的用户信息,用户名、密码、余额、支付密码,存入info列表 info = [user, passwd, balance, pay_passwd] = user_line.strip('\n').split(',') # 用户名匹配,则进入密码输入环节 if user == username: n = 0 # 3次输入机会 while n < 3: password = getpass.getpass('密码: ') # 密码匹配,显示登录成功 if passwd == password: print('\n欢迎 %s 登录商城,祝您购物愉快!\n' % username) login = True # 登录标志赋值为True break # 密码不匹配 else: # n = 2 时是最后一次机会,不必提示还剩下0次机会 if n != 2: print('\n密码错误,请重新输入,您还有 %d 次机会\n' % (2-n)) n += 1 # 密码错误次数达到3次,锁定用户名,退出程序 else: open('lock_list.txt', 'w').write(username + '\n') exit('\n错误次数过多,账户已被锁定...') # 登录成功,跳出for循环 if login: break else: if count != 2: print('\n用户名不存在,请重试,您还有 %d 次机会' % (2-count)) user_file.close() count += 1 # 登录成功,跳出while循环 if login: break else: exit('\n错误次数过多,程序已退出...') # 购买程序 shopping_cart = [] # 购物车初始为空 commodity_list = [] print_product_list() while True: i = input('\n请选择商品(输入序号),或输入 c 取消购买:') if i == 'c': while True: a = input('\n是否继续购买?(Y/N):') if a == 'n' or a == 'N': exit('\n交易结束...') elif a == 'y' or a == 'Y': break else: print('\n输入格式有误,请重试...') continue if not i.isdigit(): print('\n输入格式有误,请重试...') continue i = int(i) if i <= 0 or i > len(commodity_list): print('\n此商品不存在,请重试...') continue item_name = commodity_list[i-1][0] # 商品名称 item_price = commodity_list[i-1][1] # 商品价格 item_stock = commodity_list[i-1][2] # 商品库存 print('\n您已选择了 %s ,请输入购买的数量,或输入 b 重新选择:' % item_name) back = False while True: num = input('>>>') if num == 'b': back = True break if not num.isdigit(): print('输入格式有误,请重试...') continue if int(num) > int(item_stock): print('数量大于库存,请重试...') continue if int(num) == 0: print('数量应大于0,请重试...') break if back: continue item = [item_name, item_price, num] print('\n您已选择了 %s,单价:%s 元,数量:%s,您想立即购买还是加入购物车?\n' % (item_name, item_price, num)) print('\t1. 立即购买\n\t2. 加入购物车\n') while True: choice = input('>>>') if not (choice == '1' or choice == '2'): print('输入有误,请重试...') continue break user_balance = int(info[2]) # 立即购买 if choice == '1': amount = int(item_price) * int(num) count = 0 cancel = False while count < 3: user_pay_passwd = getpass.getpass('\n请输入支付密码,或输入 c 放弃支付:') if user_pay_passwd == 'c': print('\n取消支付成功...') cancel = True break elif user_pay_passwd != info[3]: if count != 2: print('\n密码错误,请重试,您还有 %d 次机会...' % (2-count)) count += 1 else: break if count == 3: with open('lock_list.txt', 'w') as lock_file: lock_file.write(username + '\n') exit('密码错误,账户已被锁定...') if cancel: while True: choice = input('\n是否继续购买?(Y/N):') if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'): print('\n输入格式有误,请重试...') continue break if choice == 'Y' or choice == 'y': continue else: break # 如果用户的账户余额大于总金额 if user_balance >= amount: user_balance -= amount print('\n支付成功!您已成功购买 %s ,单价:%s 元,数量:%s,总金额:%s 元,账户余额:%s 元' % (item_name, item_price, num, amount, user_balance)) lines = open('product_list.txt', 'r').readlines() # 定位到用户所购买的商品所在行,分割成列表赋值给select select = lines[i-1].strip('\n').split(', ') # 修改商品的库存 select[-1] = (str(int(select[-1]) - int(num)) + '\n') # 拼接成字符串 lines[i-1] = ', '.join(select) # 将修改写回文件 open('product_list.txt', 'w').writelines(lines) lines = open('user_list.txt', 'r').readlines() # 修改用户余额 for line in lines: if username in line.split(','): # 定位到用户名所在行 j = lines.index(line) # 获取用户名所在行的行号索引 select = line.split(',') # 分割用户名所在行赋值给列表select select[-2] = str(user_balance) # 修改用户余额 lines[j] = ','.join(select) # 修改后的列表拼接成字符串,覆盖用户名所在行 open('user_list.txt', 'w').writelines(lines) # 将修改写回文件 else: print('\n对不起,您的余额不足...') else: # 加入购物车 j = 0 for j in range(len(shopping_cart)): # 如果商品在购物车里面,更新商品数量 if item_name in shopping_cart[j]: shopping_cart[j][2] = str(int(shopping_cart[j][2]) + int(num)) break # 商品若不在购物车,则添加到购物车 else: shopping_cart.append(item) print('\n成功加入购物车!') while True: choice = input('\n是否继续购买?(Y/N):') if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'): print('\n输入格式有误,请重试...') continue break if choice == 'Y' or choice == 'y': continue else: break # 如果购物车不为空 if shopping_cart: print('\n您的购物车里有以下宝贝:\n') i = 1 total_sum = 0 for item in shopping_cart: (commodity, price, number) = (item[0], item[1], item[2]) print((str(i) + '. ' + commodity).ljust(20) + ('单价:' + price + ' 元').ljust(15) + '数量:' + number) total_sum += int(price) * int(number) i += 1 print('\n合计:%d 元' % total_sum) while True: if_buy = input('\n是否结算?(Y/N):') if not (if_buy == 'Y' or if_buy == 'y' or if_buy == 'N' or if_buy == 'n'): print('\n输入有误,请重试...') continue break while True: # 结算 if if_buy == 'Y' or if_buy == 'y': count = 0 cancel = False while count < 3: user_pay_passwd = getpass.getpass('\n请输入支付密码,或输入 c 放弃支付:') if user_pay_passwd == 'c': print('\n取消支付成功...') cancel = True break elif user_pay_passwd != info[3]: if count != 2: print('\n密码错误,请重试,您还有 %d 次机会...' % (2-count)) count += 1 else: break if cancel: if_payed = False elif count == 3: with open('lock_list.txt', 'w') as lock_file: lock_file.write(username + '\n') exit('\n密码错误,账户已被锁定...') else: if total_sum <= user_balance: user_balance -= total_sum print('\n支付成功!您已成功购买以下商品:\n') i = 1 for item in shopping_cart: (commodity, price, number) = (item[0], item[1], item[2]) print((str(i) + '. ' + commodity).ljust(20) + ('单价:' + price + ' 元').ljust(15) + '数量:' + number) lines = open('product_list.txt', 'r').readlines() for line in lines: # 修改商品库存 if commodity in line.split(', '): # 定位到商品所在行 j = lines.index(line) # 获取商品所在行的行号索引 select = line.split(', ') # 商品所在行分割为字符串列表 select[-1] = (str(int(select[-1]) - int(number)) + '\n') # 修改商品库存 lines[j] = ', '.join(select) # 将修改后的字符串列表组成字符串 open('product_list.txt', 'w').writelines(lines) # 把修改写回文件 i += 1 lines = open('user_list.txt', 'r').readlines() for line in lines: # 用户余额写入文件 if username in line.split(','): j = lines.index(line) select = line.split(',') select[-2] = str(user_balance) lines[j] = ','.join(select) open('user_list.txt', 'w').writelines(lines) exit('\n合计:%d 元, 账户余额:%d 元' % (total_sum, user_balance)) # 不结算 else: print('\n您有一笔未支付订单...') while True: choice = input('\n是否进行支付?(Y/N):') if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'): print('\n输入有误,请重试...') continue break if choice == 'n' or choice == 'N': exit('\n订单已取消,感谢光临购物商城,再见...') else: if_buy = 'Y' continue if not if_payed: print('\n您有一笔未支付订单...') while True: choice = input('\n是否进行支付?(Y/N):') if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'): print('\n输入有误,请重试...') continue break if choice == 'n' or choice == 'N': exit('\n订单已取消,感谢光临购物商城,再见...') else: if_buy = 'Y' continue # 商家入口 if entrance == '2': seller_name = '' # 登录接口 count = 0 while count < 3: seller_name = input('\n用户名:') with open('lock_list.txt', 'r') as lock_file: for lock_line in lock_file: if seller_name == lock_line.strip('\n'): exit('\n用户名 %s 已被锁定,请联系管理员...' % seller_name) seller_file = open('seller_list.txt', 'r') login = False for seller_line in seller_file: (seller, passwd) = seller_line.strip('\n').split(',') if seller_name == seller: n = 0 while n < 3: password = getpass.getpass('密码:') # 登录成功,跳出while循环 if password == passwd: print('\n欢迎 %s 登录商城' % seller_name) login = True break else: if n != 2: print('\n密码错误,请重试,您还有 %d 次机会' % (2-n)) n += 1 # n = 3,锁定用户名 else: open('lock_list.txt', 'w').write(seller_name + '\n') exit('\n错误次数过多,账户已被锁定...') # 登录成功,跳出for循环 if login: break # 用户名不存在 else: if count != 2: print('\n用户名不存在,请重试,您还有 %d 次机会' % (2-count)) # 登录成功,跳出while循环 if login: break count += 1 else: exit('\n错误次数过多,程序已退出...') # 商品列表编辑程序 L = [] # 存放商品列表,初始为空 commodity_list = [] index = 1 print('\n您的货架上有以下商品:\n') print_product_list() while True: choice = input('\n是否编辑您的商品列表?(Y/N):') if not (choice == 'Y' or choice == 'y' or choice == 'N' or choice == 'n'): print('\n输入有误,请重试...') continue break if choice == 'Y' or choice == 'y': while True: print('\n请选择(输入 q 退出):\n') print('1. 上架新品\n\n2. 下架商品\n\n3. 修改商品信息') choice = input('\n>>>') if not (choice == '1' or choice == '2' or choice == '3' or choice == 'q'): print('输入有误,请重试...') continue # 上架新品 if choice == '1': while True: if_add = False # 是否添加商品的标志,初始为False new_commodity = input('\n输入商品名:') product_file = open('product_list.txt', 'r') for product_line in product_file: commodity = product_line.strip('\n').split(', ')[0] # 获取商品列表中的商品名 if new_commodity == commodity: print('\n此商品已在货架上...') continue else: while True: if_sure = input('\n确定上架新品 %s 吗?(Y/N):' % new_commodity) if not (if_sure == 'Y' or if_sure == 'y' or if_sure == 'N' or if_sure == 'n'): print('\n输入有误,请重试...') continue break # 确定上架新品 if if_sure == 'Y' or if_sure == 'y': while True: # 输入单价 price = input('\n请输入单价:') if not price.isdigit(): print('\n输入有误,请重试...') continue break while True: # 输入库存 stock = input('\n请输入库存:') if not stock.isdigit(): print('\n输入有误,请重试...') continue break new_line = '\n' + new_commodity + ', ' + price + ', ' + stock open('product_list.txt', 'a').writelines(new_line) print('\n成功上架新品 %s ,单价 %s 元,库存 %s 件' % (new_commodity, price, stock)) while True: option = input('\n是否继续添加?(Y/N):') if not (option == 'Y' or option or option == 'N' or option == 'n'): print('\n输入有误,请重试...') continue break if option == 'Y' or option == 'y': if_add = True break # 跳出for循环 else: break # 取消上架新品 else: if_add = False break # 跳出for循环 product_file.close() if if_add is True: continue else: break # 跳出while循环 # 下架商品 elif choice == '2': while True: del_num = input('\n请输入您想下架商品的序号:') if not (del_num.isdigit() or int(del_num) > 0 and int(del_num) <= len(commodity_list)): print('\n输入有误,请重试...') continue break del_num = int(del_num) del_commodity = commodity_list[del_num - 1][0] with open('product_list.txt', 'r') as old_file: with open('product_list.txt', 'r+') as new_file: current_line = 0 # 定位到需要删除的行 while current_line < (del_num - 1): old_file.readline() current_line += 1 # 当前光标在被删除行的行首,记录该位置 seek_point = old_file.tell() # 设置光标位置 new_file.seek(seek_point, 0) # 读需要删除的行,光标移到下一行行首 old_file.readline() # 被删除行的下一行读给 next_line next_line = old_file.readline() # 连续覆盖剩余行,后面所有行上移一行 while next_line: new_file.write(next_line) next_line = old_file.readline() # 写完最后一行后截断文件,因为删除操作,文件整体少了一行,原文件最后一行需要去掉 new_file.truncate() print('\n您已成功下架 %s !' % del_commodity) # 修改商品信息 elif choice == '3': # 修改商品信息 def mod_commodity_info(i, j): i = int(i) j = int(j) with open('product_list.txt', 'r+') as f: current_line = 0 while current_line < i - 1: f.readline() current_line += 1 seek_point = f.tell() f.seek(seek_point, 0) # 修改商品名 if j == 1: update_line = mod_name() + ', ' + commodity_list[i-1][1] + ', ' + commodity_list[i-1][2] + '\n' # 修改商品价格 elif j == 2: update_line = commodity_list[i-1][0] + ', ' + mod_price() + ', ' + commodity_list[i-1][2] + '\n' # 修改商品库存 else: update_line = commodity_list[i-1][0] + ', ' + commodity_list[i-1][1] + ', ' + mod_stock() + '\n' f.write(update_line) return def mod_name(): new_name = input("\n请输入新的商品名:") return new_name def mod_price(): new_price = input("\n请输入新的商品单价:") return new_price def mod_stock(): new_stock = input("\n请输入新的商品库存:") return new_stock # 修改商品单价 def mod_commodity_price(i): i = int(i) with open('product_list.txt', 'r+') as f: current_line = 0 while current_line < i -1: f.readline() current_line += 1 seek_point = f.tell() f.seek(seek_point, 0) new_price = input() while True: i = input("\n请输入需要编辑的商品序号(输入 c 取消):") if not (i.isdigit or i == 'c' or int(i) > 0 and int(i) <= len(commodity_list)): print("\n输入有误,请重试...") continue elif i == 'c': break else: while True: j = input("\n请选择需要编辑的选项(输入 c 取消):\n\n1. 商品名\n\n2. 单价\n\n3. 库存\n\n>>>") if not (j == 'c' or j == '1' or j == '2' or j == '3'): print("\n输入有误,请重试...") continue break if j == 'c': break else: mod_commodity_info(i, j) else: exit('\n您已退出商城...') else: exit('\n您已退出商城...')
Atas ialah kandungan terperinci Python实现有用户和商家入口的购物商城. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Tiada fungsi jumlah terbina dalam dalam bahasa C, jadi ia perlu ditulis sendiri. Jumlah boleh dicapai dengan melintasi unsur -unsur array dan terkumpul: Versi gelung: SUM dikira menggunakan panjang gelung dan panjang. Versi Pointer: Gunakan petunjuk untuk menunjuk kepada unsur-unsur array, dan penjumlahan yang cekap dicapai melalui penunjuk diri sendiri. Secara dinamik memperuntukkan versi Array: Perlawanan secara dinamik dan uruskan memori sendiri, memastikan memori yang diperuntukkan dibebaskan untuk mengelakkan kebocoran ingatan.

Tidak ada gaji mutlak untuk pemaju Python dan JavaScript, bergantung kepada kemahiran dan keperluan industri. 1. Python boleh dibayar lebih banyak dalam sains data dan pembelajaran mesin. 2. JavaScript mempunyai permintaan yang besar dalam perkembangan depan dan stack penuh, dan gajinya juga cukup besar. 3. Faktor mempengaruhi termasuk pengalaman, lokasi geografi, saiz syarikat dan kemahiran khusus.

Walaupun berbeza dan berbeza berkaitan dengan perbezaan, ia digunakan secara berbeza: berbeza (kata sifat) menggambarkan keunikan perkara itu sendiri dan digunakan untuk menekankan perbezaan antara perkara; Berbeza (kata kerja) mewakili tingkah laku atau keupayaan perbezaan, dan digunakan untuk menggambarkan proses diskriminasi. Dalam pengaturcaraan, berbeza sering digunakan untuk mewakili keunikan unsur -unsur dalam koleksi, seperti operasi deduplikasi; Berbeza dicerminkan dalam reka bentuk algoritma atau fungsi, seperti membezakan ganjil dan bahkan nombor. Apabila mengoptimumkan, operasi yang berbeza harus memilih algoritma dan struktur data yang sesuai, sementara operasi yang berbeza harus mengoptimumkan perbezaan antara kecekapan logik dan memberi perhatian untuk menulis kod yang jelas dan mudah dibaca.

Halaman H5 perlu dikekalkan secara berterusan, kerana faktor -faktor seperti kelemahan kod, keserasian pelayar, pengoptimuman prestasi, kemas kini keselamatan dan peningkatan pengalaman pengguna. Kaedah penyelenggaraan yang berkesan termasuk mewujudkan sistem ujian lengkap, menggunakan alat kawalan versi, kerap memantau prestasi halaman, mengumpul maklum balas pengguna dan merumuskan pelan penyelenggaraan.

! X Memahami! X adalah bukan operator logik dalam bahasa C. Ia booleans nilai x, iaitu, perubahan benar kepada perubahan palsu, palsu kepada benar. Tetapi sedar bahawa kebenaran dan kepalsuan dalam C diwakili oleh nilai berangka dan bukannya jenis Boolean, bukan sifar dianggap sebagai benar, dan hanya 0 dianggap sebagai palsu. Oleh itu ,! X memperkatakan nombor negatif sama seperti nombor positif dan dianggap benar.

Tiada fungsi jumlah terbina dalam dalam C untuk jumlah, tetapi ia boleh dilaksanakan dengan: menggunakan gelung untuk mengumpul unsur-unsur satu demi satu; menggunakan penunjuk untuk mengakses dan mengumpul unsur -unsur satu demi satu; Untuk jumlah data yang besar, pertimbangkan pengiraan selari.

Bagaimana untuk mendapatkan data dinamik 58.com halaman kerja semasa merangkak? Semasa merangkak halaman kerja 58.com menggunakan alat crawler, anda mungkin menghadapi ...

PS "Memuatkan" Masalah disebabkan oleh akses sumber atau masalah pemprosesan: Kelajuan bacaan cakera keras adalah perlahan atau buruk: Gunakan CrystaldiskInfo untuk memeriksa kesihatan cakera keras dan menggantikan cakera keras yang bermasalah. Memori yang tidak mencukupi: Meningkatkan memori untuk memenuhi keperluan PS untuk imej resolusi tinggi dan pemprosesan lapisan kompleks. Pemandu kad grafik sudah lapuk atau rosak: Kemas kini pemandu untuk mengoptimumkan komunikasi antara PS dan kad grafik. Laluan fail terlalu panjang atau nama fail mempunyai aksara khas: Gunakan laluan pendek dan elakkan aksara khas. Masalah PS sendiri: Pasang semula atau membaiki pemasang PS.
