购物车程序要求:

1.允许用户根据商品编号购买商品。

2.用户选择商品后,检测余额是否充足,够就直接扣款,不够就提醒。

3.可随时推出,退出时打印以购买商品,购买商品数量及余额。

ATM程序要求:

1.管理账户,添加账户保存到文件。

2.还款、查余额、提款、冻结账户。

3.从购物车收到付款要求时付款。

改进:

1.主要函数保存在core文件中,bin文件中保存入口文件

2.编写账户密码验证和冻结验证函数,之后再由各模块调用

3.美化输出

目录结构:

ATM入口程序:

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:James Tao
 4 
 5 import os
 6 import sys
 7 import pickle
 8 
 9 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
10 
11 #调用程序
12 core_DIR = BASE_DIR + '\\' + 'core'
13 sys.path.append(core_DIR)# 添加环境变量
14 
15 
16 
17 while True:
18     menu=input('''
19 请输入对应序号选择功能:
20 1.注册
21 2.查账单
22 3.支付
23 4.还款
24 5.提款
25 6.冻结
26 输入其它退出
27     ''')
28 
29     if menu=='1':
30 
31         #注册
32         from atmfunction import register
33         register()
34 
35     elif menu=='2':
36         from atmfunction import check
37 
38         check()
39 
40 
41     elif menu=='3':
42 
43         r_money = open(BASE_DIR + '\\' + 'docs' + '\\' + 'money' + '.txt', 'rb')
44         list_money = pickle.load(r_money)
45         r_money.close()
46 
47         money=list_money[0]
48         print('您需要支付的金额为:',money)
49 
50         from atmfunction import pay
51         pay(money)
52 
53         exit()
54 
55     elif menu=='4':
56 
57         repaymoney=int(input('请输入您要还款的金额:'))
58 
59         from atmfunction import repay
60 
61         repay(repaymoney)
62 
63     elif menu=='5':
64 
65         drawmoney=int(input('请输入提款金额:'))
66 
67         from atmfunction import draw
68 
69         draw(drawmoney)
70 
71     elif menu=='6':
72 
73         from atmfunction import freeze
74 
75         freeze()
76 
77 
78     else:
79         exit()

账号密码验证和冻结验证程序:

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:James Tao
 4 import os
 5 import sys
 6 
 7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 8 
 9 def useraccess(name,passwd):
10 
11     atmuser = name
12     atmpasswd = passwd
13 
14     # 判断账户是否被冻结
15     if os.path.exists(BASE_DIR + '\\' + 'docs' + '\\' + 'atmfreezeuser' + '.txt'):
16 
17         # 读取冻结账户文件内账户
18         r_freezeuser = open(BASE_DIR + '\\' + 'docs' + '\\' + 'atmfreezeuser' + '.txt', 'rb')
19         freezeuser = pickle.load(r_freezeuser)
20         r_freezeuser.close()
21 
22         if atmuser in freezeuser:
23             # 如果账户被冻结直接退出函数
24             print('该账户已被冻结')
25             return False
26 
27     # 验证用户是否存在
28     if os.path.exists(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atmpasswd' + '.txt'):
29         # 读出用户信息,登陆密码
30         r_atmuser_passwd = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atmpasswd' + '.txt', 'rb')
31         read_atmuser_passwd = pickle.load(r_atmuser_passwd)
32         r_atmuser_passwd.close()
33 
34         # 判断输入的账号是否存在密码是否正确
35         if atmuser in read_atmuser_passwd and atmpasswd == read_atmuser_passwd[atmuser]:
36             return True
37         else:
38             print('密码错误!')
39             return False
40     else:
41         print('账户不存在!')
42         return False

ATM功能程序:

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 # Author:James Tao
  4 
  5 import os
  6 import sys
  7 import pickle
  8 
  9 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 10 
 11 #将登陆验证地址加入系统环境变量
 12 core_DIR=BASE_DIR+'\\'+'core'
 13 sys.path.append(core_DIR)
 14 
 15 #注册装饰器
 16 def register_wrapper(func):
 17     def wrapper(*args, **kwargs):
 18 
 19         atmuser = input('请输入用户名(由字母数字下划线组成):')
 20         atmpasswd = input('请输入密码(由字母数字下划线组成):')
 21 
 22         # 将用户密码存入字典
 23         atm_passwd = {}
 24         atm_passwd[atmuser] = atmpasswd
 25 
 26         # 将用户密码字典写入文件
 27         w_atm_passwd = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atmpasswd' + '.txt', 'wb')
 28         pickle.dump(atm_passwd, w_atm_passwd)
 29         w_atm_passwd.close()
 30 
 31         # 将用户信息存入字典
 32         atmuser_info = {}
 33         atmuser_info['balance'] = 50000
 34 
 35         print('''用户{_atmuser}恭喜您注册成功,您的信用卡账户余额为{_balance}元。
 36                     '''.format(_atmuser=atmuser, _balance=atmuser_info['balance']))
 37 
 38         # 将用户信息字典写入文件
 39         w_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'wb')
 40         pickle.dump(atmuser_info, w_atmuser_info)
 41         w_atmuser_info.close()
 42 
 43     return wrapper
 44 
 45 @register_wrapper
 46 def register():
 47     pass
 48 
 49 
 50 #登陆装饰器
 51 def check_wrapper(func):
 52     def wrapper(*args,**kwargs):
 53 
 54         atmuser = input('请输入用户名:')
 55         atmpasswd = input('请输入密码:')
 56 
 57         # 账户冻结和密码验证
 58         from atmuseraccess import useraccess
 59         login = useraccess(atmuser,atmpasswd)
 60 
 61         # 判断账户是否验证成功
 62         if login:
 63             # 读出用户信息,显示账户余额
 64             r_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'rb')
 65             read_atmuser_info = pickle.load(r_atmuser_info)
 66             r_atmuser_info.close()
 67 
 68             need_repay=50000-read_atmuser_info['balance']
 69 
 70             # 显示账户余额
 71             print('''
 72 -----用户{_atmuser}登陆成功!您的账户信息如下-----\n
 73 可用余额:{_balance}元\n
 74 需还款金额:{_needrepay}元
 75                 '''.format(_atmuser=atmuser, _balance=read_atmuser_info['balance'],_needrepay=need_repay))
 76 
 77 
 78     return wrapper
 79 
 80 @check_wrapper
 81 def check():
 82     pass
 83 
 84 #支付
 85 def pay_wrapper(func):
 86     def wrapper(*args,**kwargs):
 87 
 88         print('您好!请登录ATM!')
 89         atmuser = input('请输入用户名:')
 90         atmpasswd = input('请输入密码:')
 91 
 92         # 账户冻结和密码验证
 93         from atmuseraccess import useraccess
 94         login = useraccess(atmuser,atmpasswd)
 95 
 96         #验证成功
 97         if login:
 98             # 读出用户信息,显示账户余额
 99             r_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'rb')
100             read_atmuser_info = pickle.load(r_atmuser_info)
101             r_atmuser_info.close()
102 
103             # 显示账户余额
104             print('''用户{_atmuser}登陆成功,您的账户余额为{_balance}元。
105             '''.format(_atmuser=atmuser, _balance=read_atmuser_info['balance']))
106 
107             paymoney = args[0]
108             print('您需要付款的金额为:%s元' % paymoney)
109             if paymoney <= read_atmuser_info['balance']:
110 
111                 pay_or_out = input('确定付款请输入Y:')
112                 if pay_or_out=='Y':
113 
114                     #计算余额
115                     balance=read_atmuser_info['balance']-paymoney
116 
117                     # 将用户信息存入字典
118                     atmuser_info = {}
119                     atmuser_info['balance'] = balance
120 
121                     #存入文件
122                     w_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'wb')
123                     pickle.dump(atmuser_info, w_atmuser_info)
124                     w_atmuser_info.close()
125 
126                     #支付成功更改支付成功中间文件
127                     pay_accomplished=['accomplished']
128                     w_pay_accomplished=open(BASE_DIR + '\\' + 'docs' + '\\' + 'pay_accomplish' + '.txt', 'wb')
129                     pickle.dump(pay_accomplished, w_pay_accomplished)
130                     w_pay_accomplished.close()
131 
132                 else:
133                     print('验证失败!')
134 
135             else:
136                 print('支付失败!原因:余额不足!')
137     return wrapper
138 
139 @pay_wrapper
140 def pay():
141     pass
142 
143 #还款
144 def repay_wrapper(func):
145     def wrapper(*args,**kwargs):
146 
147         print('您好!请登录ATM!')
148         atmuser = input('请输入用户名:')
149         atmpasswd = input('请输入密码:')
150 
151         # 账户冻结和密码验证
152         from atmuseraccess import useraccess
153         login = useraccess(atmuser,atmpasswd)
154 
155         #验证成功
156         if login:
157 
158             # 读出用户信息,显示账户余额
159             r_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'rb')
160             read_atmuser_info = pickle.load(r_atmuser_info)
161             r_atmuser_info.close()
162 
163             # 显示账户余额和需还款金额
164             need_repaymoney=50000-read_atmuser_info['balance']
165             print('''
166 -----用户{_atmuser}登陆成功,您的账户信息如下-----
167 可用余额:{_balance}元\n
168 需还款金额:{_needrepaymoney}元
169                     '''.format(_atmuser=atmuser, _balance=read_atmuser_info['balance'],_needrepaymoney=need_repaymoney))
170 
171 
172             repaymoney = args[0]
173             print('您将要还款的金额为:%s元' % repaymoney)
174             if repaymoney <= need_repaymoney:
175 
176                 repay_or_out = input('确定还款请输入Y:')
177                 if repay_or_out == 'Y':
178 
179                     # 计算余额
180                     balance = read_atmuser_info['balance'] + repaymoney
181 
182                     # 将用户信息存入字典
183                     atmuser_info = {}
184                     atmuser_info['balance'] = balance
185 
186                     # 存入文件
187                     w_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'wb')
188                     pickle.dump(atmuser_info, w_atmuser_info)
189                     w_atmuser_info.close()
190 
191                     print('还款成功!')
192 
193                 else:
194                     print('验证失败!')
195 
196             else:
197                 print('还款失败!原因:超出需还款金额!')
198 
199 
200 
201 
202     return wrapper
203 
204 @repay_wrapper
205 def repay():
206     pass
207 
208 #提款
209 def draw_wrapper(func):
210     def wrapper(*args,**kwargs):
211 
212         print('您好!请登录ATM!')
213         atmuser = input('请输入用户名:')
214         atmpasswd = input('请输入密码:')
215 
216         # 账户冻结和密码验证
217         from atmuseraccess import useraccess
218         login = useraccess(atmuser,atmpasswd)
219 
220         #验证成功
221         if login:
222 
223             # 读出用户信息,显示账户余额
224             r_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'rb')
225             read_atmuser_info = pickle.load(r_atmuser_info)
226             r_atmuser_info.close()
227 
228             # 显示账户可提款金额
229             can_drawmoney = read_atmuser_info['balance']/2.00
230             print('''
231 -----用户{_atmuser}登陆成功,您的账户信息如下-----
232 可用余额:{_balance}元\n
233 可提款金额:{_candrawmoney}元
234                      '''.format(_atmuser=atmuser, _balance=read_atmuser_info['balance'],_candrawmoney=can_drawmoney))
235 
236             drawmoney = args[0]
237             print('您将要提款的金额为:%s元' % drawmoney)
238             if drawmoney <= can_drawmoney:
239 
240                 draw_or_out = input('确定提款请输入Y:')
241                 if draw_or_out == 'Y':
242 
243                     # 计算余额
244                     balance = read_atmuser_info['balance'] - drawmoney
245 
246                     # 将用户信息存入字典
247                     atmuser_info = {}
248                     atmuser_info['balance'] = balance
249 
250                     # 存入文件
251                     w_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'wb')
252                     pickle.dump(atmuser_info, w_atmuser_info)
253                     w_atmuser_info.close()
254 
255                     print('提款成功!')
256 
257                 else:
258                     print('验证失败!')
259 
260             else:
261                 print('提款失败!原因:超出可提款金额!')
262 
263     return wrapper
264 
265 @draw_wrapper
266 def draw():
267     pass
268 
269 #冻结账户
270 def freeze_wrapper(func):
271     def wrapper(*args,**kwargs):
272 
273         print('您好!请登录ATM!')
274         atmuser = input('请输入用户名:')
275         atmpasswd = input('请输入密码:')
276 
277         # 账户冻结和密码验证
278         from atmuseraccess import useraccess
279         login = useraccess(atmuser,atmpasswd)
280 
281         #验证成功
282         if login:
283             # 读出用户信息,显示账户余额
284             r_atmuser_info = open(BASE_DIR + '\\' + 'docs' + '\\' + atmuser + 'atminfo' + '.txt', 'rb')
285             read_atmuser_info = pickle.load(r_atmuser_info)
286             r_atmuser_info.close()
287 
288             print('''用户{_atmuser}登陆成功,您的账户可用余额为{_balance}元。
289                 '''.format(_atmuser=atmuser, _balance=read_atmuser_info['balance']))
290 
291             freeze_or_not=input('是否确认冻结账户?输入Y确认')
292             if freeze_or_not=='Y':
293 
294                 # 将用户名写入文件,每次登陆读取该文件确认是否被冻结
295 
296                 #先判断冻结账户文件是否存在
297                 if os.path.exists(BASE_DIR + '\\' + 'docs' + '\\' +  'atmfreezeuser' + '.txt'):
298 
299                     #读取冻结账户文件内账户
300                     r_freezeuser = open(BASE_DIR + '\\' + 'docs' + '\\' + 'atmfreezeuser' + '.txt', 'rb')
301                     freezeuser=pickle.load(r_freezeuser)
302                     r_freezeuser.close()
303 
304                     freezeuser_list=freezeuser.append(atmuser)
305 
306                     #将用户写入冻结账户文件
307                     w_freezeuser = open(BASE_DIR + '\\' + 'docs' + '\\' + 'atmfreezeuser' + '.txt', 'wb')
308                     pickle.dump(freezeuser_list,w_freezeuser)
309                     w_freezeuser.close()
310 
311                 else:
312                     freezeuser_list=[atmuser]
313 
314                     # 将用户写入冻结账户文件
315                     w_freezeuser = open(BASE_DIR + '\\' + 'docs' + '\\' + 'atmfreezeuser' + '.txt', 'wb')
316                     pickle.dump(freezeuser_list, w_freezeuser)
317                     w_freezeuser.close()
318 
319                 print('冻结成功!可联系银行工作人员解冻!')
320 
321             else:
322                 print('验证失败!您的账户未被冻结!')
323 
324     return wrapper
325 
326 @freeze_wrapper
327 def freeze():
328     pass

购物主程序:

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 # Author:James Tao
  4 
  5 #登陆
  6 import os
  7 import sys
  8 import pickle
  9 
 10 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 11 
 12 #添加商品
 13 shoppinggoods=[
 14     ['iphone',5800],
 15     ['Mac',12000],
 16     ['Book',50],
 17     ['Bike',800],
 18     ['Coffee',30],
 19 ]
 20 
 21 w_seller_shoppinggoods = open(BASE_DIR+'\\'+'docs'+'\\'+'shoppinggoods.txt', 'wb')
 22 pickle.dump(shoppinggoods, w_seller_shoppinggoods)
 23 w_seller_shoppinggoods.close()
 24 
 25 new_or_existuser = input('''
 26 请输入序号选择功能:
 27 1.注册
 28 2.登陆
 29 输入其它退出
 30 ''')
 31 
 32 # --------------------------------新用户注册输入薪水---------------------------------
 33 if new_or_existuser == '1':
 34     buyername = input('请输入用户名(由字母数字下划线组成):')
 35     buyerpasswd = input('请输入密码(由字母数字下划线组成):')
 36 
 37     # 将用户密码存入字典
 38     user_passwd = {}
 39     user_passwd[buyername] = buyerpasswd
 40 
 41     # 将用户密码字典写入文件
 42     w_user_passwd = open(BASE_DIR+'\\'+'docs'+'\\'+buyername + 'passwd' + '.txt', 'wb')
 43     pickle.dump(user_passwd, w_user_passwd)
 44     w_user_passwd.close()
 45 
 46     # 将用户信息存入字典
 47     user_info = {}
 48     user_info[buyername] = {'boughtgoods': []}
 49 
 50     # 将用户信息字典写入文件
 51     w_user_info = open(BASE_DIR+'\\'+'docs'+'\\'+buyername + 'info' + '.txt', 'wb')
 52     pickle.dump(user_info, w_user_info)
 53     w_user_info.close()
 54 
 55     # 将用户信息暂时导入到temp_user_info里
 56     temp_user_info = user_info
 57 
 58 
 59 
 60 # ------------------------------旧用户登陆并导入用户信息-------------------------------
 61 elif new_or_existuser == '2':
 62 
 63     while True:
 64         buyername = input('请输入用户名:')
 65         buyerpasswd = input('请输入密码:')
 66 
 67         # 读出用户信息,登陆密码
 68         r_user_passwd = open(BASE_DIR+'\\'+'docs'+'\\'+buyername + 'passwd' + '.txt', 'rb')
 69         read_user_passwd = pickle.load(r_user_passwd)
 70         r_user_passwd.close()
 71 
 72         # 判断输入的账号是否存在密码是否正确
 73         if buyername in read_user_passwd and buyerpasswd == read_user_passwd[buyername]:
 74 
 75             #判断用户是否购买过商品
 76 
 77             # 读出用户信息,已购买商品
 78             r_user_info = open(BASE_DIR+'\\'+'docs'+'\\'+buyername + 'info' + '.txt', 'rb')
 79             read_user_info = pickle.load(r_user_info)
 80             r_user_info.close()
 81 
 82             if read_user_info[buyername]['boughtgoods']:
 83                 # 打印用户信息,余额、已购买商品
 84                 print('用户%s您好' % buyername)
 85                 print('------您已够买以下商品------')
 86                 for i in read_user_info[buyername]['boughtgoods']:
 87                     print(i)
 88 
 89                 # 将用户信息暂时导入到temp_user_info里
 90                 temp_user_info = read_user_info
 91                 break
 92             else:
 93                 print('您还未购买任何商品')
 94                 temp_user_info={}
 95                 temp_user_info[buyername] = {'boughtgoods': []}
 96                 break
 97 
 98         else:
 99             print('用户名不存在或密码错误,请重新登录')
100 
101 else:
102     exit()
103 
104 # 用户注册或登陆之后已经有了用户信息,包括用户名、薪水或余额、已购买商品存在temp_user_info字典里
105 
106 # 从文件中读出商品信息
107 r_shoppinggoods = open(BASE_DIR+'\\'+'docs'+'\\'+'shoppinggoods.txt', 'rb')
108 read_shoppinggoods = pickle.load(r_shoppinggoods)
109 r_shoppinggoods.close()
110 
111 dict_of_bought = {}
112 
113 # 从字典temp_user_info读出用户信息,包括用户名、薪水或余额、已购买商品(以购买商品用数列存储)
114 list_of_bought = temp_user_info[buyername]['boughtgoods']  # 总购买商品用数列存储
115 new_list_of_bought = []#此次购买商品用数列存储
116 money=0
117 
118 # ---------------------------------开始购买流程-------------------------------------
119 while True:
120 
121     # 输出商品及其编号
122     print('--------支持购买的商品-------')
123     for index, item in enumerate(read_shoppinggoods):  # enumerate取出下标
124         print(index, item)
125         # print(read_shoppinggoods.index(item),item)
126     choice_of_user = input('选择购买商品编号\输入q退出:')
127 
128     #判断输入是否合法
129     if choice_of_user.isdigit():
130         choice_of_user = int(choice_of_user)
131 
132         # 判断编号是否有对应商品
133         if 0 <= choice_of_user < len(read_shoppinggoods):
134 
135             # 加入购物清单
136             list_of_bought.append(read_shoppinggoods[choice_of_user][0])#总购买商品清单
137             new_list_of_bought.append(read_shoppinggoods[choice_of_user][0])#此次购买商品清单
138 
139             # 计算余额`
140             money += read_shoppinggoods[choice_of_user][1]
141 
142             print('''添加{_boughtgood}到您的购物车,该商品价格为{_price}元。
143                 '''.format(_boughtgood=read_shoppinggoods[choice_of_user][0], _price=read_shoppinggoods[choice_of_user][1]))
144 
145         else:
146             print('商品不存在')
147 
148     elif choice_of_user == 'q':
149 
150         # 统计购买的商品及数量
151         category_of_bought = set(new_list_of_bought)
152         for item in category_of_bought:
153             dict_of_bought[item] = list_of_bought.count(item)
154         print('您购买的商品及数量分别为', dict_of_bought)
155 
156         print('您已消费%s元。' % money)
157 
158         #判断new_list_of_bought内是否有商品
159         if new_list_of_bought:
160             #开始付款
161             pay_trueorfalse=True
162             payment = input('是否付款?(输入p付款\输入其他退出):')
163 
164 
165             while pay_trueorfalse:
166 
167                 if payment=='p':
168 
169                     #调用atm.py程序
170                     bin_DIR = BASE_DIR + '\\' + 'bin'
171                     sys.path.append(bin_DIR)# 添加环境变量
172                     from atmfunction import pay
173                     pay(money)
174 
175                     # 判断支付是否成功
176                     #读取中间文件
177                     r_pay_accomplished = open(BASE_DIR + '\\' + 'docs' + '\\' + 'pay_accomplish' + '.txt', 'rb')
178                     pay_accomplished=pickle.load(r_pay_accomplished)
179                     r_pay_accomplished.close()
180 
181 
182                     #若成功
183                     if pay_accomplished[0]=='accomplished':
184 
185                         print('支付成功!')
186 
187                         #将用户余额和购买商品更新存入字典
188                         temp_user_info[buyername] = {'boughtgoods': list_of_bought}
189 
190                         #将购买商品更新写入文件
191                         w_user_userinfo = open(BASE_DIR+'\\'+'docs'+'\\'+buyername + 'info' + '.txt', 'wb')
192                         pickle.dump(temp_user_info, w_user_userinfo)
193                         w_user_userinfo.close()
194 
195                         #更改中间文件用于下次验证
196                         pay_accomplished = ['un_accomplished']
197                         w_pay_accomplished = open(BASE_DIR + '\\' + 'docs' + '\\' + 'pay_accomplish' + '.txt', 'wb')
198                         pickle.dump(pay_accomplished,w_pay_accomplished)
199                         w_pay_accomplished.close()
200 
201                         exit()
202 
203                     else:
204                         payment = input('支付失败!(输入P重新付款\输入其他退出):')
205 
206                 else:
207                     print('验证失败!已退出支付!')
208                     exit()
209         else:
210             exit()
211 
212     else:
213         print('输入不合法')

 

posted on 2018-10-27 12:01  研究僧桃子  阅读(354)  评论(0编辑  收藏  举报