vue+node+mysql+nginx+express完成云服务器前后端分离初建
本内容部分均为搭建地基,(建筑地基),文章出入可能有点大,只做参考
vue部分
此处我用的vue3.0创建的前端项目
- vue3.0安装
npm install -g @vue/cli
//or
yarn add global @vue/cli
2.创建项目
vue create programName
//or
vue ui //此命令执行后,会在浏览器中打开一个图形化界面,图形化操作创建,依赖,插件,显示等功能,很方便
3.项目创建成功后
- 在项目根目录下创建vue.config.js文件(这个文件是vue的配置文件,添加此文件的目的在于,在开发环境下,能够解决访问问题,比如你的前端vue项目运行在
localhost:8080
,而你的node后端项目运行在local host:4000
,你就需要通过以下方法来解决此问题,但是仅仅只是下面还不够),并在该文件里添加:
module.exports = {
devServer:{
proxy: {
'/api': {
target: 'http://localhost:4000',
changeOrigin: true,
pathRewrite: {
'^/api': '/'
}
}
}
}
}
- 在src目录里创建一个api文件夹,创建一个index.js和ajax.js文件
ajax.js
使用axios封装的功能函数,npm i -D axios
import axios from 'axios'
export default function ajax(url,data={},method='GET') {
if(method==="GET"){
let paramStr = '';
Object.keys(data).forEach((key)=>{
paramStr+=key+'='+data[key]+'&'
});
if(paramStr){
//去除后面多余的 '&'
paramStr.substring(0,paramStr.length-1);
url+='?'+paramStr;
}
return axios.get('/api'+url)//此处的`/api`就与前面的代理取得联系了
}
return axios.post('/api'+url,data);
}
index.js
此文件里可以写一些你要发请求调用接口的函数
import ajax from './ajax'
export const reqUser = () =>ajax('/userinfo');
....
- 在组件中测试该请求函数,你可以用一个button点击事件触发,也可以在mounted钩子函数里触发等等,由你决定,但是要用之前先引入
import {reqUser} from './api'
,当然后端还没写,这里测试了也没用 - 此时你可以启动你的前端部分 npm run serve
node+express部分
我相信现在大多数前端开发都是用的webstorm工具的,我也不例外,所以我就用这个工具创建一个node后端开发模板
就这么简单创建完成,成功后的目录结构是这个样子的
node差不多就这样,但是后面的数据库操作都得在这个工程里面完成
数据库mySql部分
- 在你所创建的node工程根目录下创建一个操作数据库的文件夹
sqlName
,文件夹里的sqlName.js
填入
sqlName.js
先下载 npm i -D mysql
const mySql = require('mysql');
let connection = mySql.createConnection({
host:'你的云服务器公网ip',
user:'root',
password:'password',
database:'要操作的数据库名'
});
connection.connect((err)=>{
if(err){
console.log(err,"连接错误",err.stack);
return;
}
console.log('连接成功!',connection.threadId);
});
module.exports = connection;//把此数据库连接对象暴露出去,在接口操作数据库是要使用到
此处的以下部分是关于MySQL数据库的增删改查,你可以通过node执行该文件测试观察每个操作返回的结果有什么不同,只做练习
//const connection = require('./mySql');
//查询
// module.exports = getUser = () => {
// connection.query('select * from userinfo where username = "xly"',(err,result,fields)=>{
// if(err){
// console.log('err',err);
// return;
// }
// console.log(result);
// });
//
// }
// getUser();
//添加
// connection.query('insert into userinfo (username,password)value(?,?)',['hh','111'],(err,result)=>{
// if(err){
// console.log('err',err);
// return;
// }
// console.log(result);
// });
//删除
// connection.query('delete from userinfo where username = "hh"',(err,result)=>{
// if(err){
// console.log('err',err);
// return;
// }
// console.log(result);
// });
//更新
// connection.query('update userinfo set password = "321" where username ="xly"',(err,result)=>{
// if(err){
// console.log('err',err);
// return;
// }
// console.log(result);
// });
// console.log('mySqlObj',connection);
2.写一个接口在routes目录里的index.js文件里写入
var express = require('express');
var router = express.Router();
const connection = require('../mySql_test/mySql');
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
+ router.get('/userinfo', (req,res)=>{
//此处的‘/userinfo’要与前端对应api文件夹下index.js里的请求函数里的路径相同,就只写了一个写其他的也没有啊
+ connection.query('select * from userinfo where username = "xly"',(err,result,fields)=>{
+ if(err){
+ res.send({code:1,msg:'没有'});
+ console.log('err',err);
+ return;
+ }
+ res.send({code:0,data:result});
+ console.log(result);
+ });
+});
module.exports = router;
在运行之前,你可以先下载一个nodemon工具来实现后端数据更改时的热更新
npm i -D nodemon
下载完成后更改一下package.json文件
此时你就可以通过npm start 命令将后端启动起来
如果显示这个,说明两个事,一是你的nodemon起作用了,二是你的后端项目启动成功了
云服务器操作你的数据库
我是通过xshell软件连接我的云服务器的,你们随意
1.安装MySQL数据库
yum install mariadb-server mariadb
2.启动数据库
systemctl start mariadb
3.登录数据库
mysql -u root -p //-u 指定root用户登录 -p需密码验证
4.设置数据库密码
set password for ‘root’@‘localhost’ =password(‘你的密码’);
5.把在所有数据库的所有表的所有权限赋值给位于所有IP地址的root用户。
grant all privileges on . to root@’%'identified by ‘password’; //此处的密码最好与你上面一步相同,方便
6.配置编码
vim /etc/my.cnf
在后面加上
default-character-set =utf8
到此,数据库可以实现远程连接
用个简单的软件navicat,可以连接你的云服务器直接操作你云服务器里的数据库
我用的腾讯云的服务器操作就是这样的,你可能会注意到选的是MariaDB而node代码里用的是mysql依赖,不用担心,就这样操作
当然最终目的只为唤出此界面
连接名随你取,主机是你的云服务器公网ip,端口不管,用户名是root,因为后面的操作使用root要方便些,密码是你设置的在后面再说填啥!!
连接成功后就是这样的
默认会有前四个数据库,第五个是我自己创建的,但是要与你node工程下sqlName文件夹下sqlName.js里的配置database名相同,
你可以在这个软件里随意创建你的表格
测试
以下测试环境是在开发环境下的
- 前端测试我是这样做的
其他都没动,只在app.vue文件里添加了一个button触发请求
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
+ <button @click="getUserInfo">获取用户</button>
</div>
</template>
<script>
+ import {reqUser} from './api'
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'app',
components: {
HelloWorld
},
+ methods:{
+ getUserInfo(){
+ reqUser().then(res=>{
+ window.console.log(res)//有点意思,非要添加window,可能是vue3.0的特性吧,不是很确定,你们也去验证吧
+ }).catch(err=>window.console.log(err))
+ }
+ }
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
nginx部分
在此之前将你的后端项目部署到云服务其上,有两种方式将你的代码传输到云服务其上,
第一种:在你的云服务器root目录下创建一个文件夹存放你的代码,通过该指令
cd 你本地代码的根目录下
scp ./* root@你的ip地址:/root/你云服务器的目录 //注意你的代码里有node_moduls文件也会传上去,你知道的会很慢的,所以先删除了在传,在云服务器上npm i 再下载依赖
第二种:以为是我推荐的,webstorm是个好东西
名字你随意↓
欧克 , 你就可以从你右边的代码目录直接拖到右边你的云服务目录里,实在不要太爽
别忘了在云服务器上下载依赖,然后运行起来
接下来开始nginx
- 在你的云服务器上下载nginx
yum install -y nginx
- 配置你的nginx
vim /etc/nginx/nginx.conf
在server对象里添加红框部分
设置完后 启动nginx
systemctl start nginx.service
停止
systemctl stop nginx.service
重启
systemctl restart nginx.service
这个location地方怎么理解呢,举个例子:你前段请求的地址是:你的公网IP/api/userinfo
,nginx配置这个后,nginx获取到这个地址会自动匹配/api/即以前的部分,就是:你的公网IP/api/
,转化为localhost:4000
即127.0.0.1:4000
,就是你的公网IP/api/userinfo
->127.0.0.1:4000/userinfo
,解决了路径访问的简便问题
打开你的postman测试一下:
关于跨域:在app.js文件里设置如下
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
//这段仅仅为了方便返回json而已
res.header("Content-Type", "application/json;charset=utf-8");
if(req.method == 'OPTIONS') {
//让options请求快速返回
res.sendStatus(200);
} else {
next();
}
});
欧克 你的后端就在云端部署完成