VUE VANT H5项目总结
app.js中的watch监听:刚打开时监视路由变化是否带TOKEN
watch: { //监听路由变化 '$route': function (to, from) { let token = window.localStorage.getItem(utils.tokenKey); if (to.matched.some(record => record.meta.requiresauth) && (!token || token === null)) { next({ path: '/login', query: { redirect: to.fullpath } }) } else { // next() }
router/index.js中的路由守卫 每个路径是否带权限
// 导航守卫 // 使用 router.beforeEach 注册一个全局前置守卫,判断用户是否登陆 router.beforeEach((to, from, next) => { //如果去往登录页则放行 if (to.path === '/') { next(); } else { // 从本地存储里获取token let token = localStorage.getItem(utils.tokenKey); // 判断token是否为空如果为空则跳转到登录页 如果有则放行 if (token === null || token === '') { next({ path: '/' }); } else { next(); } } });
request与response拦截器:请求时带上请求头,尤其是后端结合jwtbearer时。后端响应与对一些反馈码做处理
// request拦截器 service.interceptors.request.use(function (config) { let data = utils.parse(config.data); if (data.SystemUserId === 'null') { delete data.SystemUserId; } else { let userInfo = utils.parse(window.localStorage.getItem(utils.userInfoKey) || '{}'); data.SystemUserId = userInfo.SystemUserId; config.data = JSON.stringify(data); config.headers['Content-Type'] = 'application/json;charset=UTF-8'; } // debugge //判断token是否存在 if (localStorage.getItem(utils.tokenKey)) { // 在请求头中添加token config.headers['Authorization'] = 'Bearer ' + localStorage.getItem(utils.tokenKey); } return config; }, function (error) { console.log('utils/fetch.js:reject' + error); return Promise.reject(error); }); // respone拦截器 service.interceptors.response.use(function (response) { var res = response.data; if (response.status === 200) { // if (response.request.responseURL) { // if (response.request.responseURL.indexOf('err.aspx') > 0) return response; // } if (res.code == SUCCESS_CODE) { // return Promise.resolve(res) } // if (res.code === 101) { // // debugger // return Promise.reject(res); // } // else if (res.code ===101) { // vant.Toast(res.message || '操作失败!101'); // } // return res; } if (response.status === 204) { return response.headers; } else { return Promise.reject(res); } }, function (e) { if (e.response) { var res = e.response; if (res.status === 401) { //Vue.$toast(res); vant.Toast(res); window.localStorage.removeItem(token_key); //授权失败重启应用 if (window.plus) { plus.runtime.restart(); } router.push({ path: '/login' }); return Promise.reject(e); } var data = res.data; if (data && data.error && data.error.message) { if (res.statusText === "Forbidden") { // Vue.$toast('没有足够的权限:您没有访问这些记录的权限。请联系 Microsoft Dynamics 365 管理员!'); } else { //Vue.$toast(JSON.stringify(data.error.message)); vant.Toast(JSON.stringify(data.error.message)); } } else { //Vue.$toast(JSON.stringify(data||e.response)); vant.Toast(JSON.stringify(data || e.response)); } return Promise.reject(data); } else { if (e && e.toString().indexOf('timeout')) { //超时异常 var locale = localStorage.getItem('locale') || 'zh'; if (locale == 'zh') { Vue.$messagebox.alert('网络异常,请联系管理员'); } else { Vue.$messagebox.alert('Network exception, please contact administrator'); } } else { Vue.$messagebox.alert(JSON.stringify(e), ''); } return Promise.reject(e); } });
此外涉及vuex做状态,变量的存储,尤其是TOKEN.
vue-router做些配置