python- ATM与购物商城
Posted wenjie^_^
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python- ATM与购物商城相关的知识,希望对你有一定的参考价值。
README:
模拟实现一个ATM + 购物商城程序
- 额度 15000或自定义
- 实现购物商城,买东西加入 购物车,调用信用卡接口结账
- 可以提现,手续费5%
- 支持多账户登录
- 支持账户间转账
- 记录每月日常消费流水
- 提供还款接口
- ATM记录操作日志
- 提供管理接口,包括添加账户、用户额度,冻结账户等。。。
- 用户认证用装饰器
二、初步作业规划
1、此作业以ATM功能为主,购物商城为辅(作为一个功能添加在主菜单中)
主菜单:
[1]、用户登录 --- 1、(多)用户登录 2、切换主用户 注:每次可登录多个用户,但是能进行操作的只有主用户
[2]、信用卡中心---------1、我的信用卡 2、转账 3、提现取款 4、还款
[3]、购物商城-----------1、进入商城 2、购物车 3、我的购买记录(商城消费流水日志)
[4]、后台管理(仅限管理员)--1、添加用户 2、用户额度管理 3、冻结账户
2、[2]、[3]选项需进行用户验证、[4]选项需进行管理员验证
3、日志记录(商城消费流水,信用卡操作记录)
4、管理接口,只有管理员能登陆(添加用户、用户额度、冻结账户等)
5、简易效果图:
三、目录结构
├── atm_shoppingmall
├── README
├── bin #入口程序目录
│ ├── __init__.py
│ └── start.py #入口程序(启动程序)
│
│
├── modules #程序核心目录
│ ├── __init__.py
│ ├── Login.py #用户(管理员)登录、用户(管理员)认证模块
│ ├── card_center.py #信用卡中心模块
│ ├── creditcard.py #信用卡模块
│ ├── shopping_center.py #购物商城模块
│ ├── management.py #后台管理员模块
│ ├── public_mod.py #公用模块
│ └── log.py #日志模块
│
├── database #程序数据库
│ ├── Admin_data #管理员账户信息目录 -- admin.json
│ ├── Goods_data #商品信息目录 -- goods.json
│ ├── shoppingcar #购物车信息目录 -- 用id.json * 用户数
│ └── User_data #用户信息目录 -- 用户id.json * 用户数
│
└── logs #日志目录
├── atm_log #atm日志目录 -- 用户id.log * 用户数
└── shopping_log #购物日日志目录 -- 用户id.log * 用户数
三、数据样式
管理员账户信息:admin.json --> {"User_name": "admin", "Password": "202cb962ac59075b964b07152d234b70",
"Login_status": 0}
商品信息: goods.json --> {"\\u7535\\u5b50\\u4ea7\\u54c1": [{"iphoneX": 8000}, {"\\u5c0f\\u7c73MAX": 3000},
{"\\u534e\\u4e3amate": 4000}, {"macpro": 14000}, {"TF": 10000}, {"Lenovo": 5000}], "\\u670d\\u88c5": [{"\\u77ed\\u8896": 100},
{"\\u77ed\\u88e4": 150}, {"\\u7fbd\\u7ed2\\u670d": 500}, {"\\u88d9\\u5b50": 800}, {"\\u5973\\u6b3e\\u5927\\u8863": 1000},
{"\\u5973\\u6b3e\\u7fbd\\u7ed2\\u670d": 1000}], "\\u7535\\u5668": [{"\\u6d77\\u5c14\\u51b0\\u7bb1": 4000},
{"\\u7f8e\\u7684\\u51b0\\u7bb1": 3000}, {"\\u897f\\u95e8\\u5b50\\u51b0\\u7bb1": 6000}, {"\\u6d77\\u4fe1\\u7535\\u89c6": 3500},
{"\\u521b\\u7ef4\\u7535\\u89c6": 3200}, {"TCL\\u7535\\u89c6": 4000}], "\\u5bb6\\u5177": [{"\\u771f\\u76ae\\u6c99\\u53d1": 5000},
{"\\u5b9e\\u6728\\u5e8a": 2000}, {"\\u5b9e\\u6728\\u9910\\u684c": 3000}, {"\\u6905\\u5b50": 400}, {"\\u4e66\\u684c": 500}, {"\\u8863\\u67dc": 600}]}
购物车信息:1001_shoppingcar.json --> {"shoppingcar": []}
1002_shoppingcar.json --> {"shoppingcar": []}
......
......
......
用户信息:1001.json --> {"Card_num": "1001", "User_name": "luffy", "Password": "202cb962ac59075b964b07152d234b70", "Login_status": 0,
"Card_status": 1, "Limit": 15000, "Available_limit": 14000, "balance": 47000}
......
......
用户信息:“卡号”,“姓名”,“密码”,“登陆状态”,“信用卡状态”(是否被冻结),“额度”,“可用额度”,“余额”
四、主要函数接口
1、authentication(func) # 用户认证装饰器
2、def authentication_admin(func) # 管理员认证装饰器
3、login() # 信用卡用户登录
4、admin_login() # 管理员用户登录
5、show_cardinfo() # 显示信用卡信息
6、withdraw_cash() # 提现到余额
7、transfer_accounts() # 转账
8、repayment() # 还款
9、balance_withhold(total) # 从余额扣款(支付商品),传入参数:应付金额
10、Limit_withhold(total) # 信用卡扣款(支付商品),传入参数:应付金额
11、shoppingcar_goods(dir,filename) # 获取商品or购物车数据,传入参数:文件目录、文件名
11、update_shoppingcar(goods) # 更新购物车
12、shoppingcar_list() # 获取当前购物车列表
11、shopping() # 购物:添加商品到购物车
12、shoppingcar() # 打印购物车、减少购物车商品,合并支付
13、show_history() # 查看历史购买记录
14、adduser() # 添加用户
15、update_limit() # 更改额度
16、show_freeze() # 打印当前被冻结的信用卡用户
17、freeze() # 冻结信用卡账户
18、unfreeze() # 解冻用户
19、check_card(file_name) # 校验用户名是否已注册,传入参数为:文件名
20、password_hash(passwd) # 将password 进行mod5加密,传入参数为:密码
21、get_userinfo(card) # 获取相应信用卡号的用户信息,传入参数为:信用卡号
22、get_admininfo() # 获取管理员账户信息
23、create_userfile(user,user_file) # 生成用户文件,传入参数为:文件内容、文件名
24、create_adminfile(admin_info) # 生成新的管理员文件,传入参数:文件内容
25、get_activeuser(dir) # 获取已登录的用户列表
26、login_out(dir) # 当系统退出时,注销所有在线用户,登录状态改为:0
27、get_freeze() # 获被冻结的用户id列表
29、get_primaryid() # 获取主用户id
30、update_status(id,status) # 修改账号登录状态,传入参数:信用卡ID
五、运行说明
1、试用信用卡账户: 信用卡号:1001 密码:123(数据文件中加密)
信用卡号:1002 密码:123(数据文件中加密)
2、管理员账号: 用户名:admin 密码:123(数据文件中加密)
3、数据文件说明: 用户数据、购物车数据、日志数据,都是单独生成一个对应的json文件(文件名包含用户id方便查找)
4、程序开始: 运行 bin目录下的 start.py文件
六、代码
/bin/start.py # 程序启动
1 #!/usr/bin/env python 2 # _*_coding:utf-8_*_ 3 # @Author : Wenjie 4 import sys,os 5 6 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 7 sys.path.append(BASE_DIR) 8 DB_DIR = os.path.join(BASE_DIR,\'database\') 9 UserData_DIR = os.path.join(DB_DIR,\'User_data\') 10 from modules import card_center,Login,public_mod,management,shopping_center 11 12 13 def main(): # 主函数 14 while True: 15 print("=========XX银行动卡空间=========") 16 print(" [1] 信用卡账户登陆管理") 17 print(" [2] 信用卡中心") 18 print(" [3] 购物商城") 19 print(" [4] 后台管理(仅限管理员)") 20 print(" [q] 退出系统") 21 result = input("请输入功能号(1,2,3,4,q):").strip() 22 if result == "1": 23 while True: 24 print("*=+"*10) 25 print("[1]、 (多)用户登录") 26 print("[2]、 切换主用户") 27 print("[q]、 退出") 28 choice1 = input(\'> \') 29 if choice1 == \'1\': 30 active_users = public_mod.get_activeuser(UserData_DIR) 31 if len(active_users) == 0: 32 print("当前无任何用户登录") 33 user_id = Login.login() 34 if type(user_id) == list: 35 public_mod.update_status(user_id[0],2) 36 public_mod.show_onlineusers() 37 else: 38 public_mod.show_onlineusers() 39 print("请勿重复登录!") 40 user_id = Login.login() 41 if type(user_id) == list: 42 public_mod.update_status(user_id[0],1) 43 public_mod.show_onlineusers() 44 elif choice1 == \'2\': 45 active_users = public_mod.get_activeuser(UserData_DIR) 46 if len(active_users) == 1: 47 public_mod.show_onlineusers() 48 print("当前登录账号有且为1,该账号为主账号!") 49 elif len(active_users) > 1: 50 public_mod.show_onlineusers() 51 change_to = input("输入更改后的主账号(账号必须已登录!):") 52 ID_list = [] 53 for i in active_users: 54 ID_list.append(i[0]) 55 if change_to in ID_list: 56 for i in active_users: 57 if change_to == i[0]: 58 i[1] = 2 59 public_mod.update_status(i[0],2) 60 else: 61 i[1] = 1 62 public_mod.update_status(i[0],1) 63 public_mod.show_onlineusers() 64 else: 65 print("无效的输入!") 66 else: 67 print("当前无用户登录!") 68 elif choice1 == \'q\': 69 break 70 else: 71 print("无效的输入") 72 elif result == "2": 73 while True: 74 print("*=*"*10) 75 print("[1]、 我的信用卡 ") 76 print("[2]、 提现取款 ") 77 print("[3]、 转账 ") 78 print("[4]、 还款 ") 79 print("[q]、 退出信用卡中心 ") 80 choice2 = input("请输入功能号(1,2,3,4,q):").strip() 81 if choice2 == "1": 82 card_center.show_cardinfo() 83 elif choice2 == "2": 84 card_center.withdraw_cash() 85 elif choice2 == "3": 86 card_center.transfer_accounts() 87 elif choice2 == "4": 88 card_center.repayment() 89 elif choice2 == "q": 90 break 91 else: 92 print("无效的输入...") 93 elif result == "3": 94 while True: 95 print("*=+" * 10) 96 print("[1]、 进入商城") 97 print("[2]、 我的购物车") 98 print("[3]、 我的购买记录") 99 print("[q]、 退出商城") 100 choice3 = input(">") 101 if choice3 == \'1\': 102 shopping_center.shopping() 103 elif choice3 == \'2\': 104 shopping_center.shoppingcar() 105 elif choice3 == \'3\': 106 shopping_center.show_history() 107 elif choice3 == \'q\': 108 break 109 else: 110 print("无效的输入!") 111 elif result == "4": 112 while True: 113 print("*=*" * 10) 114 print("[1]、 添加信用卡用户 ") 115 print("[2]、 更改信用卡额度") 116 print("[3]、 冻结信用卡账户 ") 117 print("[4]、 解冻信用卡账户 ") 118 print("[q]、 退出 ") 119 choice4 = input("请输入功能号(1,2,3,4,q):").strip() 120 if choice4 == \'1\': 121 management.adduser() 122 elif choice4 == \'2\': 123 management.update_limit() 124 elif choice4 == \'3\': 125 management.freeze() 126 elif choice4 == \'4\': 127 management.unfreeze() 128 elif choice4 == \'q\': 129 public_mod.admin_loginout() 130 break 131 else: 132 print("无效的输入!") 133 elif result == "q": 134 public_mod.login_out(UserData_DIR) 135 sys.exit("正在退出系统...") 136 else: 137 print("*=*"*10) 138 print("无效的输入:%s"%result) 139 main()
/modules/card_center.py # 信用卡中心模块
1 #!/usr/bin/env python 2 # _*_coding:utf-8_*_ 3 # @Author : Wenjie 4 import os,sys 5 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 6 sys.path.append(BASE_DIR) 7 DB_DIR = os.path.join(BASE_DIR,\'database\') 8 UserData_DIR = os.path.join(DB_DIR,\'User_data\') 9 from modules import public_mod,Login,log 10 #1、我的信用卡 2、转账 3、提现取款 4、还款 11 12 #显示信用卡信息 13 @Login.authentication # 验证用户是否登录 14 def show_cardinfo(): # 显示主信用卡账号信息 15 primary_id = public_mod.get_primaryid() 16 user_dic = public_mod.get_userinfo(primary_id) 17 Card_num = user_dic["Card_num"] 18 User_name = user_dic["User_name"] 19 Limit = user_dic["Limit"] 20 Available_limit = user_dic["Available_limit"] 21 balance = user_dic["balance"] 22 info = \'\'\' 23 ------------------------------------- 24 信用卡号: %s 25 用户名 : %s 26 我的额度: %d 27 可用额度: %d 28 我的存款: %d 29 30 \'\'\'%(Card_num,User_name,Limit,Available_limit,balance) 31 print(info) 32 33 def show_money(): # 获取当前账户的财产信息,以列表返回 34 primary_id = public_mod.get_primaryid() 35 card_info = public_mod.get_userinfo(primary_id) 36 Limit = card_info["Limit"] 37 Available_limit = card_info["Available_limit"] 38 balance = card_info["balance"] 39 return_money = Limit - Available_limit 40 money_info = [Limit,Available_limit,balance] 41 print("-----------------------------------") 42 print(" 总额度 : %d "%Limit) 43 print(" 当前可用额度 : %d "%Available_limit) 44 print(" 当前余额 : %d "%balance) 45 print(" 当前待还 : %d "%return_money) 46 47 # 提现到余额 48 @Login.authentication # 验证用户是否登录 49 def withdraw_cash(): 50 show_money() 51 primary_id = public_mod.get_primaryid() 52 card_info = public_mod.get_userinfo(primary_id) 53 Card_num = card_info["Card_num"] 54 Limit = card_info["Limit"] 55 passwd = card_info["Password"] 56 Available_limit = card_info["Available_limit"] 57 balance = card_info["balance"] 58 money = input("输入提现到余额的大小:") 59 if money.isdigit(): 60 money = int(money) 61 if money <= 0: 62 print("请输入大于0的数字!") 63 elif money < Available_limit: 64 password = input("请输入密码:") 65 hash_password = public_mod.password_hash(password) 66 if hash_password == passwd: 67 message = "提现到余额%d,手续费%d"%(money,money*0.05) 68 log.atm_log(message) # 打印提现日志 69 new_balance = balance + money - money*0.05 70 new_Available = Available_limit - money 71 card_info["Available_limit"] = new_Available 72 card_info["balance"] = new_balance 73 filename = Card_num + \'.json\' 74 public_mod.create_userfile(card_info,filename) 75 print("提现到余额%d,手续费%d"%(money,money*0.05)) 76 show_money() 77 else: 78 print("密码错误!") 79 else: 80 print("可用额度不足!") 81 else: 82 print("无效的输入...") 83 # 转账 84 @Login.authentication 85 def transfer_accounts(): 86 show_money() 87 print("友情提示:转账功能仅针对账号余额之间进行!") 88 primary_id = public_mod.get_primaryid() 89 card_info = public_mod.get_userinfo(primary_id) # 当前用户的信息{} 90 from_balance = card_info["balance"] # 当前用户余额 91 password = card_info["Password"] 92 otherside_id = input("收款ID:") 93 file_name = otherside_id + \'.json\' 94 if public_mod.check_card(file_name): # 判断收款用户id是否存在 95 transfer_num = input("请输入转账金额:") 96 if transfer_num.isdigit(): 97 transfer_num = int(transfer_num) 98 if transfer_num <= 0: 99 print("请输入大于0的数字!") 100 elif transfer_num < from_balance: 101 passwd = input("请输入密码:") 102 hash_passwd = public_mod.password_hash(passwd) 103 if hash_passwd == password: 104 message = "转账给%s用户%d"%(otherside_id,transfer_num) 105 log.atm_log(message) # 打印转账日志 106 otherside_dic = public_mod.get_userinfo(otherside_id) # 获取收款方用户数据{} 107以上是关于python- ATM与购物商城的主要内容,如果未能解决你的问题,请参考以下文章