【全栈初体验】Vue+Node+MySQL实现先后端分离开发

前言

  • 这个 demo 是MVVM开发模式,我也写过一个先后端结合开发的完整系统 demo
  • Vue项目使用vue-cil3建立的。
  • 使用vue-cil2建立的项目也能够实现,只是配置代理服务器的时候有一点差异。后面分别针对这两个版本进行区分。
  • 数据库操做使用Navicat。

数据库配置

  1. 新建MySQL链接(参数能够本身配置,后面会用到)javascript

    在这里插入图片描述

  2. 新建数据库html

    在这里插入图片描述

  3. 新建数据表前端

    在这里插入图片描述

Node服务端

目录结构以下:vue

在这里插入图片描述

  1. 新建文件夹serverjava

  2. 初始化node

    • 在server文件夹下打开命令窗口mysql

    • 输入命令行 npm init -yios

      在这里插入图片描述

  3. utils/DBHelper.js --> 有mysql链接配置,与上面对应git

    // 数据库链接助手
    const mysql = require('mysql');
    
    class DBHelper{
        // 获取数据库链接
        getConn(){
            let conn = mysql.createConnection({
                // 数据库链接配置
                host:'127.0.0.1',
                port:'3306', 
                user:'root',
                password:'',
                database:'test'  // 数据库名
            });
            conn.connect();
            return conn;
        }
    }
    
    module.exports = DBHelper;
  4. sqlMap.js --> SQL语句,供api调用github

    // sql语句
    var sqlMap = {
        user: {
            // 添加用户
            add: 'insert into user(name, age) values (?, ?)',
            // 查询用户
            select: 'select * from user where name like "%"?"%"'
        }
    }
    
    module.exports = sqlMap;
  5. api/userApi.js --> 用户api

    const express = require('express');
    const router = express.Router();
    
    const DBHelper = require('../utils/DBHelper');
    const sql = require('../sqlMap');
    
    // 增长用户
    router.post('/addUser', (req, res) => {
        let sqlStr = sql.user.add;
        let params = req.body;
        let conn = new DBHelper().getConn();
        conn.query(sqlStr, [params.name, params.age], (err, result) => {
            if (err) {
                res.json(err);
            } else {
                res.json(result);
            }
        });
        conn.end();
    });
    
    // 查询用户
    router.post('/selectUser', (req, res) => {
        let sqlStr = sql.user.select;
        let params = req.body;
        let conn = new DBHelper().getConn();
        conn.query(sqlStr, [params.name], (err, result) => {
            if (err) {
                res.json(err);
            } else {
                res.json(result)
            }
        });
        conn.end();
    });
    
    module.exports = router;
  6. index.js --> 服务器入口文件

    // node后端服务器
    const http = require('http');
    const badyParser = require('body-parser');
    const express = require('express');
    const userApi = require('./api/userApi');
    
    let app = express();
    let server = http.createServer(app);
    
    app.use(badyParser.json());
    app.use(badyParser.urlencoded({
        extended: false
    }));
    
    // 后端api路由
    app.use('/api/user', userApi);
    
    // 启动监听
    server.listen(8888, () => {
        console.log(' success!! port:8888')
    })
  7. 使用命令行 npm install -S mysql 安装mysql包,而后使用命令行 node index.js 启动服务。

    在这里插入图片描述

Vue前端文件

  1. 使用命令行 vue create vue-node-demo 建立项目,vue-cil2建立项目 参考这个

  2. 这里不是正式项目,直接在 HelloWorld.vue 进行编辑:

    <template>
      <div class="hello">
        <form action="">
          姓名:<input type="text" name="username" v-model="userName"><br>
          年龄:<input type="text" name="age" v-model="age"><br>
          <button type="button" @click="addUser">提交信息</button>
        </form>
        <form action="">
          <input type="text" v-model="keywords" placeholder="输入姓名查询">
          <button type="button" @click="selectUser">查询</button>
        </form>
      </div>
    </template>
    
    <script> import axios from 'axios' export default { name: 'HelloWorld', props: { msg: String }, data(){ return{ userName:'', age:'', keywords:'' } }, methods:{ addUser(){ // let name = this.userName; let age = this.age; axios.post('/api/user/addUser',{ name,age }).then(res=>{ alert('信息添加成功'); }).catch(err=>{ console.log(err) }) }, selectUser(){ let name = this.keywords; axios.post('api/user/selectUser',{ name }).then(res=>{ let data = res.data[0]; this.userName = data.name; this.age = data.age }).catch(err=>{ console.log(err) }) } } } </script>

设置代理处理跨域

不进行设置会报404的错误。

由于直接访问8888端口访问不到,这里须要设置代理服务器。

vue-cli3建立的项目设置

在根目录新建文件 vue.config.js

module.exports = {
    devServer: {
        proxy: { // 设置代理
            '/api': {
                target: 'http://127.0.0.1:8888', // 请求的目标服务器接口
                changeOrigin: true, // 在本地会建立一个虚拟服务端,而后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
                pathRewrite: { // 重写请求
                    '^/api': '/api' // 替换target中的请求地址,也就是说在请求http://127.0.0.1:8888/XXXXX这个地址的时候直接写成/api便可。
                }
            }
        }
    }
}

vue-cli2建立的项目设置

// 路径:config/index.js
proxyTable: {
    '/api': {
        target: 'http://127.0.0.1:8888',
        changeOrigin: true,
        pathRewrite: {
            '^/api': '/api'
        }
    }
}

演示

来看一下效果(用来演示,没有作样式处理):

  • 命令行输入 npm run serve 运行开发环境,vue-cil2建立的项目输入 npm run dev

  • 填写信息,点击提交按钮,刷新数据库,就能看到数据已经写入到数据库。

    在这里插入图片描述

  • 输入关键字,查询结果成功渲染到上面的表单中。(前提是数据库中有这个数据)

    在这里插入图片描述

最后