menu.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { get } from './request.js'
  2. import { getToken } from './auth-session.js'
  3. import { resolveMenuIconColors } from './menu-icon-colors.js'
  4. function authHeader() {
  5. const token = getToken()
  6. return token ? { Authorization: 'Bearer ' + token } : {}
  7. }
  8. /**
  9. * 市场业务叶子 path → van-icon 名(与 static/menu-icons/market-*.png 对齐)。
  10. * 后端未下发 / 回落 apps-o 时由前端兜底,避免空置或灰格宫格。
  11. */
  12. export function resolveMarketMenuIcon(path) {
  13. const p = String(path || '').toLowerCase()
  14. if (p.indexOf('market/webview') < 0 || p.indexOf('entry=') < 0) {
  15. return ''
  16. }
  17. if (p.indexOf('payment-chase') >= 0) return 'market-payment-chase'
  18. if (p.indexOf('presign') >= 0) return 'market-presign'
  19. if (p.indexOf('protocol') >= 0) return 'market-protocol'
  20. if (p.indexOf('payment') >= 0) return 'market-payment'
  21. if (p.indexOf('freight') >= 0) return 'market-freight'
  22. return ''
  23. }
  24. /**
  25. * 分区标题:优先用接口 groupTitle;缺失时按 path 推断(兼容测试库未跑目录重组 SQL)。
  26. */
  27. export function resolveMenuGroupTitle(path, groupTitle) {
  28. const existing = String(groupTitle || '').trim()
  29. if (existing) return existing
  30. const p = String(path || '').toLowerCase()
  31. if (p.indexOf('market/webview') >= 0 || p.indexOf('/pages/market/') >= 0) {
  32. return '市场部'
  33. }
  34. if (p.indexOf('/pages/oa/') >= 0 || p.indexOf('pages/oa/') >= 0) {
  35. return 'OA工作流'
  36. }
  37. return ''
  38. }
  39. /** 当前用户移动端菜单(扁平列表) */
  40. export async function fetchMyMobileMenus() {
  41. const data = await get('/mini/menus', authHeader())
  42. const list = data?.list || data || []
  43. return list.map(normalizeMenu).filter((m) => m.path)
  44. }
  45. export function normalizeMenu(m = {}) {
  46. const hasExplicitIcon = Object.prototype.hasOwnProperty.call(m, 'icon')
  47. let icon = hasExplicitIcon ? String(m.icon ?? '') : 'approve'
  48. const path = m.path || ''
  49. const marketIcon = resolveMarketMenuIcon(path)
  50. // 市场入口始终用专用 PNG(覆盖空串 / apps-o 等后端回落值)
  51. if (marketIcon) {
  52. icon = marketIcon
  53. }
  54. const colors = resolveMenuIconColors({
  55. icon,
  56. iconBg: m.iconBg || m.icon_bg,
  57. iconFg: m.iconFg || m.icon_fg
  58. })
  59. return {
  60. id: m.id,
  61. title: m.title || m.menuName || m.menu_name,
  62. groupTitle: resolveMenuGroupTitle(path, m.groupTitle || m.group_title),
  63. icon,
  64. path,
  65. iconBg: colors.iconBg,
  66. iconFg: colors.iconFg,
  67. tone: m.tone || ''
  68. }
  69. }