设为首页 收藏本站
查看: 1304|回复: 0

[经验分享] 利用Python开发的ATM小程序

[复制链接]

尚未签到

发表于 2018-8-9 10:24:52 | 显示全部楼层 |阅读模式
#!/usr/bin/env python  
#coding=utf-8
  
# Name: AtmCard.py
  

  
__author__ = 'kumikoda'
  

  
import pickle
  
import sys
  
import time
  
import hashlib
  
import os
  

  
def main():
  
    '''打印功能信息列表,并提供用户输入接口再进行具体项目操作'''
  
    cardNum = login('id')
  
    if cardNum == False:
  
        sys.exit()
  
    while True:
  
        wecome = raw_input("""欢迎使用本银行信用卡中心! 请输入如下功能对应的数字.
  
                    功能如下:
  
                    1. 第一次使用卡,请对卡进行初始化操作(重要).
  
                    2. AMT现金取款
  
                    3. 购物、消费等刷卡消费
  
                    4. 信用卡还款
  
                    5. 退出
  
        Please input(1/2/3/4/5):""").split()
  
        if len(wecome) == 0:
  
            continue
  
        number = wecome[0]
  
        if number == '1':
  
            init()
  
            continue
  
        elif number == '2':
  
            draw_money(cardNum)
  
        elif number == '3':
  
            buy(cardNum)
  
        elif number == '4':
  
            repayment(cardNum)
  
        elif number == '5':
  
            print "Exit, Good Bye!"
  
            sys.exit()
  
        else:
  
            print "你输入的数字不在功能列表内,请重新输入."
  
            continue
  

  
def login(number=None):
  
    '''用户登录验证'''
  
    with open('F:\Python\Balance_tab','rb') as f:  # 读取文件并将数据放入元组
  
        for line in f:
  
            keys = line.split()[1]
  
            print keys
  
            vlues = line.split()[2]
  
            print vlues
  
            con = 0
  
            while True:
  
                CardNum = raw_input("\033[32;1m请输入您的信用卡卡号:")
  
                if CardNum == keys:
  
                    UserPwd = raw_input("\033[32;1m请输入你的登录密码:")
  
                    md5 = hashlib.md5()
  
                    md5.update(UserPwd)
  
                    UserPwd = md5.hexdigest()
  
                    print md5.hexdigest()
  
                    if UserPwd == vlues:
  
                        print "登录成功."
  
                        if number == "id":
  
                            return CardNum
  
                        else:
  
                            return True
  
                    else:
  
                        con = con + 1
  
                        print "输入的密码或者用户名有误,请重新输入,[Error %s]" % con
  
                        if con == 3:
  
                            print "输入的密码错误三次."
  
                            return False
  
                        else:
  
                            continue
  
                else:
  
                    print "没有找到你输入的卡号,请重新输入."
  
                    continue
  

  
def init():
  
    '''新卡初始化(1.额度加载 2.设置修改卡密码 3. 添加记账日志格式头部)'''
  
    money = []
  
    with open('F:\Python\Balance_tab','rb') as f:
  
        m = f.read().split()[-1]
  
        money.append(m)
  
        temp_log(Tlist=money, content='dump')
  
        print "Temp money load OK."
  
    initDlist = ['账号' + '时间' + '\t', '摘要' + '\t', '消费金额' + '\t', '手续费' + '\n']
  
    day_log(initDlist)
  
    print "Day log write OK."
  

  
def draw_money(cardNum):
  
    '''取现功能'''
  
    while True:
  
        input_money = raw_input("欢迎使用本中心自助取款ATM系统,请输入本次取款金额:")
  
        if len(input_money.split()) == 0:
  
            continue
  
        userinfo = raw_input("取现需收取%5的手续费,确认是否取现[Y/n]:")
  
        if userinfo == "Y" or userinfo == "y":
  
            ## load总金额,并计算输出
  
            t1 = temp_log(content='load')
  
            money = float(t1[0])
  
            fee = float(input_money) * 0.05  # 手续费
  
            draw = float(input_money) + fee  # 本次取款额+手续费
  
            if draw >= money:
  
                print "账户余额不足,请重新输入取款金额."
  
                continue
  
            else:
  
                total = money - draw      # 账户余额 - 本次取款额
  
                print "您本次取现金额为: RMB% s 账户可取现总金额为: RMB% s" %(input_money, total)
  
                ## dump 消费后总金额,到文件内保存
  
                totals = []
  
                totals.append(total)
  
                temp_log(Tlist=totals, content='dump')
  
                ## 写入日志文件
  
                drawtime = time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime())  # 获取当前日期
  
                Dlist = [cardNum + '\t', drawtime + '\t', 'draw money' + '\t', '-' + input_money + '\t', '-' + str(fee) + '\n']
  
                day_log(Dlist)
  
                scont = raw_input("您是否继续取现:[Y/n]")
  
                if scont == "Y" or scont == "y":
  
                    continue
  
                elif scont == "N" or scont == "n":
  
                    print "Exit!"
  
                    break
  
        elif userinfo == "N" or userinfo == "n":
  
            print "Exit!"
  
            sys.exit()
  
        else:
  
            print "你输入[Y/n]按回车键确认:"
  
            continue
  

  
def buy(cardId):
  
    '''购物/消费等'''
  
    user_Money = int(temp_log(content='load')[0])
  
    while True:
  
        list = {1: ['Iphone 6s', '5000'], 2: ['MacBook', '15000'], 3: ['Tea', '550'], 4: ['Vegetables', '450'], 5: ['coffee', '250']}
  
        print "购物清单:"
  
        for x, y in list.items():
  
            z = ' '.join(y)
  
            print x, z
  
        yn_list = raw_input("Do you need to buy [Y/n] or add shoping list [S] Enter:")
  
        if yn_list == "Y" or yn_list == "y":
  
            user_input = raw_input("请输入你要购买的商品名称对应的编号:")
  
            k = int(user_input)
  
            if len(user_input) == 0:
  
                print "你没有输入任何商品的名称,请重新输入."
  
                continue
  
            amount = int(list[k][1])   # 取字典中key对应的商品价格
  
            if user_Money > amount:
  
                user_Money = user_Money - amount
  
                print "You need to pay RMB%s totally." % amount
  
                print "你的账户余额为: RMB%s" % user_Money
  
                ## 消费写入日志文件
  
                drawtime = time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime())
  
                defname = sys._getframe().f_code.co_name
  
                Dlist = [cardId + '\t', drawtime + '\t', defname + ':' + list[k][0] + '\t', '-' + str(amount) + '\t', '0' + '\n']
  
                day_log(Dlist)
  
                ## 将消费后金额写入temp文件
  
                tmp_Money = []
  
                tmp_Money.append(user_Money)
  
                temp_log(Tlist=tmp_Money, content='dump')
  
            elif user_Money < amount:
  
                print "你的账户余额为: RMB%s" % user_Money
  
                print "你的账户余额不足已支付本次购物,你可以尝试选择其他商品!"
  
                continue
  
            if (user_Money < 100) and (user_Money > 0):
  
                    print "由于你的账户余额已低于购物清单任何物品单价,系统自动退出购物,请充值后再来购买."
  
                    sys.exit()
  
        elif yn_list == "N" or yn_list == "n":
  
            print "You input %s, exit buy!" % yn_list
  
            #sys.exit()
  
            break
  
        elif yn_list == "S" or yn_list == "s":
  
            while True:
  
                shop_id = raw_input("请输入ID号,注意ID号不能重复:")
  
                shop_m = raw_input("请输入商品名称和价格,中间已单个空格.")
  
                list[shop_id] = shop_m
  
                print "成功添加商品到货架."
  
                print list
  
                s_input = raw_input("是否继续添加[Y/n]:")
  
                if s_input == "Y" or s_input == "y":
  
                    continue
  
                else:
  
                    print "Exit, 退出商品添加."
  
                    break
  
        else:
  
            print "You input Other string, please again!"
  
            continue
  

  
def day_log(Dlist):
  
    '''日记账、每月账单导出功能'''
  
    with open("log.txt", 'a') as df:
  
        df.writelines(Dlist)
  

  
def temp_log(Tlist=None, content="load"):
  
    '''总金额临时记录文件'''
  
    try:
  
        if content == "load":
  
            loadput = open('temp.txt', 'r')
  
            loaddata = pickle.load(loadput)
  
            loadput.close()
  
            return loaddata
  
        elif content == "dump":
  
            output = open('temp.txt', 'wb')
  
            pickle.dump(Tlist, output, protocol=2)
  
            output.close()
  
        elif content == "loads":
  
            data = pickle.loads(Tlist)
  
            return data
  
        else:
  
            print "参数错误,重新输入."
  
    except Exception, e:
  
        print e
  

  
def repayment(cardID):
  
    '''信用卡还款接口'''
  
    try:
  
        while True:
  
            # 获取初始额度
  
            with open('F:\Python\Balance_tab','rb') as f:
  
                s = int(bf.read().split()[-1])
  
            # 截止还款日获取卡内余额
  
            balance = temp_log(content='load')[0]
  
            repay = s - balance
  
            if repay == 0:
  
                print "您本月已还款,无需还款."
  
                print "Exit, repayment."
  
                break
  
            else:
  
                print "您本月需要还款金额为: ¥%s" % repay
  
                h_input = raw_input("确认是否还款,请输入[Y/n]:")
  
                if h_input == "Y" or h_input == "y":
  
                    amount_in = raw_input("请输入您本次还款金额:")
  
                    if float(amount_in) > repay:
  
                        print "您输入的还款额超过本月消费金额,请重新输入."
  
                        continue
  
                    else:
  
                        dumppay = float(amount_in) + balance
  
                        # dump到temp文件
  
                        dpay = [dumppay]
  
                        temp_log(Tlist=dpay, content='dump')
  
                        print "还款成功."
  
                        # 记录到流水日志
  
                        paytime = time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime())
  
                        repadyLog = [cardID + '\t', paytime + '\t', "repayment" + '\t', '+' + amount_in + '\t', '0' + '\n']
  
                        day_log(repadyLog)
  
                elif h_input == "N" or h_input == "n":
  
                    print "Exit, repayment system."
  
                    break
  
                else:
  
                    print "Please input again."
  
                    continue
  
    except Exception, e:
  
        print e
  

  
if __name__ == '__main__':
  
        main()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549034-1-1.html 上篇帖子: Python:线程、进程与协程(2)——threading模块 下篇帖子: python实现获取服务器IP地址
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表