index.vue 26 KB

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