Files
shanxia2.0/web-admin/src/utils/router/menu-icon.ts
T
2026-06-25 08:06:32 +08:00

154 lines
5.2 KiB
TypeScript

import type { AppRouteRecord } from '@/types/router'
/** 目录型菜单缺省图标 */
export const DEFAULT_SUBMENU_ICON = 'ri:folder-2-line'
/** 叶子菜单缺省图标 */
export const DEFAULT_MENU_ITEM_ICON = 'ri:file-list-2-line'
/**
* 侧栏菜单图标映射(按路由 name;未在 meta 配置 icon 时使用)
* 键与 router/modules 中 name 一致,便于前后端菜单对齐。
*/
export const SIDEBAR_MENU_ICON_MAP: Record<string, string> = {
// ── 报销管理 ──
BxManagement: 'ri:wallet-3-line',
BxExpenseItem: 'ri:price-tag-3-line',
BxWorkflowAdvance: 'ri:git-branch-line',
BxWorkflowReimburse: 'ri:git-merge-line',
BxAdvanceApply: 'ri:money-cny-circle-line',
BxAdvanceApprove: 'ri:check-double-line',
BxAdvanceIssue: 'ri:hand-coin-line',
BxReimburseApply: 'ri:file-edit-line',
BxReimburseApprove: 'ri:checkbox-circle-line',
BxPayment: 'ri:bank-card-line',
BxViewMine: 'ri:user-line',
BxViewTodo: 'ri:time-line',
BxViewAll: 'ri:file-list-3-line',
// ── CRM ──
CrmManagement: 'goods',
CrmProductCategory: 'ri:folder-3-line',
CrmProduct: 'ri:box-3-line',
CrmClue: 'ri:seedling-line',
CrmOpportunity: 'ri:trophy-line',
CrmQuote: 'ri:file-text-line',
CrmContract: 'ri:file-paper-2-line',
CrmCustomer: 'ri:team-line',
CrmCustomerPool: 'ri:global-line',
// ── 地磅 ──
DbManagement: 'ri:scales-3-line',
DbDashboard: 'ri:dashboard-line',
DbPlans: 'ri:calendar-schedule-line',
DbInventory: 'ri:archive-line',
DbWeighing: 'ri:scales-line',
// ── 工作流 ──
Workflow: 'workflow',
WorkflowProcess: 'workflow',
WorkflowPending: 'ri:inbox-line',
WorkflowCompleted: 'ri:checkbox-circle-line',
WorkflowMyApplications: 'ri:file-user-line',
LeaveRequest: 'ri:calendar-event-line',
// ── 系统 ──
SystemManage: 'ri:settings-3-line',
Tenant: 'ri:building-line',
Dict: 'ri:book-2-line',
Menu: 'ri:menu-line',
Dept: 'ri:organization-chart',
Role: 'ri:shield-user-line',
User: 'user',
Post: 'ri:briefcase-line',
// ── 运输 ──
TransportPlan: 'ri:truck-line',
PlCarrier: 'ri:building-2-line',
PlVehicle: 'ri:truck-line',
PlSelfVehicle: 'ri:car-line',
PlPersonnel: 'ri:user-settings-line',
PlPlan: 'ri:route-line',
PlPlanCert: 'ri:shield-check-line',
PlFreight: 'ri:money-cny-box-line',
PlDocumentReminder: 'ri:alarm-warning-line'
}
/** 按 menuCode 补充映射(后端菜单可能仅有 code) */
export const SIDEBAR_MENU_ICON_BY_CODE: Record<string, string> = {
'bx:expenseItem:list': 'ri:price-tag-3-line',
'bx:workflowAdvance:list': 'ri:git-branch-line',
'bx:workflowReimburse:list': 'ri:git-merge-line',
'bx:advanceApply:list': 'ri:money-cny-circle-line',
'bx:advanceApprove:list': 'ri:check-double-line',
'bx:advanceIssue:list': 'ri:hand-coin-line',
'bx:reimburseApply:list': 'ri:file-edit-line',
'bx:reimburseApprove:list': 'ri:checkbox-circle-line',
'bx:payment:list': 'ri:bank-card-line',
'bx:viewMine:list': 'ri:user-line',
'bx:viewTodo:list': 'ri:time-line',
'bx:viewAll:list': 'ri:file-list-3-line',
'crm:productCategory:list': 'ri:folder-3-line',
'crm:product:list': 'ri:box-3-line',
'crm:clue:list': 'ri:seedling-line',
'crm:opportunity:list': 'ri:trophy-line',
'crm:quote:list': 'ri:file-text-line',
'crm:contract:list': 'ri:file-paper-2-line',
'crm:customer:list': 'ri:team-line',
'crm:customerPool:list': 'ri:global-line',
'db:dashboard:list': 'ri:dashboard-line',
'db:plan:list': 'ri:calendar-schedule-line',
'db:inventory:list': 'ri:archive-line',
'db:weighing:list': 'ri:scales-line',
'workflow:process': 'workflow',
'workflow:pending': 'ri:inbox-line',
'workflow:completed': 'ri:checkbox-circle-line',
'workflow:myApplications': 'ri:file-user-line',
'workflow:leave': 'ri:calendar-event-line',
'system:tenant:list': 'ri:building-line',
'system:dict:list': 'ri:book-2-line',
'system:menu:list': 'ri:menu-line',
'system:dept:list': 'ri:organization-chart',
'system:role:list': 'ri:shield-user-line',
'system:user:list': 'user',
'system:post:list': 'ri:briefcase-line',
'pl:carrier:list': 'ri:building-2-line',
'pl:vehicle:list': 'ri:truck-line',
'pl:self-vehicle:list': 'ri:car-line',
'pl:driver:list': 'ri:user-settings-line',
'pl:plan:list': 'ri:route-line',
'pl:plan-archive:list': 'ri:folder-check-line',
'pl:plan-cert:list': 'ri:shield-check-line',
'pl:freight:list': 'ri:money-cny-box-line',
'pl:document:list': 'ri:alarm-warning-line'
}
function lookupMappedIcon(item: AppRouteRecord): string {
const metaIcon = String(item.meta?.icon ?? '').trim()
if (metaIcon) return metaIcon
const name = String(item.name ?? '').trim()
if (name && SIDEBAR_MENU_ICON_MAP[name]) {
return SIDEBAR_MENU_ICON_MAP[name]
}
const menuCode = String((item.meta as { menuCode?: string })?.menuCode ?? '').trim()
if (menuCode && SIDEBAR_MENU_ICON_BY_CODE[menuCode]) {
return SIDEBAR_MENU_ICON_BY_CODE[menuCode]
}
return ''
}
/**
* 解析侧栏菜单图标:meta.icon → 路由 name / menuCode 映射 → 缺省图标。
*/
export function resolveSidebarMenuIcon(
item: AppRouteRecord,
hasChildren = false
): string {
const mapped = lookupMappedIcon(item)
if (mapped) return mapped
return hasChildren ? DEFAULT_SUBMENU_ICON : DEFAULT_MENU_ITEM_ICON
}