地址栏http://localhost:8088/#/填写密码登录后自动跳转到http://localhost:8088/#/home/msg/workerpush

一\ 得先跳转到login页面

  { path: '/',
component: Login,
name: 'Login' },

二 路由拦截器

本项目没有使用路由拦截器

路由拦截器是:

router.js中
{
path:'/manage',
name:'manage',
component:manage,
meta:{requireAuth:true}
},

..

new Vue({
el: '#app',
data(){
return{
requireAuthNum:1
}
},
router:router,
store,
components: { App },
template: '<App/>',
created () {
router.beforeEach((to, from, next) => {
var _this = this;
// if (to.matched.some(record => record.meta.requireAuth)){ // 判断该路由是否需要登录权限
if(to.meta.requireAuth && _this.requireAuthNum==1){ if(JSON.parse(localStorage.getItem("login"))==null){
console.log('没有登录')
_this.$router.push({path: '/',query: {redirect: to.fullPath}})
next()
} else {
_this.requireAuthNum++;
_this.$router.push({path: to.fullPath})
next()
}
}
else {
_this.requireAuthNum = 1;
next();
}
}); }
})

..

localStorage.setItem("login",JSON.stringify(login));

                let redirect = decodeURIComponent(this.$route.query.redirect || '/');

                console.log(redirect);
if(redirect == '/'){
_this.$router.push({path: '/index'});
console.log('login');
}else{
_this.$router.push({path: redirect});
console.log('重定向回去')
}

参考:https://www.cnblogs.com/zhengzemin/p/vueRouter_lanjie.html

路由拦截其实很简单:1)加上meta。2)router.beforeEach函数加上判断即可

三 本项目采取的策略,在home.vue的create方法中进行判断

    created() {
// this.getTitleAndLogo()
let authKey = Lockr.get('authKey')
let sessionId = Lockr.get('sessionId')
if (!authKey || !sessionId) {
_g.toastMsg('warning', '您尚未登录')
setTimeout(() => { //主要是这个1.5秒后跳转
router.replace('/')
}, 1500)
return
}
this.getUsername()
let menus = Lockr.get('menus')
this.menu = this.$route.meta.menu
this.module = this.$route.meta.module
this.topMenu = menus
_(menus).forEach((res) => {
if (res.module == this.module) {
this.menuData = res.child
res.selected = true
} else {
res.selected = false
}
})
},  

五 进入login.vue 项目入口

login.vue 中
<template>
<el-form-item style="width:100%;">
<el-button type="primary" style="width:100%;" v-loading="loading" @click.native.prevent="handleSubmit2('form')">登录</el-button>
</el-form-item>
</template> <script>
methods:{
handleSubmit2(form) {
if (this.loading) return
this.$refs.form.validate((valid) => {
if (valid) {
this.loading = !this.loading
let data = {}
if (this.requireVerify) {
data.user_name = this.form.username
data.password = this.form.password
data.verifyCode = this.form.verifyCode
} else {
data.user_name = this.form.username
data.password = this.form.password
}
if (this.checked) {
data.isRemember = 1
} else {
data.isRemember = 0
}
this.apiPost('admin/login', data).then((res) => { //看这里!!!
if (res.code != 200) {
this.loading = !this.loading
this.handleError(res)
} else {
this.refreshVerify()
if (this.checked) {
Cookies.set('rememberPwd', true, { expires: 1 })
}
this.resetCommonData(res.data)
_g.toastMsg('success', '登录成功')
}
})
} else {
return false
}
})
}, }

 

this.resetCommonData(res.data)
    resetCommonData(data) {
_(data.menusList).forEach((res, key) => {
if (key == 0) {
res.selected = true
} else {
res.selected = false
}
})
Lockr.set('menus', data.menusList) // 菜单数据
Lockr.set('authKey', data.authKey) // 权限认证
Lockr.set('rememberKey', data.rememberKey) // 记住密码的加密字符串
Lockr.set('authList', data.authList) // 权限节点列表
Lockr.set('userInfo', data.userInfo) // 用户信息
Lockr.set('sessionId', data.sessionId) // 用户sessionid
window.axios.defaults.headers.authKey = Lockr.get('authKey')
let routerUrl = ''
if (data.menusList[0].url) {
routerUrl = data.menusList[0].url
} else {
routerUrl = data.menusList[0].child[0].child[0].url+"?t="+Date.parse(new Date());//这里是为了测试自己添加的
}
setTimeout(() => {
let path = this.$route.path
if (routerUrl != path) {
router.replace(routerUrl)
} else {
_g.shallowRefresh(this.$route.name)
}
}, 1000)
},  

 六  点击菜单的跳转过程

leftMenu.vue
<script>
export default {
methods: {
routerChange(item) {
// 与当前页面路由相等则刷新页面
if (item.url != this.$route.path) {
//router.push(item.url)
alert("this is at leftMenu.vue:55"+item.url);
router.push({path:item.url,query:{ t:Date.parse(new Date())}})
} else {
alert("this is at leftMenu.vue:55"+item.url);
// router.push({path:item.url,query:{t:Date.parse(new Date())}})
_g.shallowRefresh(this.$route.name) //看着
}
}
}
}
</script>

..

global.js中
const commonFn = {
j2s(obj) {
return JSON.stringify(obj)
},
shallowRefresh(name) {
router.replace({ path: '/refresh', query: { name: name }})
},
...
}

 ..路由routes.js

  {
path: '/home',
component: Home,
children: [
{ path: '/refresh', component: refresh, name: 'refresh' }
]
},

..refresh.vue

<template>
<div></div>
</template>
<script>
export default {
created() {
if (this.$route.query.name) {
router.replace({ name: this.$route.query.name })
} else {
console.log('refresh fail')
}
}
}
</script>

 这里说明:由于用到了el-munu控件,设置了使用了 index=url跳转会导致@onclick的跳转 路由判断时效

<template>
<div>
<el-aside :width="isCollapse?'56px':'210px'">
<el-menu
mode="vertical"
unique-opened
:collapse="isCollapse"
:collapse-transition="false"
:router="true"
:default-active="activePath">
<!-- 一级菜单 -->
<el-submenu :index="item.id + ''" v-for="item in menuData" :key="item.id">
<!-- 一级菜单的模版区域 -->
<template slot="title">
<!-- 图标 -->
<i class="el-icon-chat-round"></i>
<!-- 文本 -->
<span style="color: #ffffff" class="menu_style">{{ item.title }}</span>
</template> <!-- 二级菜单 -->
<el-menu-item :index="subItem.url" v-for="subItem in item.child" :key="subItem.id" @click="routerChange(subItem)">
<template slot="title">
<!-- 图标 -->
<i class="el-icon-chat-round"></i>
<!-- 文本 -->
<span>{{ subItem.title }}</span>
</template>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
</div>
</template>

 ..

 

  methods: {
routerChange(item) {
// 与当前页面路由相等则刷新页面
if (item.url != this.$route.path) { //这里失效了
//router.push(item.url)
alert("this is at leftMenu.vue:55"+item.url);
router.push({path:item.url,query:{ t:Date.parse(new Date())}})
} else {
alert("this is at leftMenu.vue:55"+item.url);
// router.push({path:item.url,query:{t:Date.parse(new Date())}})
_g.shallowRefresh(this.$route.name)
}
}
}

七 遗留问题:为什么以后页面都是/home的子路径,包括/refesh

 

  

 

  

atzhang 

Vue--启动后到加载第一个页面的过程的更多相关文章

  1. 【技术贴】第二篇 :解决使用maven jetty启动后无法加载修改过后的静态资源

    之前写过第一篇:[技术贴]解决使用maven jetty启动后无法加载修改过后的静态资源 一直用着挺舒服的,直到今天,出现了又不能修改静态js,jsp等资源的现象.很是苦闷. 经过调错处理之后,发现是 ...

  2. 如何让windows启动后,自动加载一个DLL

    在以下注册表项中找到下面的位置: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLL ...

  3. 【技术贴】解决使用maven jetty启动后无法加载修改过后的静态资源

    如何使用jetty自动热部署修改后的所有文件,比如js,jpg,class等,哇咔咔 太爽啦比tomcat舒服多了. jetty模式是不能修改js文件的,比如你现在调试前端js,发现在myeclips ...

  4. 解决使用maven jetty启动后无法加载修改过后的静态资源

    jetty模式是不能修改js文件的,比如你现在调试前端js,发现在myeclipse/eclipse的源码里面无法修改文件,点都不让你点,所以,你只能采用一些办法,更改jetty的模式配置. Look ...

  5. Tomcat启动时自动加载一个类

    有时候在开发Web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

  6. 如何在tomcat启动时自动加载一个类

    有时候在开发web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

  7. Tomcat启动时自动加载Servlet

    1.想做一个服务启动时自动启动一不停止的获取订阅功能 2.之前是做一个Jsp页面请求servlet来触发方法 3.现在实现Tomcat启动时自动加载Servlet 1.Tomcat中启动Servlet ...

  8. 如何让openvpn在windows启动时自动加载

    在非常需要vpn的人群中,他们几乎一整天都连接着vpn,但是每次开机都要连接vpn的过程有时候比较繁琐对于新手而言.这篇文章主要是说明如何在windows启动时自动加载openvpn自动连接,该教程适 ...

  9. jquery循环延迟加载,用于在图片加载完成后再加载js

    <html> <head> <script type="text/javascript" src="http://lib.sinaapp.c ...

随机推荐

  1. 【模拟7.27】单(liu_runda学长的神题)

    好像用到一些高中数学知识...... 满分做法: case 0:已知a数组求b数组 因为是树状结构,设当前节点x 儿子to 我们从任意一点出发可求出b[root]来,之后我们可以通过寻找两两相连节点的 ...

  2. (1)Canal入门

    1.前言 在我们系统开发过程中,根据业务场景很多数据库数据并不会直接给用户访问的,需要同步保存到ElasticSearch.Redis等存储应用当中(例如最常见的是搜索页面的ElasticSearch ...

  3. Docker(39)- docker 实战二之安装 Tomcat

    背景 参考了狂神老师的 Docker 教程,非常棒! https://www.bilibili.com/video/BV1og4y1q7M4?p=15 直接运行容器 本地找不到镜像会自动下载 --rm ...

  4. 将Flink计算完毕后的数据Sink到Nebula

    Flink是目前流计算的隐形王者,在国际国内有有庞大的拥趸. Nebula是国产图数据库的后起之秀,在DBEngines中排名也逐年上升. 将两者进行结合,可以产生很多应用场景:比如实时计算服务链路调 ...

  5. Mongo3基础操作

    由于3.X的文档是在3.X当前最新版本前记录,所以这里列出一些常用的操作,比如建立库,删除库,等一些格式,然后在描述开启远程和创建用户的一些区别,以及讲解2.X和3.X配置文件区别. 1. Mongo ...

  6. 二QT中使用QTimer定时器

    QT中的定时器类叫QTimer(5.8以上版本才有),构造函数只需要提供父对象的指针 使用的话,需要调用QTImer的start方法,该方法以毫秒单位,每过指定毫秒时间,该类对象就会发出一个timeo ...

  7. ps 快速去掉不需要的部分

    1.打开图片---使用套索工具将不需要的圈起来----右键填充--直接点击确定就可以了

  8. Channel Allocation 贪心涂色

    Channel Allocation 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> ...

  9. [心得体会]Spring容器的初始化

    1. Spring容器的初始化过程 public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {   ...

  10. Mysql/Oracle/达梦中数据字典表

    在mysql中,数据字典表存放在information_schema库中,,对应的两张表,分别是TABLES,和COLUMNS. 在oracle中有表空间(即用户空间或者库)和模式的概念.模式和表空间 ...