学习javascript,实现一个简易售卖机的功能

有同学提问,说想实现一个JS售卖机的功能,我觉得这个挺有意思的,正是初学者学习JS,锻炼软件开发思维的一个好题目,所以就实现了一下,希望可以有帮助。

目录

1 需求分析

2  开发实现

2.1 商家端录入

2.2 用户端实现

3 建议改进 


1 需求分析

需求是这样子的:完成一个自动售货机,至少有3个商品,每个商品都有价格和数量,每购买一次商品,数量会减1,余额也会减少。当余额小于商品的价格时,会提示“余额不足,无法购买商品”;当数量为0如果用户继续购买时,会提示“商品已售完,无法购买”。

通过需求,我们可以分析出以下实现步骤:

商家端实现步骤

  1. 可以自主录入,录入商品名称、商品单价、商品初始数量;
  2. 录入完成后,有按钮,点击按钮保存商品;
  3. 保存商品后,需要展示自己已经录入过商品信息;
  4. 录入结束,就可以跳转到用户界面去售卖了;

用户端实现步骤 

  1. 展示商家页面录入的商品,展示为列表
  2. 列表元素,展示信息包括商品名称、商品单价、剩余数量以及购买按钮
  3. 用户默认初始余额为0,;
  4. 做简单点,这个页面可以为用户充值,并展示充值金额;
  5. 当用户购买商品时,需要判断余额大于购买商品的单价并且商品数量大于0,则用户余额减去商品单价,并且商品剩余数量减1;
  6. 当用户余额小于购买商品单价时,提示“余额不足,无法购买该商品”;
  7. 当用户购买商品数量等于0时,提示“该商品已售完,无法购买”

2  开发实现

2.1 商家端录入

因为商家端录入的数据,要和用户端跨页面通信数据,所以我们把录入的信息存入localStorage中,源码实现如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>商家录入</title>
<style>
    
</style>
</head>
<body>
    <p><b>商品录入</b></p>
    <div>
        <label>商品名称:</label><input type="text" id="name" />
    </div>
    <div>
        <label>商品金额:</label><input type="number" id="money" />
    </div>
    <div>
        <label>商品数量:</label><input type="number" id="number" />
    </div>
    <button onclick="enterProduct()">录入</button>
    
    <br/>
    <p><b>已录入商品展示:</b></p>
    <div id="productList"></div>
    <button onclick="go2Sell()">开始售卖</button>

    <script>
        var productList = [];
        function enterProduct() {
            var name = document.getElementById('name').value;
            var money = document.getElementById('money').value;
            var number = document.getElementById('number').value;
            var productShowDom = document.getElementById('productList');
            productList.push({
                name,
                money,
                number
            });
            localStorage.setItem('product', JSON.stringify(productList));
            // 展示已录入商品
            var proShowArr = [], proShowStr = '';
            for (var i=0;i<productList.length;i++) {
                proShowArr.push('<div>');
                proShowArr.push(`${i+1} ${productList[i]['name']} ¥${productList[i]['money']} ${productList[i]['number']}`);
                proShowArr.push('</div>');
            }
            proShowStr = proShowArr.join('');
            productShowDom.innerHTML = proShowStr;
        }
        function go2Sell() {
            if (productList.length === 0) {
                alert('请录入商品后再进行售卖');
                return;
            }
        }
    </script>
</body>
</html>

2.2 用户端实现

首先从localStorage获取数据,展示为列表,初始化展示用户余额为0;然后按钮操作逐个进行判断,源代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户购买</title>
<style>
    #productListBox {
        margin: 100px;
        margin-bottom: 20px;
        display: flex;
        width: 800px;
    }
    #productListBox div {
        margin-left: 50px;
        width: 200px;
        border: 1px solid #CCC;
    }
    .recharge {
        margin-left: 150px;
    }
</style>
</head>
<body>
    <div id="productListBox"></div>
    <p class="recharge">
        <input type="number" id="balanceInput" /><button onclick="rechMoney()">充值</button>
    </p>
    <p class="recharge">
        余额:¥<span id="balance"></span>
    </p>
    <script>
        var balanceDom = document.getElementById('balance');
        balanceDom.innerText = 0;

        function showProductList() {
            var productDom = document.getElementById('productListBox');
            var proData = localStorage.getItem('product');
            proData = JSON.parse(proData);
            var proShowArr = [], proShowStr = '';
            for (var i=0;i<proData.length;i++) {
                proShowArr.push('<div>');
                    proShowArr.push(`<p>${proData[i]['name']}</p>`);
                    proShowArr.push(`<p>售价:${proData[i]['money']}</p>`);
                    proShowArr.push(`<p>剩余:${proData[i]['number']}</p>`);
                    proShowArr.push(`<button onclick=buy(${i})>购买</button>`);
                proShowArr.push('</div>');
            }
            proShowStr = proShowArr.join('');
            productDom.innerHTML = proShowStr;
        }

        showProductList();

        function rechMoney() {
            var rechMoneyVal = document.getElementById('balanceInput').value;
            var balanceDom = document.getElementById('balance');
            balanceDom.innerText = rechMoneyVal;
            document.getElementById('balanceInput').value = '';
        }
        function buy(index) {
            var proData = localStorage.getItem('product');
            proData = JSON.parse(proData);
            if (Number(proData[index]['number']) <= 0) {
                alert('该商品已售完,无法购买');
                return;
            }
            var balanceDom = document.getElementById('balance');
            if (Number(balanceDom.innerText) < Number(proData[index]['money'])) {
                alert('余额不足,无法购买该商品');
                return;
            }
            var newBalance = Number(balanceDom.innerText) - Number(proData[index]['money']);
            balanceDom.innerText = newBalance;

            var productItemNum = Number(proData[index]['number']);
            productItemNum--;
            proData[index]['number'] = productItemNum;
            localStorage.setItem('product', JSON.stringify(proData));

            showProductList();
        }
    </script>
</body>
</html>

3 建议改进 

这事比较简易的实现,首先来说样式需要做的漂亮一些,要不这就真的只是一个小demo;录入的时候,录入完成一个就应该把输入框内的信息清除掉;我们这里存入了localStorage,到了真实项目开发,或者往后做,肯定是要通过接口存入数据库的,到时候就可以录入更多更多的商品了。

如果你是一名在校学生,赶紧抓紧时间学习起来吧,希望等你出来的时候,可以跑赢更多的人。

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经海路大白狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值