一、环境及程序功能说明
python 2.7.12模拟与银行ATM功能,主要功能如下:
1,登录查询余额
2,转账功能
3,提现功能
4,流水查询
5,密码修改
6,还款功能
7,退出(切换账号)
采用pickle存储账号密码相关信息,以账号名为日志文件名存储该账号的流水日志~
为了实现测试,先写一个提供测试文件的小脚本,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#coding:utf-8
import
pickle
import
time
import
os
IOSTIME
=
'%Y-%m-%d %X'
Now
=
time.strftime(IOSTIME,time.localtime())
Counts
=
{
'9168'
:[
'1234'
,
'0'
,
15000
,[Now]],
'9198'
:[
'4567'
,
'0'
,
10000
,[Now]],
'9999'
:[
'6789'
,
'1'
,
12000
,[Now]]}
bank_count
=
open
(
"banks_counts.pkl"
,
'w'
)
pickle.dump(Counts,bank_count)
os.chdir(
"."
)
for
log
in
Counts.keys():
os.popen(
"rm -rf %s"
%
log)
print
(
"测试数据已经生成:\n:%s"
%
Counts)
|
二、ATM系统实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
#!/usr/bin/env python
#coding=utf8
import
pickle
import
sys
import
time
import
os
IOSTIME
=
'%Y-%m-%d %X'
Now
=
time.strftime(IOSTIME,time.localtime())
reload
(sys)
sys.setdefaultencoding(
'utf-8'
)
##现在时间
def
NOW():
global
Now
Now
=
time.strftime(IOSTIME,time.localtime())
return
Now
##读入数据
with
open
(
'banks_counts.pkl'
) as bank_infos:
UserInfos
=
pickle.load(bank_infos)
print
UserInfos
##完成写入功能
def
Write_DB():
with
open
(
'banks_counts.pkl'
,
'w'
) as New_bank_infos:
pickle.dump(UserInfos,New_bank_infos)
#for userinfo in UserInfos.keys():
# print UserInfos[userinfo]
##查询金额
def
LookHow(HM):
print
"现在时间是: %s,银行余额: %s RMB!"
%
(NOW(),HM)
#提现功能
def
TakeCrash(HOW,WHO):
ShouXuFei
=
HOW
*
0.01
#手续费为1/100
if
(HOW
+
ShouXuFei) > WHO:
print
"余额不足提取!"
else
:
WHO
=
WHO
-
HOW
-
ShouXuFei
print
"您要提取的金额为:%s,手续费: %s,余额为:%s RMB!"
%
(HOW,ShouXuFei,WHO)
with
open
(UserCard,
'a+'
) as f:
f.write(
"%s:%s提款%s\n"
%
(NOW(),UserCard,HOW))
UserInfos[UserCard][
2
]
=
WHO
####转账功能
def
ZhuangZ(From,TO,How):
print
From,TO
if
How > From:
print
"%s 账号余额不足!"
%
How
else
:
From
=
From
-
How
TO
=
TO
+
How
print
"转出金额: %s RMB,余额为: %s RMB"
%
(How,From)
UserInfos[UserCard][
2
]
=
From
UserInfos[TO_Card][
2
]
=
TO
with
open
(UserCard,
"a+"
) as f1:
f1.write(
"%s:%s扣款%s,输出到:%s!\n"
%
(NOW(),UserCard,How,TO_Card))
with
open
(TO_Card,
"a+"
) as f2:
f2.write(
"%s:%s收到来自%s的%s款!\n"
%
(NOW(),TO_Card,UserCard,How))
###还款功能
def
AddMoney(HOW,WHO):
if
HOW >
0
:
print
(
"确定还款:%s"
%
HOW)
UserInfos[WHO][
2
]
=
UserInfos[WHO][
2
]
+
HOW
with
open
(WHO,
"a+"
) as f:
f.write(
"%s:还款%s\n"
%
(NOW(),HOW))
##流水查询
def
Logs(WHO):
if
os.path.isfile(os.path.join(os.getcwd(),WHO)):
with
open
(WHO,
'r'
) as f:
for
line
in
f.readlines():
else
:
print
(
"该账号还没有产生交易流水!"
)
##最后一次访问时间
def
LastAccess(WHO):
UserInfos[WHO][
3
]
=
NOW()
# Write_DB()
##密码修改
def
ChgPwd(WHO,NewPass):
UserInfos[WHO][
0
]
=
NewPass
print
(
"密码修改成功!"
)
Contex
=
[
"查询余额"
,
"转账"
,
"提现"
,
"流水"
,
"还款"
,
"修改密码"
,
"退出"
]
ErrorCount
=
0
while
ErrorCount <
3
:
for
userinfo
in
UserInfos.keys():
UserCard
=
raw_input
(
"[输入quit|exit退出系统]请输入您的银行卡:"
).strip()
# if UserCard == 'quit':sys.exit("您选择退出!")
if
UserCard
=
=
'':
continue
elif
UserCard
=
=
'quit'
or
UserCard
=
=
'exit'
:
sys.exit(
"您选择退出!"
)
elif
UserCard
not
in
UserInfos.keys():
print
(
"您输入的银行卡不存在!"
)
continue
# else:
# print("您输入的有误!")
UserPwd
=
raw_input
(
"[输入quit|exit退出系统]请输入您的密码:"
).strip()
if
UserPwd
=
=
'quit'
or
UserPwd
=
=
"exit"
:
sys.exit(
"您选择退出!"
)
try
:
if
UserInfos[UserCard][
1
] !
=
'0'
:
print
"%s 账号被锁定!"
%
UserCard
ErrorCount
+
=
1
continue
except
KeyError:
print
"%s 账号不存在!"
%
UserCard
ErrorCount
+
=
1
continue
if
len
(UserPwd)
=
=
0
or
UserPwd !
=
UserInfos[UserCard][
0
]:
print
"密码错误!"
ErrorCount
+
=
1
continue
else
:
print
"%s 登录成功!您最后一次访问在: %s"
%
(UserCard,UserInfos[UserCard][
3
])
LastAccess(UserCard)
#登录成功,写入访问时间
while
True
:
print
((
"请选择你需要的服务:"
).center(
90
,
"+"
))
print
for
i
in
range
(
len
(Contex)):
print
i,Contex[i].decode(
"utf-8"
),
'\t'
,
print
print
(
"+"
*
80
+
'\n'
)
choice
=
raw_input
(
"[按6或输入quit退出系统]请选择您的业务编号:"
)
if
len
(choice)
=
=
0
:
continue
elif
choice
=
=
'quit'
or
int
(choice)
=
=
6
:
Write_DB()
print
(
"您选择退出系统!"
)
break
elif
int
(choice)
=
=
0
:
LookHow(UserInfos[UserCard][
2
])
elif
int
(choice)
=
=
1
:
TO_Card
=
raw_input
(
"请输入对方银行卡:"
).strip()
if
len
(TO_Card)
=
=
0
or
TO_Card
=
=
UserInfos[UserCard]:
print
"账号错误!"
continue
HowZ
=
raw_input
(
"输入转账金额:"
).strip()
if
len
(HowZ)
=
=
0
:
print
"转账金额不能为0!"
try
:
UserInfos[TO_Card]
except
KeyError:
print
"对方账号: %s 不存在!"
%
TO_Card
continue
else
:
UserInfos[TO_Card][
2
]
=
int
(UserInfos[TO_Card][
2
])
ZhuangZ(UserInfos[UserCard][
2
],UserInfos[TO_Card][
2
],
int
(HowZ))
elif
int
(choice)
=
=
2
:
HowTake
=
raw_input
(
"请选择提取金额:"
)
HowTake
=
int
(HowTake)
TakeCrash(HowTake,UserInfos[UserCard][
2
])
Write_DB()
elif
int
(choice)
=
=
4
:
# print UserCard
HowAdd
=
int
(
raw_input
(
"请输入您要还款的金额:"
))
AddMoney(HowAdd,UserCard)
Write_DB()
elif
int
(choice)
=
=
3
:
Logs(UserCard)
elif
int
(choice)
=
=
5
:
NewPass
=
raw_input
(
"请输入新的密码:"
)
NewPass2
=
raw_input
(
"请再输入一次新密码:"
)
if
NewPass
=
=
NewPass2:
ChgPwd(UserCard,NewPass)
Write_DB()
else
:
sys.exit(
"两次输入的密码不一致!退出密码修改!"
)
else
:
print
(
"你的账号已锁,请到柜台解锁!"
)
UserInfos[UserCard][
1
]
=
'1'
UserInfos[UserCard][
3
]
=
NOW()
Write_DB()
|
三、功能测试如
$python creat_bank.py
$ python looks_bank.py
四、所有文件如下
$ls -alh
写着用来练习,如有错误之处欢迎指正,交流!
本文转自 dyc2005 51CTO博客,原文链接:http://blog.51cto.com/dyc2005/1944150,如需转载请自行联系原作者