29 lines
1.2 KiB
Vue
29 lines
1.2 KiB
Vue
<script setup lang="ts">
|
||
import { computed } from 'vue'
|
||
import { ShieldX } from '@lucide/vue'
|
||
import { useRoute, useRouter } from 'vue-router'
|
||
import { sanitizeInternalPath } from '@/core/routing/accessDecision'
|
||
import { useAccessPreviewStore } from '@/core/access/accessPreview'
|
||
|
||
const route = useRoute()
|
||
const router = useRouter()
|
||
const access = useAccessPreviewStore()
|
||
const sourcePath = computed(() => sanitizeInternalPath(route.query.from))
|
||
|
||
async function returnToAccessiblePage() {
|
||
if (access.firstAccessiblePath) await router.replace(access.firstAccessiblePath)
|
||
}
|
||
</script>
|
||
|
||
<template>
|
||
<section class="forbidden-page" aria-labelledby="forbidden-title">
|
||
<div class="forbidden-icon" aria-hidden="true"><ShieldX :size="32" /></div>
|
||
<p class="section-kicker">403 · 权限不足</p>
|
||
<h2 id="forbidden-title">当前登录账号无法访问此页面</h2>
|
||
<p>请联系平台管理员核对账号角色和权限配置。</p>
|
||
<p class="forbidden-source">来源页面:{{ sourcePath }}</p>
|
||
<el-button v-if="access.firstAccessiblePath" type="primary" @click="returnToAccessiblePage">返回可访问页面</el-button>
|
||
<p v-else>当前账号暂无可访问的业务菜单。</p>
|
||
</section>
|
||
</template>
|