ATM+购物车

ATM购物车

一、一个项目是如何从无到有的

1.需求分析
    注册,登陆,查看余额,支付,购物车,
    提现,还款,转账,查看流水,注销,管理员,
    查看购物车,登陆认证装饰器, 密码加密

2.程序的架构设计
    三层架构:
        用户功能层: 接收用户输入的内容,展示给用户的内容. 小的逻辑判断,例如两次密码是否一致.
        接口层: 处理业务逻辑.
        数据处理层: 对数据进行增删查改.

3.分任务开发
4.测试
5.上线运行

二、项目需求

1.注册
2.登录
3.转账
4.查询余额
5.还款
6.取款
7.查看流水
8.购物
9.查看购买商品
10.管理员
q.注销 


需要登录认证装饰器
管理员:冻结、解冻用户

三、项目开发

random.txt 项目说明文件

ATM + 购物车

前戏: 一个项目是如何从无到有的.

一 需求分析
    对项目需求进行分析,并提取出相应的功能.

    - 额度15000或自定义  ---> 注册功能

    - 实现购物商城,买东西加入购物车,调用信用卡接口结账  ---> 购物车, 支付功能

    - 可以提现,手续费5%  ---> 提现

    - 支持多账户登录  ---> 登陆

    - 支持账户间转账   ---> 转账

    - 记录每月日常消费流水  ---> 记录流水

    - 提供还款接口  ---> 还款

    - ATM记录操作日志  ---> 日志功能

    - 提供管理接口,包括添加账户、用户额度,冻结账户等...  ---> 管理员功能

    - 用户认证功能  ---> 登陆认证,使用装饰器

二 程序的架构设计
    用户功能层:
        负责接收用户输入的内容,并返回结果给用户.
        做一些小的逻辑判断.

    接口层:
        处理业务逻辑.

    数据处理层:
        对文件进行处理.
        增,删,查,改操作.

    三层架构的好处:
        1.代码结构清晰
        2.可扩展性强.
        3.易维护,管理.


三 分任务开发
    - CTO
        - 技术总监
            - 架构师
                - 项目经理
                    - 普通开发
                        UI: 用户界面设计师
                        前端: 网页的开发
                        后端: 写业务逻辑,写接口
                        测试: 测试软件
                        运维: 部署项目.

四 测试
    - 手动测试
        传统人工去手动测试.

    - 自动化测试
        通过脚本模拟人的行为,自动化执行测试.

    - 黑盒测试:
        对用户界面进行测试.

    - 白盒测试:
        对软件的性能进行测试,例如每分钟能接收多少并发量.

五 上线运行
    把测试好的代码交给运维人员, 部署上线.

start.py 项目启动文件

import os
import sys
from core import src
BASE_PATH = os.path.dirname(__file__)
# 添加到环境变量
sys.path.append(BASE_PATH)

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

conf--------setting.py 系统环境变量配置

import os

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

DB_PATH = os.path.join(BASE_PATH, 'db')


core------src.py 业务核心逻辑

from interface import user_interface
from interface import bank_interface
from interface import shoping_interface
from lib import common
from interface import admin_interface
import datetime

user_info = {
    'user': None
}


def register():
    while True:
        print("---注册---")
        user_name = input('请输入用户名:').strip()
        passwd = input('请输入密码:').strip()
        passwd_d = input('确认密码:').strip()
        # 接口
        flat = user_interface.check_user_interface(user_name)
        if flat:
            print('用户已存在,重新输入!')
            continue
        elif passwd == passwd_d:
            # 接口
            user_interface.register_inerface(user_name, passwd)
            print('注册成功!')
            break


def login():
    while True:
        print("---登录---")
        user = input('输入用户名:').strip()
        passwd = input('输入密码:').strip()
        flag, msg = user_interface.login_interface(user, passwd)
        if flag:
            print(msg)
            user_info['user'] = user
            break
        else:
            print(msg)
            break


@common.outter
def transfer():
    while True:
        print("---转账---")
        to_name = input('输入转账目标用户:')
        to_user = user_interface.check_user_interface(to_name)
        if to_user:
            money = input('请输入转账金额:').strip()
            if money.isdigit():
                money = int(money)
                flaw, msg = bank_interface.transfer_interface(to_name, money, user_info['user'])
                if flaw:
                    print(msg)
                    break
                else:
                    print(msg)
                    break
            else:
                print('输入不正确!!')
                continue

        else:
            print('用户不存在,重新输入!')
            continue


@common.outter
def check_balance():
    print("---查询余额---")
    bank_interface.select_money(user_info['user'])


@common.outter
def repayment():
    print("---还款---")
    money = input('输入还款金额:').strip()
    if money.isdigit():
        money = int(money)
        bank_interface.repayment_interface(user_info['user'], money)
    else:
        print('输入不正确!')


@common.outter
def withdraw_money():
    print("---取款---")
    money = input('输入取款金额:').strip()
    if money.isdigit():
        money = int(money)
        if money >= 0:
            bank_interface.withdraw_interface(user_info['user'], money)
        else:
            print('必须大于0')
    else:
        print("输入不正确!")


@common.outter
def view_pipelining():
    print("---查看流水---")
    bank_interface.see_worter_interface(user_info['user'])


@common.outter
def shopping():

    # 购买过的商品
    pay_list = []
    num_money = 0
    while True:
        print("---购物---")
        shopping_list = [
            ['QBZ95自动步枪', 999],
            ['M4A1', 999],
            ['手雷', 99],
            ['防弹衣', 299],
            ['尼泊尔军刀', 199],
            ['坦克', 5000000],
            ['神秘武器VIP', 1000000]
        ]

        # 打印商品列表
        for index, i in enumerate(shopping_list):
            print(index, i)
        print('q.退出 w.结账 e.查看已选商品')
        choice = input('请快速配置你的装备:').strip()
        if choice == 'q':
            break

        elif choice == 'w':
            yes = input('是否结账?y/n:')
            if yes == 'y':
                # 调用接口结账
                bank_interface.payment(num_money, user_info['user'])
                # 调用接口保存购买商品
                shoping_interface.save_car(pay_list, user_info['user'])
                break
            elif yes == 'n':
                continue
        elif choice == 'e':
            print('---已选商品---')
            for index, i in enumerate(pay_list):
                print(index, i)
            continue

        # 1.判断输入是否为数字
        if not choice.isdigit():
            print('输入不合法!!!你还有两次机会')
            continue
        # 2.输入的为字符串,转成int数字型
        choice = int(choice)
        # 3.判断选择是否再范围内
        if 0 <= choice <= len(shopping_list):
            name, money = shopping_list[choice]

            # 4.添加到已选商品
            now_time = datetime.datetime.today()
            now_time = str(now_time)
            # 时间处理操作  2019-11-21 18:45:18.803910  处理为2019-11-21 18:45:18
            now_time = now_time[0:19]
            # 添加时间
            shopping_list[choice].append(now_time)
            pay_list.append(shopping_list[choice])
            # 计价
            num_money += money
            print('添加成功')
            continue
        else:
            print('请选择正确的范围!!!')
            continue


@common.outter
def shopping_cat():
    while True:
        print("---查看购买商品---")
        shoping_interface.select_car(user_info['user'])
        break


def admin():
    while True:
        print('''
        1:冻结用户
        2:解冻用户
        q:退出
        ''')
        dict = {
            '1': lock,
            '2': unlock
        }

        choice = input('请输入你的功能:').strip()
        if choice == 'q':
            break
        elif not choice.isdigit():
            print('请输入数字!!')
            continue
        elif choice in dict:
            dict[choice]()
        else:
            print("你的输入有误,重新输入!!!")
            continue


def lock():
    print('---冻结用户---')
    user_name = input('请输入你要冻结的用户名:').strip()
    yes = input('确认冻结该用户?  y/n:')
    if yes == 'y':
        res = admin_interface.lock_interface(user_name)
        print(res)
    elif yes == 'n':
        print('已取消冻结!')
    else:
        print('输入有误,重新输入!')


def unlock():
    print('---解冻用户---')
    user_name = input('请输入你要解冻的用户名:').strip()
    yes = input('确认解冻该用户?  y/n:')
    if yes == 'y':
        res = admin_interface.unlock_interface(user_name)
        print(res)
    elif yes == 'n':
        print('已取消解冻!')
    else:
        print('输入有误,重新输入!')




def run():
    while True:
        print('''
        1.注册
        2.登录
        3.转账
        4.查询余额
        5.还款
        6.取款
        7.查看流水
        8.购物
        9.查看购买商品
        10.管理员
        q.注销    
        ''')
        list_dic = {
            '1': register,
            '2': login,
            '3': transfer,
            '4': check_balance,
            '5': repayment,
            '6': withdraw_money,
            '7': view_pipelining,
            '8': shopping,
            '9': shopping_cat,
            '10': admin
        }
        choice = input('前选择功能编号:').strip()
        if choice == 'q':
            break

        elif choice in list_dic:
            list_dic.get(choice)()

        else:
            print('选择功能有误,请重新输入:')
            continue

db-----db_hander.py 真实数据层

from conf import setting
import os
import json


def select_user(user):
    user_path = f'{setting.DB_PATH}/{user}.json'

    if os.path.exists(user_path):
        with open(user_path,'r',encoding='utf-8')as f:
            user_dict = json.load(f)
            return user_dict
    else:
        return False


def save(user_dict):
    # 路径
    user_path = f'{setting.DB_PATH}/{user_dict["user"]}.json'
    # 保存
    with open(user_path, 'w', encoding='utf-8')as f:
        json.dump(user_dict, f, ensure_ascii=False)
        f.flush()

interface-----admin_interface.py 管理员接口

from db import db_hander


# 冻结用户
def lock_interface(user_name):
        user_dict = db_hander.select_user(user_name)
        if user_dict:
            user_dict['lock'] = False
            # 保存更新
            db_hander.save(user_dict)
            return '已冻结!'
        else:
            return '不存在该用户,重新输入!'


# 解冻用户
def unlock_interface(user_name):
    user_dict = db_hander.select_user(user_name)
    if user_dict:
        user_dict['lock'] = True
        # 保存更新
        db_hander.save(user_dict)
        return '已解冻!'
    else:
        return '不存在该用户,重新输入!'

interface----bank_interface.py 银行接口

from db import db_hander
import datetime

# 转账接口
def transfer_interface(to_name, money, user):
    to_user_dict = db_hander.select_user(to_name)
    user_dict = db_hander.select_user(user)

    if to_name != user:
        # 判断转账的钱是否大于余额
        if 0 <= money <= user_dict['balance']:
            # 加减钱的操作
            user_dict['balance'] -= money
            to_user_dict['balance'] += money

            # 拼接
            my = user_dict['balance']
            to = to_user_dict['balance']
            time = datetime.datetime.today()
            msg = f'【{user}】用户给【{to_name}】用户转账【{money}】元,当前余额【{my}】元    {time}'
            flg = f'【{to_name}】用户给收到【{user}】用户转账【{money}】元,当前余额【{to}】元    {time}'
            # 添加到流水信息
            user_dict['worter'].append(msg)
            to_user_dict['worter'].append(flg)

            # 保存数据
            db_hander.save(user_dict)
            db_hander.save(to_user_dict)


            return True, msg
        else:
            msg = '余额不足'
            return False, msg
    else:
        return False, '不允许给自己账户转账!'

# 查看余额
def select_money(user):
    user_dict = db_hander.select_user(user)
    money = user_dict['balance']
    return print('当前余额为【%s】元' % money)


# 还款接口
def repayment_interface(user, money):
    user_dict = db_hander.select_user(user)
    # 加钱操作
    user_dict['balance'] += money

    a = user_dict['balance']
    time = datetime.datetime.today()
    msg = f'【{user}】用户还款【{money}】元成功,当前余额【{a}】元   {time}'
    # 添加到流水信息
    user_dict['worter'].append(msg)
    # 保存更新
    db_hander.save(user_dict)


    return print(msg)


# 取款接口
def withdraw_interface(user, money):
    while True:
        user_dict = db_hander.select_user(user)
        # 判断余额是否足够
        if money <= user_dict['balance']*1.05:
            # 减钱操作,手续费
            money_s = money*0.05
            user_dict['balance'] -= money*1.05

            a = user_dict['balance']
            time = datetime.datetime.today()
            msg = f'【{user}】用户取款【{money}】元成功,手续费5%【{money_s}】元,当前余额【{a}】元   {time}'

            # 添加到流水信息
            user_dict['worter'].append(msg)

            # 保存更新
            db_hander.save(user_dict)
            return print(msg)
        else:
            print('余额不足!!')
            break


# 查看流水
def see_worter_interface(user):
    user_dict = db_hander.select_user(user)
    worter = user_dict['worter']
    for i in worter:
        print(i)

# 结账接口
def payment(num_money,user):
    while True:
        user_dict = db_hander.select_user(user)
        if num_money <= user_dict['balance']:
            # 减钱的操作
            user_dict['balance'] -= num_money

            a = user_dict['balance']
            time = datetime.datetime.today()
            msg = f'【{user}】用户购买商品成功,消费【{num_money}】元,当前余额【{a}】元    {time}'
            # 记录流水
            user_dict['worter'].append(msg)
            # 保存信息
            db_hander.save(user_dict)
            print(msg)
            break
        else:
            print('余额不足,请充值!!!')
            break


interface----shoping_interface.py 购物接口

from db import db_hander

# 保存购物车
def save_car(shopping_list, user):
    user_dict = db_hander.select_user(user)
    # 添加到字典
    user_dict['shop_car'].append(shopping_list)
    # 保存
    db_hander.save(user_dict)

# 查看购物车
def select_car(user):
    user_dict = db_hander.select_user(user)
    car_list = user_dict['shop_car']
    # for index, i in enumerate(car_list):
    #     print(index, i)
    for line in car_list:
        for index, i in enumerate(line):
            print(index, i)


interface----user_interface.py 用户接口

from db import db_hander
from lib import common


# 查看用户是否存在接口,存在返回Turn和字典,不存在返回False
def check_user_interface(user):
    user_dict = db_hander.select_user(user)
    if user_dict:
        return user_dict
    else:
        return False


# 注册接口
def register_inerface(user, passwd):
    # 调用接口,加密
    pwd = common.get_md5(passwd)

    # 把用户所有信息做成一个字典,然后调用接口保存
    user_dict = {
        'user': user,
        'pwd': pwd,
        'balance': 10000,
        'worter': [],
        'shop_car': [],
        'lock': True
    }

    db_hander.save(user_dict)

    return f'{user_dict["user"]}用户注册成功!'


# 登录接口
def login_interface(user, passwd):
    user_dict = db_hander.select_user(user)
    passwd = common.get_md5(passwd)
    # 如果用户存在
    if user_dict:
        # 如果用户没有被锁
        if user_dict['lock'] == True:
            # 如果密码正确
            if passwd == user_dict['pwd']:
                return True, '登录成功!'
            else:
                return False, '用户名或密码不正确,重新输入!'
        else:
            return False, '用户已被解冻,请联系管理员!'
    else:
        return False, '用户名或密码不正确,重新输入!'

lib----common.py 公共功能

import hashlib
from core import src

def get_md5(pwd):
    val = '辜氏家族终极密码'
    md5 = hashlib.md5()
    md5.update(val.encode('utf-8'))
    md5.update(pwd.encode('utf-8'))
    res = md5.hexdigest()
    return res

def outter(func):

    def inner(*args, **kwargs):
        while True:
            if src.user_info['user']:
                res = func(*args, **kwargs)
                return res
            else:
                print('请先登录!')
                break
    return inner

posted @ 2019-11-21 22:22  Jeff的技术栈  阅读(214)  评论(0编辑  收藏  举报
回顶部