index.vue 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. <!-- 首页模块 首页面 -->
  2. <template>
  3. <div class="home">
  4. <div class="body-middle"
  5. :class="{ 'body-middle-height': blockList[0].flag }">
  6. <div class="body-middle-left">
  7. <!-- 任务、消息、提醒、超期 -->
  8. <Panel :data-list="panelList"
  9. @click="gotoNewRw"></Panel>
  10. </div>
  11. </div>
  12. <div id="mapXY"></div>
  13. <!-- </ws-dialog> -->
  14. <!-- 第一次登陆的租户 -->
  15. <successfulDialog v-if="successfulDialog"
  16. :phone="phone"
  17. :successfulDialog="successfulDialog"
  18. @close="successfulDialogClose">
  19. </successfulDialog>
  20. <!-- 试用租户 -->
  21. <trialNotExpired v-if="trialNotExpired"
  22. :day="day"
  23. :phone="phone"
  24. :trialNotExpired="trialNotExpired"
  25. @close="trialNotExpiredClose">
  26. </trialNotExpired>
  27. </div>
  28. </template>
  29. <script>
  30. // 统计图start
  31. import maintenance from './components/maintenance'
  32. import shipCertificate from './components/shipCertificate'
  33. import sparePartsMaterial from './components/sparePartsMaterial'
  34. import procurement from './components/procurement'
  35. // 统计图end
  36. // 正式租户
  37. import successfulDialog from './components/successfulDialog'
  38. // 试用租户
  39. import trialNotExpired from './components/trialNotExpired'
  40. // 新 api
  41. import { queryHomePage, noticeNumber, queryCircularManagementReceiveList, getFileList, getStaffHomeShowList } from '@/model/home/index'
  42. import {
  43. getUserVesselList,
  44. findHottestRouting
  45. } from '@/model/indexRx'
  46. import News from './components/News'
  47. import ShipMap from './components/ShipMap'
  48. import { getCnCity, getCnWea } from './city'
  49. import { getLanguage } from '@/lang'
  50. import Panel from './components/Panel'
  51. import { getChangeLoginFlag } from '@/model/indexRx'
  52. import { zipDown } from '@/utils/batchDown'
  53. import { EventBus } from 'base-core-lib'
  54. import { mapActions, mapGetters, mapState } from 'vuex';
  55. export default {
  56. name: 'index',
  57. components: {
  58. News,
  59. ShipMap,
  60. Panel,
  61. successfulDialog,
  62. trialNotExpired,
  63. //统计图start
  64. maintenance,
  65. shipCertificate,
  66. sparePartsMaterial,
  67. procurement
  68. //统计图end
  69. },
  70. data () {
  71. return {
  72. showEchart: false,
  73. phone: '', // 正式租户电话号码
  74. day: '', //试用租户剩余天数
  75. trialNotExpired: false, //试用租户 剩余天数
  76. successfulDialog: false, //第一次登陆的弹窗
  77. mapXY: undefined,
  78. shipService: undefined,
  79. blockList: [
  80. {
  81. name: this.$t('home.shortcutEntrance'),
  82. flag: true
  83. },
  84. {
  85. name: this.$t('home.shipMap'),
  86. flag: true
  87. }
  88. ],
  89. newList: [],
  90. noticeList: [],
  91. routeList: [],
  92. showBlockList: [],
  93. shipList: [],
  94. setFlag: false,
  95. todoCount: '-',
  96. msgCount: '-',
  97. weather: undefined,
  98. ships: [],
  99. selectShip: undefined,
  100. isFullScreen: false,
  101. number: {
  102. task: 0,
  103. remind: 0,
  104. overdue: 0,
  105. news: 0
  106. },
  107. vesselBankFlag: sessionStorage.getItem('ws-pf_vesselBankFlag'),
  108. shezhiVal: ''
  109. }
  110. },
  111. computed: {
  112. ...mapState({
  113. showVesslBankFlag: state => state.commonStore.showVesslBankFlag
  114. }),
  115. ...mapGetters(['userSetting']),
  116. /** 计算属性计算属性节点 */
  117. panelList () {
  118. return [
  119. {
  120. type: '0',
  121. task: this.$t('homeIndex.task'),
  122. url: require('@/assets/newhome/rw01.png'),
  123. number: this.number.task,
  124. background: require('@/assets/newhome/rw.png'),
  125. remark: '任务'
  126. },
  127. {
  128. type: 'message',
  129. task: this.$t('homeIndex.message'),
  130. url: require('@/assets/newhome/xx01.png'),
  131. number: this.number.news,
  132. background: require('@/assets/newhome/xx.png'),
  133. remark: '消息'
  134. },
  135. {
  136. type: '1',
  137. task: this.$t('homeIndex.remind'),
  138. url: require('@/assets/newhome/tx01.png'),
  139. number: this.number.remind,
  140. background: require('@/assets/newhome/tx.png'),
  141. remark: '提醒'
  142. },
  143. {
  144. type: '2',
  145. task: this.$t('homeIndex.beyond'),
  146. url: require('@/assets/newhome/cq01.png'),
  147. number: this.number.overdue,
  148. background: require('@/assets/newhome/cq.png'),
  149. remark: '超期'
  150. }
  151. ]
  152. },
  153. optionSingleHeightTime () {
  154. return {
  155. openWatch: true,
  156. limitMoveNum: -1, //启动无缝滚动最小数据量 this.dataList.length
  157. direction: 2,
  158. switchDelay: 1000
  159. }
  160. },
  161. getLanguage () {
  162. return this.$store.getters.language
  163. },
  164. isShowShipList () {
  165. return this.userSetting['shipMap'][0].showFlag && this.vesselBankFlag !== 'V' && this.permissionIf('map.mapManagement.view')
  166. },
  167. },
  168. async created () {
  169. //获取快捷路口列表
  170. this.getRouteList()
  171. this.checkUserInfoDialog()
  172. },
  173. async mounted () {
  174. //获取新闻列表
  175. this.getNewList()
  176. this.getNoticeList()
  177. noticeNumber().toPromise().then(res => {
  178. const { task = 0, remind = 0, overdue = 0, news = 0 } = res
  179. this.number.task = task
  180. this.number.remind = remind
  181. this.number.overdue = overdue
  182. this.number.news = news
  183. })
  184. if (this.vesselBankFlag !== 'V') {
  185. EventBus.$emit('addShipScript', () => {
  186. this.initShipMap()
  187. })
  188. }
  189. setTimeout(() => {
  190. this.showEchart = true
  191. }, 900)
  192. this.showBlockList = []
  193. if (this.vesselBankFlag === 'V') {
  194. this.$refs.noticeList.style.width = 'calc(50% - 7px)'
  195. this.$refs.newsList.style.width = 'calc(50% - 7px)'
  196. } else {
  197. this.showBlockList = []
  198. this.blockList[1].flag = false
  199. this.$refs.noticeList.style.width = 'calc(50% - 7px)'
  200. this.$refs.newsList.style.width = 'calc(50% - 7px)'
  201. if (this.userSetting['shipMap'] && this.userSetting['shipMap'][0].showFlag) {
  202. this.showBlockList.push('船舶动态')
  203. this.blockList[1].flag = true
  204. }
  205. }
  206. },
  207. watch: {
  208. getLanguage: function () {
  209. this.getShipList()
  210. }
  211. },
  212. methods: {
  213. ...mapActions('user', ['toSetShow', 'changeVesslBank']),
  214. // 下载通知通函
  215. downloadNotification (item) {
  216. zipDown({
  217. appendixIds: item.attachmentPath,
  218. baseUrl: this.$store.getters.baseInfo.fileUrl,
  219. zipName: item.theme
  220. })
  221. },
  222. /**
  223. * 校验各种弹框问题
  224. * @Desc 不是本人原意, 请不要骂我 谢谢. 请联系 "后台开发人员" 梳理逻辑
  225. */
  226. async checkUserInfoDialog () {
  227. const {
  228. statusFlag,
  229. loginInfo: { loginFlag = 0 },
  230. daysRemaining,
  231. customerServiceStaffPhone
  232. } = JSON.parse(sessionStorage.getItem('ws_login_getTenantInfoByUser'))
  233. if (statusFlag * 1 === 3) {
  234. // 判断后台返回的是空 还是 0 是空还是 0 的时候请求后台接口 不懂啥意思 为啥要这么弄
  235. if (!loginFlag && !sessionStorage.getItem('isShowTryUserDialog') * 1) {
  236. let newId = JSON.parse(sessionStorage.getItem('ws_login_accountId'))
  237. this.phone = customerServiceStaffPhone
  238. this.successfulDialog = true
  239. sessionStorage.setItem('isShowTryUserDialog', '1')
  240. await getChangeLoginFlag({ accountId: newId }).toPromise()
  241. }
  242. }
  243. // 试用租户
  244. const dayDialog = [30, 15, 7, 5, 3, 2, 1, 0]
  245. if (statusFlag * 1 === 2 && dayDialog.indexOf(daysRemaining) > -1 && !sessionStorage.getItem('isShowTryUserDialog') * 1) {
  246. this.day = daysRemaining
  247. this.phone = customerServiceStaffPhone
  248. this.trialNotExpired = true
  249. sessionStorage.setItem('isShowTryUserDialog', '1')
  250. }
  251. },
  252. trialNotExpiredClose () {
  253. this.trialNotExpired = false
  254. },
  255. //第一次登陆的弹窗
  256. successfulDialogClose () {
  257. this.successfulDialog = false
  258. },
  259. initShipMap () {
  260. var options = {
  261. ak: '57df9eaa033b44809d4bdaf919af457e',
  262. // 初始中心点坐标
  263. centerPoint: [30.171, 121.27],
  264. zoom: 3,
  265. minZoom: 2,
  266. maxZoom: 18,
  267. defaultMapType: 'MT_SEA', //默认海图
  268. // 公司版权信息( 支持html ),默认Elane Inc.
  269. attribution: {
  270. isShow: false,
  271. emptyString:
  272. '&copy;2019 <a class="shipxy_small"></a>&nbsp;<a>WinSea Inc.</a>'
  273. },
  274. measureCtrl: { isShow: false },
  275. mousePostionCtrl: { isShow: false },
  276. zoomControlElane: { isShow: true, position: 'bottomright' },
  277. zoomviewControl: { isShow: false, position: 'bottomright' },
  278. basemapsControl: { isShow: false, position: 'topright' },
  279. scaleCtrl: { isShow: true, position: 'bottomleft' }
  280. }
  281. // 创建地图示例
  282. // eslint-disable-next-line no-undef
  283. this.mapXY = new ShipxyAPI.Map('mapXY', options)
  284. // eslint-disable-next-line no-undef
  285. this.shipService = ShipxyAPI.ShipService(this.mapXY, {
  286. enableAreaShip: false,
  287. enableFleetShip: false,
  288. isAutoUpdateSrvtime: false,
  289. // delayTime: 5000,
  290. lableFont: ['500 12px Arial', '500 12px 宋体'], // 船舶名称,文字字体,默认值:["600 12px Arial", "500 12px Arial"]
  291. lableTxtColor: ['#fff', '#fff'], // 船舶名称,文字颜色,默认值:["#000","#fff"]
  292. lableLineColor: ['rgba(1, 30, 62, 0)', 'rgba(1, 30, 62, 0)'], // 边框颜色,默认值:["#000","#000"]
  293. lableLinefillColor: ['rgba(0, 0, 0, 0.6)', 'rgba(0, 0, 0, 0.6)'], // 框内填充颜色,默认值:[null,null]
  294. obliqueLineColor: ['#000', '#000'], // 船舶名称,斜线颜色,默认值:[null,null]
  295. dShipColor: '#FF6437', // D+船颜色,默认:#ff6347
  296. zoomLevel_data: 1,
  297. zoomLevel_base: 1,
  298. getAreaShipsCallBack: (call) => {
  299. // console.info(call, 'getAreaShipsCallBack')
  300. },
  301. drawShipsEndCallBack: (call) => {
  302. // console.info(call, 'drawShipsEndCallBack')
  303. }
  304. })
  305. this.shipService.setPointerEvents(true)
  306. window.shipService = this.shipService
  307. //获取船舶列表
  308. this.getShipList()
  309. },
  310. toRoute (url) {
  311. this.$router.push(url)
  312. },
  313. toSetShow () {
  314. this.showBlockList = []
  315. this.setFlag = true
  316. getStaffHomeShowList({
  317. staffId: sessionStorage.getItem('ws-pf_userId')
  318. }).toPromise().then(data => {
  319. for (let i = 0; i < data.length; i++) {
  320. if (data[i].typeId === 'shipMap' && data[i].showFlag) {
  321. this.showBlockList.push('船舶动态')
  322. } else {
  323. this.showBlockList = []
  324. }
  325. }
  326. })
  327. },
  328. toMap () {
  329. this.$router.push('/map/trajectory_child')
  330. },
  331. goNews () {
  332. this.$router.push('/news/noticeType')
  333. },
  334. goNewsDetail (id) {
  335. this.$router.push('/news/noticeDetails?id=' + id)
  336. },
  337. goNotice (data) {
  338. this.$router.push({
  339. name: 'notificationItDetail',
  340. query: { id: data.id }
  341. })
  342. },
  343. goNoticeMore () {
  344. this.$router.push('/notice/notificationCircularReleasedIt_child')
  345. },
  346. toHide (index) {
  347. this.changeVesslBank([{
  348. id: this.userSetting['shipMap'][0].id,
  349. staffId: sessionStorage.getItem('ws-pf_userId'),
  350. typeId: 'shipMap',
  351. showFlag: false
  352. }])
  353. },
  354. getRouteList () {
  355. let data = {
  356. accountId: sessionStorage.getItem('ws-pf_userId'),
  357. pageSize: 30
  358. }
  359. findHottestRouting(data).toPromise().then(res => {
  360. this.routeList = res
  361. if (res.length == 0) {
  362. this.blockList[0].flag = false
  363. }
  364. })
  365. },
  366. //获取新闻
  367. getNewList () {
  368. let data = {
  369. currentPage: 1,
  370. pageSize: 2,
  371. loginUserId: sessionStorage.getItem('ws-pf_userId'),
  372. compId: sessionStorage.getItem('ws-pf_compId'),
  373. releaseFlag: 0
  374. }
  375. queryHomePage(data).toPromise().then(resNewList => {
  376. for (let i of resNewList) {
  377. i.content = '<p>' + i.content.replace(/<[^>]+>/g, '') + '</p>'
  378. }
  379. this.newList = resNewList
  380. for (let i of this.newList) {
  381. if (i.ossCoverUrl && i.ossCoverUrl.length > 0) {
  382. getFileList({ appendixIds: i.ossCoverUrl }).toPromise().then(res => {
  383. this.$set(i, 'imgUrl', res[0].appendixPath)
  384. })
  385. } else {
  386. this.$set(
  387. i,
  388. 'imgUrl',
  389. require('@/assets/images/page/home/noImg.png')
  390. )
  391. }
  392. }
  393. })
  394. },
  395. //获取通知通函
  396. getNoticeList () {
  397. let pagesize = Math.floor((this.$refs.noticeList.clientHeight - 44) / 80)
  398. let data = {
  399. currentPage: 1,
  400. pageSize: pagesize || 3,
  401. vesselDeptId:
  402. sessionStorage.getItem('ws-pf_vesselBankFlag') === 'V'
  403. ? sessionStorage.getItem('ws-pf_vesselId')
  404. : sessionStorage.getItem('ws-pf_deptId'),
  405. compId: sessionStorage.getItem('ws-pf_compId')
  406. }
  407. // debugger
  408. // TODO: 【此处有问题】接口变更的不对
  409. queryCircularManagementReceiveList(data)
  410. .toPromise()
  411. .then(response => {
  412. this.noticeList = response.records
  413. })
  414. },
  415. // 获取船舶状态
  416. getNaviStatusStr (t) {
  417. var array = [
  418. this.$t('home.navistatus0'),
  419. this.$t('home.navistatus1'),
  420. this.$t('home.navistatus2'),
  421. this.$t('home.navistatus3'),
  422. this.$t('home.navistatus4'),
  423. this.$t('home.navistatus5'),
  424. this.$t('home.navistatus6'),
  425. this.$t('home.navistatus7'),
  426. this.$t('home.navistatus8')
  427. ]
  428. if (t >= 0 && t <= 8) {
  429. return array[t]
  430. }
  431. return ''
  432. },
  433. // 获取船舶状态
  434. getNaviStatusBg (t) {
  435. var array = [
  436. 'bg0',
  437. 'bg1',
  438. 'bg2',
  439. 'bg3',
  440. 'bg4',
  441. 'bg5',
  442. 'bg6',
  443. 'bg7',
  444. 'bg8'
  445. ]
  446. if (t >= 0 && t <= 8) {
  447. return array[t]
  448. }
  449. return ''
  450. },
  451. getShipList () {
  452. getUserVesselList({ vesselStatus: 'UNDER_CONTROL' }).toPromise().then(res => {
  453. this.shipList = []
  454. let num = res.length > 10 ? 10 : res.length
  455. let obj = {}
  456. for (let i = 0; i < num; i++) {
  457. if (res[i].mmsiCode && res[i].mmsiCode.length > 0) {
  458. obj = this.shipService.getShipByMmsi(res[i].mmsiCode)
  459. ? this.shipService.getShipByMmsi(res[i].mmsiCode)
  460. : {}
  461. obj.vesselName = res[i].vesselName
  462. this.shipList.push(obj)
  463. }
  464. }
  465. //我想不出还有什么招了:临时解决办法
  466. const oldList = this.shipList
  467. for (let i = 1; i < 5; i++) {
  468. oldList.forEach(item => {
  469. this.shipList.push(item)
  470. })
  471. }
  472. })
  473. },
  474. onTodoClick () {
  475. this.$router.push({ name: 'workNotification' })
  476. },
  477. onMsgClick () {
  478. this.$router.push({ name: 'message' })
  479. },
  480. onChange (list) { },
  481. onShipMenuItemClick (ship) {
  482. this.selectShip = ship
  483. if (ship) {
  484. this.$refs.shipMap.selectShip(ship.id)
  485. } else {
  486. this.$refs.shipMap.unSelectShip()
  487. }
  488. },
  489. onFullScreen () {
  490. this.isFullScreen = !this.isFullScreen
  491. },
  492. onNoticeMoreBtnClick () {
  493. this.$router.push({
  494. name: 'notice'
  495. })
  496. },
  497. onShipSelectEvent (shipid) {
  498. this.selectShip = this.ships.find(item => {
  499. return item.id == shipid
  500. })
  501. },
  502. getCityName (encity) {
  503. if (getLanguage() === 'zh') {
  504. return getCnCity(encity)
  505. }
  506. return encity
  507. },
  508. getWeaName (enwea) {
  509. if (getLanguage() === 'zh') {
  510. return getCnWea(enwea)
  511. }
  512. return enwea
  513. },
  514. gotoNewRw (data) {
  515. if (data === 'message') {
  516. this.$router.push({ name: 'message', query: { types: data } })
  517. } else {
  518. this.$router.push({ name: 'workNotification', query: { types: data } })
  519. }
  520. }
  521. }
  522. }
  523. </script>
  524. <style lang="scss" scoped>
  525. .home {
  526. padding: 10px;
  527. overflow-y: auto;
  528. // background-color: #eee;
  529. width: 100%;
  530. height: calc(100vh - 60px);
  531. .set-img {
  532. width: 25px;
  533. height: 25px;
  534. position: fixed;
  535. right: 0;
  536. bottom: 99px;
  537. z-index: 1000;
  538. }
  539. .shortcut-entrance {
  540. width: 100%;
  541. height: 60px;
  542. background: #fff;
  543. margin-bottom: 10px;
  544. padding: 0 20px;
  545. line-height: 60px;
  546. display: flex;
  547. justify-content: space-between;
  548. align-items: center;
  549. .shortcut-entrance-left {
  550. font-size: 16px;
  551. font-weight: bold;
  552. color: #333333;
  553. width: 50%;
  554. overflow: hidden;
  555. height: 100%;
  556. }
  557. .shortcut-entrance-right {
  558. width: 14px;
  559. height: 14px;
  560. }
  561. }
  562. .body-middle {
  563. display: flex;
  564. width: 100%;
  565. height: calc(100vh - 60px);
  566. .body-middle-left {
  567. width: 100%;
  568. // margin-right: 10px;
  569. .panel-list {
  570. display: flex;
  571. color: #ffffff;
  572. text-shadow: 0px 1px 1px rgba(111, 52, 0, 0.55);
  573. }
  574. .ship-list-body {
  575. position: relative;
  576. width: 300px;
  577. margin-top: 10px;
  578. .shipList-box {
  579. width: 85%;
  580. margin: 0 auto;
  581. .shipList-icon {
  582. position: absolute;
  583. top: 6px;
  584. left: 0px;
  585. }
  586. .shipList-name {
  587. cursor: context-menu;
  588. font-size: 16px;
  589. font-weight: bold;
  590. line-height: 26px;
  591. color: #333333;
  592. max-width: 100px;
  593. white-space: nowrap;
  594. overflow: hidden;
  595. text-overflow: ellipsis;
  596. }
  597. .shipList-address {
  598. cursor: context-menu;
  599. font-size: 14px;
  600. color: #666666;
  601. line-height: 35px;
  602. }
  603. .shipList-time {
  604. cursor: context-menu;
  605. font-size: 14px;
  606. color: #666666;
  607. line-height: 20px;
  608. }
  609. .ship-list-status {
  610. cursor: context-menu;
  611. margin-left: 20px;
  612. padding: 5px 10px;
  613. border-radius: 20px;
  614. color: #fff;
  615. max-width: 90px;
  616. white-space: nowrap;
  617. overflow: hidden;
  618. text-overflow: ellipsis;
  619. }
  620. .bg0 {
  621. background: #7ed321;
  622. }
  623. .bg1 {
  624. background: #ff8f00;
  625. }
  626. .bg2 {
  627. background: #495b61;
  628. }
  629. .bg3 {
  630. background: #4fc3f7;
  631. }
  632. .bg4 {
  633. background: #26a69a;
  634. }
  635. .bg5 {
  636. background: #9c7fee;
  637. }
  638. .bg6 {
  639. background: #ff5722;
  640. }
  641. .bg7 {
  642. background: #8d6e63;
  643. }
  644. .bg8 {
  645. background: #fadd60;
  646. }
  647. }
  648. }
  649. .notice-list {
  650. width: calc(50% - 7px);
  651. background: #fff;
  652. margin-top: 10px;
  653. // height: calc(100% - 180px);
  654. // min-height: 460px;
  655. border-radius: 4px;
  656. // float: left;
  657. }
  658. .news-list {
  659. width: calc(50% - 7px);
  660. // float: left;
  661. background: #fff;
  662. margin-top: 10px;
  663. // height: calc(100% - 180px);
  664. height: 285px;
  665. overflow: hidden;
  666. // min-height: 460px;
  667. border-radius: 4px;
  668. // margin-right: 10px;
  669. .new-list-box {
  670. padding: 0 10px;
  671. .new-list-body:first-child {
  672. padding-bottom: 20px;
  673. border-bottom: 1px solid #eeeeee;
  674. }
  675. .new-list-body:last-child {
  676. padding-top: 20px;
  677. }
  678. }
  679. .new-list-body {
  680. width: 100%;
  681. padding: 10px 0;
  682. display: flex;
  683. border-bottom: 1px solid #eeeeee;
  684. // height: 50%;
  685. overflow: hidden;
  686. // padding: 10px;
  687. // display: flex;
  688. .new-list-img {
  689. // height: 100%;
  690. width: 160px;
  691. height: 100px;
  692. position: relative;
  693. // margin-right: 20px;
  694. .newsTJ {
  695. position: absolute;
  696. width: 54px;
  697. height: 50px;
  698. left: 0;
  699. top: 0;
  700. }
  701. img {
  702. width: 100%;
  703. height: 100%;
  704. display: block;
  705. }
  706. }
  707. .new-list-title {
  708. color: #343434;
  709. line-height: 30px;
  710. font-size: 14px;
  711. font-weight: bold;
  712. overflow: hidden;
  713. text-overflow: ellipsis;
  714. white-space: nowrap;
  715. span {
  716. cursor: pointer;
  717. display: block;
  718. }
  719. }
  720. .new-list-content {
  721. color: #666666;
  722. font-size: 12px;
  723. line-height: 16px;
  724. display: -webkit-box;
  725. -webkit-box-orient: vertical;
  726. -webkit-line-clamp: 3;
  727. overflow: hidden;
  728. height: 48px;
  729. span {
  730. cursor: pointer;
  731. display: block;
  732. }
  733. }
  734. .new-list-date {
  735. color: #999999;
  736. font-size: 12px;
  737. text-align: right;
  738. line-height: 22px;
  739. span {
  740. cursor: pointer;
  741. display: block;
  742. }
  743. }
  744. }
  745. // .new-list-body:hover {
  746. // background: #e2edfa;
  747. // cursor: pointer;
  748. // }
  749. .no-line {
  750. border-bottom: 0px solid #eeeeee;
  751. }
  752. }
  753. .v-width {
  754. width: calc(50% - 7px);
  755. }
  756. }
  757. .body-middle-right {
  758. width: calc(30% - 10px);
  759. .notice-list {
  760. height: 50%;
  761. background: #fff;
  762. width: 100%;
  763. min-height: 300px;
  764. border-radius: 4px;
  765. .notice-list-body {
  766. border-bottom: 1px solid #eeeeee;
  767. padding: 20px 10px;
  768. .notice-list-title {
  769. color: #333333;
  770. font-size: 14px;
  771. font-weight: bold;
  772. line-height: 18px;
  773. overflow: hidden;
  774. text-overflow: ellipsis;
  775. white-space: nowrap;
  776. }
  777. .notice-list-type {
  778. margin: 9px 0 12px 0;
  779. color: #666666;
  780. }
  781. .notice-list-person {
  782. color: #666666;
  783. font-size: 12px;
  784. }
  785. .notice-list-date {
  786. color: #666666;
  787. font-size: 12px;
  788. margin-top: 10px;
  789. }
  790. }
  791. .notice-list-body:hover {
  792. background: #e2edfa;
  793. cursor: pointer;
  794. }
  795. .notice-body-height {
  796. height: 50%;
  797. }
  798. .notice-body-height1 {
  799. height: 20%;
  800. }
  801. }
  802. .notice-list-height {
  803. height: 100%;
  804. min-height: 638px;
  805. }
  806. .ship-list {
  807. height: calc(50% - 10px);
  808. margin-top: 10px;
  809. background: #fff;
  810. width: 100%;
  811. min-height: 327px;
  812. border-radius: 4px;
  813. .ship-list-body {
  814. padding: 20px 0;
  815. border-bottom: 1px solid #eeeeee;
  816. .ship-list-head {
  817. display: flex;
  818. img {
  819. width: 14px;
  820. height: 14px;
  821. }
  822. .ship-list-name {
  823. margin: 0 20px;
  824. font-weight: bold;
  825. }
  826. .ship-list-status {
  827. border-radius: 10px;
  828. padding: 4px 8px;
  829. color: #ffffff;
  830. }
  831. .bg0 {
  832. background: #7ed321;
  833. }
  834. .bg1 {
  835. background: #ff8f00;
  836. }
  837. .bg2 {
  838. background: #495b61;
  839. }
  840. .bg3 {
  841. background: #4fc3f7;
  842. }
  843. .bg4 {
  844. background: #26a69a;
  845. }
  846. .bg5 {
  847. background: #9c7fee;
  848. }
  849. .bg6 {
  850. background: #ff5722;
  851. }
  852. .bg7 {
  853. background: #8d6e63;
  854. }
  855. .bg8 {
  856. background: #fadd60;
  857. }
  858. }
  859. .ship-list-address {
  860. margin: 10px 0 10px 34px;
  861. color: #666666;
  862. }
  863. .ship-list-date {
  864. color: #666666;
  865. margin-left: 34px;
  866. }
  867. }
  868. /*.ship-list-body:hover{*/
  869. /* background: #e2edfa;*/
  870. /*}*/
  871. }
  872. }
  873. }
  874. .body-middle-height {
  875. height: calc(100vh - 70px);
  876. }
  877. .list-title {
  878. width: 100%;
  879. // background: #f3f9fe;
  880. background: url('~@/assets/newhome/titilebg.png') no-repeat;
  881. background-size: 100% 100%;
  882. height: 44px;
  883. padding: 0 20px;
  884. display: flex;
  885. line-height: 44px;
  886. justify-content: space-between;
  887. border-radius: 4px 4px 0 0;
  888. .list-title-name {
  889. font-size: 16px;
  890. font-weight: bold;
  891. color: #333333;
  892. }
  893. .list-title-more {
  894. font-size: 14px;
  895. color: #666666;
  896. cursor: pointer;
  897. display: flex;
  898. }
  899. }
  900. }
  901. .el-dropdown-menu {
  902. margin-top: -20px !important;
  903. /*left: 1872px !important;*/
  904. }
  905. .seamless-warp {
  906. // width: 100%;
  907. width: 100%;
  908. overflow: hidden;
  909. margin-top: 10px;
  910. }
  911. .home-tzthList:nth-of-type(3) {
  912. border: none;
  913. }
  914. .home-tzthList {
  915. display: flex;
  916. padding: 10px;
  917. border-bottom: 1px solid #eeeeee;
  918. .home-tzthList-type {
  919. width: 100%;
  920. display: flex;
  921. font-size: 14px;
  922. line-height: 28px;
  923. font-weight: bold;
  924. .home-tzthList-type-title {
  925. color: #343434;
  926. margin: 0;
  927. span {
  928. cursor: pointer;
  929. }
  930. }
  931. .home-tzthList-type-theme {
  932. color: #666666;
  933. margin: 0;
  934. width: 80%;
  935. overflow: hidden;
  936. white-space: nowrap;
  937. text-overflow: ellipsis;
  938. span {
  939. cursor: pointer;
  940. }
  941. }
  942. }
  943. .home-tzthList-people {
  944. display: flex;
  945. justify-content: space-between;
  946. line-height: 22px;
  947. .home-tzthList-Personnel,
  948. .home-tzthList-timer {
  949. font-size: 12px;
  950. color: #666666;
  951. span {
  952. cursor: pointer;
  953. }
  954. }
  955. }
  956. }
  957. .noMore {
  958. position: absolute;
  959. margin: auto;
  960. top: 0;
  961. bottom: 0;
  962. left: 0;
  963. right: 0;
  964. }
  965. .ship-list {
  966. width: 100%;
  967. border-radius: 4px;
  968. background-color: #fff;
  969. }
  970. //新增的图表的样式
  971. .chart {
  972. display: flex;
  973. flex-wrap: wrap;
  974. justify-content: space-between;
  975. margin-bottom: 10px;
  976. }
  977. .home-tzthList-timer-left {
  978. width: 10%;
  979. display: flex;
  980. align-items: center;
  981. img {
  982. cursor: pointer;
  983. width: 24px;
  984. height: 24px;
  985. display: block;
  986. align-items: center;
  987. margin: 0 auto;
  988. }
  989. }
  990. </style>