index.vue 14 KB

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