Elizabeth's proactive approach involves introducing urinal toilet attachment , an ingenious concept that optimizes space and functionality.

Navbar.vue 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. <template>
  2. <div class="top-nav">
  3. <!-- <div class="nav-logo">
  4. <img :src="require(`../../../assets/logo/logo.png`)" alt="">
  5. </div>
  6. <el-menu class="navbar" mode="horizontal">
  7. <div>
  8. <span> {{this.$store.getters.xt_user.org.org_name}}
  9. </span>
  10. </div>
  11. <div class="system-nav">
  12. <div class="system-nav-menu active">
  13. <a>
  14. <span><i class="icon iconfont icon-jiankangshuidi"></i> 血透管理</span>
  15. </a>
  16. </div>
  17. <div class="system-nav-menu" v-if="this.$store.getters.xt_user.cdm_role_exist">
  18. <a :href="CDMWebsit()">
  19. <span><i class="icon iconfont icon-manbing-xuanzhong"></i> 慢病管理</span>
  20. </a>
  21. </div>
  22. <div class="system-nav-menu" v-if="this.$store.getters.xt_user.scrm_role_exist">
  23. <a :href="SCRMWebsit()">
  24. <span><i class="iconfont icon-pengyou"></i> SCRM</span>
  25. </a>
  26. </div>
  27. <div class="system-nav-menu" v-if="this.$store.getters.xt_user.mall_role_exist">
  28. <a :href="MircoMallWebsit()">
  29. <span><i class="icon iconfont icon-service_fill"></i> 微商城</span>
  30. </a>
  31. </div>
  32. <div class="system-nav-menu">
  33. <a :href="APPManageWebsit()">
  34. <span><i class="icon iconfont icon-suoyou"></i> 应用</span>
  35. </a>
  36. </div>
  37. </div>
  38. <div class="right-menu">
  39. <el-dropdown class="avatar-container right-menu-item" trigger="click" @command="handleCommand">
  40. <div class="avatar-wrapper">
  41. <img class="user-avatar" :src="avater">
  42. <span class="user-title">{{ this.$store.getters.xt_user.user.user_name }}</span>
  43. <i class="el-icon-caret-bottom"></i>
  44. </div>
  45. <el-dropdown-menu slot="dropdown">
  46. <el-dropdown-item command="modifyUserInfoAction">
  47. 个人信息
  48. </el-dropdown-item>
  49. <el-dropdown-item command="modifyOrgInfoAction">
  50. 机构信息
  51. </el-dropdown-item>
  52. <el-dropdown-item divided command="logout">
  53. {{$t('navbar.logOut')}}
  54. </el-dropdown-item>
  55. </el-dropdown-menu>
  56. </el-dropdown>
  57. <modify-user-info-dialog ref="modify_user_info_dialog"></modify-user-info-dialog>
  58. <modify-org-info-dialog ref="modify_org_info_dialog"></modify-org-info-dialog>
  59. </div>
  60. </el-menu>-->
  61. <div style="display:flex;align-items: center;">
  62. <div class="nav-logo">
  63. <img :src="require(`../../../assets/logo/logo2.png`)" alt="">
  64. </div>
  65. <div class="dropdownBox">
  66. <el-dropdown trigger="click" @command="handleOrgCommand">
  67. <span class="el-dropdown-link">
  68. {{ org_name }}
  69. <i class="el-icon-arrow-down el-icon--right"></i>
  70. </span>
  71. <el-dropdown-menu slot="dropdown">
  72. <el-dropdown-item
  73. v-for="(item, index) in orgs"
  74. :key="index"
  75. :command="item.id"
  76. >{{ item.org_name }}</el-dropdown-item
  77. >
  78. </el-dropdown-menu>
  79. </el-dropdown>
  80. </div>
  81. </div>
  82. <div class="navRight">
  83. <!-- <el-input placeholder="搜索患者透析号/姓名/首拼" prefix-icon="el-icon-search" v-model="input2"></el-input>
  84. <div style="color: #b2b2b3;">通知中心</div> -->
  85. <div class="right-menu">
  86. <el-dropdown
  87. class="avatar-container right-menu-item"
  88. trigger="click"
  89. @command="handleCommand"
  90. >
  91. <div class="avatar-wrapper">
  92. <img class="user-avatar" :src="avater" />
  93. <span class="user-title">{{
  94. this.$store.getters.xt_user.user.user_name
  95. }}</span>
  96. <i class="el-icon-caret-bottom"></i>
  97. </div>
  98. <el-dropdown-menu slot="dropdown">
  99. <el-dropdown-item command="modifyUserInfoAction"
  100. >个人信息</el-dropdown-item
  101. >
  102. <el-dropdown-item
  103. command="modifyOrgInfoAction"
  104. v-if="is_super_admin === 1"
  105. >机构信息</el-dropdown-item
  106. >
  107. <el-dropdown-item divided command="logout">{{
  108. $t("navbar.logOut")
  109. }}</el-dropdown-item>
  110. </el-dropdown-menu>
  111. </el-dropdown>
  112. <modify-user-info-dialog
  113. ref="modify_user_info_dialog"
  114. ></modify-user-info-dialog>
  115. <modify-org-info-dialog
  116. ref="modify_org_info_dialog"
  117. ></modify-org-info-dialog>
  118. </div>
  119. <div>
  120. <i class="el-icon-question"></i>
  121. <a href="https://sso.kuyicloud.com/help" target="_blank">帮助中心</a>
  122. </div>
  123. </div>
  124. </div>
  125. </template>
  126. <script>
  127. import axios from 'axios'
  128. import { mapGetters } from "vuex";
  129. // import Breadcrumb from "@/components/Breadcrumb";
  130. // import Hamburger from "@/components/Hamburger";
  131. import Screenfull from "@/components/Screenfull";
  132. import ModifyUserInfoDialog from "@/xt_pages/home/modify_user_info_dialog";
  133. import ModifyOrgInfoDialog from "@/xt_pages/home/modifyOrgInfoDialog";
  134. import { getFiledConfigList, setFiledConfigList } from "@/utils/data_config"; // getConfigList from sessionStorage
  135. import {
  136. getAdminUserInfoCache,
  137. cacheAdminUserInfo,
  138. removeAdminUserInfoCache
  139. } from "@/utils/admin_info_cache";
  140. import { getOrgs, changeOrg } from "@/api/config";
  141. export default {
  142. inject: ["reload"],
  143. data() {
  144. return {
  145. orgs: [],
  146. org_id: this.$store.getters.xt_user.org.id,
  147. org_name: this.$store.getters.xt_user.org.org_name,
  148. is_super_admin: 0
  149. // scrm_role_exist: $store.getters.xt_user.scrm_role_exist
  150. };
  151. },
  152. components: {
  153. Screenfull,
  154. ModifyUserInfoDialog,
  155. ModifyOrgInfoDialog
  156. },
  157. computed: {
  158. ...mapGetters(["sidebar"]),
  159. avater: function() {
  160. var avatar = this.$store.getters.xt_user.user.avatar;
  161. return avatar.length > 0
  162. ? avatar
  163. : require("../../../assets/home/userData.png");
  164. },
  165. websocket() {
  166. return this.$store.state.user.websocket;
  167. }
  168. },
  169. methods: {
  170. handleOrgCommand(org_id) {
  171. let params = {
  172. org_id: org_id
  173. };
  174. changeOrg(params)
  175. .then(response => {
  176. if (response.data.state === 1) {
  177. // window.location.reload()
  178. this.$message.success("切换成功");
  179. let data = response.data.data;
  180. this.org_id = data.org.id;
  181. this.org_name = data.org.org_name;
  182. // this.$store.dispatch("ModifyAdminUserOrgInfo", {
  183. // user: data.user,
  184. // cur_org_id: data.current_org_id,
  185. // cur_app_id: data.current_app_id,
  186. // org: data.org,
  187. // subscibe: data.subscibe,
  188. // template_info: data.template_info,
  189. // scrm_role_exist: data.scrm_role_exist,
  190. // cdm_role_exist: data.cdm_role_exist,
  191. // mall_role_exist: data.mall_role_exist
  192. // });
  193. //
  194. // this.$store.dispatch("ModifyUrlInfo", {
  195. // urlfors: data.urlfors
  196. // });
  197. //
  198. // this.$store.dispatch("ModifyFiled", {
  199. // fileds: data.fileds
  200. // });
  201. // setFiledConfigList(JSON.stringify(data.fileds));
  202. // cacheAdminUserInfo(JSON.stringify(data));
  203. window.location.reload();
  204. // this.$store
  205. // .dispatch(
  206. // "xt_GenerateRoutes",
  207. // this.$store.getters.current_role_urls
  208. // )
  209. // .then(() => {
  210. // this.$store.dispatch("VerifyConfigList").then(() => {
  211. // // alert('token 验证成功')
  212. // // console.log(this.$store.getters.xt_permission.addRouters)
  213. // this.$router.addRoutes(
  214. // this.$store.getters.xt_permission.addRouters
  215. // ); // 动态添加可访问路由表
  216. // // next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
  217. // // this.$router.replace({ path: '/' })
  218. // // this.$router.go(0)
  219. // // this.reload()
  220. // });
  221. // });
  222. } else {
  223. this.$message.success(response.data.msg);
  224. }
  225. })
  226. .catch(e => {
  227. // this.$message.success("网络异常")
  228. });
  229. },
  230. handleCommand(command) {
  231. switch (command) {
  232. case "modifyUserInfoAction":
  233. this.modifyUserInfoAction();
  234. break;
  235. case "modifyOrgInfoAction":
  236. this.modifyOrgInfoAction();
  237. break;
  238. case "logout":
  239. this.logout();
  240. break;
  241. }
  242. },
  243. logout() {
  244. this.$store.dispatch("FrontendLogout");
  245. window.location.href = process.env.BASE_API + "/logout";
  246. },
  247. modifyOrgInfoAction() {
  248. // this.$refs.modify_org_info_dialog.show()
  249. this.$router.push("/orginfo");
  250. return false;
  251. },
  252. modifyUserInfoAction() {
  253. this.$refs.modify_user_info_dialog.show();
  254. },
  255. myServe() {
  256. this.$router.push("/service");
  257. return false;
  258. },
  259. SCRMWebsit() {
  260. return process.env.SRCM_HOST;
  261. },
  262. MircoMallWebsit() {
  263. return process.env.MIRCO_MALL_HOST;
  264. },
  265. CDMWebsit() {
  266. return process.env.CDM_HOST;
  267. },
  268. APPManageWebsit() {
  269. return (
  270. process.env.SSO_HOST +
  271. "/org/admin/apps?org=" +
  272. this.$store.getters.xt_user.org_id
  273. );
  274. },
  275. getToken(orgId,adminUserId){
  276. axios.get('/api/index/gettoken/'+ orgId + '/'+ adminUserId
  277. ).then((res) => {
  278. console.log('res',res.data)
  279. if(res.data.code == 0){
  280. let token = res.data.data.token
  281. localStorage.setItem("token",token)
  282. let http = 'wss://socket.sgjyun.com?token='
  283. // let http = 'ws://socket.szjkhd.com?token='//测试
  284. console.log(this.$store.state.user.websocket)
  285. this.$store.state.user.websocket = new ReconnectingWebSocket(
  286. http + token
  287. );
  288. this.$store.state.user.websocket.timeoutInterval = 3000;
  289. setInterval(() => {
  290. if (navigator.onLine == false) {
  291. this.showWsErr = true;
  292. this.wsErrMsg = "网络已断开,请检查网络后重新打开页面";
  293. console.log('navigator',navigator)
  294. } else if (
  295. navigator.onLine == true &&
  296. this.websocket.readyState == 1
  297. ) {
  298. this.showWsErr = false;
  299. }
  300. this.websocket.send("1");
  301. }, 55000);
  302. }
  303. }).catch(error => {
  304. // window.location.href = error.response.data.redirect;
  305. });
  306. }
  307. },
  308. created() {
  309. getOrgs().then(response => {
  310. if (response.data.state === 1) {
  311. this.orgs = response.data.data.orgs;
  312. console.log("org", this.orgs);
  313. var creator = response.data.data.creator;
  314. console.log("creator", creator);
  315. var admin = response.data.data.admin;
  316. console.log("admin", admin);
  317. this.is_super_admin = admin.is_super_admin;
  318. for (let i = 0; i < this.orgs.length; i++) {
  319. if (this.orgs[i].id == this.org_id) {
  320. this.org_name = this.orgs[i].org_name;
  321. }
  322. }
  323. localStorage.setItem("org_id",creator.org_id);
  324. sessionStorage.setItem("org_id",creator.org_id);
  325. sessionStorage.setItem("admin_user_id",creator.admin_user_id);
  326. this.getToken(creator.org_id,creator.admin_user_id)
  327. }
  328. });
  329. },
  330. };
  331. </script>
  332. <style rel="stylesheet/scss" lang="scss" scoped>
  333. .top-nav {
  334. background: #fff;
  335. position: fixed;
  336. top: 0;
  337. left: 0px;
  338. right: 0;
  339. z-index: 1000;
  340. height: 50px;
  341. display: flex;
  342. align-items: center;
  343. justify-content: space-between;
  344. color: #000;
  345. .dropdownBox {
  346. margin-left: 10px;
  347. }
  348. .navRight {
  349. display: flex;
  350. align-items: center;
  351. justify-content: space-between;
  352. min-width: 200px;
  353. margin-right: 10px;
  354. font-size: 14px;
  355. .right-menu {
  356. float: right;
  357. height: 100%;
  358. z-index: 99999;
  359. color: #000;
  360. & :focus {
  361. outline: none;
  362. }
  363. .right-menu-item {
  364. display: inline-block;
  365. margin: 0 8px;
  366. .iconfont {
  367. font-size: 18px;
  368. }
  369. }
  370. .screenfull {
  371. height: 20px;
  372. }
  373. .international {
  374. vertical-align: top;
  375. }
  376. .theme-switch {
  377. vertical-align: 15px;
  378. }
  379. .avatar-container {
  380. margin-right: 10px;
  381. .avatar-wrapper {
  382. cursor: pointer;
  383. margin-top: 3px;
  384. display: flex;
  385. align-items: center;
  386. justify-content: center;
  387. .user-avatar {
  388. width: 40px;
  389. height: 40px;
  390. border-radius: 50%;
  391. object-fit: cover;
  392. object-position: center;
  393. }
  394. .user-title {
  395. margin: 0 8px;
  396. font-size: 14px;
  397. color: #000;
  398. }
  399. .el-icon-caret-bottom {
  400. font-size: 12px;
  401. color: #000;
  402. }
  403. }
  404. }
  405. }
  406. }
  407. .nav-logo {
  408. width: 140px;
  409. display: flex;
  410. align-items: center;
  411. // height: 60px;
  412. text-align: center;
  413. justify-content: center;
  414. // padding: 10px 0;
  415. box-sizing: border-box;
  416. float: left;
  417. img {
  418. display: inline-block;
  419. width: 100px;
  420. }
  421. }
  422. .navbar {
  423. border-radius: 0px !important;
  424. display: flex;
  425. justify-content: space-between;
  426. width: calc(100% - 180px);
  427. align-items: center;
  428. color: #fff;
  429. border: none;
  430. background: #409eff;
  431. float: left;
  432. .breadcrumb-container {
  433. float: left;
  434. }
  435. .errLog-container {
  436. display: inline-block;
  437. vertical-align: top;
  438. }
  439. .right-menu {
  440. float: right;
  441. height: 100%;
  442. z-index: 99999;
  443. & :focus {
  444. outline: none;
  445. }
  446. .right-menu-item {
  447. display: inline-block;
  448. margin: 0 8px;
  449. .iconfont {
  450. font-size: 18px;
  451. }
  452. }
  453. .screenfull {
  454. height: 20px;
  455. }
  456. .international {
  457. vertical-align: top;
  458. }
  459. .theme-switch {
  460. vertical-align: 15px;
  461. }
  462. .avatar-container {
  463. margin-right: 10px;
  464. .avatar-wrapper {
  465. cursor: pointer;
  466. margin-top: 3px;
  467. display: flex;
  468. align-items: center;
  469. justify-content: center;
  470. .user-avatar {
  471. width: 40px;
  472. height: 40px;
  473. border-radius: 50%;
  474. object-fit: cover;
  475. object-position: center;
  476. }
  477. .user-title {
  478. margin: 0 8px;
  479. font-size: 14px;
  480. color: #000;
  481. }
  482. .el-icon-caret-bottom {
  483. font-size: 12px;
  484. color: #000;
  485. }
  486. }
  487. }
  488. }
  489. }
  490. .system-nav {
  491. .system-nav-menu {
  492. float: left;
  493. height: 60px;
  494. line-height: 60px;
  495. padding: 0 25px;
  496. a {
  497. font-size: 15px;
  498. .iconfont {
  499. font-size: 18px;
  500. }
  501. }
  502. }
  503. .active {
  504. background: #3090eb;
  505. border-left: 1px #5fabf7 solid;
  506. border-right: 1px #5fabf7 solid;
  507. }
  508. }
  509. .el-menu::after,
  510. .el-menu::before {
  511. width: 1px;
  512. height: 1px;
  513. position: absolute;
  514. top: 0;
  515. left: 0;
  516. }
  517. }
  518. .el-dropdown-menu {
  519. z-index: 9999 !important;
  520. }
  521. .v-modal {
  522. z-index: 9999 !important;
  523. }
  524. </style>
  525. <style lang="scss">
  526. .navRight {
  527. .el-input {
  528. width: 250px;
  529. }
  530. .el-input__inner {
  531. border-radius: 30px;
  532. background: #f5f7fa;
  533. }
  534. }
  535. .dropdownBox {
  536. .el-dropdown-link {
  537. font-size: 14px;
  538. color: #000;
  539. }
  540. }
  541. </style>