LeftWrap.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <script setup>
  2. import { useRouter } from 'vue-router'
  3. import { useLayoutState } from '../hooks/index'
  4. import {apiSystemRole} from '@/api/system'
  5. const router = useRouter()
  6. const { menuClose } = useLayoutState()
  7. const navList = ref([])
  8. function getNavList(){
  9. //mock navList
  10. navList.value = [
  11. {
  12. Path:'/customer',
  13. Name:'客户管理',
  14. Children:[
  15. {
  16. Path:'/customer/tempUserList',
  17. Name:'临时用户列表',
  18. }
  19. ]
  20. },
  21. {
  22. Path:'/authorMgt/authorList',
  23. Name:'研究员管理',
  24. Children:[]
  25. },
  26. {
  27. Path:'/customer/feedbackList',
  28. Name:'客户反馈',
  29. Children:[]
  30. }
  31. ]
  32. return
  33. apiSystemRole.menuData().then(res=>{
  34. if(res.Ret===200){
  35. navList.value=res.Data||[]
  36. }
  37. })
  38. }
  39. getNavList()
  40. const userName=computed(()=>{
  41. return localStorage.getItem('userName')
  42. })
  43. function resetpwd() {
  44. router.push('/system/resetPwd')
  45. }
  46. function logout() {
  47. ElMessageBox.confirm(
  48. '确认退出吗?',
  49. '提示',
  50. { type: 'warning', }
  51. ).then(() => {
  52. localStorage.removeItem('token')
  53. localStorage.removeItem('userName')
  54. router.replace('/login')
  55. }).catch()
  56. }
  57. function getMenuIcon(item){
  58. if(item.Name==='用户列表') return 'menu/user'
  59. if(item.Name==='潜在用户列表') return 'menu/usergroup'
  60. if(item.Name==='PDF报告') return 'menu/pdf'
  61. if(item.Name==='全局检索') return 'menu/usersearch'
  62. return 'menu/setting'
  63. }
  64. </script>
  65. <template>
  66. <div :class="['left-wrap', menuClose ? 'left-wrap__close' : '']">
  67. <el-menu
  68. class="menu-wrap"
  69. mode="vertical"
  70. unique-opened
  71. router
  72. :default-active="$route.path"
  73. :collapse="menuClose"
  74. >
  75. <template v-for="level1 in navList" :key="level1.SysMenuId">
  76. <el-menu-item
  77. :index="level1.Path"
  78. v-if="level1.Children.length===0"
  79. >
  80. <svg-icon :name="getMenuIcon(level1)" style="font-size:16px;"></svg-icon>
  81. <span>{{ level1.Name }}</span>
  82. </el-menu-item>
  83. <el-sub-menu
  84. :index="level1.Path"
  85. v-if="level1.Children.length>0"
  86. >
  87. <template #title>
  88. <svg-icon :name="getMenuIcon(level1)" style="font-size:16px"></svg-icon>
  89. <span>{{ level1.Name }}</span>
  90. </template>
  91. <el-menu-item
  92. v-for="child in level1.Children"
  93. :index="child.Path"
  94. :key="child.Path"
  95. >
  96. <el-icon></el-icon>
  97. <span>{{ child.Name }}</span>
  98. </el-menu-item>
  99. </el-sub-menu>
  100. </template>
  101. </el-menu>
  102. <div class="user-box" v-if="!menuClose">
  103. <div class="name-box">
  104. <svg-icon name="person" size="18px"></svg-icon>
  105. <span>{{userName}}</span>
  106. </div>
  107. <div class="opt" @click="resetpwd">修改密码</div>
  108. <div class="opt" @click="logout">退出登录</div>
  109. </div>
  110. <el-popover placement="right" :width="100" trigger="click">
  111. <template #reference>
  112. <div style="text-align: center">
  113. <svg-icon name="person" size="24px" v-if="menuClose"></svg-icon>
  114. </div>
  115. </template>
  116. <div>
  117. <div style="text-align:center;padding:10px 0;cursor: pointer;" @click="resetpwd">修改密码</div>
  118. <div style="text-align:center;padding:10px 0;cursor: pointer;" @click="logout">退出登录</div>
  119. </div>
  120. </el-popover>
  121. </div>
  122. </template>
  123. <style lang="scss" scoped>
  124. .left-wrap {
  125. --el-menu-bg-color: #086CE0;
  126. --el-menu-hover-bg-color: rgba(255, 255, 255, 0.15);
  127. --el-menu-text-color: #ffffff;
  128. --el-menu-active-color: #ffae4f;
  129. width: 180px;
  130. z-index: 50;
  131. position: fixed;
  132. top: 60px;
  133. left: 0;
  134. bottom: 0;
  135. padding: 8px;
  136. background-color: #086CE0;
  137. display: flex;
  138. flex-direction: column;
  139. padding-bottom: 111px;
  140. transition: all 0.5s;
  141. .menu-wrap {
  142. flex: 1;
  143. height: 100%;
  144. border: none;
  145. }
  146. .user-box {
  147. background-color: var(--el-menu-hover-bg-color);
  148. color: #fff;
  149. text-align: center;
  150. padding: 20px;
  151. .name-box {
  152. display: flex;
  153. justify-content: center;
  154. align-items: center;
  155. gap: 0 5px;
  156. }
  157. .opt {
  158. margin: 10px 0;
  159. cursor: pointer;
  160. }
  161. }
  162. }
  163. .left-wrap__close {
  164. width: 80px;
  165. }
  166. </style>