You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

301 lines
8.7 KiB

3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
  1. <template>
  2. <aside class="site-sidebar" :class="'site-sidebar--' + sidebarLayoutSkin">
  3. <div class="site-sidebar__inner">
  4. <el-menu
  5. :default-openeds="isOpenAll ? openMenuList : []"
  6. :default-active="menuActiveName || 'home'"
  7. :collapse="sidebarFold"
  8. :collapseTransition="false"
  9. class="site-sidebar__menu">
  10. <el-menu-item style=" padding-left: -5px;" :class="$store.state.common.sidebarLayoutSkin === 'light'?'menu-light':'menu-dark'">
  11. <span slot="title">
  12. <el-input v-model="search" placeholder="搜索" class="custom-input" @keyup.enter.native="searchMenu1" style="margin-left: -2px"></el-input></span>
  13. <i type="primary" class="el-icon-search" style="font-size: small" @click="searchMenu1()"></i>
  14. </el-menu-item>
  15. <el-menu-item index="home" @click="$router.push({ name: 'home' })">
  16. <icon-svg name="shouye" class="site-sidebar__menu-icon"></icon-svg>
  17. <span slot="title">{{ pageLanguage.homePage }}</span>
  18. </el-menu-item>
  19. <sub-menu
  20. v-for="menu in menuList"
  21. :key="menu.menuId"
  22. :menu="menu"
  23. :dynamicMenuRoutes="dynamicMenuRoutes">
  24. </sub-menu>
  25. <sub-menu
  26. v-for="menu in this.favoriteList"
  27. :key="menu.menuId"
  28. :menu="menu"
  29. :dynamicMenuRoutes="dynamicMenuRoutes">
  30. </sub-menu>
  31. </el-menu>
  32. </div>
  33. </aside>
  34. </template>
  35. <script>
  36. import SubMenu from './main-sidebar-sub-menu'
  37. import {isURL} from '@/utils/validate'
  38. import {userFavoriteList} from '@/api/userFavorite.js'
  39. import {treeDataTranslate} from '@/utils'
  40. import {
  41. searchFunctionButtonList,
  42. } from "@/api/sysLanguage.js"
  43. import {EventBus} from "../main";
  44. export default {
  45. data() {
  46. return {
  47. dynamicMenuRoutes: [],
  48. search: '',
  49. categoryList: [],
  50. uFavoriteList: [],
  51. favoriteList: [],
  52. newMenuList: [],
  53. list: [],
  54. isOpenAll: true,
  55. openMenuList: [],
  56. pageLanguage: {
  57. homePage: '首页'
  58. }
  59. }
  60. },
  61. components: {
  62. SubMenu
  63. },
  64. computed: {
  65. sidebarLayoutSkin: {
  66. get() {
  67. return this.$store.state.common.sidebarLayoutSkin
  68. }
  69. },
  70. sidebarFold: {
  71. get() {
  72. return this.$store.state.common.sidebarFold
  73. }
  74. },
  75. menuList:
  76. {
  77. get() {
  78. return this.$store.state.common.menuList
  79. },
  80. set(val) {
  81. this.$store.commit('common/updateMenuList', val)
  82. }
  83. },
  84. menuActiveName: {
  85. get() {
  86. return this.$store.state.common.menuActiveName
  87. },
  88. set(val) {
  89. this.$store.commit('common/updateMenuActiveName', val)
  90. }
  91. },
  92. mainTabs: {
  93. get() {
  94. return this.$store.state.common.mainTabs
  95. },
  96. set(val) {
  97. this.$store.commit('common/updateMainTabs', val)
  98. }
  99. },
  100. mainTabsActiveName: {
  101. get() {
  102. return this.$store.state.common.mainTabsActiveName
  103. },
  104. set(val) {
  105. this.$store.commit('common/updateMainTabsActiveName', val)
  106. }
  107. }
  108. },
  109. watch: {
  110. $route: 'routeHandle'
  111. },
  112. created() {
  113. EventBus.$on('updateFavoriteList', this.updateFavoriteList);
  114. this.menuList = JSON.parse(sessionStorage.getItem('menuList') || '[]').filter(item => item.menuId != 999)
  115. this.openMenuList = this.getAllOpenMenu(this.menuList)
  116. this.favoriteList = JSON.parse(sessionStorage.getItem('menuList') || '[]').filter(item => item.menuId == 999)
  117. this.userFavorites()
  118. this.dynamicMenuRoutes = JSON.parse(sessionStorage.getItem('dynamicMenuRoutes') || '[]')
  119. this.routeHandle(this.$route)
  120. this.getFunctionButtonList()
  121. this.changeStyle()
  122. },
  123. destroyed() {
  124. EventBus.$off('updateFavoriteList', this.updateFavoriteList);
  125. },
  126. methods: {
  127. // 获取所有需要展开的菜单ID
  128. getAllOpenMenu(menuList) {
  129. let result = []
  130. const loop = (list) => {
  131. list.forEach(item => {
  132. if (item.list && item.list.length > 0) {
  133. result.push(String(item.menuId))
  134. loop(item.list)
  135. }
  136. })
  137. }
  138. loop(menuList)
  139. return result
  140. },
  141. changeStyle(){
  142. let data= JSON.parse(sessionStorage.getItem('userConfig') || '{}')
  143. this.$store.commit('common/updateNavbarLayoutType', data.navbarLayoutType)
  144. this.$store.commit('common/updateSidebarLayoutSkin', data.sidebarLayoutSkin)
  145. },
  146. // 获取 首页菜单
  147. // 获取页面多语言数据
  148. getFunctionButtonList() {
  149. let queryButton = {
  150. functionId: 'systemInformation',
  151. tableId: 'systemInformation',
  152. languageCode: this.$i18n.locale,
  153. objectId: 'homePage'
  154. }
  155. searchFunctionButtonList(queryButton).then(({data}) => {
  156. if (data.code == 0 ) {
  157. this.pageLanguage = data.data
  158. }
  159. })
  160. },
  161. // 用户收藏夹
  162. userFavorites() {
  163. let query = {
  164. userId: this.$store.state.user.id,
  165. languageCode: this.$i18n.locale
  166. }
  167. userFavoriteList(query).then(({data}) => {
  168. if (data.list.length > 0) {
  169. this.favoriteList[0].list = data.list
  170. }
  171. })
  172. },
  173. updateFavoriteList(){
  174. this.userFavorites()
  175. },
  176. // 更具 当前节点id 获取上级节点
  177. getParent(val, sum) {
  178. if (val == 0) {
  179. return;
  180. }
  181. let parent = this.list.filter(item => item.menuId == val)
  182. if (parent.length > 0) {
  183. parent[0].list.length = 0
  184. sum.push(parent[0])
  185. this.getParent(parent[0].parentId, sum)
  186. }
  187. },
  188. // 搜索菜单方式1 start
  189. searchMenu1() {
  190. if (this.search == "") {
  191. this.menuList = JSON.parse(sessionStorage.getItem('menuList') || '[]').filter(item => item.menuId != 999)
  192. } else {
  193. let menuPlus = []
  194. this.menuList = JSON.parse(sessionStorage.getItem('menuList') || '[]').filter(item => item.menuId != 999)
  195. // this.menuList = this.treeFindPath(this.menuList).filter(this.search)
  196. // 转换成list
  197. this.list = this.treeFindPath(this.menuList)
  198. let list = this.treeFindPath(this.menuList)
  199. list = this.distinct(list, list);
  200. // list中获取菜单
  201. this.menuList = list.filter(item => item.name.indexOf(this.search) != -1)
  202. let menuSum = []
  203. for (let data of this.menuList) {
  204. menuSum.push(data)
  205. this.getParent(data.parentId, menuSum)
  206. }
  207. menuSum = Array.from(new Set([...menuSum]))
  208. if (menuSum.length > 0) {
  209. let menuList = menuSum.filter(item => item.parentId == 0);
  210. this.menuList = menuList
  211. this.treeList(menuList, menuSum)
  212. }
  213. }
  214. },
  215. // 封装树形结构
  216. treeList(menuList, menuSum) {
  217. for (let m1 of menuList) {
  218. for (let m2 of menuSum) {
  219. if (m1.menuId == m2.parentId) {
  220. m1.list.push(m2)
  221. this.treeList(m1.list, menuSum)
  222. }
  223. }
  224. }
  225. },
  226. // 搜索菜单方式1 树结构菜单转换list
  227. treeFindPath(tree, path = []) {
  228. if (!tree) return []
  229. for (const data of tree) {
  230. path.push(data)
  231. // if (data.list != null) {
  232. // path.push(...data.list)
  233. // delete data.list
  234. // }
  235. this.treeFindPath(data.list, path)
  236. }
  237. return path
  238. },
  239. // 搜索菜单方式1 去重
  240. distinct(a, b) {
  241. return Array.from(new Set([...a, ...b]))
  242. },
  243. // 路由操作
  244. routeHandle(route) {
  245. if (route.meta.isTab) {
  246. // tab选中, 不存在先添加
  247. var tab = this.mainTabs.filter(item => item.name === route.name)[0]
  248. if (!tab) {
  249. if (route.meta.isDynamic) {
  250. route = this.dynamicMenuRoutes.filter(item => item.name === route.name)[0]
  251. if (!route) {
  252. return console.error('未能找到可用标签页!')
  253. }
  254. }
  255. tab = {
  256. menuId: route.meta.menuId || route.name,
  257. name: route.name,
  258. title: route.meta.title,
  259. type: isURL(route.meta.iframeUrl) ? 'iframe' : 'module',
  260. iframeUrl: route.meta.iframeUrl || '',
  261. params: route.params,
  262. query: route.query
  263. }
  264. this.mainTabs = this.mainTabs.concat(tab)
  265. }
  266. this.menuActiveName = tab.menuId + ''
  267. this.mainTabsActiveName = tab.name
  268. }
  269. }
  270. }
  271. }
  272. </script>
  273. <style>
  274. .menu-dark .el-input__inner {
  275. background: transparent;
  276. width: 195px;
  277. font-size: 12px;
  278. color: #FFFFFF;
  279. border: #0BB2D4;
  280. }
  281. .menu-light .el-input__inner {
  282. background: transparent;
  283. width: 195px;
  284. font-size: 12px;
  285. color: #000;
  286. border: #0BB2D4;
  287. }
  288. .custom-input .el-input__inner::placeholder {
  289. font-size: 15px; /* 更改此处为您需要的字体大小 */
  290. color: #999; /* 更改此处为您所需的颜色 */
  291. }
  292. </style>