项目的设计、购物车系统

一、项目设计

1、项目的生命周期:

1.需求分析

2.项目设计

3.分任务开发程序

4.项目测试

5.上线运行

6.维护更新

2、经典的三层结构

1.用户界面(用户功能)层 : 接收用户数据 ,或者展示数据给用户
2.业务逻辑(接口)层:   处理用户界面层得到的数据,进行判断 验证
3.数据访问(数据处理)层(持久层) : 帮助业务逻辑层 保存数据 或是读取数据

与程序处理数据的三步刚好是对应

一个应用程序的本质,就是在帮用户处理数据,一定分为三步
1.用户通过某种方式将数据交给程序 (手机APP 浏览器,PC段程序)
2.程序在拿到数据之后进行分析 判断数据是否是正确的 (python c,java)
3.将正确数据进行存储 (数据库 文件)

界面层与数据层不应该直接通讯

二、购物车系统

1、文件

2、系统入口

I.所需信息

#系统用户信息
sys_msg = ‘‘‘
欢迎使用购物车简单系统,请选择:
1.注册 | 2.登录 | 3.账户 | 4.充值 | 5.购物 | 6.支付 | 7.购物车 | 10.注销 | 0.退出
>>>‘‘‘

# 功能字典
method_dic = {
    ‘1‘: regist,
    ‘2‘: login,
    ‘3‘: account,
    ‘4‘: top_up,
    ‘5‘: shopping,
    ‘6‘: pay_maney,
    ‘7‘: shop_cart_info,
    ‘10‘: logout
}

II.系统入口

def system():
    while True:
        choice = input(sys_msg).strip()
        if choice == ‘0‘:
            print(‘系统退出!‘)
            return
        if not choice in method_dic:
            print(‘输入有误,请出现输入‘)
            continue
        method_dic[choice]()

system()

3、账户操作

I.所需信息

# 将文件信息读取到内存中,以变量存储,后期需要大量与这些信息交互
# 如何设计存储用户信息的集合变量
# 以用户名为key的dict,value可以为[]|{}
users_dic = {} # 从文件中读取来
‘‘‘
{
    ‘abc‘: {‘ps‘: ‘123‘, ‘money‘: 0},
    ‘qwe‘: {‘ps‘: ‘000‘, ‘money‘: 1000}
}
‘‘‘
# 存储当前登录成功的用户的信息
user = {}
# {‘usr‘: ‘abc‘, ‘ps‘: ‘123‘, ‘money‘: 0}

II.所需方法

# 获取所有已注册的用户,存放到user_dic
# 获取文件中用户信息
def get_users():
    # 如果用户集合已经有值,代表用户信息已经读取过了,不需要重复读取
    if users_dic:
        return users_dic
    # 读文件,存用户们
    with open(‘usr.info‘, ‘rt‘, encoding=‘utf-8‘) as f:
        # "abc|123|0,qwe|123|1000" or "abc|123|0" or none
        data = f.read()
        if not data:
            # 文件中并没有用户信息,那么用户集合也不需要存储,可以直接返回
            return users_dic
        # [‘abc|123|0‘, ‘qwe|123|1000‘] or [‘abc|123|0‘]
        data_list = data.split(‘,‘)
        for d in data_list:
            # [‘abc‘, ‘123‘, ‘0‘]
            user_info = d.split(‘|‘)
            usr = user_info[0]
            ps = user_info[1]
            money = user_info[2]
            # 按照 ‘abc‘: {‘ps‘: ‘123‘, ‘money‘: 0} 存储到 users_dic
            users_dic[usr] = {‘ps‘: ps, ‘money‘: money}
        return users_dic

III.注册

def regist():
    print("注册界面...")
    # 获取所有用户信息
    users = get_users()
    # 账号输入操作
    temp_info = "请"
    while True:
        usr = input(temp_info + "输入账号:").strip()
        # 输入的用户名有格式问题
        if not usr:  # 用户名为空
            print("账号不能为空!")
            temp_info = "请重新"
            continue
        # 用户已存在
        if usr in users:
            print("用户已存在,请更换用户名!")
            temp_info = "请重新"
            continue
        # 用户不存在,可以进入输入密码阶段
        break
    # 密码输入操作
    temp_info = "请"
    while True:
        ps = input(temp_info + "输入密码:").strip()
        # 输入的密码有格式问题
        if len(ps) < 3:
            print("密码过短!")
            temp_info = "请重新"
            continue
        # ... 添加其他密码安全判断
        break
    # 账号密码均满足条件,可以注册(写入文件)
    with open(‘usr.info‘, ‘at‘, encoding=‘utf-8‘) as f:
        # 文件是否为空
        # 为空abc|123|0 不为空,qwe|123|0
        # users是否为空可以直接反映文件是否为空
        if users:
            user_info = ‘,%s|%s|%d‘ % (usr, ps, 0)
        else:
            user_info = ‘%s|%s|%d‘ % (usr, ps, 0)
        f.write(user_info)
    # 文件操作完代表信息更新到文件中了,
    # 还需要将信息更新到内存字典中
    users[usr] = {‘ps‘: ps, ‘money‘: 0}
    print(‘注册成功!‘)

IV.登录

# 登录
def login():
    global user
    print("登录界面...")
    # 获取所有用户信息
    users = get_users()
    # 当前是否为登录状态
    # 可以通过user(存储已登录账号)来反映是否为登录状态
    if user:
        print("系统已经处于登录状态!")
        return
    # 用户名输入
    temp_info = "请"
    while True:
        usr = input(temp_info + ‘输入账号:‘).strip()
        # 账号不能为空
        if not usr:
            print("账号不能为空!")
            temp_info = "请重新"
            continue
        # 账号不存在
        if not usr in users:
            print("输入用户名不存在")
            # 文件为空,没有必要继续,不为空,可以让用户重新输入
            if users:
                temp_info = "请重新"
                continue
            return
        break
    # 输入密码操作
    temp_info = "请"
    count = 0
    while count < 3:
        ps = input(temp_info + ‘输入密码:‘).strip()
        if users[usr][‘ps‘] == ps:
            print(‘登录成功!‘)
            # money在二次以后操作文件可能已经拥有金额
            money = users[usr][‘money‘]
            # 直接赋值代表覆盖,方法内不能直接覆盖全局变量,需要做global处理
            user = {‘usr‘: usr, ‘ps‘: ps, ‘money‘: money}
            break
        print(‘密码输入错误!‘)
        temp_info = "请重新"
        count += 1

V.账户

# 账户
def account():
    if not user:
        print(‘请先登录系统!‘)
        return
    user_info = ‘账户:%s | 密码:%s | 金额:%d ‘ % (user[‘usr‘], user[‘ps‘], user[‘money‘])
    print(user_info)

VI.注销

# 注销
def logout():
    if not user:
        print(‘未有用户登录,不需注册!‘)
        return
    user.clear()
    print(‘注销成功!‘)

4、充值购物支付

I.所需信息

# 登录成功后,对于商品的一系列操作
# 商品列表
goods_dic = {‘1‘: ‘iPhone‘, ‘2‘: ‘Mac‘, ‘3‘: ‘iPad‘}
price_dic = {‘iPhone‘: 100, ‘Mac‘: 200, ‘iPad‘: 50}
# 购物车
shop_car = {}
# {‘iPhone‘: 3, ‘iPad‘: 1}
goods_msg = ‘‘‘
请添加商品到购物车:
1.iPhone | 2.Mac | 3.iPad | 0.退出购买‘‘‘

II.所需方法

# 对密码或金额进行修改
def update_info(k, v):
    # 需要更新的内容有:
    # 1.当前登录状态下的用户
    # 2.内存中的用户们
    # 3.文件中的用户信息
    # 更新1号位
    # 区分更新的类型
    if k == ‘money‘:
        user[k] += v
    else:
        user[k] = v
    # 通过1号位更新2号位
    users = get_users()
    users[user[‘usr‘]][k] = user[k]
    # 通过2号位更新3号位
    # 将
    # {‘abc‘: {‘ps‘: ‘123‘, ‘money‘: 0},‘qwe‘: {‘ps‘: ‘000‘, ‘money‘: 1000}}
    # 转换为
    # "abc|123|0,qwe|123|1000"
    # 写入文件
    # dict 转换为 str
    users_info = ‘‘
    for k, v in users.items():
        usr = k
        ps = v[‘ps‘]
        money = str(v[‘money‘])
        if not users_info:
            users_info += ‘|‘.join((usr, ps, money))
        else:
            users_info += ‘,‘ + ‘|‘.join((usr, ps, money))
    # 转换完毕后便可以写入文件
    with open(‘usr.info‘, ‘wt‘, encoding=‘utf-8‘) as f:
        f.write(users_info)

III.充值

# 充值
def top_up():
    if not user:
        print(‘系统未登录!‘)
        return
    temp_info = "请"
    while True:
        money = input(temp_info + ‘输入充值金额:‘).strip()
        if not money.isdigit():
            print(‘输入金额有误!‘)
            temp_info = "请重新"
            continue
        money = int(money)
        break
    # 更新金额
    update_info(‘money‘, money)
    print("充值完毕!")

IV.购物

# 购物
def shopping():
    if not user:
        print(‘系统未登录!‘)
        return
    print(goods_msg)
    while True:
        # 商品编号
        goods_num = input("商品编号:").strip()
        if goods_num == ‘0‘:
            print(‘退出购买!‘)
            break
        if not goods_num in goods_dic:
            print(‘商品不存在!‘)
            continue

        while True:
            # 商品数
            count = input(‘商品个数:‘).strip()
            if not count.isdigit():
                print(‘个数有误!‘)
                continue
            count = int(count)
            # 编号与个数均正确
            # 加入购物车:{商品名: 个数}
            goods = goods_dic[goods_num]
            # 通过商品与购物车进行匹配,判断商品个数是累加还是赋值
            if not goods in shop_car:
                shop_car[goods] = count
            else:
                shop_car[goods] += count
            # 更新完购物车后代表一次购物车添加完毕
            # 查看一下当前购物车信息
            shop_cart_info()
            break
    # 进入支付:余额充足直接付款,不足充值
    pay_money()

V.支付

# 支付
def pay_money():
    if not user:
        print(‘系统未登录!‘)
        return
    # 由购物来到支付,也可能主动调用支付
    if not shop_car:
        print("购物车为空,请前往购物!")
        return
    # 计算购物车内商品总价
    total = 0
    for goods in shop_car:
        total += price_dic[goods] * shop_car[goods]
    # 判断余额与商品总价大小
    if user[‘money‘] >= total:
        print(‘余额充足,购买成功!‘)
        # 更新信息
        reduce = 0 - total
        update_info(‘money‘, reduce)
        # 支付成功后,需要清空购物车
        shop_car.clear()
    else:
        print(‘余额不足,请充值!‘)
        top_up()

VI.购物车

# 购物车
def shop_cart_info():
    if not shop_cart:
        print("购物车未空,可前往购物!!!")
        return
    print("购物车: ", shop_cart)

原文地址:https://www.cnblogs.com/dongzhihaoya/p/10109242.html

时间: 2024-10-08 21:44:39

项目的设计、购物车系统的相关文章

产品-项目型适配式系统开发之理念和设计

一.背景 在系统开发过程中,尤其是涉及到系统集成性软件开发过程中,我们经常会碰到类似这样的场景:团队中已经有一个产品化的软件系统,但该软件系统需要按照项目型进行实施,而每个项目由于面向不同客户在某一些产品组件上可能都会有其一定的独特性.这些特定的产品组件往往涉及到系统集成,由于集成技术和方案的不同而需要进行二次开发,如下图所示: 从上面的组件图中我们可以看到在产品系统中,部分产品组件(图中为产品组件A和B)的运行将依赖于系统集成组件,而系统集成组件的实现将视项目而定,图中的项目实现1.2和3分别

30、生鲜电商平台-电商促销业务分析设计与系统架构

说明:Java开源生鲜电商平台-电商促销业务分析设计与系统架构,列举的是常见的促销场景与源代码下载 左侧为享受促销的资格,常见为这三种: 首单 大于或等于某个会员级别 特定会员组:比如女性,月消费满1000等等,都是通过查询条件查询出来的特定分组. 优惠类型,对于电商网站主要是下面4类: 金额 赠品:商品.优惠券.现金券.积分等 包邮(实际上也是钱) 其它:如送精美包装等. 对于其它业务类型的平台,则估计会有其它形式的优惠,比如赠送三个VIP会员等等. 范围,无非就是: 整单 指定品类或特定品类

架构设计:系统间通信(32)——其他消息中间件及场景应用(下2)

(接上文<架构设计:系统间通信(31)--其他消息中间件及场景应用(下1)>) 5-3.解决方案二:改进半侵入式方案 5-3-1.解决方法一的问题所在 方案一并不是最好的半侵入式方案,却容易理解架构师的设计意图:至少做到业务级隔离.方案一最大的优点在于日志采集逻辑和业务处理逻辑彼此隔离,当业务逻辑发生变化的时候,并不会影响日志采集逻辑. 但是我们能为方案一列举的问题却可以远远多于方案一的优点: 需要为不同开发语言分别提供客户端API包.上文中我们介绍的示例使用JAVA语言,于是 事件/日志采集

架构设计:系统存储(9)——MySQL数据库性能优化(5)

=================================== (接上文<架构设计:系统存储(9)--MySQL数据库性能优化(5)>) 4-3-3-3.避免死锁的建议 上一篇文章我们主要介绍了MySQL数据库中锁的基本原理.工作过程和产生死锁的原因.通过上一篇文章的介绍,可以确定我们需要业务系统中尽可能避免死锁的出现.这里为各位读者介绍一些在InnoDB引擎使用过程中减少死锁的建议. 正确使用读操作语句 经过之前文章介绍,我们知道一般的快照读是不会给数据表任何锁的.那么这些快照读操作

架构设计:系统间通信(10)——RPC的基本概念

1.概述 经过了详细的信息格式.网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热.从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC.在后续的几篇文章中,我们首先讲解RPC的基本概念,一个具体的RPC实现会有哪些基本要素构成,然后我们详细介绍一款典型的RPC框架:Apache Thrift.接下来我们聊聊服务治理和DUBBO服务框架.最后总结一下如何在实际工作中选择合适的RPC框架. 2.RPC概述 2-1.什么是RPC RPC(Remote Procedure

架构设计:系统间通信(26)——ActiveMQ集群方案(下)

(接上文<架构设计:系统间通信(26)--ActiveMQ集群方案(上)>) 3.ActiveMQ热备方案 ActiveMQ热备方案,主要保证ActiveMQ的高可用性.这种方案并不像上节中我们主要讨论的ActiveMQ高性能方案那样,同时有多个节点都处于工作状态,也就是说这种方案并不提高ActiveMQ集群的性能:而是从集群中的多个节点选择一个,让其处于工作状态,集群中其它节点则处于待命状态.当主要的工作节点由于各种异常情况停止服务时,保证处于待命的节点能够无缝接替其工作. 3-1.Acti

使用MongoDB和JSP实现一个简单的购物车系统

1 问题描述 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来获取用户提交的登录信息并查询数据库,如果用户名为本小组成员的名字且密码为对应的学号时,采用JSP内置对象的方法跳转到订购页面(显示店中商品的种类和单价等目录信息):否则采用JSP动作提示用户重新登录(注:此页面上要包含前面的登录界面). (3)当顾客填好所需商品的数量并点击提交按钮时,将前面订购的商品放

架构设计:系统间通信(28)——Kafka及场景应用(中1)

(接上文<架构设计:系统间通信(27)--其他消息中间件及场景应用(上)>) 在本月初的写作计划中,我本来只打算粗略介绍一下Kafka(同样是因为进度原因).但是,最近有很多朋友要求我详细讲讲Kafka的设计和使用,另外两年前我在研究Kafka准备将其应用到生产环境时,由于没有仔细理解Kafka的设计结构所导致的问题最后也还没有进行交代.所以我决定即使耽误一些时间,也要将Kafka的原理和使用场景给读者详细讨论讨论.这样,也算是对两年来自己学习和使用Kafka的一个总结. 4.Kafka及特性

架构设计:系统间通信(16)——服务治理与Dubbo 中篇(预热)

1.前序 上篇文章中(<架构设计:系统间通信(15)--服务治理与Dubbo 上篇>),我们以示例的方式讲解了阿里DUBBO服务治理框架基本使用.从这节开始我们将对DUBBO的主要模块的设计原理进行讲解,从而帮助读者理解DUBBO是如何工作的.(由于这个章节的内容比较多,包括了知识准备.DUBBO框架概述.DUBBO各模块分析,所以我将把内容切割成多篇文章) 2.基础知识准备 为了让读者更好理解下文讲解的内容,在开始讲解DUBBO框架主要模块前,我们先要介绍一些基础知识.这些基础知识将帮助读者