购物商城

  1 #!/usr/bin/env python
  2 """
  3 购物系统
  4
  5     aim :
  6         1. 登录-三次失败锁定; 账户锁定可通过验证码解锁重新设置密码
  7         2. 展示商品-分页,当前页焦点
  8         3. 购物记录-文件,用户退出会生成一个已购物日志文件.
  9         4. 余额浮点数
 10         5. 查看购物车支持模糊查询,不区分大小写
 11         6. 区分游客和正式用户;游客可直接浏览商品,可直接加入购物车;但购买需登录
 12         7. 游客浏览只有登录和购物车两个选项
 13         8. 登录后,取消登录选项,增加结账,充值和退出三个选项
 14         9. 游客状态的购物车,在登录后仍然保留;可直接进行结账操作.
 15
 16     need :
 17         1. 用户输入
 18         2. 商品信息文件
 19         3. 用户信息文件
 20
 21     待完善:
 22         1. 终端输出有待优化
 23             {
 24                 1. 格式化字符串
 25                 2. 提示语
 26             }
 27         2. 目前购物车都是保存在内存, 程序一旦退出, 会被清空.
 28             {
 29                 可保存在文件, 那么用户登录则可以写入文件;不管什么时候登录, 购物车有上次未购买的东西.
 30             }
 31         3. 购物车未实现增/删/修功能
 32             {
 33                 1. 查看购物车应有此功能
 34                 2. 结账时提示也应有此功能
 35             }
 36         4. None
 37 """
 38
 39
 40 # vars and funcs
 41
 42 # 格式化打印清单; 返回消费总金额
 43 def show_card(dic):
 44     sum_money = 0
 45     top_str = ">>您选购的商品列表<<"
 46     print(‘\n‘ + top_str.center(100, ‘ ‘))
 47     print("-" * 100)
 48     print("{}\t\t{}\t\t{}\t\t{}".format("小计", "数量", "单价", "商品").expandtabs(10))
 49     print("-" * 100)
 50     for ITEM in dic:
 51         sum_money += float(get_price(ITEM)) * dic[ITEM]
 52         print(‘%.2f\t\t%d\t\t%.2f\t\t%s‘.expandtabs(10) % (
 53             float(get_price(ITEM)) * dic[ITEM], dic[ITEM],
 54             float(get_price(ITEM)), ITEM))
 55     print("-" * 100)
 56     return sum_money
 57
 58
 59 # 判断是否是浮点数
 60 def is_floated(para):
 61     try:
 62         float(para)
 63         return True
 64     except:
 65         return False
 66
 67
 68 # 生成随机验证码
 69 def get_random_code():
 70     import random
 71     random_code = ‘‘
 72     for i in range(4):
 73         cur = random.randrange(0, 4)
 74         if cur != i:
 75             temp = chr(random.randint(65, 90))
 76         else:
 77             temp = random.randint(0, 9)
 78         random_code += str(temp)
 79     return random_code
 80
 81
 82 # 解锁账户
 83 def unlock_account(username):
 84     print(‘\n解锁账户须进行以下验证‘)
 85     while True:
 86         code_random = get_random_code()
 87         print(‘验证码: ‘, code_random)
 88         user_code = input(‘请输入上述的验证码: ‘)
 89         if str(user_code).strip() == code_random:
 90             print(‘验证通过,请重新设置密码.‘)
 91             new_pass = input(‘请输入新密码: ‘)
 92             confirm_pass = input(‘请再输一遍密码: ‘)
 93             if new_pass == confirm_pass:
 94                 for user_item in user_detail_list:
 95                     if user_item[‘name‘] == username:
 96                         user_item[‘pwd‘] = confirm_pass
 97                         user_item[‘times‘] = 0
 98                         return True
 99             else:
100                 print(‘输入错误,请重新设置.‘)
101         else:
102             print(‘验证码输入错误,请重新输入.‘)
103
104
105 # 判断是否有登录在线用户, 返回用户的姓名,登录状态,总金额,用户列表在总用户列表里面的下标
106 def user_is_auth():
107     rt_list = []
108     for user_dic in user_detail_list:
109         if user_dic[‘status‘] == 1:
110             rt_list.append(user_dic[‘name‘])
111             rt_list.append(user_dic[‘status‘])
112             rt_list.append(user_dic[‘money‘])
113             rt_list.append(user_detail_list.index(user_dic))
114     return rt_list
115
116
117 # 返回10条记录, 可根据page_numb来展示
118 def get_ten_record(pas_list, page_numb=1):
119     return_list = []
120     start_num = (int(page_numb) - 1) * 10
121     end_num = int(page_numb) * 10
122     for ITEM in range(start_num, end_num):
123         return_list.append(pas_list[ITEM])
124     return return_list
125
126
127 # 获取商品价格
128 def get_price(goods_name):
129     with open(‘goods.info‘, ‘r‘, encoding=‘utf-8‘) as file_goods:
130         for goods in file_goods.readlines():
131             goods = goods.strip().split(‘---‘)
132             if goods_name in goods:
133                 return goods[-1]
134
135
136 # 打印10条记录
137 def show_ten_record(return_list, num):
138     print(‘\n%s\t\t%s\t\t%s‘.expandtabs(10) % (‘商品ID‘, ‘商品价格‘, ‘商品名称‘))
139     print(‘-‘ * 80)
140     for K, ITEM in enumerate(return_list, 1000 + 10 * (num - 1) + 1):
141         print(‘%d\t\t%.2f¥\t\t%s‘.expandtabs(10) % (K, float(ITEM[1]), ITEM[0]))
142         id_list.append(K)
143     print()
144     print_str = ‘‘
145     for i in range(1, len(book_all_list) // 10 + 1):
146         if i != len(book_all_list) // 10:
147             print_str = print_str + ‘ ‘ + str(i) + ‘ | ‘
148         else:
149             print_str = print_str + ‘ ‘ + str(i) + ‘ ‘
150     print(print_str.replace(‘ ‘ + str(num) + ‘ ‘, ‘ < ‘ + str(num) + ‘ > ‘) + ‘\n‘)
151
152
153 # ########################## 用户信息文件处理 start ##########################
154 # 存放用户信息
155 # user_detail_list = [
156 #     {
157 #         ‘name‘: ‘alex‘,
158 #         ‘pwd‘: 12121212,
159 #         ‘times‘: 2,
160 #         ‘money‘: 120000.00,
161 #         ‘status‘: 0
162 #     }
163 #     ...
164 # ]
165 user_detail_list = []
166
167 with open(‘db‘, ‘r‘) as f_user:
168     for user_info in f_user.readlines():
169         user_detail = user_info.split(‘|‘)
170         user_detail_list.append({
171             ‘name‘: user_detail[0].strip(),
172             ‘pwd‘: user_detail[1].strip(),
173             ‘times‘: user_detail[2].strip(),
174             ‘money‘: user_detail[3].strip(),
175             ‘status‘: 0  # 登录状态,未登录0,登录1
176         })
177
178 # 用户消费记录列表
179 record_user_crash = []
180 # ########################## 用户信息文件处理 end ##########################
181 # ########################## 商品信息文件处理 start ##########################
182 # 将商品信息从文件里面取出来,每行一个列表,存在列表里面
183 book_all_list = []
184 with open(‘goods.info‘, ‘r‘, encoding=‘utf-8‘) as f_goods:
185     for line in f_goods.readlines():
186         book_list = line.strip().split(‘---‘)
187         book_all_list.append(book_list)
188
189 # 定义空列表,用来存放展示的商品ID,由于可变;因此选择list
190 id_list = []
191 # 定义页码元组
192 pn_list = tuple(range(1, len(book_all_list) // 10 + 1))
193 # 定义用户操作行为元组
194 uc_tuple = (‘登录‘, ‘购物车‘)
195 uc_login_tup = (‘充值‘, ‘结账‘, ‘购物车‘, ‘退出‘)
196
197 # 定义缺省购物车
198 # 购物车设计
199 # default_goods_dic = {
200 #         ‘老男孩Mysql私房菜‘: 3
201 #     }
202 default_goods_dic = {}
203 # ########################## 商品信息文件处理 end ##########################
204 # main start
205 print(‘‘‘\n
206 欢迎来到老男孩购物商城
207 提示:
208     a. 您可以直接输入商品ID将商品加入购物车
209     b. 您也可以直接登录、查看购物车
210     c. 您也可以输入页码进行翻页
211 ‘‘‘)
212 print(‘商品首页‘)
213
214 page_num = 1
215 while True:
216     # 默认显示首页
217     show_ten_record(get_ten_record(book_all_list, page_num), page_num)
218
219     # 获取登录状态
220     res_auth = user_is_auth()
221
222     # 登录判断
223     if res_auth:
224         # 用户文件名 - 字符串
225         user_record_file = user_is_auth()[0] + ‘.info‘
226
227         # 一次性操作,登录后去掉登录显示
228         uc_temp = uc_login_tup
229         # 打印功能列表
230         for k, v in enumerate(uc_temp, 101):
231             print(‘{0}. {1}‘.format(k, v))
232
233         user_choice_num = input(‘\n欢迎你, ‘ + res_auth[0] + ‘ 请开始你的表演: ‘)
234     else:
235         # 未登录时,显示登录
236         uc_temp = uc_tuple
237         # 打印功能列表
238         for k, v in enumerate(uc_temp, 101):
239             print(‘{0}. {1}‘.format(k, v))
240
241         user_choice_num = input(‘\n游客,您好; 请开始你的表演: ‘)
242
243     if user_choice_num.isdigit():
244         user_num = int(user_choice_num)
245         if user_num in pn_list:
246             page_num = user_num
247             print(‘\n当前您正在浏览第 {} 页‘.format(page_num))
248         elif 100 < user_num < 105:
249             # 登录 默认显示
250             if uc_temp[user_num - 100 - 1] == ‘登录‘:
251                 print(‘login‘)
252                 flag = True
253                 # 退出次数
254                 exit_flag = 3
255                 # main process
256                 while flag:
257                     user_name = input("用户名: ")
258                     # 遍历用户信息列表
259                     for item in user_detail_list:
260                         # 判断用户名是否存在
261                         if user_name == item[‘name‘]:
262                             # 用户存在判断是否锁定
263                             if int(item[‘times‘]) < exit_flag:
264                                 user_pwd = input("密码: ")
265                                 # 校验密码
266                                 if user_pwd == item[‘pwd‘]:
267                                     print(‘登录成功\n\n‘)
268                                     # 更新字典
269                                     item[‘times‘] = 0
270                                     # 写入登录状态
271                                     item[‘status‘] = 1
272                                     # 更新while循环标志位
273                                     flag = False
274                                     # 退出for循环
275                                     break
276                                 else:
277                                     print(‘密码错误‘)
278                                     # 更新字典
279                                     item[‘times‘] = int(item[‘times‘]) + 1
280                                     # 退出for循环,继续输入用户名
281                                     break
282                             else:
283                                 print("用户已经锁定")
284                                 while True:
285                                     lock_choice = input(‘1. 更换账户\t2. 找回密码\n >> ‘)
286                                     if lock_choice.isdigit():
287                                         if int(lock_choice) == 1:
288                                             break
289                                         elif int(lock_choice) == 2:
290                                             if unlock_account(user_name):
291                                                 print(‘重置密码成功,请重新登录‘)
292                                                 break
293                                 break
294                     else:
295                         print(‘用户名不存在‘)
296
297             # 充值 登录后显示
298             if uc_temp[user_num - 101] == ‘充值‘:
299                 charge_money = input(‘请输入要充值的金额: ‘)
300                 if is_floated(charge_money):
301                     charge_money = float(charge_money)
302                     item_money = float(res_auth[2])
303                     item_money += charge_money
304                     user_detail_list[res_auth[-1]][‘money‘] = item_money
305                     print(‘您已成功充值%.2f元, 账户余额%.2f‘ % (charge_money, item_money))
306                 else:
307                     print(‘输入无效‘)
308
309             # 结账 登录后显示
310             if uc_temp[user_num - 101] == ‘结账‘:
311                 import time
312
313                 crash_money = 0
314                 if default_goods_dic:
315                     crash_money = show_card(default_goods_dic)
316                     if float(crash_money) > float(res_auth[2]):
317                         print(‘您本次消费总共:%.2f ;余额不足,您至少需要充值 %.2f 人民币!‘ % (crash_money, crash_money - float(res_auth[2])))
318                     else:
319                         user_detail_list[res_auth[-1]][‘money‘] = float(res_auth[2]) - crash_money
320                         print(‘您本次消费总共:%.2f ;\n\t\t账户余额: %.2f !‘ % (crash_money, float(res_auth[2]) - crash_money))
321                         # 将购物记录记录到文件
322                         for item in default_goods_dic:
323                             each_str = u‘{}在{}购买了{}本单价为{}人民币的{}\n‘.format(
324                                 user_is_auth()[0], time.strftime(‘%Y-%m-%d %H:%M:%S‘, time.localtime(time.time())),
325                                 default_goods_dic[item], get_price(item), item)
326                             record_user_crash.append(each_str)
327                         # 结账完毕,清空购物车
328                         default_goods_dic.clear()
329                 else:
330                     print(‘购物车为空‘)
331
332             # 查看购物车 默认显示
333             if uc_temp[user_num - 101] == ‘购物车‘:
334                 crash_money = 0
335                 if default_goods_dic:
336                     show_card(default_goods_dic)
337                     crash_choice = input(‘结账请先登录, 查询请输入S/s, 继续请回车‘)
338                     if crash_choice.lower() == ‘s‘:
339                         while True:
340                             sc_name = input(‘请输入要查询的商品名[支持模糊查询,退出请按Q/q]: ‘)
341                             if sc_name.lower() != ‘q‘:
342                                 for item in default_goods_dic.keys():
343                                     if sc_name.lower() in item.lower():
344                                         print(‘%.2f\t\t%d\t\t%.2f\t\t%s‘.expandtabs(20) % (
345                                             float(get_price(item)) * default_goods_dic[item], default_goods_dic[item],
346                                             float(get_price(item)), item))
347                             else:
348                                 break
349                 else:
350                     print(‘购物车为空‘)
351
352             # logout
353             if uc_temp[user_num - 101] == ‘退出‘:
354                 print(‘欢迎下次光临‘)
355                 break
356
357         elif user_num in id_list:
358             # # 添加商品到购物车,若未登录则添加到默认购物车dict,登录成功则创建用户自己的购物车dict
359             # 获取页码数
360             page_num = int(str(user_num)[-2]) + 1
361             # 获取商品列表下标
362             goods_index = int(str(user_num)[-1]) - 1
363             # 得到当前页当前id的商品信息 list
364             goods_info = get_ten_record(book_all_list, page_num)[goods_index]
365             # print(good_info)
366             # 往用户购物车添加记录,若无登录则使用default
367             if goods_info[0] not in default_goods_dic:
368                 default_goods_dic[goods_info[0]] = 1
369             else:
370                 default_goods_dic[goods_info[0]] += 1
371             print(‘\n提示: 您已成功将一本 {} 添加到购物车, 目前数量 {} 本‘.format(goods_info[0], default_goods_dic[goods_info[0]]))
372         else:
373             print(‘表演不满意,请重新开始你的表演\n‘)
374
375 # 最后,将用户信息写入文件
376 # 写入文件
377 with open(‘db‘, ‘w‘) as f_user:
378     for item in user_detail_list:
379         f_user.truncate()
380         item_str = ‘{name}|{pwd}|{times}|{money}|{status}\n‘.format_map(item)
381         # print(item_str)
382         f_user.writelines(item_str)
383
384 with open(user_record_file, ‘a‘) as uw_file:
385     uw_file.writelines(record_user_crash)
386
387 record_user_crash.clear()
时间: 2024-10-13 01:05:04

购物商城的相关文章

微信小程序购物商城系统开发系列-目录结构

上一篇我们简单介绍了一下微信小程序的IDE(微信小程序购物商城系统开发系列-工具篇),相信大家都已经蠢蠢欲试建立一个自己的小程序,去完成一个独立的商城网站. 先别着急我们一步步来,先尝试下写一个自己的小demo. 这一篇文章我们主要的是介绍一下小程序的一些目录结构,以及一些语法,为我们后面的微信小程序商城系统做铺垫. 首先我们来了解下小程序的目录结构 Pages 我们新建的一些页面将保存在这个文件夹下面,每一个小程序页面是由同路径下同名的四个不同后缀文件的组成,如:index.js.index.

Python学习day5作业-ATM和购物商城

Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用户间转帐 支持多用户 管理员可添加账户.指定用户额度.冻结用户等 购物车: 商品信息- 数量.单价.名称 用户信息- 帐号.密码.余额 用户可充值 购物历史信息 允许用户多次购买,每次可购买多件 余额不足时进行提醒 用户退出时 ,输出当次购物信息 用户下次登陆时可查看购物历史 商品列表分级显示 1

JAVA EE Demo[购物商城 Strust2]

为了搞定作业,我开始了J2EE的Strust2框架实现一个简单的商城Demo 先创建Java Web Service项目.添加JDBC驱动,导入Strust2框架得到这个: 啧啧.既然是购物商城我们继续沿用上篇文章的结构,欢迎页+商城物品列表+购物车+登录 ,则很明显我们需要一个导航栏 创建一个导航栏:head.html 这样我们以后就可以利用JSP标签将这个导航栏嵌入到任何需要的界面了 而导航栏的内容包括欢迎页 商城物品列表 购物车 登录 登出 这些选项 这个时候弄完这个先得到以下: 然后我们

hadoop实现购物商城推荐系统

1,商城:是单商家,多买家的商城系统.数据库是mysql,语言java. 2,sqoop1.9.33:在mysql和hadoop中交换数据. 3,hadoop2.2.0:这里用于练习的是伪分布模式. 4,完成内容:喜欢该商品的人还喜欢,相同购物喜好的好友推荐. 步骤: 1,通过sqoop从mysql中将 "用户收藏商品" (这里用的是用户收藏商品信息表作为推荐系统业务上的依据,业务依据可以很复杂.这里主要介绍推荐系统的基本原理,所以推荐依据很简单)的表数据导入到hdfs中. 2,用Ma

ATM:模拟实现一个ATM + 购物商城程序

额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接口,包括添加账户.用户额度,冻结账户等... 用户认证用装饰器

模拟实现一个ATM + 购物商城程序

作业需求: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 5.支持多账户登录 6.支持账户间转账 7.记录每月日常消费流水 8.提供还款接口 9.ATM记录操作日志 10.提供管理接口,包括添加账户.用户额度,冻结账户等 11.用户认证用装饰器 ATM交易中心: def make_transaction(arg, tran_type, amoun

python基础作业------模拟实现一个ATM + 购物商城程序

模拟实现一个ATM + 购物商城程序 作业需求: 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接口,包括添加账户.用户额度,冻结账户等... 用户认证用装饰器 ## ATM信用卡购物模拟程序 ### 作者介绍: * author:高原 ### 功能介绍: 模拟实现一

Python开发程序:ATM+购物商城

一.需求 1.模拟实现一个ATM + 购物商城程序 1).实现功能 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 5.支持多账户登录 6.支持账户间转账 7.记录每月日常消费流水 8.提供还款接口 9.ATM记录操作日志 10.提供管理接口,包括添加账户.用户额度,冻结账户等... 11.用户认证用装饰器 二.程序code 程序说明: ## AT

day2编写购物商城(1)

作业:购物商城 商品展示,价格 买,加入购物车 付款,钱不够     具体实现了如下功能: 1.可购买的商品信息显示 2.显示购物车内的商品信息.数量.总金额 3.购物车内的商品数量进行增加.减少和商品的删除 4.用户余额的充值 5.用户购买完成进行结账,将最终余额回写到用户文件中. 一.用户文件说明: kevin 123 50000 sky 123 54000 mobi 123 80000 其中第一列为用户名,第二列为密码,第三列为帐户余额. 二.流程图如下: import sys,os,ge

Day2作业: 购物商城

实现功能: 1用户登陆:用户名或密码错误判断 2商品清单展示 3查看购物车 4商品加入购物车并更新商品清单 5删除购物车中商品并更新商品清单 6查看已购买记录 7购物车商品支付 8支付时余额不足判断 9支付成功删除购物车中对应商品并更新已购买记录 10用户账户余额查看 11充值功能 涉及到4个文件作为库: goods_file   #商品清单1:小米5:1999:92:三星S7:4999:153:华为Mate8:3999:124:魅族pro6:2499:215:苹果6plus:5999:11 g