python之ATM

  每次做一点就发出来,大神不要嫌重复

  2016/11/4

  今天来搞ATM,反正逃不了的,说来惭愧,这个作业是我10/4号20天前拿到的,当时是万脸蒙比的,今天又做了一点,现在算是百脸蒙比吧。

一、需求:模拟实现一个ATM + 购物商城程序

  额度 15000或自定义 
  实现购物商城,买东西加入 购物车,调用信用卡接口结账   其实是两套单独程序
  可以提现,手续费5%  提现不能超过总余额一半   
  每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
  支持多账户登录,每个用户有单独信息
  支持账户间转账,
  记录每月日常消费流水
  提供还款接口
  ATM记录操作日志
  提供管理接口,包括添加账户、用户额度,冻结账户等。。。

二、需求分析:

  角色:

   管理员功能:
              增删改查
              记录日志
              基本信息
              额度 15000
            
      普通用户功能:
          可以提现,手续费5%
          支持多账户登录
          支持账户间转账
          记录每月日常消费流水
          提供还款接口
          ATM记录操作日志

三、文件创建

  刚开始的蒙比从不知道文件怎么创建开始?擦!怎么多需求,肯定不止一两个文件的,那多个文件又是怎么建的?我还特的心血来潮花一个早上去图去馆研究一下,最后挺乱的,后来看了视频,才发现有文件创建上是有开发规范的!

  

  

  bin  用于执行可执行文件

  conf  配置文件

  db  用于存放用户数据

  log  日志,记录相关信息

四、begin funny coding

  这里我每次写一些,改一些,方便我这种小白看思路,想看最终版的直接拉到文章最后。

16/11/4  9:22

  今天实现了登陆的功能。自我感觉良好,哈哈~

  学到的新技能:

    1. 如何让字体打印出来有颜色??

print("\033[31;1mAccount[%s]doesnotexist!\033[0m" % account)

    运行结果:Account [qee] does not exist!        打印出来是红色的

    2.如何将一个文件内的字符串形式通过json转化为相应的字典格式??

      用json.load()就好嘛,不过还是遇到一点小问题。

#account_file是文件的绝对路径
with open(account_file, "r", encoding="utf-8") as f:   #打开文件
  file_data = json.load(account_file)
    print(file_data)
这样竟然出错了!!
错误信息:AttributeError: ‘str‘ object has no attribute ‘read‘

  

  于是我去看了下json.load()的源码。

def load(fp, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
    """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
    a JSON document) to a Python object.

    ``object_hook`` is an optional function that will be called with the
    result of any object literal decode (a ``dict``). The return value of
    ``object_hook`` will be used instead of the ``dict``. This feature
    can be used to implement custom decoders (e.g. JSON-RPC class hinting).

    ``object_pairs_hook`` is an optional function that will be called with the
    result of any object literal decoded with an ordered list of pairs.  The
    return value of ``object_pairs_hook`` will be used instead of the ``dict``.
    This feature can be used to implement custom decoders that rely on the
    order that the key and value pairs are decoded (for example,
    collections.OrderedDict will remember the order of insertion). If
    ``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.

    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
    kwarg; otherwise ``JSONDecoder`` is used.

    """
    return loads(fp.read(),
        cls=cls, object_hook=object_hook,
        parse_float=parse_float, parse_int=parse_int,
        parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)

  

  注意这一句return loads(fp.read(),……),我以为搞个文件的绝对路径就可以的,结果错误信息,当然是路径没有read()功能。

#改正:
if os.path.isfile(account_file):     #如果用户文件存在(即用户存在)
    with open(account_file, "r", encoding="utf-8") as f:   #打开文件
        file_data = json.load(f)
        print(file_data)

运行正确,GOOD!

    3.如何把时间字符串转化为时间戳(忘了的)

      先通过time.strptime()将时间字符串转成struct_time格式,再通过time.mktime()将struct_time转成时间戳。 

 11/4  文件形式

atm.py

"""
ATM程序的执行文件
"""
import os
import sys

dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))   #找到路径
sys.path.insert(0, dir)     #添加路径
print(dir)

#将main.py里面所有代码封装成main变量
from core import main

if __name__ == "__main__":
    #这里我刚开始用run()就爆错了
    main.run()

settings.py

 1 """
 2 初始化的配置
 3 """
 4
 5 import logging
 6 import os
 7
 8 #到ATM目录,方便后面创建帐户文件
 9 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
10
11 LOGIN_LEVEL = logging.INFO    #初始化日志级别
12
13
14 DATABASE = {
15     "db_tool":"file_storage",   #文件存储,这里可拓展成数据库形式的
16     "name":"accounts",          #db下的文件名
17     "path":"%s/db" % BASE_DIR
18 }

auth.py

 1 """
 2 认证模块
 3 """
 4 print("BB")
 5 import os
 6 import json
 7 import time
 8
 9 from core import db_handle
10 from conf import settings
11
12
13 def access_auth(account, password):
14     """
15     下面的access_login调用access_auth方法,用于登陆
16     :param acount: 用户名
17     :param password: 密码
18     :return:如果未超期,返回字典,超期则打印相应提示
19     """
20     db_path = db_handle.handle(settings.DATABASE)    #调用db_handle下的handle方法,返回路径/db/accounts
21     print(db_path)
22     account_file = "%s/%s.json" % (db_path, account)    #用户文件
23     print(account_file)
24     if os.path.isfile(account_file):     #如果用户文件存在(即用户存在)
25         with open(account_file, "r", encoding="utf-8") as f:   #打开文件
26             account_data = json.load(f)   #file_data为字典形式
27             print(account_data)
28             if account_data["password"] == password:
29                 expire_time = time.mktime(time.strptime(account_data["expire_date"], "%Y-%m-%d"))
30                 print(expire_time)
31                 print(time.strptime(account_data["expire_date"], "%Y-%m-%d"))
32                 if time.time() > expire_time:   #如果信用卡已超期
33                     print("\033[31;1mAccount %s had expired,Please contract the bank" % account)
34                 else:     #信用卡未超期,返回用户数据的字典
35                     print("return")
36                     return account_data
37             else:
38                 print("\033[31;1mAccount or Passworddoes not correct!\033[0m")
39     else:  #用户不存在
40         print("\033[31;1mAccount [%s] does not exist!\033[0m" % account)
41
42
43
44
45 def access_login(user_data):
46     """
47     用记登陆,当登陆失败超过三次??
48     :param user_data:
49     :return:
50     """
51     retry = 0
52     while not user_data["is_authenticated"] and retry < 3:
53         account = input("Account:").strip()
54         password = input("Password:").strip()
55         access_auth(account, password)

db_handle.py

 1 """
 2 处理与数据库的交互,若是file_db_storage,返回路径
 3 """
 4
 5 def file_db_handle(database):
 6     """
 7     数据存在文件
 8     :param database:
 9     :return: 返回路径  ATM/db/accounts
10     """
11     db_path = "%s/%s" % (database["path"], database["name"])
12     print(db_path)
13     return db_path
14
15
16
17 def mysql_db_handle(database):
18     """
19     处理mysql数据库,这里用文件来存数据,
20     保留这个方法主要为了程序拓展性
21     :return:
22     """
23     pass
24
25
26 def handle(database):
27     """
28     对某种数据库形式处于是
29     本程序用的是文件处理file_storage
30     :param database: settings里面的DATABASE
31     :return: 返回路径
32     """
33     if database["db_tool"] == "file_storage":
34         return file_db_handle(database)
35     if database["db_tool"] == "mysql":
36         return mysql_db_handle(database)

main.py

 1 """
 2 主逻辑交互模块
 3 """
 4 from core import auth
 5
 6
 7 #用户数据信息
 8 user_data = {
 9     ‘account_id‘:None,          #帐号ID
10     ‘is_authenticated‘:False,  #是否认证
11     ‘account_data‘:None        #帐号数据
12
13 }
14
15
16 def account_info():
17     """
18     用户帐户信息
19     :return:
20     """
21     pass
22
23
24 def repay():
25     """
26     还款
27     :return:
28     """
29     pass
30
31
32 def withdraw():
33     """
34     退出
35     :return:
36     """
37     pass
38
39
40 def transfer():
41     """
42     转帐
43     :return:
44     """
45     pass
46
47
48 def paycheck():
49     """
50     转帐检查
51     :return:
52     """
53     pass
54
55
56 def logout():
57     """
58     退出登陆
59     :return:
60     """
61     pass
62
63
64 def interactive():
65     """
66     交互
67     :return:
68     """
69     pass
70
71
72
73 def run():
74     """
75     当程序启动时调用,用于实现主要交互逻辑
76     :return:
77     """
78     access_data = auth.access_login(user_data)   #调用认证模块,返回用户文件json.load后的字典
79     print("AA")

 

zcl.json

{"status": 0, "expire_date": "2021-01-01", "credit": 15000, "pay_day": 22, "balance": 15000, "enroll_date": "2016-01-02", "id": 22, "password": "abc"}

   测试结果1:

C:\Users\Administrator\PycharmProjects\laonanhai\ATM
BB
Account:zcl
Password:abc
C:\Users\Administrator\PycharmProjects\laonanhai\ATM/db/accounts
C:\Users\Administrator\PycharmProjects\laonanhai\ATM/db/accounts
C:\Users\Administrator\PycharmProjects\laonanhai\ATM/db/accounts/zcl.json
{‘id‘: 22, ‘credit‘: 15000, ‘password‘: ‘abc‘, ‘status‘: 0, ‘expire_date‘: ‘2012-01-01‘, ‘enroll_date‘: ‘2016-01-02‘, ‘pay_day‘: 22, ‘balance‘: 15000}
1325347200.0
time.struct_time(tm_year=2012, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=1, tm_isdst=-1)
Account zcl had expired,Please contract the bank
Account:

  测试结果2:

C:\Users\Administrator\PycharmProjects\laonanhai\ATM
BB
Account:zcl
Password:abc
C:\Users\Administrator\PycharmProjects\laonanhai\ATM/db/accounts
C:\Users\Administrator\PycharmProjects\laonanhai\ATM/db/accounts
C:\Users\Administrator\PycharmProjects\laonanhai\ATM/db/accounts/zcl.json
{‘expire_date‘: ‘2021-01-01‘, ‘status‘: 0, ‘enroll_date‘: ‘2016-01-02‘, ‘balance‘: 15000, ‘id‘: 22, ‘password‘: ‘abc‘, ‘credit‘: 15000, ‘pay_day‘: 22}
1609430400.0
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=1, tm_isdst=-1)
return
Account:

  OK, 今日退朝,明日继续!

时间: 2024-12-27 22:10:28

python之ATM的相关文章

python模拟ATM系统

一.环境及程序功能说明 python 2.7.12模拟与银行ATM功能,主要功能如下: 1,登录查询余额 2,转账功能 3,提现功能 4,流水查询 5,密码修改 6,还款功能 7,退出(切换账号) 采用pickle存储账号密码相关信息,以账号名为日志文件名存储该账号的流水日志~ 为了实现测试,先写一个提供测试文件的小脚本,代码如下: #coding:utf-8 import pickle import time import os IOSTIME = '%Y-%m-%d %X' Now = ti

Python实现atm机的功能

主要还是参考网上内容,自己做了修改.虽然代码有小bug,但是不影响学习和测试. 功能: 额度:8000 可以提现,手续费5% 每月最后一天出账单,写入文件 记录每月日常消费流水 提供还款接口 1.atm的脚本 [[email protected] atm]# cat atm.py #!/usr/bin/env python # -*- coding: utf-8 -*- ''' Date:2017-03-23 Author:Bob ''' import os import time import

python之ATM(第五天)

ATM程序简介: 1.登录login.py 2.取现cash.py 3.还款cashin.py 4.日志查询query.py ATM主程序菜单 #!/usr/bin/env pythonimport sys,pickleimport pickleimport account,login,cash,cashin,query def main(name): while True: print '''\033[1mMain Menu: 1.cash 2.cashin 3.query 4.quit\03

python实现atm机的部分功能

环境:python2.7 缺陷:钱不变,待完善 # -*- coding: utf-8 -*- user_name = "C:\Users\95112\Desktop\ATM\username" #定义用户名和密码的位置 goods     = "C:\Users\95112\Desktop\ATM\goods"  #定义商品列表的的位置 #登录 def login(): global a global salary username=[] password=[]

python 23 ATM

1,分析需求 1.额度15000或自定义 --> 注册功能 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 --> 购物功能.支付功能 3.可以提现,手续费5% --> 提现功能 4.支持多账户登录 --> 登录功能 5.支持账户间转账 --> 转账功能 6.记录日常消费 --> 记录流水功能 7.提供还款接口 --> 还款功能 8.ATM记录操作日志 --> 记录日志功能 9.提供管理接口,包括添加账户.用户额度,冻结账户等... --->

python版—ATM机

# 初始化存储变量 cards = [123456, 234567, 345678]   # 存放用户卡号 pwds = [111, 222, 333]            # 存放用户的密码 moneys = [1000, 1000, 100]       # 存放用户的余额 IsLogin = False  # 用户是否登录 loginUser = -1  # 登录的用户,保存数组的下标 loginCount = 0 # 登录次数 #主菜单 def menu():    while Tru

从零开始的循环

# 今日内容 * 流程控制if* 流程控制while* 流程控制for* 数据类型int,float* 数据类型str以及内置方法 ### if判断 模拟人对某些事物的判断并作出不同的决策的能力 计算机由于要像人一样的去工作,那么它必须也要具备判断事物对错的能力,从而作出不同的响应 实际中的例子,面前走过一个妹纸,你会想好不好看,要不要超过去看看正脸等等 程序中比如ATM取款机,需要接收你输入的用户名和密码来判断你是否是合法用户等等 ```pythonif 条件: 代码1 代码2 代码3 ...

Python学习day5作业-ATM和购物商城

Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用户间转帐 支持多用户 管理员可添加账户.指定用户额度.冻结用户等 购物车: 商品信息- 数量.单价.名称 用户信息- 帐号.密码.余额 用户可充值 购物历史信息 允许用户多次购买,每次可购买多件 余额不足时进行提醒 用户退出时 ,输出当次购物信息 用户下次登陆时可查看购物历史 商品列表分级显示 1

python之信用卡ATM(第五天)

本节作业 作业需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接口,包括添加账户.用户额度,冻结账户等... 因对本次作业的MVC结构没有思路,故研究分析了王松牛人的作业,现整理如下: 一.作业代码具体说明如下: 一.主程序