接着之前的笔记,参考源码的布局,增加用户下拉部分,其中个人信息后续回补充到具体的表单页面。搜索的组件准备弄成全文检索,暂时放置。现在布局部分还差了TagsView和右侧的抽屉功能。
Eldropdown 用户信息的下拉
用户信息部分直接使用了Dropdown组件,在vue-element-admin源码中有首页、个人中心、项目地址等及退出功能,自己测试先实现首页、个人中心(占位置不实现)、一个外链、退出功能。
主要使用router-link来实现。退出功能在el-dropdown-item中使用 @click.native来监听组件根元素的原生事件。用户的logout方法也比较好理解,即初始化掉对应的store并且删除相关的cookie.用户头像部分需要给用户增加一个属性,存储头像图片的URL。NavBar中增加logout方法,如下:
methods: {
async logout() {
await this.$store.dispatch("user/logout");
this.$router.push(`/user/login?redirect=${this.$route.fullPath}`);
}
}
在store的user模块下增加logout方法,同时需要增加对外访问的API方法及MOCK数据,其中logout方法和API中方法如下:
src>store>modules>user中
logout({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.userInfo.token)
.then(() => {
commit("SET_TOKEN", "");
commit("SET_ROLES", []);
removeToken();
resetRouter();
resolve();
})
.catch(error => {
reject(error);
});
});
},
这里增加了router中的一个resetRouter方法,问题的描述在vue-element-admin的源码中有说明"// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465"
src>api>user.js中
export function logout(token) {
return request({
url: "/api/user/logout",
method: "post",
data: { token: token }
});
}
在Mock数据中,单独配置了一个user.js用来存放测试用户的数据,这里导入的时候需要注意,在node.js环境下无法直接使用ES6的import。user.js如下:
const userInfoMock = {
userObj: {
admin: {
name: "admin",
password: "111111",
token: "AAAAAA",
roles: ["admin"],
avatar:
"https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png"
},
user: {
name: "user",
password: "222222",
token: "BBBBBB",
roles: ["user"],
avatar:
"https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif"
},
guest: {
name: "guest",
password: "333333",
token: "CCCCCC",
roles: ["guest"],
avatar:
"https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif"
}
}
};
module.exports = userInfoMock;
user_logout.js的内容如下,和user_login类似,user_login中还是使用之前的数据方式:
function logout(req) {
const method = req.method;
let { token } = req.body;
let res = null;
const userJsonObj = require("./user").userObj;
switch (method) {
case "POST":
for (let item in userJsonObj) {
if (userJsonObj[item] && userJsonObj[item].token === token) {
res = {
message: userJsonObj[item].name + "退出成功",
userInfo: { token: token }
};
break;
}
}
res = {
message: "未知用户,退出成功",
userInfo: { token: token }
};
break;
default:
res = null;
}
return res;
}
//node.js下运行,按照模块规范注册
module.exports = logout;