vue+mongodb+nodejs实现表单增删改查

news2024/11/18 7:49:28

Express+Mongodb+Vue实现增删改查

效果图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

前言

最近一直想学下node,毕竟会node的前端更有市场。但是光看不练,感觉还是少了点什么,就去github上看别人写的项目,收获颇丰,于是准备自己照葫芦画瓢写一个。

作为程序员,一定要保持不断学习的状态,这样我们才可以在职场中有一席之位。

学习vue,你会知道除了jQuery这种结构驱动(操作dom元素)外,还有更加便捷的数据驱动,妈妈再也不用担心我忘记jQuery中那些可怕的选择器了。学习node,你会知道除了java、c、python这些陌生的后台语言外,js既然也可以写后台,你可以定义自己的接口,不在依赖于那些后台糙汉子。学习mongodb,你会知道数据如何存储在数据库中,已经如何进行增删改插。

开发环境

本地需要安装mongodb、nodejs、vue-cli(脚手架)

第一步:初始化项目

通过vue-cli脚手架,我们可以快速搭建一个项目骨架。

vue init webpack my-project

cd my-rpoject && npm install

cnpm run dev

如果在终端,你看到了下图所示,表示项目已经成功启动。接着在浏览器地址栏中输入localhost://8080,如果你看到了vue的欢迎界面,表示你已经完成了第一步。

在这里插入图片描述

第二步:把本地的mongodb启动起来

前提:下载mongodb,并且已经配置好了环境变量。

如果觉得配置环境变量啥麻烦的话,可以用homebrew进行一键安装。

当上述都ok的情况下,你只要进入到mongodb的安装目录(比如我的mongodb安装在/usr/local/bin/目录下)执行mongo命令,如果你看到下图所示,表示你已经完成了第二步。

在这里插入图片描述

第三步:把后台接口写好

提示:所谓的后台接口,就是通过express建立路由,如果不明白的话可以去看下express介绍express官网

express官网: https://www.expressjs.com.cn/

前提:通过npm安装expressmongoosebody-parser模块

express模块用来创建路由 mongoose模块用来创建数据库,连接数据库 body-parser模块用来对post请求的请求体进行解析

//通过命令行进入项目,执行以下命令安装这三个模块
cnpm install express body-parser mongoose --save

在项目根目录建立个app.js文件,用来启动express服务

//app.js文件

//1.引入express模块
const express = require('express')
//2.创建app对象
const app = express()
//定义简单路由
app.use('/',(req,res) => {
  res.send('Yo!')
})
//定义服务启动端口
app.listen(3000,() => {
    console.log('app listening on port 3000.')
})

上述步骤走完后,在命令行执行node app.js。通过浏览器访问localhost:3000,页面出现res.send()的内容即表示成功。

第四步:创建数据模型

提示:所谓的数据模型,可以理解为你将来创建的表中,要存什么样的数据片段,数据类型是什么。

在项目根目录建立一个models文件夹,用来存储数据模型,每个模型都是由一个Schema生产,具体的我们不用太在意,如果有兴趣可自行百度。

models文件夹中创建一个hero.js文件,内容如下

//hero.js文件

//引入mongoose模块
const mongoose = require('mongoose')

//定义数据模型,可以看到,我们下面创建了一个表,表中的数据有name、age、sex等字段,并且这些字段的数据类型也定义了,最后将model导出即可
const heroSchema = mongoose.Schema({
  name :String,
  age : String,
  sex : String,
  address : String,
  dowhat : String,
  imgArr:[],
  favourite:String,
  explain:String
}, { collection: 'myhero'})
//这里mongoose.Schema最好要写上第二个参数,明确指定到数据库中的哪个表取数据,我这里写了myhreo,目的就是为了以后操作数据要去myhreo表中。
这里不写第二个参数的话,后面你会遇到坑。

//导出model模块
const Hero = module.exports = mongoose.model('hero',heroSchema);

第五步:建立CURD(增删改查)路由接口

在项目根目录创建一个router文件夹,文件夹中创建一个hero.js文件,内容如下,分别为增删改查、添加图片等路由

//引入express模块
const express = require("express");
//定义路由级中间件
const router = express.Router();
//引入数据模型模块
const Hero = require("../models/hero");

// 查询所有英雄信息路由
router.get("/hero", (req, res) => {
  Hero.find({})
    .sort({ update_at: -1 })
    .then(heros => {
      res.json(heros);
    })
    .catch(err => {
      console.log(2);
      res.json(err);
    });
});

// 通过ObjectId查询单个英雄信息路由
router.get("/hero/:id", (req, res) => {
  Hero.findById(req.params.id)
    .then(hero => {
      res.json(hero);
    })
    .catch(err => {
      res.json(err);
    });
});

// 添加一个英雄信息路由
router.post("/hero", (req, res) => {
  //使用Hero model上的create方法储存数据
  Hero.create(req.body, (err, hero) => {
    if (err) {
      res.json(err);
    } else {
      res.json(hero);
    }
  });
});

//更新一条英雄信息数据路由
router.put("/hero/:id", (req, res) => {
  Hero.findOneAndUpdate(
    { _id: req.params.id },
    {
      $set: {
        name: req.body.name,
        age: req.body.age,
        sex: req.body.sex,
        address: req.body.address,
        dowhat: req.body.dowhat,
        favourite: req.body.favourite,
        explain: req.body.explain
      }
    },
    {
      new: true
    }
  )
    .then(hero => res.json(hero))
    .catch(err => res.json(err));
});

// 添加图片路由
router.put("/addpic/:id", (req, res) => {
  Hero.findOneAndUpdate(
    { _id: req.params.id },
    {
      $push: {
        imgArr: req.body.url
      }
    },
    {
      new: true
    }
  )
    .then(hero => res.json(hero))
    .catch(err => res.json(err));
});

//删除一条英雄信息路由
router.delete("/hero/:id", (req, res) => {
  Hero.findOneAndRemove({
    _id: req.params.id
  })
    .then(hero => res.send(`${hero.title}删除成功`))
    .catch(err => res.json(err));
});

module.exports = router;

最后将路由应用到app.js(也就是在app.js文件中引入上述路由定义)

//app.js文件

......
//引入刚才定义的hero路由
const hero = require('./router/hero')
......
app.use('/api',hero)
......

这时你可以通过Postman(模拟http请求数据软件)进行查询测试,如果可以查询到数据,代表后台接口已经成功写好了

注意:在查询之前,你要简单学习下mongodb如何向数据库中对应的表里面任意添加一条数据,否则,你查询出来的数据为空!!!

比如我上面创建了一个myhero表,那我在执行上面查询之前,我会往表中添加一条模拟数据

在这里插入图片描述

//db.myhero.insert意思就是向数据库中表名为myhero的表中添加一条数据
db.myhero.insert({
    "imgArr" : [ 
        "http://ossweb-img.qq.com/images/lol/web201310/skin/big157000.jpg", 
        "http://ossweb-img.qq.com/images/lol/web201310/skin/big157001.jpg", 
        "http://ossweb-img.qq.com/images/lol/web201310/skin/big157002.jpg",    
    ],
    "name" : "亚索",
    "age" : "22",
    "sex" : "man",
    "address" : "德玛西亚",
    "dowhat" : "中单、刺客",
    "favourite" : "死亡如风常伴吾身",
    "explain" : "亚索是一个百折不屈的艾欧尼亚人,也是一名身手敏捷的剑客,能够运用风的力量对抗敌人。年少轻狂的他曾为了荣誉而一再地损失珍贵的东西,他的职位、他的导师、最后是他的亲兄弟。他因无法摆脱的嫌疑而身败名裂,如今已是被人通缉的罪犯。亚索在家园的土地上流浪,寻找对过去的救赎。苍茫间,只有疾风指引着他的利剑。",
    })

这里进行数据库操作,可以在终端中进行,也可以下载可视化工具Robo 3T(链接地址)进行操作,会更加方便。

好了,到这里我们整个功能的复杂部分已经实现。我们回顾下做了哪些准备工作

  1. vue-cli初始化项目
  2. 启动本地mongodb服务
  3. 将后台接口路由写好app.js文件
  4. 创建我们存放数据的数据模型heroSchema.js文件
  5. 写好增删改查路由接口hero.js文件

一鼓作气,接下来就是我们擅长的前端部分了。现在的你可以稍微松口气了。是不是觉得很刺激,很过瘾~

第六步:选择前端开发必要模块

提示:这里可以自由发挥,我下载的模块中有elementvue-resource。建议你跟我使用同样的模块,避免后期不必要麻烦,等你回过头来对整个项目了然于心的时候,就可以随心所欲的选择你要用的技术了,

//element-ui是饿了么为我们前端开发者提供的组件化框架,拿来就可以用。好用到没朋友。vue-resource是用来处理请求的,不过vue2.0后好像出现了个axios,不在维护vue-resource,不过我之前一直用vue-resource的,很方便,现在也可以用。
cnpm install element-ui vue-resource --save

第七步:建立首页和详情页组件

src/components路径下,建立两个页面,分别为List.vue(首页)、Detail.vue(详情页)。

然后在src目录下,建立一个router文件夹,文件夹中创建一个index.js前端路由文件

前端路由文件index.js文件内容如下

//路由页面

import Vue from 'vue'

//引入路由模块,看下终端,如果终端提示vue-router模块没有安装,安装即可
import Router from 'vue-router'

//分别引入List、Detail两个组件
import List from '@/components/List'
import Detail from '@/components/Detail'


Vue.use(Router)

//定义路由,这两个路由会被映射到App.vue的<router-view></router-view>视口中
export default new Router({
  routes: [
    {
      path: '/',
      name: 'List',
      component: List
    },
    {
      path : '/league/:name',
      name : 'Detail',
      component : Detail
    },
  ]
})

第八步:处理跨域情况

因为我们的express服务是在localhost:3000端口启动的,而我们的vue-cli创建的项目是在默认端口8080启动的,所以肯定会涉及到跨域的情况

好在vue-cli为我们提供了解决跨域的配置入口

找到根目录中config目录下面的index.js文件,里面有个配置项proxyTable,改写这个配置项如下即可

在这里插入图片描述

这时,当我们在前端用vue-resource访问 /api 的时候,就会被代理到 http://localhost:3000/api,从而获得需要的数据。说白了,也就是个转换工作。

第九步:搭建页面

到这里,所有准备工作已经完成,我们安心写前端代码即可。布局的话,就不多说了。交互方面主要就是在vue中的methods选项中定义一系列的方法,并且将方法通过**@click=“xxx”**方法绑定到对应的地方。

项目写好后,就是打包了,并且将打包的dist文件夹作为express静态文件服务的目录。

cnpm run build
app.use(express.static('dist'))

最后看下整个项目的目录结构

ce访问 /api的时候,就会被代理到http://localhost:3000/api`,从而获得需要的数据。说白了,也就是个转换工作。

第九步:搭建页面

到这里,所有准备工作已经完成,我们安心写前端代码即可。布局的话,就不多说了。交互方面主要就是在vue中的methods选项中定义一系列的方法,并且将方法通过**@click=“xxx”**方法绑定到对应的地方。

项目写好后,就是打包了,并且将打包的dist文件夹作为express静态文件服务的目录。

cnpm run build
app.use(express.static('dist'))

最后看下整个项目的目录结构

在这里插入图片描述

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

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

相关文章

电容的作用

文章目录 总结1.降压2.滤波3.延时4.耦合5.旁路电容 总结 1.降压 问题&#xff1a; 直接连接灯泡会烧掉 解决方案 进一步为了防止电容放电&#xff0c;伤人&#xff0c;加入一个大电阻 2.滤波 直流的情况 交流的情况 频率与容抗的关系 3.延时 4.耦合 滤除直流成分&#xf…

学习c#的第七天

目录 C# 封装 概念 Public 访问修饰符 Private 访问修饰符 Protected 访问修饰符 Internal 访问修饰符 Protected Internal 访问修饰符 总结 C# 封装 概念 在面向对象程序设计中&#xff0c;封装是一种将数据和方法包含在一个单元中&#xff0c;并控制对这些数据和方…

LeetCode算法心得——高级访客(模拟枚举+小窗口)

大家好&#xff0c;我是晴天学长&#xff0c;今天的周赛第二题&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .高级访客 给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 …

Redis五种数据类型及命令操作(二)

&#x1f388;个人公众号:&#x1f388; :✨✨✨ 可为编程✨ &#x1f35f;&#x1f35f; &#x1f511;个人信条:&#x1f511; 知足知不足 有为有不为 为与不为皆为可为&#x1f335; &#x1f349;本篇简介:&#x1f349; 本篇记录Redis五种数据类型及命令操作&#xff0c;如…

Oracle(2-1) Networking Overview

文章目录 一、基础知识1、Network Environ Challenges 网络环境挑战2、Simple Network :2-Tier 简单的两层网络3、Simple to Complex : N-Tier 简单到复杂&#xff1a;N层网络4、Oracle Network Solutions Oracle网络解决方案5、Key Features of Oracle Net Oracle Net的主要功…

[MySQL] MySQL表的基础操作

文章目录 一、创建表 1、1 SQL语法 1、2 实例演示 二、查询表 三、修改表 3、1 修改表名字 3、2 新增列&#xff08;字段&#xff09; 3、3 修改列类型 3、4 修改列名 3、5 删除表 四、总结 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专…

详解Redis持久化(上篇——RDB持久化)

Redis持久化的作用和意义 Redis 持久化是一种机制&#xff0c;用于将内存中的数据写入磁盘&#xff0c;以保证数据在服务器重启时不会丢失。持久化是为了解决内存数据库&#xff08;如 Redis&#xff09;在服务器关闭后&#xff0c;数据丢失的问题。 Redis 持久化的主要作用和…

如何判断一个角是否大于180度(2)

理论计算见上一篇&#xff1a; 如何判断一个角是否大于180度&#xff1f;_kv1830的博客-CSDN博客 此篇为代码实现 一。直接上代码&#xff1a; import cv2 as cv import numpy as np import mathdef get_vector(p_from, p_to):return p_to[0] - p_from[0], p_to[1] - p_from…

【第六章】软件设计师 之 数据结构与算法基础

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 1、数据结构与算法基础 2、数据 3、稀疏矩阵…

【第三章】软件设计师 之 数据库系统

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 1、数据库系统前言 2、三级模式 - 两级映射…

爬虫项目(12):正则、多线程抓取腾讯动漫,Flask展示数据

文章目录 书籍推荐正则抓取腾讯动漫数据Flask展示数据 书籍推荐 如果你对Python网络爬虫感兴趣&#xff0c;强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧&#xff0c;是每位爬虫开发者的必读之作。详细介绍见&#x1f44…

Netty入门指南之NIO Selector写操作

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言操作演…

transfomer模型——简介,代码实现,重要模块解读,源码,官方

一、什么是transfomer Transformer是一种基于注意力机制&#xff08;attention mechanism&#xff09;的神经网络架构&#xff0c;最初由Vaswani等人在论文《Attention Is All You Need》中提出。它在自然语言处理&#xff08;NLP&#xff09;领域取得了巨大成功&#xff0c;特…

自定义Graph Component:1.1-JiebaTokenizer具体实现

JiebaTokenizer类继承自Tokenizer类&#xff0c;而Tokenizer类又继承自GraphComponent类&#xff0c;GraphComponent类继承自ABC类&#xff08;抽象基类&#xff09;。本文使用《使用ResponseSelector实现校园招聘FAQ机器人》中的例子&#xff0c;主要详解介绍JiebaTokenizer类…

JavaScript_动态表格_添加功能

1、动态表格_添加功能.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: ce…

Python:Unittest框架快速入门:用例、断言、夹具、套件、HTML报告、ddt数据驱动

快速看了套Unittest的入门教程 软件测试全套资料赠送_哔哩哔哩_bilibili软件测试全套资料赠送是快速入门unittest测试框架&#xff01;全实战详细教学&#xff0c;仅此一套&#xff01;的第1集视频&#xff0c;该合集共计11集&#xff0c;视频收藏或关注UP主&#xff0c;及时了…

ElasticSearch学习和使用 (使用head软件可视化es数据)

使用步骤 直接使用 Elasticsearch的安装和使用 下载Elasticsearch6.2.2的zip包&#xff0c;并解压到指定目录&#xff0c;下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-2运行bin目录下的elasticsearch.bat启动Elasticsearch安…

【Python】python读取,显示,保存图像的几种方法

一、PIL&#xff1a;Python Imaging Library&#xff08;pillow&#xff09; PIL读取图片不直接返回numpy对象&#xff0c;可以用numpy提供的函数np.array()进行转换&#xff0c;亦可用Image.fromarray()再从numpy对象转换为原来的Image对象&#xff0c;读取&#xff0c;显示&…

Deepsort项目详解

一、目标追踪整体代码 代码目录如下图所示&#xff1a; 、 追踪相关代码&#xff1a; 检测相关代码和权重 调用 检测 和 追踪的代码&#xff1a; 首先代码分为三个部分&#xff1a; 目标追踪的相关代码和权重目标检测相关代码和权重&#xff0c;这里用的是yolov5.5目标检…

c语言练习11周(6~10)

输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。 题干 输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。输入样例gfedcba输出样例gbcdefa 选择排序 #include<s…