python- ATM与购物商城

Posted wenjie^_^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python- ATM与购物商城相关的知识,希望对你有一定的参考价值。

README:

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

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

二、初步作业规划
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()
View Code

 

/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与购物商城的主要内容,如果未能解决你的问题,请参考以下文章

Python_购物商城ATM

Python_购物商城ATM

python_项目_ATM和购物商城的程序

Python 基础 - Day 5 Assignment - ATM 取款机

Python开发程序:ATM+购物商城

python ATM + 购物车