24.ATM+购物车项目(思路版)

一、先写好项目的基本文件夹和文件

  conf(文件夹)

    settings.py

  core(文件夹)

    admin.py

    src.py

  db(文件夹)

    user_data(文件夹)

    db_handler.py

  interface(文件夹)

 

    admin_interface.py

    bank_interface.py

    shop_interface.py

    user_interface.py

  lib(文件夹)

    common.py

  log(文件夹)

  readme.md

  start.py

 

二、先写启动文件start.py中的代码

start.py

from core import src

if __name__ == '__main__':
    src.run()

  

三、start.py中调用了src.run(),因此,接下来开始写src.py中的代码

(1)先写run()函数

 1 def run():
 2     while True:
 3         print('''
 4         ============ATM + 购物车============
 5                 0.退出功能
 6                 1.注册功能
 7                 2.登录功能
 8                 3.查看余额
 9                 4.提现功能
10                 5.还款功能
11                 6.转账功能
12                 7.查看流水
13                 8.购物功能
14                 9.查看购物车
15                 10.管理员功能
16             ============ end ==================        
17         ''')

 

(2)提示用户输入

 1 def run():
 2     while True:
 3         print('''
 4         ============ATM + 购物车============
 5                 0.退出功能
 6                 1.注册功能
 7                 2.登录功能
 8                 3.查看余额
 9                 4.提现功能
10                 5.还款功能
11                 6.转账功能
12                 7.查看流水
13                 8.购物功能
14                 9.查看购物车
15                 10.管理员功能
16             ============ end ==================        
17         ''')
18         choice = input('请输入指令编号:').strip()

(3)判断用户输入的编号是否在函数字典中

func_dic = {
    '0': exit,
    '1': register,
    '2': login,
    '3': check_banlance,
    '4': withdraw,
    '5': repay,
    '6': transfer,
    '7': check_flow,
    '8': shopping,
    '9': check_shop_car,
    '10': admin,
}


def run():
    while True:
        print('''
        ============ATM + 购物车============
                0.退出功能
                1.注册功能
                2.登录功能
                3.查看余额
                4.提现功能
                5.还款功能
                6.转账功能
                7.查看流水
                8.购物功能
                9.查看购物车
                10.管理员功能
            ============ end ==================        
        ''')
        choice = input('请输入指令编号:').strip()
        if choice in func_dic:
            func_dic.get(choice)()
            continue
        else:
            print('输入的质量编号不正确,请重新输入!')

(4)写函数字典中的各个函数

 1 # 1.注册功能
 2 def register():
 3     pass
 4 
 5 # 2.登录功能
 6 def login():
 7     pass
 8 
 9 # 3.查看余额
10 
11 def check_banlance():
12     pass
13 
14 # 4.提现功能
15 
16 def withdraw():
17     pass
18 
19 # 5.还款功能
20 
21 def repay():
22     pass
23 
24 # 6.转账功能
25 
26 def transfer():
27     pass
28 
29 # 7.查看流水
30 
31 def check_flow():
32     pass
33 
34 
35 # 8.购物功能
36 
37 def shopping():
38     pass
39 
40 # 9.查看购物车
41 
42 def check_shop_car():
43    pass
44 
45 # 10.管理员功能
46 
47 def admin():
48     pass
49 
50 
51 func_dic = {
52     '0': exit,
53     '1': register,
54     '2': login,
55     '3': check_banlance,
56     '4': withdraw,
57     '5': repay,
58     '6': transfer,
59     '7': check_flow,
60     '8': shopping,
61     '9': check_shop_car,
62     '10': admin,
63 }
64 
65 
66 def run():
67     while True:
68         print('''
69         ============ATM + 购物车============
70                 0.退出功能
71                 1.注册功能
72                 2.登录功能
73                 3.查看余额
74                 4.提现功能
75                 5.还款功能
76                 6.转账功能
77                 7.查看流水
78                 8.购物功能
79                 9.查看购物车
80                 10.管理员功能
81             ============ end ==================        
82         ''')
83         choice = input('请输入指令编号:').strip()
84         if choice in func_dic:
85             func_dic.get(choice)()
86             continue
87         else:
88             print('输入的质量编号不正确,请重新输入!')

 (5)写register功能

def register():
    while True:
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        re_password = input('请再次输入密码:').strip()

        if password == re_password:
            flag,msg = user_interface.register_interface(
                username,password
            )
            if flag:
                print(msg)
                break
            else:
                print(msg)
        else:
            print('两次输入的密码不一致,请重新输入!')

(6)调用了user_interface.register_interface,写一下user_interface.register_interface

 1 def register_interface(username,password,banlance = 15000):
 2     user_dic = db_handler.select(username)
 3     if user_dic:
 4         return False,'用户名已存在,请重新输入!'
 5     else:
 6         password = common.get_pwd_md5(password)
 7         user_dic = {
 8             'username': username,
 9             'password': password,
10             'banlance': banlance,
11             'flow': [],
12             'shop_car': {},
13             'locked': False
14         }
15         db_handler.save(user_dic)
16         msg = f'用户【{username}】注册成功'
17         user_logger.info(msg)
18         return True,msg

 

 (7)调用了db_handler.select,写一下db_handler.select

import os
import json
from conf import settings

# 查找数据
def select(username):
    user_path = os.path.join(
        settings.USER_DATA_PATH,
        f'{username}.json'
    ).replace('\\','/')

    if os.path.exists(user_path):
        with open(user_path,mode='rt',encoding='utf-8') as f:
            user_dic = json.load(f)
            return user_dic
    else:
        return None


# 保存数据
def save(user_dic):
    username = user_dic.get('username')
    user_path = os.path.join(
        settings.USER_DATA_PATH,
        f'{username}.json'
    ).replace('\\', '/')
    with open(user_path,mode='wt',encoding='utf-8') as f:
        json.dump(user_dic,f,ensure_ascii=False)

 

(8)调用了settings.USER_DATA_PATH,写一下settings.USER_DATA_PATH

import os

BASE_PATH = os.path.dirname(
    os.path.dirname(__file__)
)

USER_DATA_PATH = os.path.join(
    BASE_PATH,
    'db',
    'user_data'
).replace('\\','/')

总结:以上注册功能的思路是:用户传入的用户名,密码传入到注册接口register_interface中,注册接口调用了

db_handler中的select去判断用户是否存在,若存在,则返回user_dic给接口层,若不存在,返回None,register_interface接收到db_handler中的数据,如果有user_dic,则返回:

用户已存在,重新输入,若不存在user_dic,则调用db_handler中的save方法,保存用户数据,返回注册成功,这两个返回给src中。src中用flag和msg解压赋值接收来自接口层的值

 

后面的登陆,查看余额等功能,依次类推,现在按照文件上代码,正式版:

 

一、start.py

 

1 from core import src
2 
3 if __name__ == '__main__':
4     src.run()

二、src.py

  1 from interface import user_interface
  2 from interface import bank_interface
  3 from interface import shop_interface
  4 from lib import common
  5 login_user = None
  6 # 1.注册功能
  7 def register():
  8     while True:
  9         username = input('请输入用户名:').strip()
 10         password = input('请输入密码:').strip()
 11         re_password = input('请再次输入密码:').strip()
 12 
 13         if password == re_password:
 14             flag,msg = user_interface.register_interface(
 15                 username,password
 16             )
 17             if flag:
 18                 print(msg)
 19                 break
 20             else:
 21                 print(msg)
 22         else:
 23             print('两次输入的密码不一致,请重新输入!')
 24 
 25 
 26 # 2.登录功能
 27 def login():
 28     while True:
 29         username = input('请输入用户名:').strip()
 30         password = input('请输入密码:').strip()
 31         flag,msg = user_interface.login_interface(
 32             username,password
 33         )
 34         if flag:
 35             print(msg)
 36             global login_user
 37             login_user = username
 38             break
 39         else:
 40             print(msg)
 41 
 42 # 3.查看余额
 43 @common.auth_login
 44 def check_banlance():
 45     banlance = user_interface.check_banlance_interface(
 46         login_user
 47     )
 48     print(f'用户【{login_user}】的账户余额为:【{banlance}】')
 49 
 50 # 4.提现功能
 51 @common.auth_login
 52 def withdraw():
 53     while True:
 54         input_money = input('请输入你要提现的金额:').strip()
 55         if not input_money.isdigit():
 56             print('请输入数字')
 57             continue
 58         else:
 59             input_money = int(input_money)
 60             # if input_money > 0:
 61             flag,msg = bank_interface.withdraw_interface(
 62                 login_user,input_money
 63             )
 64             if flag:
 65                 print(msg)
 66                 break
 67             else:
 68                 print(msg)
 69             # else:
 70             #     print('提现金额必须大于0')
 71 
 72 # 5.还款功能
 73 @common.auth_login
 74 def repay():
 75     while True:
 76         repay_money = input('请输入还款金额:').strip()
 77         if not repay_money.isdigit():
 78             print('请输入数字')
 79             continue
 80         else:
 81             repay_money = int(repay_money)
 82             if repay_money > 0:
 83                 flag,msg = bank_interface.repay_interface(
 84                     login_user,repay_money
 85                 )
 86                 if flag:
 87                     print(msg)
 88                     break
 89                 else:
 90                     print(msg)
 91             else:
 92                 print('还款金额必须大于0')
 93 
 94 # 6.转账功能
 95 @common.auth_login
 96 def transfer():
 97     while True:
 98         to_user = input('请输入你要转账的用户:').strip()
 99         to_money = input('请输入你要转账的金额:').strip()
100         if to_user != login_user:
101             if not to_money.isdigit():
102                 print('请输入数字')
103                 continue
104             else:
105                 to_money = int(to_money)
106                 if to_money >0:
107                     flag,msg = bank_interface.transfer_interface(
108                         login_user,to_user,to_money
109                     )
110                     if flag:
111                         print(msg)
112                         break
113                     else:
114                         print(msg)
115                 else:
116                     print('还款金额必须大于0')
117         else:
118             print('不能给自己转账!')
119 
120 # 7.查看流水
121 @common.auth_login
122 def check_flow():
123     flow_list = bank_interface.check_flow_interface(
124         login_user
125     )
126     if flow_list:
127         for flow in flow_list:
128             print(flow)
129     else:
130         print('该用户没有产生流水!')
131 
132 
133 # 8.购物功能
134 @common.auth_login
135 def shopping():
136     shop_list = [
137         ['上海灌汤包', 30],
138         ['egon抱枕', 250],
139         ['广东凤爪', 28],
140         ['香港鱼丸', 15],
141         ['tank', 10000],
142         ['macbook', 10000]
143     ]
144 
145     shopping_car = {}
146     while True:
147         print("==============商品信息===============")
148         for index,shop in enumerate(shop_list):
149             shop_name,shop_price = shop
150             print(f'商品编号为:【{index}】',
151                   f'商品名称为:【{shop_name}】,'
152                   f'商品价格为:【{shop_price}】')
153         print("================end=================")
154         choice = input('请输入商品编码:').strip()
155 
156         if choice == 'y':
157             if not shopping_car:
158                 print('购物车为空,不能进行结算,请添加商品!')
159                 continue
160             else:
161                 flag,msg = shop_interface.shopping_interface(
162                     login_user,shopping_car
163                 )
164                 if flag:
165                     print(msg)
166                     break
167                 else:
168                     print(msg)
169 
170         elif choice == 'n':
171             if not shopping_car:
172                 print('购物车为空,不能保存到文件中,请添加商品!')
173                 continue
174 
175             else:
176                 flag,msg = shop_interface.add_shop_car_interface(
177                     login_user,shopping_car
178                 )
179                 if flag:
180                     print(msg)
181                     break
182                 else:
183                     print(msg)
184 
185         if not choice.isdigit():
186             print('请输入数字')
187             continue
188         else:
189             choice = int(choice)
190             if choice not in range(len(shop_list)):
191                 print('商品编码不存在,请重新输入')
192                 continue
193             else:
194                 shop_name,shop_price  = shop_list[choice]
195                 if shop_name in shopping_car:
196                     shopping_car[shop_name][1] += 1
197                 else:
198                     shopping_car[shop_name] = [shop_price,1]
199 
200         print('当前购物车中的商品有:',shopping_car)
201 
202 # 9.查看购物车
203 @common.auth_login
204 def check_shop_car():
205     shop_car = shop_interface.check_shopcar_interface(
206         login_user
207     )
208     print(shop_car)
209 
210 # 10.管理员功能
211 @common.auth_login
212 def admin():
213     from core import admin
214     admin.admin_run()
215 
216 
217 func_dic = {
218     '0': exit,
219     '1': register,
220     '2': login,
221     '3': check_banlance,
222     '4': withdraw,
223     '5': repay,
224     '6': transfer,
225     '7': check_flow,
226     '8': shopping,
227     '9': check_shop_car,
228     '10': admin,
229 }
230 
231 
232 def run():
233     while True:
234         print('''
235         ============ATM + 购物车============
236                 0.退出功能
237                 1.注册功能
238                 2.登录功能
239                 3.查看余额
240                 4.提现功能
241                 5.还款功能
242                 6.转账功能
243                 7.查看流水
244                 8.购物功能
245                 9.查看购物车
246                 10.管理员功能
247             ============ end ==================        
248         ''')
249         choice = input('请输入指令编号:').strip()
250         if choice in func_dic:
251             func_dic.get(choice)()
252             continue
253         else:
254             print('输入的质量编号不正确,请重新输入!')

三、user_interface.py

import logging

from db import db_handler
from lib import common
user_logger = common.get_logger('user')


#注册接口
def register_interface(username,password,banlance = 15000):
    user_dic = db_handler.select(username)
    if user_dic:
        return False,'用户名已存在,请重新输入!'
    else:
        password = common.get_pwd_md5(password)
        user_dic = {
            'username': username,
            'password': password,
            'banlance': banlance,
            'flow': [],
            'shop_car': {},
            'locked': False
        }
        db_handler.save(user_dic)
        msg = f'用户【{username}】注册成功'
        user_logger.info(msg)
        return True,msg

#登陆接口
def login_interface(username,password):
    user_dic = db_handler.select(username)
    if user_dic:
        if not user_dic['locked']:
            password = common.get_pwd_md5(password)
            if password == user_dic.get('password'):
                msg = f'用户【{username}】登陆成功!'
                user_logger.info(msg)
                return True,msg
            else:
                msg = '密码错误,请重新输入!'
                user_logger.warn(msg)
                return False,msg
        else:
            msg = '用户被冻结,无法登陆!'
            user_logger.warn(msg)
            return False,msg
    else:
        msg = '用户名不存在,无法登陆,请重新输入!'
        user_logger.warn(msg)
        return False,msg

#查看余额接口
def check_banlance_interface(username):
    user_dic = db_handler.select(username)
    return user_dic.get('banlance')

四、db_handler.py

 1 import os
 2 import json
 3 from conf import settings
 4 
 5 # 查找数据
 6 def select(username):
 7     user_path = os.path.join(
 8         settings.USER_DATA_PATH,
 9         f'{username}.json'
10     ).replace('\\','/')
11 
12     if os.path.exists(user_path):
13         with open(user_path,mode='rt',encoding='utf-8') as f:
14             user_dic = json.load(f)
15             return user_dic
16     else:
17         return None
18 
19 
20 # 保存数据
21 def save(user_dic):
22     username = user_dic.get('username')
23     user_path = os.path.join(
24         settings.USER_DATA_PATH,
25         f'{username}.json'
26     ).replace('\\', '/')
27     with open(user_path,mode='wt',encoding='utf-8') as f:
28         json.dump(user_dic,f,ensure_ascii=False)

五、bank_interface.py

 1 from db import db_handler
 2 from lib import common
 3 
 4 bank_logger = common.get_logger('bank')
 5 
 6 #提现接口
 7 def withdraw_interface(username,money):
 8     user_dic = db_handler.select(username)
 9     banlance = int(user_dic.get('banlance'))
10     money2 = int(money) * 1.03
11     service_charge = float('%.2f' %(int(money) * 0.03))
12 
13     if banlance >= money2:
14         banlance -= money2
15         user_dic['banlance'] = banlance
16         now_time = common.now_time()
17         flow = f'{now_time},用户【{username}】成功提现【{money}$】,' \
18                     f'手续费为:【{service_charge}$】,' \
19                     f'当前账户余额为:【{user_dic["banlance"]}】'
20         user_dic['flow'].append(flow)
21         bank_logger.info(flow)
22         db_handler.save(user_dic)
23         return True,flow
24     else:
25         return False,'余额不足,请去赚钱!'
26 
27 
28 #还款接口
29 def repay_interface(login_user,money):
30     user_dic = db_handler.select(login_user)
31     user_dic['banlance'] += money
32     now_time = common.now_time()
33     flow = f'{now_time},用户【{login_user}】还款【{money}$】成功,' \
34                 f'当前账户余额为:【{user_dic["banlance"]}】'
35     user_dic['flow'].append(flow)
36     db_handler.save(user_dic)
37     return True,flow
38 
39 #转账接口
40 def transfer_interface(login_user,to_user,money):
41     login_user_dic = db_handler.select(login_user)
42     to_user_dic = db_handler.select(to_user)
43 
44     if to_user_dic:
45         login_user_dic['banlance'] -= money
46         to_user_dic['banlance'] += money
47 
48         now_time = common.now_time()
49         login_user_flow = f'{now_time},用户【{login_user}给用户【{to_user}】成功转账:' \
50                     f'【{money}$】'
51         login_user_dic['flow'].append(login_user_flow)
52         db_handler.save(login_user_dic)
53 
54         now_time = common.now_time()
55         to_user_flow = f'{now_time},用户【{to_user}收到用户【{login_user}】成功转账:' \
56                f'【{money}$】'
57         login_user_dic['flow'].append(to_user_flow)
58         db_handler.save(to_user_dic)
59 
60         return True,login_user_flow
61 
62     else:
63         return False,'你要转账的用户不存在,请重新输入!'
64 
65 
66 #查看流水接口
67 def check_flow_interface(login_user):
68     user_dic = db_handler.select(login_user)
69     return user_dic.get('flow')
70 
71 #支付接口
72 def pay_interface(login_user,cost):
73     user_dic = db_handler.select(login_user)
74     if user_dic['banlance'] >= cost:
75         user_dic['banlance'] -= cost
76         flow = f'用户【{login_user}】消费金额为:【{cost}$】'
77         user_dic['flow'].append(flow)
78         db_handler.save(user_dic)
79         return True
80     else:
81         return False

六、shop_interface.py

 1 from db import db_handler
 2 from lib import common
 3 shop_logger = common.get_logger('shop')
 4 
 5 #商品准备结算接口
 6 def shopping_interface(login_user,shopping_car):
 7     cost = 0
 8     for price_number in shopping_car.values():
 9         price,number = price_number
10         cost += price * number
11 
12     from interface import bank_interface
13     flag = bank_interface.pay_interface(
14         login_user,cost
15     )
16     if flag:
17         msg = '支付成功,准备发货!'
18         shop_logger.info(msg)
19         return True,msg
20     else:
21         msg = '支付失败,余额不足!'
22         shop_logger.warn(msg)
23         return False,msg
24 
25 
26 #保存购物车到文件接口
27 def add_shop_car_interface(login_user,shopping_car):
28     user_dic = db_handler.select(login_user)
29     shop_car = user_dic.get('shop_car')
30     for shop_name,price_number in shopping_car.items():
31         number = price_number[1]
32         if shop_name in shop_car:
33             user_dic['shop_car'][shop_name][1] += number
34         else:
35             user_dic['shop_car'].update(
36                 {shop_name:price_number}
37             )
38     db_handler.save(user_dic)
39     return True,'用户购物车成功保存到文件中!'
40 
41 #查看购物车接口
42 def check_shopcar_interface(login_user):
43     user_dic = db_handler.select(login_user)
44     return user_dic['shop_car']

七、admin_interface.py

 1 from db import db_handler
 2 from lib import common
 3 
 4 admin_logger = common.get_logger('admin')
 5 
 6 # 修改用户额度接口
 7 def change_banlance_interface(username,money):
 8     user_dic = db_handler.select(username)
 9     if user_dic:
10         user_dic['banlance'] = money
11         db_handler.save(user_dic)
12         msg = f'用户【{username}】额度成功修改为:【{money}$】'
13         admin_logger.info(msg)
14         return True,msg
15     else:
16         msg = '用户名不存在,请重新输入!'
17         admin_logger.warn(msg)
18         return False,msg
19 
20 
21 #冻结用户接口
22 def lock_user_interface(username):
23     user_dic = db_handler.select(username)
24     if user_dic:
25         user_dic['locked'] = True
26         db_handler.save(user_dic)
27         msg = f'用户【{username}】冻结成功'
28         admin_logger.info(msg)
29         return True,msg
30     else:
31         msg = '用户名不存在,请重新输入!'
32         admin_logger.warn(msg)
33         return False,msg
34 
35 #解冻账户接口
36 def unlock_user_interface(username):
37     user_dic = db_handler.select(username)
38     if user_dic:
39         if user_dic['locked']:
40             user_dic['locked'] = False
41             db_handler.save(user_dic)
42             return True,f'用户【{username}】解冻成功'
43         else:
44             return False, f'用户【{username}】未被冻结'
45     else:
46         return False, '用户名不存在,请重新输入!'

八、settings.py

import os

BASE_PATH = os.path.dirname(
    os.path.dirname(__file__)
)

USER_DATA_PATH = os.path.join(
    BASE_PATH,
    'db',
    'user_data'
).replace('\\','/')




#日志配置字典
"""
logging配置
"""

import os

# 1、定义三种日志输出格式,日志中可能用到的格式化串如下
# %(name)s Logger的名字
# %(levelno)s 数字形式的日志级别
# %(levelname)s 文本形式的日志级别
# %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
# %(filename)s 调用日志输出函数的模块的文件名
# %(module)s 调用日志输出函数的模块名
# %(funcName)s 调用日志输出函数的函数名
# %(lineno)d 调用日志输出函数的语句所在的代码行
# %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
# %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
# %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
# %(thread)d 线程ID。可能没有
# %(threadName)s 线程名。可能没有
# %(process)d 进程ID。可能没有
# %(message)s用户输出的消息

# 2、强调:其中的%(name)s为getlogger时指定的名字
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

test_format = '%(asctime)s] %(message)s'

# 定义日志输出格式  结束
# ***********************注意1:log文件的目录
# 可以定制日志文件路径
BASE_PATH = os.path.dirname(os.path.dirname(__file__))  # log文件的目录
logfile_dir = os.path.join(BASE_PATH,'log').replace('\\','/')
print(logfile_dir)

# *************************注意2:log文件名
logfile_name = 'atm.log'

# 如果不存在定义的日志目录,就创建一个
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

# log文件的全路径
logfile_path = os.path.join(logfile_dir,logfile_name)


# 3、日志配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
        'test': {
            'format': test_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
        # 'other': {
        #     'level': 'DEBUG',
        #     'class': 'logging.FileHandler',  # 保存到文件
        #     'formatter': 'test',
        #     'filename': 'a2.log',
        #     'encoding': 'utf-8',
        # },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
            'propagate': False,  # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
        },
        # '专门的采集': {
        #     'handlers': ['other',],
        #     'level': 'DEBUG',
        #     'propagate': False,
        # },
    },
}

九、common.py

 1 import hashlib
 2 import datetime
 3 import logging.config
 4 from conf import settings
 5 
 6 
 7 # 密码加密
 8 def get_pwd_md5(password):
 9     md5_obj = hashlib.md5()
10     md5_obj.update(password.encode('utf-8'))
11     salt = '一二三四五上山打老虎'
12     md5_obj.update(salt.encode('utf-8'))
13 
14     return md5_obj.hexdigest()
15 
16 
17 #登陆认证装饰器
18 def auth_login(func):
19     from core import src
20     def inner(*args,**kwargs):
21         if src.login_user:
22             res = func(*args,**kwargs)
23             return res
24         else:
25             print('需要登录才能使用此功能,请登录')
26             src.login()
27     return inner
28 
29 #计算当前时间
30 def now_time():
31     now_time = datetime.datetime.now()
32     return now_time
33 
34 #添加日志功能
35 
36 def get_logger(log_type):
37     '''
38     :param log_type: 比如是user日志,bank日志,shop日志
39     :return:
40     '''
41 
42     # 1.加载日志配置字典
43     logging.config.dictConfig(
44         settings.LOGGING_DIC
45     )
46     # 2.获取日志对象(日志功能在接口层使用)
47     logger = logging.getLogger(log_type)
48     return logger

十、admin.py

 1 from core import src
 2 from interface import admin_interface
 3 
 4 # 1.添加账户
 5 def add_user():
 6     src.register()
 7 
 8 # 2.修改额度
 9 def change_banlance():
10     while True:
11         change_user = input('请输入你要修改额度的账户:').strip()
12         change_money = input('请输入你要修改的额度:').strip()
13         if change_user != src.login_user:
14             if not change_money.isdigit():
15                 print('请输入数字')
16                 continue
17             else:
18                 change_money = int(change_money)
19                 flag,msg = admin_interface.change_banlance_interface(
20                     change_user,change_money
21                 )
22                 if flag:
23                     print(msg)
24                     break
25                 else:
26                     print(msg)
27 
28         else:
29             print('不能修改管理员自己的账户额度!')
30 
31 
32 # 3.冻结账户
33 def lock_user():
34     while True:
35         lock_user = input('请输入要冻结的账户:').strip()
36         if lock_user != src.login_user:
37             flag,msg = admin_interface.lock_user_interface(
38                 lock_user
39             )
40             if flag:
41                 print(msg)
42                 break
43             else:
44                 print(msg)
45         else:
46             print('不能冻结管理员账户!')
47 
48 # 4.解冻账户
49 def unlock_user():
50     while True:
51         unlock_user = input('请输入要解冻的用户名:').strip()
52         flag,msg = admin_interface.unlock_user_interface(
53             unlock_user
54         )
55         if flag:
56             print(msg)
57             break
58         else:
59             print(msg)
60 
61 
62 admin_func = {
63     '1':add_user,
64     '2':change_banlance,
65     '3':lock_user,
66     '4':unlock_user
67 }
68 
69 
70 def admin_run():
71     while True:
72         print('''
73         1.添加账户
74         2.修改额度
75         3.冻结账户
76         4.解冻账户
77         ''')
78         choice = input('请输入管理员功能编号:').strip()
79         if choice in admin_func:
80             admin_func.get(choice)()
81             continue
82         else:
83             print('你输入的编号不存在!')

 

 

    

 

posted @ 2021-06-24 17:18  五仁味儿月饼  阅读(142)  评论(0编辑  收藏  举报