Home.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <template>
  2. <div class="home">
  3. <div class="home-header">
  4. <div class="head-logo">
  5. <h1>{{ APP_TITLE }}</h1>
  6. </div>
  7. <div class="head-info">
  8. <el-breadcrumb>
  9. <el-breadcrumb-item :to="{ name: 'Home' }">
  10. <i class="el-icon-s-home" style="margin-top: -4px"></i>
  11. </el-breadcrumb-item>
  12. <el-breadcrumb-item
  13. v-for="(bread, index) in breadcrumbs"
  14. :key="index"
  15. >{{ bread.name }}</el-breadcrumb-item
  16. >
  17. </el-breadcrumb>
  18. </div>
  19. <div class="head-user">
  20. <span class="user-item user-name" :title="username" @click="toResetPwd">
  21. <i class="el-icon-user-solid"></i>
  22. <span>{{ username }}</span>
  23. </span>
  24. <span class="user-item user-logout" title="退出登录" @click="logout">
  25. <i class="el-icon-switch-button"></i>
  26. </span>
  27. </div>
  28. </div>
  29. <div class="home-navs">
  30. <el-menu
  31. v-if="menus && menus.length"
  32. class="el-menu-home"
  33. active-text-color="#3a5ae5"
  34. text-color="#434656"
  35. router
  36. :default-active="curRouteName"
  37. :collapse="false"
  38. >
  39. <template v-for="submenu in menus">
  40. <el-submenu
  41. v-if="submenu.children && submenu.children.length"
  42. :key="submenu.id"
  43. :index="submenu.url"
  44. >
  45. <span slot="title">{{ submenu.name }}</span>
  46. <el-menu-item
  47. v-for="nav in submenu.children"
  48. :key="nav.id"
  49. :index="nav.url"
  50. :route="{ name: nav.url }"
  51. >
  52. <span>{{ nav.name }}</span>
  53. </el-menu-item>
  54. </el-submenu>
  55. <el-menu-item
  56. v-else
  57. :key="submenu.id"
  58. :index="submenu.url"
  59. :route="{ name: submenu.url }"
  60. >
  61. <span>{{ submenu.name }}</span>
  62. </el-menu-item>
  63. </template>
  64. </el-menu>
  65. </div>
  66. <div class="home-body">
  67. <div class="home-main">
  68. <router-view />
  69. <view-footer></view-footer>
  70. </div>
  71. </div>
  72. <!-- ResetPwd -->
  73. <reset-pwd ref="ResetPwd" @modified="logout"></reset-pwd>
  74. </div>
  75. </template>
  76. <script>
  77. import { navs } from "@/constants/navs";
  78. import { APP_TITLE } from "@/constants/app";
  79. import ResetPwd from "../modules/admin/user/ResetPwd";
  80. export default {
  81. name: "home",
  82. components: { ResetPwd },
  83. data() {
  84. const user = this.$ls.get("user", { id: "", name: "", role: [] });
  85. return {
  86. APP_TITLE,
  87. navs,
  88. privileges: [],
  89. menus: [],
  90. curRouteName: "",
  91. validRoutes: [],
  92. username: user.name,
  93. userRoles: user.role,
  94. curMain: 0,
  95. curSub: "",
  96. breadcrumbs: [],
  97. };
  98. },
  99. watch: {
  100. $route(val) {
  101. if (val.name === "Home") return;
  102. this.updateBreadcrumbs();
  103. },
  104. },
  105. created() {
  106. this.initData();
  107. },
  108. methods: {
  109. initData() {
  110. this.menus = this.getMenu();
  111. this.privileges = this.getPrivileges();
  112. if (this.$route.name === "Home") {
  113. // console.log(this.getMenuFirstRouter());
  114. this.$router.replace({ name: this.getMenuFirstRouter() });
  115. return;
  116. }
  117. if (!this.validRoutes.includes(this.$route.name)) {
  118. this.$router.replace({
  119. name: "404",
  120. });
  121. return;
  122. }
  123. this.updateBreadcrumbs();
  124. },
  125. getMenuFirstRouter() {
  126. let firstRouteName = "";
  127. let menu = this.menus[0];
  128. while (menu) {
  129. firstRouteName = menu.url;
  130. menu = menu.children && menu.children[0];
  131. }
  132. return firstRouteName;
  133. },
  134. getMenu() {
  135. const privilegeMap = this.$store.state.privilegeMap;
  136. const getChildren = (id) => {
  137. return navs
  138. .filter(
  139. (item) =>
  140. item.parentId === id &&
  141. (!item.privilege ||
  142. (item.privilege && privilegeMap[item.privilege]))
  143. )
  144. .map((item) => {
  145. return { ...item };
  146. });
  147. };
  148. let menus = getChildren("-1");
  149. let validRoutes = [];
  150. const toTree = (menus) => {
  151. menus.forEach((menu) => {
  152. const children = getChildren(menu.id);
  153. if (children.length) {
  154. menu.children = children;
  155. toTree(menu.children);
  156. } else {
  157. validRoutes.push(menu.url);
  158. }
  159. });
  160. };
  161. toTree(menus);
  162. this.validRoutes = validRoutes;
  163. // console.log(JSON.stringify(menus));
  164. return menus;
  165. },
  166. getPrivileges() {
  167. let privileges = [];
  168. const listTree = (dataList) => {
  169. dataList.forEach((item) => {
  170. privileges.push({
  171. id: item.id,
  172. name: item.name,
  173. parentId: item.parentId,
  174. url: item.url,
  175. });
  176. if (item.children && item.children.length) {
  177. listTree(item.children);
  178. }
  179. });
  180. };
  181. listTree(this.menus);
  182. return privileges;
  183. },
  184. updateBreadcrumbs() {
  185. this.curRouteName = this.$route.name;
  186. let breadcrumbs = [];
  187. let curBreadcrumb = this.privileges.find(
  188. (item) => item.url === this.curRouteName
  189. );
  190. breadcrumbs.push({ ...curBreadcrumb });
  191. while (curBreadcrumb && curBreadcrumb.parentId !== "-1") {
  192. curBreadcrumb = this.privileges.find(
  193. (item) => item.id === curBreadcrumb.parentId
  194. );
  195. if (curBreadcrumb) breadcrumbs.unshift({ ...curBreadcrumb });
  196. }
  197. this.breadcrumbs = breadcrumbs;
  198. },
  199. toPage(mainIndex, subIndex) {
  200. const item = this.navs[mainIndex];
  201. const elem = item.children[subIndex];
  202. this.breadcrumbs = [
  203. { title: item.title, router: item.router },
  204. { title: elem.title, router: elem.router },
  205. ];
  206. this.curMain = mainIndex;
  207. this.curSub = mainIndex + "-" + subIndex;
  208. this.$router.push({
  209. name: elem.router,
  210. });
  211. },
  212. logout() {
  213. this.$ls.clear();
  214. this.$router.push({ name: "Login" });
  215. },
  216. toResetPwd() {
  217. this.$refs.ResetPwd.open();
  218. },
  219. },
  220. };
  221. </script>