feat(ui): 菜单权限过滤与退回记录页
侧边栏支持按权限隐藏菜单(Sidebar/index.vue): - 新增 canSee():读取 meta.permissions(数组,满足任一即可) - ★ 同时修了一个既有缺陷:原实现只过滤顶层路由,**子路由的权限判定不生效**, 未授权用户仍能在菜单里看到入口。现改为递归过滤,父菜单的子项被过滤光后 父菜单本身也不再显示。 - ★ 刻意只认 meta.permissions(新键),历史遗留的 meta.permission(单数, 如「维修管理」的 inbound_repair)保持不生效——一旦开始消费它,会让若干 菜单对部分角色突然消失,属于超出本次范围的静默行为变更。两者若要统一, 建议单独排期逐个核对影响面。 路由守卫(router/index.ts): - 新增 meta.permissions 校验,未授权时提示并跳首页。侧边栏负责「菜单看不见」, 守卫负责「直接敲 URL 也进不去」,后端负责「绕过前端直接调接口也不行」, 三层任一失效都不至于越权。 - 顺带修了原守卫的分支结构:roles 通过时直接 next(),会跳过后续检查; 改为不通过才中断,落到末尾统一 next()。 新增「退回记录」页(views/outbound/returns/index.vue): - 纯只读台账,无任何操作按钮,供库管核对历史退回 - 展示 退回时间 / 原出库单号 / 物料名称 / 规格 / SKU / 退回数量 / 退回类型 / 退回原因 / 操作人 - 退回类型用标签区分(不良品=红,良品=绿) - 源库存行或原单被删除时显示占位文案而非空白,台账不留哑行 api/inbound/return.ts 补 getReturnList()。
This commit is contained in:
@ -46,18 +46,44 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { useUserStore } from '@/stores/user'
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const userStore = useUserStore()
|
||||
|
||||
// 1. 获取当前激活的菜单路径
|
||||
const activeMenu = computed(() => {
|
||||
return route.path
|
||||
})
|
||||
|
||||
// 2. 获取需要在菜单中显示的路由(过滤掉 hidden 的路由)
|
||||
// 2. ★ 单个路由是否对当前用户可见
|
||||
//
|
||||
// 只认 meta.permissions(数组,满足任一即可)。历史遗留的
|
||||
// meta.permission(单数)**刻意保持不生效** —— 一旦开始消费它,
|
||||
// 「维修管理」等菜单会对部分角色突然消失,属于超出本次范围的静默行为变更。
|
||||
// 若要统一,需单独排期并逐个核对其余 meta.permission 的影响面。
|
||||
const canSee = (meta: any) => {
|
||||
if (!meta) return true
|
||||
if (meta.hidden) return false
|
||||
|
||||
const need = meta.permissions
|
||||
if (!Array.isArray(need) || need.length === 0) return true
|
||||
return need.some((code: string) => userStore.hasPermission(code))
|
||||
}
|
||||
|
||||
// 3. 获取需要在菜单中显示的路由
|
||||
// ★ 必须**递归过滤子路由**:原实现只过滤顶层,子路由的 meta.permissions
|
||||
// 不起作用,未授权用户仍能在菜单里看到入口。父菜单的子项被过滤光后,
|
||||
// 父菜单本身也不再显示。
|
||||
const menuRoutes = computed(() => {
|
||||
return router.options.routes.filter((r: any) => !r.meta?.hidden)
|
||||
return router.options.routes
|
||||
.filter((r: any) => canSee(r.meta))
|
||||
.map((r: any) => {
|
||||
if (!r.children) return r
|
||||
return { ...r, children: r.children.filter((c: any) => canSee(c.meta)) }
|
||||
})
|
||||
.filter((r: any) => !r.children || r.children.length > 0)
|
||||
})
|
||||
|
||||
// 3. 辅助函数:获取 meta 信息
|
||||
|
||||
Reference in New Issue
Block a user