index.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. import { useAccess } from '@/hooks/useAccess'
  2. import { ONLY_PC_PAGE } from '@/router/config'
  3. /**
  4. * 工作台菜单数据
  5. * 定义菜单分组和菜单项的数据结构
  6. */
  7. /** 菜单项类型 */
  8. export interface MenuItem {
  9. key: string // 菜单唯一标识
  10. name: string // 菜单名称
  11. icon: string // 菜单图标(支持 wot-design-uni 图标名或图片路径)
  12. url?: string // 跳转路径
  13. iconColor?: string // 图标颜色(可选)
  14. enabled?: boolean // 是否启用(可选,默认 true)
  15. permission?: string // 权限标识(可选)
  16. }
  17. /** 菜单分组类型 */
  18. export interface MenuGroup {
  19. key: string // 分组唯一标识
  20. name: string // 分组名称
  21. menus: MenuItem[] // 分组下的菜单列表
  22. }
  23. /** 菜单分组原始数据 */
  24. const menuGroupsData: MenuGroup[] = [
  25. {
  26. key: 'crm',
  27. name: '客户管理',
  28. menus: [
  29. {
  30. key: 'crmCustomer',
  31. name: '客户管理',
  32. icon: 'user-friends',
  33. url: '/pages-crm/customer/index',
  34. iconColor: '#ff7875',
  35. permission: 'crm:customer:query',
  36. },
  37. {
  38. key: 'crmContact',
  39. name: '联系人管理',
  40. icon: 'people',
  41. url: '/pages-crm/contact/index',
  42. iconColor: '#52c41a',
  43. permission: 'crm:contact:query',
  44. },
  45. {
  46. key: 'crmClue',
  47. name: '线索管理',
  48. icon: 'user',
  49. url: '/pages-crm/clue/index',
  50. iconColor: '#1890ff',
  51. permission: 'crm:clue:query',
  52. },
  53. ],
  54. },
  55. {
  56. key: 'system',
  57. name: '系统管理',
  58. menus: [
  59. {
  60. key: 'user',
  61. name: '用户管理',
  62. icon: 'user',
  63. url: '/pages-system/user/index',
  64. iconColor: '#1890ff',
  65. permission: 'system:user:list',
  66. },
  67. {
  68. key: 'role',
  69. name: '角色管理',
  70. icon: 'secured',
  71. url: '/pages-system/role/index',
  72. iconColor: '#2f54eb',
  73. permission: 'system:role:query',
  74. },
  75. {
  76. key: 'menu',
  77. name: '菜单管理',
  78. icon: 'menu-fold',
  79. url: '/pages-system/menu/index',
  80. iconColor: '#597ef7',
  81. permission: 'system:menu:query',
  82. },
  83. {
  84. key: 'dept',
  85. name: '部门管理',
  86. icon: 'layers',
  87. url: '/pages-system/dept/index',
  88. iconColor: '#13c2c2',
  89. permission: 'system:dept:query',
  90. },
  91. {
  92. key: 'post',
  93. name: '岗位管理',
  94. icon: 'flag',
  95. url: '/pages-system/post/index',
  96. iconColor: '#36cfc9',
  97. permission: 'system:post:query',
  98. },
  99. {
  100. key: 'operateLog',
  101. name: '操作日志',
  102. icon: 'history',
  103. url: '/pages-system/operate-log/index',
  104. iconColor: '#722ed1',
  105. permission: 'system:operate-log:query',
  106. },
  107. {
  108. key: 'loginLog',
  109. name: '登录日志',
  110. icon: 'login',
  111. url: '/pages-system/login-log/index',
  112. iconColor: '#9254de',
  113. permission: 'system:login-log:query',
  114. },
  115. {
  116. key: 'notice',
  117. name: '通知公告',
  118. icon: 'notification',
  119. url: '/pages-system/notice/index',
  120. iconColor: '#fa8c16',
  121. permission: 'system:notice:query',
  122. },
  123. {
  124. key: 'sms',
  125. name: '短信管理',
  126. icon: 'chat1',
  127. url: '/pages-system/sms/index',
  128. iconColor: '#faad14',
  129. permission: 'system:sms-channel:query',
  130. },
  131. {
  132. key: 'mail',
  133. name: '邮件管理',
  134. icon: 'mail',
  135. url: '/pages-system/mail/index',
  136. iconColor: '#ffc53d',
  137. permission: 'system:mail-account:query',
  138. },
  139. {
  140. key: 'notify',
  141. name: '站内信管理',
  142. icon: 'read',
  143. url: '/pages-system/notify/index',
  144. iconColor: '#ff7a45',
  145. permission: 'system:notify-template:query',
  146. },
  147. {
  148. key: 'tenant',
  149. name: '租户管理',
  150. icon: 'shop',
  151. url: '/pages-system/tenant/index',
  152. iconColor: '#eb2f96',
  153. permission: 'system:tenant:query',
  154. },
  155. {
  156. key: 'social',
  157. name: '三方用户',
  158. icon: 'share',
  159. url: '/pages-system/social/index',
  160. iconColor: '#f759ab',
  161. permission: 'system:social-client:query',
  162. },
  163. {
  164. key: 'oauth2',
  165. name: 'OAuth2.0',
  166. icon: 'lock-on',
  167. url: '/pages-system/oauth2/index',
  168. iconColor: '#ff85c0',
  169. permission: 'system:oauth2-client:query',
  170. },
  171. {
  172. key: 'dict',
  173. name: '字典管理',
  174. icon: 'books',
  175. url: '/pages-system/dict/index',
  176. iconColor: '#c41d7f',
  177. permission: 'system:dict:query',
  178. },
  179. {
  180. key: 'area',
  181. name: '地区管理',
  182. icon: 'location',
  183. url: '/pages-system/area/index',
  184. iconColor: '#f5222d',
  185. },
  186. ],
  187. },
  188. {
  189. key: 'infra',
  190. name: '基础设施',
  191. menus: [
  192. {
  193. key: 'accessLog',
  194. name: '访问日志',
  195. icon: 'view-list',
  196. url: '/pages-infra/api-access-log/index',
  197. iconColor: '#1890ff',
  198. permission: 'infra:api-access-log:query',
  199. },
  200. {
  201. key: 'errorLog',
  202. name: '错误日志',
  203. icon: 'error-circle',
  204. url: '/pages-infra/api-error-log/index',
  205. iconColor: '#f5222d',
  206. permission: 'infra:api-error-log:query',
  207. },
  208. {
  209. key: 'config',
  210. name: '参数配置',
  211. icon: 'setting',
  212. url: '/pages-infra/config/index',
  213. iconColor: '#722ed1',
  214. permission: 'infra:config:query',
  215. },
  216. {
  217. key: 'dataSourceConfig',
  218. name: '数据源配置',
  219. icon: 'server',
  220. url: '/pages-infra/data-source-config/index',
  221. iconColor: '#9254de',
  222. permission: 'infra:data-source-config:query',
  223. },
  224. {
  225. key: 'file',
  226. name: '文件管理',
  227. icon: 'folder',
  228. url: '/pages-infra/file/index',
  229. iconColor: '#2f54eb',
  230. permission: 'infra:file:query',
  231. },
  232. {
  233. key: 'websocket',
  234. name: 'WebSocket',
  235. icon: 'wifi',
  236. url: '/pages-infra/web-socket/index',
  237. iconColor: '#13c2c2',
  238. },
  239. {
  240. key: 'job',
  241. name: '定时任务',
  242. icon: 'time',
  243. url: '/pages-infra/job/index',
  244. iconColor: '#fa8c16',
  245. permission: 'infra:job:query',
  246. },
  247. {
  248. key: 'codegen',
  249. name: '代码生成',
  250. icon: 'code',
  251. url: ONLY_PC_PAGE,
  252. iconColor: '#52c41a',
  253. },
  254. {
  255. key: 'build',
  256. name: '表单构建',
  257. icon: 'edit-outline',
  258. url: ONLY_PC_PAGE,
  259. iconColor: '#73d13d',
  260. },
  261. {
  262. key: 'swagger',
  263. name: 'API 接口',
  264. icon: 'link',
  265. url: ONLY_PC_PAGE,
  266. iconColor: '#95de64',
  267. },
  268. {
  269. key: 'druid',
  270. name: '监控中心',
  271. icon: 'dashboard',
  272. url: ONLY_PC_PAGE,
  273. iconColor: '#389e0d',
  274. },
  275. ],
  276. },
  277. {
  278. key: 'bpm',
  279. name: '工作流程',
  280. menus: [
  281. {
  282. key: 'bpmMy',
  283. name: '我的流程',
  284. icon: 'user-circle',
  285. url: '/pages/bpm/index?tab=my',
  286. iconColor: '#1890ff',
  287. permission: 'bpm:process-instance:query',
  288. },
  289. {
  290. key: 'bpmTodo',
  291. name: '待办任务',
  292. icon: 'time',
  293. url: '/pages/bpm/index?tab=todo',
  294. iconColor: '#fa8c16',
  295. permission: 'bpm:task:query',
  296. },
  297. {
  298. key: 'bpmDone',
  299. name: '已办任务',
  300. icon: 'check-circle',
  301. url: '/pages/bpm/index?tab=done',
  302. iconColor: '#52c41a',
  303. permission: 'bpm:task:query',
  304. },
  305. {
  306. key: 'bpmCopy',
  307. name: '抄送我的',
  308. icon: 'mail',
  309. url: '/pages/bpm/index?tab=copy',
  310. iconColor: '#13c2c2',
  311. permission: 'bpm:process-instance-cc:query',
  312. },
  313. {
  314. key: 'oaLeave',
  315. name: '请假申请',
  316. icon: 'calendar',
  317. url: '/pages-bpm/oa/leave/index',
  318. iconColor: '#52c41a',
  319. permission: 'bpm:oa-leave:query',
  320. },
  321. {
  322. key: 'bpmModel',
  323. name: '流程模型',
  324. icon: 'app',
  325. url: ONLY_PC_PAGE,
  326. iconColor: '#722ed1',
  327. permission: 'bpm:process-definition:query',
  328. },
  329. {
  330. key: 'bpmForm',
  331. name: '流程表单',
  332. icon: 'edit-1',
  333. url: ONLY_PC_PAGE,
  334. iconColor: '#9254de',
  335. permission: 'bpm:form:query',
  336. },
  337. {
  338. key: 'bpmCategory',
  339. name: '流程分类',
  340. icon: 'folder-open',
  341. url: '/pages-bpm/category/index',
  342. iconColor: '#faad14',
  343. permission: 'bpm:category:query',
  344. },
  345. {
  346. key: 'bpmUserGroup',
  347. name: '用户分组',
  348. icon: 'usergroup',
  349. url: '/pages-bpm/user-group/index',
  350. iconColor: '#ffc53d',
  351. permission: 'bpm:user-group:query',
  352. },
  353. {
  354. key: 'bpmProcessListener',
  355. name: '流程监听器',
  356. icon: 'sound',
  357. url: '/pages-bpm/process-listener/index',
  358. iconColor: '#eb2f96',
  359. permission: 'bpm:process-listener:query',
  360. },
  361. {
  362. key: 'bpmProcessExpression',
  363. name: '流程表达式',
  364. icon: 'code',
  365. url: '/pages-bpm/process-expression/index',
  366. iconColor: '#f759ab',
  367. permission: 'bpm:process-expression:query',
  368. },
  369. {
  370. key: 'bpmProcessInstanceManager',
  371. name: '流程实例',
  372. icon: 'queue',
  373. url: '/pages-bpm/processInstance/manager/index',
  374. iconColor: '#36cfc9',
  375. permission: 'bpm:process-instance:manager-query',
  376. },
  377. {
  378. key: 'bpmTaskManager',
  379. name: '流程任务',
  380. icon: 'bulletpoint',
  381. url: '/pages-bpm/task/manager/index',
  382. iconColor: '#5cdbd3',
  383. permission: 'bpm:task:manager-query',
  384. },
  385. ],
  386. },
  387. ]
  388. /**
  389. * 获取所有菜单分组数据(带权限过滤):过滤掉没有权限的菜单项,如果整个分组都没有权限则不展示该分组
  390. */
  391. export function getMenuGroups(): MenuGroup[] {
  392. const { hasAccessByCodes } = useAccess()
  393. return menuGroupsData
  394. .map(group => ({
  395. ...group,
  396. // 过滤掉没有权限的菜单项
  397. menus: group.menus.filter((menu) => {
  398. // 没有配置权限的菜单项默认展示
  399. if (!menu.permission) {
  400. return true
  401. }
  402. return hasAccessByCodes([menu.permission])
  403. }),
  404. }))
  405. // 过滤掉没有菜单项的分组
  406. .filter(group => group.menus.length > 0)
  407. }
  408. /** 获取所有菜单项(扁平化) */
  409. export function getAllMenuItems(): MenuItem[] {
  410. const groups = getMenuGroups()
  411. return groups.flatMap(group => group.menus)
  412. }
  413. /** 根据 key 获取菜单项 */
  414. export function getMenuItemByKey(key: string): MenuItem | undefined {
  415. return getAllMenuItems().find(item => item.key === key)
  416. }