PageHeader.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <div class="page-header">
  3. <div id="page-header-logo" class="page-logo">
  4. <a @click="toIndex">
  5. <img src="@/assets/logo.png" alt="logo" class="logo-default" />
  6. </a>
  7. <div class="menu-toggler sidebar-toggler" @click.stop="toggleSidebar">
  8. <span>
  9. <i class="el-icon-fa-bars"></i>
  10. </span>
  11. </div>
  12. </div>
  13. <div id="page-header-data-menu" class="data-menu">
  14. <el-select v-model="selectedProjectId" placeholder="请选择" filterable>
  15. <el-option-group
  16. v-for="group in projectGropList"
  17. :key="group.label"
  18. :label="group.label"
  19. >
  20. <el-option
  21. v-for="item in group.options"
  22. :key="item.id"
  23. :label="item.name"
  24. :value="item.id"
  25. ></el-option>
  26. </el-option-group>
  27. </el-select>
  28. </div>
  29. <div id="page-header-user-menu" class="user-menu">
  30. <!-- <span class='el-dropdown-link' style="margin-top: 11px;">
  31. {{userInfo.userName}}
  32. <i class='el-icon-fa-user el-icon--right'></i>
  33. </span> -->
  34. <el-dropdown
  35. trigger="hover"
  36. class="user-menu-dropdown"
  37. @command="userMenuCommand"
  38. >
  39. <span class="el-dropdown-link">
  40. {{ userInfo.userName }}
  41. <i class="el-icon-fa-user el-icon&#45;&#45;right"></i>
  42. </span>
  43. <el-dropdown-menu slot="dropdown">
  44. <el-dropdown-item icon="el-icon-switch-button" command="logout"
  45. >退出登录</el-dropdown-item
  46. >
  47. <!-- <el-dropdown-item icon="el-icon-circle-plus" command="changePass"
  48. >修改密码</el-dropdown-item
  49. > -->
  50. </el-dropdown-menu>
  51. </el-dropdown>
  52. <ul class="header-nav">
  53. <li class="header-nav-set">
  54. <!-- <router-link to="/ready/collectsetting"><i class="el-icon-s-tools"></i></router-link> -->
  55. <a @click.ctrl="$router.push({ path: '/ready/collectsetting' })"
  56. ><i class="el-icon-s-tools"></i
  57. ></a>
  58. </li>
  59. <li class="header-nav-Splitscreen">
  60. <a href="/adm/splitScreen" target="_blank"
  61. ><i class="el-icon-s-platform"></i
  62. ></a>
  63. </li>
  64. <li class="header-nav-notification">
  65. <message-sever></message-sever>
  66. </li>
  67. </ul>
  68. </div>
  69. <change-pass ref="changePass"></change-pass>
  70. </div>
  71. </template>
  72. <script>
  73. import frameworkApi from "@/api/framework";
  74. import { mapGetters, mapMutations } from "vuex";
  75. import getFirstLetter from "@/utils/getFirstLetter";
  76. import MessageSever from "../components/messagesever/index";
  77. import changePass from "../components/changepass/index";
  78. import lStorage from "@/utils/localStorage";
  79. import Bus from "@/utils/bus.js";
  80. import store from "@/store";
  81. import storage from "@/framework/utils/storage";
  82. export default {
  83. name: "PageHeader",
  84. components: {
  85. MessageSever,
  86. changePass,
  87. },
  88. props: [],
  89. data() {
  90. return {
  91. selectedProjectId: null,
  92. };
  93. },
  94. computed: {
  95. ...mapGetters("layout", [
  96. "sidebarClosed",
  97. "userInfo",
  98. "projects",
  99. "projectId",
  100. ]),
  101. projectGropList() {
  102. const cacheInfo = lStorage.get("historyInfo")
  103. ? lStorage.get("historyInfo")
  104. : {};
  105. let options = [
  106. {
  107. label: "最近使用",
  108. options: [],
  109. },
  110. ];
  111. const projectHistory = cacheInfo[this.userInfo.userName] || [];
  112. let copyProjects = JSON.parse(JSON.stringify(this.projects));
  113. options[0].options = projectHistory.map((projectId) => {
  114. let obj = this.projects.find((project) => {
  115. return project.id === projectId;
  116. });
  117. let index = copyProjects.findIndex((project) => {
  118. return project.id === projectId;
  119. });
  120. if (index != -1) {
  121. copyProjects.splice(index, 1);
  122. }
  123. return obj ? obj : [];
  124. });
  125. let helpObj = {};
  126. copyProjects.forEach((p) => {
  127. const label = getFirstLetter((p.name || p.id).slice(0, 1));
  128. if (helpObj[label]) {
  129. helpObj[label].push(p);
  130. } else {
  131. helpObj[label] = [p];
  132. }
  133. });
  134. const arr = Object.keys(helpObj)
  135. .sort()
  136. .map((label) => {
  137. return {
  138. label: label,
  139. options: helpObj[label],
  140. };
  141. });
  142. return [...(options[0].options.length > 0 ? options : []), ...arr];
  143. },
  144. },
  145. created() {
  146. Bus.$on("initProjectId", () => {
  147. console.log("initProjectId", this.projects);
  148. this.init();
  149. });
  150. this.init();
  151. },
  152. methods: {
  153. ...mapMutations("layout", ["setSidebarClosed", "setprojectId"]),
  154. init() {
  155. let cacheInfo = lStorage.get("historyInfo")
  156. ? lStorage.get("historyInfo")
  157. : {};
  158. if (
  159. cacheInfo[this.userInfo.userName] &&
  160. cacheInfo[this.userInfo.userName][0] &&
  161. this.projects.some((item) => {
  162. return item.id == cacheInfo[this.userInfo.userName][0];
  163. })
  164. ) {
  165. this.selectedProjectId = cacheInfo[this.userInfo.userName][0];
  166. } else {
  167. this.selectedProjectId = this.projectId;
  168. }
  169. },
  170. handleSelect() {},
  171. toggleSidebar() {
  172. this.setSidebarClosed(!this.sidebarClosed);
  173. },
  174. userMenuCommand(cmd) {
  175. // console.log('userMenuCommand ', cmd)
  176. if (cmd == "logout") {
  177. console.log("点击登出l");
  178. // frameworkApi.toLogout();
  179. /**
  180. * 改为本地退出
  181. */
  182. store.commit("setSsoToken", null);
  183. lStorage.remove("ssoToken");
  184. store.commit("layout/setprojectId", null);
  185. lStorage.remove("projectId");
  186. store.commit("layout/setUserInfo", null);
  187. storage.remove("user_name");
  188. store.commit("layout/setGroupCode", null);
  189. lStorage.remove("group_code");
  190. // store.state.layout.projectId = null;
  191. // lStorage.remove("projectId");
  192. // store.state.layout.userInfo = null;
  193. // storage.remove("user_name");
  194. // store.state.layout.group_code = null;
  195. // lStorage.remove("group_code");
  196. store.commit("layout/setUserId", "");
  197. this.$router.replace({ path: "/login" });
  198. } else if (cmd == "changePass") {
  199. this.$refs.changePass.handleOpenDialog();
  200. }
  201. },
  202. toIndex() {
  203. this.$router.push("/");
  204. },
  205. },
  206. watch: {
  207. selectedProjectId(n, o) {
  208. this.setprojectId(n);
  209. },
  210. },
  211. };
  212. </script>
  213. <style lang="scss" scoped>
  214. .header-nav-set > a {
  215. display: flex;
  216. width: 100%;
  217. height: 100%;
  218. position: relative;
  219. padding: 16px 10px 10px;
  220. -webkit-box-sizing: border-box;
  221. box-sizing: border-box;
  222. color: #2b3643;
  223. font-size: 24px;
  224. text-decoration: none;
  225. cursor: pointer;
  226. i {
  227. transition: all 0ms ease 0ms;
  228. }
  229. }
  230. .header-nav-Splitscreen > a {
  231. display: flex;
  232. width: 100%;
  233. height: 100%;
  234. position: relative;
  235. padding: 16px 10px 10px;
  236. -webkit-box-sizing: border-box;
  237. box-sizing: border-box;
  238. color: #79869a;
  239. font-size: 24px;
  240. text-decoration: none;
  241. cursor: pointer;
  242. i {
  243. transition: all 0ms ease 0ms;
  244. }
  245. }
  246. .header-nav-Splitscreen > a:hover {
  247. text-decoration: none;
  248. color: #d3d8e2;
  249. background-color: #3f4f62;
  250. }
  251. </style>