python第二十四天-----作业终于完成啦

作业 1, ATM:模拟实现一个ATM + 购物商城程序

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

README

作业 1, ATM:模拟实现一个ATM + 购物商城程序

额度 自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
程序结构:
ATM/#综合目录
|- - -atm/#atm程序主目录
| |- - -README
| |- - -__init__.py
| |- - -bin/#执行程目录
| | |- - -__init__.py
| | |- - -atm.py #用户登陆执行执行文件
| | |- - -admin.py #管理员登陆执行文件
| |
| |
| |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -confing.py#配置文件
| |
| |- - -core #主逻辑程序目录
| | |- - -main.py#用户登陆主要程序
| | |- - -admin_log.py#管理员登陆主要程序
| | |- - -log_file.py#日志相关函数
| | |- - -opertion_admin.py#用户登陆操作相关函数
| | |- - -transaction.py#用户操作相关函数
| | |- - -user_pass.py#用户用户登陆登陆相关函数
| |
| |
| |
| |
| |- - -db/#用户数据目录
| | |- - -__init__.py
| | |- - -admin_list#管理员列表
| | |- - -admin_lock#管理员锁定列表
| | |- - -user_file.txt#用户列表
| | |- - -lock_name.txt#用户锁定列表
| | |- - -data/#用户帐户存取目录
| | |- - -abc.json #独立用户数据
| |
| |- - -log/#日志目录
| |- - -admin_erro.log#管理员错误日志
| |- - -admin_log.log#管理员登陆日志
| |- - -admin_operation.log#管理员操作日志
| |- - -user_erro.log#用户错误日志
| |- - -user_log.log#用户登陆日志
| |- - -user_operation.log#用户操作日志
|
|- - -shopping/#商城程序目录
| |- - -__init__.py
| |- - -README
| |- - -bin/#执行目录
| | |- - -__init__.py
| | |- - -shop.py#商城用户登陆执行执行文件
| |
| |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -config.py#配置文件
| |
| |- - -core/##主逻辑程序目录
| | |- - -opert.py#主逻辑函数相关
| | |- - -shopping.py#商城主程序
| |
| |
| |- - -db/#数据目录
| | |- - -lock_name.txt#用户帐户
| | |- - -goodslist.txt#商品列表文件
| | |- - -lock_name.txt#用户消费记录文件
| | |- - -user_file.txt#用户帐户文件
| | |- - -ueer_infor#用户帐户信息文件


ATM/#综合目录
|- - -atm/#atm程序主目录
| |- - -README
| |- - -__init__.py
| |- - -bin/#执行程目录
| | |- - -__init__.py

| | |- - -admin.py #管理员登陆执行文件
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 #管理员登陆
 5 import os ,sys
 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 7 sys.path.append(BASE_DIR)#增加环境变量
 8 #from conf import settings
 9 from core import admin_log#包含目录下的文件脚本
10 if __name__ == '__main__':
11     try:
12         admin_log.loging()#运行主程序
13     except Exception as e:#出错可返回操作
14         print("33[31;1m系统异常,请与管理员联系!33[0m")
15         pass
|       |      |- - -atm.py #用户登陆执行执行文件
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import os ,sys
 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 6 sys.path.append(BASE_DIR)#增加环境变量
 7 #from conf import settings
 8 from core import main#包含目录下的文件脚本
 9 if __name__ == '__main__':
10     try:
11         main.login()#运行主程序
12     except Exception as e:#出错可返回操作
13         print("33[31;1m系统异常,请与管理员联系!33[0m")
14         pass
|       |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -confing.py#配置文件
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import os ,sys
 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 6 sys.path.append(BASE_DIR)#增加环境变量
 7 USER_FILE=BASE_DIR+'db\user_file.txt'#定义用户列表文件变量
 8 LOCK_NAME=BASE_DIR+'db\lock_name.txt'#定义锁定用户列表文件变量
 9 
10 
11 ADMIN_USER=BASE_DIR+'db\admin_list'#定义管理员列表文件变量
12 ADMIN_LOCK=BASE_DIR+'db\admin_lock'#定义管理员列表文件变量
13 
14 DB_CARD=BASE_DIR+'db\card'#卡号数据文件
15 DATA=BASE_DIR+'db\db\'#用户信息文件路径
16 
17 USER_LOG=BASE_DIR+'logs\user_log.log'#用户登陆日志文件
18 USER_ERRO=BASE_DIR+'logs\user_erro.log'#用户错误日志文件
19 USER_OPERT=BASE_DIR+'logs\user_operation.log'#用户操作日志文件
20 
21 ADMIN_LOG=BASE_DIR+'logs\admin_log.log'#管理员登陆日志文件
22 ADMIN_ERRO=BASE_DIR+'logs\admin_erro.log'#管理员错误日志文件
23 ADMIN_OPERT=BASE_DIR+'logs\admin_operation.log'#管理员操作日志文件
24 
25 
26 #手续费设置
27 #repay 还款  cash 提现  transfe 转帐  consume 消费
28 POUNDAGE={
29     'repay':{'action':'plus', 'interest':0},
30     'cash':{'action':'minus', 'interest':0.05},
31     'transfer':{'action':'minus', 'interest':0.05},
32     'consume':{'action':'minus', 'interest':0},
33 }
34 PASSWORD=8888#卡初始密码
35 PASSWORD_USER='abc'#用户初始密码
36 #还款日 帐单周期,日配置
37 TIME_DATA={
38     'data_all':50,
39     'data_n':20
40 
41 }
View Code
|       |- - -core #主逻辑程序目录

| | |- - -admin_log.py#管理员登陆主要程序
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import os ,sys
 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 6 sys.path.append(BASE_DIR)#增加环境变量
 7 from core import transaction #包含记账还钱取现等所有的与账户金额相关的操作
 8 from core import user_pass #用户名检测相关
 9 from core import log_file #日志检测相关
10 from core import opertion_admin#管理员操作相关
11 def loging():#管理员登陆函数
12     print("Welcome to ATM Management background".center(60,'*'))
13     admin_name=user_pass.admin_pass()#将通过验证的用户名赋于变量
14     while True:
15         print('''                    欢迎使用ATM管理系统
16               1 >>> 添加帐户.  2 >>> 帐户额度调整.
17               3 >>> 帐户冻结解冻.  4 >>> 查看用户日志.
18               5 >>> 退出.
19                     ''')
20         options=input('请按提示操作:')
21         if options=='1':
22             while True:
23                 card_id=input('按33[31;1mb/B33[0m返回<<<<   请输入要发行的卡号:')
24                 if card_id=='b' or card_id=='B':
25                     break
26                 if not transaction.card_list(card_id):#查询卡号函数
27                     print('id:33[32;1m%s33[0m.可以发行!'%card_id)
28                     # new_user=input('请输入要添加的帐名:')
29                     opertion_admin.add_user(card_id,admin_name)#添加帐户
30                 else:
31                     print('id:33[41;1m%s33[0m.已经发行,请更换其它卡号!'%card_id)
32                     continue
33 
34         elif options=='2':
35             while True:
36                 user_name=input('按33[31;1mb/B33[0m返回<<<<   请输入调整额度的帐户:')
37                 if user_name=='b' or user_name=='B':
38                     break
39                 if user_name in opertion_admin.user_in():#查看用户列表函数如果存
40                     opertion_admin.Adjust(user_name,admin_name)#调整帐户额度
41                     continue
42                 else:
43                     print('帐户不存在,请重新输入!')
44                     continue
45         elif options=='3':
46             while True:
47                 print('''操作提示:
48                 1 >>>>  冻结帐户
49                 2 >>>>  帐户解冻
50                 ''')
51                 js=input('按33[31;1mb/B33[0m返回<<<< 请按操作提示选择:')
52                 if js=='b' or js=='B':
53                         break
54                 if js=='1':
55                     user_name=input('按33[31;1mb/B33[0m返回<<<<   请输入要操作的帐户:')
56                     if user_name=='b' or user_name=='B':
57                         break
58                     if user_name in opertion_admin.user_in():#查看用户列表函数如果存
59                         opertion_admin.freeze(user_name,admin_name)#冻结帐户
60                         continue
61                 elif js=='2':
62                     user_name=input('按33[31;1mb/B33[0m返回<<<<   请输入要操作的帐户:')
63                     if user_name=='b' or user_name=='B':
64                         break
65                     if user_name in opertion_admin.user_in():#查看用户列表函数如果存
66                         opertion_admin.free_(user_name,admin_name)#冻结帐户
67                         continue
68                 else:
69                     continue
70 
71                 if user_name in opertion_admin.user_in():#查看用户列表函数如果存
72                     opertion_admin.freeze(user_name,admin_name)#冻结帐户
73                     continue
74                 else:
75                     print('帐户不存在,请重新输入!')
76                     continue
77         elif options=='4':
78             while True:
79                 print('''输入提示:
80                 用户登陆日志:  USER_LOG
81                 用户错误日志:  USER_ERRO
82                 用户操作日志:  USER_OPERT
83                 ''')
84                 log_name=input('按33[31;1mb/B33[0m返回<<<< 请输入您要查看的日志:')
85                 if log_name=='b' or log_name=='B':
86                     break
87                 if log_name=='USER_LOG' or  log_name=='USER_ERRO'or log_name=='USER_OPERT':
88                     opertion_admin.log_cat(log_name,admin_name)
89                 else:
90                     print('输入有误,请重新输入!')
91                     continue
92         elif options=='5':
93             exit()
94         else:
95             pass
View Code
|       |      |- - -log_file.py#日志相关函数
  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 #日志记录相关函数
  5 import os,logging,time
  6 from conf import config
  7 
  8 def log_file_():#检测文件是否存在
  9     if os.path.exists(config.USER_ERRO):#确认用户错误日志文件是否存在
 10         with open(config.USER_ERRO,'w',encoding='utf-8') as user_history:#创建一个用户错误日志文件
 11             user_history.write('')#写入空值
 12         pass
 13     if os.path.exists(config.USER_OPERT):#确认用户操作日志文件是否存在
 14         with open(config.USER_OPERT,'w',encoding='utf-8') as user_infor:#创建一个用户操作日志文件
 15             user_infor.write('')#写入空值
 16     if os.path.exists(config.USER_LOG):#确认用户登陆日志文件是否存在
 17         with open(config.USER_LOG,'w',encoding='utf-8') as user_infor:#创建一个用户登陆日志文件
 18             user_infor.write('')#写入空值
 19 
 20     if os.path.exists(config.ADMIN_ERRO):#确认管理员错误日志文件是否存在
 21         with open(config.ADMIN_ERRO,'w',encoding='utf-8') as user_infor:#创建一个管理员错误日志文件
 22             user_infor.write('')#写入空值
 23         pass
 24     if os.path.exists(config.ADMIN_LOG):#确认管理员登陆日志文件是否存在
 25         with open(config.ADMIN_LOG,'w',encoding='utf-8') as user_infor:#创建一个管理员登陆日志文件
 26             user_infor.write('')#写入空值
 27         pass
 28     if os.path.exists(config.ADMIN_OPERT):#确认管理员操作日志文件是否存在
 29         with open(config.ADMIN_OPERT,'w',encoding='utf-8') as user_infor:#创建一个管理员操作日志文件
 30             user_infor.write('')#写入空值
 31         pass
 32     else:
 33 
 34         pass
 35 
 36 def log_err(info_str):#错误日志,传入的错误内容
 37     logger=logging.getLogger('用户登陆错误日志')#设置日志模块
 38     logger.setLevel(logging.DEBUG)
 39     fh=logging.FileHandler(config.USER_ERRO,encoding='utf-8')#写入文件
 40     fh.setLevel(logging.DEBUG)#写入信息的级别
 41     fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
 42     fh.setFormatter(fh_format)#关联格式
 43     logger.addHandler(fh)#添加日志输出模式
 44     logger.warning(info_str)
 45     return 0
 46 
 47 def log_log(info_str):#登陆日志,传入内容
 48     logger=logging.getLogger('用户成功登陆日志')#设置日志模块
 49     logger.setLevel(logging.DEBUG)
 50     fh=logging.FileHandler(config.USER_LOG,encoding='utf-8')#写入文件
 51     fh.setLevel(logging.DEBUG)#写入信息的级别
 52     fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
 53     fh.setFormatter(fh_format)#关联格式
 54     logger.addHandler(fh)#添加日志输出模式
 55     logger.warning(info_str)
 56     return 0
 57 
 58 def user_opert(info_str):#用户操作日志,传入内容
 59     logger=logging.getLogger('用户操作日志')#设置日志模块
 60     logger.setLevel(logging.CRITICAL)
 61     fh=logging.FileHandler(config.USER_OPERT,encoding='utf-8')#写入文件
 62     fh.setLevel(logging.CRITICAL)#写入信息的级别
 63     fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
 64     fh.setFormatter(fh_format)#关联格式
 65     logger.addHandler(fh)#添加日志输出模式
 66     logger.critical(info_str)
 67     return 0
 68 
 69 
 70 
 71 def admin_log(info_str):#管理员登陆日志,传入内容
 72     logger=logging.getLogger('管理员成功登陆日志')#设置日志模块
 73     logger.setLevel(logging.DEBUG)
 74     fh=logging.FileHandler(config.ADMIN_LOG,encoding='utf-8')#写入文件
 75     fh.setLevel(logging.DEBUG)#写入信息的级别
 76     fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
 77     fh.setFormatter(fh_format)#关联格式
 78     logger.addHandler(fh)#添加日志输出模式
 79     logger.warning(info_str)
 80     return 0
 81 
 82 def admin_err(info_str):#管理员错误日志,传入的错误内容
 83     logger=logging.getLogger('管理员登陆错误日志')#设置日志模块
 84     logger.setLevel(logging.DEBUG)
 85     fh=logging.FileHandler(config.ADMIN_ERRO,encoding='utf-8')#写入文件
 86     fh.setLevel(logging.DEBUG)#写入信息的级别
 87     fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
 88     fh.setFormatter(fh_format)#关联格式
 89     logger.addHandler(fh)#添加日志输出模式
 90     logger.warning(info_str)
 91     return 0
 92 
 93 def admin_opert(info_str):#管理员操作日志,传入内容
 94     logger=logging.getLogger('管理员操作日志')#设置日志模块
 95     logger.setLevel(logging.CRITICAL)
 96     fh=logging.FileHandler(config.ADMIN_OPERT,encoding='utf-8')#写入文件
 97     fh.setLevel(logging.CRITICAL)#写入信息的级别
 98     fh_format=logging.Formatter('%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')#日志格式
 99     fh.setFormatter(fh_format)#关联格式
100     logger.addHandler(fh)#添加日志输出模式
101     logger.critical(info_str)
102     return 0
View Code
|       |      |- - -main.py#用户登陆主要程序
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import os ,sys,time
 5 
 6 from core import transaction #包含记账还钱取现等所有的与账户金额相关的操作
 7 from core import user_pass #用户名检测相关
 8 from core import log_file #日志相关
 9 
10 
11 def login():#开始函数
12     # time_format='%y-%m-%d %X'#定义时间格式
13     # times=time.strftime(time_format)#定义时间
14     print("Welcome to python ATM".center(60,'*'))
15     while True:
16         print('''================================================
17             1 >>>> 用户登陆.
18             2 >>>> 直接退出.
19 ================================================
20         ''')
21 
22         foo=input('请选择您要的操作:')
23         if foo=='1':
24             _user_name= user_pass.user_pass()#将通过验证的用户名赋于变量
25             data=transaction.user_info(_user_name)#调用帐户查询函数
26             if data['状态']:
27                 print('33[31;1m对不起您的帐户被冻结,不能进行相关操作,请与客服联系!33[0m')
28                 continue
29             print('尊敬的:33[32;1m%s33[0m 欢迎登陆'.center(50,'=')%_user_name)
30             while True:
31                 print('''               欢迎使用自动ATM柜员机
32           1 >>> 帐户信息查询.  2 >>> 帐户转帐.
33           3 >>> 现金提取.      4 >>> 还款.
34           5 >>> 退出.
35                 ''')
36                 options=input('请按提示操作:')
37                 if options=='1':
38                     while True:
39                         transaction.info_user(_user_name)##调用帐户查询函数用户操作日志,传入内容
40                         break
41                 elif options=='2':
42                     data=transaction.user_info(_user_name)#调用帐户查询函数
43                     print(transaction.info_format(data))#用户信息输出格式化函数
44                     print('欢迎使用自助转帐'.center(60,'='))
45                     card=input('按33[31;1mq/Q33[0m返回 输入对方的卡号:')
46                     if card=='q' or card=='Q':
47                         continue
48                     if  card.isdigit():#检测输入是否为整数
49                         card=int(card)#转为int
50                         if card==data['id']:
51                             print('33[41;1m您所输入的卡号是自己卡号,请重新输入!33[0m')
52                         transaction.transfer(card,_user_name)##调用转帐的函数
53                         continue
54                     else:
55                         print('您的输入不正确,请重新输入!')
56                         pass
57 
58 
59                 elif options=='3':
60                     while True:
61                         data=transaction.user_info(_user_name)#调用帐户查询函数
62                         print(transaction.info_format(data))#用户信息输出格式化函数
63                         mony=input('按33[31;1mq/Q33[0m返回 请输入要提现的金额:')
64                         if mony=='q' or mony=='Q':
65                             break
66                         if  mony.isdigit():#检测输入是否为整数
67                             mony=int(mony)#转为int
68                             transaction.cash(mony,_user_name)##调用取现的函数
69                             continue
70                         else:
71                             print('您的输入不正确,请重新输入!')
72                             pass
73                 elif options=='4':
74                     while True:
75                         data=transaction.user_info(_user_name)#调用帐户查询函数
76                         print(transaction.info_format(data))#用户信息输出格式化函数
77                         s_mony=data["最高额度"]-data["帐户信用余额"]
78                         print('本期总共需要还款:要33[31;1m%s33[0m'%s_mony)
79                         mony=input('按33[31;1mq/Q33[0m返回,请输入要还款的金额:')
80                         if mony=='q' or mony=='Q':
81                             break
82                         if  mony.isdigit():#检测输入是否为整数
83                             mony=int(mony)#转为int
84                             transaction.also_money(mony,s_mony,_user_name,data)#还款函数
85                             pass
86                         else:
87                             print('您的输入不正确,请重新输入!')
88                             pass
89 
90                 elif options=='5':
91                     exit()
92                 else:
93                     continue
94 
95         elif foo=='2':
96             exit()
97         else:
98             print('请按提示操作!')
99             pass
View Code
|       |      |- - -opertion_admin.py#用户登陆操作相关函数
  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 #管理员操作相关函数
  5 import json,time
  6 import os ,sys
  7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
  8 sys.path.append(BASE_DIR)#增加环境变量
  9 from core import transaction#包含记账还钱取现等所有的与账户金额相关的操作
 10 from conf import config#配置文件
 11 from core import log_file#日志文件
 12 time_format='%d'#定义时间格式
 13 time_format2='%Y-%m-%d'#定义时间格式
 14 times=time.strftime(time_format)#定义时间
 15 #查看用户列表函数
 16 def user_in():#查看用户列表函数
 17     with open(config.USER_FILE,'r',encoding='utf-8') as f:
 18         user_l=eval(f.readline())
 19     return user_l
 20 #各种日期计算函数
 21 def data_l(yesr_):#各种日期计算函数
 22     data1=time.time()#当前日期开卡日
 23     data2=data1+config.TIME_DATA['data_all']*3600*24#帐单日  开卡日加上帐单周期
 24     data3=data2+config.TIME_DATA['data_n']*3600*24#还款日
 25     data4=data1+yesr_*3600*24*365#有效期
 26     data_1=time.strftime(time_format2,time.gmtime(data1))#开卡日
 27     data_2=time.strftime(time_format,time.gmtime(data2))#帐单日
 28     data_3=time.strftime(time_format,time.gmtime(data3))#还款日
 29     data_4=time.strftime(time_format2,time.gmtime(data4))#有效期
 30     return data_1,int(data_2),int(data_3),data_4
 31 
 32 #添加帐户
 33 def add_user(card_id,admin_name):#添加帐户
 34     while True:
 35         new_user=input('请输入要添加的帐名:')
 36         if new_user in user_in():#如果用户名存在
 37             print('帐户已经存在,请重新输入!')
 38             continue
 39         h_=input('请输入最高额度:')
 40         yesr_=input('请输入年限')
 41         data_list=data_l(int(yesr_))#计算各种日期
 42         user_info_l={"帐户信用余额":int(h_),"有效期限":data_list[3],"开卡日期":data_list[0],"最高额度":int(h_),"id":int(card_id),"状态":0,"还款日期":data_list[2],"帐单日":data_list[1],"password":config.PASSWORD}
 43         info_=transaction.info_format_adm(user_info_l,new_user,config.PASSWORD_USER)#用户信息输出格式化函数
 44         print(info_)
 45         q=input('是否确定添加帐户: 33[31;1mY/y33[0m 确定! 其它键返回')
 46         if q=='y' or q=='Y':
 47             transaction.accounting(new_user,user_info_l)#记账函数,写入数据
 48             with open(config.USER_FILE,'r+',encoding='utf-8') as f:
 49                 user_list=eval(f.readline())#转换用户文件中的字符串  admin_user_list:注册用户列表
 50                 user_list[new_user]=config.PASSWORD_USER#增加注册用户到字典中
 51                 f.seek(0)#称到最前
 52                 f.write(str(user_list))#写入文件f
 53                 f.flush()#即可保存
 54                 info_str='管理员:%s.进行了帐户添加,帐户名:%s.'%(admin_name,new_user)
 55                 log_file.admin_opert(info_str)#管理员操作日志,传入内容
 56                 return 0
 57         else:
 58             pass
 59 
 60 
 61 #冻结帐户
 62 def freeze(_user_name,admin_name):#冻结帐户
 63     data=transaction.user_info(_user_name)#帐户信息函数
 64     if data["状态"]==1:
 65         print('当前帐户已经冻结!')
 66         return
 67     info_=transaction.info_format(data)#用户信息输出格式化函数
 68     print(info_)
 69     q=input('是否确定冻结帐户: 33[31;1mY/y33[0m 确定! 其它键返回')
 70     if q=='y' or q=='Y':
 71         data["状态"]=1
 72         transaction.accounting(_user_name,data,)#记账函数,写入数据
 73         print('帐户冻结完成!')
 74         info_str='管理员:%s.对帐户:%s.进行了冻结!'%(admin_name,_user_name)
 75         log_file.admin_opert(info_str)#管理员操作日志,传入内容
 76         return
 77     else:
 78         return
 79 
 80 
 81 
 82     pass
 83 
 84 #解冻帐户
 85 def free_(_user_name,admin_name):#冻结帐户
 86     data=transaction.user_info(_user_name)#帐户信息函数
 87     if data["状态"]==0:
 88         print('当前帐户已经解冻!')
 89         return
 90     info_=transaction.info_format(data)#用户信息输出格式化函数
 91     print(info_)
 92     q=input('是否确定解冻帐户: 33[31;1mY/y33[0m 确定! 其它键返回')
 93     if q=='y' or q=='Y':
 94         data["状态"]=0
 95         transaction.accounting(_user_name,data,)#记账函数,写入数据
 96         print('帐户解冻完成!')
 97         info_str='管理员:%s.对帐户:%s.进行了解冻!'%(admin_name,_user_name)
 98         log_file.admin_opert(info_str)#管理员操作日志,传入内容
 99         return
100     else:
101         return
102 
103 
104 
105     pass
106 
107 #调整帐户额度
108 def Adjust(_user_name,admin_name):#调整帐户额度
109     data=transaction.user_info(_user_name)#帐户信息函数
110     info_=transaction.info_format(data)#用户信息输出格式化函数
111     print(info_)
112     mony=input('请输入调整的额度:')
113 
114     if  mony.isdigit():#检测输入是否为整数
115         mony=int(mony)#转为int
116         while True:
117             upd=input('请确定调整方向: u/U 向上, d/D 向下:')
118             if upd=='u' or upd=='U':
119                 monyall=data["最高额度"]+mony
120                 mony_r=data["帐户信用余额"]+mony
121                 pass
122             elif upd=='d' or upd=='D':
123                 monyall=data["最高额度"]-mony
124                 mony_r=data["帐户信用余额"]-mony
125                 pass
126             else:
127                 print('输入有误,请重新输入!')
128                 continue
129             data["最高额度"]=monyall
130             data["帐户信用余额"]=mony_r
131             print('调整后的帐户信息')
132             info_l=transaction.info_format(data)#用户信息输出格式化函数
133             print(info_l)
134             q=input('是否确定调整额度: 33[31;1mY/y33[0m 确定! 其它键返回')
135             if q=='y' or q=='Y':
136                 transaction.accounting(_user_name,data,)#记账函数,写入数据
137                 print('帐户调整额度成功!')
138                 info_str='管理员:%s.对帐户:%s.进行了额度调整!'%(admin_name,_user_name)
139                 log_file.admin_opert(info_str)#管理员操作日志,传入内容
140                 return
141             else:
142                 return
143 
144     else:
145         print('输入有误,请重新输入!')
146         pass
147 
148 #管理员查看用户日志
149 
150 # USER_LOG=BASE_DIR+'logs\user_log.log'#用户登陆日志文件
151 # USER_ERRO=BASE_DIR+'logs\user_erro.log'#用户错误日志文件
152 # USER_OPERT=BASE_DIR+'logs\user_operation.log'#用户操作日志文件
153 
154 def log_cat(log_name,admin_name):#管理员查看用户日志
155     if log_name=='USER_LOG':
156         with open(config.USER_LOG,'r',encoding='utf-8') as f:
157             for line in f :
158                 print(line)
159         info_str='管理员:%s.查看了用户登陆日志!'%admin_name
160         log_file.admin_opert(info_str)#管理员操作日志,传入内容
161     elif log_name=='USER_ERRO':
162         with open(config.USER_ERRO,'r',encoding='utf-8') as f:
163             for line in f :
164                 print(line)
165         info_str='管理员:%s.查看了用户错误日志!'%admin_name
166         log_file.admin_opert(info_str)#管理员操作日志,传入内容
167     elif log_name=='USER_OPERT':
168         with open(config.USER_OPERT,'r',encoding='utf-8') as f:
169             for line in f :
170                 print(line)
171         info_str='管理员:%s.查看了用户操作日志!'%admin_name
172         log_file.admin_opert(info_str)#管理员操作日志,传入内容
173     else:
174         return
View Code
|       |      |- - -transaction.py#用户操作相关函数
  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 #记账还钱取现等所有的与账户金额相关的操作
  5 import json,time
  6 import os ,sys
  7 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
  8 sys.path.append(BASE_DIR)#增加环境变量
  9 from conf import config# 引入配置文件
 10 from core import user_pass# 引入检测文件
 11 from core import log_file
 12 time_format='%y-%m-%d %X'#定义时间格式
 13 times=time.strftime(time_format)#定义时间
 14 #记账函数,写入数据
 15 def accounting(_user_name,data,**kwargs):#记账函数,写入数据
 16     #db['帐户信用余额']=db['帐户信用余额']-monyall
 17     name_file=config.DATA+_user_name+'.json'#格式化拼接文件名
 18     with open(name_file,'w',encoding='utf-8') as f:
 19         json.dump(data,f)#写入文件
 20         f.flush()
 21     pass
 22 #还款函数
 23 def also_money(mony,s_mony,_user_name,data):#还款函数
 24     data=user_info(_user_name)#调用帐户信息查询函数
 25     print('''您的帐户目前余额:{mony_old}
 26         本期应还金额:{s_mony}
 27         还款现金:{mony}
 28         还款后帐户余额:{mony_new}
 29         '''.format(mony_old=data['帐户信用余额'],s_mony=s_mony,mony=mony,mony_new=data['帐户信用余额']+mony))
 30     q=input('是否确定还款:33[32;1m%s33[0m元: 33[31;1mY/y33[0m 确定! 其它键返回:'%mony)
 31     if q=='y' or q=='Y':
 32         data['帐户信用余额']=data['帐户信用余额']+mony#计算信用余额
 33         accounting(_user_name,data)#调用记帐函数
 34         info_str='%s进行还款操作,还款金额:%s!'%(_user_name,mony)
 35         log_file.user_opert(info_str)#用户操作日志,传入内容
 36         print('成功还款:33[32;1m%s33[0m元.'%mony)
 37     else:
 38         pass
 39 
 40 #取现函数
 41 def cash(mony,_user_name):#取现函数
 42     data=user_info(_user_name)#调用帐户信息查询函数
 43     mony_f=mony*config.POUNDAGE['cash'][ 'interest']#手续费
 44     monyall=mony+mony_f#金额加上手续费
 45     if monyall>data['帐户信用余额']/2:
 46         print('对不起你的余额不足')
 47         pass
 48     else:
 49         print('''您的帐户目前余额:{mony_old}
 50         您提取的现金:{mony}
 51         手续费用:{mony_f}
 52         总共需消费额度:{monyall}
 53         取现后帐户余额:{mony_new}
 54         '''.format(mony_old=data['帐户信用余额'],mony=mony,mony_f=mony_f,monyall=monyall,mony_new=data['帐户信用余额']-monyall))
 55         q=input('是否确定提取现金: 33[31;1mY/y33[0m 确定! 其它键返回')
 56         if q=='y' or q=='Y':
 57             data['帐户信用余额']=data['帐户信用余额']-monyall#计算信用余额
 58             accounting(_user_name,data)#调用记帐函数
 59             info_str='%s进行提现操作,提现金额:%s,手续费:%s,总共消费%s!'%(_user_name,mony,mony_f,monyall)
 60             log_file.user_opert(info_str)#用户操作日志,传入内容
 61             print('请拿好您的现金!')
 62             return
 63         else:
 64             pass
 65 
 66 #转帐函数
 67 def transfer(card,_user_name):#转帐函数
 68     data=user_info(_user_name)#调用帐户信息查询函数
 69     if card_list(str(card)):#查询卡号函数
 70         user_card=card_list(str(card))
 71         print('您输入要转帐的卡号:33[32;1m%s33[0m. 帐户名:33[32;1m%s33[0m'%(card,user_card))
 72         while True:
 73             mony=input('按33[31;1mB/b33[0m退回主界面<<<<  请输入要转帐的金额:')
 74             if mony=='b' or mony=='B':
 75                 break
 76             elif  mony.isdigit():#检测输入是否为整数
 77                 mony=int(mony)#转为int
 78                 mony_f=mony*config.POUNDAGE['transfer'][ 'interest']#手续费
 79                 monyall=mony+mony_f#金额加上手续费
 80                 print('''您的帐户目前余额:{mony_old}
 81                 您要转帐的金额:{mony}
 82                 手续费用:{mony_f}
 83                 总共需消费额度:{monyall}
 84                 转帐后帐户余额:{mony_new}
 85                 '''.format(mony_old=data['帐户信用余额'],mony=mony,mony_f=mony_f,monyall=monyall,mony_new=data['帐户信用余额']-monyall))
 86                 q=input('是否确定转帐: 33[31;1mY/y33[0m 确定! 其它键返回')
 87                 if q=='y' or q=='Y':
 88                     data['帐户信用余额']=data['帐户信用余额']-monyall#计算信用余额
 89                     accounting(_user_name,data)#调用记帐函数,写入数据
 90                     data_u=user_info(user_card)#帐户信息查询函数 ,对方帐户
 91                     data_u['帐户信用余额']=data_u['帐户信用余额']+mony#计算信用余额
 92                     accounting(user_card,data_u)#调用记帐函数,写入对方帐户数据
 93                     info_str='%s进行转帐操作,转帐金额:%s,手续费:%s,总共消费%s;对方卡号:%s,帐户名:%s'%(_user_name,mony,mony_f,monyall,card,user_card)
 94                     log_file.user_opert(info_str)#用户操作日志,传入内容
 95                     print('33[31;1m转帐成功!33[0m'.center(50,'='))
 96                     return
 97                 else:
 98                     print('您的输入不正确,请重新输入!')
 99                     pass
100             else:
101                 pass
102     else:
103         print('33[41;1m您所输入的卡号不存在!请重新输入!33[0m')
104 
105 #商城接口函数
106 def interface(card_id,paswd,mony):#商城接口函数
107     card_name=card_list(card_id)#返回卡号所对应的用户
108     data=user_info(card_name)#帐户信息函数
109     if data["状态"]==1:
110         print('当前帐户被冻结!请更换帐户!')
111         return 0
112     if paswd==data["password"]:
113         print('卡号和密码均通过验证!')
114         #mony=int(mony)#转为int
115         mony_f=mony*config.POUNDAGE['consume'][ 'interest']#手续费
116         monyall=mony+mony_f#金额加上手续费
117         print('本次消费总金额:%s元.'%monyall)
118         q=input('是否确定支付: 33[31;1mY/y33[0m 确定! 其它键返回')
119         if q=='y' or q=='Y':
120             data["帐户信用余额"]-monyall
121             accounting(card_name,data)#调用记帐函数,写入数据
122             info_str='卡号:%s,帐户名:%s,通过商城消费金额:%s元.'%(card_id,card_name,monyall)
123             log_file.user_opert(info_str)#用户操作日志,传入内容
124             return 1
125         else:
126             return 0
127     else:
128         print('密码错误,请重新输入!')
129         return 0
130 
131 
132 
133 
134 
135 #帐户信息函数
136 def user_info(_user_name):#帐户信息函数
137     name_file=config.DATA+_user_name+'.json'#格式化拼接文件名
138     with open(name_file,'r',encoding='utf-8') as f:
139         data=json.load(f)
140     return data
141 #帐户信息查询函数,日志记录
142 def info_user(_user_name):#帐户信息查询函数,日志记录
143     data=user_info(_user_name)
144     print(info_format(data))#用户信息输出格式化函数
145     info_str='%s进行查询操作!'%(_user_name)
146     log_file.user_opert(info_str)#用户操作日志,传入内容
147     return 0
148 #用户信息输出格式化函数
149 def info_format(data):#用户信息输出格式化函数
150     data_format='''============帐户信息===========
151         信用余额:{mony_old}
152         开卡日期:{date_r}
153         有效期限:{date_l}
154         最高额度:{mony_h}
155         还款日期:{day_n}
156         帐单日:{day_m}
157                     '''.format(mony_old=data["帐户信用余额"],date_r=data["开卡日期"],date_l=data["有效期限"],mony_h=data['最高额度'],day_n=data["还款日期"],day_m=data["帐单日"])
158     return data_format
159 #查询卡号函数
160 def card_list(card):#查询卡号函数
161     with open(config.DB_CARD,'r',encoding='utf-8') as f:
162         card_l=eval(f.readline())#读取卡列表
163         if card in card_l:
164             return card_l[card]#返回卡号所对应的用户
165         else:
166             #print('您所输入的卡号不存在')
167             return False
168 
169 
170 #管理员信息提示输出格式化函数
171 def info_format_adm(data,name,PASSWORD_USER):#管理员信息提示输出格式化函数
172     data_format='''======您要添加帐户信息
173     帐户名:{name}
174     信用余额:{mony_old}
175     开卡日期:{date_r}
176     有效期限:{date_l}
177     最高额度:{mony_h}
178     还款日期:{day_n}
179     帐单日:{day_m}
180     卡初始密码:{pas}
181     用户初始密码:{password}
182                     '''.format(name=name,mony_old=data["帐户信用余额"],date_r=data["开卡日期"],date_l=data["有效期限"],mony_h=data['最高额度'],day_n=data["还款日期"],day_m=data["帐单日"],pas=data["password"],password=PASSWORD_USER)
183     return data_format
View Code
|       |      |- - -user_pass.py#用户用户登陆登陆相关函数
  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 #用户名检测相关
  5 from conf import config# 引入配置文件
  6 from core import log_file#引入日志相关函数
  7 
  8 #装饰器
  9 def certi(model):#装饰器
 10     def outr(fun):#装饰器加参数需要多加一层嵌套
 11         def login(*args,**kwargs):#为了兼容各类函数参数,添加 *args,**kwargs 不固定参数
 12             if model=='password':
 13                 print('正在通过password认证')
 14                 #user_name = input('用户名:').strip()
 15                 # paswd=input('密码:').strip()
 16                 # if user_name==name and paswd==password:
 17                 #     print('通过认证')
 18                 return fun(*args,**kwargs)
 19                 # else:
 20                 #     print('用户或密码错误 ,退出')
 21                 exit()
 22             elif model=='lamp':
 23                 print('正在通过lamp认证')
 24                 return fun(*args,**kwargs)
 25             else:
 26                 print('认证出错')
 27         return login
 28     return outr
 29 
 30 
 31 
 32 #检测用户名的函数
 33 def userchar(_user_name,user_list,lock_list,user_file):#检测用户名的函数
 34     while True:
 35         if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常
 36             return True#存在返回真
 37         elif _user_name in user_list and _user_name  in lock_list:#判断用户是否被锁定
 38             print('您的用户已经被锁定,请联系管理员解锁!')
 39             reg=input('按33[31;1m Q/q33[0m 直接退出,其它键返回!')
 40             if reg=='q' or reg=='Q':
 41                 print("您已经退出!" )
 42                 exit()
 43             else:
 44                 break
 45         else:
 46             reg=input('您输入用户不存在,请先联系银行注册!按33[31;1m Q/q33[0m 直接退出  ,其它键返回!')
 47             if  reg=='q' or reg=='Q':
 48                 print("您已经退出!" )
 49                 exit()
 50             else :
 51                 break
 52 
 53 #退出确认函数
 54 def confirm():#退出确认函数
 55     qu=input("是否退出!按33[31;1mY/y33[0m退出? 按其它键返回<<<")
 56     if qu=='Y'or qu=='y':
 57         print("您已经退出!" )
 58         exit()#退出程序
 59     else :
 60         pass
 61 #用户名输入函数
 62 @certi(model='password')
 63 def user_pass():#用户名输入函数
 64     user_file=open(config.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件
 65     user_list=eval(user_file.readline())#转换用户文件中的字符串  admin_user_list:注册用户列表
 66     lock_name=open(config.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件
 67     lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串
 68     bool=True#定义退出循环条件变量
 69     while bool:
 70         print("用户登陆".center(30,'-'))
 71         _user_name=(input('请输入用户名:'))
 72         if userchar(_user_name.strip(),user_list,lock_list,user_file):#运行检测用户名的函数判断,去除两边空格
 73             count=3#定义锁次数
 74             while count>0 :#如果密码错误次数超过退出密码输入
 75                 #password=getpass.getpass('请输入密码:')
 76                 password=input('请输入密码:')
 77                 if password==user_list[_user_name]:#密码通过验证结束循环
 78                     print("密码通过验证")
 79                     bool=False
 80                     #print("欢迎您  33[32;1m%s33[0m  您已经登陆成功!" % _user_name)
 81                     info_str='用户:%s,登陆成功!'%_user_name
 82                     log_file.log_log(info_str)#调用用户登陆日志
 83                     return _user_name#返回用户名
 84                 else:
 85                     count -=1#次数减少
 86 
 87                     print("密码错误请重试,剩余:33[31;1m%s33[0m次! "% count)
 88                     info_str="用户:%s,密码错误剩余:%s"%(_user_name,count)
 89                     log_file.log_err(info_str)#调用用户错误日志
 90                     pass
 91             else:
 92                 print("33[31;1m超出所试次数,账户已锁定!请联系商家!33[0m")
 93                 lock_list.append(_user_name)#将用户名加出锁定列表
 94                 lock_name.seek(0)#指针移动到开头,以免产生多个元组
 95                 lock_name.write(str(lock_list))#写入锁定用户文件
 96                 lock_name.tell()#获取当前指针,以免产生多个元组
 97                 lock_name.close()#关闭锁定用户文件
 98                 confirm()#退出确认函数
 99         else:#如果用户名出错新来过
100             pass
101 
102 
103 
104 #检测管理员用户名的函数
105 def admin_char(_user_name,user_list,lock_list,user_file):#检测管理员用户名的函数
106     while True:
107         if _user_name in user_list and _user_name not in lock_list :#判断用户是否存在并正常
108             return True#存在返回真
109         elif _user_name in user_list and _user_name  in lock_list:#判断用户是否被锁定
110                 print('该管理员已经被锁定,请联系其上级!')
111                 reg=input('按33[31;1m Q/q33[0m 直接退出,其它键返回!')
112                 if reg=='q' or reg=='Q':
113                     print("您已经退出!" )
114                     exit()
115                 else:
116                     return 100
117         else:
118             return False
119 
120 
121 #管理员输入函数
122 @certi(model='lamp')
123 def admin_pass():#管理员输入函数
124     user_file=open(config.ADMIN_USER,'r+',encoding='utf-8')#打开用户列表文件
125     user_list=eval(user_file.readline())#转换用户文件中的字符串  admin_user_list:注册用户列表
126     lock_name=open(config.ADMIN_LOCK,'r+',encoding='utf-8')#打开锁定用户列表文件
127     lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串
128     bool=True#定义退出循环条件变量
129     count=0
130     while bool:
131         print("管理员登陆".center(30,'-'))
132         _user_name=(input('请输入管理员用户名:'))
133         int_s=admin_char(_user_name.strip(),user_list,lock_list,user_file)#运行检测用户名的函数判断,去除两边空格
134         if int_s==100:
135             continue
136         if int_s:
137             while count<=5:
138                 password=input('请输入密码:')
139                 if password==user_list[_user_name]:#密码通过验证结束循环
140                     print("密码通过验证")
141                     bool=False
142                     #print("欢迎您  33[32;1m%s33[0m  您已经登陆成功!" % _user_name)
143                     info_str='管理员:%s,登陆成功!'%_user_name
144                     log_file.admin_log(info_str)#调用管理员登陆日志
145                     return _user_name#返回用户名
146                 else:
147                     count+=1
148                     print("33[31;1m密码错误请重试,错误次数:%s33[0m!"%count)
149                     info_str="用户:%s,密码错误剩余:%s"%(_user_name,count)
150                     log_file.admin_err(info_str)#调用管理员错误日志
151                     if count==5:
152                         print("33[31;1m超出最大密码错误请重试次数!当前管理员用户已被锁定33[0m! ")
153                         lock_list.append(_user_name)#将用户名加出锁定列表
154                         lock_name.seek(0)#指针移动到开头,以免产生多个元组
155                         lock_name.write(str(lock_list))#写入锁定用户文件
156                         lock_name.tell()#获取当前指针,以免产生多个元组
157                         lock_name.close()#关闭锁定用户文件
158                         confirm()#退出确认函数
159                         break
160 
161         else:#如果用户名出错重新来过
162             print("您输入管理员不存在!请重新输入!")
View Code
|       |- - -db/#用户数据目录



|- - -shopping/#商城程序目录
| |- - -__init__.py
| |- - -README
| |- - -bin/#执行目录
| | |- - -__init__.py
| | |- - -shop.py#商城用户登陆执行执行文件
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 
 5 # import time,sys,os
 6 # BASE_DIR1=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 7 # sys.path.append(BASE_DIR1)#增加环境变量
 8 
 9 import os ,sys
10 BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量
11 sys.path.append(BASE_DIR)#增加环境变量
12 #print(BASE_DIR)
13 # print(os.path.exists(BASE_DIR+'shopping\core'))
14 # BASE_DIR_S=BASE_DIR+'shopping\core\'
15 # print(BASE_DIR_S)
16 # #from conf import settings
17 # print(os.path.dirname('shopping'))
18 from shopping.core import shopping#包含目录下的文件脚本
19 
20 
21 if __name__ == '__main__':
22     #程序开始:
23     shopping.main()
View Code
|       |- - -conf/#配置文件目录
| | |- - -__init__.py
| | |- - -config.py#配置文件
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import os ,sys
 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量
 6 sys.path.append(BASE_DIR)#增加环境变量
 7 #print(BASE_DIR)
 8 
 9 #print(DB)
10 USER_FILE=BASE_DIR+'shopping\db\user_file.txt'#定义用户列表文件变量
11 
12 FILE_CORE=BASE_DIR+'atm\core'#接口函数
13 LOCK_NAME=BASE_DIR+'shopping\db\lock_name.txt'#定义锁定用户列表文件变量
14 
15 USER_INFOR=BASE_DIR+'shopping\db\user_infor'#定义用户信息文件变量
16 HISTORY=BASE_DIR+'shopping\db\history'#定义用户消费记文件变量
17 
18 GOODSLIST=BASE_DIR+'shopping\db\goodslist.txt'#定义用户消费记文件变量
View Code
|       |- - -core/##主逻辑程序目录
| | |- - -opert.py#主逻辑函数相关
  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 #相关函数
  5 import os ,sys
  6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量
  7 sys.path.append(BASE_DIR)#增加环境变量
  8 from shopping.conf import config
  9 from atm.core import transaction
 10 
 11 
 12 #结算函数
 13 def shop(shoplist,shop_count,history_user,_user_name,times,infor_list,name_char):#结算函数
 14     shoplist.append(('总额:',shop_count))#列表加入总额
 15     history_list=history_user()#用户消费记录函数
 16     history_list[_user_name][times+'购物清单:']=shoplist#添加时间:清单
 17     with open(config.USER_INFOR,'w',encoding="utf-8") as user_infor:#写入文件用户信息
 18         user_infor.seek(0)#移到最前
 19         user_infor.write(str(infor_list))#写入
 20     with open(config.HISTORY,'r+',encoding='utf-8') as user_history:#购物信息写入文件
 21         user_history.seek(0)#移到最前
 22         user_history.write(str(history_list))#写入
 23     print("你的购物金额余: 33[31;1m%s33[0m 元!" % name_char)
 24     exit(print("谢谢!33[31;1mpython33[0m 商城欢迎您再次光临!"))
 25 
 26 
 27 def regis(user_list,user_file):#用户注册函数
 28     while True:
 29         name=input("按33[31;1mb/B返回33[0m  33[31;1mq/Q33[0m直接退出   请输入您要注册的用户名:")
 30         if name=='b' or name=='B':
 31             break
 32         elif  name=='q' or name=='Q':
 33             confirm()
 34         elif name not in user_list:
 35             print("恭喜!该用户名可以被注册!>>>")
 36             password=input('请输入密码:')
 37             password2=input('请再次确认密码:')
 38             if password==password2:
 39                 name_infor='''恭喜您用户注册成功!
 40                     用户名:{name}
 41                     密  码:{password}
 42                     请牢记您的用户名与密码
 43                 '''
 44                 print(name_infor.format(name=name,password=password2))
 45                 user_list[name]=password2#增加注册用户到字典中
 46                 user_file.seek(0)#称到最前
 47                 user_file.write(str(user_list))#写入文件
 48                 user_file.flush()#即可保存
 49                 #break
 50                 continue
 51         else:
 52             print("该用户名已经被注册啦!请重新来过<<<")
 53             confirm()#是否退出
 54             continue
 55 
 56 def userchar(_user_name,user_list,lock_list,user_file):#检测用户名的函数
 57     while True:
 58         if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常
 59             return True#存在返回真
 60         elif _user_name in user_list and _user_name  in lock_list:#判断用户是否被锁定
 61             print('您的用户已经被锁定,请联系商家解锁!')
 62             reg=input('按33[31;1m Q/q33[0m 直接退出,其它键返回!')
 63             if reg=='q' or reg=='Q':
 64                 print("您已经退出!" )
 65                 exit()
 66             else:
 67                 break
 68         else:
 69             reg=input('您输入用户不存在,请先注册!按33[31;1m Q/q33[0m 直接退出  33[31;1m Y/y33[0m 确定注册,其它键返回!')
 70             if reg=='y' or reg=='Y':
 71                 regis(user_list,user_file)#用户注册函数
 72                 #print('是否直接退出商城?')
 73                 break
 74             elif  reg=='q' or reg=='Q':
 75                 print("您已经退出!" )
 76                 exit()
 77             else :
 78                 break
 79 
 80 def confirm():#退出确认函数
 81     qu=input("是否退出!按33[31;1mY/y33[0m退出? 按其它键返回<<<")
 82     if qu=='Y'or qu=='y':
 83         print("您已经退出!" )
 84         exit()#退出程序
 85     else :
 86         pass
 87 
 88 def user_pass(user_list,lock_list,lock_name,user_file):
 89     bool=True#定义退出循环条件变量
 90     while bool:
 91         print("用户登陆".center(30,'-'))
 92         _user_name=(input('请输入用户名:'))
 93         if userchar(_user_name.strip(),user_list,lock_list,user_file):#运行检测用户名的函数判断,去除两边空格
 94             count=3#定义锁次数
 95             while count>0 :#如果密码错误次数超过退出密码输入
 96                 #password=getpass.getpass('请输入密码:')
 97                 password=input('请输入密码:')
 98                 if password==user_list[_user_name]:#密码通过验证结束循环
 99                     print("密码通过验证")
100                     bool=False
101                     print("欢迎您  33[32;1m%s33[0m  您已经登陆成功!" % _user_name)
102                     return _user_name#返回用户名
103                 else:
104                     count -=1#次数减少
105                     print("密码错误请重试,剩余:33[31;1m%s33[0m次! "% count)
106                     pass
107             else:
108                 print("33[31;1m超出所试次数,账户已锁定!请联系商家!33[0m")
109                 lock_list.append(_user_name)#将用户名加出锁定列表
110                 lock_name.seek(0)#指针移动到开头,以免产生多个元组
111                 lock_name.write(str(lock_list))#写入锁定用户文件
112                 lock_name.tell()#获取当前指针,以免产生多个元组
113                 lock_name.close()#关闭锁定用户文件
114                 confirm()#退出确认函数
115         else:#如果用户名出错新来过
116             pass
117 
118 def infor():#打开用户信息函数
119     with open(config.USER_INFOR,'r+',encoding='utf-8') as user_infor:#打开用户购物信息文件
120         infor_list=eval(user_infor.readline())#转换文件的字符串
121     return infor_list
122 
123 def history_user():#用户购物历史记录函数
124     with open(config.HISTORY,'r',encoding="utf-8") as user_history:#读取用户文件
125         history_list=eval(user_history.readline())#用户购物信息
126     return history_list
127 
128 def history(_user_name):#用户消费记录函数
129     history_list=history_user()#用户购物历史记录
130     history=history_list[_user_name]#用户购物记录信息
131     print('您的购物记录如下:')
132     for k,v in history.items():#转为列表进行输出
133         print(k,v)#输出购物记录
134     choose_index=input("请选择您想要的操作:按33[32;1mq/Q33[0m直接退出商城!其它键返回!")
135     if choose_index=='Q' or choose_index=='q' :
136         choo=input('''>>>>>33[42;1m您确定出退商城吗?33[0m
137                     如果您已经添加商品,此操作将不进行结算,
138                     您就无法将心爱的东东买回家了,按33[31;1my/Y33[0m确定直接退出!''')
139         if choo=='y'or choo=='Y':
140             print("您已经出退商城!")
141             exit()
142         else:
143             pass
144     else:
145         pass
View Code
|       |     |- - -shopping.py#商城主程序
  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 import time,sys,os
  5 import os ,sys
  6 # BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
  7 # sys.path.append(BASE_DIR)#增加环境变量
  8 # print(BASE_DIR)
  9 import os ,sys
 10 BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#获取相对路径转为绝对路径赋于变量
 11 sys.path.append(BASE_DIR)#增加环境变量
 12 from shopping.conf import config
 13 from shopping.core import opert
 14 from atm.core import transaction
 15 
 16 # user_file=open(cfg1.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件
 17 # #with open('user_file.txt','r+',encoding='utf-8') as user_file:
 18 # admin_user_list=eval(user_file.readline())#转换用户文件中的字符串  admin_user_list:注册用户列表
 19 # lock_name=open(cfg1.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件
 20 # lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串
 21 
 22 
 23 
 24 # #程序开始:
 25 def main():
 26     user_file=open(config.USER_FILE,'r+',encoding='utf-8')#打开用户列表文件
 27     #with open('user_file.txt','r+',encoding='utf-8') as user_file:
 28     user_list=eval(user_file.readline())#转换用户文件中的字符串  admin_user_list:注册用户列表
 29     lock_name=open(config.LOCK_NAME,'r+',encoding='utf-8')#打开锁定用户列表文件
 30     lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串
 31 
 32     if os.path.exists(config.HISTORY):#确认文件是否存在
 33         pass
 34     else:
 35         with open(config.HISTORY,'w',encoding='utf-8') as user_history:#创建一个用户帐户购物记录文件
 36             user_history.write('{}')#写入空值
 37         pass
 38     if os.path.exists(config.USER_INFOR):#确认文件是否存在
 39         pass
 40     else:
 41         with open(config.USER_INFOR,'w',encoding='utf-8') as user_infor:#创建一个用户帐户信息记录文件
 42             user_infor.write('{}')#写入空值
 43         pass
 44 
 45     print("欢迎来到33[31;1mpython33[0m购物商城!")
 46 
 47     time_format='%y-%m-%d %X'#定义时间格式
 48     times=time.strftime(time_format)#定义时间
 49     _user_name= opert.user_pass(user_list,lock_list,lock_name,user_file)#将通过验证的用户名赋于变量
 50 
 51     if _user_name in opert.infor():#如果用户信息存在记录就跳过
 52         pass
 53     else:
 54         while True:
 55             name_char=input("首次登陆,请输入工资(购物资金):")#用户输入工资(购物资金)
 56             if  name_char.isdigit():#检测输入是否为整数
 57                 name_char=int(name_char)#转为int
 58                 with open(config.HISTORY,'r+',encoding='utf-8') as user_history:#打开用户帐户购物记录文件
 59                     history_list=eval(user_history.readline())#将文本读为字典
 60                     history_list[_user_name]={}#创建用户购物记录
 61                     user_history.seek(0)#移到开头
 62                     user_history.write(str(history_list))#写入文件
 63                 with open(config.USER_INFOR,'r+',encoding='utf-8') as user_infor:
 64                     infor_list=eval(user_infor.readline())#转换首登用户文件中的字符串
 65                     infor_list[_user_name]={"金额":name_char}
 66                     user_infor.seek(0)
 67                     user_infor.write(str(infor_list))#写入用户信息
 68                 print("充值成功,充值金额:33[32;1m%s33[0m元."% name_char)
 69                 break
 70             else:
 71                 print('金额不能为0或负数请正确输入金额!')
 72                 continue
 73     #再次登陆直接显示用户信息
 74     infor_list=opert.infor()#使用用户信息函数 获取用户信息字典
 75     name_char=int(infor_list[_user_name]['金额'])#获取余额
 76     print("
您的帐户信息:")
 77     print('用户名:33[32;1m%s33[0m:'%_user_name)#输出用户信息
 78     print('您的余额:33[31;1m%s33[0m元.:'%name_char)
 79 
 80 
 81     while True:
 82         print('''您可以进行以下相关操作:

 83                 按 1 >>>查询购物记录。
 84                 按 2 >>>显示商品列表开始购物!
 85                 按 3 >>>直接出退商城!
 86         ''')
 87         choose=input("请选择您所要的功能:")#请用户可以查询
 88         if choose=='1':
 89            opert.history(_user_name)#查询消费记录
 90         elif choose=='2':
 91             ###进入商品列表###
 92             shoplist=[]#购物车列表
 93             shop_count=0#购物金额统计
 94             goodsname=[]#定义商品列表
 95             print('加载商品列表:')
 96             for i in range(40):#加载动画
 97                 sys.stdout.write('#')
 98                 sys.stdout.flush()
 99                 time.sleep(0.05)
100             print('
')
101             with open(config.GOODSLIST,'r',encoding='utf-8') as f:#打开商品列表文件
102                 for line in f:
103                     a=line.find(',')#定位分割符的索引进行分割
104                     goodsname.append((line[0:a],int(line[a+1:])))#元组模式追加到列表,价格转为整数
105             while True:
106                 print("商品列表".center(50,'='))
107                 for index,p_item in enumerate(goodsname):#取出下标输出 商品列表
108                     print(index,p_item)#输出商品列表
109                 print("列表底部".center(50,'='))
110                 user_index=input('请输入商品编号添加你所在购买的商品,按33[31;1mc/C33[0m>> 查看当前购物清单, 33[31;1mh/H33[0m查看消费记录 33[31;1mq/Q33[0m结算商品退出>>>:')
111                 if user_index.isdigit():#判断是否为整数
112                     user_index=int(user_index)#转为数字
113                     if user_index < len(goodsname) and user_index>=0:#判断所选商品编号在在列表
114                         p_item=goodsname[user_index]#读取下标所在(元素)商品
115                         if p_item[1]<=name_char:#余额是否足够
116                             shoplist.append(p_item)#添加到购物车
117                             name_char-=p_item[1]#扣除金额
118                             shop_count+=p_item[1]#累加购物金额
119                             print("添加 33[32;1m%s33[0m 到购物车,价格: 33[32;1m%s33[0m 元"% p_item)
120                             print("你的购物金额余: 33[31;1m%s33[0m 元"% name_char)
121                         else:
122                             print("你的购物金额余: 33[41;1m%s33[0m 元,无法购买该商品!" % name_char)
123                     else:
124                          print('输入错误,该编号 33[41;1m%s33[0m 的商品不存在!'%user_index)
125                 elif user_index=='q'or user_index=='Q':
126                     print('你的购物清单:')
127                     for up in shoplist:#打印购物清单
128                         print(up)
129                     print("你的购物总金额为:33[32;1m%s33[0m 元!"% shop_count)
130                     #print("你的购物金额余: 33[31;1m%s33[0m 元!" % name_char)
131                     while True:
132                         confirm=input("你是否确定结算商品并退出商城?33[31;1m Y/y33[0m是, 33[31;1mN/n33[0m否:")
133                         if confirm== 'Y'or confirm== 'y' :
134                             print('''请选择结算方式:
135                             1  >>>  帐户余额结算.
136                             2  >>>  信用卡结算.
137 
138                             ''')
139                             foo=input('请选择结:')
140                             if foo=='1':
141                                 infor_list[_user_name]['金额']=name_char#修改用户金额(购物后)
142                                 opert.shop(shoplist,shop_count,opert.history_user,_user_name,times,infor_list,name_char)#结算函数
143 
144                             elif foo=='2':
145                                 while True:
146                                     card_id=input('请输入卡号:')
147                                     if transaction.card_list(card_id):#查询卡号函数
148                                         paswd=input('请输入密码:')
149                                         if transaction.interface(card_id,int(paswd),shop_count):#商城接口函数
150                                             opert.shop(shoplist,shop_count,opert.history_user,_user_name,times,infor_list,name_char)#结算函数
151                                             break
152                                     else:
153                                         print('卡号不存!请重新输入!')
154                                         pass
155                                 else:
156                                     pass
157                             else:
158                                 print('选择有误!请重新选择')
159                                 continue
160 
161                         elif confirm=='N'or confirm== 'n' :
162                             break
163                         else:
164                             print("输入错误!请按提示输入!")
165                             continue
166                 elif user_index=='h'or user_index=='H':
167                     opert.history()#查消费记录
168                 elif user_index=='c'or user_index=='C':
169                     print("当前购物清单:")
170                     for up in shoplist:#打印购物清单
171                         print(up)
172                     print("总金额:33[32;1m%s33[0m"%shop_count)
173                     continue
174                 else:
175                     print('33[41;1m输入商品编号错误,请重新输入!33[0m')
176         elif choose=='3':
177             print("您已经出退商城!")
178             exit()#退出商城
179         else:
180             print("33[31;1m输入有误,请重新输入!33[0m")
181             continue
View Code


您的资助是我最大的动力!
金额随意,欢迎来赏!

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

如果,想给予我更多的鼓励,求打

因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【莫柔落切】!

联系或打赏博主【莫柔落切】!https://home.cnblogs.com/u/uge3/

原文地址:https://www.cnblogs.com/uge3/p/6910886.html