• python入门作业---ATM+购物商场程序


    2018-7-12

    模拟实现一个ATM + 购物商城程序

    1. 额度 15000或自定义
    2. 实现购物商城,买东西加入 购物车,调用信用卡接口结账
    3. 可以提现,手续费5%
    4. 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
    5. 支持多账户登录
    6. 支持账户间转账
    7. 记录每月日常消费流水
    8. 提供还款接口
    9. ATM记录操作日志 
    10. 提供管理接口,包括添加账户、用户额度,冻结账户等。。。
    11. 用户认证用装饰器

    逻辑流程图

    2018-7-14

    需求分析:

     角色:

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

     程序结构:

    程序结构:
    ATM
    |——README
    |——atm #ATM执行程序
    |    |——__init__.py
    |    |——bin#ATM执行程序目录
    |    |    |——__init__.py
    |    |    |——atm.py  #ATM执行程序
    |    |    |——manage.py #ATM管理端,未实现
    |    |——conf #配置文件
    |    |    |——__init__.py
    |    |    |——setting.py
    |    |——core #主要程序逻辑 都在这个目录里
    |    |    |——__init__.py
    |    |    |——accounts.py #用于从文件里加载和存储账户数据
    |    |    |——auth.py    #用户认证模块
    |    |    |——db_handler.py #数据库连接引擎
    |    |    |——logger.py     #日志记录模块
    |    |    |——main.py     #侏罗纪交互程序
    |    |    |——transaction.py #记账、还钱、取钱等所有的与账户金额相关的操作
    |    |——db   #用户数据存储的地方
    |    |    |——__init__.py
    |    |    |——account_sample.py #生成一个初始的账户数据,把这个数据存成一个 以这个账户id
    |    |    |——account #存各个用户的账户数据,一个用户一个文件
    |    |    |    |——1234.json #一个用户账户示例文件
    |    |——log  #日志记录
    |    |    |——__init__.py
    |    |    |——access.log #用户访问和操作的相关日志
    |    |    |——transactions.log  #所有的交易日志
    |
    |——shopping_mall  #电子商城程序,需要单独实现
    |    |——__init__.py

     估计这个程序会编很久。一脸懵逼的进来:

    不过,万事开头难,先抄一下目录结构,查看一下,别人的作品:

     db 包下面的文件夹 account 和账户示例文件是由代码生成。

    1、先编一个简单的生成文件夹 account

     代码如下:

     1 #__author:Administrator
     2 #date:2018/7/14
     3 
     4 import os ,sys
     5 import json
     6 
     7 acc_dic={
     8     'id':1234,     #卡号
     9     'password':'abc',  #密码
    10     'credit':15000,       #信用额度
    11     'balance':15000,     #余额度
    12     'enroll_date':'2014-12-23',  #注册时间
    13     'expir_date':'2019-12-22',  # 到期时间
    14     'pay_day':22,
    15     'status':0   #0 正常  1 锁卡 2  遗失
    16 }
    17 
    18 # print(sys.platform) #返回操作系统平台名称
    19 # print(sys.version) #获取Python解释程序的版本信息
    20 def zhanghao(string):#生成一个测试用的银行G个人用户信息
    21 
    22     with open(r'account\%s.json'%acc_dic['id'],'w') as f:
    23         json.dump(string,f)
    24 
    25 
    26 def main():
    27     if sys.platform=='win32':
    28         # print('这是Windows操作系统')
    29         if os.path.isdir('account'):#判断当前目录,是否存在文件名为‘account’的文件夹
    30             zhanghao(acc_dic)
    31         else:
    32             os.mkdir('account') # 如果文件夹不存在,则创建以一个新的文件夹
    33             zhanghao(acc_dic)
    34     else:
    35         print('本软件暂不兼容Windows以外的操作系统,如需帮助,请联系开发人员')
    36 
    37 def del_file():#如果需要初始化数据,删除已有的数据文件,可以运行该程序
    38     print(os.listdir('account'))
    39     for i in os.listdir('account'):
    40         file=os.path.join('account',i)
    41         os.remove(file)
    42 
    43 if __name__=='__main__':
    44     main()
    45     # del_file()
    account_sample.py

    这个文件是为了生成一个示例账户的基础数据。一个用户生成一个文件。当多用户登录ATM系统时,会根据输入的卡号调用各自的账户信息文件。互相之间不干扰。

     2018-7-15

    验证模块:

    写一个 logger 模块:

     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/7/15
     5 import logging
     6 
     7 
     8 def logger(string,filename):
     9     logger=logging.getLogger(string)
    10     logger.setLevel(logging.INFO)
    11     fh=logging.FileHandler(filename)
    12     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    13     fh.setFormatter(formatter)
    14     logger.addHandler(fh)
    15 
    16     logger.debug('logger debug message')
    17     logger.info('logger info message')
    18     logger.warning('logger warning message')
    19     logger.error('logger error message')
    20     logger.critical('logger critical message')
    21 
    22 
    23 if __name__=='__main__':
    24     logger('access_logger','test.log')
    logger v0.1

      level=logging.WARNING 可以把这个放在配置文件中,

     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/7/15
     5 import os,sys
     6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
     7 sys.path.append(BASE_DIR)
     8 import logging
     9 from conf import setting
    10 # level=logging.WARNING#可以把这个放在配置文件中
    11 def logger(string):
    12     logger=logging.getLogger(string)
    13     logger.setLevel(setting.level)
    14     fh=logging.FileHandler(string+'.log')
    15     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    16     fh.setFormatter(formatter)
    17     logger.addHandler(fh)
    18 
    19     logger.debug('logger debug message')
    20     logger.info('logger info message')
    21     logger.warning('logger warning message')
    22     logger.error('logger error message')
    23     logger.critical('logger critical message')
    24 
    25 
    26 if __name__=='__main__':
    27     logger('access_logger')
    logger v0.2

    配置文件 setting.py 中可以这样写:

    1 #!/usr/bin/python3
    2 # -*- coding:utf-8 -*-
    3 #__author:Administrator
    4 #date:2018/7/14
    5 import logging
    6 
    7 #验证信息模块中的logger.level等级
    8 LOG_LEVEL=logging.INFO

    稍微改进一下:

     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/7/15
     5 import os,sys
     6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
     7 sys.path.append(BASE_DIR)
     8 import logging
     9 from conf import setting
    10 # level=logging.WARNING#可以把这个放在配置文件中
    11 def logger(string):
    12     logger=logging.getLogger(string)
    13     logger.setLevel(setting.LOG_LEVEL)
    14     fh=logging.FileHandler(string+'.log')
    15     ch=logging.StreamHandler()
    16     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    17     fh.setFormatter(formatter)
    18     ch.setFormatter(formatter)
    19     logger.addHandler(fh)
    20     logger.addHandler(ch)
    21 
    22     return logger
    23 
    24 
    25 if __name__=='__main__':
    26     logger('test_logger').warning('logger debug message')
    logger 0.3

     2018-7-16

    编写一个操作数据库的中间文件:

     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 用于对数据的操作
     5 Administrator 
     6 2018/7/16 
     7 '''
     8 import sys
     9 import os
    10 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    11 import json,os
    12 from conf import setting
    13 
    14 #用于从数据文件读取数据
    15 def get_data(address):
    16     with open(address,'r') as f:
    17         return json.loads(f.read())
    18 
    19 #用于保存数据到数据文件
    20 def save_data(data_dic,address):
    21     with open(address,'w') as f:
    22         json.dump(data_dic,f)
    23         return 'save already...'
    24 
    25 #查看数据 取到字典
    26 def select(filename):
    27     address = os.path.join(setting.ADDRESS, filename + '.json')
    28     return get_data(address)
    29 
    30 #在文件中插入数据,修改数据
    31 def insert(str_key,str_values,old_filename,new_filename=None):
    32     db_dic=select(old_filename) #取得数据
    33     db_dic[str_key]=str_values #修改,或添加数据
    34     if new_filename==None:#判断是否将新数据保存在原来位置,还是保存为一个新文件
    35         new_address=os.path.join(setting.ADDRESS, old_filename + '.json')
    36     else:
    37         new_address=os.path.join(setting.ADDRESS, new_filename + '.json')
    38     return save_data(db_dic,new_address)
    39 
    40 #只能在数据文件中修改数据,不能添加数据,不能另存为新的数据文件
    41 def edit(str_key,str_values,filename):
    42     db_dic=select(filename) #取得数据
    43     if str_key in db_dic:
    44         db_dic[str_key] = str_values  # 修改数据
    45         address = os.path.join(setting.ADDRESS, filename + '.json')
    46         return save_data(db_dic, address)
    47     else:
    48         print('不存在要修改的数据')
    49         return '无法修改'
    50 
    51 
    52 #在数据文件中删除数据
    53 def delete(str_key,filename):
    54     db_dic = select(filename)
    55     if str_key in db_dic:
    56         del db_dic[str_key] #删除对应的键
    57         address = os.path.join(setting.ADDRESS, filename + '.json')
    58         return save_data(db_dic, address)
    59     else:
    60         print('不存在要删除的数据')
    61         return '无法删除'
    62 
    63 
    64 if __name__=='__main__':
    65     print(select('1234'))
    66 
    67     # print(delete('id_t','1234'))
    68     # print(insert('id_t','4123','1234','4563'))
    69     # print(select('1234'))
    db_handler.py
  • 相关阅读:
    编写 ES6 的 7 个实用技巧
    [docker] 常用命令
    ansible 的第一次亲密接触
    [bug] JS sort 函数在 ios 中无效
    这几天bug多,自我检讨一下
    【面试】——随手收集面试问题
    Linux的五个查找命令:find,locate,whereis,which,type
    Linux下php安装Redis扩展
    mysql in 子查询 效率慢 优化(转)
    mysql group by 用法解析(详细)
  • 原文地址:https://www.cnblogs.com/Mengchangxin/p/9300081.html
Copyright © 2020-2023  润新知