Просмотр исходного кода

feat(bx-mobile): add Web bx menuCode catalog and permission helpers

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu 2 месяцев назад
Родитель
Сommit
2840c7d1c0
2 измененных файлов с 164 добавлено и 0 удалено
  1. 144 0
      bx-mobile/src/constants/bxMenuCatalog.ts
  2. 20 0
      bx-mobile/src/utils/bxPermission.ts

+ 144 - 0
bx-mobile/src/constants/bxMenuCatalog.ts

@@ -0,0 +1,144 @@
+export type BxMenuPhase = 1 | 2 | 3
+
+export type BxMenuEntry = {
+  menuCode: string
+  title: string
+  path: string
+  phase: BxMenuPhase
+  group: string
+  icon: string
+  color: string
+}
+
+/** 仅叶子业务入口;用户/角色/菜单管理不收录 */
+export const BX_MENU_CATALOG: BxMenuEntry[] = [
+  {
+    menuCode: 'bx:advanceApply:list',
+    title: '备用金申请',
+    path: '/advance/list',
+    phase: 1,
+    group: '备用金',
+    icon: 'gold-coin-o',
+    color: '#10b981',
+  },
+  {
+    menuCode: 'bx:advanceApprove:list',
+    title: '备用金审批',
+    path: '/advance/approve',
+    phase: 1,
+    group: '备用金',
+    icon: 'passed',
+    color: '#059669',
+  },
+  {
+    menuCode: 'bx:advanceIssue:list',
+    title: '备用金发放',
+    path: '/advance/issue',
+    phase: 1,
+    group: '备用金',
+    icon: 'balance-o',
+    color: '#0d9488',
+  },
+  {
+    menuCode: 'bx:reimburseApply:list',
+    title: '报销申请',
+    path: '/reimburse/list',
+    phase: 1,
+    group: '报销',
+    icon: 'bill-o',
+    color: '#2563eb',
+  },
+  {
+    menuCode: 'bx:reimburseApprove:list',
+    title: '报销审批',
+    path: '/reimburse/approve',
+    phase: 1,
+    group: '报销',
+    icon: 'checked',
+    color: '#1d4ed8',
+  },
+  {
+    menuCode: 'bx:payment:list',
+    title: '支付发放冲抵',
+    path: '/payment',
+    phase: 1,
+    group: '报销',
+    icon: 'paid',
+    color: '#7c3aed',
+  },
+  {
+    menuCode: 'bx:viewMine:list',
+    title: '我的申请单',
+    path: '/mine',
+    phase: 1,
+    group: '视图',
+    icon: 'user-o',
+    color: '#64748b',
+  },
+  {
+    menuCode: 'bx:viewTodo:list',
+    title: '待我审批',
+    path: '/approval',
+    phase: 1,
+    group: '视图',
+    icon: 'todo-list-o',
+    color: '#d97706',
+  },
+  {
+    menuCode: 'bx:viewAll:list',
+    title: '全部申请单',
+    path: '/all',
+    phase: 1,
+    group: '视图',
+    icon: 'orders-o',
+    color: '#475569',
+  },
+  {
+    menuCode: 'bx:invoiceWallet:mine',
+    title: '我的发票夹',
+    path: '/invoice/mine',
+    phase: 2,
+    group: '发票夹',
+    icon: 'photo-o',
+    color: '#0891b2',
+  },
+  {
+    menuCode: 'bx:invoiceWallet:admin',
+    title: '发票夹管理',
+    path: '/invoice/admin',
+    phase: 2,
+    group: '发票夹',
+    icon: 'cluster-o',
+    color: '#0e7490',
+  },
+  {
+    menuCode: 'bx:expenseItem:list',
+    title: '费用项目',
+    path: '/admin/expenses',
+    phase: 3,
+    group: '配置',
+    icon: 'cluster-o',
+    color: '#9333ea',
+  },
+  {
+    menuCode: 'bx:workflowAdvance:list',
+    title: '工作流(备用金)',
+    path: '/admin/wf-advance',
+    phase: 3,
+    group: '配置',
+    icon: 'setting-o',
+    color: '#7e22ce',
+  },
+  {
+    menuCode: 'bx:workflowReimburse:list',
+    title: '工作流(报销)',
+    path: '/admin/wf-reimburse',
+    phase: 3,
+    group: '配置',
+    icon: 'setting-o',
+    color: '#6b21a8',
+  },
+]
+
+/** 当前已开放阶段:发版时改为 1 → 2 → 3 */
+export const BX_MENU_CURRENT_PHASE: BxMenuPhase = 1

+ 20 - 0
bx-mobile/src/utils/bxPermission.ts

@@ -0,0 +1,20 @@
+import { BX_MENU_CATALOG, BX_MENU_CURRENT_PHASE, type BxMenuEntry } from '@/constants/bxMenuCatalog'
+
+export function canAccess(
+  menuCode: string,
+  opts: { isSuperAdmin: boolean; all: boolean; menuCodes: string[] },
+): boolean {
+  if (opts.isSuperAdmin || opts.all) return true
+  return opts.menuCodes.includes(menuCode)
+}
+
+export function filterVisibleEntries(
+  opts: { isSuperAdmin: boolean; all: boolean; menuCodes: string[] },
+  phase: number = BX_MENU_CURRENT_PHASE,
+): BxMenuEntry[] {
+  return BX_MENU_CATALOG.filter((e) => e.phase <= phase && canAccess(e.menuCode, opts))
+}
+
+export function entryByPath(path: string): BxMenuEntry | undefined {
+  return BX_MENU_CATALOG.find((e) => e.path === path)
+}