Python写的ATM程序

Posted litzhiai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python写的ATM程序相关的知识,希望对你有一定的参考价值。

需求说明:

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

  

程序说明:

主菜单,进入主菜单显示如下:

【1】购物商城 【2】用户中心 【3】信用卡中心 【4】后台管理 【5】登录系统 【6】退出

购物商城:

显示各种商品和价格,选择对应的序号进行购买

用户中心:

【1】修改密码 【2】额度查询 【3】消费记录 【4】返回

信用卡中心:

【1】额度查询    【2】提现    【3】转账     【4】还款    【5】返回

后台管理,主要是admin用户进行管理:

【1】创建用户 【2】冻结信用卡 【3】解冻用户

【4】额度调整 【5】退出后台管理

登录系统:

未登录的用户需要进行登录

代码结构

程序代码,主程序:

  1 #!/usr/bin/env python
  2 #-*- coding:utf-8 -*-
  3 # @Time    : 2017/10/19 22:18
  4 # @Author  : lichuan
  5 # @File    : creditcard.py
  6 
  7 from config import template
  8 import time
  9 from datetime import datetime
 10 from module import common
 11 import pickle
 12 from log import my_log_settings
 13 import logging
 14 from module.users import Users
 15 import os,sys
 16 
 17 
 18 #加在日志配置模块
 19 my_log_settings.load_my_logging_cfg()
 20 #访问日志logger,path=log/access.log
 21 acess_logger=logging.getLogger(__name__)
 22 #消费日志logger,path=log/shop.log
 23 shop_logger=logging.getLogger(\'shop\')
 24 
 25 #用户认证函数
 26 # @wraps
 27 def auth(func):
 28     \'\'\'
 29     用户是否已经登录的认证装饰器
 30     :param func:
 31     :return:
 32     \'\'\'
 33     def warpper(*args,**kwargs):
 34         import pickle
 35         # userinfo=pickle.loads(open(\'.json\',\'rb\').read())\\
 36         userinfos = load_user()
 37         if len(userinfos)!=0:
 38             func(*args,**kwargs)
 39         else:
 40             login()
 41             userinfos = load_user()
 42             if len(userinfos)!=0:
 43                 func(*args,**kwargs)
 44     return warpper
 45 
 46 @auth
 47 def shop_center():
 48     \'\'\'
 49     购物商城界面选择
 50     :return:
 51     \'\'\'
 52     shop={\'apple手机\':7000,\'魅族手机\':2000,\'小米手机\':2500,\'华为手机\':4000,\'小米笔记本\':4000}
 53     shop_list=[\'apple手机\',\'魅族手机\',\'小米手机\',\'华为手机\',\'小米笔记本\']
 54     salary=15000
 55     userinfo=load_user()
 56     # print(userinfo)
 57     buy_list={}
 58     salary=int(userinfo[\'salary\'])
 59     shop_flag=True
 60     while shop_flag:
 61         print(template.shopping_index_menu)
 62         choice=input(\'请选择:\').strip()
 63         if not choice.isdigit() or int(choice) not in range(1,7):
 64             print(\'输入错误,请重试!\')
 65             continue
 66         if int(choice) == 6:
 67             Users[userinfo[\'name\']]=userinfo
 68             dump_user(userinfo)
 69             print(\'退出购物商城,再见!\')
 70             break
 71         else:
 72             key=shop_list[int(choice)-1]
 73             money=shop[key]
 74             if money > salary:
 75                 print(\'剩余额度不够,请选择别的商品!\')
 76                 continue
 77             else:
 78                 salary=salary-money
 79                 username=userinfo[\'name\']
 80                 shop_logger.info(\'[%s]购买%s,花费%d元!\' % (username,key,money))
 81                 print(\'%s,价值%d元,已购买!\' % (key,money))
 82                 print(\'剩余额度:%d元\' % salary)
 83                 #更新信息到Users配置文件
 84                 userinfo[\'salary\']=salary
 85                 if key in buy_list:
 86                     buy_list[key]+=1
 87                 else:
 88                     buy_list[key] = 1
 89                 userinfo[\'buy_list\']=buy_list
 90                 Users[userinfo[\'name\']] = userinfo
 91                 common.update_users(Users)
 92 
 93 #从文件加载登录用户的信息
 94 def load_user():
 95     \'\'\'
 96     从文件加载登录用户的信息
 97     :return: userinfo信息
 98     \'\'\'
 99     try:
100         with open(\'.pkl\', \'rb\') as read_f:
101             userinfo = {}
102             userinfo = pickle.loads(read_f.read())
103             # print(userinfo)
104     except (FileNotFoundError,EOFError):
105         pass
106     return userinfo
107 
108 #将登录用户信息重新写入.pkl
109 def dump_user(users):
110     \'\'\'
111     将users信息重新写入.pkl文件进行保存。
112     :param users:users信息是个字典
113     :return:
114     \'\'\'
115     with open(\'.pkl\', \'w\'):
116         pass
117     with open(\'.pkl\', \'wb\') as read_f:
118         p = pickle.dumps(users)
119         read_f.write(p)
120 
121 #用户登录函数
122 def login():
123     \'\'\'
124     用户登录函数,对用户名密码进行校验,用户密码采用加密模块hashlib进行加盐加密
125     :return:
126     \'\'\'
127     err_count=0
128     login_flag=True
129     while login_flag:
130         username=input(\'please input your username: \').strip()
131         password=input(\'please input your password: \').strip()
132         if username in Users:
133             if Users[username][\'password\'] == common.encrypt(password) and Users[username][\'islocked\'] == 0:
134                 userinfo=Users[username]
135                 err_count = 0
136                 with open(\'.pkl\',\'wb\') as write_f:
137                     p=pickle.dumps(userinfo)
138                     write_f.write(p)
139                 acess_logger.info(str(username)+\' login success!\')
140                 print(str(username)+\' login success!\')
141                 login_flag=False
142             elif Users[username][\'islocked\'] != 0:
143                 print(\'user is locked ! cannot login!\')
144                 err_count = 0
145                 login_flag=False
146                 break
147             else:
148                 print(\'name or password is wrong!!!\')
149                 acess_logger.info(str(username)+\' login Falied ,password is wrong\')
150                 err_count+=1
151                 #错误登录3次以上,锁定用户
152                 if err_count >= 3:
153                     Users[username][\'islocked\']=1
154                     acess_logger.info(str(username)+\' user locked!\')
155                     print(str(username)+\' user locked!\')
156                     common.update_users(Users)
157                     break
158         else:
159             print(\'name or password is wrong!\')
160             # err_count+=1
161 
162 @auth
163 def user_center(today,weekday):
164     \'\'\'
165     用户登录后进入的用户个人中心界面
166     :param name:用户名称
167     :param today:
168     :param weekday:星期几
169     :return:
170     \'\'\'
171     center_flag=True
172     userinfo=load_user()
173     name=userinfo[\'name\']
174     while center_flag:
175         print(template.index_user_center.format(name,today,weekday))
176         choice=input(\'please input your choice:\').strip()
177         if not choice.isdigit() or int(choice) not in range(1,5):
178             print(\'input wrong,please try again!\')
179             continue
180         if int(choice) == 4:
181             print(\'用户中心和您再见!\')
182             center_flag=False
183             break
184         elif int(choice) == 1:
185             common.modify_passwd(userinfo)
186         elif int(choice) == 2:
187             query_salary()
188         elif int(choice) == 3:
189             buylist=common.buy_list(userinfo[\'name\'])
190             for b in buylist:
191                 print(b,end=\'\')
192 
193 #额度查询函数,显示信用卡基本信息
194 def query_salary():
195     status_all=[\'正常\',\'被锁定\']
196     userinfo=load_user()
197     salary=userinfo[\'salary\']
198     total_salary=userinfo[\'total_salary\']
199     cardno=userinfo[\'bindcard\']
200     name=userinfo[\'name\']
201     status=status_all[0] if userinfo[\'islocked\'] ==0  else status_all[1]
202     print(template.card_info.format(cardno,name,total_salary,salary,status))
203     # print(template.card_info.format(str(cardno),name,str(total_salary),str(salary),status))
204 
205 #转账函数
206 def forward_cash():
207     userinfo = load_user()
208     salary = userinfo[\'salary\']
209     u_card_no = userinfo[\'bindcard\']
210     card_list=[]
211     print(\'您现在剩余的可用额度为:%d\' %salary)
212     card_no=input(\'请输入对方的卡号:\').strip()
213     money=input(\'请输入转账的金额:\').strip()
214     if not money.isdigit():
215         print(\'金额输入有误!\')
216         return
217     for k in Users:
218         if Users[k][\'bindcard\'] != u_card_no:
219             card_list.append(Users[k][\'bindcard\'])
220     if card_no not in card_list:
221         print(\'卡号有误\')
222         return
223     if int(money) > salary:
224         print(\'转账金额超出你的信用额度!\')
225         return
226     #减去自己的额度
227     salary=salary-int(money)
228     userinfo[\'salary\']=salary
229     dump_user(userinfo)
230     Users[userinfo[\'name\']][\'salary\']=salary
231     #增加别人的额度
232     for k in Users:
233         if card_no == Users[k][\'bindcard\']:
234             Users[k][\'salary\']+=int(money)
235     common.update_users(Users)
236     print(\'[%s]转账%d元给%s,手续费%d元\' % (userinfo[\'name\'],int(money),card_no))
237     shop_logger.info(\'[%s]转账%d元给%s\' % (userinfo[\'name\'],int(money),card_no))
238 
239 #提现函数
240 def draw_cash():
241     cash=input(\'请输入提现金额:\').strip()
242     if not cash.isdigit() or int(cash) < 0:
243         print(\'金额输入错误!\')
244         return
245     userinfo=load_user()
246     salary=userinfo[\'salary\']
247     if int(cash) > salary:
248         print(\'你的额度是%s,额度不够!\' % salary)
249         return
250     else:
251         salary = salary - int(cash)*1.05
252         userinfo[\'salary\']=salary
253         dump_user(userinfo)
254         Users[userinfo[\'name\']][\'salary\'] = salary
255         common.update_users(Users)
256         query_salary()
257         shop_logger.info(\'[%s]取现%d元,手续费%d元!\' % (userinfo[\'name\'],int(cash),int(cash)*0.05))
258         print(\'[%s]取现%d元,手续费%d元!\' % (userinfo[\'name\'],int(cash),int(cash)*0.05))
259 
260 #信用卡还款
261 def repay_salary():
262     repay_money=input(\'请输入还款金额:\').strip()
263     if not repay_money.isdigit():
264         print(\'金额有误!\')
265         return
266     else:
267         repay_money=int(repay_money)
268     userinfo = load_user()
269     userinfo[\'salary\'] = userinfo[\'salary\']+repay_money
270     dump_user(userinfo)
271     Users[userinfo[\'name\']]=userinfo
272     common.update_users(Users)
273     query_salary()
274     shop_logger.info(\'[%s]还款%d元\' % (userinfo[\'name\'], repay_money))
275     print(\'[%s]还款%d元\' % (userinfo[\'name\'], repay_money))
276 
277 #信用卡中心程序
278 @auth
279 def card_center():
280     \'\'\'
281     信用卡中心程序
282     :return:
283     \'\'\'
284     func={
285         \'1\': query_salary,
286         \'2\': draw_cash,
287         \'3\': forward_cash,
288         \'4\': repay_salary,
289     }
290     card_flag=True
291     while card_flag:
292         #初始化打印信息
293         userinfo=load_user()
294         user_name=userinfo[\'name\']
295         card_no=userinfo[\'bindcard\']
296         print(template.index_card_center.format(user_name,card_no))
297         choice=input(\'请选择:\').strip()
298         if not choice.isdigit() or int(choice) not in range(1,6):
299             print(\'输入错误,请重试!\')
300             continue
301         if int(choice) == 5:
302             print(\'信用卡中心和您再见!\')
303             break
304         else:
305             func[choice]()
306 
307 
308 #后台管理程序
309 @auth
310 def manager():
311     func={
312         \'1\':common.create_card,
313         \'2\':common.lock_card,
314         \'3\':common.unlock_card,
315         \'4\':common.modify_salary,
316     }
317     userinfo=load_user()
318 

以上是关于Python写的ATM程序的主要内容,如果未能解决你的问题,请参考以下文章

python基础之ATM-1

python_项目_ATM和购物商城的程序

python 程序结构

python学习---购物商场与ATM

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

python3-模拟ATM_shopping