zoukankan      html  css  js  c++  java
  • python入门作业---ATM+购物商场程序(2)

    前言:眼看基础知识要学完了。还是把之前丢掉的作业,拿回来重新做吧。再不做,担心后面跟不上进度了。光懂基础知识,开发不了软件,这就有点尴尬了。先找个案例抄一遍。搞清楚逻辑结构再说:.....................

    一、程序需求

    模拟实现一个ATM + 购物商城程序:
    1.额度 15000或自定义
    2.实现购物商城,买东西加入 购物车,调用信用卡接口结账
    3.可以提现,手续费5%
    4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息(没写)
    5.支持多账户登录
    6.支持账户间转账
    7.记录每月日常消费流水
    8.提供还款接口
    9.ATM记录操作日志
    10.提供管理接口,包括添加账户、用户额度,冻结账户等。。。
    11.用户认证用装饰器

    二、程序结构:

    ├── ATM #ATM主程目录
    │   ├── __init__.py
    │   ├── bin                    #ATM 执行文件 目录
    │   │   ├── __init__.py
    │   │   ├── atm.py                 #ATM 执行程序
    │   │   ├── manage.py              #信用卡管理 
    │   ├── conf                   #配置文件
    │   │   ├── __init__.py
    │   │   └── Settings.py            #配置参数
    │   ├── core                   #主要程序逻辑都 在这个目录 里
    │   │   ├── __init__.py
    │   │   ├── accounts.py            #用于从文件里加载和存储账户数据
    │   │   ├── auth.py                #用户认证模块及主要功能函数
    │   │   ├── db_handler.py          #数据库连接引擎
    │   │   ├── logger.py              #日志记录模块
    │   │   ├── main.py                #主逻辑交互程序
    │   │   ├── transaction.py         #记账还钱取钱与账户金额相关的操作,冻结或者锁定用户
    │   ├── db                     #用户数据存储的地方
    │   │   ├── __init__.py
    │   │   ├── account_sample.py   #生成一个初始的账户数据 ,把这个数据 存成一个 以这个账户id为文件名的文件,放在accounts目录 就行了,程序自己去会这里找
    │   │   └── accounts            #存各个用户的账户数据 ,一个用户一个文件
    │   │       └── 123.json           #新创建的用户账户示例文件
    │   │       └── 1234.json          #一个用户账户示例文件
    │   │       └── 123456.json        #一个用户账户示例文件
    │   │       └── 6230001.json       #管理用户账户示例文件
    │   └── log                    #日志目录
    │        ├── access.log              #用户访问和操作的相关日志
    │        └── login_in.log            #登陆日志
    └── shopping_mall               #电子商城程序,需单独实现,主要实现购物的功能。
    │        └── __init__.py
    │        └── product.txt             #存放商品的txt文件
    │        └── shopping_list.txt       #存放购物清单的txt.文件
    │        └── shopping_mall.py        #购物商城程序
    ├── README
    
    目录
    View Code

    三、简要说明

    1.程序从/bin/atm.py开始执行if __name__ == '__main__':
                                                    main.run()
    2.程序转到/core/main.py下的run()函数,登陆时调用/core/auth的acc_login()进行登陆验证:用到了/core/auth下的acc_auth2()方法进行验证(此时传入的参数时用户输入的账户和密码)
    acc_auth2中有调用了/core/db_handler下的db_handler()方法(参数是输入的账户名)在db_handler中只是进行判断是什么引擎,return file_db_handle(数据库引擎)解析文件,返回文件执行加载输入的用户的账户的所有数据
    接下来判断是否为管理者账户,或者是否被冻结,若都不是,则判断输入的密码是否与数据库中的密码一样,在判断到期时间是否过期
    所有都通过的话就返回这个账户的数据,之前已经创建了一个空字典,里面有是否验证:用户数据:用户账户:,判断是否被验证过,然后把用户数据临时的传递到里面,执行主循环函数
    可以选择进入到购物商城,或者信用卡操作或者退出
    1)购物商城
      调用/shopping_mall/shopping_mall.py文件执行,主循环函数,选择你是商家还是用户,
      ①如果选择商家,商家有增加商品修改商品的功能
      ②如果选择用户,用户则有购物,刷信用卡消费的功能,当退出时打印消费清单
    2)信用卡操作
       调用/core/main.py下interactive(用户的所有数据)调用主循环函数,可以打印账户信息、还款、取款、转账、账单、退出等操作
      ①账户信息
      ②还款
      ③取款
      ④转账
      ⑤账单
      ⑥退出
    3)若在账户登陆的时候进行输入的时管理员账户调用/bin/manage.py则可以对用户进行管理,解冻    用户、冻结用户、申领新卡
      ①添加账户
      ②冻结账户
      ③解冻账户
      ④退出

     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/7/14
     5 import os,sys
     6 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     7 
     8 sys.path.append(BASE_DIR)
     9 
    10 from core import main
    11 
    12 
    13 
    14 if __name__ == '__main__':
    15     main.run()
    /atm/bin/atm
     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/13 
     6 '''
     7 import os,sys
     8 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     9 #print(base_dir)
    10 sys.path.append(BASE_DIR)
    11 
    12 from core import main
    13 
    14 
    15 if __name__ == '__main__':
    16     main.goto_manage()
    /atm/bin/manage

     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/7/14
     5 
     6 #参数配置文件
     7 import os,sys,logging
     8 
     9 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#/Atm
    10 
    11 DATABASE = {
    12     'engine': 'file_storage',
    13     'name': 'account',
    14     'path': "%s/db" % BASE_DIR#../Atm
    15 }
    16 
    17 LOG_LEVEL = logging.INFO  #记录等级
    18 LOG_TYPES = {
    19     'transaction': 'transaction.log',
    20     'access': 'access.log'
    21 }
    22 
    23 #发生交易的配置类型
    24 TRANSACTION_TYPE = {
    25     'repay':{'action':'plus','interest':0},#还款
    26     'withdraw':{'action':'minus','interest':0.05},#取现是降低可用余额
    27     'transfer':{'action':'minus','interest':0.05},#转账是降低可用余额
    28     'consume':{'action':'minus','interest':0},   #消费
    29 }
    /atm/conf/setting

     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/8/12
     5 import os,sys
     6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
     7 sys.path.append(BASE_DIR)
     8 from core import db_handler
     9 from conf import setting
    10 from core import logger
    11 import json,time
    12 
    13 
    14 def load_current_balance(account_id):
    15     db_path = db_handler.db_handler(setting.DATABASE)  # 返回的是数据文件路径
    16     account_file = "%s/%s.json" % (db_path, account_id)  # 取到数据文件的绝对地址
    17     with open(account_file, "r") as f:
    18         account_data = json.load(f)
    19         return account_data
    20 
    21 def dump_account(account_data):
    22     db_path = db_handler.db_handler(setting.DATABASE)  # 返回的是数据文件路径
    23     account_file = "%s/%s.json" % (db_path, account_data["id"])  # 取到数据文件的绝对地址
    24     with open(account_file,"w") as f:
    25         json.dump(account_data,f)
    26     return True
    /atm/core/accounts
     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/7/14
     5 import os,sys
     6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
     7 sys.path.append(BASE_DIR)
     8 from core import db_handler
     9 from conf import setting
    10 from core import logger
    11 import json,time,functools
    12 
    13 
    14 #做一个登陆装饰器
    15 def login_required(func):
    16     @functools.wraps(func)
    17     def wrapper(*args,**kwargs):
    18         if args[0].get('is_authenticated'):
    19             return func(*args,**kwargs)
    20         else:
    21             exit("用户认证失败")
    22     return wrapper
    23 
    24 
    25 #第二步,做一个用户认证功能
    26 #初始化信息,一旦认证成功,就把数据传给这个字典
    27 
    28 #输入账户id 和密码
    29 def acc_auth(account,password):
    30     db_path=db_handler.db_handler(setting.DATABASE)#返回的是数据文件路径
    31     account_file="%s/%s.json"%(db_path,account)#取到数据文件的绝对地址
    32     #print(account_file)                                   #打印一下地址
    33     if os.path.isfile(account_file):
    34         with open(account_file,"r") as f:
    35             account_data=json.load(f)
    36             if account_data["password"]==password:
    37                 exp_time_stamp=time.mktime(time.strptime(account_data["expir_date"],'%Y-%m-%d'))
    38                 if time.time()>exp_time_stamp:
    39                     print("33[32;1m账户%s已经过期,请联系管理人处理。:33[0m"%account)
    40                 else:
    41                     return account_data
    42             else:
    43                 print("33[32;1m账户或密码,存在错误。33[0m")
    44 
    45 def acc_login(user_data,log_obj):#用户验证函数
    46     retry_count=0
    47     while user_data["is_authenticated"] is not True and retry_count<3:
    48         account=input("33[32;1m账户:33[0m").strip()
    49         password = input("33[32;1m密码:33[0m").strip()
    50         auth=acc_auth(account,password) #调用登陆函数
    51         if auth:
    52             user_data["is_authenticated"]=True
    53             user_data["account_id"]=account
    54             log_obj.info("账户 %s 登陆登陆成功"%account)
    55             return auth
    56         retry_count+=1
    57     else:
    58         log_obj.error("账户 %s 多次尝试登陆"%account)#打印一个登陆信息
    59         exit()#退出登录程序
    /atm/core/auth
     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/8/12
     5 
     6 
     7 def file_db_handle(conn_params):
     8     #print("file db:",conn_params)
     9     db_path="%s/%s"%(conn_params["path"],conn_params["name"])
    10     return db_path
    11 
    12 def mysql_db_handle(conn_parms):
    13     pass
    14 
    15 def db_handler(conn_parms):
    16     "链接数据文件"
    17     if conn_parms["engine"]=="file_storage":
    18         return file_db_handle(conn_parms)
    19     elif conn_parms["engine"]=="mysql":
    20         return mysql_db_handle(conn_parms)
    /atm/core/db_handler
     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/7/15
     5 import os,sys
     6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
     7 sys.path.append(BASE_DIR)
     8 import logging
     9 from conf import setting
    10 # level=logging.WARNING#可以把这个放在配置文件中
    11 def logger(log_type):
    12     logger=logging.getLogger(log_type)
    13     logger.setLevel(setting.LOG_LEVEL)
    14 
    15     log_file=r"%slog\%s"%(setting.BASE_DIR,setting.LOG_TYPES[log_type])
    16     fh=logging.FileHandler(log_file+'.log')
    17     #ch=logging.StreamHandler()
    18     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    19     fh.setFormatter(formatter)
    20     #ch.setFormatter(formatter)
    21     logger.addHandler(fh)
    22     #logger.addHandler(ch)
    23 
    24     return logger
    25 
    26 
    27 if __name__=='__main__':
    28     logger('test_logger').warning('logger debug message')
    29     # print(log_file)
    /atm/core/logger
    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    #__author:Administrator
    #date:2018/7/14
    import os,sys
    BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
    sys.path.append(BASE_DIR)
    
    
    
    from core import auth
    from core import logger
    from core import accounts
    from core import transaction
    from core.auth import login_required
    from core import manage_admin
    import time
    
    
    user_data={
        'account_id':None,#账号id
        'is_authenticated':False, #是否认证
        'account_data':None #账户其他数据
    }
    
    trans_logger=logger.logger('transaction') #交易logger
    access_logger=logger.logger('access')      #登录logger
    
    
    
    @login_required
    def account_info(acc_data):
        account_data = accounts.load_current_balance(acc_data['account_id'])
        current_balance = """
            ------卡   基本信息 ---------
            卡号:        %s
            信用额度:    %s
            可用额度:    %s
            开卡时间:   %s
            过期时间:   %s
            """ % (account_data['id'],account_data["credit"], account_data['balance'],account_data["enroll_date"],account_data["expir_date"])
        print(current_balance)
    @login_required
    def repay(acc_data):
        #取出最新的数据,为了保证数据的安全
        account_data=accounts.load_current_balance(acc_data['account_id'])
        current_balance="""
        ------balance 余额 INFO ---------
        Credit:     %s
        Balance:    %s
        """%(account_data['id'],account_data['balance'])
        print(current_balance)
        back_flag=False
        while not back_flag:
            repay_amount=input("33[33;1m输入你要还款的金额:[放弃:q]33[0m").strip()
            if len(repay_amount)>0 and repay_amount.isdigit():
                new_blance=transaction.make_transaction(trans_logger,account_data,'repay',repay_amount)#交易完成后得到最新数据
                if new_blance:
                    print("33[33;1m最新余额:%s33[0m"%new_blance["balance"])
            elif repay_amount=="q":
                back_flag=True
            else:
                print("33[33;1m[%s] is not a valid amount,only accept integer!!33[0m"%repay_amount)
    @login_required
    def withdraw(acc_data):#取款
        account_data = accounts.load_current_balance(acc_data['account_id'])
        current_balance = """
           ------balance 余额 INFO ---------
           Credit:     %s
           Balance:    %s
           """ % (account_data['id'], account_data['balance'])
        print(current_balance)
        back_flag = False
        while not back_flag:
            withdraw_amount = input("33[33;1m输入你要取款的金额:[放弃:q]33[0m").strip()
            if len(withdraw_amount) > 0 and withdraw_amount.isdigit():
                new_blance = transaction.make_transaction(trans_logger, account_data, 'withdraw', withdraw_amount)  # 交易完成后得到最新数据
                if new_blance:
                    print("33[33;1m最新余额:%s33[0m" % new_blance["balance"])
            elif withdraw_amount == "q":
                back_flag = True
            else:
                print("33[33;1m 账户或输入金额 is not a valid amount!33[0m")
    @login_required
    def transfer(acc_data): #4、转账
        account_data = accounts.load_current_balance(acc_data['account_id'])
        current_balance = """
              ------balance 余额 INFO ---------
              Credit:     %s
              Balance:    %s
              """ % (account_data['id'], account_data['balance'])
        print(current_balance)
        back_flag=False
        while not back_flag:
            duifang_account=input("33[31;1m请输入对方帐户名:33[0m").strip()
            transfer_amount=input("33[31;1m转账金额:33[0m").strip()
            if duifang_account and transfer_amount=="b":
                return
            elif len(transfer_amount)>0 and transfer_amount.isdigit():
                new_blance=transaction.make_transaction(trans_logger,account_data,"transfer",transfer_amount,re_account=duifang_account)
                if new_blance:
                    print("33[41;1m转账成功!33[0m")
                    print("33[33;1m最新余额:%s33[0m" % new_blance["balance"])
            else:
                print("33[33;1m 账户或输入金额 is not a valid amount!33[0m")
    
    @login_required
    def pay_check(acc_data):
        pass
    @login_required
    def logout(acc_data):
        exit("程序已退出")
     #############################################
    def shopping_mall_this(acc_data):
    #     account_data = accounts.load_current_balance(acc_data['account_id'])#取得最新数据
    #     saving=account_data["balance"]#得到可用额度
    #     #surplus_amount=main.shopping_action(saving)#需要返回 消费的金额
    #     new_blance = transaction.make_transaction(trans_logger, account_data, 'consume', surplus_amount)  # 交易完成后得到最新数据
    #     if new_blance:
    #         print("33[33;1m最新余额:%s33[0m" % new_blance["balance"])
        pass
    ###############################################
    
    def goto_manage():
        manage_admin.manage_main()
    def interactive(acc_data):
        menu=u'''
        --------中国银行---------
        33[32;1m1、账户信息
        2、还款
        3、取款
        4、转账
        5、账单
        6、退出33[0m'''
        menu_dic={
            "1":account_info, #1、账户信息
            "2":repay,        #2、还款
            "3":withdraw,     #3、取款
            "4":transfer,      #4、转账
            "5":pay_check,    #5、账单
            "6":logout        #6、退出
        }
        exit_flag=False
        while not exit_flag:
            print(menu)
            user_option=input("请选择>>>").strip()
            if user_option in menu_dic:
                menu_dic[user_option](acc_data)
    
            else:
               print("33[32;1m您的选择不存在。33[0m")
    def atm_shoping_menu(acc_data):
        main_menu=u"""
        ----------主菜单---------
         33[32;1m
         1.购物商城
         2.银行卡操作
         3.退出33[0m"""
        main_menu_dic={
            "1":shopping_mall_this,
            "2":interactive,
            "3":logout
        }
        exit_flag1=False
        while not exit_flag1:
            print(main_menu)
            user_option=input("请选择:").strip()
            if user_option=="b":
                return
            elif user_option in main_menu_dic:
                main_menu_dic[user_option](acc_data)
            else:
                print("33[31;1m选择不存在!33[0m")
    
    
    def run():
        #首先需要进行用户验证
        acc_data=auth.acc_login(user_data,access_logger)
    
        if user_data['is_authenticated']: #确认是否验证
            user_data["account_data"]=acc_data
            #interactive(user_data)##把user_data里的所有数据传入菜单函数,进行下一步操作
            #atm_shoping_menu(user_data)#接入商场菜单
            if acc_data["role"]==0 or acc_data["role"]=="0":#role  0 管理员    1是普通用户
                goto_manage()
            if acc_data["role"]==1 or acc_data["role"]=="1":
                atm_shoping_menu(user_data)
    
    
    
    
    
    
    if __name__=='__main__':
        run()
    /atm/core/main
      1 #!/usr/bin/python3
      2 # -*- coding:utf-8 -*-
      3 #__author:Administrator
      4 #date:2018/8/12
      5 
      6 #管理端(提供管理接口,包括添加账户、用户额度,冻结账户)
      7 #解冻账户
      8 #from core.auth import login_required
      9 from core import accounts
     10 from core import transaction
     11 
     12 #解冻账户
     13 def unblock_account():
     14     user_input = input("请输入你要解冻的用户:")
     15     flag = 0
     16     #锁定用户
     17     val = transaction.unlock_or_yes(user_input,flag)
     18     if val == 0:
     19         print("解冻成功!")
     20         return
     21 #冻结账户
     22 def block_account():
     23     '''
     24     冻结账户初步构想是,在linux里把他的权限改掉;
     25     或者将其文件改名
     26     :param acc_data:
     27     :return:
     28     '''
     29     user_input = input("请输入你要冻结的用户:")
     30     flag = 1
     31     #锁定用户
     32     val = transaction.lock_or_not(user_input,flag)
     33     if val == 1:
     34         print("冻结成功!")
     35         return
     36 #添加账户、用户额度
     37 def add_account():
     38     account = {
     39         "id": None,
     40         "balance": None,
     41         "expir_date": None,
     42         "enroll_date": None,
     43         "credit": None,
     44         "pay_day": None,
     45         "password": None,
     46         "status": 0,
     47         "role":1
     48     }
     49     menu = {
     50         0: "账户(数字):",
     51         1: "密码:",
     52         2: "信用额度:",
     53         3: "余额度:",
     54         4: "注册时间:",
     55         5: "到期时间:",
     56         6: "还款周期:",
     57         7: "默认(0 正常  1 锁卡 2  遗失):",
     58         8:"权限(0 管理员,1用户。默认用户1):"
     59          }
     60     menu_user = {
     61         0: "id",
     62         1: "password",
     63         2: "credit",
     64         3: "balance",
     65         4: "enroll_date",
     66         5: "expir_date",
     67         6: "pay_day",
     68         7: "status",
     69         8:"role"
     70     }
     71     for i in range(7):
     72         data = input("%s" % menu[i]).strip()
     73         account['%s' % menu_user[i]] = data
     74 
     75     account["balance"]=float(account["balance"] )
     76     accounts.dump_account(account)#写入文件
     77     print("创建成功!")
     78     return
     79 def logout():
     80     exit("程序退出!")
     81 #管理界面主程序
     82 def manage_main():
     83 
     84     menu = u'''
     85     ---------管理界面---------
     86     1.添加账户
     87     2.冻结账户
     88     3.解冻账户
     89     4.退出'''
     90     menu_dic = {
     91         '1': add_account,
     92         '2': block_account,
     93         '3': unblock_account,
     94         '4': logout
     95     }
     96     exit_flag = False
     97     while not exit_flag:
     98         print(menu)
     99         user_option = input("请输入你的选择:")
    100         if user_option in menu_dic:
    101             menu_dic[user_option]()
    102         else:
    103             print("33[31;1m选择不存在!33[0m")
    104 
    105 if __name__=="__main__":
    106     #manage_main()
    107     pass
    /atm/core/manage_admin
     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/8/12
     5 import os,sys
     6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
     7 sys.path.append(BASE_DIR)
     8 from conf import setting
     9 from core import accounts
    10 
    11 def make_transaction(log_obj,account_data,tran_type,amount,**kwargs):
    12     amount=float(amount)
    13 
    14     if tran_type in setting.TRANSACTION_TYPE:
    15 
    16         interest=amount*setting.TRANSACTION_TYPE[tran_type]["interest"]#计算利息
    17         old_balance=account_data["balance"]
    18         if setting.TRANSACTION_TYPE[tran_type]["action"]=="plus":
    19             new_balance=old_balance+amount+interest
    20         elif setting.TRANSACTION_TYPE[tran_type]["action"]=="minus":
    21             new_balance=old_balance-amount-interest
    22 
    23             if kwargs.get("re_account"):#转账用的语句。获取转账对方的账号
    24                 re_account_data=accounts.load_current_balance(kwargs.get("re_account"))
    25                 re_account_balance=re_account_data["balance"]+amount
    26                 re_account_data["balance"]=re_account_balance
    27                 print("对方账户信息:%s"%re_account_data)
    28                 accounts.dump_account(re_account_data)
    29 
    30             elif new_balance<0:
    31                 print("33[31;1m[%s]账户的信用余额不足以支付此次交易[-%s],你当前的余额是[%s]33[0m"%(
    32                     account_data['id'],amount+interest,old_balance))
    33                 return None
    34 
    35         account_data["balance"]=new_balance
    36         accounts.dump_account(account_data)#保存数据
    37         log_obj.info("account:%s action:%s   amount:%s    interest:%s "%(account_data['id'],tran_type,amount,interest))
    38         return account_data  #返回最新数据
    39     else:
    40         print("33[31;1m交易类型【%s】 is not exist!!!33[0m"%tran_type)
    41 
    42 #冻结或者锁定用户
    43 def lock_or_not(account,flag):
    44     data=accounts.load_current_balance(account)
    45     if data["status"]==1:
    46         print("该账户已经锁定!")
    47     else:
    48         data["status"]=flag
    49         accounts.dump_account(data)
    50         return flag
    51 def unlock_or_yes(account,flag):
    52     data = accounts.load_current_balance(account)
    53     if data["status"] == 1:
    54         data["status"] = flag
    55         accounts.dump_account(data)
    56         return flag
    57     else:
    58         print("该账户处于正常状态。")
    /atm/core/transaction

     1 #!/usr/bin/python3
     2 # -*- coding:utf-8 -*-
     3 #__author:Administrator
     4 #date:2018/7/14
     5 
     6 import os ,sys
     7 import json
     8 
     9 # acc_dic={
    10 #     'id':1234,     #卡号
    11 #     'password':'abc',  #密码
    12 #     'credit':15000,       #信用额度
    13 #     'balance':15000,     #余额度
    14 #     'enroll_date':'2014-12-23',  #注册时间
    15 #     'expir_date':'2019-12-22',  # 到期时间
    16 #     'pay_day':22,
    17 #     'status':0 ,  #0 正常  1 锁卡 2  遗失
    18 #    "role":1
    19 # }
    20 acc_dic={
    21     'id':"admin",     #卡号
    22     'password':'abc123',  #密码
    23     'expir_date':'3000-12-22',#设置一个远大于今天的数值。管理员有效期
    24     'role':0      #0 管理员 1客户
    25 }
    26 
    27 # print(sys.platform) #返回操作系统平台名称
    28 # print(sys.version) #获取Python解释程序的版本信息
    29 def zhanghao(string):#生成一个测试用的银行G个人用户信息
    30 
    31     with open(r'account\%s.json'%acc_dic['id'],'w') as f:
    32         json.dump(string,f)
    33 
    34 
    35 def main():
    36     if sys.platform=='win32':
    37         # print('这是Windows操作系统')
    38         if os.path.isdir('account'):#判断当前目录,是否存在文件名为‘account’的文件夹
    39             zhanghao(acc_dic)
    40         else:
    41             os.mkdir('account') # 如果文件夹不存在,则创建以一个新的文件夹
    42             zhanghao(acc_dic)
    43     else:
    44         print('本软件暂不兼容Windows以外的操作系统,如需帮助,请联系开发人员')
    45 
    46 def del_file():#如果需要初始化数据,删除已有的数据文件,可以运行该程序
    47     print(os.listdir('account'))
    48     for i in os.listdir('account'):
    49         file=os.path.join('account',i)
    50         os.remove(file)
    51 
    52 if __name__=='__main__':
    53     main()
    54     #del_file()
    /atm/db/account_sample

    代码:完成信用卡操作

    https://github.com/Mengchangxin/ATM_SHOPPINGmail



     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/14 
     6 '''
     7 
     8 import os,sys
     9 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    10 #print(base_dir)
    11 sys.path.append(BASE_DIR)
    12 
    13 from core import main
    14 
    15 
    16 if __name__ == '__main__':
    17     a=main.shopping_action("5000")
    18     print(a,type(a))
    /shopping_mall/bin/bin.py

     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/14 
     6 '''
     7 import os,sys,logging
     8 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     9 
    10 db_file=os.path.join(BASE_DIR,"db","access","produc.json")
    11 
    12 LOG_TYPES = {
    13     'shopping': 'shopping.log',
    14 }
    15 LOG_LEVEL = logging.INFO  #记录等级
    16 DATABASE = {
    17         'engine': 'file_storage',
    18         'name': 'access',
    19         "file":"produc.json",
    20         'path': "%s/db" % BASE_DIR
    21 }
    22 
    23 
    24 
    25 
    26 if __name__=="__main__":
    27         print(BASE_DIR)
    28         print(db_file)
    /shopping_mall/conf/settings.py

     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/14 
     6 '''
     7 import os,sys,logging
     8 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
     9 
    10 from conf import settings
    11 from core import db_handler
    12 import json
    13 
    14 #取数据
    15 def load_current_balance():
    16     db_file_path = db_handler.db_handler(settings.DATABASE)  # 返回的是数据文件路径# 取到数据文件的绝对地址
    17     with open(db_file_path, "r") as f:
    18         account_data = json.load(f)
    19         return account_data
    20 
    21 
    22 #存数据
    23 def dump_account(account_data):
    24     db_file_path = db_handler.db_handler(settings.DATABASE)  # 返回的是数据文件路径 # 取到数据文件的绝对地址
    25     with open(db_file_path,"w") as f:
    26         json.dump(account_data,f)
    27     return True
    /shopping_mall/core/accounts.py
     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/14 
     6 '''
     7 import os,sys,logging
     8 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
     9 def file_db_handle(conn_params):
    10     db_path=os.path.join(conn_params["path"],conn_params["name"],conn_params["file"])
    11     return db_path
    12 
    13 def mysql_db_handle(conn_parms):
    14     pass
    15 
    16 def db_handler(conn_parms):
    17     "链接数据文件"
    18     if conn_parms["engine"]=="file_storage":
    19         return file_db_handle(conn_parms)
    20     elif conn_parms["engine"]=="mysql":
    21         return mysql_db_handle(conn_parms)
    /shopping_mall/core/db_handler.py
     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/14 
     6 '''
     7 import os,sys
     8 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__name__))))
     9 import logging
    10 from conf import settings
    11 # level=logging.WARNING#可以把这个放在配置文件中
    12 def logger(log_type):
    13     logger=logging.getLogger(log_type)
    14     logger.setLevel(settings.LOG_LEVEL)
    15 
    16     log_file=r"%slog\%s"%(settings.BASE_DIR,settings.LOG_TYPES[log_type])
    17     fh=logging.FileHandler(log_file+'.log')
    18     #ch=logging.StreamHandler()
    19     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    20     fh.setFormatter(formatter)
    21     #ch.setFormatter(formatter)
    22     logger.addHandler(fh)
    23     #logger.addHandler(ch)
    24 
    25     return logger
    26 
    27 
    28 if __name__=='__main__':
    29     logger('test_logger').warning('logger debug message')
    30     # print(log_file)
    /shopping_mall/core/logger.py
     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 Administrator 
     5 2018/8/14 
     6 '''
     7 import os,sys,logging,time
     8 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
     9 from core import accounts
    10 from core import logger
    11 shopping_log=logger.logger("shopping")
    12 
    13 product_list=accounts.load_current_balance()
    14 #print(product_list)
    15 
    16 
    17 def shopping_action(sum_amount):
    18         # saving=input("please input your saving:")
    19         saving=sum_amount
    20         shopping_car=[]
    21         if saving.isdigit():
    22                 saving=float(saving)
    23                 while True:
    24                         for j in product_list.items():
    25                                 print(j)
    26                         choice=input('choice your product number[quit:q]')
    27                         if choice.isdigit():
    28                                 if choice in product_list:
    29                                         p_item=product_list[choice]
    30                                         for name,price in p_item.items():
    31                                                 continue
    32                                         if price<saving:
    33                                                 saving-=price
    34                                                 shopping_car.append(p_item)
    35                                                 shopping_log.info("选购商品 {name}  价格是:{price}".format(name=name,price=price))#记录购物信息
    36                                         else:
    37                                                 print('余额不足,还剩%s'%saving)
    38                                         print(p_item)
    39                                 else:
    40                                         print('number is out inside')
    41                         elif choice.lower()=='q':
    42                                 print('----------已经购买如下商品-------------')
    43                                 print('编码','商品名称','商品价格','数量',sep='	')
    44                                 y_sum=[]
    45                                 x = 1
    46                                 for y in shopping_car:
    47 
    48                                         if y not in y_sum:
    49                                                 for y_1,y_2 in y.items():
    50                                                         continue
    51                                                 print(x,y_1,y_2,shopping_car.count(y),sep='	')
    52                                                 y_sum.append(y)
    53                                                 time.sleep(1)
    54                                                 x=x+1
    55 
    56                                 #print('剩余金额%s'%saving)
    57                                 cost_cash=float(sum_amount)-saving  # 返回消费的金额
    58                                 return cost_cash
    59                                 break
    60                         else:
    61                                 print("invalid input")
    62 
    63 if __name__=="__main__":
    64         shopping_action("50000")
    /shopping_mall/core/main.py

     1 #!/usr/bin/env python3
     2 #-*- coding:utf-8 -*-
     3 '''
     4 用来生成商品测试数据
     5 Administrator 
     6 2018/8/14 
     7 '''
     8 import os,sys,logging
     9 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    10 sys.path.append(BASE_DIR)
    11 import json
    12 from conf import settings
    13 
    14 product_list={
    15     "1":{'iphone6s':5800},
    16     "2":{'mac book':9000,},
    17     "3":{'coffee':32},
    18     "4":{'python book':80},
    19     "5":{'bicyle':1500},
    20     "6":{'football':100}
    21 
    22 }
    23 files=settings.db_file
    24 def save_db(data):
    25     with open(files,"w") as f:
    26         json.dump(data,f)
    27 
    28 if __name__=="__main__":
    29     save_db(product_list)
    /shopping_mall/db/add_produce.py

    怎么互相给接口???

  • 相关阅读:
    Centos7 tomcat 启动权限
    Tomcat下post请求大小设置
    postgres安装时locale的选择
    flink 1.11.2 学习笔记(1)-wordCount
    prometheus学习笔记(3)-使用exporter监控mysql
    prometheus学习笔记(2)-利用java client写入数据
    mock测试及jacoco覆盖率
    shading-jdbc 4.1.1 + tk.mybatis + pagehelper 1.3.x +spring boot 2.x 使用注意事项
    prometheus学习笔记(1)-mac单机版环境搭建
    redis数据类型HyperLogLog的使用
  • 原文地址:https://www.cnblogs.com/Mengchangxin/p/9458083.html
Copyright © 2011-2022 走看看