vue create vue_cms
cnpm i vue-router axios -S
module.exports = {
devServer:{
host: 'localhost',
port: 5000
}
}
cnpm run server
proxyTable: {
"/api": {
target: "http://tingapi.ting.baidu.com/v1/restserver/ting",
changeOrigin: true,
pathRewrite: {
'^/api': '/api'
}
}
cnpm init -y
cnpm i express body-parser -S
虽然我们不用跨域,但这里我设置了跨域;该文件是入口文件;路由还有全局的配置都可以在这里配置
// 创建express服务器
const express = require('express')
const app = express()
// 注册解析 表单数据的 body-parser
const bodyParser = require('body-parser')
// 将请求响应设置content-type设置为application/json
const router = require('./router.js')
app.use('/api/*', function (req, res, next) {
// 设置请求头为允许跨域
res.header("Access-Control-Allow-Origin", "*");
// 设置服务器支持的所有头信息字段
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
// 设置服务器支持的所有跨域请求的方法
res.header("Access-Control-Allow-Methods", "POST,GET");
// next()方法表示进入下一个路由
next();
});
// post
app.use(bodyParser.urlencoded({extended:false}))
// 处理json格式的参数
app.use(bodyParser.json())
// 配置路由
app.use(router)
// 服务器已经启动
app.listen('4000',function(){
console.log('running...')
})
路由文件只出路路由规则,这里使用post传递过来的用户名和密码
const express = require('express')
const router = express.Router()
const services = require('./services.js')
// router.get('/',services.start)
// 登录功能
router.post('/api/login',services.login)
// 注册功能
router.post('/api/register',services.register)
module.exports = router
let mysql = require('mysql')
exports.base = (sql,data,callback)=>{
let connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'user'
})
connection.connect();
connection.query(sql,data, function (error, results, fields) {
if (error) throw error;
callback && callback(results)
})
connection.end();
}
处理客户端传递过来的数据,现在暂时不做处理
const db = require('./db.js')
exports.start = (req,res)=>{
}
// 登录注册处理
exports.login = (req,res)=>{
console.log(req.body)
res.send('测试')
}
exports.register = (req,res)=>{
console.log(req.body)
res.send('测试')
}
启动服务器nodemon app.js
,测试一下有没有bug
在src文件夹新建一个router.js用来处理路由
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
import Login from './components/Login.vue'
import Register from './components/Register.vue'
const router = new VueRouter({
routes:[
{path:'/login',component:Login},
{path:'/register',component:Register},
]
})
export default router
在main.js挂载到我们的路由,并引入axios
import Vue from 'vue'
import App from './App.vue'
import router from './router.js'
import Axios from 'axios'
Vue.prototype.HOST = 'http://localhost:4000'
Vue.prototype.$axios = Axios
Vue.config.productionTip = false
new Vue({
render: h => h(App),
router
}).$mount('#app')
App.vue文件
<template>
<div id="app">
<h1></h1>
<router-link to="/login">登录</router-link>
<router-link to="/register">注册</router-link>
<router-view></router-view>
</div>
</template>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
再业务逻辑后台的services.js这一块处理我们的登录按钮
res.json()
返回数据exports.login = (req,res)=>{
let username = req.body.username
let pwd = req.body.password
// 查询语句
let sql = 'select * from user where username = ?'
db.base(sql,username,(result)=>{
if(!result.length){
return res.json({ status: 1, msg: '登录失败' })
}else{
// [ RowDataPacket { password: '123', username: 'admin', id: 1 } ]
if(result[0].password==pwd){
return res.json({ status: 1, msg: '登录成功' })
}
return res.json({ status: 1, msg: '密码错误' })
}
})
}
<template>
<form>
<label for="username">用户名:</label>
<input type="text" v-model="username" id="username">
<br>
<label for="pwd">密码:</label>
<input type="text" v-model="pwd" id="pwd">
<br>
<button @click.prevent="login">登录</button>
<div>{{msg}}</div>
</form>
</template>
<script>
export default {
data(){
return {
username:'',
pwd:'',
msg:''//接收数据
}
},
methods:{
login(){
this.$axios.post(this.HOST+'/api/login',{username:this.username,password:this.pwd})
.then(result=>{
console.log(result.data)
this.msg = result.data.msg
})
.catch(err=>{
console.log(err)
})
}
}
}
</script>
<template>
<form>
<label for="username">用户名:</label>
<input type="text" v-model="username" id="username">
<br>
<label for="pwd">密码:</label>
<input type="text" v-model="pwd" id="pwd">
<br>
<label for="again">密码:</label>
<input type="text" v-model="again" id="again" @blur="verify">
<br>
<button @click.prevent="register">注册</button>
<div>{{msg}}</div>
</form>
</template>
<script>
export default {
data(){
return {
username:'',
pwd:'',
again:'',
msg:''//接收数据
}
},
methods:{
verify(){
if(this.pwd!==this.again){
this.msg = '两次密码不一致'
return;
}
},
register(){
this.verify()
this.$axios.post(this.HOST+'/api/register',{username:this.username,password:this.pwd})
.then(result=>{
this.msg = result.data.msg
})
.catch(err=>{
})
}
}
}
</script>
affectedRows
是否为1,是的话,表示插入成功exports.register = (req,res)=>{
let username = req.body.username
let password = req.body.password
// 查询语句
let sql = 'select * from user where username = ?'
// 插入语句
let insert = 'insert into user set ?'
db.base(sql,username,(result)=>{
console.log(result.length)
if(result.length!==0){
return res.json({ status: 1, msg: '该用户名已经存在' })
}else{
db.base(insert,{username,password},(result)=>{
console.log(result)
if(result.affectedRows==1){
return res.json({ status: 1, msg: '注册成功' })
}
return res.json({ status: 1, msg: '注册失败' })
})
}
})
}
前后端分离并不只是开发模式,而是web应用的一种架构模式。在开发阶段,前后端工程师约定好数据交互接口,实现并行开发和测试;在运行阶段前后端分离模式需要对web应用进行分离部署,前后端之前使用HTTP或者其他协议进行交互请求。然而作为一种架构模式,我们在实施的过程中主要对以下四个方面来进行比较和重新认识。
概括来说,可以为优质产品打造精益团队;提升开发效率;完美应对复杂多变的前端需求;增强代码可维护性
前后端分离的优缺点
Web 研发模式演变