一.话不多,先看效果:
?大家好呀,?????,秉着分享快乐的原则,我来啦~ ?很久以前我写过一篇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写后端接口逻辑代码:
(注释很详细,着重看注释)
const express = require('express')
const app = express()
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended:false }))
const multer = require('multer')
const upload = multer({ dest: 'uploads/' })
app.use(express.static('uploads'))
const port = 8848
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);
next();
});
app.use(express.json());
app.post('/comic/add',upload.single('icon'),(req,response)=>{
const {file,body} = req
if( file == undefined){
response.send({code:400,msg:'新增失败,参数缺失'})
}else{
knex('comic').insert({icon:file.filename}).then(res=>{
response.send({code:200,msg:'新增成功'})
})
}
})
app.get('/comic/all',(req,response)=>{
knex('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">
<div class="upload">
<input type="file" id="file" @change="add($event)" />
</div>
<div class="container">
<div v-for="(item, index) in imgs" :key="index">
<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);
var param = new FormData();
param.append("icon", file);
console.log(param.get("file"));
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) => {
this.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总结笔记 …等等 进我主页看更多~
|