roles.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { defineStore } from 'pinia'
  2. import { routesMetas, RoutesName } from '@/router'
  3. import { fetchRoleOptions, RoleOption } from '@/api'
  4. import type { RoleOptions } from '@/api'
  5. export type { RoleOptions, RoleOption } from '@/api'
  6. export { fetchRoleOptions } from '@/api'
  7. type MenuTree = { key: RoleOption['id']; title: string; children: MenuTree[] }
  8. const transformMenuTree = (roleOptions: RoleOptions): MenuTree[] => {
  9. return roleOptions.map(role => ({
  10. title: routesMetas[role.path].title,
  11. key: role.id,
  12. children: role.children ? transformMenuTree(role.children) : []
  13. }))
  14. }
  15. export const useRoleStore = defineStore('role', {
  16. state: () => ({
  17. list: [] as RoleOptions
  18. }),
  19. getters: {
  20. getRole: state => (name: RoutesName) =>
  21. state.list.find(role => role.path === name)!,
  22. getRoles() {
  23. return (names: RoutesName[]) => names.map(name => this.getRole(name))
  24. },
  25. getRoleId() {
  26. return (name: RoutesName) => this.getRole(name).id
  27. },
  28. getRoleIds() {
  29. return (names: RoutesName[]) => names.map(name => this.getRoleId(name))
  30. },
  31. getName: state => (id: RoleOption['id']) =>
  32. state.list.find(role => role.id === id)!.path,
  33. getNames() {
  34. return (ids: RoleOption['id'][]) => ids.map(this.getName)
  35. },
  36. menuTree: state => {
  37. console.log(state.list)
  38. const tree = transformMenuTree(state.list)
  39. console.log(tree)
  40. return tree
  41. }
  42. },
  43. actions: {
  44. async fetch() {
  45. this.list = await fetchRoleOptions()
  46. }
  47. }
  48. })