效果图
安装
npm install mockjs --save
cnpm install mockjs --save
yarn add mockjs
新建mock目录
????mock 目录下新建index.js 和json 文件  ????mock 下的index 文件,注意每改接口后都要重启 才能生效
const fs = require('fs')
const path = require('path')
const Mock = require('mockjs')
function getJsonFile (filePath) {
const json = fs.readFileSync(path.resolve(__dirname, filePath), 'utf-8')
return JSON.parse(json)
}
module.exports = function(app) {
app.post('/login', (req, res) => {
const users = getJsonFile('./users.json')
res.json(Mock.mock(users))
})
app.get('/citylist', (req, res) => {
const city = getJsonFile('./city.json')
res.json(Mock.mock(city))
})
}
????mock 下的users.json 文件
{
"status": true,
"message": "登陆成功",
"data": [
{
"id": 1,
"username": "admin",
"password": "123",
"nickname": "半度℃"
},
{
"id": 2,
"username": "tom",
"password": "123",
"nickname": "Tom"
}
]
}
新建api目录
????api 目录下新建index.js 和request.js 文件  ????api 下的index.js 文件
import request from './request';
export default {
login(params) {
return request.post('/login', params, {
action: '登录'
});
},
city(params) {
return request.get('/citylist', {
action: '获取城市列表',
params
});
}
}
????api 下的request.js 文件,这里也是对 axios 的封装
import axios from 'axios';
import Vue from 'vue';
import store from '@/store/index'
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
function filterEmptyKey(params) {
Object.keys(params).forEach(key => {
if (
params[key] === null ||
params[key] === '' ||
params[key] === 'null' ||
params[key] === undefined
) {
delete params[key];
}
});
}
let baseURL = null
if (process.env.NODE_ENV === 'development') {
baseURL = 'http://localhost:8080';
} else if (process.env.NODE_ENV === 'debug') {
baseURL = '';
} else if (process.env.NODE_ENV === 'production') {
baseURL = 'http://bandu.com';
}
const service = axios.create({
baseURL: baseURL,
timeout: 30000,
cancelToken: source.token
});
service.interceptors.request.use(
(config) => {
const token = store.state.token;
token && (config.headers.Authorization = token);
if (config.method === 'post') {
const params = {
...config.data
};
filterEmptyKey(params);
config.headers['Content-Type'] = 'application/json';
config.data = params;
} else if (config.method === 'get') {
config.params = {
_t: Date.parse(new Date()) / 1000,
...config.params
};
filterEmptyKey(config.params);
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
service.interceptors.response.use(
(res) => {
const { data, config } = res
if (!data.status) {
let message = data.message ? data.message : '未知错误'
Vue.prototype.$message({
message: config.action + '失败:' + message,
type: 'error'
});
}
return Promise.resolve(data) || {};
},
(error) => {
return Promise.reject(error);
}
);
export default service;
配置 vue.config.js
????重点是在devServer 里配置before ,注意配置好之后一定要重启
module.exports = {
publicPath: '/',
outputDir: 'dist',
assetsDir: 'assets',
indexPath: 'index.html',
lintOnSave: true,
productionSourceMap: true,
transpileDependencies: [],
devServer: {
port: 8080,
open: false,
overlay: {
warnings: true,
errors: true
},
before: require('./public/mock')
},
configureWebpack: {
devtool: process.env.NODE_ENV === 'development' ? 'eval-source-map' : undefined,
output: {
filename: `js/[name].${new Date().getTime()}.js`,
chunkFilename: `js/[name].${new Date().getTime()}.js`
}
}
}
在组件中使用
<template>
<div class="wrapper">
<el-form :model="ruleForm" ref="ruleForm" :rules="rules" label-width="80px">
<el-form-item prop="username" label="用户名">
<el-input v-model="ruleForm.username"></el-input>
</el-form-item>
<el-form-item prop="password" label="密码">
<el-input v-model="ruleForm.password"></el-input>
</el-form-item>
<el-form-item>
<el-button @click="resetForm('ruleForm')">重置</el-button>
<el-button type="primary" @click="submitForm('ruleForm')">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import loginApi from '@/api/index';
export default {
data () {
return {
ruleForm: {
username: '',
password: ''
},
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: ['blur', 'change'] }
]
}
}
},
methods: {
submitForm (formName) {
const that = this
this.$refs[formName].validate((valid) => {
if (valid) {
loginApi.login().then((res) => {
const result = res.data ? res.data : []
let flag = false
for (var i = 0; i < result.length; i++) {
if (
result[i].username === that.ruleForm.username &&
result[i].password === that.ruleForm.password
) {
flag = true
sessionStorage.userId = result[i].id
sessionStorage.nickname = result[i].nickname
}
}
if (flag) {
that.$router.push('/home/')
}
})
}
})
},
resetForm (formName) {
this.$refs[formName].resetFields()
}
}
}
</script>
<style scoped>
.wrapper {
width: 340px;
border: 1px solid #cccccc;
border-radius: 5px;
padding: 50px;
position: absolute;
top: 200px;
left: 50%;
transform: translateX(-50%);
}
</style>
|