Admin.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <template>
  2. <div class="admin">
  3. <div class="home-header">
  4. <div class="head-user menu-list">
  5. <ul>
  6. <li @click="toSelectSchool">
  7. <i class="el-icon-s-home"></i>
  8. <span>切换学校</span>
  9. </li>
  10. <li class="menu-item menu-item-account" @click="toResetPwd">
  11. <i class="icon icon-account"></i>
  12. <span :title="username">{{ username }}</span>
  13. </li>
  14. <li class="menu-item" @click="toLogout">
  15. <i class="icon icon-logout" title="退出登录"></i>
  16. </li>
  17. </ul>
  18. </div>
  19. </div>
  20. <div class="home-navs">
  21. <div class="head-logo">
  22. <div class="head-logo-content">
  23. <h1>知学知考</h1>
  24. </div>
  25. </div>
  26. <el-menu
  27. class="el-menu-home"
  28. active-text-color="#705eff"
  29. text-color="#383b4a"
  30. router
  31. :default-active="curRouteName"
  32. :default-openeds="curSubMenuNames"
  33. >
  34. <el-submenu
  35. v-for="submenu in menus"
  36. :key="submenu.url"
  37. :index="submenu.url"
  38. >
  39. <template slot="title">
  40. <span>{{ submenu.name }}</span>
  41. </template>
  42. <el-menu-item
  43. v-for="nav in submenu.children"
  44. :key="nav.url"
  45. :index="nav.url"
  46. :route="{ name: nav.url }"
  47. >
  48. <span>{{ nav.name }}</span>
  49. </el-menu-item>
  50. </el-submenu>
  51. </el-menu>
  52. </div>
  53. <div class="home-body">
  54. <div class="home-main">
  55. <div class="home-breadcrumb" v-if="breadcrumbs.length">
  56. <span class="breadcrumb-tips">
  57. <i class="icon icon-location"></i>
  58. <span>当前所在位置:</span>
  59. </span>
  60. <el-breadcrumb separator="/">
  61. <el-breadcrumb-item
  62. v-for="(bread, index) in breadcrumbs"
  63. :key="index"
  64. >{{ bread.name }}</el-breadcrumb-item
  65. >
  66. </el-breadcrumb>
  67. </div>
  68. <!-- home-view: page detail -->
  69. <div class="home-view">
  70. <router-view />
  71. </div>
  72. </div>
  73. </div>
  74. <!-- 修改密码 -->
  75. <reset-pwd
  76. ref="ResetPwd"
  77. :user-info="userInfo"
  78. @modified="resetPwdModified"
  79. ></reset-pwd>
  80. </div>
  81. </template>
  82. <script>
  83. import localNavs from "@/constants/adminNavs";
  84. import { SYS_ADMIN_NAME } from "@/constants/enumerate";
  85. import { logout } from "@/modules/login/api";
  86. import ResetPwd from "../../base/components/ResetPwd";
  87. export default {
  88. name: "home",
  89. components: { ResetPwd },
  90. data() {
  91. const user = this.$ls.get("user", { id: "", realName: "", roleList: [] });
  92. return {
  93. menus: [],
  94. privileges: [],
  95. curRouteName: "",
  96. curSubMenuNames: [],
  97. breadcrumbs: [],
  98. username: user.realName,
  99. userInfo: {
  100. pwdCount: 0,
  101. mobileNumber: 1,
  102. userId: user.id
  103. }
  104. };
  105. },
  106. watch: {
  107. $route(val) {
  108. if (val.name === "Admin") return;
  109. this.actCurNav();
  110. }
  111. },
  112. created() {
  113. const loginName = this.$ls.get("user", { loginName: "" }).loginName;
  114. if (loginName !== SYS_ADMIN_NAME) {
  115. this.$message.error("非法操作!");
  116. this.$router.replace({ name: "Login" });
  117. return;
  118. }
  119. if (this.$route.name === "Admin") {
  120. this.$router.replace({
  121. name: "AdminUserManage"
  122. });
  123. }
  124. this.initData();
  125. },
  126. methods: {
  127. initData() {
  128. this.privileges = localNavs;
  129. this.menus = this.getMenu();
  130. this.curSubMenuNames = this.menus.map(item => item.url);
  131. if (this.$route.name === "Admin") {
  132. const firstRouteName = this.getFirstRouter();
  133. this.$router.replace({
  134. name: firstRouteName
  135. });
  136. return;
  137. }
  138. this.actCurNav();
  139. },
  140. getFirstRouter() {
  141. let childNavs = this.privileges;
  142. let firstRouteName = "";
  143. while (childNavs.length) {
  144. firstRouteName = childNavs[0].url;
  145. childNavs = this.privileges.filter(
  146. item => item.parentId === childNavs[0].id
  147. );
  148. }
  149. return firstRouteName;
  150. },
  151. getMenu() {
  152. let menus = this.privileges.filter(item => item.parentId === "-1");
  153. const toTree = menus => {
  154. menus.forEach(menu => {
  155. const children = this.privileges.filter(
  156. item => item.parentId === menu.id
  157. );
  158. if (children.length) {
  159. menu.children = children;
  160. toTree(menu.children);
  161. }
  162. });
  163. };
  164. toTree(menus);
  165. return menus;
  166. },
  167. actCurNav() {
  168. this.curRouteName = this.$route.name;
  169. let breadcrumbs = [];
  170. let curBreadcrumb = this.privileges.find(
  171. item => item.url === this.curRouteName
  172. );
  173. breadcrumbs.push({ ...curBreadcrumb });
  174. while (curBreadcrumb && curBreadcrumb.parentId !== "-1") {
  175. curBreadcrumb = this.privileges.find(
  176. item => item.id === curBreadcrumb.parentId
  177. );
  178. if (curBreadcrumb) breadcrumbs.unshift({ ...curBreadcrumb });
  179. }
  180. this.breadcrumbs = breadcrumbs;
  181. },
  182. toLogout() {
  183. this.$confirm("确定要退出登录吗?", "提示", {
  184. type: "warning"
  185. })
  186. .then(() => {
  187. this.logoutAction();
  188. })
  189. .catch(() => {});
  190. },
  191. async logoutAction() {
  192. await logout();
  193. this.$ls.clear();
  194. this.$router.push({ name: "Login" });
  195. },
  196. toSelectSchool() {
  197. this.$router.push({ name: "SelectSchool" });
  198. },
  199. toResetPwd() {
  200. this.$refs.ResetPwd.open();
  201. },
  202. resetPwdModified() {
  203. this.logoutAction();
  204. }
  205. }
  206. };
  207. </script>