前言
这是一次很简单的尝试,初衷是使用nodejs替换PHP,搭建一个完整的web项目。
项目逻辑
vue开发前端,目前还在dev模式,使用proxy代理和node后端进行通信。
node+express构建后端web服务,连接mysql,进行增删改查。
功能实现
1.前端通过axios,已经实现了get、post,formdata图片上传的功能。
2.后端接收get、post、formdata数据,查询数据库返回数据,保存图片返回图片地址的功能。
3.图片存储在指定的文件夹,通过xampp指定了一个静态目录做图片存储的功能。
下一步的开发
1.目前只实现了对mysql的select操作,下一步需要实现inset、update、delete操作。
2.vue项目目前还是dev模式,需要build项目进入product模式,服务器为xampp。
最后
最后一步,所有项目迁移到外网,暂定为阿里云。
code
Vue端的图片上传代码:upfile.vue
:
change(){ let that = this let file = that.$refs.avatar.files[0]; let URL = window.URL || window.webkitURL; let imageURL = URL.createObjectURL(file); that.avatar = imageURL let fd = new FormData() fd.append('file', file) that.$store.dispatch('upfile', { fd: fd, callback: function(res){ that.avatar = that.$store.state.imageURL + res.data console.log(res) } }) }
Vue端的vuex代码:store.js
:
upfile (context, data) { axios.create().post('/upfile', data.fd, { headers: { 'Content-Type': 'multipart/form-data' } }).then(response => { console.log('success') data.callback(response.data) }).catch(res => { console.log('error') data.callback(res) }) },
Node端的upfile.js
:
var express = require('express');var path = require('path');var fs = require('fs');var formidable = require('formidable');var router = express.Router();/* GET users listing. */router.post('/', function(req, res, next) { var date = new Date(); var time = date.getFullYear() + substr2(date.getMonth()+1) + substr2(date.getDate()); var form = new formidable.IncomingForm(); form.encoding = 'utf-8'; form.uploadDir = path.join(__dirname + "/../../blog/upload/"+time); form.keepExtensions = true;//保留后缀 form.maxFieldsSize = 2 * 1024 * 1024; fs.mkdir(form.uploadDir, { recursive: true }, function(err){ if (err) { return console.error(err); } }); form.parse(req, function (err, fields, files){ var filename = files.file.name; var nameArray = filename.split('.'); var type = nameArray[nameArray.length - 1]; var name = ''; var str1 = '0123456789'; var str2 = 'abcdefghijklmnopqrstuvwxyz'; var str = str1 + str2; for(var i = 0; i < 12; i++){ var rondom = parseInt(Math.random() * str.length); name += str.substr(rondom,1); } var avatarName = name + '.' + type; var newPath = form.uploadDir + "/" + avatarName; fs.renameSync(files.file.path, newPath); res.send({status: 1, msg: 'success', body: fields, data:"/upload/"+time+'/'+avatarName}); })});function substr2(num){ num = num < 10 ? '0' + num : num return num;}module.exports = router;
Node端的数据库配置:/model/db.js
:
var mysql = require('mysql');var db = {}//查询操作,注意使用异步返回查询结果db.select = function(connection, sql, callback){ connection.query(sql, function (error, results, fields) { if (error) throw error; callback(results); });}//关闭数据库db.close = function(connection){ //关闭连接 connection.end(function(err){ if(err){ return; }else{ console.log('关闭连接'); } });}//获取数据库连接db.connection = function(){ //数据库配置 var connection = mysql.createConnection({ host:'localhost', user:'root', password:'', database:'test', port:3306 }); //数据库连接 connection.connect(function(err){ if(err){ console.log(err); return; } }); return connection;}module.exports = db;
Node端的查询逻辑:getuserinfo.js
:
var express = require('express');var router = express.Router();var db = require('../model/db');router.get('/', function(req, res, next) { var connection = db.connection(); var sqlString = 'SELECT * FROM `user` WHERE id = ' + req.query.userid; db.select(connection, sqlString, function(data){ if(data.length){ res.send({status: 1, msg: 'success', data: data[0]}); }else{ res.send({status: 0, msg: '找不到该用户: '+req.query.userid}); } }); db.close(connection);});module.exports = router;
这个后端项目,基本上是从手册、博客上找到的例子,整合到一起,还是花了一些时间才运行起来的。
做个记录,以免后面自己遗忘了,还有参照!