Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
finance-manage
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
finance-oa
finance-manage
Commits
ecc7a8be
Commit
ecc7a8be
authored
Dec 16, 2020
by
RuoYi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化多级菜单之间切换无法缓存的问题
parent
e23ad201
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
55 additions
and
135 deletions
+55
-135
ruoyi-ui/src/layout/components/AppMain.vue
ruoyi-ui/src/layout/components/AppMain.vue
+9
-112
ruoyi-ui/src/layout/components/Sidebar/index.vue
ruoyi-ui/src/layout/components/Sidebar/index.vue
+2
-2
ruoyi-ui/src/layout/components/TagsView/index.vue
ruoyi-ui/src/layout/components/TagsView/index.vue
+0
-5
ruoyi-ui/src/store/getters.js
ruoyi-ui/src/store/getters.js
+2
-1
ruoyi-ui/src/store/modules/permission.js
ruoyi-ui/src/store/modules/permission.js
+42
-9
ruoyi-ui/src/views/system/user/profile/resetPwd.vue
ruoyi-ui/src/views/system/user/profile/resetPwd.vue
+0
-2
ruoyi-ui/src/views/system/user/profile/userInfo.vue
ruoyi-ui/src/views/system/user/profile/userInfo.vue
+0
-2
ruoyi-ui/src/views/tool/gen/editTable.vue
ruoyi-ui/src/views/tool/gen/editTable.vue
+0
-2
No files found.
ruoyi-ui/src/layout/components/AppMain.vue
View file @
ecc7a8be
<!-- @author ruoyi 20201128 支持三级以上菜单缓存 -->
<
template
>
<
template
>
<section
class=
"app-main"
>
<section
class=
"app-main"
>
<transition
name=
"fade-transform"
mode=
"out-in"
>
<transition
name=
"fade-transform"
mode=
"out-in"
>
<keep-alive
:
max=
"20"
:exclude=
"notCacheName
"
>
<keep-alive
:
include=
"cachedViews
"
>
<router-view
:key=
"key"
/>
<router-view
:key=
"key"
/>
</keep-alive>
</keep-alive>
</transition>
</transition>
...
@@ -10,119 +9,17 @@
...
@@ -10,119 +9,17 @@
</
template
>
</
template
>
<
script
>
<
script
>
import
Global
from
"
@/layout/components/global.js
"
;
export
default
{
export
default
{
name
:
'
AppMain
'
,
name
:
'
AppMain
'
,
computed
:
{
computed
:
{
notCacheName
()
{
cachedViews
()
{
var
visitedViews
=
this
.
$store
.
state
.
tagsView
.
visitedViews
;
return
this
.
$store
.
state
.
tagsView
.
cachedViews
var
noCacheViews
=
[];
Object
.
keys
(
visitedViews
).
some
((
index
)
=>
{
if
(
visitedViews
[
index
].
meta
.
noCache
)
{
noCacheViews
.
push
(
visitedViews
[
index
].
name
);
}
});
return
noCacheViews
;
},
},
key
()
{
key
()
{
return
this
.
$route
.
path
;
return
this
.
$route
.
path
},
},
mounted
()
{
// 关闭标签触发
Global
.
$on
(
"
removeCache
"
,
(
name
,
view
)
=>
{
this
.
removeCache
(
name
,
view
);
});
},
methods
:
{
// 获取有keep-alive子节点的Vnode
getVnode
()
{
// 判断子集非空
if
(
this
.
$children
.
length
==
0
)
return
false
;
let
vnode
;
for
(
let
item
of
this
.
$children
)
{
// 如果data中有key则代表找到了keep-alive下面的子集,这个key就是router-view上的key
if
(
item
.
$vnode
.
data
.
key
)
{
vnode
=
item
.
$vnode
;
break
;
}
}
}
}
return
vnode
?
vnode
:
false
;
}
},
// 移除keep-alive缓存
removeCache
(
name
,
view
=
{})
{
let
vnode
=
this
.
getVnode
();
if
(
!
vnode
)
return
false
;
let
componentInstance
=
vnode
.
parent
.
componentInstance
;
// 这个key是用来获取前缀用来后面正则匹配用的
let
keyStart
=
vnode
.
key
.
split
(
"
/
"
)[
0
];
let
thisKey
=
`
${
keyStart
}${
view
.
fullPath
}
`
;
let
regKey
=
`
${
keyStart
}${
view
.
path
}
`
;
this
[
name
]({
componentInstance
,
thisKey
,
regKey
});
},
// 移除其他
closeOthersTags
({
componentInstance
,
thisKey
})
{
Object
.
keys
(
componentInstance
.
cache
).
forEach
((
key
,
index
)
=>
{
if
(
key
!=
thisKey
)
{
// 销毁实例(这里存在多个key指向一个缓存的情况可能前面一个已经清除掉了所有要加判断)
if
(
componentInstance
.
cache
[
key
])
{
componentInstance
.
cache
[
key
].
componentInstance
.
$destroy
();
}
// 删除缓存
delete
componentInstance
.
cache
[
key
];
// 移除key中对应的key
componentInstance
.
keys
.
splice
(
index
,
1
);
}
});
},
// 移除所有缓存
closeAllTags
({
componentInstance
})
{
// 销毁实例
Object
.
keys
(
componentInstance
.
cache
).
forEach
((
key
)
=>
{
if
(
componentInstance
.
cache
[
key
])
{
componentInstance
.
cache
[
key
].
componentInstance
.
$destroy
();
}
});
// 删除缓存
componentInstance
.
cache
=
{};
// 移除key中对应的key
componentInstance
.
keys
=
[];
},
// 移除单个缓存
closeSelectedTag
({
componentInstance
,
regKey
})
{
let
reg
=
new
RegExp
(
`^
${
regKey
}
`
);
Object
.
keys
(
componentInstance
.
cache
).
forEach
((
key
,
i
)
=>
{
if
(
reg
.
test
(
key
))
{
// 销毁实例
if
(
componentInstance
.
cache
[
key
])
{
componentInstance
.
cache
[
key
].
componentInstance
.
$destroy
();
}
// 删除缓存
delete
componentInstance
.
cache
[
key
];
// 移除key中对应的key
componentInstance
.
keys
.
splice
(
i
,
1
);
}
});
},
// 刷新单个缓存
refreshSelectedTag
({
componentInstance
,
thisKey
})
{
Object
.
keys
(
componentInstance
.
cache
).
forEach
((
key
,
index
)
=>
{
if
(
null
!=
thisKey
&&
key
.
replace
(
"
/redirect
"
,
""
)
==
thisKey
)
{
// 1 销毁实例(这里存在多个key指向一个缓存的情况可能前面一个已经清除掉了所有要加判断)
if
(
componentInstance
.
cache
[
key
])
{
componentInstance
.
cache
[
key
].
componentInstance
.
$destroy
();
}
// 2 删除缓存
delete
componentInstance
.
cache
[
key
];
// 3 移除key中对应的key
componentInstance
.
keys
.
splice
(
index
,
1
);
}
});
},
},
};
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
@@ -134,7 +31,7 @@ export default {
...
@@ -134,7 +31,7 @@ export default {
overflow
:
hidden
;
overflow
:
hidden
;
}
}
.fixed-header
+
.app-main
{
.fixed-header
+
.app-main
{
padding-top
:
50px
;
padding-top
:
50px
;
}
}
...
@@ -144,7 +41,7 @@ export default {
...
@@ -144,7 +41,7 @@ export default {
min-height
:
calc
(
100vh
-
84px
);
min-height
:
calc
(
100vh
-
84px
);
}
}
.fixed-header
+
.app-main
{
.fixed-header
+
.app-main
{
padding-top
:
84px
;
padding-top
:
84px
;
}
}
}
}
...
...
ruoyi-ui/src/layout/components/Sidebar/index.vue
View file @
ecc7a8be
...
@@ -13,7 +13,7 @@
...
@@ -13,7 +13,7 @@
mode=
"vertical"
mode=
"vertical"
>
>
<sidebar-item
<sidebar-item
v-for=
"(route, index) in
permission_route
s"
v-for=
"(route, index) in
sidebarRouter
s"
:key=
"route.path + index"
:key=
"route.path + index"
:item=
"route"
:item=
"route"
:base-path=
"route.path"
:base-path=
"route.path"
...
@@ -33,7 +33,7 @@ export default {
...
@@ -33,7 +33,7 @@ export default {
components
:
{
SidebarItem
,
Logo
},
components
:
{
SidebarItem
,
Logo
},
computed
:
{
computed
:
{
...
mapState
([
"
settings
"
]),
...
mapState
([
"
settings
"
]),
...
mapGetters
([
"
permission_route
s
"
,
"
sidebar
"
]),
...
mapGetters
([
"
sidebarRouter
s
"
,
"
sidebar
"
]),
activeMenu
()
{
activeMenu
()
{
const
route
=
this
.
$route
;
const
route
=
this
.
$route
;
const
{
meta
,
path
}
=
route
;
const
{
meta
,
path
}
=
route
;
...
...
ruoyi-ui/src/layout/components/TagsView/index.vue
View file @
ecc7a8be
...
@@ -29,7 +29,6 @@
...
@@ -29,7 +29,6 @@
<
script
>
<
script
>
import
ScrollPane
from
'
./ScrollPane
'
import
ScrollPane
from
'
./ScrollPane
'
import
path
from
'
path
'
import
path
from
'
path
'
import
Global
from
"
@/layout/components/global.js
"
;
export
default
{
export
default
{
components
:
{
ScrollPane
},
components
:
{
ScrollPane
},
...
@@ -145,7 +144,6 @@ export default {
...
@@ -145,7 +144,6 @@ export default {
})
})
})
})
})
})
Global
.
$emit
(
"
removeCache
"
,
"
refreshSelectedTag
"
,
this
.
selectedTag
);
},
},
closeSelectedTag
(
view
)
{
closeSelectedTag
(
view
)
{
this
.
$store
.
dispatch
(
'
tagsView/delView
'
,
view
).
then
(({
visitedViews
})
=>
{
this
.
$store
.
dispatch
(
'
tagsView/delView
'
,
view
).
then
(({
visitedViews
})
=>
{
...
@@ -153,14 +151,12 @@ export default {
...
@@ -153,14 +151,12 @@ export default {
this
.
toLastView
(
visitedViews
,
view
)
this
.
toLastView
(
visitedViews
,
view
)
}
}
})
})
Global
.
$emit
(
"
removeCache
"
,
"
closeSelectedTag
"
,
view
);
},
},
closeOthersTags
()
{
closeOthersTags
()
{
this
.
$router
.
push
(
this
.
selectedTag
)
this
.
$router
.
push
(
this
.
selectedTag
)
this
.
$store
.
dispatch
(
'
tagsView/delOthersViews
'
,
this
.
selectedTag
).
then
(()
=>
{
this
.
$store
.
dispatch
(
'
tagsView/delOthersViews
'
,
this
.
selectedTag
).
then
(()
=>
{
this
.
moveToCurrentTag
()
this
.
moveToCurrentTag
()
})
})
Global
.
$emit
(
"
removeCache
"
,
"
closeOthersTags
"
,
this
.
selectedTag
);
},
},
closeAllTags
(
view
)
{
closeAllTags
(
view
)
{
this
.
$store
.
dispatch
(
'
tagsView/delAllViews
'
).
then
(({
visitedViews
})
=>
{
this
.
$store
.
dispatch
(
'
tagsView/delAllViews
'
).
then
(({
visitedViews
})
=>
{
...
@@ -169,7 +165,6 @@ export default {
...
@@ -169,7 +165,6 @@ export default {
}
}
this
.
toLastView
(
visitedViews
,
view
)
this
.
toLastView
(
visitedViews
,
view
)
})
})
Global
.
$emit
(
"
removeCache
"
,
"
closeAllTags
"
);
},
},
toLastView
(
visitedViews
,
view
)
{
toLastView
(
visitedViews
,
view
)
{
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
]
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
]
...
...
ruoyi-ui/src/store/getters.js
View file @
ecc7a8be
...
@@ -10,6 +10,7 @@ const getters = {
...
@@ -10,6 +10,7 @@ const getters = {
introduction
:
state
=>
state
.
user
.
introduction
,
introduction
:
state
=>
state
.
user
.
introduction
,
roles
:
state
=>
state
.
user
.
roles
,
roles
:
state
=>
state
.
user
.
roles
,
permissions
:
state
=>
state
.
user
.
permissions
,
permissions
:
state
=>
state
.
user
.
permissions
,
permission_routes
:
state
=>
state
.
permission
.
routes
permission_routes
:
state
=>
state
.
permission
.
routes
,
sidebarRouters
:
state
=>
state
.
permission
.
sidebarRouters
,
}
}
export
default
getters
export
default
getters
ruoyi-ui/src/store/modules/permission.js
View file @
ecc7a8be
...
@@ -6,13 +6,17 @@ import ParentView from '@/components/ParentView';
...
@@ -6,13 +6,17 @@ import ParentView from '@/components/ParentView';
const
permission
=
{
const
permission
=
{
state
:
{
state
:
{
routes
:
[],
routes
:
[],
addRoutes
:
[]
addRoutes
:
[],
sidebarRouters
:
[]
},
},
mutations
:
{
mutations
:
{
SET_ROUTES
:
(
state
,
routes
)
=>
{
SET_ROUTES
:
(
state
,
routes
)
=>
{
state
.
addRoutes
=
routes
state
.
addRoutes
=
routes
state
.
routes
=
constantRoutes
.
concat
(
routes
)
state
.
routes
=
constantRoutes
.
concat
(
routes
)
}
},
SET_SIDEBAR_ROUTERS
:
(
state
,
routers
)
=>
{
state
.
sidebarRouters
=
routers
},
},
},
actions
:
{
actions
:
{
// 生成路由
// 生成路由
...
@@ -20,10 +24,14 @@ const permission = {
...
@@ -20,10 +24,14 @@ const permission = {
return
new
Promise
(
resolve
=>
{
return
new
Promise
(
resolve
=>
{
// 向后端请求路由数据
// 向后端请求路由数据
getRouters
().
then
(
res
=>
{
getRouters
().
then
(
res
=>
{
const
accessedRoutes
=
filterAsyncRouter
(
res
.
data
)
const
sdata
=
JSON
.
parse
(
JSON
.
stringify
(
res
.
data
))
accessedRoutes
.
push
({
path
:
'
*
'
,
redirect
:
'
/404
'
,
hidden
:
true
})
const
rdata
=
JSON
.
parse
(
JSON
.
stringify
(
res
.
data
))
commit
(
'
SET_ROUTES
'
,
accessedRoutes
)
const
sidebarRoutes
=
filterAsyncRouter
(
sdata
)
resolve
(
accessedRoutes
)
const
rewriteRoutes
=
filterAsyncRouter
(
rdata
,
true
)
rewriteRoutes
.
push
({
path
:
'
*
'
,
redirect
:
'
/404
'
,
hidden
:
true
})
commit
(
'
SET_ROUTES
'
,
rewriteRoutes
)
commit
(
'
SET_SIDEBAR_ROUTERS
'
,
sidebarRoutes
)
resolve
(
rewriteRoutes
)
})
})
})
})
}
}
...
@@ -31,8 +39,11 @@ const permission = {
...
@@ -31,8 +39,11 @@ const permission = {
}
}
// 遍历后台传来的路由字符串,转换为组件对象
// 遍历后台传来的路由字符串,转换为组件对象
function
filterAsyncRouter
(
asyncRouterMap
)
{
function
filterAsyncRouter
(
asyncRouterMap
,
isRewrite
=
false
)
{
return
asyncRouterMap
.
filter
(
route
=>
{
return
asyncRouterMap
.
filter
(
route
=>
{
if
(
isRewrite
&&
route
.
children
)
{
route
.
children
=
filterChildren
(
route
.
children
)
}
if
(
route
.
component
)
{
if
(
route
.
component
)
{
// Layout ParentView 组件特殊处理
// Layout ParentView 组件特殊处理
if
(
route
.
component
===
'
Layout
'
)
{
if
(
route
.
component
===
'
Layout
'
)
{
...
@@ -44,12 +55,34 @@ function filterAsyncRouter(asyncRouterMap) {
...
@@ -44,12 +55,34 @@ function filterAsyncRouter(asyncRouterMap) {
}
}
}
}
if
(
route
.
children
!=
null
&&
route
.
children
&&
route
.
children
.
length
)
{
if
(
route
.
children
!=
null
&&
route
.
children
&&
route
.
children
.
length
)
{
route
.
children
=
filterAsyncRouter
(
route
.
children
)
route
.
children
=
filterAsyncRouter
(
route
.
children
,
route
,
isRewrite
)
}
}
return
true
return
true
})
})
}
}
function
filterChildren
(
childrenMap
)
{
var
children
=
[]
childrenMap
.
forEach
((
el
,
index
)
=>
{
if
(
el
.
children
&&
el
.
children
.
length
)
{
if
(
el
.
component
===
'
ParentView
'
)
{
el
.
children
.
forEach
(
c
=>
{
c
.
path
=
el
.
path
+
'
/
'
+
c
.
path
if
(
c
.
children
&&
c
.
children
.
length
)
{
children
=
children
.
concat
(
filterChildren
(
c
.
children
,
c
))
return
}
children
.
push
(
c
)
})
childrenMap
.
splice
(
index
,
1
)
return
}
}
children
=
children
.
concat
(
el
)
})
return
children
}
export
const
loadView
=
(
view
)
=>
{
// 路由懒加载
export
const
loadView
=
(
view
)
=>
{
// 路由懒加载
return
(
resolve
)
=>
require
([
`@/views/
${
view
}
`
],
resolve
)
return
(
resolve
)
=>
require
([
`@/views/
${
view
}
`
],
resolve
)
}
}
...
...
ruoyi-ui/src/views/system/user/profile/resetPwd.vue
View file @
ecc7a8be
...
@@ -18,7 +18,6 @@
...
@@ -18,7 +18,6 @@
<
script
>
<
script
>
import
{
updateUserPwd
}
from
"
@/api/system/user
"
;
import
{
updateUserPwd
}
from
"
@/api/system/user
"
;
import
Global
from
"
@/layout/components/global.js
"
;
export
default
{
export
default
{
data
()
{
data
()
{
...
@@ -65,7 +64,6 @@ export default {
...
@@ -65,7 +64,6 @@ export default {
});
});
},
},
close
()
{
close
()
{
Global
.
$emit
(
"
removeCache
"
,
"
closeSelectedTag
"
,
this
.
$route
);
this
.
$store
.
dispatch
(
"
tagsView/delView
"
,
this
.
$route
);
this
.
$store
.
dispatch
(
"
tagsView/delView
"
,
this
.
$route
);
this
.
$router
.
push
({
path
:
"
/index
"
});
this
.
$router
.
push
({
path
:
"
/index
"
});
}
}
...
...
ruoyi-ui/src/views/system/user/profile/userInfo.vue
View file @
ecc7a8be
...
@@ -24,7 +24,6 @@
...
@@ -24,7 +24,6 @@
<
script
>
<
script
>
import
{
updateUserProfile
}
from
"
@/api/system/user
"
;
import
{
updateUserProfile
}
from
"
@/api/system/user
"
;
import
Global
from
"
@/layout/components/global.js
"
;
export
default
{
export
default
{
props
:
{
props
:
{
...
@@ -69,7 +68,6 @@ export default {
...
@@ -69,7 +68,6 @@ export default {
});
});
},
},
close
()
{
close
()
{
Global
.
$emit
(
"
removeCache
"
,
"
closeSelectedTag
"
,
this
.
$route
);
this
.
$store
.
dispatch
(
"
tagsView/delView
"
,
this
.
$route
);
this
.
$store
.
dispatch
(
"
tagsView/delView
"
,
this
.
$route
);
this
.
$router
.
push
({
path
:
"
/index
"
});
this
.
$router
.
push
({
path
:
"
/index
"
});
}
}
...
...
ruoyi-ui/src/views/tool/gen/editTable.vue
View file @
ecc7a8be
...
@@ -127,7 +127,6 @@
...
@@ -127,7 +127,6 @@
import
{
getGenTable
,
updateGenTable
}
from
"
@/api/tool/gen
"
;
import
{
getGenTable
,
updateGenTable
}
from
"
@/api/tool/gen
"
;
import
{
optionselect
as
getDictOptionselect
}
from
"
@/api/system/dict/type
"
;
import
{
optionselect
as
getDictOptionselect
}
from
"
@/api/system/dict/type
"
;
import
{
listMenu
as
getMenuTreeselect
}
from
"
@/api/system/menu
"
;
import
{
listMenu
as
getMenuTreeselect
}
from
"
@/api/system/menu
"
;
import
Global
from
"
@/layout/components/global.js
"
;
import
basicInfoForm
from
"
./basicInfoForm
"
;
import
basicInfoForm
from
"
./basicInfoForm
"
;
import
genInfoForm
from
"
./genInfoForm
"
;
import
genInfoForm
from
"
./genInfoForm
"
;
import
Sortable
from
'
sortablejs
'
import
Sortable
from
'
sortablejs
'
...
@@ -208,7 +207,6 @@ export default {
...
@@ -208,7 +207,6 @@ export default {
},
},
/** 关闭按钮 */
/** 关闭按钮 */
close
()
{
close
()
{
Global
.
$emit
(
"
removeCache
"
,
"
closeSelectedTag
"
,
this
.
$route
);
this
.
$store
.
dispatch
(
"
tagsView/delView
"
,
this
.
$route
);
this
.
$store
.
dispatch
(
"
tagsView/delView
"
,
this
.
$route
);
this
.
$router
.
push
({
path
:
"
/tool/gen
"
,
query
:
{
t
:
Date
.
now
()}})
this
.
$router
.
push
({
path
:
"
/tool/gen
"
,
query
:
{
t
:
Date
.
now
()}})
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment