platform.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <template>
  2. <el-row>
  3. <el-col :span="2">
  4. <el-link type="primary" :icon="BackIcon" @click="toBack">{{ title }}</el-link>
  5. </el-col>
  6. <el-col :span="22">
  7. <el-segmented v-model="value" :options="options" @change="viewChange" block>
  8. <template #default="{ item }"> {{ item.label }} </template>
  9. </el-segmented>
  10. </el-col>
  11. </el-row>
  12. <el-divider />
  13. <el-row>
  14. <el-col :span="24">
  15. <template v-if="!value">
  16. <el-alert title="请在上方选择您要查看的信息" type="warning" effect="dark" :closable="false" />
  17. </template>
  18. <template v-else>
  19. <component :is="viewComponent"></component>
  20. </template>
  21. </el-col>
  22. </el-row>
  23. </template>
  24. <script setup>
  25. import { Back as BackIcon } from '@element-plus/icons-vue'
  26. import { get } from 'lodash-es'
  27. import { defineAsyncComponent } from 'vue'
  28. const props = defineProps({
  29. title: { type: String }, // 当前视图选中的上级
  30. parentName: { type: String } // 当前视图上级的组件名
  31. })
  32. const emits = defineEmits(['back'])
  33. const value = ref()
  34. const viewComponent = ref()
  35. const componentList = ref({
  36. supply: defineAsyncComponent(() => import('./platform/supply.vue')),
  37. demand: defineAsyncComponent(() => import('./platform/demand.vue')),
  38. achievement: defineAsyncComponent(() => import('./platform/achievement.vue')),
  39. match: defineAsyncComponent(() => import('./platform/match.vue')),
  40. project: defineAsyncComponent(() => import('./platform/project.vue')),
  41. footplate: defineAsyncComponent(() => import('./platform/footplate.vue')),
  42. support: defineAsyncComponent(() => import('./platform/support.vue'))
  43. })
  44. const route = useRoute()
  45. const path = get(route, 'path')
  46. import { UserStore } from '@/store/user'
  47. const userStore = UserStore()
  48. const menus = userStore.menus
  49. // 找页面
  50. const thisRouteConfig = menus.find((f) => f.path === path)
  51. const pagesChildren = get(thisRouteConfig, 'children', [])
  52. // 找子页面中的children
  53. const thisComponent = pagesChildren.find((f) => f.component === props.parentName)
  54. const children = get(thisComponent, 'children', [])
  55. const options = children.map((i) => {
  56. const obj = {
  57. label: get(i, 'name'),
  58. value: get(i, 'id'),
  59. component: get(i, 'component')
  60. }
  61. return obj
  62. })
  63. const viewChange = (val) => {
  64. const i = options.find((f) => f.value === val)
  65. if (!i) return
  66. const componentName = get(i, 'component')
  67. if (!componentName) return
  68. const component = componentList.value[componentName]
  69. if (!component) return
  70. viewComponent.value = component
  71. }
  72. const toBack = () => {
  73. emits('back')
  74. }
  75. </script>
  76. <style scoped></style>