HTML和JavaScript实现商品购物系统

news2025/2/23 16:27:15

下面是一个更全面的商品购物系统示例,包含新增商品、商品的增加删除以及结算找零的功能。这个系统使用HTML和JavaScript实现。

1.功能说明:

这个应用程序使用纯HTML和JavaScript实现。

  • 包含一个商品列表和一个购物车区域。
  • 商品列表中有几个示例商品,每个商品都有一个“加入购物车”按钮。
  • 点击“加入购物车”按钮后,商品会被添加到购物车中,并更新购物车显示。
  • 购物车中列出了所有已添加的商品,并计算总价。
  • 每个购物车项都有一个“移除”按钮,可以移除该商品。
  • 结算部分包含一个支付金额输入框和一个结算按钮。
  • 输入支付金额后点击结算按钮,会计算找零并弹出提示框显示结算信息,然后清空购物车。
  • 新增商品部分包含输入框用于输入新的商品名称和价格,以及一个“新增商品”按钮。
  • 点击“新增商品”按钮后,新的商品会被添加到商品列表中。

2.代码展示

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>商品购物系统</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f9;
            margin: 0;
            padding: 20px;
        }
        .container {
            display: flex;
            justify-content: space-between;
        }
        .product-list, .cart {
            width: 45%;
            background-color: white;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            text-align: center;
        }
        .product-item, .cart-item {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 10px;
            border-bottom: 1px solid #eee;
        }
        .product-item:last-child, .cart-item:last-child {
            border-bottom: none;
        }
        .product-item button, .cart-item button {
            padding: 5px 10px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .product-item button:hover, .cart-item button:hover {
            background-color: #0056b3;
        }
        .total {
            margin-top: 20px;
            font-size: 18px;
            font-weight: bold;
        }
        .checkout-section {
            margin-top: 20px;
        }
        .checkout-section input[type="number"] {
            width: 100px;
            padding: 5px;
            border: 1px solid #ccc;
            border-radius: 5px;
            margin-right: 10px;
        }
        .checkout-section button {
            padding: 5px 10px;
            background-color: #28a745;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .checkout-section button:hover {
            background-color: #218838;
        }
        .add-product-section {
            margin-top: 20px;
        }
        .add-product-section input[type="text"], .add-product-section input[type="number"] {
            width: 150px;
            padding: 5px;
            border: 1px solid #ccc;
            border-radius: 5px;
            margin-right: 10px;
        }
        .add-product-section button {
            padding: 5px 10px;
            background-color: #ffc107;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .add-product-section button:hover {
            background-color: #e0a800;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="product-list">
            <h1>商品列表</h1>
            <div id="product-items"></div>
            <div class="add-product-section">
                <input type="text" id="new-product-name" placeholder="商品名称" required>
                <input type="number" id="new-product-price" placeholder="价格" min="0" step="any" required>
                <button onclick="addNewProduct()">新增商品</button>
            </div>
        </div>

        <div class="cart">
            <h1>购物车</h1>
            <div id="cart-items"></div>
            <div class="total" id="total-price">总价: ¥0.00</div>
            <div class="checkout-section">
                <input type="number" id="payment" placeholder="支付金额" min="0" step="any" required>
                <button onclick="checkout()">结算</button>
            </div>
        </div>
    </div>

    <script>
        let products = [
            { name: '苹果', price: 5 },
            { name: '香蕉', price: 3 },
            { name: '橙子', price: 4 }
        ];
        let cart = [];

        function updateProductList() {
            const productItemsDiv = document.getElementById('product-items');
            productItemsDiv.innerHTML = '';

            products.forEach((product, index) => {
                const itemDiv = document.createElement('div');
                itemDiv.className = 'product-item';
                itemDiv.innerHTML = `
                    <span>${product.name}</span>
                    <span>¥${product.price.toFixed(2)}</span>
                    <button οnclick="addToCart('${product.name}', ${product.price})">加入购物车</button>
                `;
                productItemsDiv.appendChild(itemDiv);
            });
        }

        function addToCart(name, price) {
            const item = { name, price };
            cart.push(item);
            updateCartDisplay();
        }

        function updateCartDisplay() {
            const cartItemsDiv = document.getElementById('cart-items');
            cartItemsDiv.innerHTML = '';
            let totalPrice = 0;

            cart.forEach((item, index) => {
                const itemDiv = document.createElement('div');
                itemDiv.className = 'cart-item';
                itemDiv.innerHTML = `
                    <span>${item.name}</span>
                    <span>¥${item.price.toFixed(2)}</span>
                    <button οnclick="removeFromCart(${index})">移除</button>
                `;
                cartItemsDiv.appendChild(itemDiv);
                totalPrice += item.price;
            });

            document.getElementById('total-price').textContent = `总价: ¥${totalPrice.toFixed(2)}`;
        }

        function removeFromCart(index) {
            cart.splice(index, 1);
            updateCartDisplay();
        }

        function checkout() {
            if (cart.length === 0) {
                alert('购物车为空,请先添加商品!');
                return;
            }

            const payment = parseFloat(document.getElementById('payment').value);
            const totalPrice = cart.reduce((sum, item) => sum + item.price, 0);

            if (isNaN(payment) || payment < totalPrice) {
                alert('支付金额不足,请重新输入!');
                return;
            }

            const change = payment - totalPrice;
            alert(`结算成功!总价: ¥${totalPrice.toFixed(2)}\n支付金额: ¥${payment.toFixed(2)}\n找零: ¥${change.toFixed(2)}`);
            cart = [];
            updateCartDisplay();
            document.getElementById('payment').value = '';
        }

        function addNewProduct() {
            const newName = document.getElementById('new-product-name').value.trim();
            const newPrice = parseFloat(document.getElementById('new-product-price').value);

            if (!newName || isNaN(newPrice) || newPrice <= 0) {
                alert('请输入有效的商品名称和价格!');
                return;
            }

            products.push({ name: newName, price: newPrice });
            updateProductList();
            document.getElementById('new-product-name').value = '';
            document.getElementById('new-product-price').value = '';
            alert(`商品 "${newName}" 已成功添加`);
        }

        // 初始化商品列表
        updateProductList();
    </script>
</body>
</html>




3.效果展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 探险之旅:第三节 - 有趣的变量命名

欢迎再次回到我们的C#魔法森林。今天&#xff0c;我们要一起探索一个既有趣又实用的技能——变量命名。想象一下&#xff0c;你正在为你的小精灵们&#xff08;变量&#xff09;起名字&#xff0c;好的名字不仅能让它们更容易被识别&#xff0c;还能让你的魔法书&#xff08;代…

JavaEE 【知识改变命运】04 多线程(3)

文章目录 多线程带来的风险-线程安全线程不安全的举例分析产出线程安全的原因&#xff1a;1.线程是抢占式的2. 多线程修改同一个变量&#xff08;程序的要求&#xff09;3. 原子性4. 内存可见性5. 指令重排序 总结线程安全问题产生的原因解决线程安全问题1. synchronized关键字…

ASP.NET|日常开发中连接Sqlite数据库详解

ASP.NET&#xff5c;日常开发中连接Sqlite数据库详解 前言一、安装和引用相关库1.1 安装 SQLite 驱动1.2 引用命名空间 二、配置连接字符串2.1 连接字符串的基本格式 三、建立数据库连接3.1 创建连接对象并打开连接 四、执行数据库操作4.1 创建表&#xff08;以简单的用户表为例…

DS记录中

DataX/hdfswriter/doc/hdfswriter.md at master alibaba/DataX GitHub DataX 写入文档 https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2/architecture/task-structure DS文档 DS 项目举例 流程 数据库(Datax) -> ODS &#xff08;shell&#xff09;->ADS(…

Node.js express

1. express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs.com.cn/简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB 应用&#xff…

网络应用技术 实验八:防火墙实现访问控制(华为ensp)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、设计全网 IP 地址 2、设计防火墙安全策略 3、在 eNSP 中部署园区网 4、配置用户主机地址 5、配置网络设备 配置交换机SW-1~SW-5 配置路由交换机RS-1~RS-5 配置路由器R-1~R-3 6、配置仿…

分布式日志系统设计

一、分布式日志系统定义 分布式日志系统是一种用于收集、存储和分析大规模分布式系统日志的系统。它可以帮助开发人员和系统管理员实时监控和调试系统&#xff0c;提高系统可靠性和可用性&#xff0c;同时也可以用于日志分析和故障排查。 二、简单设计思路 日志收集&#xff…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

java+springboot+mysql私人会所管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的私人会所管理系统&#xff0c;系统包含管理员、技师、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;服务项目&#xff1b;技师管理&#xff1b;房间管理&#xff1b;预约管理&#x…

Java面试之Happens-Before原则

此篇接上一篇的Java面试之volatile关键字。 首先&#xff0c;这是Java语言中的一个“先行发生”(Happens-Before)的原则。是判断数据是否存在竞争&#xff0c;线程是否安全的非常有用的手段&#xff0c;也是Java内存模型中定义的两项操作之间的偏序关系。 其次&#xff0c;Happ…

TensorFlow深度学习实战(1)——神经网络与模型训练过程详解

TensorFlow深度学习实战&#xff08;1&#xff09;——神经网络与模型训练过程详解 0. 前言1. 神经网络基础1.1 神经网络简介1.2 神经网络的训练1.3 神经网络的应用 2. 从零开始构建前向传播2.1 计算隐藏层节点值2.2 应用激活函数2.3 计算输出层值2.4 计算损失值2.4.1 在连续变…

C++鼠标轨迹算法(鼠标轨迹模拟真人移动)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后&#xff0c;用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了&#xff0c;可以去maven官网下载补充。 如果run时提示程序包xx不存在&#xff0c;在项目目录右键Marven->Re…

【AI知识】过拟合、欠拟合和正则化

一句话总结&#xff1a; 过拟合和欠拟合是机器学习中的两个相对的概念&#xff0c;正则化是用于解决过拟合的方法。 1. 欠拟合&#xff1a; 指模型在训练数据上表现不佳&#xff0c;不能充分捕捉数据的潜在规律&#xff0c;导致在训练集和测试集上的误差都很高。欠拟合意味着模…

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…

优选算法——分治(快排)

1. 颜色分类 题目链接&#xff1a;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&#xff1a;本题其实就要将数组最终分成3块儿&#xff0c;这也是后面快排的优化思路&#xff0c;具体大家来看下图。 这里我们上来先定义了3个指针&…

[Maven]下载安装、配置与简介

很多框架的下载使用的流程和思路是差不多的&#xff0c;这里以maven做详细介绍。 下载安装与配置变量 下载 首先&#xff0c;我们要使用maven&#xff0c;必须先下载它的相关文件。想要下载&#xff0c;我们可以直接搜索maven。找到它的官网。这里不绕弯子&#xff0c;直接给出…

Maven 安装配置(详细教程)

文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和自动化构建工具。它主要服务于 Java 平台&#xff0c;但也支持其他编程语言…

【AI知识】人工智能、机器学习、深度学习的概念与联系

下图来自博客 机器学习和深度学习概念入门 &#xff0c;图中可明显看到人工智能、机器学习、深度学习三个概念的包含关系&#xff0c;下面简单介绍一下这三个概念已经它们之间的联系。 1. 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09; 概念&#x…

BUUCTF Pwn bjdctf_2020_babystack2 题解

1.下载 checksec 64位 拖入IDA64 定位到main函数 以及后门函数 发现read需要读取输入——nbytes的数字来决定长度 同时nbytes是size_t类型 也就是无符号整型的 所以想到整数溢出漏洞 将nbytes设置为-1就会回绕&#xff0c;变成超大整数 从而实现栈溢出漏洞 exp&#xff1a…