index.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <el-container class="page-user">
  3. <el-aside style="width: 240px">
  4. <el-container>
  5. <el-header style="height: auto; display: block">
  6. <div class="user-info-top">
  7. <el-avatar :size="70" src="img/avatar.jpg"></el-avatar>
  8. <h2>{{ user.userName }}</h2>
  9. <p>
  10. <el-tag effect="dark" round size="large" disable-transitions>{{ user.role }}</el-tag>
  11. </p>
  12. </div>
  13. </el-header>
  14. <el-main class="nopadding">
  15. <el-menu class="menu" :default-active="page">
  16. <el-menu-item-group v-for="group in menu" :key="group.groupName" :title="group.groupName">
  17. <el-menu-item v-for="item in group.list" :key="item.component" :index="item.component" @click="openPage">
  18. <el-icon v-if="item.icon"><component :is="item.icon" /></el-icon>
  19. <template #title>
  20. <span>{{ item.title }}</span>
  21. </template>
  22. </el-menu-item>
  23. </el-menu-item-group>
  24. </el-menu>
  25. </el-main>
  26. </el-container>
  27. </el-aside>
  28. <el-main>
  29. <Suspense>
  30. <template #default>
  31. <component :is="page" />
  32. </template>
  33. <template #fallback>
  34. <el-skeleton :rows="3" />
  35. </template>
  36. </Suspense>
  37. </el-main>
  38. </el-container>
  39. </template>
  40. <script lang="ts" name="profileIndex">
  41. import { defineAsyncComponent } from 'vue'
  42. // setup
  43. export default {
  44. name: 'ProfileIndex',
  45. components: {
  46. account: defineAsyncComponent(() => import('./user/account')),
  47. setting: defineAsyncComponent(() => import('./user/setting')),
  48. pushSettings: defineAsyncComponent(() => import('./user/pushSettings')),
  49. password: defineAsyncComponent(() => import('./user/password')),
  50. space: defineAsyncComponent(() => import('./user/space')),
  51. logs: defineAsyncComponent(() => import('./user/logs')),
  52. upToEnterprise: defineAsyncComponent(() => import('./user/upToEnterprise'))
  53. },
  54. //路由跳转进来 判断from是否有特殊标识做特殊处理
  55. beforeRouteEnter(to, from, next) {
  56. next(vm => {
  57. if (from.is) {
  58. //删除特殊标识,防止标签刷新重复执行
  59. delete from.is
  60. //执行特殊方法
  61. vm.$alert('路由跳转过来后含有特殊标识,做特殊处理', '提示', {
  62. type: 'success',
  63. center: true
  64. })
  65. .then(() => {})
  66. .catch(() => {})
  67. }
  68. })
  69. },
  70. data() {
  71. return {
  72. menu: [
  73. {
  74. groupName: '基本设置',
  75. list: [
  76. {
  77. icon: 'el-icon-postcard',
  78. title: '账号信息',
  79. component: 'account'
  80. },
  81. {
  82. icon: 'el-icon-operation',
  83. title: '个人设置',
  84. component: 'setting'
  85. },
  86. {
  87. icon: 'el-icon-lock',
  88. title: '密码',
  89. component: 'password'
  90. },
  91. {
  92. icon: 'el-icon-bell',
  93. title: '通知设置',
  94. component: 'pushSettings'
  95. }
  96. ]
  97. },
  98. {
  99. groupName: '数据管理',
  100. list: [
  101. {
  102. icon: 'el-icon-coin',
  103. title: '存储空间信息',
  104. component: 'space'
  105. },
  106. {
  107. icon: 'el-icon-clock',
  108. title: '操作日志',
  109. component: 'logs'
  110. }
  111. ]
  112. },
  113. {
  114. groupName: '账号升级',
  115. list: [
  116. {
  117. icon: 'el-icon-office-building',
  118. title: '升级为企业账号',
  119. component: 'upToEnterprise'
  120. }
  121. ]
  122. }
  123. ],
  124. user: {
  125. userName: 'Sakuya',
  126. role: '超级管理员'
  127. },
  128. page: 'account'
  129. }
  130. },
  131. methods: {
  132. openPage(item) {
  133. this.page = item.index
  134. }
  135. }
  136. }
  137. </script>