index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. <template>
  2. <div class="winseaview-top" id="winseaview-top">
  3. <div class="top-bar__left">
  4. <!-- 伸缩icon -->
  5. <div
  6. class="winseaview-breadcrumb"
  7. :class="[{ 'winseaview-breadcrumb--active': isCollapse }]"
  8. >
  9. <i class="iconfont iconasideShowy" @click="setCollapse"></i>
  10. </div>
  11. <!-- </div>
  12. <div class="top-bar__title"> -->
  13. <!-- 面包屑 -->
  14. <div class="top-bar__item top-bar__item--show">
  15. <top-menu v-if="showMenu"></top-menu>
  16. <bread-crumb v-if="!showMenu" />
  17. <smallTips v-if="showTooltip" />
  18. </div>
  19. <span class="top-bar__item" v-if="showSearch">
  20. <top-search></top-search>
  21. </span>
  22. </div>
  23. <div class="top-bar__right">
  24. <!-- 使用租户 -->
  25. <div v-if="getDay" class="right-menu-item hover-effect dayClass">
  26. {{ $t('common.trialDays') }}
  27. <span style="padding: 0 2px">{{ getDay }}</span
  28. >{{ $t('common.days') }}
  29. </div>
  30. <el-tooltip
  31. v-if="showColor"
  32. effect="dark"
  33. :content="$t('navbar.color')"
  34. placement="bottom"
  35. >
  36. <div class="top-bar__item">
  37. <top-color></top-color>
  38. </div>
  39. </el-tooltip>
  40. <el-tooltip
  41. v-if="showTheme"
  42. effect="dark"
  43. :hide-after="1500"
  44. :content="$t('navbar.theme')"
  45. placement="bottom"
  46. >
  47. <div class="top-bar__item top-bar__item--show">
  48. <top-theme></top-theme>
  49. </div>
  50. </el-tooltip>
  51. <!-- <el-tooltip effect="dark"
  52. :content="$t('navbar.language')"
  53. placement="bottom">
  54. <div class="top-bar__item top-bar__item--show">
  55. <top-lang></top-lang>
  56. </div>
  57. </el-tooltip> -->
  58. <el-tooltip
  59. v-if="showFullScren"
  60. effect="dark"
  61. :content="
  62. isFullScren ? $t('navbar.screenfull') : $t('navbar.screenfullF')
  63. "
  64. placement="bottom"
  65. >
  66. <div class="top-bar__item">
  67. <i
  68. :class="isFullScren ? 'el-icon-full-screen' : 'el-icon-full-screen'"
  69. @click="handleScreen"
  70. ></i>
  71. </div>
  72. </el-tooltip>
  73. <img class="top-bar__img" v-lazy="userInfo.avatar" />
  74. <el-dropdown>
  75. <span class="el-dropdown-link">
  76. <span>{{ userInfo.showRoleName }} : {{ userInfo.staffName }}</span>
  77. <i class="el-icon-arrow-down el-icon--right"></i>
  78. </span>
  79. <el-dropdown-menu slot="dropdown">
  80. <el-dropdown-item
  81. icon="el-icon-s-custom"
  82. @click.native="personalFlag = true"
  83. >
  84. {{ $t('navbar.personalInformation') }}
  85. </el-dropdown-item>
  86. <el-dropdown-item
  87. icon="el-icon-s-promotion"
  88. @click.native="passwordFlag = true"
  89. >
  90. {{ $t('navbar.uploadPsw') }}
  91. </el-dropdown-item>
  92. <!-- <el-dropdown-item>
  93. <router-link to="/info/index">{{$t('navbar.userinfo')}}</router-link>
  94. </el-dropdown-item> -->
  95. <el-dropdown-item
  96. v-if="showSetting"
  97. icon="el-icon-s-tools"
  98. @click.native="settingDrawer = true"
  99. >{{ $t('navbar.layoutSetting') }}</el-dropdown-item
  100. >
  101. <el-dropdown-item @click.native="logout" divided>{{
  102. $t('navbar.logOut')
  103. }}</el-dropdown-item>
  104. </el-dropdown-menu>
  105. </el-dropdown>
  106. </div>
  107. <topSetting
  108. v-model="settingDrawer"
  109. @close="() => (settingDrawer = !settingDrawer)"
  110. />
  111. <!--个人信息-->
  112. <WinseaContentModal
  113. v-model="personalFlag"
  114. :title="$t('navbar.personalInformation')"
  115. >
  116. <el-form
  117. ref="personalMsg"
  118. :model="passwordMsg"
  119. label-position="right"
  120. label-width="150px"
  121. >
  122. <el-form-item :label="$t('login.name')" prop="originalPassword">
  123. {{ userInfo.staffName }}
  124. </el-form-item>
  125. <el-form-item :label="$t('login.account')" prop="newPassword">
  126. {{ account }}
  127. </el-form-item>
  128. <el-form-item :label="$t('login.phone')" prop="newPassword">
  129. {{ userInfo.staffMobilePhone }}
  130. </el-form-item>
  131. <el-form-item :label="$t('login.role')" prop="newPassword">
  132. {{ userInfo.showRoleName }}
  133. </el-form-item>
  134. <el-form-item :label="$t('login.dept')" prop="newPassword">
  135. {{ userInfo.deptName }}
  136. </el-form-item>
  137. <el-form-item :label="$t('login.company')" prop="newPassword">
  138. <div class="company-info">
  139. {{ userInfo.compName }}
  140. </div>
  141. </el-form-item>
  142. </el-form>
  143. </WinseaContentModal>
  144. <!--修改密码-->
  145. <WinseaContentModal v-model="passwordFlag" :title="$t('navbar.uploadPsw')">
  146. <el-form
  147. ref="passwordMsg"
  148. :model="passwordMsg"
  149. :label-width="language == 'en' ? '156px' : '100px'"
  150. :rules="passwordMsgRules"
  151. >
  152. <el-form-item
  153. :label="$t('login.originalPassword') + $t('common.colon')"
  154. prop="originalPassword"
  155. >
  156. <ws-input
  157. type="password"
  158. :placeholder="$t('login.message04')"
  159. v-model="passwordMsg.originalPassword"
  160. style="width: 318px"
  161. />
  162. </el-form-item>
  163. <el-form-item
  164. :label="$t('login.newPassword') + $t('common.colon')"
  165. prop="newPassword"
  166. >
  167. <ws-input
  168. type="password"
  169. v-model="passwordMsg.newPassword"
  170. :placeholder="$t('login.verification01')"
  171. style="width: 318px"
  172. />
  173. </el-form-item>
  174. <el-form-item
  175. :label="$t('login.confirmPassword') + $t('common.colon')"
  176. prop="password"
  177. >
  178. <ws-input
  179. type="password"
  180. v-model="passwordMsg.password"
  181. :placeholder="$t('login.verification01')"
  182. style="width: 318px"
  183. />
  184. </el-form-item>
  185. </el-form>
  186. <span slot="footer" class="dialog-footer">
  187. <ws-button @click="passwordFlag = false">{{
  188. $t('showMessage.cancel')
  189. }}</ws-button>
  190. <ws-button type="primary" @click="savePassword('passwordMsg')">{{
  191. $t('showMessage.confirm')
  192. }}</ws-button>
  193. </span>
  194. </WinseaContentModal>
  195. </div>
  196. </template>
  197. <script>
  198. import { changePasswordByPwd } from '@/model/indexRx'
  199. import { mapActions, mapGetters, mapState } from 'vuex'
  200. import { fullscreenToggel, listenfullscreen } from '@/utils/util'
  201. import topMenu from './top-menu'
  202. import topSearch from './top-search'
  203. import topTheme from './top-theme'
  204. import topColor from './top-color'
  205. import topNotice from './top-notice'
  206. import topLang from './top-lang'
  207. import topSetting from './top-setting'
  208. import breadCrumb from '@/components/Breadcrumb'
  209. import { EventBus } from 'base-core-lib'
  210. import { validPassword } from '@/utils/validate'
  211. import smallTips from '@/components/WinseaCom/smallTips'
  212. const validPasswordRule = function (rule, value, callback) {
  213. if (!validPassword(value)) {
  214. callback(new Error(this.$t('login.verification01')))
  215. } else {
  216. callback()
  217. }
  218. }
  219. const validPasswordRule2 = function (rule, value, callback) {
  220. if (!value) {
  221. callback(new Error(this.$t('login.verification02')))
  222. } else if (value !== this.passwordMsg.newPassword) {
  223. callback(new Error(this.$t('login.verification03')))
  224. } else {
  225. callback()
  226. }
  227. }
  228. export default {
  229. components: {
  230. topMenu,
  231. topSearch,
  232. topTheme,
  233. topColor,
  234. topNotice,
  235. topLang,
  236. topSetting,
  237. breadCrumb,
  238. smallTips,
  239. },
  240. name: 'top',
  241. data() {
  242. return {
  243. showList: [
  244. 'maintenancePlanList',
  245. 'maintenanceReportList',
  246. 'navigationMaterialList',
  247. 'protectionEntry',
  248. 'protection',
  249. 'newlyIncreased',
  250. 'clientEdit',
  251. 'staticDetail',
  252. 'maApplicationAdd',
  253. 'maApplicationEdit',
  254. 'maApplicationLabel',
  255. 'monthContrastList',
  256. ],
  257. settingDrawer: false,
  258. personalFlag: false,
  259. passwordFlag: false,
  260. passwordMsgRules: {
  261. originalPassword: [{ required: true, message: ' ', trigger: 'blur' }],
  262. newPassword: [
  263. {
  264. required: true,
  265. trigger: 'blur',
  266. validator: validPasswordRule.bind(this),
  267. },
  268. ],
  269. password: [
  270. {
  271. required: true,
  272. trigger: 'blur',
  273. validator: validPasswordRule2.bind(this),
  274. },
  275. ],
  276. },
  277. passwordMsg: {
  278. originalPassword: '', // 原始密码
  279. newPassword: '', // 新密码
  280. password: '', // 二次输入密码
  281. },
  282. // roleName: '',
  283. // phone: '',
  284. // roleId: '',
  285. // deptName: '',
  286. // deptId: '',
  287. // staffName: '',
  288. account: sessionStorage.getItem('ws-pf_account'),
  289. // compName: '',
  290. companyId: sessionStorage.getItem('ws-pf_compId'),
  291. }
  292. },
  293. filters: {},
  294. created() {
  295. // this.getUserInfo()
  296. },
  297. mounted() {
  298. listenfullscreen(this.setScreen)
  299. },
  300. computed: {
  301. ...mapState({
  302. showDebug: (state) => state.commonStore.showDebug,
  303. showTheme: (state) => state.commonStore.showTheme,
  304. showLock: (state) => state.commonStore.showLock,
  305. showFullScren: (state) => state.commonStore.showFullScren,
  306. showCollapse: (state) => state.commonStore.showCollapse,
  307. showSearch: (state) => state.commonStore.showSearch,
  308. showSetting: (state) => state.commonStore.showSetting,
  309. showMenu: (state) => state.commonStore.showMenu,
  310. showColor: (state) => state.commonStore.showColor,
  311. }),
  312. ...mapGetters([
  313. 'userInfo',
  314. 'isFullScren',
  315. 'tagWel',
  316. 'tagList',
  317. 'isCollapse',
  318. 'tag',
  319. 'logsLen',
  320. 'logsFlag',
  321. 'language',
  322. ]),
  323. getDay() {
  324. const { statusFlag = -1, daysRemaining } =
  325. JSON.parse(sessionStorage.getItem('ws_login_getTenantInfoByUser')) || {}
  326. return statusFlag * 1 === 2 ? daysRemaining + '' : ''
  327. },
  328. showTooltip() {
  329. return this.showList.indexOf(this.$route.name) > -1 && !this.showMenu
  330. },
  331. },
  332. methods: {
  333. ...mapActions('common', ['setLocalVessels']),
  334. handleScreen() {
  335. fullscreenToggel()
  336. },
  337. setCollapse() {
  338. this.$store.commit('SET_COLLAPSE')
  339. },
  340. setScreen() {
  341. this.$store.commit('SET_FULLSCREN')
  342. },
  343. cancelPaw() {
  344. this.$refs.passwordMsg.resetFields()
  345. },
  346. // 修改管理员密码
  347. savePassword(formName) {
  348. this.$refs[formName].validate((valid) => {
  349. if (valid) {
  350. const data = {
  351. originalPassword: this.passwordMsg.originalPassword,
  352. password: this.passwordMsg.password,
  353. }
  354. changePasswordByPwd(data)
  355. .toPromise()
  356. .then(() => {
  357. EventBus.$emit('success', this.$t('message.updateMessage'))
  358. this.passwordFlag = false
  359. })
  360. } else {
  361. EventBus.$emit('error', this.$t('showMessage.asteriskRequired'))
  362. return false
  363. }
  364. })
  365. },
  366. // async getUserInfo () {
  367. // this.staffName = this.userInfo.staffName
  368. // this.phone = this.userInfo.staffMobilePhone
  369. // this.deptName = this.userInfo.deptName
  370. // this.roleName = this.userInfo.showRoleName
  371. // this.roleId = this.userInfo.showRoleId
  372. // this.compName = this.userInfo.compName
  373. // },
  374. toggleSideBar() {
  375. this.$store.dispatch('app/toggleSideBar')
  376. },
  377. logout() {
  378. this.$confirm(this.$t('logoutTip'), this.$t('tip'), {
  379. confirmButtonText: this.$t('submitText'),
  380. cancelButtonText: this.$t('cancelText'),
  381. type: 'warning',
  382. }).then(async () => {
  383. sessionStorage.removeItem('ws-pf_roleName')
  384. sessionStorage.removeItem('ws-pf_roleId')
  385. sessionStorage.removeItem('ws-pf_staffName')
  386. sessionStorage.removeItem('ws-pf_deptId')
  387. sessionStorage.removeItem('ws-pf_deptName')
  388. sessionStorage.removeItem('ws-pf_organMonetaryKey')
  389. sessionStorage.removeItem('ws-pf_organMonetaryValue')
  390. sessionStorage.removeItem('ws-pf_vessels')
  391. sessionStorage.removeItem('ws-pf_isLandBasedFlag')
  392. await this.$store.dispatch('user/logout')
  393. this.$router.push(
  394. process.env.VUE_APP_PACKAGE_ENV === 'ship' ? '/ship_login' : '/login'
  395. )
  396. })
  397. },
  398. },
  399. }
  400. </script>
  401. <style lang="scss" scoped>
  402. .dayClass {
  403. font-size: 14px !important;
  404. span {
  405. font-weight: 600;
  406. font-size: 14px;
  407. color: #ff3838;
  408. }
  409. }
  410. .hamburger-container {
  411. line-height: 40px;
  412. height: 100%;
  413. float: left;
  414. cursor: pointer;
  415. transition: background 0.3s;
  416. -webkit-tap-highlight-color: transparent;
  417. &:hover {
  418. background: rgba(0, 0, 0, 0.025);
  419. }
  420. }
  421. .breadcrumb-container {
  422. float: left;
  423. position: relative;
  424. }
  425. .errLog-container {
  426. display: inline-block;
  427. vertical-align: top;
  428. }
  429. .right-menu {
  430. float: right;
  431. height: 100%;
  432. line-height: 40px;
  433. &:focus {
  434. outline: none;
  435. }
  436. .right-menu-item {
  437. display: inline-block;
  438. padding: 0 8px;
  439. height: 100%;
  440. font-size: 18px;
  441. color: #5a5e66;
  442. // vertical-align: text-bottom;
  443. &.hover-effect {
  444. cursor: pointer;
  445. transition: background 0.3s;
  446. &:hover {
  447. background: rgba(0, 0, 0, 0.025);
  448. }
  449. }
  450. }
  451. .avatar-container {
  452. margin-right: 30px;
  453. .avatar-wrapper {
  454. position: relative;
  455. span {
  456. height: 40px;
  457. line-height: 40px;
  458. font-size: 12px;
  459. }
  460. .user-avatar {
  461. cursor: pointer;
  462. width: 40px;
  463. height: 40px;
  464. border-radius: 10px;
  465. }
  466. .el-icon-caret-bottom {
  467. cursor: pointer;
  468. position: absolute;
  469. right: -20px;
  470. top: 15px;
  471. font-size: 12px;
  472. }
  473. }
  474. }
  475. }
  476. </style>