根据用户角色显示侧边栏菜单元素,使用 "yaminncco/vue-sidebar-menu" 包
Display sidebar menu elements based on user's role, with "yaminncco/vue-sidebar-menu" package
您好,我正在使用 Laravel Breeze with Inertia JS。我正在使用 “yaminncco / vue-sidebar-menu 包” 作为侧边栏。
我在问是否有一种方法可以根据用户角色显示菜单元素(管理员:查看所有内容,简单用户不能,....)。包文档中没有关于此的内容。
因此,如果有人有想法或可以建议在使用 Laravel Breeze 时构建侧边栏的更好方法(或包)?
谢谢
如果这是您想在所有页面中执行的操作,您可以通过 HandleInertiarRequests
中间件 share
方法共享 属性。
public function share(Request $request)
{
return array_merge(parent::share($request), [
'user_role' => Auth::user()->role
]);
}
现在,您的所有页面都将在 Vue 页面组件的 $pages.props.user_role
处收到此道具。然后你可以这样做:
<template>
<sidebar-menu v-if="user_role === 'admin'" :menu="menu" />
</template>
<script>
export default {
props: {
user_role: String
}
}
</script>
如果您在不是页面组件的 Vue 组件上使用侧边栏组件,例如,在布局组件中,您将从 $page.props
:
<template>
<sidebar-menu v-if="user_role === 'admin'" :menu="menu" />
</template>
<script>
export default {
computed: {
user_role () {
return this.$page.props.user_role
}
}
}
</script>
如果您想 select 菜单应根据 user_role
呈现哪些菜单项,您可以计算 menu
属性:
export default {
data () {
return {
menuItems: [
{
href: '/',
title: 'Dashboard',
icon: 'fa fa-user'
},
{
href: '/charts',
title: 'Charts',
icon: 'fa fa-chart-area',
admin: true
}
]
}
},
computed: {
menu () {
if (this.user_role === 'admin') {
return this.menuItems // return all the items
}
return this.menuItems.filter((item) => {
return !item.admin // return only items NOT marked as admin
})
}
}
}
您可以根据您的用户角色(或根据用户组)隐藏菜单项。确保通过调用函数获取菜单实例,因为每次都必须更新隐藏属性。
示例:
function getMenu() {
return [
{
header: 'Main Navigation'
},
{
href: '/',
title: 'Dashboard',
hidden: !checkPermission(DashboardPage.groups),
}
{
href: '/configuration',
title: 'Configuration',
hidden: !checkPermission(ConfigurationPage.groups),
}
]
}
const menuComputed = computed(() => {
if(loggedIn.value) {
return getMenu();
}
else {
return menuLoginOnly.value;
}
});
...
<sidebar-menu
class="sidebar"
:menu="menuComputed"/>
您好,我正在使用 Laravel Breeze with Inertia JS。我正在使用 “yaminncco / vue-sidebar-menu 包” 作为侧边栏。
我在问是否有一种方法可以根据用户角色显示菜单元素(管理员:查看所有内容,简单用户不能,....)。包文档中没有关于此的内容。
因此,如果有人有想法或可以建议在使用 Laravel Breeze 时构建侧边栏的更好方法(或包)?
谢谢
如果这是您想在所有页面中执行的操作,您可以通过 HandleInertiarRequests
中间件 share
方法共享 属性。
public function share(Request $request)
{
return array_merge(parent::share($request), [
'user_role' => Auth::user()->role
]);
}
现在,您的所有页面都将在 Vue 页面组件的 $pages.props.user_role
处收到此道具。然后你可以这样做:
<template>
<sidebar-menu v-if="user_role === 'admin'" :menu="menu" />
</template>
<script>
export default {
props: {
user_role: String
}
}
</script>
如果您在不是页面组件的 Vue 组件上使用侧边栏组件,例如,在布局组件中,您将从 $page.props
:
<template>
<sidebar-menu v-if="user_role === 'admin'" :menu="menu" />
</template>
<script>
export default {
computed: {
user_role () {
return this.$page.props.user_role
}
}
}
</script>
如果您想 select 菜单应根据 user_role
呈现哪些菜单项,您可以计算 menu
属性:
export default {
data () {
return {
menuItems: [
{
href: '/',
title: 'Dashboard',
icon: 'fa fa-user'
},
{
href: '/charts',
title: 'Charts',
icon: 'fa fa-chart-area',
admin: true
}
]
}
},
computed: {
menu () {
if (this.user_role === 'admin') {
return this.menuItems // return all the items
}
return this.menuItems.filter((item) => {
return !item.admin // return only items NOT marked as admin
})
}
}
}
您可以根据您的用户角色(或根据用户组)隐藏菜单项。确保通过调用函数获取菜单实例,因为每次都必须更新隐藏属性。 示例:
function getMenu() {
return [
{
header: 'Main Navigation'
},
{
href: '/',
title: 'Dashboard',
hidden: !checkPermission(DashboardPage.groups),
}
{
href: '/configuration',
title: 'Configuration',
hidden: !checkPermission(ConfigurationPage.groups),
}
]
}
const menuComputed = computed(() => {
if(loggedIn.value) {
return getMenu();
}
else {
return menuLoginOnly.value;
}
});
...
<sidebar-menu
class="sidebar"
:menu="menuComputed"/>