用vue和node写的简易购物车实现

下面我将为大家介绍用Vue和Node.js写的简易购物车实现的完整攻略。

准备工作

环境要求

  • Node.js
  • Vue.js
  • 基本的HTML和CSS知识

项目结构

├── client # 前端代码
│   ├── node_modules # 依赖
│   ├── public # 静态资源
│   ├── src # 源代码
│   ├── .gitignore # git忽略文件配置
│   ├── package.json # 依赖配置
│   ├── package-lock.json # 依赖锁定
│   ├── README.md # 项目说明
│   └── yarn.lock # 依赖锁定
├── server # 后端代码
│   ├── node_modules # 依赖
│   ├── bin # 可执行文件
│   ├── config # 配置文件
│   ├── controllers # 控制器
│   ├── libs # 工具库
│   ├── models # 数据模型
│   ├── routes # 路由
│   ├── app.js # 入口文件
│   ├── .gitignore # git忽略文件配置
│   ├── package.json # 依赖配置
│   ├── package-lock.json # 依赖锁定
│   ├── README.md # 项目说明
│   └── yarn.lock # 依赖锁定
├── .gitignore # git忽略文件配置
└── README.md # 项目说明

开始构建

创建Vue应用

vue create client

安装ElementUI

cd client
yarn add element-ui -S

在main.js里面引入

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';

Vue.use(ElementUI);

new Vue({
  render: (h) => h(App),
}).$mount('#app');

编写商品列表

<template>
  <el-table :data="products" style="width: 100%;">
    <el-table-column prop="name" label="商品名称"></el-table-column>
    <el-table-column prop="price" label="价格"></el-table-column>
    <el-table-column label="操作">
      <template slot-scope="scope">
        <el-button type="primary" @click="addToCart(scope.row)">加入购物车</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      products: [
        {
          name: '商品A',
          price: 10,
        },
        {
          name: '商品B',
          price: 20,
        },
      ],
    };
  },
  methods: {
    addToCart(product) {
      this.$emit('add-to-cart', product);
    },
  },
};
</script>

编写购物车列表

<template>
  <el-table :data="cart" style="width: 100%;">
    <el-table-column prop="name" label="商品名称"></el-table-column>
    <el-table-column prop="price" label="价格"></el-table-column>
    <el-table-column label="数量">
      <template slot-scope="scope">
        <el-input-number v-model="scope.row.quantity" :min="1"></el-input-number>
      </template>
    </el-table-column>
    <el-table-column label="总价">
      <template slot-scope="scope">
        {{ (scope.row.price * scope.row.quantity).toFixed(2) }}
      </template>
    </el-table-column>
    <el-table-column label="操作">
      <template slot-scope="scope">
        <el-button type="danger" @click="removeFromCart(scope.row)">移除</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  props: {
    cart: {
      type: Array,
      default: () => [],
    },
  },
  methods: {
    removeFromCart(product) {
      this.$emit('remove-from-cart', product);
    },
  },
};
</script>

创建Node.js应用

mkdir server && cd server
npm init -y

安装Express

npm install express

安装MongoDB

brew install mongodb

在app.js里面添加以下内容

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const cors = require('cors');
const port = 3000;

// 连接数据库
mongoose.connect('mongodb://localhost/vue-shopping-cart', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

// 定义数据模型
const Product = mongoose.model('Product', {
  name: String,
  price: Number,
});

// 跨域配置
app.use(cors());

// 解析请求体
app.use(bodyParser.json());

// 获取商品列表
app.get('/api/products', async (req, res) => {
  const products = await Product.find();
  res.json(products);
});

// 生成订单
app.post('/api/orders', (req, res) => {
  console.log(req.body);
  res.send('Create order success.');
});

// 启动服务器
app.listen(port, () => {
  console.log(`Server is running at http://localhost:${port}`);
});

示例说明1:获取商品列表

在client里面的ProductList.vue里面添加以下代码

<script>
import axios from 'axios';

export default {
  data() {
    return {
      products: [],
    };
  },
  created() {
    this.fetchData();
  },
  methods: {
    fetchData() {
      axios.get('http://localhost:3000/api/products').then((res) => {
        this.products = res.data;
      });
    },
    addToCart(product) {
      const cart = JSON.parse(localStorage.getItem('cart')) || [];
      let item = cart.find((el) => el._id === product._id);

      if (!item) {
        item = {
          _id: product._id,
          name: product.name,
          price: product.price,
          quantity: 1,
        };
        cart.push(item);
      } else {
        item.quantity++;
      }

      localStorage.setItem('cart', JSON.stringify(cart));

      this.$emit('cart-updated', cart);
    },
  },
};
</script>

示例说明2:生成订单

在client里面的Checkout.vue里面添加以下代码

<script>
import axios from 'axios';

export default {
  data() {
    return {
      cart: [],
      order: {},
    };
  },
  created() {
    this.cart = JSON.parse(localStorage.getItem('cart')) || [];
  },
  computed: {
    total() {
      let sum = 0;

      this.cart.forEach((item) => {
        sum += item.price * item.quantity;
      });

      return sum.toFixed(2);
    },
  },
  methods: {
    submitOrder() {
      axios
        .post('http://localhost:3000/api/orders', {
          cart: this.cart,
          order: this.order,
          total: this.total,
        })
        .then((res) => {
          localStorage.removeItem('cart');
          this.cart = [];
          this.order = {};
          this.$message.success('订单创建成功!');
        });
    },
  },
};
</script>

代码演示

完整的代码可在以下仓库中查看:

你可以按照以下步骤运行代码:

  • 克隆仓库到本地

bash
git clone https://github.com/baykier/vue-shopping-cart.git

  • 进入client目录,安装依赖并启动前端应用

bash
cd vue-shopping-cart/client
yarn
yarn serve

  • 进入server目录,安装依赖并启动后端应用

bash
cd vue-shopping-cart/server
npm install
npm start

或者使用nodemon来启动

bash
nodemon bin/www

  • 打开浏览器,访问 http://localhost:8080/,开始使用购物车应用。

以上就是用Vue和Node.js写的简易购物车实现的完整攻略,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用vue和node写的简易购物车实现 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 在Node.js中实现文件复制的方法和实例

    下面是在Node.js中实现文件复制的方法和实例的完整攻略。 方法1:使用fs模块实现文件复制 Node.js内置的fs模块中包含了文件系统的各种API,可以用来实现文件的读写和复制,其中最常用的方法是fs.copyFile()。 步骤1:引入fs模块 const fs = require(‘fs’); 步骤2:使用fs.copyFile()方法实现文件复制…

    node js 2023年6月8日
    00
  • Node升级后vue项目node-sass报错问题及解决

    针对该问题,下面给出详细的解决攻略: 问题描述 在升级 Node 版本后,运行 Vue 项目时,可能会出现以下报错: Error: Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 12.x Found bindings f…

    node js 2023年6月8日
    00
  • Nodejs实现短信验证码功能

    为了实现短信验证码功能,可以通过Nodejs搭建一个基于REST API协议的服务器端应用程序。下面是一个完整攻略: 步骤一:准备环境 首先,确保你已经安装了Nodejs环境。可以从Nodejs官网下载安装:https://nodejs.org。 接着,你需要安装三个npm模块,分别是express(用于搭建Web应用框架)、body-parser(用于解析…

    node js 2023年6月8日
    00
  • express结合nodejs开启服务示例模版

    本文将详细讲解如何使用Express结合Node.js开启服务示例模版。以下是完整攻略: 安装Node.js 首先,确保您已经安装了Node.js。Node.js是一个基于Chrome V8引擎的JavaScript运行时,可用于在服务器端运行JavaScript代码。您可以在官网上下载并安装Node.js:https://nodejs.org/en/dow…

    node js 2023年6月8日
    00
  • Node.js中console.log()输出彩色字体的方法示例

    当在 Node.js 中使用 console.log() 输出时,默认只输出简单的字符串。如果需要在输出中加入一些颜色和样式,可以使用 ANSI 转义码来实现。以下是完整的攻略: 1. 通过给字符串添加 ANSI 转义符号来输出不同的颜色和样式 ANSI 转义码有许多种,可以通过使用不同的转义码来实现不同的颜色和样式效果。在 Node.js 中,可以使用以下…

    node js 2023年6月8日
    00
  • Node.js:模块查找,引用及缓存机制详解

    下面为您详细讲解“Node.js:模块查找,引用及缓存机制详解”的完整攻略。 Node.js:模块查找、引用及缓存机制详解 模块查找 在 Node.js 中,require 方法用于加载模块。当加载一个模块时,Node.js 需要使用一定的规则来查找该模块,这些规则将在下面详细解释。 核心模块 当加载一个核心模块时,Node.js 会优先从内置的核心模块列表…

    node js 2023年6月8日
    00
  • 一文详解GoJs中go.Panel的itemArray属性

    当我们在使用GoJS的时候,很多时候我们都需要使用Panel这个类来进行布局,而Panel类中一个非常重要的属性是itemArray。本文将详细说明itemArray的作用与用法。 什么是itemArray 在Panel中可以添加的子控件称为item。Panel的item数组属性就是指定了所有添加到该Panel中的子控件,也就是item的数组。itemArr…

    node js 2023年6月8日
    00
  • 宝塔部署nodejs项目的实战步骤

    下面是宝塔部署Node.js项目的实战步骤: 1. 在宝塔面板上安装Node.js环境 打开宝塔面板,找到“软件商店”,搜索“Node.js”。 在搜索结果中点击“安装”按钮进行安装。 2. 上传Node.js项目到宝塔网站目录 在宝塔面板中找到需要部署的网站,点击进入。 找到网站目录所在位置,在目录下新建一个文件夹,命名为“node”。 将本地Node.j…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部