一、程序需求
模拟实现一个ATM + 购物商城程序:
1.额度 15000或自定义
2.实现购物商城,买东西加入 购物车,调用信用卡接口结账
3.可以提现,手续费5%
4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息(没写)
5.支持多账户登录
6.支持账户间转账
7.记录每月日常消费流水
8.提供还款接口
9.ATM记录操作日志
10.提供管理接口,包括添加账户、用户额度,冻结账户等。。。
11.用户认证用装饰器
脑图:
二、目录
1 ├── ATM #ATM主程目录 2 │ ├── __init__.py 3 │ ├── bin #ATM 执行文件 目录 4 │ │ ├── __init__.py 5 │ │ ├── atm.py #ATM 执行程序 6 │ │ ├── manage.py #信用卡管理 7 │ ├── conf #配置文件 8 │ │ ├── __init__.py 9 │ │ └── Settings.py #配置参数 10 │ ├── core #主要程序逻辑都 在这个目录 里 11 │ │ ├── __init__.py 12 │ │ ├── accounts.py #用于从文件里加载和存储账户数据 13 │ │ ├── auth.py #用户认证模块及主要功能函数 14 │ │ ├── db_handler.py #数据库连接引擎 15 │ │ ├── logger.py #日志记录模块 16 │ │ ├── main.py #主逻辑交互程序 17 │ │ ├── transaction.py #记账还钱取钱与账户金额相关的操作,冻结或者锁定用户 18 │ ├── db #用户数据存储的地方 19 │ │ ├── __init__.py 20 │ │ ├── account_sample.py #生成一个初始的账户数据 ,把这个数据 存成一个 以这个账户id为文件名的文件,放在accounts目录 就行了,程序自己去会这里找 21 │ │ └── accounts #存各个用户的账户数据 ,一个用户一个文件 22 │ │ └── 123.json #新创建的用户账户示例文件 23 │ │ └── 1234.json #一个用户账户示例文件 24 │ │ └── 123456.json #一个用户账户示例文件 25 │ │ └── 6230001.json #管理用户账户示例文件 26 │ └── log #日志目录 27 │ ├── access.log #用户访问和操作的相关日志 28 │ └── login_in.log #登陆日志 29 └── shopping_mall #电子商城程序,需单独实现,主要实现购物的功能。 30 │ └── __init__.py 31 │ └── product.txt #存放商品的txt文件 32 │ └── shopping_list.txt #存放购物清单的txt.文件 33 │ └── shopping_mall.py #购物商城程序 34 ├── README
三、简要说明
1.程序从/bin/atm.py开始执行if __name__ == '__main__':
main.run()
2.程序转到/core/main.py下的run()函数,登陆时调用/core/auth的acc_login()进行登陆验证:用到了/core/auth下的acc_auth2()方法进行验证(此时传入的参数时用户输入的账户和密码)
acc_auth2中有调用了/core/db_handler下的db_handler()方法(参数是输入的账户名)在db_handler中只是进行判断是什么引擎,return file_db_handle(数据库引擎)解析文件,返回文件执行加载输入的用户的账户的所有数据
接下来判断是否为管理者账户,或者是否被冻结,若都不是,则判断输入的密码是否与数据库中的密码一样,在判断到期时间是否过期
所有都通过的话就返回这个账户的数据,之前已经创建了一个空字典,里面有是否验证:用户数据:用户账户:,判断是否被验证过,然后把用户数据临时的传递到里面,执行主循环函数
可以选择进入到购物商城,或者信用卡操作或者退出
1)购物商城
调用/shopping_mall/shopping_mall.py文件执行,主循环函数,选择你是商家还是用户,
①如果选择商家,商家有增加商品修改商品的功能
②如果选择用户,用户则有购物,刷信用卡消费的功能,当退出时打印消费清单
2)信用卡操作
调用/core/main.py下interactive(用户的所有数据)调用主循环函数,可以打印账户信息、还款、取款、转账、账单、退出等操作
①账户信息
②还款
③取款
④转账
⑤账单
⑥退出
3)若在账户登陆的时候进行输入的时管理员账户调用/bin/manage.py则可以对用户进行管理,解冻 用户、冻结用户、申领新卡
①添加账户
②冻结账户
③解冻账户
④退出
四、主程序
1.bin目录下代码
1 '''/bin/atm.py''' 2 3 4 #!/usr/bin/env python 5 #-*- Coding:utf-8 -*- 6 # Author:Eric.Shen 7 import os,sys 8 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 #print(base_dir) 10 sys.path.append(base_dir) 11 from core import main 12 13 14 if __name__ == '__main__': 15 main.run() 16 17 18 19 20 21 22 23 '''/bin/manage.py''' 24 25 26 27 #!/usr/bin/env python 28 #-*- Coding:utf-8 -*- 29 # Author:Eric.Shen 30 #管理端(提供管理接口,包括添加账户、用户额度,冻结账户) 31 #解冻账户 32 #from core.auth import login_required 33 from core import accounts 34 from core import transaction 35 #解冻账户 36 def unblock_account(acc_data): 37 user_input = input("请输入你要解冻的用户:") 38 flag = 0 39 #锁定用户 40 val = transaction.lock_or_not(user_input,flag) 41 if val == 0: 42 print("解冻成功!") 43 return 44 #冻结账户 45 def block_account(acc_data): 46 ''' 47 冻结账户初步构想是,在linux里把他的权限改掉; 48 或者将其文件改名 49 :param acc_data: 50 :return: 51 ''' 52 user_input = input("请输入你要冻结的用户:") 53 flag = 1 54 #锁定用户 55 val = transaction.lock_or_not(user_input,flag) 56 if val == 0: 57 print("冻结成功!") 58 return 59 60 #添加账户、用户额度 61 def add_account(acc_data): 62 account = { 63 "id": None, 64 "balance": None, 65 "expire_date": None, 66 "enroll_date": None, 67 "credit": None, 68 "pay_day": None, 69 "password": None, 70 "status": None 71 } 72 menu = { 73 0: "账户(数字):", 74 1: "余额:", 75 2: "到期时间:", 76 3: "办卡时间:", 77 4: "信用额度:", 78 5: "还款日期:", 79 6: "密码:", 80 7: "默认:"} 81 menu_user = { 82 0: "id", 83 1: "balance", 84 2: "expire_date", 85 3: "enroll_date", 86 4: "credit", 87 5: "pay_day", 88 6: "password", 89 7: "status" 90 } 91 for i in range(8): 92 data = input("%s" % menu[i]).strip() 93 account['%s' % menu_user[i]] = data 94 accounts.dump_account(account)#写入文件 95 print("创建成功!") 96 return 97 98 99 100 def logout(acc_data): 101 exit("程序退出!") 102 #管理界面主程序 103 def manage_main(acc_data): 104 105 menu = u''' 106 ---------管理界面--------- 107 1.添加账户 108 2.冻结账户 109 3.解冻账户 110 4.退出''' 111 menu_dic = { 112 '1': add_account, 113 '2': block_account, 114 '3': unblock_account, 115 '4': logout 116 } 117 exit_flag = False 118 while not exit_flag: 119 print(menu) 120 user_option = input("请输入你的选择:") 121 if user_option in menu_dic: 122 menu_dic[user_option](acc_data) 123 else: 124 print("