建立一个前端工具文件,里面来处理请求和数据发送
我这里文件 apj.js
let base = ''; //定义前缀 方便信息更改
export const postKeyValueRequest = (url, params) => {
return axios({
method: 'post', //登陆必须为post
url: `${base}${url}`, 登陆请求接口
data: params, 传递的参数
transformRequest: [(data) => { //利用transformRequest 方法处理json
let ret = '';
//data里面的格式: 这种格式spring security 会出错
//我们需要传换成 username='user'&password='123'
// {
// username:'user'
// password:'123'
// }
for (let i in data) {
ret += encodeURIComponent(i) + '=' + encodeURIComponent(data[i]) + '&'
}
console.log(ret);// username='user'&password='123'
return ret; //ok返回即可
}],
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
}
当然这里还可以写方法,例如,我们经常需调用请求,可以定义一个 getRequest() 方法
export const getRequest = (url, params) => {
return axios({
method: 'get',
url: `${base}${url}`,
data: params
})
};
怎么使用呢?
我们需要在main.js里面导入如下两行代码
import {postKeyValueRequest} from "./utils/api";
import {getRequest} from "./utils/api";
Vue.prototype.getRequest = getRequest;
Vue.prototype.postKeyValueRequest = postKeyValueRequest;
然后在login.vue组件中的methods 钩子函数中添加如下方法
submitForm(){
this.$refs.loginForm.validate((valid) => {
if (valid) {
this.postKeyValueRequest('/doLogin',this.loginForm).then(resp=>{ //这里的resp 里面返回就是api.js 里面处理过的
//这里直接判断 resp 是否为空 如果为空不用处理 api里面已经处理过了,只需要处理成功的即可
if(resp){
window.sessionStorage.setItem("user",JSON.stringify(resp.obj));
this.$router.replace('/home');//replace 方法替换当前页 为home,不可以返回,push方法则可以返回到登录页
}
})
} else {
this.$message({
message: '请填写必要信息!',
type: 'warning'
});
return false;
}
});
本例中使用到了 element-ui框架
1,首先来看下后端的json格式:
{
"id": 2,
"url": "/",
"path": "/home",
"component": "Home",
"name": "员工资料",
"icon": "fa fa-user-circle-o",
"meta": {
"isalive": null,
"islogin": true
},
"children": [
{
"id": 7,
"url": null,
"path": "/basic",
"component": "EmpBasic",
"name": "基本资料",
"iconcls": null,
"meta": {
"keepalive": null,
"requireauth": true
},
"children": null,
"parentid": 2,
"enabled": true
},
{
"id": 8,
"url": null,
"path": "/adv",
"component": "EmpAdv",
"name": "高级资料",
"iconcls": null,
"meta": {
"keepalive": null,
"requireauth": true
},
"children": null,
"parentid": 2,
"enabled": true
}
],
"parentid": 1,
"enabled": true
},
很明显,这段json 数据和vue-router 里面的路由格式一致,但是有一个地方不一样 “component”: “xxx” component 在vue-router里面 它的值是一个引用 而不是字符串也就是说,“xxx” 应该是 xxx ,
那怎么处理呢?
创建一个menu.js工具类 文件
export const formatRoutes=(routes)=>{ //routes :后端返回的菜单json数据
let fmRoutes = [];
routes.forEach(router=>{
let {
path,
component,
name,
meta,
iconCls,
children
} = router;
if (children && children instanceof Array){//判断children里面是否有值
children = formatRoutes(children)
}
let fmRouter = {
path:path,
name:name,
iconCls:iconCls,
meta:meta,
children:children,
component(resolve){
require(['../views' + component + '.vue'],resolve);
}
};
fmRoutes.push(fmRouter)
});
return fmRoutes;
}
ok,到此就完成了调用该方法即可.
项目学习