ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

简易ATM+购物车之面条版

2021-12-05 14:34:17  阅读:206  来源: 互联网

标签:面条 money ATM 购物车 json file print path data


一、开发项目模式

  使用瀑布模式

二、要求

 三、程序设计

 

 四、目录搭建

  start.py为启动文件;settings.py为配置文件;src.py为核心代码;db里面为记录客户信息的;common.py为公用功能的;log位记录日志的

 五、环境搭建

  1、定义好所需功能的函数框架,核心代码用pass代替

  2、把定义的函数写入字典中

func_dic = {
    '1': register,
    '2': login,
    '3': transfer,
    '4': withdrawal,
    '5': recharge,
    '6': check_balance,
    '7': check_flow,
    '8': add_cart,
    '9': check_shopping
}

  3、把函数进行打印,并写好供用户选择的代码,并对其进行判断。通过客户输入的选择序号调用所对应的函数

def run():
    while True:
        print("""
        ==========start==========
        1.注册
        2.登录
        3.转账
        4.提现
        5.充值
        6.查看余额
        7.查看流水
        8.加入购物车
        9.查看购物车
        ==========end==========
        """)
        choice = input('请输入你选择的序号:').strip()
        if not choice:
            continue
        if not choice.isdigit():
            print('你输入的序号不符合规范')
            continue
        func_dic[choice]()

六、启动文件、配置文件和公用文件书写

  1、配置好启动文件。代码运行只能在启动文件中进行

from core import src


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

  2、配置文件,记录文件路径的

import os

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

  3、公用文件,记录校验用户是否登录的装饰器

from core import src

def login_aunt(func):

    def inner(*args, **kwargs):
        if src.data_list['is_login']:
            return func(*args, **kwargs)
        else:
            return src.login()
    return inner

七、核心代码书写(代码中所需的模块自行导入,代码中我没写进去)

  1、先定义一个字典,用于记录登录的用户名,以及是否登录,先写False,如果登录则进行更改为True

data_list = {
    'username': None,
    'is_login': False
}

  2、注册功能

    思路书写(仅供参考)

1 获取用户名
2 获取文件路径
3 判断文件是否存在,如果存在返回重新输入
4 获取用户密码
5 把获取到的用户名和密码组织成字典的形式。后续所需的功能在里面增加就可以比如锁定状态、购物车等。
6 组织好的字典写入到文件中

  代码

 1 def register():
 2     print('开始注册')
 3     if data_list['is_login']:
 4         print('账户已经登录')
 5         return
 6     while True:
 7         username = input('请输入你要注册的账户名:').strip()
 8         # 获取文件路径,用于判断文件是否存在
 9         path = settings.BASE_DIR
10         path_file = os.path.join(path, 'db', '%s.json' % username)
11         if os.path.exists(path_file):
12             print('用户已存在')
13             continue
14         pwd = input('请输入你的密码').strip()
15         # 定义一个字典,用于接收用户名和密码以及定义账户余额等其他信息
16         user_dic = {'username': username, 'pwd': pwd, 'account': 10000, 'locked': False, 'shopping_cart': {},
17                     'flow': []}
18         with open(path_file, 'w', encoding='utf8') as f:
19             json.dump(user_dic, f)
20             # 写日志
21             common.write_log('%s注册成功' % username)
22             print('恭喜你,注册成功')
23             break

  3、登录功能

    思路书写

 1 获取用户名
 2 获取文件路径,并进行拼接
 3 判断文件是否存在,如果不存在用户名不存在让重新输入
 4 如果存在,获取用户密码
 5 读取文件的信息,并与用户的密码进行判断,看是否输入正确
 6 读取文件之后可以加入一个判断。如果用户已经锁定了就不能进行接下来的操作了。
 7 如果正确写入则显示登录成功,否则告知用户密码或者用户名输入错误
 8 在用户登录成功的后面记录更改下记录用户登录的名以及状态,并结束循环
 9 因为要锁定账户,所以在函数里定义一个计数器,在输入错误的后面进行计数,当次数累计到三次之后把用户信息中的locked进行更改为真,并写入。
10 因为在全局有定义一个记录用户登录信息的字典。所以可以在开头加入一个判断用户是否登录。如果登录则结束该函数。注册的也加一个

  代码

 1 def login():
 2     print('开始登录')
 3     count = 0
 4     if data_list['is_login']:
 5         print('账户已经登录')
 6         return
 7     while True:
 8         username = input('请输入你的用户名:').strip()
 9         path = settings.BASE_DIR
10         path_file = os.path.join(path, 'db', '%s.json' % username)
11         if not os.path.exists(path_file):
12             print('你输入的账户不存在,请先注册')
13             continue
14         pwd = input('请输入你的密码').strip()
15         if not pwd.isdigit():
16             print('输入的密码不符合规范')
17             continue
18         with open(path_file, 'r', encoding='utf8') as f:
19             data = json.load(f)
20         if data.get('locked'):
21             print('账户已锁定,请联系管理员')
22             break
23         if pwd == data.get('pwd'):
24             # 写日志
25             common.write_log('%s登录成功' % username)
26             print('登录成功')
27             data_list['username'] = username
28             data_list['is_login'] = True
29             break
30         else:
31             print('你输入的账户或密码错误')
32             count += 1
33             if count == 3:
34                 data['locked'] = True
35                 with open(path_file, 'w', encoding='utf8') as f1:
36                     json.dump(data, f1)

  4、转账(加入验证用户是否登录的装饰器)

    思路书写

1 输入被转账的账户
2 获取文件路径
3 判断被转账用户是否存在
4 对输入的转账金额进行判断,然后再转换成整型
5 读取自己的账户信息
6 比较转账金额和被转帐金额大小。
7 小于,返回信息,
8 大于,读取对方账户的信息,然后金额增加,写入
9 自己账户的信息中金额减少,然后写入

  代码

 1 @common.login_aunt
 2 def transfer():
 3     print('开始转账')
 4     while True:
 5         to_user = input('请输入你要转账的用户名:').strip()
 6         path = settings.BASE_DIR
 7         to_path_file = os.path.join(path, 'db', '%s.json' % to_user)
 8         if not os.path.exists(to_path_file):
 9             print('此用户不存在,请重新输入')
10             continue
11         money = input('请输入你要转账的金额').strip()
12         if not money:
13             print('输入的金额不符合规范')
14             continue
15         if not money.isdigit():
16             print('输入的金额不符合规范')
17             continue
18         money = int(money)
19         from_path_file = os.path.join(path, 'db', '%s.json' % data_list['username'])
20         with open(from_path_file, 'r', encoding='utf8') as f:
21             from_user = json.load(f)
22         if from_user['account'] >= money:
23             from_user['account'] -= money
24             now_time = time.strftime('%Y-%m-%d %X')
25             from_user['flow'].append('%s给%s转了%s钱' % (now_time, to_user, money))
26             with open(from_path_file, 'w', encoding='utf8') as f1:
27                 json.dump(from_user, f1, ensure_ascii=False)
28             with open(to_path_file, 'r', encoding='utf8') as f2:
29                 to_user_money = json.load(f2)
30                 to_user_money['account'] += money
31                 now_time = time.strftime('%Y-%m-%d %X')
32                 to_user_money['flow'].append('%s%s转了%s钱' % (now_time, data_list['username'], money))
33                 with open(to_path_file, 'w', encoding='utf8') as f3:
34                     json.dump(to_user_money, f3, ensure_ascii=False)
35                     # 写日志
36                     common.write_log('%s转账成功' % data_list['username'])
37                 print('转账成功')
38                 break
39         else:
40             print('余额不足')

  5、提现

    思路书写

1 获取用户提现金额
2 对输入的金额进行判断。把输入的金额转为整型类型
3 获取文件路径,并进行拼接
4 读取用户信息
5 判断用户原有金额是否大于提现金额加上手续费
6 如果小于,证明钱不够。返回重新输入
7 大于,原有金额减去提取金额加上手续费
8 把更新之后的金额写入文件中

   代码

 1 @common.login_aunt
 2 def withdrawal():
 3     print('开始提现')
 4     while True:
 5         money = input('请输入你要提现的金额').strip()
 6         if not money.isdigit():
 7             print('你输入的金额不符合规范,请重新输入')
 8             continue
 9         if not money:
10             continue
11         money = int(money)
12         path = settings.BASE_DIR
13         path_file = os.path.join(path, 'db', '%s.json' % data_list['username'])
14         with open(path_file, 'r', encoding='utf8') as f:
15             data = json.load(f)
16         if data['account'] >= money * 1.05:
17             data['account'] -= money * 1.05
18             now_time = time.strftime('%Y-%m-%d %X')
19             data['flow'].append('%s提现了%s钱' % (now_time, money))
20             with open(path_file, 'w', encoding='utf8') as f1:
21                 json.dump(data, f1, ensure_ascii=False)
22                 # 写日志
23                 common.write_log('%s提现成功' % data_list['username'])
24                 print('提现成功')
25                 break
26         else:
27             print('余额不足')
28             continue

  6、充值

    思路书写

1 获取用户充值金额
2 对输入的金额进行判断,并进行数据转换
3 获取目录,并进行拼接
4 读取文件信息
5 文件中的金额加上充值的金额,并写入文件中

  代码

 1 @common.login_aunt
 2 def recharge():
 3     print('开始充值')
 4     while True:
 5         money = input('请输入你要充值的金额').strip()
 6         if not money.isdigit():
 7             print('输入的金额不符合规范')
 8             continue
 9         money = int(money)
10         path = settings.BASE_DIR
11         path_file = os.path.join(path, 'db', '%s.json' % data_list['username'])
12         with open(path_file, 'r', encoding='utf8') as f:
13             data = json.load(f)
14         data['account'] += money
15         now_time = time.strftime('%Y-%m-%d %X')
16         data['flow'].append('%s充值了%s钱' % (now_time, money))
17         with open(path_file, 'w', encoding='utf8') as f1:
18             json.dump(data, f1, ensure_ascii=False)
19             # 写日志
20             common.write_log('%s充值成功' % data_list['username'])
21             print('充值成功')
22             break

  7、查看余额

 1 @common.login_aunt
 2 def check_balance():
 3     print('开始查看余额')
 4     while True:
 5         path = settings.BASE_DIR
 6         path_file = os.path.join(path, 'db', '%s.json' % data_list['username'])
 7         with open(path_file, 'r', encoding='utf8') as f:
 8             data = json.load(f)
 9             print(data['account'])
10             break

  8、查看流水(流水可以在转账,充值,提现成功的后面进行添加然后写入文件中)

@common.login_aunt
def check_flow():
    print('开始查看流水')
    while True:
        path = settings.BASE_DIR
        path_file = os.path.join(path, 'db', '%s.json' % data_list['username'])
        with open(path_file, 'r', encoding='utf8') as f:
            data = json.load(f)
        if data['username'] == data_list['username']:
            print(data['flow'])
            break
        else:
            print('输入的用户名错误')
            continue

  9、加入购物车

    思路书写

 1 定义商品,列表
 2 循环取值,枚举
 3 获取商品序号
 4 判断输入的序号是为空不,是否是小数。
 5 如果不是,返回输入不对
 6 如果对,转换输入序号的类型。
 7 在外面定义一个大字典,用于接受加入购物车的商品
 8 取出商品的名称和价格
 9 判断商品名称在不在外面的大字典中,如果不在就把商品名称写入字典中
10 如果在取出大字典中的count值加1
11 在输入商品序号的地方加入一个退出键
12 如果退出,获取文件根目录,拼接文件路径到db目录下为用户名.json结尾的文件。读取文件
13 把购物车里的数据赋值给用户文件中的购物信息,然后再写入

  代码

 1 @common.login_aunt
 2 def add_cart():
 3     print('添加购物车')
 4     # 定义一个全局变量,用于接受添加的购物车
 5     shopping_cra = {}
 6     while True:
 7         # 定义商品
 8         commodity = [
 9             ['water', 10],
10             ['drinks', 20],
11             ['bread', 30]
12         ]
13         # 通过枚举的方式得到商品和价格以及商品序号
14         for k, v in enumerate(commodity):
15             print('%s %s %s' % (k, v[0], v[1]))
16         number = input('请输入商品序号(q to quit):').strip()
17         if number.isdigit():
18             number = int(number)
19             commodity_name = commodity[number][0]
20             commodity_price = commodity[number][1]
21             if commodity_name not in shopping_cra:
22                 shopping_cra[commodity_name] = {'price': commodity_price, 'count': 1}
23             else:
24                 shopping_cra[commodity_name]['count'] += 1
25                 print('请继续购物')
26         elif number == 'q':
27             if shopping_cra:
28                 path = settings.BASE_DIR
29                 path_file = os.path.join(path, 'db', '%s.json' % data_list['username'])
30                 with open(path_file, 'r', encoding='utf8') as f:
31                     data = json.load(f)
32                 data['shopping_cart'] = shopping_cra
33 
34                 with open(path_file, 'w', encoding='utf8') as f1:
35                     json.dump(data, f1)
36                     # 写日志
37                     common.write_log('%s添加购物车成功' % data_list['username'])
38                     print('购物车添加成功')
39                     break
40         else:
41             print('输入的不符合规范')

  10、查看流水

 1 @common.login_aunt
 2 def check_shopping():
 3     print('开始查看购物车')
 4     while True:
 5         path = settings.BASE_DIR
 6         path_file = os.path.join(path, 'db', '%s.json' % data_list['username'])
 7         with open(path_file, 'r', encoding='utf8') as f:
 8             data = json.load(f)
 9         if data['username'] == data_list['username']:
10             print(data['shopping_cart'])
11             break
12         else:
13             print('输入的用户名错误')
14             continue

  11、日志功能

    日志功能我是写在公用文件中。然后在核心代码中添加记录即可(登录、注册等都可以)

 1 import logging
 2 import os
 3 from conf import settings
 4 logging.basicConfig(
 5     # 1、日志输出位置:1、终端 2、文件
 6     # filename='access.log', # 不指定,默认打印到终端
 7     filename=os.path.join(settings.BASE_DIR, 'log', 'log.log'),
 8 
 9     # 2、日志格式
10     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
11 
12     # 3、时间格式
13     datefmt='%Y-%m-%d %H:%M:%S %p',
14 
15 
16     # 4、日志级别
17     # critical => 50
18     # error => 40
19     # warning => 30
20     # info => 20
21     # debug => 10
22     level=10,
23 )
24 
25 # 二:输出日志
26 # logging.debug('调试debug')
27 # logging.info('消息info')
28 # logging.warning('警告warn')
29 # logging.error('错误error')
30 # logging.critical('严重critical')
31 
32 def write_log(info):
33     logging.debug(info)

 

标签:面条,money,ATM,购物车,json,file,print,path,data
来源: https://www.cnblogs.com/zhaoyuanshi/p/15645498.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有