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
原文地址:https://www.cnblogs.com/Mengchangxin/p/9300081.html