一、简单说明

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

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

4、逻辑图

二、代码

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

#!/usr/bin/envpython#-*-coding:utf-8-*-"""CreatedonThuNov1014:47:292016密码相关功能@author:toby"""importhashlib,re#密码进行MD5加密defmd5(passwd):hashs=hashlib.md5()#创建MD5对象hashs.update(passwd)#生成加密串returnhashs.hexdigest()#获取加密串#密码位数检测,只能是6位数字defcheck_digit(passwd):com=re.compile('^\d{6,6}$')temps=com.findall(passwd)iflen(temps)==0:returnFalseelse:returnTrue#检测银行卡号位数defcheck_card(card):com=re.compile('^\d{16,16}$')temps=com.findall(card)iflen(temps)==0:returnFalseelse:returnTrue

2、applys.py

#!/usr/bin/envpython#-*-coding:utf-8-*-"""CreatedonThuNov1014:42:292016卡号申请程序@author:toby"""fromencryptionimportpasswordimportshelve,random,getpass,time#申请资格评估defssessment(income,age):ifincome>=3000andage>=22andage<60:returnTrueelse:returnFalse#确定额度defquota(money):ifmoney>3000andmoney<6000:return5000ifmoney>6000andmoney<10000:return10000ifmoney>10000andmoney<20000:return15000#生成卡号defcarid():carid=""foriinrange(16):temp=random.randint(0,9)carid+=str(temp)returncarid#新申请的用户数据入库defexamine(key,val):data=shelve.open('data.db')data[key]=valif__name__=="__main__":print'''信用卡申请资格评估'''income=input('月收入:')age=input('年龄:')#评估申请资格ifssessment(income,age)==False:print'评估结果:无申请资格'else:print'''评估结果:可申请请填写详细资料'''name=raw_input('姓名:')card=raw_input('×××:')phone=raw_input('手机:')address=raw_input('地址:')#根据条件自动生成固定额度fixed_amount=quota(income)#调用自动生成额度函数#初次申请卡号,初始记录还款的key为0repayment_amount=0#初始化还款金额,首次为0元#自动生成卡号kaid=carid()#调用自动生成16位卡号函数whileTrue:passwd1=getpass.getpass('设置密码:')passwd2=getpass.getpass('确认密码:')ifpasswd1!=passwd2:print'密码不一致'continueifpassword.check_digit(passwd1)==False:#检测密码合法性print'只能输入6位数字密码'continueelse:print'------卡号申请成功!------'print'卡号为:%s'%kaidprint'可用额度:%s'%fixed_amountdate=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-*-"""CreatedonFriNov1121:35:042016模拟取款机登录入口程序@author:toby"""fromencryptionimportpasswordimportgetpassfromdata_functionimport*if__name__=="__main__":try:whileTrue:print'''------银行系统登录入口------'''card_number=raw_input('卡号:')card_password=getpass.getpass('口令:')ifpassword.check_card(card_number)==False:print'卡号位数不正确,请仔细输入'continueifcheck_card_active(card_number)==False:print'对不起,该卡号不存在'continueifpassword.check_digit(card_password)==False:print'密码无效'continuepasswd_md5=password.md5(card_password)#将输入的密码进行加密,用于和数据库中的md5密码匹配db_passwd=get_data(card_number,'passwd')#从数据库读取对应卡号的密码ifpasswd_md5!=db_passwd:#输入的密码进行加密后和从数据库中读取的MD5密码串进行配对print'密码错误'continueelse:whileTrue:print'''XX银行欢迎您1-----------------取现2-----------------查询3-----------------还款4-----------------转账5-----------------退出'''main_menu=input('选择您需要的操作(1-5):')ifmain_menu==1:cash_amount=input('取款金额:')print'''温馨提示:信用卡取现需收取5%手续费'''action=raw_input('是否继续套现(y/n):')ifaction=='y':ifcash_debit(card_number,int(cash_amount)):#调用套现接口print'请提取现金'continueelse:print'机器故障,无法提取'breakifaction=='no':continueifmain_menu==2:print'''1-----------------查询余额2-----------------查询明细'''sub_menu=input('选择您需要的操作(1-2):')ifsub_menu==1:get_all_data(card_number)action=raw_input('是否返回主菜单(y):')ifaction=='y':continueifsub_menu==2:get_water(card_number)#调用查询流水函数action=raw_input('是否返回主菜单(y):')ifaction=='y':continueifmain_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('还款金额:')ifrepayment_interface(card_number,int(money))==True:print'还款成功'else:print'还款失败'action=raw_input('是否返回主菜单(y):')ifaction=='y':continueifmain_menu==4:print'转账功能正在开发'action=raw_input('是否返回主菜单(y):')ifaction=='y':continueifmain_menu==5:print'柜员机系统已退出'breakcontinueexceptException,e:printException,":::-->",e

4、data_function.py

#-*-coding:utf-8-*-"""CreatedonFriNov1116:10:052016数据操作相关功能#我的卡号:1098521606032848@author:toby"""fromencryptionimportpasswordimportshelve,getpass,time#数据库读取操作,这是一个全局动作f=shelve.open('data.db')#检测卡号是否存在defcheck_card_active(card_number):iff.get(card_number,None)!=None:#判断对应卡号是否存在returnTrueelse:returnFalse#检测对应卡号中对应的关键字数据,例如检测对应卡号密码defget_data(card,keys):data=f[card]returndata[keys]#查询对应卡号的所有数据defget_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机消费或者网银支付,无需手续费defpos_smart_pay(card_number,card_password,price):ifcheck_card_active(card_number)==False:print'对不起,卡号有误!'returnFalsepasswd_md5=password.md5(card_password)#将输入的密码进行加密,用于和数据库中的md5密码匹配db_passwd=get_data(card_number,'passwd')#从数据库读取对应卡号的密码ifpasswd_md5!=db_passwd:print'支付密码错误'returnFalseelse:data=f[card_number]#读取对应卡号信息existing=data['temp_money']#读取现有金额ifprice>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()returnTrue#取款机取款功能需5%手续费defcash_debit(card_number,money):data=f[card_number]#读取对应卡号信息existing=data['temp_money']#读取现有可用金额ifmoney>existing:print'''对不起,余额不足,无法套现您当前可用金额:%s'''%existingelse: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()returnTrue#通用还款接口defrepayment_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()returnTrueexceptException,e:printException,":::-->",e#通用记录流水接口defrecord_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()#通用查询流水接口defget_water(card_number):water=shelve.open('water_data/%s.list'%card_number)forvalinwater:printval,water[val]

5、payment_interface.py

#-*-coding:utf-8-*-"""CreatedonSatNov1213:47:032016模拟第三方支付@author:toby"""importgetpassfromdata_functionimport*#第三方支付接口whileTrue:payment_card=raw_input('支付卡号:')payment_price=input('价格:')payment_password=getpass.getpass('支付密码:')ifpos_smart_pay(payment_card,payment_password,int(payment_price))==True:print'支付完成'breakelse:print'支付失败'continue


附件:http://down.51cto.com/data/2368377