• 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/

  • 相关阅读:
    net.sf.jsqlparser.statement.select.PlainSelect.getGroupByColumnReferences()Ljava/util/List(版本问题)
    Netty ByteBuf
    Vertx session 使用须知
    用Vert.x shiro jdbcRealm对restful api鉴权
    Vert.x发送 HTTP/HTTPS请求及重定向
    解决“hao123”劫持浏览器主页
    cannot find module bcrypt_lib.node
    nodejs运行项目报错TypeError: db.collection is not a function
    [Java] Stream flatMap
    [Spring Security] Authotization
  • 原文地址:https://www.cnblogs.com/uge3/p/6910886.html
Copyright © 2020-2023  润新知