python入门作业---ATM+购物商场程序
2018-7-12
模拟实现一个ATM + 购物商城程序
- 额度 15000或自定义
- 实现购物商城,买东西加入 购物车,调用信用卡接口结账
- 可以提现,手续费5%
- 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
- 支持多账户登录
- 支持账户间转账
- 记录每月日常消费流水
- 提供还款接口
- ATM记录操作日志
- 提供管理接口,包括添加账户、用户额度,冻结账户等。。。
- 用户认证用装饰器
逻辑流程图
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()
这个文件是为了生成一个示例账户的基础数据。一个用户生成一个文件。当多用户登录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')
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')
配置文件 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')
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'))