1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 前后端结合实现Vue上传图片并预览效果【Node+Mysql+Vue+Express】

前后端结合实现Vue上传图片并预览效果【Node+Mysql+Vue+Express】

时间:2023-05-21 09:28:56

相关推荐

前后端结合实现Vue上传图片并预览效果【Node+Mysql+Vue+Express】

一.话不多,先看效果:

 大家好呀,⭐⭐⭐⭐⭐,秉着分享快乐的原则,我来啦~

 很久以前我写过一篇vue上传图片并显示的文章—> 鼠标点击这里~ 但是上次只是写了前端的,并没有把图片存储在服务器~所以这次出了2.0版本,哈哈,通过node简单写了接口,实现前后端结合!其实并不难,很适合像我们一样的前端新手学习,下面是详细代码实现!

二.详细实现:

1.在数据库新建一个comic表:

首先利用Navicat连接mysql新建一个数据库(mysql的安装与Navicat的使用为基本操作,不难的,就不演示了,不会的自己查查,嘿嘿)。记住自己的数据库名,账号,密码,端口,表名。comic表新建两个字段 id 与 icon:

2. 建立node项目:

要保证电脑已安装了node和npm。然后在本地随便建一个文件夹,在里面新建一个index.js文件。然后打开cmd命令窗口,在本路径下执行以下两条命令:

建一个配置文件,随便起个名字后一直回车就可以了:

npm init

安装(express框架,knex 、mysql、 multer、 body-parser 插件,等会说是干嘛的):

npm i -s express knex mysql multer body-parser

然后文件夹变成如下(可能还没uploads,不急):

3.在index.js写后端接口逻辑代码:

(注释很详细,着重看注释)

// 先导入express,它是一个node框架,能简化代码const express = require('express')const app = express()// 导入bodyParser插件,它帮助我们获取前端post请求传过来的参数const bodyParser = require('body-parser')app.use(bodyParser.urlencoded({extended:false }))//导入上传文件中间件,能帮助我们实现接收文件的接口const multer = require('multer')//接收到的文件放uploads文件夹const upload = multer({dest: 'uploads/' })//使得让外部通过链接可以访问这个文件夹里文件( 地址 + 端口 / 文件名 )便可访问app.use(express.static('uploads')) //使用接收文件基本接口模板,可到官网查看更详细的/* app.post('/profile', upload.single('avatar'), function (req, res, next) {// req.file is the `avatar` file// req.body will hold the text fields, if there were any}) *///定义服务器端口const port = 8848// 导入knex插件,他能帮助我们连接MySQL数据库const knex = require('knex')({client: 'mysql',//填入数据库的地址、账号、密码、库名connection: {host: 'localhost',user: 'root',password : 'xxx',database : 'work'}})//下面这个能解决跨域问题app.all('*', function(req, res, next) {console.log(req.method);res.header("Access-Control-Allow-Origin", "*");res.header('Access-Control-Allow-Headers', 'Content-type');res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,PATCH");res.header('Access-Control-Max-Age',1728000);//预请求缓存20天next(); });//使得express后端能接收前端发送回来的json格式数据app.use(express.json());//实现新增(上传图片)接口,post请求,参数为 icon !!!app.post('/comic/add',upload.single('icon'),(req,response)=>{// req.file得到前端发送回来的文件信息,req.body的到文件文本信息const {file,body} = req//判断是否发送的是空文件回来if( file == undefined){response.send({code:400,msg:'新增失败,参数缺失'})}else{//利用kenx在数据库完成新增操作,保存文件名字段//相当于 insert into comic (icon)values(file.filename)knex('comic').insert({icon:file.filename}).then(res=>{response.send({code:200,msg:'新增成功'})})}})//实现查询接口,就是要返回图片给前端显示 app.get('/comic/all',(req,response)=>{// 相当于 select * from comicknex('comic').select().then(res=>{if(res.length === 0){response.send({code:200,msg:'暂无数据'})}else{response.send({code:200,msg:'查询成功',data:res})}})})//监听接口app.listen(port,()=> console.log('(*^ ▽ ^*)北极光之夜。 -----> 启动成功!!!'))

控制台运行后端接口:

node index.js

4.新建一个vue项目写前端:

在本地通过脚手架随便建一个vue项目(这基本的就不演示了)。然后安装axios插件。(这基本的就不演示了,在我的其它文章都有)。直接新建一个html文件写也行,通过链接导入vue和axios。代码部分如下:

vue项目的话直接在App.vue文件写,先定义标签:

<div id="app"><!-- 上传文件按钮,绑定change事件 --><div class="upload"><input type="file" id="file" @change="add($event)" /></div><!-- 显示图片的盒子 --><div class="container"><!-- 假如变量imgs为接口返回的图片数组,循环显示 --><div v-for="(item, index) in imgs" :key="index"><!-- 服务端地址 + 数据库里的 icon字段 便可以显示一张图片 --><img :src="'http://localhost:8848/' + item.icon" alt="" /></div></div></div>

css样式:

body {text-align: center;}.container {margin: 30px auto;padding: 30px;width: 60%;box-shadow: 0 0 5px rgb(190, 190, 190);display: flex;flex-wrap: wrap;justify-content: space-around;}.container img {width: 250px;height: 150px;object-fit: cover;margin: 30px;}.upload {margin: 30px auto;width: 80px;height: 20px;background-color: rgba(135, 206, 235, 0.2);border: 1px dashed black;border-radius: 5px;position: relative;}.upload:hover {background-color: rgba(135, 206, 235, 1);}.upload::before {position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: "上传图片";font-size: 13px;text-align: center;font-family: "fangsong";line-height: 20px;user-select: none;}#file {width: 100%;height: 100%;opacity: 0;}

5.前端 js 部分:

注意看注释,解释的很详细:

import HelloWorld from "./components/HelloWorld.vue";import axios from "axios";export default {name: "App",data() {return {imgs: [],};},components: {HelloWorld,},methods: {//上传图片add(e) {//获取到第一个文件var file = e.target.files[0];//可打印看看console.log(e.target.files);//新建一个 FormData 对象var param = new FormData();// 把文件添加到 FormData对象里param.append("icon", file);//可以打印看看console.log(param.get("file"));//利用axios发送post请求axios.post("http://localhost:8848/comic/add", param, {headers: {"Content-Type": "multipart/form-data" },}).then((res) => {//调用查询方法this.qy();});},//查询qy() {axios({url: "http://localhost:8848/comic/all",method: "get",}).then((res) => {//把后端返回数据赋值给imgsthis.imgs = res.data.data;});},},created() {this.qy();},};

代码全部完成,接下里运行项目,便能实现效果了,上传图片并显示:

三.总结:

这样子就完成啦,有不清楚的可以留言,一起探讨,码文不易,有用的话点个关注,一键三连那更秒了,嘿嘿~

我的哔哩哔哩空间

Gitee仓库地址:全部特效css、js源码

Q群聊(欢迎):629596039

其它文章:

~关注我看更多简单创意css、js特效:

文字烟雾效果 html+css+js

环绕倒影加载特效 html+css

气泡浮动背景特效 html+css

简约时钟特效 html+css+js

赛博朋克风格按钮 html+css

仿网易云官网轮播图 html+css+js

水波加载动画 html+css

导航栏滚动渐变效果 html+css+js

书本翻页 html+css

3D立体相册 html+css

霓虹灯绘画板效果 html+css+js

记一些css属性总结(一)

Sass总结笔记

…等等

进我主页看更多~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。