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.

index.vue 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <template>
  2. <!-- :sources="[bgVideo]" -->
  3. <el-watermark :font="{color: 'rgba(0, 0, 0, .15)',fontSize: 14}" :content="[name,mobile]">
  4. <video-bg :sources="[]">
  5. <div class="as-layout-horizontal" style="width: 100%; height: 100%; opacity: 0.9">
  6. <!-- 此处先划出布局形式(按左右布局划分,左边菜单,右边内容) -->
  7. <!-- 菜单部分 -->
  8. <div class="bg-theme" style="height: 100%">
  9. <!-- 菜单头部部分 -->
  10. <div class="as-gravity-center-start" @click="barkHome"
  11. style="height: 70px; cursor: pointer; background-color: #304156">
  12. <img rel="icon" :src="logo" style="width: 40px; height: 40px;margin: 0 10px;" />
  13. <!-- D-UI框架模板 -->
  14. <div class="as-bold" style="color: #ffffff; user-select: none" v-show="menuStart.timeShow">
  15. <span style="color: #ffffff; font-size: 18px; color: #cfdae7">综合业务支撑平台</span>
  16. </div>
  17. </div>
  18. <!-- 菜单主体部分 height="100%" width: 240px; -->
  19. <div class="as-border-width" style="height: 100%; border: none;background-color:#304156">
  20. <el-scrollbar max-height="91%" wrap-class="scrollbar-wrapper">
  21. <el-menu :collapse-transition="false" unique-opened :default-active="ativeMenu" mode="vertical"
  22. :router="false" :collapse="!menuStart.menuIsExpansion" class="el-menu-vertical-demo"
  23. background-color="#304156" active-text-color="#cfdae7" text-color="#cfdae7">
  24. <!-- 菜单主体内容 -->
  25. <sidebar-item :list="itemMenuData" />
  26. </el-menu>
  27. </el-scrollbar>
  28. </div>
  29. </div>
  30. <div class="as-weight as-layout-vertical">
  31. <el-progress :style="{ 'visibility': store.show ? 'visible' : 'hidden' }" :percentage="store.progress"
  32. :show-text="false" :duration="0" :stroke-width="3" />
  33. <!-- 头部选项 -->
  34. <div style="height: 70px;border-bottom: 1px solid #dcdcdc;">
  35. <Head></Head>
  36. </div>
  37. <el-scrollbar>
  38. <div class="as-layout-vertical">
  39. <!-- 头部 height: 8%;-->
  40. <div style="background-color: #ffffff; padding: 16px 0px 16px 0px">
  41. <!-- 选项卡 -->
  42. <tab-container></tab-container>
  43. <!-- 主体内容页面 name="fade" -->
  44. <!-- <router-view name="key"></router-view> -->
  45. <!-- 路由缓存 https://blog.csdn.net/kDevelop/article/details/122036896 -->
  46. <!-- in-out:新元素先进入过渡,完成之后当前元素过渡离开; -->
  47. <!-- out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入。 -->
  48. <!-- style="height:100vh" -->
  49. <!-- <transition> 为提供了几个 css 类,它们能够在动画周期中被动态添加或删除。
  50. 有 6。个不同的过渡类(3 个用于淡入,3 个用于淡出)。
  51. v-enter-from / v-leave-from : 过渡的初始状态,过度开始后将其删除
  52. v-enter-active / v-leave-active : 过渡的激活状态
  53. v-enter-to / v-leave-to : 过渡的结束状态 -->
  54. <!-- <transition name="fade" mode="out-in"> -->
  55. <!-- 加入keep-alive保证进入退出都有动画 -->
  56. <!-- exclude排除缓存的组件,让该detail组件不缓存数据 -->
  57. <!-- </transition> -->
  58. <router-view name="key" v-slot="{ Component, route }">
  59. <!-- <keep-alive>
  60. <component :is="Component" />
  61. </keep-alive> -->
  62. <keep-alive>
  63. <component :is="Component" :key="route.name" v-if="!route.meta.nokeepAlive" />
  64. </keep-alive>
  65. <component :is="Component" :key="route.name" v-if="route.meta.nokeepAlive" />
  66. </router-view>
  67. </div>
  68. </div>
  69. </el-scrollbar>
  70. </div>
  71. </div>
  72. </video-bg>
  73. </el-watermark>
  74. </template>
  75. <script setup lang="ts">
  76. // @ts-ignore 选项菜单
  77. import SidebarItem from "@/layout/components/SidebarItem.vue";
  78. // @ts-ignore 选项头部
  79. import Head from "@/layout/components/Head.vue";
  80. // @ts-ignore Tab选项
  81. import TabContainer from "@/layout/components/TabControl.vue";
  82. import VideoBg from "@/components/VideoBackround/VideoBackground.vue"; //视频背景组件
  83. import $store from "@/store/index"; // 引入vuex
  84. import $storeTab from "@/store/tabValue"; //引入tab vuex
  85. import $storeinitData from "@/store/initData"; //引入tab vuex
  86. import { ref, onMounted, watch, computed } from "vue";
  87. import { useRouter, useRoute } from "vue-router";
  88. import logo from '@/assets/logo.png'
  89. import { getCache } from "@/utils/cache";
  90. import { treeDataHandle } from "@/utils/utils";
  91. import { IObject } from "@/types/interface";
  92. import BaseService from "@/utils/baseService";
  93. import { myMenu } from "@/api/system/menu";
  94. import { progressBarStore } from '@/store/progressBarStore'
  95. const store = progressBarStore()
  96. const router = useRouter();
  97. const route = useRoute();
  98. //默认菜单为打开状态
  99. let menuStart = ref($store.state.data);
  100. let itemMenuData = ref($storeinitData.state.menuList);
  101. const name = ref($storeinitData.getters.userName)
  102. const mobile = ref($storeinitData.getters.mobile)
  103. //处理刷新页面重置问题
  104. onMounted(() => {
  105. // console.log("===>",$storeinitData)
  106. sessionStorage.removeItem("newTab");
  107. OnSetNavLayout();
  108. if (itemMenuData.value.length === 0) {
  109. getMenuList();
  110. }
  111. });
  112. watch(
  113. () => route.path,
  114. (vl) => {
  115. //解决从浏览器输入url,tab数据无
  116. let data = `${route.meta.title},${route.name as string}`;
  117. let value = {
  118. type: 2,
  119. data: data,
  120. };
  121. $storeTab.dispatch("addTab", value);
  122. }
  123. );
  124. watch(
  125. () => $storeinitData.state.menuList,
  126. (val) => {
  127. itemMenuData.value = $storeinitData.state.menuList
  128. }
  129. )
  130. //页面初始化处理tab选中
  131. const OnSetNavLayout = () => {
  132. let data = `${route.meta.title},${route.name as string}`;
  133. let value = {
  134. type: 2,
  135. data: data,
  136. };
  137. $storeTab.dispatch("addTab", value);
  138. }
  139. // 菜单选中处理
  140. const ativeMenu = computed(() => {
  141. return route.path;
  142. });
  143. //返回首页
  144. const barkHome = () => {
  145. // router.replace({
  146. // name: "home",
  147. // });
  148. //去首页并清空选中的code,清空tab
  149. router.push("/");
  150. $storeinitData.dispatch("backIndexClear", "");
  151. $storeTab.dispatch('closeTheOther', -1)
  152. sessionStorage.removeItem('newTab')
  153. };
  154. //获取菜单
  155. const getMenuList = () => {
  156. let codeSelected = getCache("selectedCodeCatch", { isSessionStorage: false }, {})['code'];
  157. let cacheAccessToken = getCache("cacheAccessToken", { isSessionStorage: false }, {});
  158. let openId = cacheAccessToken['openId'];
  159. let params = {
  160. systemType: codeSelected,
  161. openId: openId
  162. }
  163. //userw/rbac/menuListBySystemTypeAndOpenId
  164. BaseService.post('/userw/rbac/menuListBySystemTypeAndOpenId', params).then((res: any) => {
  165. if (res && res.statusCode === 0) {
  166. let bizContent = res.data
  167. const menuList = bizContent.menuList || [];
  168. let list = [] as IObject[];
  169. list = treeDataHandle(menuList);
  170. $storeinitData.dispatch('updateMenu', list);
  171. }
  172. })
  173. }
  174. </script>
  175. <style lang="scss" scoped>
  176. .fade-enter-active,
  177. .fade-leave-active {
  178. transition: opacity 0.3s ease;
  179. }
  180. .fade-enter-from,
  181. .fade-leave-to {
  182. opacity: 0;
  183. }
  184. /* 页面样式 */
  185. .el-menu-vertical-demo:not(.el-menu--collapse) {
  186. // width: 250px;
  187. min-width: 240px;
  188. border-width: 0px;
  189. }
  190. .bg-theme {
  191. background-color: $test-color;
  192. }
  193. /* 去除进度条圆角 */
  194. ::v-deep(.el-progress-bar__outer) {
  195. border-radius: 0;
  196. }
  197. ::v-deep(.el-progress-bar__inner) {
  198. border-radius: 0;
  199. }
  200. </style>