vue+mongodb+nodejs实现表单增删改查
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-projectcd my-rpoject && npm installcnpm 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安装express
、mongoose
、body-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
(链接地址)进行操作,会更加方便。
好了,到这里我们整个功能的复杂部分已经实现。我们回顾下做了哪些准备工作
- 过
vue-cli
初始化项目 - 启动本地mongodb服务
- 将后台接口路由写好
app.js
文件 - 创建我们存放数据的数据模型
heroSchema.js
文件 - 写好增删改查路由接口
hero.js
文件
一鼓作气,接下来就是我们擅长的前端部分了。现在的你可以稍微松口气了。是不是觉得很刺激,很过瘾~
第六步:选择前端开发必要模块
提示:这里可以自由发挥,我下载的模块中有element
、vue-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'))
最后看下整个项目的目录结构
相关文章:

vue+mongodb+nodejs实现表单增删改查
ExpressMongodbVue实现增删改查 效果图 前言 最近一直想学下node,毕竟会node的前端更有市场。但是光看不练,感觉还是少了点什么,就去github上看别人写的项目,收获颇丰,于是准备自己照葫芦画瓢写一个。 作为程序员,一…...

SpringBootWeb案例——Tlias智能学习辅助系统(3)——登录校验
前一节已经实现了部门管理、员工管理的基本功能。但并没有登录,就直接访问到了Tlias智能学习辅助系统的后台,这节来实现登录认证。 目录 登录功能登录校验(重点)会话技术会话跟踪方案一 Cookie(客户端会话跟踪技术)会话跟踪方案二…...

hive和spark-sql中 日期和时间相关函数 测试对比
测试版本: hive 2.3.4 spark 3.1.1 hadoop 2.7.7 1、增加月份 add_months(timestamp date, int months)add_months(timestamp date, bigint months)Return type: timestampusage:add_months(now(),1) 2、增加日期 adddate(timestamp startdate, int days)…...

Cell和RefCell
Cell和RefCell CellRefCellRefCell在运行时记录借用结合Rc和RefCell来拥有多个可变数据所有者引用循环与内存泄漏制造引用循环避免引用循环:将Rc变为Weak创建树形数据结构:带子节点的Node增加从子到父的引用可视化strong_count 和 weak_count 的改变 Rus…...
DaoWiki(基于Django)开发笔记 20231113
DaoWiki(基于Django)开发笔记 20231113 开发环境 操作系统 windows11python版本 3.12.0django版本 4.2.7 构建python虚拟环境 python -m venv daowiki启动python虚拟环境 cd daowiki\Scripts .\activate安装Django pip install django4.2.7创建项目…...

照片放大软件 Topaz Gigapixel AI mac中文版简介
Topaz Gigapixel AI mac是一款使用人工智能功能扩展图像的桌面应用程序,同时添加自然细节以获得惊人的效果。使用深度学习技术,A.I.Gigapixel™可以放大图像并填写其他调整大小的产品遗漏的细节,使用A.I.Gigapixel™,您可以裁剪照…...

某手游完整性校验分析
前言 只是普通的单机手游,广告比较多,所以分析处理了下,校验流程蛮有意思的,所以就分享出来了 1.重打包崩溃处理 样本进行了加固,对其dump出dex后重打包出现崩溃 ida分析地址发现为jni函数引起 利用Xposed直接替换…...

【ElasticSearch】学习使用DSL和RestClient编写查询语句
文章目录 DSL和RestClient的学习前言1、DSL查询文档1.1 查询分类1.2 全文检索查询1.21 全文检索概述1.2.2 基本使用 1.3 精确查询1.3.1 term查询1.3.2 range查询 1.4 地理坐标查询1.4.1 geo_bounding_box查询1.4.2 geo_distance查询 1.5 复合查询1.5.1 常见相关性算法1.5.2 算分…...

asp.net外卖网站系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio
一、源码特点 asp.net外卖网站系统 是一套完善的web设计管理系统,系统采用mvc模式(BLLDALENTITY)系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为mysql,使用c#语…...

2.4.0 Milky Way 强势登场!新功能大爆炸,让你High翻全场!
Yo开发达人们,我们有重磅新功能要给你们放送啦! Check it out 数据汇总不再单调,新的聚合函数登场! compact_state_agg #1359gauge_agg #1370first #1395last #1413mode #1440increase #1476delta #1395time_delta #1405rate #14…...

C语言----静态链接库和动态链接库
在前面的文章中讲到可执行程序的生成需要经过预处理,编译,汇编和链接四个步骤,链接阶段是链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。 需要解读一下库文件,我们可以将库文件等价为压缩包文件&…...

PCA(主成分分析)数据降维技术代码详解
引言 随着大数据时代的到来,我们经常会面临处理高维数据的问题。高维数据不仅增加了计算复杂度,还可能引发“维度灾难”。为了解决这一问题,我们需要对数据进行降维处理,即在不损失太多信息的前提下,将数据从高维空间…...

Git版本控制系统之分支与标签(版本)
目录 一、Git分支(Branch) 1.1 分支作用 1.2 四种分支管理策略 1.3 使用案例 1.3.1 指令 1.3.2 结合应用场景使用 二、Git标签(Tag) 2.1 标签作用 2.2 标签规范 2.3 使用案例 2.3.1 指令 2.3.2 使用示例 一、Git分支&…...

JSP运行环境搭建
将安装JSP引擎的计算机称作一个支持JSP的Web服务器。这个服务器负责运行JSP,并将运行结果返回给用户。 JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分之一。一个简单Web应用程序可能只有一个JSP页面,而一个复杂的Web应用程序可能由许多JSP…...
React通过属性 (props) 和状态 (state) 来传递和管理组件的数据
import React, { useState } from react;// 子组件 const ChildComponent (props) > {return (<div><h2>Hello, {props.name}!</h2></div>); }// 父组件 const ParentComponent () > {const [name, setName] useState(John Doe);const handle…...
Web相机和浏览器的二维码扫描方案
Web相机和适用于浏览器的二维码扫描方案 qr-camera 在线体验 | English 功能 支持浏览器扫描二维码支持拍照支持录像功能支持二维码解析和生成 quickstart npm i qr-cameraimport {QRCamera} from qr-camera;function main(){const camera new QRCamera();document.body…...

云端部署ChatGLM-6B
大模型这里更新是挺快的,我参考的视频教程就和我这个稍微有些不一样,这距离教程发布只过去4天而已… 不过基本操作也差不多 AutoDL算力云:https://www.autodl.com/home ChatGLM3:https://github.com/THUDM/ChatGLM3/tree/main Hug…...

设计模式(3)-结构型模式
结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则…...

C/C++调试工具 - gdb详解
C/C调试工具 -gdb详解 1 简介 2 常用的命令 3 使用的条件 4 程序调试 4.1 直接运行程序 4.2 断点调试(在某一行) 4.3 断点调试(在函数入口处打断点) 5 调试core文件 5.1 生成core文件的方法 5.2 调试core文件 1 简介 GDB是Linux下非常好用且强大的调试工具。GD…...

传奇GOM引擎微端连接不上如何解决
Gom传奇引擎的微端连不上的原因可能有很多,比如网络问题、服务器配置问题、版本兼容性问题等。1.检查网络连接:首先要确保你的网络连接稳定。如果遇到网络问题,比如网络延迟过高,可能会导致你无法连接到服务器。建议使用稳定的网络…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...