webpack4+express+mongodb+vue实现增删改查的示例

下面我将详细讲解“webpack4+express+mongodb+vue实现增删改查的示例”的完整攻略。

搭建前端页面

首先,我们需要搭建前端页面,使用 Vue.js 框架实现。在命令行中执行以下命令:

vue init webpack vue-test
cd vue-test
npm install

然后,安装并添加 vue-route 和 axios 依赖,在 src/main.js 文件中添加以下代码:

import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import VueRouter from 'vue-router'
import App from './App.vue'
import Add from './components/Add.vue'
import List from './components/List.vue'
import Edit from './components/Edit.vue'

Vue.use(VueRouter)
Vue.use(VueAxios, axios)

Vue.config.productionTip = false

const routes = [
  { path: '/', redirect: '/list' },
  { path: '/list', component: List },
  { path: '/add', component: Add },
  { path: '/edit/:id', component: Edit }
]

const router = new VueRouter({
  routes
})

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

src/components 目录下新建 Add.vueList.vueEdit.vue 三个文件,分别实现添加数据、展示数据和修改数据功能。

配置后端服务器

然后,我们需要搭建一个后端服务器,使用 Express.js 框架实现。在命令行中执行以下命令:

mkdir backend
cd backend
npm init
npm install express mongoose body-parser cors --save

backend 文件夹下新建 server.js,添加以下代码:

const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
const mongoose = require('mongoose')
const app = express()
const port = process.env.PORT || 3000

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(cors())

mongoose.connect('mongodb://localhost:27017/vue-test')

const db = mongoose.connection
db.on('error', console.error.bind(console, 'connection error:'))
db.once('open', function() {
  console.log('database open successful.')
})

const TodoSchema = mongoose.Schema({
  name: String,
  date: Date,
  content: String
})

const TodoModel = mongoose.model('Todo', TodoSchema)

app.get('/todo', (req, res) => {
  TodoModel.find((err, data) => {
    if (err) console.log(err)
    res.send(data)
  })
})

app.post('/todo', (req, res) => {
  let newTodo = new TodoModel(req.body)
  newTodo.save((err, data) => {
    if (err) console.log(err)
    res.send(data)
  })
})

app.put('/todo/:id', (req, res) => {
  TodoModel.findByIdAndUpdate(req.params.id, req.body, (err, data) => {
    if (err) console.log(err)
    res.send(data)
  })
})

app.delete('/todo/:id', (req, res) => {
  TodoModel.findByIdAndDelete(req.params.id, (err, data) => {
    if (err) console.log(err)
    res.send(data)
  })
})

app.listen(port, () => {
  console.log(`server is running at http://localhost:${port}/`)
})

这是一个简单的 Express.js 服务器,通过 Mongoose 操作 MongoDB 数据库。

整合前后端

最后,我们需要把前端和后端整合起来。在 vue-test 目录下执行以下命令:

npm install webpack-node-externals copy-webpack-plugin html-webpack-plugin webpack-merge nodemon --save-dev

vue-test 目录下新建 webpack.config.js,添加以下代码:

const path = require('path')
const nodeExternals = require('webpack-node-externals')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { merge } = require('webpack-merge')
const isProd = process.env.NODE_ENV === 'production'

let webpackConfig = {
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name].js'
  },
  mode: isProd ? 'production' : 'development',
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: 'img/[name].[hash:7].[ext]'
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: 'fonts/[name].[hash:7].[ext]'
        }
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      inject: true
    }),
    new CopyWebpackPlugin({
      patterns: [
        {
          from: path.resolve(__dirname, './static'),
          to: path.resolve(__dirname, './dist/static'),
          globOptions: {
            ignore: ['.*']
          }
        }
      ]
    })
  ]
}

let serverConfig = {
  target: 'node',
  entry: './backend/server.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: 'server.js'
  },
  devtool: 'source-map',
  externals: [nodeExternals()],
  module: {
    rules: [
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      }]
  }
}

module.exports = [merge(webpackConfig, {
  entry: './src/main.js',
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ]
      }
    ]
  }
}), serverConfig]

这是一个简单的 webpack 配置,用于打包前端页面和后端服务器代码。在 vue-test 目录下新建 .babelrc 文件,添加以下代码:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}

此外,我们还需要在 package.json 文件中添加以下代码:

"scripts": {
  "dev": "nodemon dist/server.js",
  "build": "webpack -p"
}

这些代码的作用是启动服务器和打包项目。

完成以上步骤后,我们就可以通过以下命令运行项目:

npm run build
npm run dev

然后在浏览器中访问 http://localhost:3000,就可以看到我们实现的增删改查功能了。

示例说明

示例一:添加数据

Add.vue 文件中,我们可以看到以下代码:

<template>
  <div class="add-container">
    <h2>Add Todo</h2>
    <form>
      <input type="text" v-model="name" placeholder="Name">
      <input type="text" v-model="content" placeholder="Content">
      <button type="submit" @click.prevent="addTodo">Submit</button>
    </form>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        name: '',
        content: ''
      }
    },
    methods: {
      addTodo () {
        let date = new Date()
        let todo = {
          name: this.name,
          content: this.content,
          date: date
        }
        this.axios.post('/todo', todo).then(res => {
          console.log(res.data)
          this.$router.replace('/list')
        })
      }
    }
  }
</script>

这段代码实现了向数据库中添加一条数据的功能。它通过 axios 发送一个 post 请求,把用户输入的数据提交到后端服务器的 /todo 路由,然后由后端把数据存入数据库。最后,页面跳转到展示数据的页面 /list

示例二:修改数据

Edit.vue 文件中,我们可以看到以下代码:

<template>
  <div class="edit-container">
    <h2>Edit Todo</h2>
    <form>
      <input type="text" v-model="todo.name" placeholder="Name">
      <input type="text" v-model="todo.content" placeholder="Content">
      <button type="submit" @click.prevent="updateTodo">Submit</button>
    </form>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        todo: {}
      }
    },
    created () {
      this.getTodo()
    },
    methods: {
      getTodo () {
        let id = this.$route.params.id
        this.axios.get(`/todo/${id}`).then(res => {
          console.log(res.data)
          this.todo = res.data
        })
      },
      updateTodo () {
        let id = this.$route.params.id
        this.axios.put(`/todo/${id}`, this.todo).then(res => {
          console.log(res.data)
          this.$router.replace('/list')
        })
      }
    }
  }
</script>

这段代码实现了修改数据库中一条数据的功能。它通过 axios 发送一个 put 请求,把用户修改的数据提交到后端服务器的 /todo/:id 路由,然后由后端把数据更新到数据库中。最后,页面跳转到展示数据的页面 /list

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:webpack4+express+mongodb+vue实现增删改查的示例 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • [Redis] redis数据备份恢复与持久化

    数据库备份,使用save命令,将会在redis的安装目录中生成dump.rdb 例如:在我的目录下 redis/src/dump.rdb   使用命令config get dir,获取当前redis的安装目录 例如: 127.0.0.1:6379> config get dir 1) “dir” 2) “/tsh/redis-3.0.0/src”   …

    Redis 2023年4月11日
    00
  • Springboot整合MongoDB的Docker开发教程全解

    下面为大家详细讲解”Springboot整合MongoDB的Docker开发教程全解”。 简介 Docker是目前非常流行的容器化技术,它简化了应用程序的部署、管理和维护。Springboot是一个非常流行的Java框架,它提供了丰富的功能,使得开发变得更加高效。本教程主要介绍Springboot整合MongoDB的Docker开发教程,将演示如何使用Doc…

    database 2023年5月22日
    00
  • MySQL线上死锁分析实战

    MySQL线上死锁分析是一个非常重要的工作,对于数据库管理员和开发者来说都具有重要的意义,下面是一个完整的攻略: 1. 收集信息 在进行死锁分析之前,我们需要收集一些信息来确定死锁的原因,包括: 发生死锁的时间 相关的SQL语句 数据库服务的版本 数据库表结构 不同的连接类型 2. 查看日志文件 在MySQL中,我们可以通过查看日志文件来获取死锁的相关信息。…

    database 2023年5月22日
    00
  • redis 七种内部数据结构

    最近因为有空,开始补之前一直没能仔细看的 redis 内部数据结构 这一部分,参考了 张铁蕾 的系列文章,并有一些自己的总结提炼。 每一篇我都用 xmind 做笔记,最后导出图片,因此下面每一篇笔记都是一张图片的形式。 为什么选择 xmind 做思维导图笔记?做开发有几年了,学的东西越来越多,要记的东西也越来越多,再按以前的方法做笔记的话,没有规律的笔记比较…

    Redis 2023年4月13日
    00
  • MongoDB和redis

    一 简介 MongoDB是一款强大、灵活、且易于扩展的通用型数据库1、易用性 MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有“行“(row)的概念取而代之的是更为灵活的“文档”(document)模型。通过在…

    Redis 2023年4月13日
    00
  • IntelliJ IDEA本地代码覆盖后恢复原来的代码图解

    下面我就来详细讲解“IntelliJ IDEA本地代码覆盖后恢复原来的代码”攻略,包含以下内容: 准备工作 操作步骤 示例说明 1. 准备工作 在进行本地代码覆盖后恢复原来的代码前,需要进行以下准备工作: 在 IntelliJ IDEA 中打开需要覆盖和恢复的项目。 在项目的 settings.gradle 中添加以下代码: groovy include ‘…

    database 2023年5月18日
    00
  • 新手必须知的Node.js 4个JavaScript基本概念

    我来为您讲解“新手必须知的Node.js 4个JavaScript基本概念”的攻略。 1. JavaScript中变量声明及数据类型 在JavaScript中,声明变量需要用到var关键字,变量名可以包含字母、数字、下划线等,但不能以数字开头。例如: var name = "Tom"; var age = 20; 在JavaScript中…

    database 2023年5月21日
    00
  • 详细介绍Linux IO

    详细介绍Linux IO Linux内核IO子系统负责管理计算机系统与外部设备之间的交互(输入输出操作)。接下来,我们将详细介绍Linux IO的相关知识。 IO模型 在Linux中,IO模型可以分为5种具体类型:- 阻塞IO- 非阻塞IO- IO复用- 信号驱动IO- 异步IO 阻塞IO(Blocking IO) 阻塞IO是一种最简单的IO模型。应用程序在…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部