一、简单说明
1、源代码文件见附件 Credit.zip
2、关于转账功能,因时间问题,转账功能待续
4、逻辑图
二、代码
1、包encryption中的(password.py文件)
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
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 10 14:47:29 2016
密码相关功能
@author: toby
"""
import
hashlib, re
#密码进行MD5加密
def
md5(passwd):
hashs
=
hashlib.md5()
#创建MD5对象
hashs.update(passwd)
#生成加密串
return
hashs.hexdigest()
#获取加密串
#密码位数检测,只能是6位数字
def
check_digit(passwd):
com
=
re.
compile
(
'^\d{6,6}$'
)
temps
=
com.findall(passwd)
if
len
(temps)
=
=
0
:
return
False
else
:
return
True
#检测银行卡号位数
def
check_card(card):
com
=
re.
compile
(
'^\d{16,16}$'
)
temps
=
com.findall(card)
if
len
(temps)
=
=
0
:
return
False
else
:
return
True
|
2、applys.py
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
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 10 14:42:29 2016
卡号申请程序
@author: toby
"""
from
encryption
import
password
import
shelve, random, getpass, time
#申请资格评估
def
ssessment(income,age):
if
income >
=
3000
and
age >
=
22
and
age <
60
:
return
True
else
:
return
False
#确定额度
def
quota(money):
if
money >
3000
and
money <
6000
:
return
5000
if
money >
6000
and
money <
10000
:
return
10000
if
money >
10000
and
money <
20000
:
return
15000
#生成卡号
def
carid():
carid
=
""
for
i
in
range
(
16
):
temp
=
random.randint(
0
,
9
)
carid
+
=
str
(temp)
return
carid
#新申请的用户数据入库
def
examine(key,val):
data
=
shelve.
open
(
'data.db'
)
data[key]
=
val
if
__name__
=
=
"__main__"
:
print
'''
信用卡申请资格评估
'''
income
=
input
(
'月收入:'
)
age
=
input
(
'年龄:'
)
#评估申请资格
if
ssessment(income,age)
=
=
False
:
print
'评估结果:无申请资格'
else
:
print
'''
评估结果:可申请
请填写详细资料
'''
name
=
raw_input
(
'姓名:'
)
card
=
raw_input
(
'身份证:'
)
phone
=
raw_input
(
'手机:'
)
address
=
raw_input
(
'地址:'
)
#根据条件自动生成固定额度
fixed_amount
=
quota(income)
#调用自动生成额度函数
#初次申请卡号,初始记录还款的key为0
repayment_amount
=
0
#初始化还款金额,首次为0元
#自动生成卡号
kaid
=
carid()
#调用自动生成16位卡号函数
while
True
:
passwd1
=
getpass.getpass(
'设置密码:'
)
passwd2
=
getpass.getpass(
'确认密码:'
)
if
passwd1 !
=
passwd2:
print
'密码不一致'
continue
if
password.check_digit(passwd1)
=
=
False
:
#检测密码合法性
print
'只能输入6位数字密码'
continue
else
:
print
'------卡号申请成功!------'
print
'卡号为: %s'
%
kaid
print
'可用额度: %s'
%
fixed_amount
date
=
time.strftime(
'%Y-%m-%d %H:%M:%S'
)
#记录申请时间
repayment_time
=
time.strftime(
'%Y-%m-%d'
)
#申请通过当天日期为还款日
passwd_data
=
password.md5(passwd1)
#密码使用MD5加密
temp
=
{
'date'
:date,
'name'
:name,
'age'
:age,
'income'
:income,
'card'
:card,
'phone'
:phone,
'address'
:address,
'passwd'
:passwd_data,
'fixed_amount'
:fixed_amount,
'temp_money'
:
int
(fixed_amount),
'repayment_amount'
:repayment_amount,
'repayment_time'
:repayment_time}
examine(kaid,temp)
#调用数据入库函数进行将新申请的数据存入模拟数据库
break
|
3、login.py
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
|
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 11 21:35:04 2016
模拟取款机登录入口程序
@author: toby
"""
from
encryption
import
password
import
getpass
from
data_function
import
*
if
__name__
=
=
"__main__"
:
try
:
while
True
:
print
'''
------银行系统登录入口------
'''
card_number
=
raw_input
(
'卡号:'
)
card_password
=
getpass.getpass(
'口令:'
)
if
password.check_card(card_number)
=
=
False
:
print
'卡号位数不正确,请仔细输入'
continue
if
check_card_active(card_number)
=
=
False
:
print
'对不起,该卡号不存在'
continue
if
password.check_digit(card_password)
=
=
False
:
print
'密码无效'
continue
passwd_md5
=
password.md5(card_password)
#将输入的密码进行加密,用于和数据库中的md5密码匹配
db_passwd
=
get_data(card_number,
'passwd'
)
#从数据库读取对应卡号的密码
if
passwd_md5 !
=
db_passwd:
#输入的密码进行加密后和从数据库中读取的MD5密码串进行配对
print
'密码错误'
continue
else
:
while
True
:
print
'''
XX银行欢迎您
1 ----------------- 取现
2 ----------------- 查询
3 ----------------- 还款
4 ----------------- 转账
5 ----------------- 退出
'''
main_menu
=
input
(
'选择您需要的操作(1-5):'
)
if
main_menu
=
=
1
:
cash_amount
=
input
(
'取款金额:'
)
print
'''
温馨提示:信用卡取现需收取5%手续费
'''
action
=
raw_input
(
'是否继续套现(y/n):'
)
if
action
=
=
'y'
:
if
cash_debit(card_number,
int
(cash_amount)):
#调用套现接口
print
'请提取现金'
continue
else
:
print
'机器故障,无法提取'
break
if
action
=
=
'no'
:
continue
if
main_menu
=
=
2
:
print
'''
1 ----------------- 查询余额
2 ----------------- 查询明细
'''
sub_menu
=
input
(
'选择您需要的操作(1-2):'
)
if
sub_menu
=
=
1
:
get_all_data(card_number)
action
=
raw_input
(
'是否返回主菜单(y):'
)
if
action
=
=
'y'
:
continue
if
sub_menu
=
=
2
:
get_water(card_number)
#调用查询流水函数
action
=
raw_input
(
'是否返回主菜单(y):'
)
if
action
=
=
'y'
:
continue
if
main_menu
=
=
3
:
temp_money
=
get_data(card_number,
'temp_money'
)
#读取可用金额
repayment_amount
=
get_data(card_number,
'repayment_amount'
)
#读取需还款金额
print
'''
可用余额: %s (人民币)
您需还款: %s (人民币)
'''
%
(temp_money,repayment_amount)
money
=
input
(
'还款金额:'
)
if
repayment_interface(card_number,
int
(money))
=
=
True
:
print
'还款成功'
else
:
print
'还款失败'
action
=
raw_input
(
'是否返回主菜单(y):'
)
if
action
=
=
'y'
:
continue
if
main_menu
=
=
4
:
print
'转账功能正在开发'
action
=
raw_input
(
'是否返回主菜单(y):'
)
if
action
=
=
'y'
:
continue
if
main_menu
=
=
5
:
print
'柜员机系统已退出'
break
continue
except
Exception,e:
print
Exception,
":::-->"
,e
|
4、data_function.py
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
|
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 11 16:10:05 2016
数据操作相关功能
#我的卡号:1098521606032848
@author: toby
"""
from
encryption
import
password
import
shelve, getpass, time
#数据库读取操作,这是一个全局动作
f
=
shelve.
open
(
'data.db'
)
#检测卡号是否存在
def
check_card_active(card_number):
if
f.get(card_number,
None
) !
=
None
:
#判断对应卡号是否存在
return
True
else
:
return
False
#检测对应卡号中对应的关键字数据,例如检测对应卡号密码
def
get_data(card,keys):
data
=
f[card]
return
data[keys]
#查询对应卡号的所有数据
def
get_all_data(card):
data
=
f[card]
print
'''
卡号: %s
户名: %s
固定额度: %s (人民币)
可用余额: %s (人民币)
需还款: %s (人民币)
还款日: %s
'''
%
(card,data['name
'],data['
fixed_amount
'],data['
temp_money
'],data['
repayment_amount
'],data['
repayment_time'])
#扣款通用接口,正常POS机消费或者网银支付 ,无需手续费
def
pos_smart_pay(card_number,card_password,price):
if
check_card_active(card_number)
=
=
False
:
print
'对不起,卡号有误!'
return
False
passwd_md5
=
password.md5(card_password)
#将输入的密码进行加密,用于和数据库中的md5密码匹配
db_passwd
=
get_data(card_number,
'passwd'
)
#从数据库读取对应卡号的密码
if
passwd_md5 !
=
db_passwd:
print
'支付密码错误'
return
False
else
:
data
=
f[card_number]
#读取对应卡号信息
existing
=
data[
'temp_money'
]
#读取现有金额
if
price > existing:
print
'对不起,余额不足'
else
:
result
=
existing
-
price
#现有金额减去正常消费价格
data[
'temp_money'
]
=
int
(result)
#临时存储计算结果
f[card_number]
=
data
#计算结果数据入库
current_repayment_amoount
=
data[
'repayment_amount'
]
#读取现有还款金额
res
=
current_repayment_amoount
+
price
#现有还款金额 + 当前消费金额 = 需还款的金额
data[
'repayment_amount'
]
=
int
(res)
f[card_number]
=
data
#需还款金额数据入库
action
=
"POS消费"
record_water(card_number,action,price)
f.close()
return
True
#取款机取款功能 需5%手续费
def
cash_debit(card_number,money):
data
=
f[card_number]
#读取对应卡号信息
existing
=
data[
'temp_money'
]
#读取现有可用金额
if
money > existing:
print
'''
对不起,余额不足,无法套现
您当前可用金额: %s
'''
%
existing
else
:
repayment
=
money
*
0.05
#套现时计算手续费
print
'''
取款金额: %s
手续费: %s
'''
%
(money, repayment)
result
=
existing
-
money
-
repayment
#现有金额-套现金额(再减去手续费)
data[
'temp_money'
]
=
int
(result)
#临时存储计算结果
f[card_number]
=
data
#计算结果数据入库
current_repayment_amoount
=
data[
'repayment_amount'
]
#读取现有还款金额
temporary
=
current_repayment_amoount
+
money
+
(money
*
0.05
)
#现有还款金额 + 当前套现金额+手续费
data[
'repayment_amount'
]
=
int
(temporary)
f[card_number]
=
data
#需还款金额数据入库
#调用记录流水的函数进行记录流水
action
=
"取款机套现"
record_water(card_number,action,money)
f.close()
return
True
#通用还款接口
def
repayment_interface(card_number,money):
try
:
data
=
f[card_number]
current_repayment_amoount
=
data[
'repayment_amount'
]
#读取需还款金额
data[
'repayment_amount'
]
=
current_repayment_amoount
-
money
#需还款金额 - 传入进来的还款额 = 剩余还款额(全部还清后这里为0元,还多少减多少)
f[card_number]
=
data
#剩余还款额数据入库
existing
=
data[
'temp_money'
]
#读取现有可用金额
data[
'temp_money'
]
=
existing
+
money
#现有可用金额 + 已传入进来的需还金额 (累加到可用金额,还多少就会累加多少)
f[card_number]
=
data
#还款后累加可用后的金额数据入库
action
=
"还款"
record_water(card_number,action,money)
f.close()
return
True
except
Exception,e:
print
Exception,
":::-->"
,e
#通用记录流水接口
def
record_water(card_number,action,money):
water
=
shelve.
open
(
'water_data/%s.list'
%
card_number)
date
=
time.strftime(
'%Y-%m-%d %H:%M:%S'
)
water[date]
=
"行为:%s, 金额:%s"
%
(action,money)
water.close()
#通用查询流水接口
def
get_water(card_number):
water
=
shelve.
open
(
'water_data/%s.list'
%
card_number)
for
val
in
water:
print
val, water[val]
|
5、payment_interface.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 12 13:47:03 2016
模拟第三方支付
@author: toby
"""
import
getpass
from
data_function
import
*
#第三方支付接口
while
True
:
payment_card
=
raw_input
(
'支付卡号:'
)
payment_price
=
input
(
'价格:'
)
payment_password
=
getpass.getpass(
'支付密码:'
)
if
pos_smart_pay(payment_card,payment_password,
int
(payment_price))
=
=
True
:
print
'支付完成'
break
else
:
print
'支付失败'
continue
|
附件:http://down.51cto.com/data/2368377
本文转自 TtrToby 51CTO博客,原文链接:http://blog.51cto.com/freshair/1872529