python 之简单模拟银行系统功能(卡号申请、还款、支付、取现)

一、简单说明

1、源代码文件见附件 Credit.zip

2、关于转账功能,因时间问题,转账功能待续

4、逻辑图

二、代码

1、包encryption中的(password.py文件)

#!/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

#!/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

# -*- 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

# -*- 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

# -*- 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
时间: 2024-11-05 01:13:13

python 之简单模拟银行系统功能(卡号申请、还款、支付、取现)的相关文章

【利好】已认证的政府与媒体类订阅号可申请微信支付

4月30日消息,微信公众平台对部分订阅号开放申请微信支付的能力,现允许认证的政府与媒体类订阅号申请微信支付.微信支付功能之前只针对服务号开放.微信支付,是由腾讯公司知名移动社交通讯软件微信及第三方支付平台财付通联合推出的移动支付创新产品,旨在为广大微信用户及商户提供更优质的支付服务,微信的支付和安全系统由腾讯财付通提供支持.无需任何刷卡步骤即可完成支付,整个过程简便流畅. 已认证的政府与媒体类订阅号可以点击左侧导航“微信支付”进行申请. Q:什么是认证的政府与媒体类订阅号? A:认证的政府与媒体

python实现 - 模拟贷款卡号生成规则

笔者在测试某web系统的过程中,需要用到“贷款卡号”,且此贷款卡号仅能使用一次,保存过后下一次无法再次使用相同的卡号. 遂决定依据它的生成规则,自己写一段代码来实现. 同时为了方便起见,贷款卡的前三位默认用数字来实现. 1. 生成规则如下: 贷款卡编码一共有16位,最后两位是校验位 整个贷款卡编码的规则如下: 前三位:分别为数字或者大写英文字母 第四位到第十四位:分别为数字 后两位的校验码为 前十四位乘以权重相加后除以97后的余数再加1后得到的数字, 如果此数字为个位数,前面还需要补一个零 前十

python简单模拟:把树存储在数据表中

在数据库中建立一个表,有Id, fatherId, value 三个字段,就可以存储一个树. 如何把该表中的数据以树的形式呈现出来,下面小弟用python简单模拟一下. 初学python,请大家多多指点.另外非常感谢http://www.cnblogs.com/lzyzizi/对小弟的指点. 运行结果: A-1 B-1 C-1 D-1 E-1 E-2 C-2 B-2 C-3 C-4 源代码: 1 #!user/bin/python 2   3  class noteModel: 4 def __

python 简单模拟银行转账功能

看python教程第三节课的作业 首先画出流程图,流程图与现实代码有出入,因为刚开始画流程图的时候,有些东西没考虑进去,后来写着写着就慢慢能想起来并实现了. 另有一点经验推荐给新手朋友,如果说碰到一个项目无从下手的话,就先慢慢去写,写着写着你就会往下写了,真的,亲身实践.望大神勿喷~ #!/usr/bin/env python #encoding:utf-8 import re import pickle import time def getUser():     '''从数据文件里获取银行卡

模拟银行自动终端系统

本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 二. 项目功能要求: 项目开始运行显示主菜单为: 银行自助终端系统 **************************** 0.------开户 1.------查询 2.------存款 3.------取款 4.------退出 **************************** 请选择你要执行的功能: 此时,用户可以通过键盘输入选择自己要实现的功能,如果输入不是0,1,2,3,4,则系统提示:

模拟银行自助终端系统

一. 本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 说明: 1.   对于数据输入异常,可使用java异常处理机制进行处理. 2.   评分将以功能实现与代码规范性相结合的方式进行考核. 3.   如果对项目需求有疑问,可以随时以QQ留言方式联系我进行咨询. 4.   国庆放假期间,每天都有老师在公司值班,10月4日是我在公司值班,10月7日正常上班,欢迎大家到公司来做项目. 二. 项目功能要求: 项目开始运行显示主菜单为: 银行自助终端系统 ****

Python实现网站模拟登陆

一.实验简介 1.1 基本介绍 本实验中我们将通过分析登陆流程并使用 Python 实现模拟登陆到一个实验提供的网站,在实验过程中将学习并实践 Python 的网络编程,Python 实现模拟登陆的方法,使用 Firefox 抓包分析插件分析网络数据包等知识. 模拟登录可以帮助用户自动化完成很多操作,在不同场合下有不同的用处,无论是自动化一些日常的繁琐操作还是用于爬虫都是一项很实用的技能.本课程通过 Firefox 和 Python 来实现,环境要求如下: Python 库:urllib, ur

(转载)模拟银行自助终端系统

一. 项目功能要求: 项目开始运行显示主菜单为: 银行自助终端系统 **************************** 0.------开户 1.------查询 2.------存款 3.------取款 4.------退出 **************************** 请选择你要执行的功能: 此时,用户可以通过键盘输入选择自己要实现的功能,如果输入不是0,1,2,3,4,则系统提示: 你选择的菜单不存在! 请重新选择: 要求用户重新输入数据进行菜单选择! 当用户输入0时,

Android——简单模拟银行转账

所谓的简单模拟银行转账,就是在自己使用一些布局(目前有三个界面,貌似不堪,用者请见谅,本次只是实现简单模拟的银行转账业务),这模拟有三个页面,分别是:转账前双方账号相关信息输入,确认相关信息页面以及提示是否转账成功(需判断余额). 个人初次看了相关的五大布局以及四大组件(Activity).以及Intent的个人运用.使用Handler进行验证码倒计时等,那就边看代码边做一些简单的解释. 其中布局文件xml有三个: activity_1.xml <?xml version="1.0&quo